UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

37 lines (36 loc) • 1.51 kB
import { n as MAX_TIMER_TIMEOUT_MS } from "./number-coercion-CuVhdCBs.mjs"; //#region src/utils/absolute-deadline.ts const ABSOLUTE_DEADLINE_EXPIRED = Symbol("absolute deadline expired"); /** Rechecks the selected clock because timers can run early or overflow long delays. */ function scheduleAbsoluteDeadline(deadlineAtMs, onExpired, now = () => Date.now(), { unref = false } = {}) { let timer; const checkDeadline = () => { const remainingMs = Math.max(0, deadlineAtMs - now()); if (remainingMs === 0) { onExpired(); return; } timer = setTimeout(checkDeadline, Math.min(remainingMs, MAX_TIMER_TIMEOUT_MS)); if (unref) timer.unref(); }; checkDeadline(); return () => { if (timer !== void 0) clearTimeout(timer); }; } /** Bounds one operation by an absolute deadline in the selected clock. */ async function awaitWithinDeadline(operation, deadlineAtMs, now = () => Date.now()) { if (deadlineAtMs === void 0) return await operation(); if (Math.max(0, deadlineAtMs - now()) === 0) return ABSOLUTE_DEADLINE_EXPIRED; let cancelDeadline; try { const deadline = new Promise((resolve) => { cancelDeadline = scheduleAbsoluteDeadline(deadlineAtMs, () => resolve(ABSOLUTE_DEADLINE_EXPIRED), now); }); return await Promise.race([deadline, operation().then((result) => now() >= deadlineAtMs ? ABSOLUTE_DEADLINE_EXPIRED : result)]); } finally { cancelDeadline?.(); } } //#endregion export { awaitWithinDeadline as n, scheduleAbsoluteDeadline as r, ABSOLUTE_DEADLINE_EXPIRED as t };