@azlib/scheduler 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/contracts/scheduler-types.ts","../src/contracts/scheduler-host.ts","../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-job-store.ts","../src/core/persistence.ts","../index.ts"],"mappings":";;KAEY;KAEA;KAEA;KAEA;UAEK;EACf,cAAc;EACd;EACA;EACA,gBAAgB;EAChB,kBAAkB;;UAGH,uBAAuB;EACtC;EACA;EACA,UAAU;EACV,QAAQ;EACR;;UAGe,mBACf,2BACQ,uBAAuB;EAC/B;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe;EACf,YAAY,SACV,KAAK,uBAAuB,WAC3B;IAAU;;EACb,UAAU,SACR,eACA,OAAO,QAAQ,uBAAuB,YACrC;EACH,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,UAAU,gBAAgB;EAC1B,YAAY,QAAQ;EACpB,eACE,QAAQ,0BACP,QAAQ;EACX,qBAAqB,sBAAsB;EAC3C,SAAS;EACT,QAAQ;;UAGO;EACf,MAAM;EACN;EACA,sCAAsC;EACtC,+BAA+B;EAC/B;IACE,MAAM,iBAAiB,OAAO;IAC9B,KAAK,iBAAiB,OAAO;IAC7B,KAAK,iBAAiB,OAAO;IAC7B,MAAM,iBAAiB,OAAO;;EAEhC;EACA;EACA,cAAc;;UAGC;EACf,QAAQ;EACR,SAAS;EACT;;UAGe;EACf,SAAS,SACP,oBACA,UAAU,OAAO,YAAY;EAE/B,QAAQ,uBAAuB,mBAAmB;EAClD,IAAI;;;;UC9GW;EACf,QAAQ,gBAAgB;EACxB,OAAO,gBAAgB;;;;iBCCT,oBACd,WAAW,kBACX,MAAM;;;cCHK;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;KAGU,2BAA2B,0BAA0B;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/contracts/scheduler-types.ts","../src/contracts/scheduler-host.ts","../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-job-store.ts","../src/core/persistence.ts","../index.ts"],"mappings":";;KAEY;KAEA;KAEA;KAEA;UAEK;EACf,cAAc;EACd;EACA;EACA,gBAAgB;EAChB,kBAAkB;;UAGH,uBAAuB;EACtC;EACA;EACA,UAAU;EACV,QAAQ;EACR;;UAGe,mBACf,2BACQ,uBAAuB;EAC/B;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe;EACf,YAAY,SACV,KAAK,uBAAuB,WAC3B;IAAU;;EACb,UAAU,SACR,eACA,OAAO,QAAQ,uBAAuB,YACrC;EACH,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,UAAU,gBAAgB;EAC1B,YAAY,QAAQ;EACpB,eACE,QAAQ,0BACP,QAAQ;EACX,qBAAqB,sBAAsB;EAC3C,SAAS;EACT,QAAQ;;UAGO;EACf,MAAM;EACN;EACA,sCAAsC;EACtC,+BAA+B;EAC/B;IACE,MAAM,iBAAiB,OAAO;IAC9B,KAAK,iBAAiB,OAAO;IAC7B,KAAK,iBAAiB,OAAO;IAC7B,MAAM,iBAAiB,OAAO;;EAEhC;EACA;EACA,cAAc;;UAGC;EACf,QAAQ;EACR,SAAS;EACT;;UAGe;EACf,SAAS,SACP,oBACA,UAAU,OAAO,YAAY;EAE/B,QAAQ,uBAAuB,mBAAmB;EAClD,IAAI;;;;UC9GW;EACf,QAAQ,gBAAgB;EACxB,OAAO,gBAAgB;;;;iBCCT,oBACd,WAAW,kBACX,MAAM;;;cCHK;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;KAGU,2BAA2B,0BAA0B;cAgCpD;UACH;UACA;UACA;UACA;UACA;EAER;EAKA,cAAc;EAMd,SAAS;EAMT,UAAU;EASV;EAKA,YAAY;EAMZ,OAAO;EAMP,QAAQ;EASR,aAAa;EAMb,cAAc;EASd,kBAAkB;EAMlB;EAKA,QAAQ;EAMR,SAAS;EAST,aAAa;EAMb,UAAU,SAAS;EAMnB,WAAW,UAAU;EAWrB,eAAe;EAMf;EAKA;EAKA,QAAQ,cAAc;EAStB,SAAS,SAAS,kBAAkB,eAAU;EAS9C,UAAU,oBAAoB,eAAU;EASxC;EAIA;;iBAKc,wBAAwB;;;UCzNvB;EACf;EACA;EACA;EACA;;iBAGoB,qBACpB,WAAW,mBACV,QAAQ;iBAYW,oBAAoB,WAAW,mBAAgB;;;;;;cAAhB;;;;UCpBpC;EACf,aAAa,kBAAkB;EAC/B,aAAa,kBAAkB;EAC/B,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,eAAe,sBAAsB;;iBAGvB,gCACd,WAAW,mBACV;;;UCXc;EACf,OAAO,QAAQ,2BAA2B,QAAQ;EAClD,OACE,qBACA,OAAO,QAAQ,KAAK,4CACnB,QAAQ;EACX,UAAU,gBAAgB,QAAQ;;;;UCRnB;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,IACE,eACA,mBACA,cACC,QAAQ;EACX,cACE,eACA,sBACC,QAAQ;EACX,IAAI,gBAAgB,QAAQ;EAC5B,OAAO,gBAAgB;;;;UCdR;EACf,OACE,eACA,YAAY,yBACX,QAAQ;EACX,OACE,eACA,OAAO,QAAQ,0BACd,QAAQ;EACX,WACE,eACA,mBACC,QAAQ;EACX,IAAI,gBAAgB,QAAQ;EAC5B,QAAQ,QAAQ;EAChB,OAAO,gBAAgB;;;;UCyLR;EACf,UAAU;EACV,aAAa;EACb,gBAAgB;;iBAGF,2BACd,QAAQ,6BACP;;;iBCtLa,uBAAuB,SAAS;EAC9C,SAAS;EACT,UAAU"}
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/contracts/scheduler-types.ts","../src/contracts/scheduler-host.ts","../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-job-store.ts","../src/core/persistence.ts","../index.ts"],"mappings":";;KAEY;KAEA;KAEA;KAEA;UAEK;EACf,cAAc;EACd;EACA;EACA,gBAAgB;EAChB,kBAAkB;;UAGH,uBAAuB;EACtC;EACA;EACA,UAAU;EACV,QAAQ;EACR;;UAGe,mBACf,2BACQ,uBAAuB;EAC/B;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe;EACf,YAAY,SACV,KAAK,uBAAuB,WAC3B;IAAU;;EACb,UAAU,SACR,eACA,OAAO,QAAQ,uBAAuB,YACrC;EACH,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,UAAU,gBAAgB;EAC1B,YAAY,QAAQ;EACpB,eACE,QAAQ,0BACP,QAAQ;EACX,qBAAqB,sBAAsB;EAC3C,SAAS;EACT,QAAQ;;UAGO;EACf,MAAM;EACN;EACA,sCAAsC;EACtC,+BAA+B;EAC/B;IACE,MAAM,iBAAiB,OAAO;IAC9B,KAAK,iBAAiB,OAAO;IAC7B,KAAK,iBAAiB,OAAO;IAC7B,MAAM,iBAAiB,OAAO;;EAEhC;EACA;EACA,cAAc;;UAGC;EACf,QAAQ;EACR,SAAS;EACT;;UAGe;EACf,SAAS,SACP,oBACA,UAAU,OAAO,YAAY;EAE/B,QAAQ,uBAAuB,mBAAmB;EAClD,IAAI;;;;UC9GW;EACf,QAAQ,gBAAgB;EACxB,OAAO,gBAAgB;;;;iBCCT,oBACd,WAAW,kBACX,MAAM;;;cCHK;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;KAGU,2BAA2B,0BAA0B;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/contracts/scheduler-types.ts","../src/contracts/scheduler-host.ts","../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-job-store.ts","../src/core/persistence.ts","../index.ts"],"mappings":";;KAEY;KAEA;KAEA;KAEA;UAEK;EACf,cAAc;EACd;EACA;EACA,gBAAgB;EAChB,kBAAkB;;UAGH,uBAAuB;EACtC;EACA;EACA,UAAU;EACV,QAAQ;EACR;;UAGe,mBACf,2BACQ,uBAAuB;EAC/B;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe;EACf,YAAY,SACV,KAAK,uBAAuB,WAC3B;IAAU;;EACb,UAAU,SACR,eACA,OAAO,QAAQ,uBAAuB,YACrC;EACH,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,UAAU,gBAAgB;EAC1B,YAAY,QAAQ;EACpB,eACE,QAAQ,0BACP,QAAQ;EACX,qBAAqB,sBAAsB;EAC3C,SAAS;EACT,QAAQ;;UAGO;EACf,MAAM;EACN;EACA,sCAAsC;EACtC,+BAA+B;EAC/B;IACE,MAAM,iBAAiB,OAAO;IAC9B,KAAK,iBAAiB,OAAO;IAC7B,KAAK,iBAAiB,OAAO;IAC7B,MAAM,iBAAiB,OAAO;;EAEhC;EACA;EACA,cAAc;;UAGC;EACf,QAAQ;EACR,SAAS;EACT;;UAGe;EACf,SAAS,SACP,oBACA,UAAU,OAAO,YAAY;EAE/B,QAAQ,uBAAuB,mBAAmB;EAClD,IAAI;;;;UC9GW;EACf,QAAQ,gBAAgB;EACxB,OAAO,gBAAgB;;;;iBCCT,oBACd,WAAW,kBACX,MAAM;;;cCHK;WACX;WACA;WACA;WACA;WACA;WACA;WACA;;KAGU,2BAA2B,0BAA0B;cAgCpD;UACH;UACA;UACA;UACA;UACA;EAER;EAKA,cAAc;EAMd,SAAS;EAMT,UAAU;EASV;EAKA,YAAY;EAMZ,OAAO;EAMP,QAAQ;EASR,aAAa;EAMb,cAAc;EASd,kBAAkB;EAMlB;EAKA,QAAQ;EAMR,SAAS;EAST,aAAa;EAMb,UAAU,SAAS;EAMnB,WAAW,UAAU;EAWrB,eAAe;EAMf;EAKA;EAKA,QAAQ,cAAc;EAStB,SAAS,SAAS,kBAAkB,eAAU;EAS9C,UAAU,oBAAoB,eAAU;EASxC;EAIA;;iBAKc,wBAAwB;;;UCzNvB;EACf;EACA;EACA;EACA;;iBAGoB,qBACpB,WAAW,mBACV,QAAQ;iBAYW,oBAAoB,WAAW,mBAAgB;;;;;;cAAhB;;;;UCpBpC;EACf,aAAa,kBAAkB;EAC/B,aAAa,kBAAkB;EAC/B,SAAS,gBAAgB;EACzB,UAAU,gBAAgB;EAC1B,eAAe,sBAAsB;;iBAGvB,gCACd,WAAW,mBACV;;;UCXc;EACf,OAAO,QAAQ,2BAA2B,QAAQ;EAClD,OACE,qBACA,OAAO,QAAQ,KAAK,4CACnB,QAAQ;EACX,UAAU,gBAAgB,QAAQ;;;;UCRnB;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,IACE,eACA,mBACA,cACC,QAAQ;EACX,cACE,eACA,sBACC,QAAQ;EACX,IAAI,gBAAgB,QAAQ;EAC5B,OAAO,gBAAgB;;;;UCdR;EACf,OACE,eACA,YAAY,yBACX,QAAQ;EACX,OACE,eACA,OAAO,QAAQ,0BACd,QAAQ;EACX,WACE,eACA,mBACC,QAAQ;EACX,IAAI,gBAAgB,QAAQ;EAC5B,QAAQ,QAAQ;EAChB,OAAO,gBAAgB;;;;UCyLR;EACf,UAAU;EACV,aAAa;EACb,gBAAgB;;iBAGF,2BACd,QAAQ,6BACP;;;iBCtLa,uBAAuB,SAAS;EAC9C,SAAS;EACT,UAAU"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createSchedulerService","createSchedulerServiceInternal"],"sources":["../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-cache.ts","../src/core/schedule-parser.ts","../src/core/scheduler-engine.ts","../src/core/scheduler-events.ts","../src/core/scheduler-handler-registry.ts","../src/core/scheduler-job-store.ts","../src/core/scheduler-logger.ts","../src/core/scheduler-runtime.ts","../src/core/scheduler-runtime-config.ts","../src/core/scheduler-service-query.ts","../src/core/scheduler-service-retry.ts","../src/core/persistence.ts","../src/core/scheduler-service.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../index.ts"],"sourcesContent":["import type { SchedulerHostAdapter } from \"../contracts/scheduler-host.js\";\nimport type { SchedulerService } from \"../contracts/scheduler-types.js\";\n\nexport function bindSchedulerToHost(\n scheduler: SchedulerService,\n host: SchedulerHostAdapter,\n): void {\n host.onStart(() => scheduler.start());\n host.onStop(() => scheduler.stop());\n}\n","import { unique } from \"@azlib/std\";\n\nexport const CronWeekday = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6,\n} as const;\n\nexport type CronWeekdayValue = (typeof CronWeekday)[keyof typeof CronWeekday];\n\nfunction assertIntegerInRange(\n label: string,\n value: number,\n min: number,\n max: number,\n): void {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer between ${min} and ${max}`);\n }\n}\n\nfunction assertPositiveInteger(label: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n}\n\nfunction assertStepInRange(label: string, value: number, max: number): void {\n assertPositiveInteger(label, value);\n if (value > max) {\n throw new Error(`${label} must be less than or equal to ${max}`);\n }\n}\n\nfunction toSortedCsv(values: number[]): string {\n return unique(values).sort((left, right) => left - right).join(\",\");\n}\n\nexport class CronExpressionBuilder {\n private minute = \"*\";\n private hour = \"*\";\n private dayOfMonth = \"*\";\n private month = \"*\";\n private dayOfWeek = \"*\";\n\n everyMinute(): this {\n this.minute = \"*\";\n return this;\n }\n\n everyNMinutes(interval: number): this {\n assertStepInRange(\"minute interval\", interval, 59);\n this.minute = `*/${interval}`;\n return this;\n }\n\n atMinute(minute: number): this {\n assertIntegerInRange(\"minute\", minute, 0, 59);\n this.minute = String(minute);\n return this;\n }\n\n atMinutes(minutes: number[]): this {\n if (minutes.length === 0) {\n throw new Error(\"minutes must contain at least one value\");\n }\n minutes.forEach((minute) => assertIntegerInRange(\"minute\", minute, 0, 59));\n this.minute = toSortedCsv(minutes);\n return this;\n }\n\n everyHour(): this {\n this.hour = \"*\";\n return this;\n }\n\n everyNHours(interval: number): this {\n assertStepInRange(\"hour interval\", interval, 23);\n this.hour = `*/${interval}`;\n return this;\n }\n\n atHour(hour: number): this {\n assertIntegerInRange(\"hour\", hour, 0, 23);\n this.hour = String(hour);\n return this;\n }\n\n atHours(hours: number[]): this {\n if (hours.length === 0) {\n throw new Error(\"hours must contain at least one value\");\n }\n hours.forEach((hour) => assertIntegerInRange(\"hour\", hour, 0, 23));\n this.hour = toSortedCsv(hours);\n return this;\n }\n\n onDayOfMonth(day: number): this {\n assertIntegerInRange(\"day of month\", day, 1, 31);\n this.dayOfMonth = String(day);\n return this;\n }\n\n onDaysOfMonth(days: number[]): this {\n if (days.length === 0) {\n throw new Error(\"days must contain at least one value\");\n }\n days.forEach((day) => assertIntegerInRange(\"day of month\", day, 1, 31));\n this.dayOfMonth = toSortedCsv(days);\n return this;\n }\n\n everyNDaysOfMonth(interval: number): this {\n assertStepInRange(\"day-of-month interval\", interval, 31);\n this.dayOfMonth = `*/${interval}`;\n return this;\n }\n\n everyMonth(): this {\n this.month = \"*\";\n return this;\n }\n\n onMonth(month: number): this {\n assertIntegerInRange(\"month\", month, 1, 12);\n this.month = String(month);\n return this;\n }\n\n onMonths(months: number[]): this {\n if (months.length === 0) {\n throw new Error(\"months must contain at least one value\");\n }\n months.forEach((month) => assertIntegerInRange(\"month\", month, 1, 12));\n this.month = toSortedCsv(months);\n return this;\n }\n\n everyNMonths(interval: number): this {\n assertStepInRange(\"month interval\", interval, 12);\n this.month = `*/${interval}`;\n return this;\n }\n\n onWeekday(weekday: CronWeekdayValue): this {\n assertIntegerInRange(\"weekday\", weekday, 0, 6);\n this.dayOfWeek = String(weekday);\n return this;\n }\n\n onWeekdays(weekdays: CronWeekdayValue[]): this {\n if (weekdays.length === 0) {\n throw new Error(\"weekdays must contain at least one value\");\n }\n weekdays.forEach((weekday) =>\n assertIntegerInRange(\"weekday\", weekday, 0, 6),\n );\n this.dayOfWeek = toSortedCsv(weekdays);\n return this;\n }\n\n everyNWeekdays(interval: number): this {\n assertStepInRange(\"weekday interval\", interval, 6);\n this.dayOfWeek = `*/${interval}`;\n return this;\n }\n\n weekdays(): this {\n this.dayOfWeek = \"1-5\";\n return this;\n }\n\n weekends(): this {\n this.dayOfWeek = \"0,6\";\n return this;\n }\n\n dailyAt(hour: number, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.dayOfMonth = \"*\";\n this.month = \"*\";\n this.dayOfWeek = \"*\";\n return this;\n }\n\n weeklyOn(weekday: CronWeekdayValue, hour = 0, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.dayOfWeek = String(weekday);\n this.dayOfMonth = \"*\";\n this.month = \"*\";\n return this;\n }\n\n monthlyOn(dayOfMonth: number, hour = 0, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.onDayOfMonth(dayOfMonth);\n this.month = \"*\";\n this.dayOfWeek = \"*\";\n return this;\n }\n\n build(): string {\n return `${this.minute} ${this.hour} ${this.dayOfMonth} ${this.month} ${this.dayOfWeek}`;\n }\n\n toString(): string {\n return this.build();\n }\n}\n\nexport function createCronExpression(): CronExpressionBuilder {\n return new CronExpressionBuilder();\n}\n","import type { SchedulerExecutionRecord } from \"../contracts/scheduler-types.js\";\n\nexport interface JobExecutionStore {\n create(record: SchedulerExecutionRecord): Promise<SchedulerExecutionRecord>;\n update(\n executionId: string,\n patch: Partial<Omit<SchedulerExecutionRecord, \"executionId\">>,\n ): Promise<SchedulerExecutionRecord | null>;\n listByJob(jobId: string): Promise<SchedulerExecutionRecord[]>;\n}\n\nexport function createInMemoryJobExecutionStore(): JobExecutionStore {\n const byExecution = new Map<string, SchedulerExecutionRecord>();\n\n return {\n async create(record) {\n byExecution.set(record.executionId, record);\n return record;\n },\n async update(executionId, patch) {\n const current = byExecution.get(executionId);\n if (!current) {\n return null;\n }\n const next: SchedulerExecutionRecord = {\n ...current,\n ...patch,\n };\n byExecution.set(executionId, next);\n return next;\n },\n async listByJob(jobId) {\n return Array.from(byExecution.values()).filter(\n (item) => item.jobId === jobId,\n );\n },\n };\n}\n","export interface ScheduleCursorRecord {\n jobId: string;\n lastEvaluatedAt: string;\n lastTriggeredAt?: string;\n nextRunAt: string;\n version: number;\n}\n\nexport interface ScheduleCursorStore {\n set(\n jobId: string,\n nextRunAt: string,\n now: string,\n ): Promise<ScheduleCursorRecord>;\n markTriggered(\n jobId: string,\n triggeredAt: string,\n ): Promise<ScheduleCursorRecord | null>;\n get(jobId: string): Promise<ScheduleCursorRecord | null>;\n remove(jobId: string): Promise<boolean>;\n}\n\nexport function createInMemoryScheduleCursorStore(): ScheduleCursorStore {\n const cursors = new Map<string, ScheduleCursorRecord>();\n\n return {\n async set(jobId, nextRunAt, now) {\n const previous = cursors.get(jobId);\n const next: ScheduleCursorRecord = {\n jobId,\n lastEvaluatedAt: now,\n lastTriggeredAt: previous?.lastTriggeredAt,\n nextRunAt,\n version: (previous?.version ?? 0) + 1,\n };\n cursors.set(jobId, next);\n return next;\n },\n async markTriggered(jobId, triggeredAt) {\n const current = cursors.get(jobId);\n if (!current) {\n return null;\n }\n const next: ScheduleCursorRecord = {\n ...current,\n lastTriggeredAt: triggeredAt,\n version: current.version + 1,\n };\n cursors.set(jobId, next);\n return next;\n },\n async get(jobId) {\n return cursors.get(jobId) ?? null;\n },\n async remove(jobId) {\n return cursors.delete(jobId);\n },\n };\n}\n","import { createCache, type Cache } from \"@azlib/cache\";\n\nexport function createSchedulerCache(\n namespace = \"scheduler-core\",\n): Cache<string> {\n return createCache<string>({\n mode: \"memory\",\n namespace,\n });\n}\n","import type { ScheduleType } from \"../contracts/scheduler-types.js\";\n\nexport interface ParsedSchedule {\n scheduleType: ScheduleType;\n expression: string;\n timezone: string;\n}\n\nconst CRON_FIELD_PATTERN = /^\\*|\\*\\/\\d+|\\d+|\\d+-\\d+|\\d+(?:,\\d+)*$/;\n\nexport function assertValidTimezone(timezone: string): void {\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone }).format(new Date());\n } catch {\n throw new Error(`Invalid timezone: ${timezone}`);\n }\n}\n\nfunction assertValidCronExpression(expression: string): void {\n const fields = expression.trim().split(/\\s+/);\n if (fields.length !== 5) {\n throw new Error(\"Cron expression must contain 5 fields\");\n }\n\n for (const field of fields) {\n if (!CRON_FIELD_PATTERN.test(field)) {\n throw new Error(`Invalid cron field: ${field}`);\n }\n }\n}\n\nfunction assertValidOnceExpression(expression: string): void {\n const date = new Date(expression);\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"Once schedule expression must be a valid ISO datetime\");\n }\n}\n\nexport function parseSchedule(\n scheduleType: ScheduleType,\n expression: string,\n timezone: string,\n): ParsedSchedule {\n assertValidTimezone(timezone);\n\n if (scheduleType === \"cron\") {\n assertValidCronExpression(expression);\n } else {\n assertValidOnceExpression(expression);\n }\n\n return {\n scheduleType,\n expression: expression.trim(),\n timezone,\n };\n}\n\nexport function computeNextRunAt(\n parsed: ParsedSchedule,\n now = new Date(),\n): string {\n if (parsed.scheduleType === \"once\") {\n return new Date(parsed.expression).toISOString();\n }\n\n const next = new Date(now);\n next.setUTCSeconds(0, 0);\n next.setUTCMinutes(next.getUTCMinutes() + 1);\n return next.toISOString();\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Cache } from \"@azlib/cache\";\nimport type { QueueService } from \"@azlib/queue\";\n\nimport type { SchedulerJobRecord } from \"../contracts/scheduler-types.js\";\nimport { computeNextRunAt, parseSchedule } from \"./schedule-parser.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\nimport type { ScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport type { SchedulerJobStore } from \"./scheduler-job-store.js\";\n\ninterface LoggerLike {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport interface SchedulerEngineDependencies {\n queueService?: QueueService;\n cache?: Cache<string>;\n logger: LoggerLike;\n jobStore: SchedulerJobStore;\n cursorStore: ScheduleCursorStore;\n executionStore: JobExecutionStore;\n tickIntervalMs: number;\n maxDueJobsPerTick: number;\n}\n\nexport interface SchedulerEngine {\n start(): Promise<void>;\n stop(): Promise<void>;\n computeNextRun(job: SchedulerJobRecord, now?: Date): Promise<string>;\n}\n\nexport function createSchedulerEngine(\n dependencies: SchedulerEngineDependencies,\n): SchedulerEngine {\n let timer: NodeJS.Timeout | undefined;\n\n async function computeNextRun(\n job: SchedulerJobRecord,\n now = new Date(),\n ): Promise<string> {\n const cacheKey = `scheduler.nextRun.${job.jobId}.${job.schedule.expression}.${job.schedule.timezone}`;\n const cached = await dependencies.cache?.get(cacheKey);\n if (cached?.status === \"hit\" && cached.value) {\n return cached.value;\n }\n\n const parsed = parseSchedule(\n job.schedule.scheduleType,\n job.schedule.expression,\n job.schedule.timezone,\n );\n const nextRunAt = computeNextRunAt(parsed, now);\n\n await dependencies.cache?.set(cacheKey, nextRunAt);\n await dependencies.cursorStore.set(job.jobId, nextRunAt, now.toISOString());\n\n return nextRunAt;\n }\n\n async function evaluateTick(): Promise<void> {\n const now = new Date();\n const candidates = (await dependencies.jobStore.list())\n .filter((job) => job.enabled)\n .slice(0, dependencies.maxDueJobsPerTick);\n\n for (const job of candidates) {\n const nextRunAt = await computeNextRun(job, now);\n if (new Date(nextRunAt).getTime() > now.getTime()) {\n continue;\n }\n\n const executionId = `exec_${randomUUID()}`;\n await dependencies.executionStore.create({\n executionId,\n jobId: job.jobId,\n scheduledFor: nextRunAt,\n triggeredAt: now.toISOString(),\n status: \"queued\",\n attemptCount: 0,\n });\n await dependencies.cursorStore.markTriggered(\n job.jobId,\n now.toISOString(),\n );\n\n if (dependencies.queueService) {\n await dependencies.queueService.enqueue({\n idempotencyKey: `scheduler:${job.jobId}:${nextRunAt}`,\n payloadRef: {\n executionId,\n handlerKey: job.handlerKey,\n config: job.config,\n },\n });\n }\n\n dependencies.logger.info(\"scheduler.job.triggered\", {\n executionId,\n jobId: job.jobId,\n scheduledFor: nextRunAt,\n });\n }\n }\n\n return {\n async start() {\n if (timer) {\n return;\n }\n\n dependencies.logger.info(\"scheduler.runtime.started\", {\n tickIntervalMs: dependencies.tickIntervalMs,\n });\n timer = setInterval(() => {\n void evaluateTick().catch((error: unknown) => {\n dependencies.logger.error(\"scheduler.tick.failed\", {\n error:\n error instanceof Error\n ? error.message\n : \"Unknown scheduler error\",\n });\n });\n }, dependencies.tickIntervalMs);\n },\n async stop() {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n dependencies.logger.info(\"scheduler.runtime.stopped\");\n },\n computeNextRun,\n };\n}\n","export type SchedulerEventType =\n | \"job-created\"\n | \"job-updated\"\n | \"job-paused\"\n | \"job-resumed\"\n | \"job-deleted\"\n | \"triggered\"\n | \"skipped\"\n | \"retry\"\n | \"failed\";\n\nexport interface SchedulerEventRecord {\n eventId: string;\n eventType: SchedulerEventType;\n timestamp: string;\n jobId?: string;\n executionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SchedulerEventBus {\n emit(\n event: Omit<SchedulerEventRecord, \"eventId\" | \"timestamp\">,\n ): SchedulerEventRecord;\n list(): SchedulerEventRecord[];\n}\n\nexport function createInMemorySchedulerEventBus(): SchedulerEventBus {\n const events: SchedulerEventRecord[] = [];\n\n return {\n emit(event) {\n const record: SchedulerEventRecord = {\n eventId: `evt_${Math.random().toString(36).slice(2, 12)}`,\n timestamp: new Date().toISOString(),\n ...event,\n };\n events.push(record);\n return record;\n },\n list() {\n return [...events];\n },\n };\n}\n","export type SchedulerHandler<TConfig = unknown> = (\n input: TConfig,\n) => Promise<void>;\n\nexport interface SchedulerHandlerRegistry {\n register<TConfig>(\n handlerKey: string,\n handler: SchedulerHandler<TConfig>,\n ): void;\n resolve(handlerKey: string): SchedulerHandler | null;\n has(handlerKey: string): boolean;\n}\n\nexport function createSchedulerHandlerRegistry(): SchedulerHandlerRegistry {\n const handlers = new Map<string, SchedulerHandler>();\n\n return {\n register(handlerKey, handler) {\n handlers.set(handlerKey, handler as SchedulerHandler);\n },\n resolve(handlerKey) {\n return handlers.get(handlerKey) ?? null;\n },\n has(handlerKey) {\n return handlers.has(handlerKey);\n },\n };\n}\n","import type {\n SchedulerJobDefinition,\n SchedulerJobRecord,\n} from \"../contracts/scheduler-types.js\";\n\nexport interface SchedulerJobStore {\n create(\n jobId: string,\n definition: SchedulerJobDefinition,\n ): Promise<SchedulerJobRecord>;\n update(\n jobId: string,\n patch: Partial<SchedulerJobDefinition>,\n ): Promise<SchedulerJobRecord | null>;\n setEnabled(\n jobId: string,\n enabled: boolean,\n ): Promise<SchedulerJobRecord | null>;\n get(jobId: string): Promise<SchedulerJobRecord | null>;\n list(): Promise<SchedulerJobRecord[]>;\n remove(jobId: string): Promise<boolean>;\n}\n\nexport function createInMemorySchedulerJobStore(): SchedulerJobStore {\n const jobs = new Map<string, SchedulerJobRecord>();\n\n return {\n async create(jobId, definition) {\n const now = new Date().toISOString();\n const created: SchedulerJobRecord = {\n ...definition,\n jobId,\n enabled: definition.enabled ?? true,\n createdAt: now,\n updatedAt: now,\n };\n jobs.set(jobId, created);\n return created;\n },\n async update(jobId, patch) {\n const current = jobs.get(jobId);\n if (!current) {\n return null;\n }\n const updated: SchedulerJobRecord = {\n ...current,\n ...patch,\n updatedAt: new Date().toISOString(),\n };\n jobs.set(jobId, updated);\n return updated;\n },\n async setEnabled(jobId, enabled) {\n const current = jobs.get(jobId);\n if (!current) {\n return null;\n }\n const updated: SchedulerJobRecord = {\n ...current,\n enabled,\n updatedAt: new Date().toISOString(),\n };\n jobs.set(jobId, updated);\n return updated;\n },\n async get(jobId) {\n return jobs.get(jobId) ?? null;\n },\n async list() {\n return Array.from(jobs.values());\n },\n async remove(jobId) {\n return jobs.delete(jobId);\n },\n };\n}\n","import { createConsoleTransport, createLogger } from \"@azlib/logger\";\n\nexport interface SchedulerLogger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport function createSchedulerLogger(): SchedulerLogger {\n return createLogger({\n level: \"info\",\n transports: [createConsoleTransport()],\n });\n}\n","import type { SchedulerEngine } from \"./scheduler-engine.js\";\n\nexport interface SchedulerRuntime {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport function createSchedulerRuntime(\n engine: SchedulerEngine,\n): SchedulerRuntime {\n let started = false;\n\n return {\n async start() {\n if (started) {\n return;\n }\n started = true;\n await engine.start();\n },\n async stop() {\n if (!started) {\n return;\n }\n started = false;\n await engine.stop();\n },\n };\n}\n","import type { SchedulerServiceOptions } from \"../contracts/scheduler-types.js\";\n\nexport function assertRuntimeConfig(options: SchedulerServiceOptions): void {\n if (options.tickIntervalMs !== undefined && options.tickIntervalMs <= 0) {\n throw new Error(\"tickIntervalMs must be greater than 0\");\n }\n if (\n options.maxDueJobsPerTick !== undefined &&\n options.maxDueJobsPerTick < 1\n ) {\n throw new Error(\"maxDueJobsPerTick must be at least 1\");\n }\n}\n","import type {\n SchedulerExecutionQuery,\n SchedulerExecutionRecord,\n SchedulerJobListItem,\n} from \"../contracts/scheduler-types.js\";\n\nexport function toJobListItem(input: {\n jobId: string;\n name: string;\n enabled: boolean;\n timezone: string;\n nextRunAt?: string;\n}): SchedulerJobListItem {\n return {\n jobId: input.jobId,\n name: input.name,\n enabled: input.enabled,\n timezone: input.timezone,\n nextRunAt: input.nextRunAt,\n };\n}\n\nexport function filterExecutions(\n items: SchedulerExecutionRecord[],\n query?: SchedulerExecutionQuery,\n): SchedulerExecutionRecord[] {\n if (!query) {\n return items;\n }\n\n const fromTime = query.from ? new Date(query.from).getTime() : undefined;\n const toTime = query.to ? new Date(query.to).getTime() : undefined;\n\n return items\n .filter((item) => (query.jobId ? item.jobId === query.jobId : true))\n .filter((item) => (query.status ? item.status === query.status : true))\n .filter((item) => {\n if (fromTime === undefined) {\n return true;\n }\n return new Date(item.triggeredAt).getTime() >= fromTime;\n })\n .filter((item) => {\n if (toTime === undefined) {\n return true;\n }\n return new Date(item.triggeredAt).getTime() <= toTime;\n })\n .slice(0, query.limit ?? items.length);\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { SchedulerExecutionRecord } from \"../contracts/scheduler-types.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\n\nexport async function retryFailedExecutionById(\n allExecutions: SchedulerExecutionRecord[],\n executionStore: JobExecutionStore,\n executionId: string,\n): Promise<SchedulerExecutionRecord> {\n const target = allExecutions.find((item) => item.executionId === executionId);\n if (!target) {\n throw new Error(`Execution not found: ${executionId}`);\n }\n if (target.status !== \"failed\" && target.status !== \"dead-letter\") {\n throw new Error(\"Only failed or dead-letter executions can be retried\");\n }\n\n const retryExecutionId = `exec_${randomUUID()}`;\n const retry: SchedulerExecutionRecord = {\n ...target,\n executionId: retryExecutionId,\n status: \"queued\",\n attemptCount: target.attemptCount + 1,\n triggeredAt: new Date().toISOString(),\n };\n await executionStore.create(retry);\n return retry;\n}\n","import type { SqlClientAdapter, SqlDialectAdapter } from \"@azlib/persistence\";\n\nimport type { SchedulerPersistenceConfig } from \"../contracts/scheduler-types.js\";\nimport type { ScheduleCursorRecord } from \"./schedule-cursor-store.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\nimport type { ScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport type { SchedulerJobStore } from \"./scheduler-job-store.js\";\n\ninterface JobRow {\n jobId: string;\n name: string;\n handlerKey: string;\n scheduleType: \"once\" | \"cron\";\n expression: string;\n timezone: string;\n overlapPolicy: string | null;\n missedRunPolicy: string | null;\n configJson: string;\n enabled: number;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface CursorRow {\n jobId: string;\n lastEvaluatedAt: string;\n lastTriggeredAt: string | null;\n nextRunAt: string;\n version: number;\n}\n\ninterface ExecutionRow {\n executionId: string;\n jobId: string;\n scheduledFor: string;\n triggeredAt: string;\n status: string;\n queueTaskId: string | null;\n attemptCount: number;\n lastError: string | null;\n}\n\nfunction namespaceFor(config: SchedulerPersistenceConfig): string {\n return config.namespace?.trim() || \"azlib\";\n}\n\nfunction tableNames(namespace: string) {\n return {\n jobs: `${namespace}__scheduler_jobs`,\n cursors: `${namespace}__scheduler_cursors`,\n executions: `${namespace}__scheduler_executions`,\n };\n}\n\nfunction quoted(dialect: SqlDialectAdapter, tableName: string): string {\n return dialect.quoteIdentifier(tableName);\n}\n\nasync function bootstrapSchedulerPersistence(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n): Promise<void> {\n await client.transaction(async (tx) => {\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.jobs)} (\n job_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n handler_key TEXT NOT NULL,\n schedule_type TEXT NOT NULL,\n expression TEXT NOT NULL,\n timezone TEXT NOT NULL,\n overlap_policy TEXT,\n missed_run_policy TEXT,\n config_json TEXT NOT NULL,\n enabled INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`);\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.cursors)} (\n job_id TEXT PRIMARY KEY,\n last_evaluated_at TEXT NOT NULL,\n last_triggered_at TEXT,\n next_run_at TEXT NOT NULL,\n version INTEGER NOT NULL\n )`);\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.executions)} (\n execution_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n triggered_at TEXT NOT NULL,\n status TEXT NOT NULL,\n queue_task_id TEXT,\n attempt_count INTEGER NOT NULL,\n last_error TEXT\n )`);\n });\n}\n\nfunction toJobRow<TConfig>(\n jobId: string,\n definition: import(\"../contracts/scheduler-types.js\").SchedulerJobDefinition<TConfig>,\n): JobRow {\n const now = new Date().toISOString();\n return {\n jobId,\n name: definition.name,\n handlerKey: definition.handlerKey,\n scheduleType: definition.schedule.scheduleType,\n expression: definition.schedule.expression,\n timezone: definition.schedule.timezone,\n overlapPolicy: definition.schedule.overlapPolicy ?? null,\n missedRunPolicy: definition.schedule.missedRunPolicy ?? null,\n configJson: JSON.stringify(definition.config),\n enabled: (definition.enabled ?? true) ? 1 : 0,\n createdAt: now,\n updatedAt: now,\n };\n}\n\nfunction rowToJobRecord<TConfig>(\n row: JobRow,\n): import(\"../contracts/scheduler-types.js\").SchedulerJobRecord<TConfig> {\n return {\n jobId: row.jobId,\n name: row.name,\n handlerKey: row.handlerKey,\n schedule: {\n scheduleType: row.scheduleType,\n expression: row.expression,\n timezone: row.timezone,\n overlapPolicy:\n row.overlapPolicy === null ? undefined : (row.overlapPolicy as any),\n missedRunPolicy:\n row.missedRunPolicy === null ? undefined : (row.missedRunPolicy as any),\n },\n config: JSON.parse(row.configJson) as TConfig,\n enabled: Boolean(row.enabled),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n\nasync function readJobRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n jobId: string,\n) {\n const rows = await client.query<JobRow>(\n `SELECT job_id AS jobId, name, handler_key AS handlerKey, schedule_type AS scheduleType, expression, timezone, overlap_policy AS overlapPolicy, missed_run_policy AS missedRunPolicy, config_json AS configJson, enabled, created_at AS createdAt, updated_at AS updatedAt\n FROM ${quoted(dialect, names.jobs)} WHERE job_id = ? LIMIT 1`,\n [jobId],\n );\n return rows[0] ? rowToJobRecord(rows[0]) : null;\n}\n\nasync function readCursorRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n jobId: string,\n): Promise<ScheduleCursorRecord | null> {\n const rows = await client.query<CursorRow>(\n `SELECT job_id AS jobId, last_evaluated_at AS lastEvaluatedAt, last_triggered_at AS lastTriggeredAt, next_run_at AS nextRunAt, version\n FROM ${quoted(dialect, names.cursors)} WHERE job_id = ? LIMIT 1`,\n [jobId],\n );\n const row = rows[0];\n return row\n ? {\n jobId: row.jobId,\n lastEvaluatedAt: row.lastEvaluatedAt,\n lastTriggeredAt: row.lastTriggeredAt ?? undefined,\n nextRunAt: row.nextRunAt,\n version: row.version,\n }\n : null;\n}\n\nasync function readExecutionRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n executionId: string,\n) {\n const rows = await client.query<ExecutionRow>(\n `SELECT execution_id AS executionId, job_id AS jobId, scheduled_for AS scheduledFor, triggered_at AS triggeredAt, status, queue_task_id AS queueTaskId, attempt_count AS attemptCount, last_error AS lastError\n FROM ${quoted(dialect, names.executions)} WHERE execution_id = ? LIMIT 1`,\n [executionId],\n );\n const row = rows[0];\n return row\n ? {\n executionId: row.executionId,\n jobId: row.jobId,\n scheduledFor: row.scheduledFor,\n triggeredAt: row.triggeredAt,\n status: row.status as any,\n queueTaskId: row.queueTaskId ?? undefined,\n attemptCount: row.attemptCount,\n lastError: row.lastError ?? undefined,\n }\n : null;\n}\n\nexport interface SchedulerPersistence {\n jobStore: SchedulerJobStore;\n cursorStore: ScheduleCursorStore;\n executionStore: JobExecutionStore;\n}\n\nexport function createSchedulerPersistence(\n config: SchedulerPersistenceConfig,\n): SchedulerPersistence {\n const namespace = namespaceFor(config);\n const names = tableNames(namespace);\n let bootstrapPromise: Promise<void> | null = null;\n\n async function ensureBootstrapped() {\n if (!bootstrapPromise) {\n bootstrapPromise = bootstrapSchedulerPersistence(\n config.client,\n config.dialect,\n names,\n );\n }\n await bootstrapPromise;\n }\n\n return {\n jobStore: {\n async create(jobId, definition) {\n await ensureBootstrapped();\n const row = toJobRow(jobId, definition);\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n row.jobId,\n row.name,\n row.handlerKey,\n row.scheduleType,\n row.expression,\n row.timezone,\n row.overlapPolicy,\n row.missedRunPolicy,\n row.configJson,\n row.enabled,\n row.createdAt,\n row.updatedAt,\n ],\n );\n });\n return rowToJobRecord(row);\n },\n async update(jobId, patch) {\n const current = await readJobRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next: import(\"../contracts/scheduler-types.js\").SchedulerJobRecord =\n {\n ...current,\n ...patch,\n schedule: {\n ...current.schedule,\n ...patch.schedule,\n },\n updatedAt: new Date().toISOString(),\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.name,\n next.handlerKey,\n next.schedule.scheduleType,\n next.schedule.expression,\n next.schedule.timezone,\n next.schedule.overlapPolicy ?? null,\n next.schedule.missedRunPolicy ?? null,\n JSON.stringify(next.config),\n next.enabled ? 1 : 0,\n next.createdAt,\n next.updatedAt,\n ],\n );\n });\n return next;\n },\n async setEnabled(jobId, enabled) {\n const current = await readJobRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next = {\n ...current,\n enabled,\n updatedAt: new Date().toISOString(),\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.name,\n next.handlerKey,\n next.schedule.scheduleType,\n next.schedule.expression,\n next.schedule.timezone,\n next.schedule.overlapPolicy ?? null,\n next.schedule.missedRunPolicy ?? null,\n JSON.stringify(next.config),\n next.enabled ? 1 : 0,\n next.createdAt,\n next.updatedAt,\n ],\n );\n });\n return next;\n },\n async get(jobId) {\n await ensureBootstrapped();\n return readJobRow(config.client, config.dialect, names, jobId);\n },\n async list() {\n await ensureBootstrapped();\n const rows = await config.client.query<JobRow>(\n `SELECT job_id AS jobId, name, handler_key AS handlerKey, schedule_type AS scheduleType, expression, timezone, overlap_policy AS overlapPolicy, missed_run_policy AS missedRunPolicy, config_json AS configJson, enabled, created_at AS createdAt, updated_at AS updatedAt\n FROM ${quoted(config.dialect, names.jobs)} ORDER BY created_at ASC`,\n [],\n );\n return rows.map(rowToJobRecord);\n },\n async remove(jobId) {\n await ensureBootstrapped();\n await config.client.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n return true;\n },\n },\n cursorStore: {\n async set(jobId, nextRunAt, now) {\n await ensureBootstrapped();\n const current = await readCursorRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n const next: CursorRow = {\n jobId,\n lastEvaluatedAt: now,\n lastTriggeredAt: current?.lastTriggeredAt ?? null,\n nextRunAt,\n version: (current?.version ?? 0) + 1,\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.cursors)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.cursors)} (job_id, last_evaluated_at, last_triggered_at, next_run_at, version) VALUES (?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.lastEvaluatedAt,\n next.lastTriggeredAt,\n next.nextRunAt,\n next.version,\n ],\n );\n });\n return {\n jobId: next.jobId,\n lastEvaluatedAt: next.lastEvaluatedAt,\n lastTriggeredAt: next.lastTriggeredAt ?? undefined,\n nextRunAt: next.nextRunAt,\n version: next.version,\n };\n },\n async markTriggered(jobId, triggeredAt) {\n await ensureBootstrapped();\n const current = await readCursorRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next: CursorRow = {\n ...current,\n lastTriggeredAt: triggeredAt,\n version: current.version + 1,\n };\n await config.client.execute(\n `UPDATE ${quoted(config.dialect, names.cursors)} SET last_triggered_at = ?, version = ? WHERE job_id = ?`,\n [next.lastTriggeredAt, next.version, jobId],\n );\n return {\n jobId: next.jobId,\n lastEvaluatedAt: next.lastEvaluatedAt,\n lastTriggeredAt: next.lastTriggeredAt ?? undefined,\n nextRunAt: next.nextRunAt,\n version: next.version,\n };\n },\n async get(jobId) {\n await ensureBootstrapped();\n return readCursorRow(config.client, config.dialect, names, jobId);\n },\n async remove(jobId) {\n await ensureBootstrapped();\n await config.client.execute(\n `DELETE FROM ${quoted(config.dialect, names.cursors)} WHERE job_id = ?`,\n [jobId],\n );\n return true;\n },\n },\n executionStore: {\n async create(record) {\n await ensureBootstrapped();\n await config.client.execute(\n `INSERT INTO ${quoted(config.dialect, names.executions)} (execution_id, job_id, scheduled_for, triggered_at, status, queue_task_id, attempt_count, last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n record.executionId,\n record.jobId,\n record.scheduledFor,\n record.triggeredAt,\n record.status,\n record.queueTaskId ?? null,\n record.attemptCount,\n record.lastError ?? null,\n ],\n );\n return record;\n },\n async update(executionId, patch) {\n const current = await readExecutionRow(\n config.client,\n config.dialect,\n names,\n executionId,\n );\n if (!current) {\n return null;\n }\n const next = {\n ...current,\n ...patch,\n };\n await config.client.execute(\n `UPDATE ${quoted(config.dialect, names.executions)} SET job_id = ?, scheduled_for = ?, triggered_at = ?, status = ?, queue_task_id = ?, attempt_count = ?, last_error = ? WHERE execution_id = ?`,\n [\n next.jobId,\n next.scheduledFor,\n next.triggeredAt,\n next.status,\n next.queueTaskId ?? null,\n next.attemptCount,\n next.lastError ?? null,\n executionId,\n ],\n );\n return next;\n },\n async listByJob(jobId) {\n await ensureBootstrapped();\n const rows = await config.client.query<ExecutionRow>(\n `SELECT execution_id AS executionId, job_id AS jobId, scheduled_for AS scheduledFor, triggered_at AS triggeredAt, status, queue_task_id AS queueTaskId, attempt_count AS attemptCount, last_error AS lastError\n FROM ${quoted(config.dialect, names.executions)} WHERE job_id = ? ORDER BY triggered_at ASC`,\n [jobId],\n );\n return rows.map((row) => ({\n executionId: row.executionId,\n jobId: row.jobId,\n scheduledFor: row.scheduledFor,\n triggeredAt: row.triggeredAt,\n status: row.status as any,\n queueTaskId: row.queueTaskId ?? undefined,\n attemptCount: row.attemptCount,\n lastError: row.lastError ?? undefined,\n }));\n },\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { QueueService } from \"@azlib/queue\";\n\nimport type {\n SchedulerExecutionQuery,\n SchedulerJobDefinition,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"../contracts/scheduler-types.js\";\nimport { createInMemoryJobExecutionStore } from \"./job-execution-store.js\";\nimport { createInMemoryScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport { createSchedulerCache } from \"./scheduler-cache.js\";\nimport { createSchedulerEngine } from \"./scheduler-engine.js\";\nimport { createInMemorySchedulerEventBus } from \"./scheduler-events.js\";\nimport { createSchedulerHandlerRegistry } from \"./scheduler-handler-registry.js\";\nimport { createInMemorySchedulerJobStore } from \"./scheduler-job-store.js\";\nimport { createSchedulerLogger } from \"./scheduler-logger.js\";\nimport { createSchedulerRuntime } from \"./scheduler-runtime.js\";\nimport { assertRuntimeConfig } from \"./scheduler-runtime-config.js\";\nimport { filterExecutions, toJobListItem } from \"./scheduler-service-query.js\";\nimport { retryFailedExecutionById } from \"./scheduler-service-retry.js\";\nimport { createSchedulerPersistence } from \"./persistence.js\";\n\nexport function createSchedulerService(options: SchedulerServiceOptions): {\n service: SchedulerService;\n handlers: ReturnType<typeof createSchedulerHandlerRegistry>;\n} {\n assertRuntimeConfig(options);\n\n const logger = options.logger ?? createSchedulerLogger();\n const cache = options.cache ?? createSchedulerCache();\n const persistence = options.persistence\n ? createSchedulerPersistence(options.persistence)\n : undefined;\n const jobStore = persistence?.jobStore ?? createInMemorySchedulerJobStore();\n const cursorStore =\n persistence?.cursorStore ?? createInMemoryScheduleCursorStore();\n const executionStore =\n persistence?.executionStore ?? createInMemoryJobExecutionStore();\n const events = createInMemorySchedulerEventBus();\n const handlers = createSchedulerHandlerRegistry();\n\n const queueService: QueueService | undefined = options.queueService;\n\n const engine = createSchedulerEngine({\n queueService,\n cache,\n logger,\n jobStore,\n cursorStore,\n executionStore,\n tickIntervalMs: options.tickIntervalMs ?? 1000,\n maxDueJobsPerTick: options.maxDueJobsPerTick ?? 200,\n });\n\n const runtime = createSchedulerRuntime(engine);\n\n const service: SchedulerService = {\n async registerJob<TConfig>(job: SchedulerJobDefinition<TConfig>) {\n if (!handlers.has(job.handlerKey)) {\n throw new Error(`Unknown handlerKey: ${job.handlerKey}`);\n }\n\n const jobId = `job_${randomUUID()}`;\n const created = await jobStore.create(jobId, job);\n const nextRunAt = await engine.computeNextRun(created);\n await cursorStore.set(jobId, nextRunAt, new Date().toISOString());\n events.emit({\n eventType: \"job-created\",\n jobId,\n metadata: { name: job.name },\n });\n return { jobId };\n },\n\n async updateJob<TConfig>(\n jobId: string,\n patch: Partial<SchedulerJobDefinition<TConfig>>,\n ) {\n const updated = await jobStore.update(\n jobId,\n patch as Partial<SchedulerJobDefinition>,\n );\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n\n const nextRunAt = await engine.computeNextRun(updated);\n await cursorStore.set(jobId, nextRunAt, new Date().toISOString());\n events.emit({ eventType: \"job-updated\", jobId });\n },\n\n async pauseJob(jobId: string) {\n const updated = await jobStore.setEnabled(jobId, false);\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-paused\", jobId });\n },\n\n async resumeJob(jobId: string) {\n const updated = await jobStore.setEnabled(jobId, true);\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-resumed\", jobId });\n },\n\n async deleteJob(jobId: string) {\n const removed = await jobStore.remove(jobId);\n await cursorStore.remove(jobId);\n if (!removed) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-deleted\", jobId });\n },\n\n async listJobs() {\n const jobs = await jobStore.list();\n return Promise.all(\n jobs.map(async (job) => {\n const cursor = await cursorStore.get(job.jobId);\n return toJobListItem({\n jobId: job.jobId,\n name: job.name,\n enabled: job.enabled,\n timezone: job.schedule.timezone,\n nextRunAt: cursor?.nextRunAt,\n });\n }),\n );\n },\n\n async listExecutions(query) {\n const jobs = await jobStore.list();\n const all = (\n await Promise.all(\n jobs.map((job) => executionStore.listByJob(job.jobId)),\n )\n ).flat();\n return filterExecutions(all, query);\n },\n\n async retryFailedExecution(executionId: string) {\n const jobs = await jobStore.list();\n const all = (\n await Promise.all(\n jobs.map((job) => executionStore.listByJob(job.jobId)),\n )\n ).flat();\n const retry = await retryFailedExecutionById(\n all,\n executionStore,\n executionId,\n );\n events.emit({\n eventType: \"retry\",\n jobId: retry.jobId,\n executionId: retry.executionId,\n metadata: { previousExecutionId: executionId },\n });\n },\n\n async start() {\n logger.info(\"scheduler.service.start\", { mode: options.mode });\n await runtime.start();\n },\n\n async stop() {\n logger.info(\"scheduler.service.stop\", { mode: options.mode });\n await runtime.stop();\n },\n };\n\n return {\n service,\n handlers,\n };\n}\n","import type { SchedulerService } from \"../contracts/scheduler-types.js\";\n\nexport interface SchedulerDashboardHealth {\n totalJobs: number;\n enabledJobs: number;\n pausedJobs: number;\n failedExecutions: number;\n}\n\nexport async function querySchedulerHealth(\n scheduler: SchedulerService,\n): Promise<SchedulerDashboardHealth> {\n const jobs = await scheduler.listJobs();\n const executions = await scheduler.listExecutions({ status: \"failed\" });\n\n return {\n totalJobs: jobs.length,\n enabledJobs: jobs.filter((job) => job.enabled).length,\n pausedJobs: jobs.filter((job) => !job.enabled).length,\n failedExecutions: executions.length,\n };\n}\n\nexport async function querySchedulerItems(scheduler: SchedulerService) {\n const jobs = await scheduler.listJobs();\n const executions = await scheduler.listExecutions({ limit: 100 });\n\n return jobs.map((job) => ({\n ...job,\n executions: executions.filter((execution) => execution.jobId === job.jobId),\n }));\n}\n","import type { SchedulerService } from \"../contracts/scheduler-types.js\";\nimport { querySchedulerHealth, querySchedulerItems } from \"./queue-queries.js\";\n\nexport interface SchedulerDashboardService {\n getHealth(): ReturnType<typeof querySchedulerHealth>;\n listItems(): ReturnType<typeof querySchedulerItems>;\n pauseJob(jobId: string): Promise<void>;\n resumeJob(jobId: string): Promise<void>;\n retryExecution(executionId: string): Promise<void>;\n}\n\nexport function createSchedulerDashboardService(\n scheduler: SchedulerService,\n): SchedulerDashboardService {\n return {\n getHealth: () => querySchedulerHealth(scheduler),\n listItems: () => querySchedulerItems(scheduler),\n pauseJob: (jobId) => scheduler.pauseJob(jobId),\n resumeJob: (jobId) => scheduler.resumeJob(jobId),\n retryExecution: (executionId) =>\n scheduler.retryFailedExecution(executionId),\n };\n}\n","import type {\n SchedulerHandlerRegistry,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"./src/contracts/scheduler-types.js\";\nimport { bindSchedulerToHost } from \"./src/core/scheduler-host-binding.js\";\nimport {\n CronWeekday,\n createCronExpression,\n} from \"./src/core/cron-expression-builder.js\";\nimport { createSchedulerService as createSchedulerServiceInternal } from \"./src/core/scheduler-service.js\";\n\nexport type {\n SchedulerHandlerRegistry,\n SchedulerJobDefinition,\n SchedulerJobRecord,\n SchedulerMissedRunPolicy,\n SchedulerMode,\n SchedulerOverlapPolicy,\n SchedulerPersistenceConfig,\n SchedulerScheduleConfig,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"./src/contracts/scheduler-types.js\";\nexport type { CronWeekdayValue } from \"./src/core/cron-expression-builder.js\";\nexport type { SchedulerHostAdapter } from \"./src/contracts/scheduler-host.js\";\nexport { bindSchedulerToHost };\nexport { CronWeekday, createCronExpression };\nexport { createSchedulerDashboardService } from \"./src/dashboard/queue-dashboard-service.js\";\nexport { createSchedulerPersistence } from \"./src/core/persistence.js\";\n\nexport function createSchedulerService(options: SchedulerServiceOptions): {\n service: SchedulerService;\n handlers: SchedulerHandlerRegistry;\n} {\n return createSchedulerServiceInternal(options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createSchedulerService","createSchedulerServiceInternal"],"sources":["../src/core/scheduler-host-binding.ts","../src/core/cron-expression-builder.ts","../src/core/job-execution-store.ts","../src/core/schedule-cursor-store.ts","../src/core/scheduler-cache.ts","../src/core/schedule-parser.ts","../src/core/scheduler-engine.ts","../src/core/scheduler-events.ts","../src/core/scheduler-handler-registry.ts","../src/core/scheduler-job-store.ts","../src/core/scheduler-logger.ts","../src/core/scheduler-runtime.ts","../src/core/scheduler-runtime-config.ts","../src/core/scheduler-service-query.ts","../src/core/scheduler-service-retry.ts","../src/core/persistence.ts","../src/core/scheduler-service.ts","../src/dashboard/queue-queries.ts","../src/dashboard/queue-dashboard-service.ts","../index.ts"],"sourcesContent":["import type { SchedulerHostAdapter } from \"../contracts/scheduler-host.js\";\nimport type { SchedulerService } from \"../contracts/scheduler-types.js\";\n\nexport function bindSchedulerToHost(\n scheduler: SchedulerService,\n host: SchedulerHostAdapter,\n): void {\n host.onStart(() => scheduler.start());\n host.onStop(() => scheduler.stop());\n}\n","import { unique } from \"@azlib/std\";\n\nexport const CronWeekday = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6,\n} as const;\n\nexport type CronWeekdayValue = (typeof CronWeekday)[keyof typeof CronWeekday];\n\nfunction assertIntegerInRange(\n label: string,\n value: number,\n min: number,\n max: number,\n): void {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer between ${min} and ${max}`);\n }\n}\n\nfunction assertPositiveInteger(label: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n}\n\nfunction assertStepInRange(label: string, value: number, max: number): void {\n assertPositiveInteger(label, value);\n if (value > max) {\n throw new Error(`${label} must be less than or equal to ${max}`);\n }\n}\n\nfunction toSortedCsv(values: number[]): string {\n return unique(values)\n .sort((left, right) => left - right)\n .join(\",\");\n}\n\nexport class CronExpressionBuilder {\n private minute = \"*\";\n private hour = \"*\";\n private dayOfMonth = \"*\";\n private month = \"*\";\n private dayOfWeek = \"*\";\n\n everyMinute(): this {\n this.minute = \"*\";\n return this;\n }\n\n everyNMinutes(interval: number): this {\n assertStepInRange(\"minute interval\", interval, 59);\n this.minute = `*/${interval}`;\n return this;\n }\n\n atMinute(minute: number): this {\n assertIntegerInRange(\"minute\", minute, 0, 59);\n this.minute = String(minute);\n return this;\n }\n\n atMinutes(minutes: number[]): this {\n if (minutes.length === 0) {\n throw new Error(\"minutes must contain at least one value\");\n }\n minutes.forEach((minute) => assertIntegerInRange(\"minute\", minute, 0, 59));\n this.minute = toSortedCsv(minutes);\n return this;\n }\n\n everyHour(): this {\n this.hour = \"*\";\n return this;\n }\n\n everyNHours(interval: number): this {\n assertStepInRange(\"hour interval\", interval, 23);\n this.hour = `*/${interval}`;\n return this;\n }\n\n atHour(hour: number): this {\n assertIntegerInRange(\"hour\", hour, 0, 23);\n this.hour = String(hour);\n return this;\n }\n\n atHours(hours: number[]): this {\n if (hours.length === 0) {\n throw new Error(\"hours must contain at least one value\");\n }\n hours.forEach((hour) => assertIntegerInRange(\"hour\", hour, 0, 23));\n this.hour = toSortedCsv(hours);\n return this;\n }\n\n onDayOfMonth(day: number): this {\n assertIntegerInRange(\"day of month\", day, 1, 31);\n this.dayOfMonth = String(day);\n return this;\n }\n\n onDaysOfMonth(days: number[]): this {\n if (days.length === 0) {\n throw new Error(\"days must contain at least one value\");\n }\n days.forEach((day) => assertIntegerInRange(\"day of month\", day, 1, 31));\n this.dayOfMonth = toSortedCsv(days);\n return this;\n }\n\n everyNDaysOfMonth(interval: number): this {\n assertStepInRange(\"day-of-month interval\", interval, 31);\n this.dayOfMonth = `*/${interval}`;\n return this;\n }\n\n everyMonth(): this {\n this.month = \"*\";\n return this;\n }\n\n onMonth(month: number): this {\n assertIntegerInRange(\"month\", month, 1, 12);\n this.month = String(month);\n return this;\n }\n\n onMonths(months: number[]): this {\n if (months.length === 0) {\n throw new Error(\"months must contain at least one value\");\n }\n months.forEach((month) => assertIntegerInRange(\"month\", month, 1, 12));\n this.month = toSortedCsv(months);\n return this;\n }\n\n everyNMonths(interval: number): this {\n assertStepInRange(\"month interval\", interval, 12);\n this.month = `*/${interval}`;\n return this;\n }\n\n onWeekday(weekday: CronWeekdayValue): this {\n assertIntegerInRange(\"weekday\", weekday, 0, 6);\n this.dayOfWeek = String(weekday);\n return this;\n }\n\n onWeekdays(weekdays: CronWeekdayValue[]): this {\n if (weekdays.length === 0) {\n throw new Error(\"weekdays must contain at least one value\");\n }\n weekdays.forEach((weekday) =>\n assertIntegerInRange(\"weekday\", weekday, 0, 6),\n );\n this.dayOfWeek = toSortedCsv(weekdays);\n return this;\n }\n\n everyNWeekdays(interval: number): this {\n assertStepInRange(\"weekday interval\", interval, 6);\n this.dayOfWeek = `*/${interval}`;\n return this;\n }\n\n weekdays(): this {\n this.dayOfWeek = \"1-5\";\n return this;\n }\n\n weekends(): this {\n this.dayOfWeek = \"0,6\";\n return this;\n }\n\n dailyAt(hour: number, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.dayOfMonth = \"*\";\n this.month = \"*\";\n this.dayOfWeek = \"*\";\n return this;\n }\n\n weeklyOn(weekday: CronWeekdayValue, hour = 0, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.dayOfWeek = String(weekday);\n this.dayOfMonth = \"*\";\n this.month = \"*\";\n return this;\n }\n\n monthlyOn(dayOfMonth: number, hour = 0, minute = 0): this {\n this.atHour(hour);\n this.atMinute(minute);\n this.onDayOfMonth(dayOfMonth);\n this.month = \"*\";\n this.dayOfWeek = \"*\";\n return this;\n }\n\n build(): string {\n return `${this.minute} ${this.hour} ${this.dayOfMonth} ${this.month} ${this.dayOfWeek}`;\n }\n\n toString(): string {\n return this.build();\n }\n}\n\nexport function createCronExpression(): CronExpressionBuilder {\n return new CronExpressionBuilder();\n}\n","import type { SchedulerExecutionRecord } from \"../contracts/scheduler-types.js\";\n\nexport interface JobExecutionStore {\n create(record: SchedulerExecutionRecord): Promise<SchedulerExecutionRecord>;\n update(\n executionId: string,\n patch: Partial<Omit<SchedulerExecutionRecord, \"executionId\">>,\n ): Promise<SchedulerExecutionRecord | null>;\n listByJob(jobId: string): Promise<SchedulerExecutionRecord[]>;\n}\n\nexport function createInMemoryJobExecutionStore(): JobExecutionStore {\n const byExecution = new Map<string, SchedulerExecutionRecord>();\n\n return {\n async create(record) {\n byExecution.set(record.executionId, record);\n return record;\n },\n async update(executionId, patch) {\n const current = byExecution.get(executionId);\n if (!current) {\n return null;\n }\n const next: SchedulerExecutionRecord = {\n ...current,\n ...patch,\n };\n byExecution.set(executionId, next);\n return next;\n },\n async listByJob(jobId) {\n return Array.from(byExecution.values()).filter(\n (item) => item.jobId === jobId,\n );\n },\n };\n}\n","export interface ScheduleCursorRecord {\n jobId: string;\n lastEvaluatedAt: string;\n lastTriggeredAt?: string;\n nextRunAt: string;\n version: number;\n}\n\nexport interface ScheduleCursorStore {\n set(\n jobId: string,\n nextRunAt: string,\n now: string,\n ): Promise<ScheduleCursorRecord>;\n markTriggered(\n jobId: string,\n triggeredAt: string,\n ): Promise<ScheduleCursorRecord | null>;\n get(jobId: string): Promise<ScheduleCursorRecord | null>;\n remove(jobId: string): Promise<boolean>;\n}\n\nexport function createInMemoryScheduleCursorStore(): ScheduleCursorStore {\n const cursors = new Map<string, ScheduleCursorRecord>();\n\n return {\n async set(jobId, nextRunAt, now) {\n const previous = cursors.get(jobId);\n const next: ScheduleCursorRecord = {\n jobId,\n lastEvaluatedAt: now,\n lastTriggeredAt: previous?.lastTriggeredAt,\n nextRunAt,\n version: (previous?.version ?? 0) + 1,\n };\n cursors.set(jobId, next);\n return next;\n },\n async markTriggered(jobId, triggeredAt) {\n const current = cursors.get(jobId);\n if (!current) {\n return null;\n }\n const next: ScheduleCursorRecord = {\n ...current,\n lastTriggeredAt: triggeredAt,\n version: current.version + 1,\n };\n cursors.set(jobId, next);\n return next;\n },\n async get(jobId) {\n return cursors.get(jobId) ?? null;\n },\n async remove(jobId) {\n return cursors.delete(jobId);\n },\n };\n}\n","import { createCache, type Cache } from \"@azlib/cache\";\n\nexport function createSchedulerCache(\n namespace = \"scheduler-core\",\n): Cache<string> {\n return createCache<string>({\n mode: \"memory\",\n namespace,\n });\n}\n","import type { ScheduleType } from \"../contracts/scheduler-types.js\";\n\nexport interface ParsedSchedule {\n scheduleType: ScheduleType;\n expression: string;\n timezone: string;\n}\n\nconst CRON_FIELD_PATTERN = /^\\*|\\*\\/\\d+|\\d+|\\d+-\\d+|\\d+(?:,\\d+)*$/;\n\nexport function assertValidTimezone(timezone: string): void {\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone }).format(new Date());\n } catch {\n throw new Error(`Invalid timezone: ${timezone}`);\n }\n}\n\nfunction assertValidCronExpression(expression: string): void {\n const fields = expression.trim().split(/\\s+/);\n if (fields.length !== 5) {\n throw new Error(\"Cron expression must contain 5 fields\");\n }\n\n for (const field of fields) {\n if (!CRON_FIELD_PATTERN.test(field)) {\n throw new Error(`Invalid cron field: ${field}`);\n }\n }\n}\n\nfunction assertValidOnceExpression(expression: string): void {\n const date = new Date(expression);\n if (Number.isNaN(date.getTime())) {\n throw new Error(\"Once schedule expression must be a valid ISO datetime\");\n }\n}\n\nexport function parseSchedule(\n scheduleType: ScheduleType,\n expression: string,\n timezone: string,\n): ParsedSchedule {\n assertValidTimezone(timezone);\n\n if (scheduleType === \"cron\") {\n assertValidCronExpression(expression);\n } else {\n assertValidOnceExpression(expression);\n }\n\n return {\n scheduleType,\n expression: expression.trim(),\n timezone,\n };\n}\n\nexport function computeNextRunAt(\n parsed: ParsedSchedule,\n now = new Date(),\n): string {\n if (parsed.scheduleType === \"once\") {\n return new Date(parsed.expression).toISOString();\n }\n\n const next = new Date(now);\n next.setUTCSeconds(0, 0);\n next.setUTCMinutes(next.getUTCMinutes() + 1);\n return next.toISOString();\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { Cache } from \"@azlib/cache\";\nimport type { QueueService } from \"@azlib/queue\";\n\nimport type { SchedulerJobRecord } from \"../contracts/scheduler-types.js\";\nimport { computeNextRunAt, parseSchedule } from \"./schedule-parser.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\nimport type { ScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport type { SchedulerJobStore } from \"./scheduler-job-store.js\";\n\ninterface LoggerLike {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport interface SchedulerEngineDependencies {\n queueService?: QueueService;\n cache?: Cache<string>;\n logger: LoggerLike;\n jobStore: SchedulerJobStore;\n cursorStore: ScheduleCursorStore;\n executionStore: JobExecutionStore;\n tickIntervalMs: number;\n maxDueJobsPerTick: number;\n}\n\nexport interface SchedulerEngine {\n start(): Promise<void>;\n stop(): Promise<void>;\n computeNextRun(job: SchedulerJobRecord, now?: Date): Promise<string>;\n}\n\nexport function createSchedulerEngine(\n dependencies: SchedulerEngineDependencies,\n): SchedulerEngine {\n let timer: NodeJS.Timeout | undefined;\n\n async function computeNextRun(\n job: SchedulerJobRecord,\n now = new Date(),\n ): Promise<string> {\n const cacheKey = `scheduler.nextRun.${job.jobId}.${job.schedule.expression}.${job.schedule.timezone}`;\n const cached = await dependencies.cache?.get(cacheKey);\n if (cached?.status === \"hit\" && cached.value) {\n return cached.value;\n }\n\n const parsed = parseSchedule(\n job.schedule.scheduleType,\n job.schedule.expression,\n job.schedule.timezone,\n );\n const nextRunAt = computeNextRunAt(parsed, now);\n\n await dependencies.cache?.set(cacheKey, nextRunAt);\n await dependencies.cursorStore.set(job.jobId, nextRunAt, now.toISOString());\n\n return nextRunAt;\n }\n\n async function evaluateTick(): Promise<void> {\n const now = new Date();\n const candidates = (await dependencies.jobStore.list())\n .filter((job) => job.enabled)\n .slice(0, dependencies.maxDueJobsPerTick);\n\n for (const job of candidates) {\n const nextRunAt = await computeNextRun(job, now);\n if (new Date(nextRunAt).getTime() > now.getTime()) {\n continue;\n }\n\n const executionId = `exec_${randomUUID()}`;\n await dependencies.executionStore.create({\n executionId,\n jobId: job.jobId,\n scheduledFor: nextRunAt,\n triggeredAt: now.toISOString(),\n status: \"queued\",\n attemptCount: 0,\n });\n await dependencies.cursorStore.markTriggered(\n job.jobId,\n now.toISOString(),\n );\n\n if (dependencies.queueService) {\n await dependencies.queueService.enqueue({\n idempotencyKey: `scheduler:${job.jobId}:${nextRunAt}`,\n payloadRef: {\n executionId,\n handlerKey: job.handlerKey,\n config: job.config,\n },\n });\n }\n\n dependencies.logger.info(\"scheduler.job.triggered\", {\n executionId,\n jobId: job.jobId,\n scheduledFor: nextRunAt,\n });\n }\n }\n\n return {\n async start() {\n if (timer) {\n return;\n }\n\n dependencies.logger.info(\"scheduler.runtime.started\", {\n tickIntervalMs: dependencies.tickIntervalMs,\n });\n timer = setInterval(() => {\n void evaluateTick().catch((error: unknown) => {\n dependencies.logger.error(\"scheduler.tick.failed\", {\n error:\n error instanceof Error\n ? error.message\n : \"Unknown scheduler error\",\n });\n });\n }, dependencies.tickIntervalMs);\n },\n async stop() {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n dependencies.logger.info(\"scheduler.runtime.stopped\");\n },\n computeNextRun,\n };\n}\n","export type SchedulerEventType =\n | \"job-created\"\n | \"job-updated\"\n | \"job-paused\"\n | \"job-resumed\"\n | \"job-deleted\"\n | \"triggered\"\n | \"skipped\"\n | \"retry\"\n | \"failed\";\n\nexport interface SchedulerEventRecord {\n eventId: string;\n eventType: SchedulerEventType;\n timestamp: string;\n jobId?: string;\n executionId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SchedulerEventBus {\n emit(\n event: Omit<SchedulerEventRecord, \"eventId\" | \"timestamp\">,\n ): SchedulerEventRecord;\n list(): SchedulerEventRecord[];\n}\n\nexport function createInMemorySchedulerEventBus(): SchedulerEventBus {\n const events: SchedulerEventRecord[] = [];\n\n return {\n emit(event) {\n const record: SchedulerEventRecord = {\n eventId: `evt_${Math.random().toString(36).slice(2, 12)}`,\n timestamp: new Date().toISOString(),\n ...event,\n };\n events.push(record);\n return record;\n },\n list() {\n return [...events];\n },\n };\n}\n","export type SchedulerHandler<TConfig = unknown> = (\n input: TConfig,\n) => Promise<void>;\n\nexport interface SchedulerHandlerRegistry {\n register<TConfig>(\n handlerKey: string,\n handler: SchedulerHandler<TConfig>,\n ): void;\n resolve(handlerKey: string): SchedulerHandler | null;\n has(handlerKey: string): boolean;\n}\n\nexport function createSchedulerHandlerRegistry(): SchedulerHandlerRegistry {\n const handlers = new Map<string, SchedulerHandler>();\n\n return {\n register(handlerKey, handler) {\n handlers.set(handlerKey, handler as SchedulerHandler);\n },\n resolve(handlerKey) {\n return handlers.get(handlerKey) ?? null;\n },\n has(handlerKey) {\n return handlers.has(handlerKey);\n },\n };\n}\n","import type {\n SchedulerJobDefinition,\n SchedulerJobRecord,\n} from \"../contracts/scheduler-types.js\";\n\nexport interface SchedulerJobStore {\n create(\n jobId: string,\n definition: SchedulerJobDefinition,\n ): Promise<SchedulerJobRecord>;\n update(\n jobId: string,\n patch: Partial<SchedulerJobDefinition>,\n ): Promise<SchedulerJobRecord | null>;\n setEnabled(\n jobId: string,\n enabled: boolean,\n ): Promise<SchedulerJobRecord | null>;\n get(jobId: string): Promise<SchedulerJobRecord | null>;\n list(): Promise<SchedulerJobRecord[]>;\n remove(jobId: string): Promise<boolean>;\n}\n\nexport function createInMemorySchedulerJobStore(): SchedulerJobStore {\n const jobs = new Map<string, SchedulerJobRecord>();\n\n return {\n async create(jobId, definition) {\n const now = new Date().toISOString();\n const created: SchedulerJobRecord = {\n ...definition,\n jobId,\n enabled: definition.enabled ?? true,\n createdAt: now,\n updatedAt: now,\n };\n jobs.set(jobId, created);\n return created;\n },\n async update(jobId, patch) {\n const current = jobs.get(jobId);\n if (!current) {\n return null;\n }\n const updated: SchedulerJobRecord = {\n ...current,\n ...patch,\n updatedAt: new Date().toISOString(),\n };\n jobs.set(jobId, updated);\n return updated;\n },\n async setEnabled(jobId, enabled) {\n const current = jobs.get(jobId);\n if (!current) {\n return null;\n }\n const updated: SchedulerJobRecord = {\n ...current,\n enabled,\n updatedAt: new Date().toISOString(),\n };\n jobs.set(jobId, updated);\n return updated;\n },\n async get(jobId) {\n return jobs.get(jobId) ?? null;\n },\n async list() {\n return Array.from(jobs.values());\n },\n async remove(jobId) {\n return jobs.delete(jobId);\n },\n };\n}\n","import { createConsoleTransport, createLogger } from \"@azlib/logger\";\n\nexport interface SchedulerLogger {\n debug(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport function createSchedulerLogger(): SchedulerLogger {\n return createLogger({\n level: \"info\",\n transports: [createConsoleTransport()],\n });\n}\n","import type { SchedulerEngine } from \"./scheduler-engine.js\";\n\nexport interface SchedulerRuntime {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport function createSchedulerRuntime(\n engine: SchedulerEngine,\n): SchedulerRuntime {\n let started = false;\n\n return {\n async start() {\n if (started) {\n return;\n }\n started = true;\n await engine.start();\n },\n async stop() {\n if (!started) {\n return;\n }\n started = false;\n await engine.stop();\n },\n };\n}\n","import type { SchedulerServiceOptions } from \"../contracts/scheduler-types.js\";\n\nexport function assertRuntimeConfig(options: SchedulerServiceOptions): void {\n if (options.tickIntervalMs !== undefined && options.tickIntervalMs <= 0) {\n throw new Error(\"tickIntervalMs must be greater than 0\");\n }\n if (\n options.maxDueJobsPerTick !== undefined &&\n options.maxDueJobsPerTick < 1\n ) {\n throw new Error(\"maxDueJobsPerTick must be at least 1\");\n }\n}\n","import type {\n SchedulerExecutionQuery,\n SchedulerExecutionRecord,\n SchedulerJobListItem,\n} from \"../contracts/scheduler-types.js\";\n\nexport function toJobListItem(input: {\n jobId: string;\n name: string;\n enabled: boolean;\n timezone: string;\n nextRunAt?: string;\n}): SchedulerJobListItem {\n return {\n jobId: input.jobId,\n name: input.name,\n enabled: input.enabled,\n timezone: input.timezone,\n nextRunAt: input.nextRunAt,\n };\n}\n\nexport function filterExecutions(\n items: SchedulerExecutionRecord[],\n query?: SchedulerExecutionQuery,\n): SchedulerExecutionRecord[] {\n if (!query) {\n return items;\n }\n\n const fromTime = query.from ? new Date(query.from).getTime() : undefined;\n const toTime = query.to ? new Date(query.to).getTime() : undefined;\n\n return items\n .filter((item) => (query.jobId ? item.jobId === query.jobId : true))\n .filter((item) => (query.status ? item.status === query.status : true))\n .filter((item) => {\n if (fromTime === undefined) {\n return true;\n }\n return new Date(item.triggeredAt).getTime() >= fromTime;\n })\n .filter((item) => {\n if (toTime === undefined) {\n return true;\n }\n return new Date(item.triggeredAt).getTime() <= toTime;\n })\n .slice(0, query.limit ?? items.length);\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { SchedulerExecutionRecord } from \"../contracts/scheduler-types.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\n\nexport async function retryFailedExecutionById(\n allExecutions: SchedulerExecutionRecord[],\n executionStore: JobExecutionStore,\n executionId: string,\n): Promise<SchedulerExecutionRecord> {\n const target = allExecutions.find((item) => item.executionId === executionId);\n if (!target) {\n throw new Error(`Execution not found: ${executionId}`);\n }\n if (target.status !== \"failed\" && target.status !== \"dead-letter\") {\n throw new Error(\"Only failed or dead-letter executions can be retried\");\n }\n\n const retryExecutionId = `exec_${randomUUID()}`;\n const retry: SchedulerExecutionRecord = {\n ...target,\n executionId: retryExecutionId,\n status: \"queued\",\n attemptCount: target.attemptCount + 1,\n triggeredAt: new Date().toISOString(),\n };\n await executionStore.create(retry);\n return retry;\n}\n","import type { SqlClientAdapter, SqlDialectAdapter } from \"@azlib/persistence\";\n\nimport type { SchedulerPersistenceConfig } from \"../contracts/scheduler-types.js\";\nimport type { ScheduleCursorRecord } from \"./schedule-cursor-store.js\";\nimport type { JobExecutionStore } from \"./job-execution-store.js\";\nimport type { ScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport type { SchedulerJobStore } from \"./scheduler-job-store.js\";\n\ninterface JobRow {\n jobId: string;\n name: string;\n handlerKey: string;\n scheduleType: \"once\" | \"cron\";\n expression: string;\n timezone: string;\n overlapPolicy: string | null;\n missedRunPolicy: string | null;\n configJson: string;\n enabled: number;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface CursorRow {\n jobId: string;\n lastEvaluatedAt: string;\n lastTriggeredAt: string | null;\n nextRunAt: string;\n version: number;\n}\n\ninterface ExecutionRow {\n executionId: string;\n jobId: string;\n scheduledFor: string;\n triggeredAt: string;\n status: string;\n queueTaskId: string | null;\n attemptCount: number;\n lastError: string | null;\n}\n\nfunction namespaceFor(config: SchedulerPersistenceConfig): string {\n return config.namespace?.trim() || \"azlib\";\n}\n\nfunction tableNames(namespace: string) {\n return {\n jobs: `${namespace}__scheduler_jobs`,\n cursors: `${namespace}__scheduler_cursors`,\n executions: `${namespace}__scheduler_executions`,\n };\n}\n\nfunction quoted(dialect: SqlDialectAdapter, tableName: string): string {\n return dialect.quoteIdentifier(tableName);\n}\n\nasync function bootstrapSchedulerPersistence(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n): Promise<void> {\n await client.transaction(async (tx) => {\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.jobs)} (\n job_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n handler_key TEXT NOT NULL,\n schedule_type TEXT NOT NULL,\n expression TEXT NOT NULL,\n timezone TEXT NOT NULL,\n overlap_policy TEXT,\n missed_run_policy TEXT,\n config_json TEXT NOT NULL,\n enabled INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`);\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.cursors)} (\n job_id TEXT PRIMARY KEY,\n last_evaluated_at TEXT NOT NULL,\n last_triggered_at TEXT,\n next_run_at TEXT NOT NULL,\n version INTEGER NOT NULL\n )`);\n await tx.execute(`CREATE TABLE IF NOT EXISTS ${quoted(dialect, names.executions)} (\n execution_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL,\n scheduled_for TEXT NOT NULL,\n triggered_at TEXT NOT NULL,\n status TEXT NOT NULL,\n queue_task_id TEXT,\n attempt_count INTEGER NOT NULL,\n last_error TEXT\n )`);\n });\n}\n\nfunction toJobRow<TConfig>(\n jobId: string,\n definition: import(\"../contracts/scheduler-types.js\").SchedulerJobDefinition<TConfig>,\n): JobRow {\n const now = new Date().toISOString();\n return {\n jobId,\n name: definition.name,\n handlerKey: definition.handlerKey,\n scheduleType: definition.schedule.scheduleType,\n expression: definition.schedule.expression,\n timezone: definition.schedule.timezone,\n overlapPolicy: definition.schedule.overlapPolicy ?? null,\n missedRunPolicy: definition.schedule.missedRunPolicy ?? null,\n configJson: JSON.stringify(definition.config),\n enabled: (definition.enabled ?? true) ? 1 : 0,\n createdAt: now,\n updatedAt: now,\n };\n}\n\nfunction rowToJobRecord<TConfig>(\n row: JobRow,\n): import(\"../contracts/scheduler-types.js\").SchedulerJobRecord<TConfig> {\n return {\n jobId: row.jobId,\n name: row.name,\n handlerKey: row.handlerKey,\n schedule: {\n scheduleType: row.scheduleType,\n expression: row.expression,\n timezone: row.timezone,\n overlapPolicy:\n row.overlapPolicy === null ? undefined : (row.overlapPolicy as any),\n missedRunPolicy:\n row.missedRunPolicy === null ? undefined : (row.missedRunPolicy as any),\n },\n config: JSON.parse(row.configJson) as TConfig,\n enabled: Boolean(row.enabled),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n\nasync function readJobRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n jobId: string,\n) {\n const rows = await client.query<JobRow>(\n `SELECT job_id AS jobId, name, handler_key AS handlerKey, schedule_type AS scheduleType, expression, timezone, overlap_policy AS overlapPolicy, missed_run_policy AS missedRunPolicy, config_json AS configJson, enabled, created_at AS createdAt, updated_at AS updatedAt\n FROM ${quoted(dialect, names.jobs)} WHERE job_id = ? LIMIT 1`,\n [jobId],\n );\n return rows[0] ? rowToJobRecord(rows[0]) : null;\n}\n\nasync function readCursorRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n jobId: string,\n): Promise<ScheduleCursorRecord | null> {\n const rows = await client.query<CursorRow>(\n `SELECT job_id AS jobId, last_evaluated_at AS lastEvaluatedAt, last_triggered_at AS lastTriggeredAt, next_run_at AS nextRunAt, version\n FROM ${quoted(dialect, names.cursors)} WHERE job_id = ? LIMIT 1`,\n [jobId],\n );\n const row = rows[0];\n return row\n ? {\n jobId: row.jobId,\n lastEvaluatedAt: row.lastEvaluatedAt,\n lastTriggeredAt: row.lastTriggeredAt ?? undefined,\n nextRunAt: row.nextRunAt,\n version: row.version,\n }\n : null;\n}\n\nasync function readExecutionRow(\n client: SqlClientAdapter,\n dialect: SqlDialectAdapter,\n names: ReturnType<typeof tableNames>,\n executionId: string,\n) {\n const rows = await client.query<ExecutionRow>(\n `SELECT execution_id AS executionId, job_id AS jobId, scheduled_for AS scheduledFor, triggered_at AS triggeredAt, status, queue_task_id AS queueTaskId, attempt_count AS attemptCount, last_error AS lastError\n FROM ${quoted(dialect, names.executions)} WHERE execution_id = ? LIMIT 1`,\n [executionId],\n );\n const row = rows[0];\n return row\n ? {\n executionId: row.executionId,\n jobId: row.jobId,\n scheduledFor: row.scheduledFor,\n triggeredAt: row.triggeredAt,\n status: row.status as any,\n queueTaskId: row.queueTaskId ?? undefined,\n attemptCount: row.attemptCount,\n lastError: row.lastError ?? undefined,\n }\n : null;\n}\n\nexport interface SchedulerPersistence {\n jobStore: SchedulerJobStore;\n cursorStore: ScheduleCursorStore;\n executionStore: JobExecutionStore;\n}\n\nexport function createSchedulerPersistence(\n config: SchedulerPersistenceConfig,\n): SchedulerPersistence {\n const namespace = namespaceFor(config);\n const names = tableNames(namespace);\n let bootstrapPromise: Promise<void> | null = null;\n\n async function ensureBootstrapped() {\n if (!bootstrapPromise) {\n bootstrapPromise = bootstrapSchedulerPersistence(\n config.client,\n config.dialect,\n names,\n );\n }\n await bootstrapPromise;\n }\n\n return {\n jobStore: {\n async create(jobId, definition) {\n await ensureBootstrapped();\n const row = toJobRow(jobId, definition);\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n row.jobId,\n row.name,\n row.handlerKey,\n row.scheduleType,\n row.expression,\n row.timezone,\n row.overlapPolicy,\n row.missedRunPolicy,\n row.configJson,\n row.enabled,\n row.createdAt,\n row.updatedAt,\n ],\n );\n });\n return rowToJobRecord(row);\n },\n async update(jobId, patch) {\n const current = await readJobRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next: import(\"../contracts/scheduler-types.js\").SchedulerJobRecord =\n {\n ...current,\n ...patch,\n schedule: {\n ...current.schedule,\n ...patch.schedule,\n },\n updatedAt: new Date().toISOString(),\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.name,\n next.handlerKey,\n next.schedule.scheduleType,\n next.schedule.expression,\n next.schedule.timezone,\n next.schedule.overlapPolicy ?? null,\n next.schedule.missedRunPolicy ?? null,\n JSON.stringify(next.config),\n next.enabled ? 1 : 0,\n next.createdAt,\n next.updatedAt,\n ],\n );\n });\n return next;\n },\n async setEnabled(jobId, enabled) {\n const current = await readJobRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next = {\n ...current,\n enabled,\n updatedAt: new Date().toISOString(),\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.jobs)} (job_id, name, handler_key, schedule_type, expression, timezone, overlap_policy, missed_run_policy, config_json, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.name,\n next.handlerKey,\n next.schedule.scheduleType,\n next.schedule.expression,\n next.schedule.timezone,\n next.schedule.overlapPolicy ?? null,\n next.schedule.missedRunPolicy ?? null,\n JSON.stringify(next.config),\n next.enabled ? 1 : 0,\n next.createdAt,\n next.updatedAt,\n ],\n );\n });\n return next;\n },\n async get(jobId) {\n await ensureBootstrapped();\n return readJobRow(config.client, config.dialect, names, jobId);\n },\n async list() {\n await ensureBootstrapped();\n const rows = await config.client.query<JobRow>(\n `SELECT job_id AS jobId, name, handler_key AS handlerKey, schedule_type AS scheduleType, expression, timezone, overlap_policy AS overlapPolicy, missed_run_policy AS missedRunPolicy, config_json AS configJson, enabled, created_at AS createdAt, updated_at AS updatedAt\n FROM ${quoted(config.dialect, names.jobs)} ORDER BY created_at ASC`,\n [],\n );\n return rows.map(rowToJobRecord);\n },\n async remove(jobId) {\n await ensureBootstrapped();\n await config.client.execute(\n `DELETE FROM ${quoted(config.dialect, names.jobs)} WHERE job_id = ?`,\n [jobId],\n );\n return true;\n },\n },\n cursorStore: {\n async set(jobId, nextRunAt, now) {\n await ensureBootstrapped();\n const current = await readCursorRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n const next: CursorRow = {\n jobId,\n lastEvaluatedAt: now,\n lastTriggeredAt: current?.lastTriggeredAt ?? null,\n nextRunAt,\n version: (current?.version ?? 0) + 1,\n };\n await config.client.transaction(async (tx) => {\n await tx.execute(\n `DELETE FROM ${quoted(config.dialect, names.cursors)} WHERE job_id = ?`,\n [jobId],\n );\n await tx.execute(\n `INSERT INTO ${quoted(config.dialect, names.cursors)} (job_id, last_evaluated_at, last_triggered_at, next_run_at, version) VALUES (?, ?, ?, ?, ?)`,\n [\n next.jobId,\n next.lastEvaluatedAt,\n next.lastTriggeredAt,\n next.nextRunAt,\n next.version,\n ],\n );\n });\n return {\n jobId: next.jobId,\n lastEvaluatedAt: next.lastEvaluatedAt,\n lastTriggeredAt: next.lastTriggeredAt ?? undefined,\n nextRunAt: next.nextRunAt,\n version: next.version,\n };\n },\n async markTriggered(jobId, triggeredAt) {\n await ensureBootstrapped();\n const current = await readCursorRow(\n config.client,\n config.dialect,\n names,\n jobId,\n );\n if (!current) {\n return null;\n }\n const next: CursorRow = {\n ...current,\n lastTriggeredAt: triggeredAt,\n version: current.version + 1,\n };\n await config.client.execute(\n `UPDATE ${quoted(config.dialect, names.cursors)} SET last_triggered_at = ?, version = ? WHERE job_id = ?`,\n [next.lastTriggeredAt, next.version, jobId],\n );\n return {\n jobId: next.jobId,\n lastEvaluatedAt: next.lastEvaluatedAt,\n lastTriggeredAt: next.lastTriggeredAt ?? undefined,\n nextRunAt: next.nextRunAt,\n version: next.version,\n };\n },\n async get(jobId) {\n await ensureBootstrapped();\n return readCursorRow(config.client, config.dialect, names, jobId);\n },\n async remove(jobId) {\n await ensureBootstrapped();\n await config.client.execute(\n `DELETE FROM ${quoted(config.dialect, names.cursors)} WHERE job_id = ?`,\n [jobId],\n );\n return true;\n },\n },\n executionStore: {\n async create(record) {\n await ensureBootstrapped();\n await config.client.execute(\n `INSERT INTO ${quoted(config.dialect, names.executions)} (execution_id, job_id, scheduled_for, triggered_at, status, queue_task_id, attempt_count, last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n record.executionId,\n record.jobId,\n record.scheduledFor,\n record.triggeredAt,\n record.status,\n record.queueTaskId ?? null,\n record.attemptCount,\n record.lastError ?? null,\n ],\n );\n return record;\n },\n async update(executionId, patch) {\n const current = await readExecutionRow(\n config.client,\n config.dialect,\n names,\n executionId,\n );\n if (!current) {\n return null;\n }\n const next = {\n ...current,\n ...patch,\n };\n await config.client.execute(\n `UPDATE ${quoted(config.dialect, names.executions)} SET job_id = ?, scheduled_for = ?, triggered_at = ?, status = ?, queue_task_id = ?, attempt_count = ?, last_error = ? WHERE execution_id = ?`,\n [\n next.jobId,\n next.scheduledFor,\n next.triggeredAt,\n next.status,\n next.queueTaskId ?? null,\n next.attemptCount,\n next.lastError ?? null,\n executionId,\n ],\n );\n return next;\n },\n async listByJob(jobId) {\n await ensureBootstrapped();\n const rows = await config.client.query<ExecutionRow>(\n `SELECT execution_id AS executionId, job_id AS jobId, scheduled_for AS scheduledFor, triggered_at AS triggeredAt, status, queue_task_id AS queueTaskId, attempt_count AS attemptCount, last_error AS lastError\n FROM ${quoted(config.dialect, names.executions)} WHERE job_id = ? ORDER BY triggered_at ASC`,\n [jobId],\n );\n return rows.map((row) => ({\n executionId: row.executionId,\n jobId: row.jobId,\n scheduledFor: row.scheduledFor,\n triggeredAt: row.triggeredAt,\n status: row.status as any,\n queueTaskId: row.queueTaskId ?? undefined,\n attemptCount: row.attemptCount,\n lastError: row.lastError ?? undefined,\n }));\n },\n },\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { QueueService } from \"@azlib/queue\";\n\nimport type {\n SchedulerExecutionQuery,\n SchedulerJobDefinition,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"../contracts/scheduler-types.js\";\nimport { createInMemoryJobExecutionStore } from \"./job-execution-store.js\";\nimport { createInMemoryScheduleCursorStore } from \"./schedule-cursor-store.js\";\nimport { createSchedulerCache } from \"./scheduler-cache.js\";\nimport { createSchedulerEngine } from \"./scheduler-engine.js\";\nimport { createInMemorySchedulerEventBus } from \"./scheduler-events.js\";\nimport { createSchedulerHandlerRegistry } from \"./scheduler-handler-registry.js\";\nimport { createInMemorySchedulerJobStore } from \"./scheduler-job-store.js\";\nimport { createSchedulerLogger } from \"./scheduler-logger.js\";\nimport { createSchedulerRuntime } from \"./scheduler-runtime.js\";\nimport { assertRuntimeConfig } from \"./scheduler-runtime-config.js\";\nimport { filterExecutions, toJobListItem } from \"./scheduler-service-query.js\";\nimport { retryFailedExecutionById } from \"./scheduler-service-retry.js\";\nimport { createSchedulerPersistence } from \"./persistence.js\";\n\nexport function createSchedulerService(options: SchedulerServiceOptions): {\n service: SchedulerService;\n handlers: ReturnType<typeof createSchedulerHandlerRegistry>;\n} {\n assertRuntimeConfig(options);\n\n const logger = options.logger ?? createSchedulerLogger();\n const cache = options.cache ?? createSchedulerCache();\n const persistence = options.persistence\n ? createSchedulerPersistence(options.persistence)\n : undefined;\n const jobStore = persistence?.jobStore ?? createInMemorySchedulerJobStore();\n const cursorStore =\n persistence?.cursorStore ?? createInMemoryScheduleCursorStore();\n const executionStore =\n persistence?.executionStore ?? createInMemoryJobExecutionStore();\n const events = createInMemorySchedulerEventBus();\n const handlers = createSchedulerHandlerRegistry();\n\n const queueService: QueueService | undefined = options.queueService;\n\n const engine = createSchedulerEngine({\n queueService,\n cache,\n logger,\n jobStore,\n cursorStore,\n executionStore,\n tickIntervalMs: options.tickIntervalMs ?? 1000,\n maxDueJobsPerTick: options.maxDueJobsPerTick ?? 200,\n });\n\n const runtime = createSchedulerRuntime(engine);\n\n const service: SchedulerService = {\n async registerJob<TConfig>(job: SchedulerJobDefinition<TConfig>) {\n if (!handlers.has(job.handlerKey)) {\n throw new Error(`Unknown handlerKey: ${job.handlerKey}`);\n }\n\n const jobId = `job_${randomUUID()}`;\n const created = await jobStore.create(jobId, job);\n const nextRunAt = await engine.computeNextRun(created);\n await cursorStore.set(jobId, nextRunAt, new Date().toISOString());\n events.emit({\n eventType: \"job-created\",\n jobId,\n metadata: { name: job.name },\n });\n return { jobId };\n },\n\n async updateJob<TConfig>(\n jobId: string,\n patch: Partial<SchedulerJobDefinition<TConfig>>,\n ) {\n const updated = await jobStore.update(\n jobId,\n patch as Partial<SchedulerJobDefinition>,\n );\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n\n const nextRunAt = await engine.computeNextRun(updated);\n await cursorStore.set(jobId, nextRunAt, new Date().toISOString());\n events.emit({ eventType: \"job-updated\", jobId });\n },\n\n async pauseJob(jobId: string) {\n const updated = await jobStore.setEnabled(jobId, false);\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-paused\", jobId });\n },\n\n async resumeJob(jobId: string) {\n const updated = await jobStore.setEnabled(jobId, true);\n if (!updated) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-resumed\", jobId });\n },\n\n async deleteJob(jobId: string) {\n const removed = await jobStore.remove(jobId);\n await cursorStore.remove(jobId);\n if (!removed) {\n throw new Error(`Job not found: ${jobId}`);\n }\n events.emit({ eventType: \"job-deleted\", jobId });\n },\n\n async listJobs() {\n const jobs = await jobStore.list();\n return Promise.all(\n jobs.map(async (job) => {\n const cursor = await cursorStore.get(job.jobId);\n return toJobListItem({\n jobId: job.jobId,\n name: job.name,\n enabled: job.enabled,\n timezone: job.schedule.timezone,\n nextRunAt: cursor?.nextRunAt,\n });\n }),\n );\n },\n\n async listExecutions(query) {\n const jobs = await jobStore.list();\n const all = (\n await Promise.all(\n jobs.map((job) => executionStore.listByJob(job.jobId)),\n )\n ).flat();\n return filterExecutions(all, query);\n },\n\n async retryFailedExecution(executionId: string) {\n const jobs = await jobStore.list();\n const all = (\n await Promise.all(\n jobs.map((job) => executionStore.listByJob(job.jobId)),\n )\n ).flat();\n const retry = await retryFailedExecutionById(\n all,\n executionStore,\n executionId,\n );\n events.emit({\n eventType: \"retry\",\n jobId: retry.jobId,\n executionId: retry.executionId,\n metadata: { previousExecutionId: executionId },\n });\n },\n\n async start() {\n logger.info(\"scheduler.service.start\", { mode: options.mode });\n await runtime.start();\n },\n\n async stop() {\n logger.info(\"scheduler.service.stop\", { mode: options.mode });\n await runtime.stop();\n },\n };\n\n return {\n service,\n handlers,\n };\n}\n","import type { SchedulerService } from \"../contracts/scheduler-types.js\";\n\nexport interface SchedulerDashboardHealth {\n totalJobs: number;\n enabledJobs: number;\n pausedJobs: number;\n failedExecutions: number;\n}\n\nexport async function querySchedulerHealth(\n scheduler: SchedulerService,\n): Promise<SchedulerDashboardHealth> {\n const jobs = await scheduler.listJobs();\n const executions = await scheduler.listExecutions({ status: \"failed\" });\n\n return {\n totalJobs: jobs.length,\n enabledJobs: jobs.filter((job) => job.enabled).length,\n pausedJobs: jobs.filter((job) => !job.enabled).length,\n failedExecutions: executions.length,\n };\n}\n\nexport async function querySchedulerItems(scheduler: SchedulerService) {\n const jobs = await scheduler.listJobs();\n const executions = await scheduler.listExecutions({ limit: 100 });\n\n return jobs.map((job) => ({\n ...job,\n executions: executions.filter((execution) => execution.jobId === job.jobId),\n }));\n}\n","import type { SchedulerService } from \"../contracts/scheduler-types.js\";\nimport { querySchedulerHealth, querySchedulerItems } from \"./queue-queries.js\";\n\nexport interface SchedulerDashboardService {\n getHealth(): ReturnType<typeof querySchedulerHealth>;\n listItems(): ReturnType<typeof querySchedulerItems>;\n pauseJob(jobId: string): Promise<void>;\n resumeJob(jobId: string): Promise<void>;\n retryExecution(executionId: string): Promise<void>;\n}\n\nexport function createSchedulerDashboardService(\n scheduler: SchedulerService,\n): SchedulerDashboardService {\n return {\n getHealth: () => querySchedulerHealth(scheduler),\n listItems: () => querySchedulerItems(scheduler),\n pauseJob: (jobId) => scheduler.pauseJob(jobId),\n resumeJob: (jobId) => scheduler.resumeJob(jobId),\n retryExecution: (executionId) =>\n scheduler.retryFailedExecution(executionId),\n };\n}\n","import type {\n SchedulerHandlerRegistry,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"./src/contracts/scheduler-types.js\";\nimport { bindSchedulerToHost } from \"./src/core/scheduler-host-binding.js\";\nimport {\n CronWeekday,\n createCronExpression,\n} from \"./src/core/cron-expression-builder.js\";\nimport { createSchedulerService as createSchedulerServiceInternal } from \"./src/core/scheduler-service.js\";\n\nexport type {\n SchedulerHandlerRegistry,\n SchedulerJobDefinition,\n SchedulerJobRecord,\n SchedulerMissedRunPolicy,\n SchedulerMode,\n SchedulerOverlapPolicy,\n SchedulerPersistenceConfig,\n SchedulerScheduleConfig,\n SchedulerService,\n SchedulerServiceOptions,\n} from \"./src/contracts/scheduler-types.js\";\nexport type { CronWeekdayValue } from \"./src/core/cron-expression-builder.js\";\nexport type { SchedulerHostAdapter } from \"./src/contracts/scheduler-host.js\";\nexport { bindSchedulerToHost };\nexport { CronWeekday, createCronExpression };\nexport { createSchedulerDashboardService } from \"./src/dashboard/queue-dashboard-service.js\";\nexport { createSchedulerPersistence } from \"./src/core/persistence.js\";\n\nexport function createSchedulerService(options: SchedulerServiceOptions): {\n service: SchedulerService;\n handlers: SchedulerHandlerRegistry;\n} {\n return createSchedulerServiceInternal(options);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azlib/scheduler",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@azlib/cache": "0.2.2",
|
|
24
24
|
"@azlib/logger": "0.2.2",
|
|
25
|
-
"@azlib/persistence": "0.
|
|
26
|
-
"@azlib/queue": "1.0.
|
|
25
|
+
"@azlib/persistence": "0.5.0",
|
|
26
|
+
"@azlib/queue": "1.0.5",
|
|
27
27
|
"@azlib/std": "0.5.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|