generated from TBD54566975/tbd-project-template
/
abort.ts
31 lines (28 loc) · 852 Bytes
/
abort.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* Wraps the given `AbortSignal` in a `Promise` that rejects if it is programmatically triggered,
* otherwise the promise will remain in await state (will never resolve).
*/
function promisifySignal<T>(signal: AbortSignal): Promise<T> {
return new Promise((resolve, reject) => {
// immediately reject if the given is signal is already aborted
if (signal.aborted) {
reject(signal.reason);
return;
}
signal.addEventListener('abort', () => {
reject(signal.reason);
});
});
}
/**
* Wraps the given `Promise` such that it will reject if the `AbortSignal` is triggered.
*/
export async function executeUnlessAborted<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {
if (!signal) {
return promise;
}
return Promise.race([
promise,
promisifySignal<T>(signal),
]);
}