Files
qinglong/packages/ql3-local-execution/src/scheduler/croner.ts
T

45 lines
966 B
TypeScript

import type {
LocalCronNextOccurrence,
LocalCronSchedule,
} from '@qinglong/runtime-core/local-scheduler';
interface CronerJob {
nextRun(after: Date): Date | null;
stop(): void;
}
interface CronerConstructor {
new (
expression: string,
options: Readonly<{
timezone: string;
paused: true;
unref: true;
}>,
): CronerJob;
}
export const cronerLocalNextOccurrence: LocalCronNextOccurrence = (
schedule: LocalCronSchedule,
afterMs: number,
): number => {
let job: CronerJob | undefined;
try {
const { Cron } = require('croner') as Readonly<{
Cron: CronerConstructor;
}>;
job = new Cron(schedule.expression, {
timezone: schedule.timezone,
paused: true,
unref: true,
});
const next = job.nextRun(new Date(afterMs));
if (!(next instanceof Date)) {
throw new Error('cron has no next occurrence');
}
return next.getTime();
} finally {
job?.stop();
}
};