import { sessionRepository } from '@core/storage/repositories/sessions.js'; import { voteRepository } from '@core/storage/repositories/votes.js'; import { logRepository } from '@core/storage/repositories/logs.js'; import { scrapeQueueRepository } from '@core/storage/repositories/scrapeQueue.js'; import { config } from '@config/index.js'; import { sleep } from '@core/utils/helpers.js'; async function runCleanupWorker() { console.log('๐Ÿ”„ Starting cleanup worker...'); await Promise.all([ sessionRepository.initialize(), voteRepository.initialize(), logRepository.initialize(), scrapeQueueRepository.initialize(), ]); let running = true; process.on('SIGINT', () => { running = false; }); process.on('SIGTERM', () => { running = false; }); // Run immediately on start await runCleanup(); // Then run every hour while (running) { await sleep(60 * 60 * 1000); // 1 hour if (running) { await runCleanup(); } } console.log('๐Ÿ›‘ Cleanup worker stopped'); } async function runCleanup() { console.log('๐Ÿงน Running cleanup tasks...'); try { const results = await Promise.allSettled([ sessionRepository.cleanupExpiredSessions(), voteRepository.cleanupOldVotes?.() || Promise.resolve(0), logRepository.cleanupOldLogs(30), scrapeQueueRepository.cleanupOldItems(7), ]); const [sessions, votes, logs, queueItems] = results.map(r => r.status === 'fulfilled' ? r.value : 0 ); console.log(`โœ… Cleanup completed: ${sessions} sessions, ${votes} votes, ${logs} logs, ${queueItems} queue items removed`); await logRepository.log({ level: 'info', message: 'Cleanup completed', context: { sessions, votes, logs, queueItems }, }); } catch (error) { console.error('Cleanup worker error:', error); await logRepository.log({ level: 'error', message: 'Cleanup worker failed', error: { name: 'Error', message: String(error), stack: String(error) }, }); } } runCleanupWorker().catch(console.error);