diff options
author | Fabio Berger <me@fabioberger.com> | 2018-08-21 21:23:06 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2018-08-21 21:23:06 +0800 |
commit | 12881e60e34362f066e3cc28ebe4839cc62620f7 (patch) | |
tree | 12cc403d890eab08a84c049c0755ccbe9b1e53a4 /packages/utils/src/fetch_async.ts | |
parent | dd2e54d60d3490a62e57ef3f24a9af0127e2ec88 (diff) | |
download | dexon-0x-contracts-12881e60e34362f066e3cc28ebe4839cc62620f7.tar.gz dexon-0x-contracts-12881e60e34362f066e3cc28ebe4839cc62620f7.tar.zst dexon-0x-contracts-12881e60e34362f066e3cc28ebe4839cc62620f7.zip |
Fix file name from camel to snake case
Diffstat (limited to 'packages/utils/src/fetch_async.ts')
-rw-r--r-- | packages/utils/src/fetch_async.ts | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/packages/utils/src/fetch_async.ts b/packages/utils/src/fetch_async.ts new file mode 100644 index 000000000..b4c85718d --- /dev/null +++ b/packages/utils/src/fetch_async.ts @@ -0,0 +1,40 @@ +import isNode = require('detect-node'); +import 'isomorphic-fetch'; +// WARNING: This needs to be imported after isomorphic-fetch: https://github.com/mo/abortcontroller-polyfill#using-it-on-browsers-without-fetch +// tslint:disable-next-line:ordered-imports +import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'; + +export const fetchAsync = async ( + endpoint: string, + options: RequestInit = {}, + timeoutMs: number = 20000, +): Promise<Response> => { + if (options.signal || (options as any).timeout) { + throw new Error( + 'Cannot call fetchAsync with options.signal or options.timeout. To set a timeout, please use the supplied "timeoutMs" parameter.', + ); + } + let optionsWithAbortParam; + if (!isNode) { + const controller = new AbortController(); + const signal = controller.signal; + setTimeout(() => { + controller.abort(); + }, timeoutMs); + optionsWithAbortParam = { + signal, + ...options, + }; + } else { + // HACK: the `timeout` param only exists in `node-fetch`, and not on the `isomorphic-fetch` + // `RequestInit` type. Since `isomorphic-fetch` conditionally wraps `node-fetch` when the + // execution environment is `Node.js`, we need to cast it to `any` in that scenario. + optionsWithAbortParam = { + timeout: timeoutMs, + ...options, + } as any; + } + + const response = await fetch(endpoint, optionsWithAbortParam); + return response; +}; |