/** Create an abort signal that fires after a timeout and preserves caller cancellation. */ export function withTimeoutSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal { const timeoutSignal = AbortSignal.timeout(timeoutMs); return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal; } /** Detect a timeout raised by an abortable fetch. */ export function isTimeoutError(error: unknown): boolean { return error instanceof Error && error.name === "TimeoutError"; }