export function abortOnTimeout(createTimeout, timeoutAmount, requestResult, responsePromise) { const timeout = createTimeout(timeoutAmount); // abort request if timeout finishes first let timedOut = false; timeout.elapsed().then( () => { timedOut = true; requestResult.abort(); }, () => {} // ignore AbortError when timeout is aborted ); // abort timeout if request finishes first return responsePromise.then( response => { timeout.abort(); return response; }, err => { timeout.abort(); // map error to TimeoutError if (err instanceof AbortError && timedOut) { throw new ConnectionError(`Request timed out after ${timeoutAmount}ms`, true); } else { throw err; } } ); }