/** * Print-spool maintenance (server/utils/printSpoolDb.ts): * - every 60 s: 'sent' jobs without an agent ack for 3 min go back to 'queued' (the agent's * idempotent job ledger makes a resend safe — covers an agent that died mid-batch); * - every 10 min: final jobs older than 24 h are deleted from the spool table. The staged PDFs * stay where the print routes always put them (/), as before. * Only PM2 instance 0 runs it (NODE_APP_INSTANCE), mirroring ticket-auto-close.ts. */ import { requeueStaleSentJobs, purgeOldJobs, finalizeStaleSpooledJobs, purgeRelayCommands } from '../utils/printSpoolDb' export default defineNitroPlugin(() => { if (import.meta.prerender) return const inst = process.env.NODE_APP_INSTANCE if (inst !== undefined && inst !== '0') return const requeue = () => { try { const n = requeueStaleSentJobs(3) if (n) console.log(`[print-spool] re-queued ${n} stale job(s) without agent ack`) purgeRelayCommands() } catch (e: any) { console.error('[print-spool] requeue failed:', e?.message || e) } } const purge = () => { try { const f = finalizeStaleSpooledJobs(30) if (f) console.log(`[print-spool] closed ${f} spooled job(s) without completion report (> 30 min) as completed`) const r = purgeOldJobs(24) if (r.rows) console.log(`[print-spool] purged ${r.rows} finished job row(s) older than 24 h`) } catch (e: any) { console.error('[print-spool] purge failed:', e?.message || e) } } setInterval(requeue, 60_000).unref() setTimeout(purge, 120_000).unref() setInterval(purge, 10 * 60_000).unref() })