aboutsummaryrefslogtreecommitdiff
path: root/src/util/time.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/time.ts')
-rw-r--r--src/util/time.ts29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/util/time.ts b/src/util/time.ts
new file mode 100644
index 0000000..73990ad
--- /dev/null
+++ b/src/util/time.ts
@@ -0,0 +1,29 @@
+export const sleep = (ms: number, signal?: AbortSignal): Promise<void> =>
+ new Promise((resolve, reject) => {
+ if (signal?.aborted) {
+ reject(new Error("aborted"));
+ return;
+ }
+ const timer = setTimeout(() => {
+ signal?.removeEventListener("abort", onAbort);
+ resolve();
+ }, ms);
+ const onAbort = (): void => {
+ clearTimeout(timer);
+ reject(new Error("aborted"));
+ };
+ 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,
+ };
+};