blob: d16435f5971467e6edec2282ec78a2985b05dc21 (
plain)
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
|
export const sleep = (ms: number, signal?: AbortSignal): Promise<void> =>
new Promise((resolve, reject) => {
if (signal?.aborted) {
reject(signal.reason ?? new Error("aborted"));
return;
}
const onAbort = (): void => {
clearTimeout(timer);
reject(signal?.reason ?? new Error("aborted"));
};
const timer = setTimeout(() => {
signal?.removeEventListener("abort", onAbort);
resolve();
}, ms);
signal?.addEventListener("abort", onAbort, { once: true });
});
export type Deadline = {
readonly remainingMs: () => number;
readonly expired: () => boolean;
};
export const deadline = (totalMs: number): Deadline => {
const end = Date.now() + totalMs;
return {
remainingMs: () => Math.max(0, end - Date.now()),
expired: () => Date.now() >= end,
};
};
|