diff options
Diffstat (limited to 'src/lib/async/cancelable.ts')
-rw-r--r-- | src/lib/async/cancelable.ts | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/lib/async/cancelable.ts b/src/lib/async/cancelable.ts new file mode 100644 index 000000000..50fbcc63b --- /dev/null +++ b/src/lib/async/cancelable.ts @@ -0,0 +1,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' + } +} |