Files
PaperClipAI/server/src/services/deadline-work.ts
T
2026-10-24 16:47:35 -07:00

37 lines
1.2 KiB
TypeScript

import type { createDeliveryWorkCoordinator } from "./delivery-work-coordinator.js";
import type { DeliveryQueue } from "./delivery-work-notifications.js";
export function registerDeadlineWork(
coordinator: ReturnType<typeof createDeliveryWorkCoordinator>,
queue: DeliveryQueue,
task: {
run: (signal: AbortSignal) => Promise<unknown>;
next: () => Promise<number | null>;
canRun: () => boolean;
retryMs: number;
},
) {
let requested = 1, reconciled = 0;
let next: number | null = null;
let earliest = 0;
const worker = coordinator.register(queue, {
retryMs: task.retryMs,
pausePassiveMaintenance: true,
onSettled: () => { requested++; },
run: async signal => {
if (!task.canRun()) { requested++; return; }
if (Date.now() < earliest) { next = earliest; return; }
const generation = ++requested;
earliest = Date.now() + task.retryMs;
await task.run(signal);
if (signal.aborted) return;
const deadline = await task.next();
next = deadline === null ? null : Math.max(earliest, deadline);
reconciled = generation;
},
hasPending: async () => requested !== reconciled,
nextRunAt: () => next,
});
return { ...worker, wake: () => { requested++; worker.wake(); } };
}