Spaces:
Paused
Paused
| import { Cron } from "croner"; | |
| import type { CronSchedule } from "./types.js"; | |
| export function computeNextRunAtMs(schedule: CronSchedule, nowMs: number): number | undefined { | |
| if (schedule.kind === "at") { | |
| return schedule.atMs > nowMs ? schedule.atMs : undefined; | |
| } | |
| if (schedule.kind === "every") { | |
| const everyMs = Math.max(1, Math.floor(schedule.everyMs)); | |
| const anchor = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs)); | |
| if (nowMs < anchor) { | |
| return anchor; | |
| } | |
| const elapsed = nowMs - anchor; | |
| const steps = Math.max(1, Math.floor((elapsed + everyMs - 1) / everyMs)); | |
| return anchor + steps * everyMs; | |
| } | |
| const expr = schedule.expr.trim(); | |
| if (!expr) { | |
| return undefined; | |
| } | |
| const cron = new Cron(expr, { | |
| timezone: schedule.tz?.trim() || undefined, | |
| catch: false, | |
| }); | |
| const next = cron.nextRun(new Date(nowMs)); | |
| return next ? next.getTime() : undefined; | |
| } | |