import { setTimeout as delay } from "node:timers/promises"; export type BackoffPolicy = { initialMs: number; maxMs: number; factor: number; jitter: number; }; export function computeBackoff(policy: BackoffPolicy, attempt: number) { const base = policy.initialMs * policy.factor ** Math.max(attempt - 1, 0); const jitter = base * policy.jitter * Math.random(); return Math.min(policy.maxMs, Math.round(base + jitter)); } export async function sleepWithAbort(ms: number, abortSignal?: AbortSignal) { if (ms <= 0) return; try { await delay(ms, undefined, { signal: abortSignal }); } catch (err) { if (abortSignal?.aborted) { throw new Error("aborted"); } throw err; } }