( fetchImpl: typeof fetch, url: string, init: RequestInit, timeoutMs: number, externalSignal?: AbortSignal, )
| 297 | } |
| 298 | |
| 299 | async function fetchWithTimeout( |
| 300 | fetchImpl: typeof fetch, |
| 301 | url: string, |
| 302 | init: RequestInit, |
| 303 | timeoutMs: number, |
| 304 | externalSignal?: AbortSignal, |
| 305 | ): Promise<Response> { |
| 306 | const controller = new AbortController(); |
| 307 | const abortFromExternal = (): void => { |
| 308 | controller.abort(externalSignal?.reason); |
| 309 | }; |
| 310 | const timeout = setTimeout(() => { |
| 311 | controller.abort(new Error('telemetry request timed out')); |
| 312 | }, timeoutMs); |
| 313 | timeout.unref?.(); |
| 314 | if (externalSignal?.aborted === true) abortFromExternal(); |
| 315 | externalSignal?.addEventListener('abort', abortFromExternal, { once: true }); |
| 316 | try { |
| 317 | return await fetchImpl(url, { |
| 318 | ...init, |
| 319 | signal: controller.signal, |
| 320 | }); |
| 321 | } finally { |
| 322 | clearTimeout(timeout); |
| 323 | externalSignal?.removeEventListener('abort', abortFromExternal); |
| 324 | } |
| 325 | } |
| 326 | |
| 327 | function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> { |
| 328 | if (signal?.aborted === true) return Promise.reject(abortError()); |
no test coverage detected