Cron
Enregistrement de tâches planifiées via node-cron, avec un registre qui survit au hot-reload.
core/cron enveloppe node-cron. Il ne connaît aucune tâche : les features et les modules enregistrent leurs jobs. Ajouter un job ne demande jamais de modifier ce module.
Règle absolue : toutes les tâches planifiées s'enregistrent ici.
Import
import { schedule, stop, stopAll, trigger, validate, isRunning, getJobs, getStatus } from '@lrvo/core/cron';Module serveur.
API
schedule(name, cronSchedule, handler, options?)
Enregistre un job. Si un job du même nom existe, il est stoppé puis remplacé.
schedule('daily-report', '0 9 * * *', async () => {
await sendReport();
});
schedule('every-5min', '*/5 * * * *', async () => {
await syncData();
}, { timezone: 'America/New_York', runOnInit: true });| Paramètre | Type | Rôle |
|---|---|---|
name | string | Nom unique du job. |
cronSchedule | string | Expression cron, 5 ou 6 champs. |
handler | async Function | Exécuté à chaque déclenchement. |
options.timezone | string | Timezone IANA. Défaut : LRVO_TIMEZONE, sinon America/Toronto. |
options.runOnInit | boolean | Exécute immédiatement à l'enregistrement. Défaut : false. |
Retourne l'instance de tâche node-cron.
stop(name)
Stoppe et retire un job. Retourne true s'il existait.
stopAll()
Stoppe et retire tous les jobs.
trigger(name)
Déclenche un job manuellement, sans attendre son prochain tick. Lève si le job n'existe pas.
await trigger('daily-report');validate(expression)
Valide une expression cron. Retourne un booléen.
isRunning(name)
Retourne true si le job est enregistré.
getJobs()
Retourne les noms des jobs enregistrés.
getStatus()
Retourne les métadonnées de tous les jobs.
{
'daily-report': {
schedule: '0 9 * * *',
timezone: 'America/Toronto',
registeredAt: '2026-04-24T09:00:00.000Z',
}
}Enregistrer un job
Les jobs vivent avec leur feature ou leur module.
// @lrvo/module-blog — src/cron.server.js
import { schedule } from '@lrvo/core/cron';
export function registerCronJobs() {
schedule('blog-publish-scheduled', '*/15 * * * *', async () => {
await publishScheduledPosts();
});
}// src/register-server.js
import { registerCronJobs } from './cron.server.js';
registerCronJobs();Notes
Survie au hot-reload. Les jobs sont stockés dans globalThis[Symbol.for('__LRVO_CRON_JOBS__')], un slot partagé qui survit aux invalidations de cache de modules de Next.js. Un job enregistré deux fois remplace silencieusement l'ancien au lieu de créer un doublon qui s'exécuterait en double. Voir Registres et singletons.
Les erreurs ne font pas tomber le processus. Une exception levée par un handler est interceptée et journalisée via fail().
✗ Cron daily-report: Connection timeoutPlusieurs instances du serveur exécutent chacune leurs jobs. En déploiement multi-instance, un job qui ne doit tourner qu'une fois doit poser son propre verrou en base.