export const TEXT_FILE_EXTS = /\.(txt|json|html|txt|csv)/; export interface GlobalWithFetch { fetch: Function; } export function parseResponse(url: string, res: wx.RequestSuccessCallbackResult) { let header = res.header || {}; header = Object.keys(header).reduce((map: { [key: string]: string }, key) => { map[key.toLowerCase()] = header[key]; return map; }, {}); return { ok: ((res.statusCode / 200) | 0) === 1, // 200-299 status: res.statusCode, statusText: res.statusCode, url, clone: () => parseResponse(url, res), text: () => Promise.resolve( typeof res.data === 'string' ? res.data : JSON.stringify(res.data) ), json: () => { if (typeof res.data === 'object') return Promise.resolve(res.data); let json = {}; try { json = JSON.parse(res.data); } catch (err) { console.error(err); } return Promise.resolve(json); }, arrayBuffer: () => { return Promise.resolve(res.data); }, headers: { keys: () => Object.keys(header), entries: () => { const all = []; for (const key in header) { if (header.hasOwnProperty(key)) { all.push([key, header[key]]); } } return all; }, get: (n: string) => header[n.toLowerCase()], has: (n: string) => n.toLowerCase() in header } }; } export function fetchFunc() { // tslint:disable-next-line:no-any return (url: string, options: any) => { options = options || {}; const dataType = url.match(TEXT_FILE_EXTS) ? 'text' : 'arraybuffer'; return new Promise((resolve, reject) => { wx.request({ url, method: options.method || 'GET', data: options.body, header: options.headers, dataType, responseType: dataType, success: (resp) => resolve(parseResponse(url, resp)), fail: (err) => reject(err) }); }); }; } export function setWechatFetch(debug=false) { // tslint:disable-next-line:no-any const typedGlobal = global as any; if (typeof typedGlobal.fetch !== 'function') { if (debug) { console.log('setup global fetch...'); } typedGlobal.fetch = fetchFunc(); } }