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

Commit 591ac77

Browse files
committed
Refactor(rest/networkInterface.js) XMLHttpRequest -> fetch
1 parent 17eb28e commit 591ac77

File tree

2 files changed

+38
-123
lines changed

2 files changed

+38
-123
lines changed

src/recognizer/rest/iinkRestRecognizer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ function resultCallback (recognizerContext, model, configuration, res, mimeType)
163163
handleSuccess(recognizerContext.editor, modelReference, Constants.EventType.EXPORTED, Constants.EventType.IDLE)
164164
}
165165
}
166-
166+
167167
function callPostMessage (recognizerContext, model, mimeType) {
168168
const configuration = recognizerContext.editor.configuration
169169
return postMessage('/api/v4.0/iink/batch', recognizerContext, model, buildData, configuration.restConversionState, mimeType)
@@ -184,6 +184,7 @@ function callPostMessage (recognizerContext, model, mimeType) {
184184
* @param {Array} requestedMimeTypes
185185
*/
186186
export function export_ (recognizerContext, model, requestedMimeTypes) {
187+
const configuration = recognizerContext.editor.configuration
187188
if (requestedMimeTypes) {
188189
return Promise.all(requestedMimeTypes.map(mimeType => callPostMessage(recognizerContext, model, mimeType)))
189190
} else if (configuration.recognitionParams.type === 'TEXT') {
@@ -215,6 +216,6 @@ export function convert (recognizerContext, model) {
215216
* @param {RecognizerContext} recognizerContext Current recognition context
216217
* @param {Model} model Current model
217218
*/
218-
export function resize (recognizerContext, model){
219+
export function resize (recognizerContext, model) {
219220
export_(recognizerContext, model)
220221
}

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)