|
2 | 2 | import * as CryptoHelper from '../CryptoHelper' |
3 | 3 |
|
4 | 4 | /** |
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 |
38 | 7 | * @param {String} url URL |
39 | 8 | * @param {Object} data Data to be sent |
40 | | - * @param {RecognizerContext} [recognizerContext] Recognizer context |
41 | 9 | * @param {String} apiVersion api version |
42 | 10 | * @param {String} mimeType MimeType to be used |
43 | 11 | * @return {Promise} |
44 | 12 | */ |
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) { |
47 | 14 | const configuration = recognizerContext.editor.configuration |
48 | 15 | 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() |
62 | 40 | break |
63 | | - case 'DIAGRAM': |
64 | | - request.setRequestHeader('Accept', 'application/json,' + mimeType) |
| 41 | + case 'application/json': |
| 42 | + result = await response.json() |
65 | 43 | 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()) |
68 | 46 | break |
69 | 47 | default: |
| 48 | + result = await response.text() |
70 | 49 | break |
71 | 50 | } |
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 }) |
126 | 54 | } |
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) |
141 | 55 | } |
0 commit comments