phase, plan, subsystem, tags, dependency_graph, tech_stack, key_files, decisions, metrics
phase
plan
subsystem
tags
dependency_graph
tech_stack
key_files
decisions
metrics
quick-260610-i4x
01
broker
scheduler
setInterval
node-cron
fix
requires
provides
affects
reliable-broker-scheduling
broker/poller
broker/outboxWorker
broker/reminderScheduler
added
patterns
setInterval-based-scheduling
created
modified
apps/api/src/broker/poller.ts
apps/api/src/broker/outboxWorker.ts
apps/api/src/broker/reminderScheduler.ts
Use setInterval for broker worker scheduling: node-cron 4.2.1 silently skipped executions in the long-running API process; setInterval is reliable in the same process
Quick Task 260610-i4x: Replace node-cron with setInterval in Broker Workers Summary
One-liner: Replaced node-cron schedule() calls with setInterval (300 s / 15 s / 60 s) in all three broker worker start* functions so scheduled tasks actually fire in the long-running API process.
Tasks Completed
Task
Name
Commit
Files
1
Swap node-cron schedule() for setInterval in the three worker start* functions
d9efbc1
poller.ts, outboxWorker.ts, reminderScheduler.ts
Changes Made
apps/api/src/broker/poller.ts
Removed import { schedule } from 'node-cron'
startBrokerPoller: schedule('*/5 * * * *', cb) → setInterval(cb, 5 * 60 * 1000)
Updated file-header and JSDoc comments to reference setInterval and document the WHY
apps/api/src/broker/outboxWorker.ts
Removed import { schedule } from 'node-cron'
startOutboxWorker: schedule('*/15 * * * * *', cb) → setInterval(cb, 15 * 1000)
Updated header comment and scheduler JSDoc
apps/api/src/broker/reminderScheduler.ts
Removed import { schedule } from 'node-cron'
startReminderScheduler: schedule('* * * * *', cb) → setInterval(cb, 60 * 1000)
Updated file-header "Fires every minute" line and scheduler JSDoc
Callback bodies (the .catch-wrapped runPoll / runOutboxDrain / runReminderCheck calls) are byte-for-byte unchanged. No .unref() added — intervals intentionally keep the event loop alive.
Verification Results
! grep -rn "import.*node-cron" apps/api/src/broker/: exits 1 (no matches) — all imports removed
pnpm --filter @familysync/api typecheck: exit 0 — clean
pnpm --filter @familysync/api exec vitest run tests/broker/: 8 test files passed, 91 tests passed
Deviations from Plan
None — plan executed exactly as written.
Known Stubs
None.
Threat Flags
None — no new network surface, auth paths, file access, or schema changes introduced.
Self-Check: PASSED