const RACE_TIMEOUT = Symbol("race-timeout"); const RACE_ABORT = Symbol("race-abort"); export type RaceWithTimeoutAndAbortResult = | { status: "resolved"; value: T } | { status: "timeout" } | { status: "aborted" }; export async function raceWithTimeoutAndAbort( promise: Promise, options: { timeoutMs?: number; abortSignal?: AbortSignal; } = {}, ): Promise> { if (options.abortSignal?.aborted) { return { status: "aborted" }; } if (options.timeoutMs === undefined && !options.abortSignal) { return { status: "resolved", value: await promise }; } let timeoutHandle: ReturnType | undefined; let abortHandler: (() => void) | undefined; const contenders: Array> = [promise]; if (options.timeoutMs !== undefined) { contenders.push( new Promise((resolve) => { timeoutHandle = setTimeout(() => resolve(RACE_TIMEOUT), options.timeoutMs); }), ); } if (options.abortSignal) { contenders.push( new Promise((resolve) => { abortHandler = () => resolve(RACE_ABORT); options.abortSignal?.addEventListener("abort", abortHandler, { once: true }); }), ); } try { const result = await Promise.race(contenders); if (result === RACE_TIMEOUT) { return { status: "timeout" }; } if (result === RACE_ABORT) { return { status: "aborted" }; } return { status: "resolved", value: result }; } finally { if (timeoutHandle) { clearTimeout(timeoutHandle); } if (abortHandler) { options.abortSignal?.removeEventListener("abort", abortHandler); } } }