diff options
| author | amankumarsingh77 <amankumarsingh7702@gmal.com> | 2026-05-02 15:31:01 +0530 |
|---|---|---|
| committer | amankumarsingh77 <amankumarsingh7702@gmal.com> | 2026-05-02 15:31:01 +0530 |
| commit | 310d0a7324477079022b178f1a83161e9e61fb1d (patch) | |
| tree | 69e7bbad57cdffe8e8e174fbd6b84fa88388a7fe /src/util/time.ts | |
| parent | 6759b6fd0ab435aa1e9fdb4591bd828b7a861a33 (diff) | |
feat(util): add result, time, and paths primitives for v0.3 rewrite
Diffstat (limited to 'src/util/time.ts')
| -rw-r--r-- | src/util/time.ts | 29 |
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, + }; +}; |
