~/proyectos
cron-scheduler-ts
Scheduler cron/intervalo en memoria para Node.js: cero dependencias, TypeScript completo, persistencia pluggable, deteccion de jobs perdidos y cero drift gracias a recalculo monotono del proximo tick.
problema
Necesitaba un scheduler tipo cron para tareas recurrentes en proyectos Node.js sin depender de node-cron o agenda. Las opciones existentes o arrastran dependencias de runtime, o acumulan drift al reprogramar desde el fire anterior, o no detectan jobs que se perdieron mientras el proceso estuvo caido.
arquitectura
Modulo ESM/CJS con zero runtime deps. Cada job tiene su propio setTimeout que recalcula el siguiente tick desde new Date() en cada disparo, eliminando drift. Parser cron escrito a mano (5/6 campos, rangos, pasos, aliases, tokens de mes y dia). StorageAdapter pluggable con implementaciones en memoria y filesystem (escritura atomica via .tmp + rename). Persistencia coalescente para no saturar disco en jobs frecuentes.
decisiones
- ›Per-job setTimeout en vez de tick global: cada reprogramacion recomputa desde el reloj actual, lo que hace imposible el drift acumulado.
- ›Parser cron zero-dep escrito a mano: soporta los formatos de uso real (5/6 campos, */n, rangos, listas, aliases @daily, tokens jan-dec / sun-sat) sin engordar el bundle.
- ›StorageAdapter como interfaz minima: cualquier backend (file, SQLite, Postgres, Redis) cumple el contrato sin acoplar el core a un driver.
- ›Deteccion de jobs perdidos al arrancar: si lastRun + intervalo es menor que ahora, se emite missed sin replay y el job se reprograma al siguiente tick futuro.
- ›Escritura atomica en FileSystemAdapter: write a .tmp + rename, para evitar corrupcion si el proceso muere a mitad de save.
diagramas
// ciclo de un job
// estructura interna
// deteccion de jobs perdidos