
























@@ -1,34 +1,91 @@
1-import type { CronJob, CronSchedule } from "./types.js";
1+import type { CronJob } from "./types.js";
223-function schedulePayload(
4-schedule: CronSchedule,
3+function readString(record: Record<string, unknown>, key: string): string | undefined {
4+const value = record[key];
5+return typeof value === "string" && value.trim() ? value.trim() : undefined;
6+}
7+8+function readNumber(record: Record<string, unknown>, key: string): number | undefined {
9+const value = record[key];
10+return typeof value === "number" && Number.isFinite(value) ? value : undefined;
11+}
12+13+function schedulePayloadFromRecord(
14+schedule: Record<string, unknown>,
515):
616| { kind: "at"; at: string }
717| { kind: "every"; everyMs: number; anchorMs?: number }
8-| { kind: "cron"; expr: string; tz?: string; staggerMs?: number } {
9-switch (schedule.kind) {
10-case "at":
11-return { kind: "at", at: schedule.at };
12-case "every":
13-return { kind: "every", everyMs: schedule.everyMs, anchorMs: schedule.anchorMs };
14-case "cron":
15-return {
16-kind: "cron",
17-expr: schedule.expr,
18-tz: schedule.tz,
19-staggerMs: schedule.staggerMs,
20-};
18+| { kind: "cron"; expr: string; tz?: string; staggerMs?: number }
19+| undefined {
20+const rawKind = readString(schedule, "kind")?.toLowerCase();
21+const expr = readString(schedule, "expr") ?? readString(schedule, "cron");
22+const at = readString(schedule, "at");
23+const atMs = readNumber(schedule, "atMs");
24+const everyMs = readNumber(schedule, "everyMs");
25+const anchorMs = readNumber(schedule, "anchorMs");
26+const tz = readString(schedule, "tz");
27+const staggerMs = readNumber(schedule, "staggerMs");
28+const kind =
29+rawKind === "at" || rawKind === "every" || rawKind === "cron"
30+ ? rawKind
31+ : at || atMs !== undefined
32+ ? "at"
33+ : everyMs !== undefined
34+ ? "every"
35+ : expr
36+ ? "cron"
37+ : undefined;
38+39+if (kind === "at") {
40+return at
41+ ? { kind: "at", at }
42+ : atMs !== undefined
43+ ? { kind: "at", at: String(atMs) }
44+ : undefined;
2145}
22-throw new Error("Unsupported cron schedule kind");
46+if (kind === "every" && everyMs !== undefined) {
47+return { kind: "every", everyMs, anchorMs };
48+}
49+if (kind === "cron" && expr) {
50+return { kind: "cron", expr, tz, staggerMs };
51+}
52+return undefined;
53+}
54+55+function resolveSchedulePayload(
56+job: { schedule?: unknown } & Record<string, unknown>,
57+): ReturnType<typeof schedulePayloadFromRecord> {
58+if (job.schedule && typeof job.schedule === "object" && !Array.isArray(job.schedule)) {
59+return schedulePayloadFromRecord(job.schedule as Record<string, unknown>);
60+}
61+return schedulePayloadFromRecord(job);
2362}
24632564export function cronScheduleIdentity(
2665job: Pick<CronJob, "schedule"> & { enabled?: boolean },
2766): string {
67+const schedule = resolveSchedulePayload(job as unknown as Record<string, unknown>);
68+if (!schedule) {
69+throw new Error("Unsupported cron schedule kind");
70+}
2871return JSON.stringify({
2972version: 1,
3073enabled: job.enabled ?? true,
31-schedule: schedulePayload(job.schedule),
74+ schedule,
75+});
76+}
77+78+export function tryCronScheduleIdentity(
79+job: { schedule?: unknown; enabled?: unknown } & Record<string, unknown>,
80+): string | undefined {
81+const schedule = resolveSchedulePayload(job);
82+if (!schedule) {
83+return undefined;
84+}
85+return JSON.stringify({
86+version: 1,
87+enabled: typeof job.enabled === "boolean" ? job.enabled : true,
88+ schedule,
3289});
3390}
3491此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。