2025-04-24 13:11:28 +08:00

26 lines
709 B
TypeScript

export const supportsModernAbortSignal =
typeof AbortSignal.any === 'function' &&
typeof AbortSignal.timeout === 'function'
export const signalWithTimeout = (signal: AbortSignal, timeout: number) => {
if (supportsModernAbortSignal) {
return AbortSignal.any([signal, AbortSignal.timeout(timeout)])
}
const abortController = new AbortController()
const abort = () => {
window.clearTimeout(timer)
signal.removeEventListener('abort', abort)
abortController.abort()
}
// abort after timeout has expired
const timer = window.setTimeout(abort, timeout)
// abort when the original signal is aborted
signal.addEventListener('abort', abort)
return abortController.signal
}