mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
45 lines
966 B
TypeScript
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();
|
|
}
|
|
};
|