about summary refs log tree commit diff
path: root/src/lib/async/cancelable.ts
blob: 50fbcc63bf7e62107cc5f6c95a7f03e9472c48a8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
export function cancelable<A, T>(
  f: (args: A) => Promise<T>,
  signal: AbortSignal,
) {
  return (args: A) => {
    return new Promise<T>((resolve, reject) => {
      signal.addEventListener('abort', () => {
        reject(new AbortError())
      })
      f(args).then(resolve, reject)
    })
  }
}

export class AbortError extends Error {
  constructor() {
    super('Aborted')
    this.name = 'AbortError'
  }
}