feat: add worker queue fabric — classify, dnc, p1, review, digest, thread-resolve, outbox, AI modules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import { createLogger } from '@tower/logger';
|
||||
|
||||
const SIX_HOURS_MS = 6 * 60 * 60 * 1000;
|
||||
|
||||
export function startExpireScheduler(prisma: any, logger = createLogger('expire-scheduler')): void {
|
||||
let running = false;
|
||||
|
||||
const tick = async () => {
|
||||
if (running) return;
|
||||
running = true;
|
||||
try {
|
||||
const now = new Date();
|
||||
const result = await prisma.message.deleteMany({
|
||||
where: {
|
||||
expiresAt: { lt: now },
|
||||
status: { in: ['RAW', 'DNC'] },
|
||||
},
|
||||
});
|
||||
if (result.count > 0) {
|
||||
logger.info({ deleted: result.count }, 'Expired RAW/DNC messages purged');
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error({ err }, 'Expire scheduler tick failed');
|
||||
} finally {
|
||||
running = false;
|
||||
}
|
||||
};
|
||||
|
||||
// Run once at startup to clear any messages that expired while the worker was down
|
||||
tick().catch((err: unknown) => logger.error({ err }, 'Expire scheduler initial tick failed'));
|
||||
|
||||
setInterval(tick, SIX_HOURS_MS);
|
||||
logger.info('Expire scheduler started (6h interval)');
|
||||
}
|
||||
Reference in New Issue
Block a user