WebHooker/server/tasks/storage-prune.ts
2026-08-17 07:51:36 +00:00

38 lines
1.5 KiB
TypeScript

import { cfEnv } from "../lib/cf";
import { log } from "../lib/lib/log";
const DELIVERY_STATE_RETENTION_MS = 7 * 24 * 3600 * 1000;
const MESSAGE_TRACKING_RETENTION_MS = 30 * 24 * 3600 * 1000;
/**
* Scheduled: purge expired rows from the D1-backed ephemeral stores
* (dedup_keys, delivery_state, message_tracking). These replaced the KV keys
* that relied on per-entry TTL; D1 rows must be removed by this task instead.
*/
export default defineTask({
meta: { name: "storage:prune", description: "Prune D1 dedup/delivery/message-tracking rows" },
async run(event) {
try {
const env = cfEnv(event);
const now = Date.now();
let removed = 0;
const dedup = await env.DB.prepare("DELETE FROM dedup_keys WHERE expires_at < ?")
.bind(now)
.run();
removed += dedup.meta?.changes ?? 0;
const delivery = await env.DB.prepare("DELETE FROM delivery_state WHERE updated_at < ?")
.bind(now - DELIVERY_STATE_RETENTION_MS)
.run();
removed += delivery.meta?.changes ?? 0;
const messages = await env.DB.prepare("DELETE FROM message_tracking WHERE updated_at < ?")
.bind(now - MESSAGE_TRACKING_RETENTION_MS)
.run();
removed += messages.meta?.changes ?? 0;
if (removed > 0) log.info({ removed }, "Pruned D1 storage rows");
return { result: "ok", removed };
} catch (err) {
log.error({ err }, "Storage prune from cron failed");
return { result: "error" };
}
},
});