about summary refs log tree commit diff
path: root/src/lib/async/cancelable.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/async/cancelable.ts')
-rw-r--r--src/lib/async/cancelable.ts20
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'
+  }
+}