mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-31 06:04:11 +01:00
37 lines
1.2 KiB
TypeScript
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(); } };
|
|
}
|