@reduxjs/toolkit
Version:
The official, opinionated, batteries-included toolset for efficient Redux development
34 lines (31 loc) • 1.17 kB
text/typescript
// AbortSignal.timeout() is currently baseline 2024
export const timeoutSignal = (milliseconds: number) => {
const abortController = new AbortController()
setTimeout(() => {
const message = 'signal timed out'
const name = 'TimeoutError'
abortController.abort(
// some environments (React Native, Node) don't have DOMException
typeof DOMException !== 'undefined'
? new DOMException(message, name)
: Object.assign(new Error(message), { name }),
)
}, milliseconds)
return abortController.signal
}
// AbortSignal.any() is currently baseline 2024
export const anySignal = (...signals: AbortSignal[]) => {
// if any are already aborted, return an already aborted signal
for (const signal of signals)
if (signal.aborted) return AbortSignal.abort(signal.reason)
// otherwise, create a new signal that aborts when any of the given signals abort
const abortController = new AbortController()
for (const signal of signals) {
signal.addEventListener(
'abort',
() => abortController.abort(signal.reason),
{ signal: abortController.signal, once: true },
)
}
return abortController.signal
}