* Polyfill for AbortSignal.any()
*
* Creates a new AbortSignal that aborts when any of the given signals abort.
*
* @param signals - An array of AbortSignal objects
* @returns A new AbortSignal that aborts when any of the input signals abort
*/
if (!AbortSignal.any) {
AbortSignal.any = function (signals: AbortSignal[]): AbortSignal {
if (!signals || !Array.isArray(signals)) {
throw new TypeError('AbortSignal.any requires an array of AbortSignal objects')
}
const controller = new AbortController()
if (signals.some(signal => signal.aborted)) {
controller.abort()
return controller.signal
}
const listeners = signals.map(signal => {
const listener = () => {
if ('reason' in signal && signal.reason !== undefined) {
controller.abort(signal.reason)
} else {
controller.abort()
}
cleanup()
}
signal.addEventListener('abort', listener)
return { signal, listener }
})
const cleanup = () => {
listeners.forEach(({ signal, listener }) => {
signal.removeEventListener('abort', listener)
})
}
controller.signal.addEventListener('abort', cleanup)
return controller.signal
}
}