export type RuntimeReceiptHeartbeatOutcome = 'active' | 'terminal'; export type RuntimeReceiptHeartbeatSupervisor = { start(): void; stop(): void; }; export function createRuntimeReceiptHeartbeatSupervisor(input: { intervalMs: number; heartbeat: () => Promise; isLeaseLost: (error: unknown) => boolean; onLeaseLost: (error: unknown) => void; onTransientFailure?: (error: unknown) => void; onTerminal?: () => void; }): RuntimeReceiptHeartbeatSupervisor { if (!Number.isFinite(input.intervalMs) || input.intervalMs <= 0) { throw new Error('Runtime receipt heartbeat interval must be positive.'); } let stopped = false; let timer: ReturnType | null = null; const stop = () => { stopped = true; if (timer !== null) { clearTimeout(timer); timer = null; } }; const schedule = () => { if (stopped || timer !== null) return; timer = setTimeout(() => { timer = null; void input .heartbeat() .then((outcome) => { if (outcome === 'terminal') { stop(); input.onTerminal?.(); return; } schedule(); }) .catch((error) => { if (input.isLeaseLost(error)) { stop(); input.onLeaseLost(error); return; } input.onTransientFailure?.(error); schedule(); }); }, input.intervalMs); }; return { start() { if (stopped) return; schedule(); }, stop, }; }