Merge pull request #80 from jamesgroat/fix/cron-every-schedule-infinite-loop
fix(cron): prevent every schedule from firing in infinite loop
This commit is contained in:
@@ -23,4 +23,12 @@ describe("cron schedule", () => {
|
|||||||
);
|
);
|
||||||
expect(next).toBe(anchor + 30_000);
|
expect(next).toBe(anchor + 30_000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("computes next run for every schedule when anchorMs is not provided", () => {
|
||||||
|
const now = Date.parse("2025-12-13T00:00:00.000Z");
|
||||||
|
const next = computeNextRunAtMs({ kind: "every", everyMs: 30_000 }, now);
|
||||||
|
|
||||||
|
// Should return nowMs + everyMs, not nowMs (which would cause infinite loop)
|
||||||
|
expect(next).toBe(now + 30_000);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ export function computeNextRunAtMs(
|
|||||||
if (schedule.kind === "every") {
|
if (schedule.kind === "every") {
|
||||||
const everyMs = Math.max(1, Math.floor(schedule.everyMs));
|
const everyMs = Math.max(1, Math.floor(schedule.everyMs));
|
||||||
const anchor = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));
|
const anchor = Math.max(0, Math.floor(schedule.anchorMs ?? nowMs));
|
||||||
if (nowMs <= anchor) return anchor;
|
if (nowMs < anchor) return anchor;
|
||||||
const elapsed = nowMs - anchor;
|
const elapsed = nowMs - anchor;
|
||||||
const steps = Math.floor((elapsed + everyMs - 1) / everyMs);
|
const steps = Math.max(1, Math.floor((elapsed + everyMs - 1) / everyMs));
|
||||||
return anchor + steps * everyMs;
|
return anchor + steps * everyMs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user