aboutsummaryrefslogtreecommitdiff
path: root/src/util/time.ts
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,
  };
};