diff --git a/src/chain/chain.api.ts b/src/chain/chain.api.ts index 8d4cfaf..750a5dc 100644 --- a/src/chain/chain.api.ts +++ b/src/chain/chain.api.ts @@ -1,19 +1,21 @@ -import fetch, { Response } from 'node-fetch' +import fetch, { Response, RequestInit } from 'node-fetch' import { retry } from 'utils/promise.util' -// AbortController was added in node v14.17.0 globally + +const DEFAULT_TIMEOUT = 30000 const AbortController = globalThis.AbortController -const request = async (url: string, options: any) => { +const request = async (url: string, options: RequestInit) => { + options.timeout = options.timeout || DEFAULT_TIMEOUT const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), 30000) - let res: Response - try { - res = await fetch(url, { ...options, signal: controller.signal }) - clearTimeout(timeout) - } catch (err) { - clearTimeout(timeout) - throw err - } + let res = Promise.race([ + await fetch(url, { ...options, signal: controller.signal }), + new Promise((_, reject) => + setTimeout(() => { + controller.abort() + reject(new Error('timeout')) + }, options.timeout), + ), + ]) return res }