abort-signal.ts 709 B

12345678910111213141516171819202122232425
  1. export const supportsModernAbortSignal =
  2. typeof AbortSignal.any === 'function' &&
  3. typeof AbortSignal.timeout === 'function'
  4. export const signalWithTimeout = (signal: AbortSignal, timeout: number) => {
  5. if (supportsModernAbortSignal) {
  6. return AbortSignal.any([signal, AbortSignal.timeout(timeout)])
  7. }
  8. const abortController = new AbortController()
  9. const abort = () => {
  10. window.clearTimeout(timer)
  11. signal.removeEventListener('abort', abort)
  12. abortController.abort()
  13. }
  14. // abort after timeout has expired
  15. const timer = window.setTimeout(abort, timeout)
  16. // abort when the original signal is aborted
  17. signal.addEventListener('abort', abort)
  18. return abortController.signal
  19. }