directus
1import cron from 'cron-parser';
2import schedule from 'node-schedule';
3import { SynchronizedClock } from '../synchronization.js';
4
5export interface ScheduledJob {
6stop(): Promise<void>;
7}
8
9export function validateCron(rule: string): boolean {
10try {
11cron.parseExpression(rule);
12} catch {
13return false;
14}
15
16return true;
17}
18
19export function scheduleSynchronizedJob(
20id: string,
21rule: string,
22cb: (fireDate: Date) => void | Promise<void>,
23): ScheduledJob {
24const clock = new SynchronizedClock(`${id}:${rule}`);
25
26const job = schedule.scheduleJob(rule, async (fireDate) => {
27const nextTimestamp = job.nextInvocation().getTime();
28
29const wasSet = await clock.set(nextTimestamp);
30
31if (wasSet) {
32await cb(fireDate);
33}
34});
35
36const stop = async () => {
37job.cancel();
38
39await clock.reset();
40};
41
42return { stop };
43}
44