Clear setTimeout when fetch wins the race

Prevents the timer callback from firing unnecessarily after a
successful fetch response.
This commit is contained in:
Rod Boev
2026-02-05 10:12:45 -05:00
committed by Alex Newman
parent 1dd456a6ca
commit 1ac35b5d56
+8 -4
View File
@@ -17,11 +17,15 @@ const HEALTH_CHECK_TIMEOUT_MS = getTimeout(HOOK_TIMEOUTS.HEALTH_CHECK);
* The orphaned fetch is harmless since the process exits shortly after.
*/
export function fetchWithTimeout(url: string, init: RequestInit = {}, timeoutMs: number): Promise<Response> {
let timeoutId: ReturnType<typeof setTimeout>;
return Promise.race([
fetch(url, init),
new Promise<never>((_, reject) =>
setTimeout(() => reject(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs)
),
fetch(url, init).then(response => {
clearTimeout(timeoutId);
return response;
}),
new Promise<never>((_, reject) => {
timeoutId = setTimeout(() => reject(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs);
}),
]);
}