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ètreTypeRôle
namestringNom unique du job.
cronSchedulestringExpression cron, 5 ou 6 champs.
handlerasync FunctionExécuté à chaque déclenchement.
options.timezonestringTimezone IANA. Défaut : LRVO_TIMEZONE, sinon America/Toronto.
options.runOnInitbooleanExé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 timeout

Plusieurs 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.

Sur cette page