mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-08 22:13:59 +01:00
Reviewed and verified at 9b4acc456d.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import type { Db } from "@paperclipai/db";
|
|
import { providerTraceStore } from "./provider-trace-store.js";
|
|
import { DELIVERY_QUEUES } from "./delivery-work-notifications.js";
|
|
import { registerDeadlineWork } from "./deadline-work.js";
|
|
import type { createDeliveryWorkCoordinator } from "./delivery-work-coordinator.js";
|
|
import { registerIdleLocalWorkProbe } from "./idle-local-work.js";
|
|
|
|
export function registerProviderTraceRetentionWork(
|
|
db: Db,
|
|
coordinator: ReturnType<typeof createDeliveryWorkCoordinator>,
|
|
canRun: () => boolean,
|
|
) {
|
|
const traces = providerTraceStore(db);
|
|
let deadline: number | null | undefined;
|
|
|
|
const unregister = registerIdleLocalWorkProbe((options = {}) => {
|
|
if (deadline === undefined) return "unknown";
|
|
if (deadline === null) return "none";
|
|
return options.deadlineCapability?.deadlineCatalog === "domain_deadlines_v1" && deadline > Date.now()
|
|
? "none" : "present";
|
|
});
|
|
const worker = registerDeadlineWork(coordinator, DELIVERY_QUEUES.providerTraceRetention, {
|
|
canRun,
|
|
retryMs: 30_000,
|
|
onSettled: () => {
|
|
deadline = undefined;
|
|
},
|
|
run: (signal) =>
|
|
signal.aborted ? Promise.resolve() : traces.cleanupExpired(new Date(), signal).then(() => undefined),
|
|
next: async () => {
|
|
deadline = await traces.nextRetentionDeadline();
|
|
return deadline;
|
|
},
|
|
});
|
|
return {
|
|
...worker,
|
|
stop: async () => {
|
|
unregister();
|
|
await worker.stop();
|
|
},
|
|
};
|
|
}
|