Skip to content
This repository was archived by the owner on Jan 15, 2024. It is now read-only.

Commit ce828db

Browse files
committed
Pull request #33: Fix Rest
Merge in WS/iink-js from Fix_Rest to master * commit '591ac773e4b65ee0e43aadc88ec27c67ae01ed98': Refactor(rest/networkInterface.js) XMLHttpRequest -> fetch Fix(src/recognizer/rest/iinkRestRecognizer.js) add resize
2 parents 37cf4f3 + 591ac77 commit ce828db

File tree

2 files changed

+62
-139
lines changed

2 files changed

+62
-139
lines changed

src/recognizer/rest/iinkRestRecognizer.js

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,19 @@ function resultCallback (recognizerContext, model, configuration, res, mimeType)
164164
}
165165
}
166166

167+
function callPostMessage (recognizerContext, model, mimeType) {
168+
const configuration = recognizerContext.editor.configuration
169+
return postMessage('/api/v4.0/iink/batch', recognizerContext, model, buildData, configuration.restConversionState, mimeType)
170+
.then((res) => {
171+
resultCallback(recognizerContext, model, configuration, res, mimeType)
172+
return model
173+
})
174+
.catch((err) => {
175+
handleError(recognizerContext.editor, err)
176+
return err
177+
})
178+
}
179+
167180
/**
168181
* Export content
169182
* @param {RecognizerContext} recognizerContext Current recognizer context
@@ -172,29 +185,16 @@ function resultCallback (recognizerContext, model, configuration, res, mimeType)
172185
*/
173186
export function export_ (recognizerContext, model, requestedMimeTypes) {
174187
const configuration = recognizerContext.editor.configuration
175-
176-
function callPostMessage (mimeType) {
177-
return postMessage('/api/v4.0/iink/batch', recognizerContext, model, buildData, configuration.restConversionState, mimeType)
178-
.then((res) => {
179-
resultCallback(recognizerContext, model, configuration, res, mimeType)
180-
return model
181-
})
182-
.catch((err) => {
183-
handleError(recognizerContext.editor, err)
184-
return err
185-
})
186-
}
187-
188188
if (requestedMimeTypes) {
189-
return Promise.all(requestedMimeTypes.map(mimeType => callPostMessage(mimeType)))
189+
return Promise.all(requestedMimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
190190
} else if (configuration.recognitionParams.type === 'TEXT') {
191-
return Promise.all(configuration.recognitionParams.iink.text.mimeTypes.map(mimeType => callPostMessage(mimeType)))
191+
return Promise.all(configuration.recognitionParams.iink.text.mimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
192192
} else if (configuration.recognitionParams.type === 'DIAGRAM') {
193-
return Promise.all(configuration.recognitionParams.iink.diagram.mimeTypes.map(mimeType => callPostMessage(mimeType)))
193+
return Promise.all(configuration.recognitionParams.iink.diagram.mimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
194194
} else if (configuration.recognitionParams.type === 'MATH') {
195-
return Promise.all(configuration.recognitionParams.iink.math.mimeTypes.map(mimeType => callPostMessage(mimeType)))
195+
return Promise.all(configuration.recognitionParams.iink.math.mimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
196196
} else if (configuration.recognitionParams.type === 'Raw Content') {
197-
return Promise.all(configuration.recognitionParams.iink['raw-content'].mimeTypes.map(mimeType => callPostMessage(mimeType)))
197+
return Promise.all(configuration.recognitionParams.iink['raw-content'].mimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
198198
}
199199
return Promise.reject(new Error('Export failed'))
200200
}
@@ -210,3 +210,12 @@ export function convert (recognizerContext, model) {
210210
.then(res => resultCallback(model, configuration, res))
211211
.catch(err => handleError(recognizerContext.editor, err))
212212
}
213+
214+
/**
215+
* Resize
216+
* @param {RecognizerContext} recognizerContext Current recognition context
217+
* @param {Model} model Current model
218+
*/
219+
export function resize (recognizerContext, model) {
220+
export_(recognizerContext, model)
221+
}

src/recognizer/rest/networkInterface.js

Lines changed: 35 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -2,140 +2,54 @@
22
import * as CryptoHelper from '../CryptoHelper'
33

44
/**
5-
* Parse JSON String to Object
6-
* @param {Object} req JSON string result to be parsed
7-
* @return {Object} Parsed response
8-
*/
9-
function parse (req) {
10-
let result
11-
try {
12-
result = JSON.parse(req.responseText)
13-
} catch (e) {
14-
result = req.responseText
15-
}
16-
return result
17-
}
18-
19-
/**
20-
* Transform object data request to a list of parameters
21-
* @param {Object} obj Query properties
22-
* @return {String} URI encoded string
23-
*/
24-
function transformRequest (obj) {
25-
const str = []
26-
Object.keys(obj).forEach((p) => {
27-
if ((typeof obj[p] !== 'undefined') &&
28-
(typeof obj[p] !== 'function')) {
29-
str.push(`${encodeURIComponent(p)}=${encodeURIComponent(obj[p])}`)
30-
}
31-
})
32-
return str.join('&')
33-
}
34-
35-
/**
36-
* Send request to the network and return a promise
37-
* @param {String} type Request type (GET/POST)
5+
* Post request
6+
* @param {RecognizerContext} recognizerContext Recognizer context
387
* @param {String} url URL
398
* @param {Object} data Data to be sent
40-
* @param {RecognizerContext} [recognizerContext] Recognizer context
419
* @param {String} apiVersion api version
4210
* @param {String} mimeType MimeType to be used
4311
* @return {Promise}
4412
*/
45-
function xhr (type, url, data, recognizerContext = {}, apiVersion, mimeType) {
46-
const pptxMimeType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
13+
export async function post (recognizerContext, url, data, apiVersion, mimeType) {
4714
const configuration = recognizerContext.editor.configuration
4815
const recognizerContextRef = recognizerContext
49-
return new Promise((resolve, reject) => {
50-
// We are writing some browser module here so the no import found should be ignored
51-
// eslint-disable-next-line no-undef
52-
const request = new XMLHttpRequest()
53-
request.open(type, url, true)
54-
request.withCredentials = true
55-
56-
switch (configuration.recognitionParams.type) {
57-
case 'TEXT':
58-
request.setRequestHeader('Accept', 'application/json,' + mimeType)
59-
break
60-
case 'MATH':
61-
request.setRequestHeader('Accept', 'application/json,' + mimeType)
16+
if (recognizerContextRef) {
17+
recognizerContextRef.idle = true
18+
}
19+
try {
20+
const headers = new Headers()
21+
headers.append('Accept', 'application/json,' + mimeType)
22+
headers.append('applicationKey', configuration.recognitionParams.server.applicationKey)
23+
headers.append('hmac', CryptoHelper.computeHmac(JSON.stringify(data), configuration.recognitionParams.server.applicationKey, configuration.recognitionParams.server.hmacKey))
24+
headers.append('Content-Type', 'application/json')
25+
const reqInit = {
26+
method: 'POST',
27+
headers,
28+
credentials: 'include',
29+
body: JSON.stringify(data)
30+
}
31+
const request = new Request(url, reqInit)
32+
const response = await fetch(request)
33+
const contentType = response.headers.get('content-type')
34+
let result = ''
35+
switch (contentType) {
36+
case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
37+
case 'image/png':
38+
case 'image/jpeg':
39+
result = await response.blob()
6240
break
63-
case 'DIAGRAM':
64-
request.setRequestHeader('Accept', 'application/json,' + mimeType)
41+
case 'application/json':
42+
result = await response.json()
6543
break
66-
case 'Raw Content':
67-
request.setRequestHeader('Accept', 'application/json,' + mimeType)
44+
case 'application/vnd.myscript.jiix':
45+
result = await response.clone().json().catch(async () => await response.text())
6846
break
6947
default:
48+
result = await response.text()
7049
break
7150
}
72-
request.setRequestHeader('applicationKey', configuration.recognitionParams.server.applicationKey)
73-
request.setRequestHeader('hmac', CryptoHelper.computeHmac(JSON.stringify(data), configuration.recognitionParams.server.applicationKey, configuration.recognitionParams.server.hmacKey))
74-
request.setRequestHeader('Content-Type', 'application/json')
75-
76-
const isBlobType = mimeType && (mimeType === pptxMimeType || mimeType.startsWith('image/png') || mimeType.startsWith('image/jpeg'))
77-
if (isBlobType) {
78-
request.responseType = 'blob'
79-
}
80-
81-
request.onerror = () => {
82-
// eslint-disable-next-line prefer-promise-reject-errors
83-
reject({ msg: `Could not connect to ${url} connection error`, recoverable: false })
84-
}
85-
86-
request.onload = () => {
87-
if (request.status >= 200 && request.status < 300) {
88-
isBlobType ? resolve(request.response) : resolve(parse(request))
89-
} else {
90-
reject(new Error(request.responseText))
91-
}
92-
}
93-
94-
request.onreadystatechange = () => {
95-
if (request.readyState === 4) {
96-
if (request.status >= 200 && request.status < 300) {
97-
isBlobType ? resolve(request.response) : resolve(parse(request))
98-
}
99-
}
100-
}
101-
102-
if (recognizerContextRef) {
103-
recognizerContextRef.idle = false
104-
}
105-
106-
request.send(JSON.stringify(data))
107-
}).then((res) => {
108-
if (recognizerContextRef) {
109-
recognizerContextRef.idle = true
110-
}
111-
return res
112-
})
113-
}
114-
115-
/**
116-
* Get request
117-
* @param {RecognizerContext} recognizerContext Recognizer context
118-
* @param {String} url URL
119-
* @param {Object} params Query properties
120-
* @return {Promise}
121-
*/
122-
export function get (recognizerContext, url, params) {
123-
let queryUrl = url
124-
if (params) {
125-
queryUrl += `?${transformRequest(params)}`
51+
return result
52+
} catch (error) {
53+
throw new Error({ msg: `Could not connect to ${url} connection error`, recoverable: false })
12654
}
127-
return xhr('GET', queryUrl, undefined, recognizerContext)
128-
}
129-
130-
/**
131-
* Post request
132-
* @param {RecognizerContext} recognizerContext Recognizer context
133-
* @param {String} url URL
134-
* @param {Object} data Data to be sent
135-
* @param {String} apiVersion api version
136-
* @param {String} mimeType MimeType to be used
137-
* @return {Promise}
138-
*/
139-
export function post (recognizerContext, url, data, apiVersion, mimeType) {
140-
return xhr('POST', url, data, recognizerContext, apiVersion, mimeType)
14155
}

0 commit comments

Comments
 (0)