@aigne/afs-scheduler 1.12.0-beta.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.
Files changed (75) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/cron-parser.cjs +202 -0
  5. package/dist/cron-parser.d.cts +65 -0
  6. package/dist/cron-parser.d.cts.map +1 -0
  7. package/dist/cron-parser.d.mts +65 -0
  8. package/dist/cron-parser.d.mts.map +1 -0
  9. package/dist/cron-parser.mjs +200 -0
  10. package/dist/cron-parser.mjs.map +1 -0
  11. package/dist/do-executor.cjs +59 -0
  12. package/dist/do-executor.d.cts +30 -0
  13. package/dist/do-executor.d.cts.map +1 -0
  14. package/dist/do-executor.d.mts +30 -0
  15. package/dist/do-executor.d.mts.map +1 -0
  16. package/dist/do-executor.mjs +59 -0
  17. package/dist/do-executor.mjs.map +1 -0
  18. package/dist/do-job-executor.cjs +53 -0
  19. package/dist/do-job-executor.d.cts +28 -0
  20. package/dist/do-job-executor.d.cts.map +1 -0
  21. package/dist/do-job-executor.d.mts +28 -0
  22. package/dist/do-job-executor.d.mts.map +1 -0
  23. package/dist/do-job-executor.mjs +53 -0
  24. package/dist/do-job-executor.mjs.map +1 -0
  25. package/dist/do-types.d.cts +66 -0
  26. package/dist/do-types.d.cts.map +1 -0
  27. package/dist/do-types.d.mts +66 -0
  28. package/dist/do-types.d.mts.map +1 -0
  29. package/dist/index.cjs +34 -0
  30. package/dist/index.d.cts +11 -0
  31. package/dist/index.d.mts +11 -0
  32. package/dist/index.mjs +11 -0
  33. package/dist/job-coordinator.cjs +216 -0
  34. package/dist/job-coordinator.d.cts +8 -0
  35. package/dist/job-coordinator.d.cts.map +1 -0
  36. package/dist/job-coordinator.d.mts +8 -0
  37. package/dist/job-coordinator.d.mts.map +1 -0
  38. package/dist/job-coordinator.mjs +216 -0
  39. package/dist/job-coordinator.mjs.map +1 -0
  40. package/dist/local-executor.cjs +25 -0
  41. package/dist/local-executor.d.cts +12 -0
  42. package/dist/local-executor.d.cts.map +1 -0
  43. package/dist/local-executor.d.mts +12 -0
  44. package/dist/local-executor.d.mts.map +1 -0
  45. package/dist/local-executor.mjs +25 -0
  46. package/dist/local-executor.mjs.map +1 -0
  47. package/dist/scheduler-provider.cjs +1236 -0
  48. package/dist/scheduler-provider.d.cts +95 -0
  49. package/dist/scheduler-provider.d.cts.map +1 -0
  50. package/dist/scheduler-provider.d.mts +95 -0
  51. package/dist/scheduler-provider.d.mts.map +1 -0
  52. package/dist/scheduler-provider.mjs +1237 -0
  53. package/dist/scheduler-provider.mjs.map +1 -0
  54. package/dist/task-runner.cjs +70 -0
  55. package/dist/task-runner.d.cts +25 -0
  56. package/dist/task-runner.d.cts.map +1 -0
  57. package/dist/task-runner.d.mts +25 -0
  58. package/dist/task-runner.d.mts.map +1 -0
  59. package/dist/task-runner.mjs +70 -0
  60. package/dist/task-runner.mjs.map +1 -0
  61. package/dist/task-store.cjs +186 -0
  62. package/dist/task-store.d.cts +60 -0
  63. package/dist/task-store.d.cts.map +1 -0
  64. package/dist/task-store.d.mts +60 -0
  65. package/dist/task-store.d.mts.map +1 -0
  66. package/dist/task-store.mjs +187 -0
  67. package/dist/task-store.mjs.map +1 -0
  68. package/dist/types.cjs +185 -0
  69. package/dist/types.d.cts +384 -0
  70. package/dist/types.d.cts.map +1 -0
  71. package/dist/types.d.mts +384 -0
  72. package/dist/types.d.mts.map +1 -0
  73. package/dist/types.mjs +176 -0
  74. package/dist/types.mjs.map +1 -0
  75. package/package.json +59 -0
@@ -0,0 +1,30 @@
1
+ import { DONamespace } from "./do-types.cjs";
2
+ import { TaskContext, TaskExecutor, TaskResult } from "./types.cjs";
3
+
4
+ //#region src/do-executor.d.ts
5
+ /**
6
+ * TaskExecutor that delegates execution to a Cloudflare Durable Object.
7
+ *
8
+ * Each task gets its own DO instance (idFromName(taskId)), bypassing
9
+ * the Workers 30-second CPU time limit.
10
+ *
11
+ * Error behavior matches LocalExecutor:
12
+ * - Infrastructure failures (DO crash, network error, non-200) → throws
13
+ * → Scheduler marks task as "failed"
14
+ * - Application results (exec returns { success: false }) → returns TaskResult
15
+ * → Scheduler marks task as "done" with the result
16
+ *
17
+ * Usage:
18
+ * ```typescript
19
+ * new AFSScheduler({ executor: new DOExecutor(env.TASK_DO) })
20
+ * ```
21
+ */
22
+ declare class DOExecutor implements TaskExecutor {
23
+ private doNamespace;
24
+ constructor(doNamespace: DONamespace);
25
+ run(taskId: string, taskPath: string, args: unknown, context?: TaskContext): Promise<TaskResult>;
26
+ cancel(taskId: string): Promise<void>;
27
+ }
28
+ //#endregion
29
+ export { DOExecutor };
30
+ //# sourceMappingURL=do-executor.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-executor.d.cts","names":[],"sources":["../src/do-executor.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,UAAA,YAAsB,YAAA;EAAA,QACb,WAAA;cAAA,WAAA,EAAa,WAAA;EAE3B,GAAA,CACJ,MAAA,UACA,QAAA,UACA,IAAA,WACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;EA2BL,MAAA,CAAO,MAAA,WAAiB,OAAA;AAAA"}
@@ -0,0 +1,30 @@
1
+ import { DONamespace } from "./do-types.mjs";
2
+ import { TaskContext, TaskExecutor, TaskResult } from "./types.mjs";
3
+
4
+ //#region src/do-executor.d.ts
5
+ /**
6
+ * TaskExecutor that delegates execution to a Cloudflare Durable Object.
7
+ *
8
+ * Each task gets its own DO instance (idFromName(taskId)), bypassing
9
+ * the Workers 30-second CPU time limit.
10
+ *
11
+ * Error behavior matches LocalExecutor:
12
+ * - Infrastructure failures (DO crash, network error, non-200) → throws
13
+ * → Scheduler marks task as "failed"
14
+ * - Application results (exec returns { success: false }) → returns TaskResult
15
+ * → Scheduler marks task as "done" with the result
16
+ *
17
+ * Usage:
18
+ * ```typescript
19
+ * new AFSScheduler({ executor: new DOExecutor(env.TASK_DO) })
20
+ * ```
21
+ */
22
+ declare class DOExecutor implements TaskExecutor {
23
+ private doNamespace;
24
+ constructor(doNamespace: DONamespace);
25
+ run(taskId: string, taskPath: string, args: unknown, context?: TaskContext): Promise<TaskResult>;
26
+ cancel(taskId: string): Promise<void>;
27
+ }
28
+ //#endregion
29
+ export { DOExecutor };
30
+ //# sourceMappingURL=do-executor.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-executor.d.mts","names":[],"sources":["../src/do-executor.ts"],"mappings":";;;;;;AAoBA;;;;;;;;;;;;;;;cAAa,UAAA,YAAsB,YAAA;EAAA,QACb,WAAA;cAAA,WAAA,EAAa,WAAA;EAE3B,GAAA,CACJ,MAAA,UACA,QAAA,UACA,IAAA,WACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;EA2BL,MAAA,CAAO,MAAA,WAAiB,OAAA;AAAA"}
@@ -0,0 +1,59 @@
1
+ //#region src/do-executor.ts
2
+ /**
3
+ * TaskExecutor that delegates execution to a Cloudflare Durable Object.
4
+ *
5
+ * Each task gets its own DO instance (idFromName(taskId)), bypassing
6
+ * the Workers 30-second CPU time limit.
7
+ *
8
+ * Error behavior matches LocalExecutor:
9
+ * - Infrastructure failures (DO crash, network error, non-200) → throws
10
+ * → Scheduler marks task as "failed"
11
+ * - Application results (exec returns { success: false }) → returns TaskResult
12
+ * → Scheduler marks task as "done" with the result
13
+ *
14
+ * Usage:
15
+ * ```typescript
16
+ * new AFSScheduler({ executor: new DOExecutor(env.TASK_DO) })
17
+ * ```
18
+ */
19
+ var DOExecutor = class {
20
+ constructor(doNamespace) {
21
+ this.doNamespace = doNamespace;
22
+ }
23
+ async run(taskId, taskPath, args, context) {
24
+ const doId = this.doNamespace.idFromName(taskId);
25
+ const stub = this.doNamespace.get(doId);
26
+ const body = {
27
+ taskId,
28
+ taskPath,
29
+ args
30
+ };
31
+ if (context) body.context = context;
32
+ const response = await stub.fetch(new Request("https://task/run", {
33
+ method: "POST",
34
+ headers: { "Content-Type": "application/json" },
35
+ body: JSON.stringify(body)
36
+ }));
37
+ if (!response.ok) {
38
+ const text = await response.text().catch(() => "");
39
+ throw new Error(`DO returned ${response.status}: ${text}`);
40
+ }
41
+ const result = await response.json();
42
+ return {
43
+ success: result.success,
44
+ data: result.data,
45
+ error: result.error
46
+ };
47
+ }
48
+ async cancel(taskId) {
49
+ const doId = this.doNamespace.idFromName(taskId);
50
+ const stub = this.doNamespace.get(doId);
51
+ try {
52
+ await stub.fetch(new Request("https://task/cancel", { method: "POST" }));
53
+ } catch {}
54
+ }
55
+ };
56
+
57
+ //#endregion
58
+ export { DOExecutor };
59
+ //# sourceMappingURL=do-executor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-executor.mjs","names":[],"sources":["../src/do-executor.ts"],"sourcesContent":["import type { DONamespace, TaskRunRequest, TaskRunResponse } from \"./do-types.js\";\nimport type { TaskContext, TaskExecutor, TaskResult } from \"./types.js\";\n\n/**\n * TaskExecutor that delegates execution to a Cloudflare Durable Object.\n *\n * Each task gets its own DO instance (idFromName(taskId)), bypassing\n * the Workers 30-second CPU time limit.\n *\n * Error behavior matches LocalExecutor:\n * - Infrastructure failures (DO crash, network error, non-200) → throws\n * → Scheduler marks task as \"failed\"\n * - Application results (exec returns { success: false }) → returns TaskResult\n * → Scheduler marks task as \"done\" with the result\n *\n * Usage:\n * ```typescript\n * new AFSScheduler({ executor: new DOExecutor(env.TASK_DO) })\n * ```\n */\nexport class DOExecutor implements TaskExecutor {\n constructor(private doNamespace: DONamespace) {}\n\n async run(\n taskId: string,\n taskPath: string,\n args: unknown,\n context?: TaskContext,\n ): Promise<TaskResult> {\n const doId = this.doNamespace.idFromName(taskId);\n const stub = this.doNamespace.get(doId);\n\n const body: TaskRunRequest = { taskId, taskPath, args };\n if (context) {\n body.context = context;\n }\n\n // Infrastructure failure → throw → scheduler marks \"failed\"\n const response = await stub.fetch(\n new Request(\"https://task/run\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n }),\n );\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`DO returned ${response.status}: ${text}`);\n }\n\n const result: TaskRunResponse = await response.json();\n return { success: result.success, data: result.data, error: result.error };\n }\n\n async cancel(taskId: string): Promise<void> {\n const doId = this.doNamespace.idFromName(taskId);\n const stub = this.doNamespace.get(doId);\n try {\n await stub.fetch(new Request(\"https://task/cancel\", { method: \"POST\" }));\n } catch {\n // Best-effort cancel — DO might already be gone\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,IAAa,aAAb,MAAgD;CAC9C,YAAY,AAAQ,aAA0B;EAA1B;;CAEpB,MAAM,IACJ,QACA,UACA,MACA,SACqB;EACrB,MAAM,OAAO,KAAK,YAAY,WAAW,OAAO;EAChD,MAAM,OAAO,KAAK,YAAY,IAAI,KAAK;EAEvC,MAAM,OAAuB;GAAE;GAAQ;GAAU;GAAM;AACvD,MAAI,QACF,MAAK,UAAU;EAIjB,MAAM,WAAW,MAAM,KAAK,MAC1B,IAAI,QAAQ,oBAAoB;GAC9B,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,KAAK;GAC3B,CAAC,CACH;AAED,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,GAAG;AAClD,SAAM,IAAI,MAAM,eAAe,SAAS,OAAO,IAAI,OAAO;;EAG5D,MAAM,SAA0B,MAAM,SAAS,MAAM;AACrD,SAAO;GAAE,SAAS,OAAO;GAAS,MAAM,OAAO;GAAM,OAAO,OAAO;GAAO;;CAG5E,MAAM,OAAO,QAA+B;EAC1C,MAAM,OAAO,KAAK,YAAY,WAAW,OAAO;EAChD,MAAM,OAAO,KAAK,YAAY,IAAI,KAAK;AACvC,MAAI;AACF,SAAM,KAAK,MAAM,IAAI,QAAQ,uBAAuB,EAAE,QAAQ,QAAQ,CAAC,CAAC;UAClE"}
@@ -0,0 +1,53 @@
1
+
2
+ //#region src/do-job-executor.ts
3
+ /**
4
+ * Client for communicating with Coordinator DOs.
5
+ *
6
+ * Each job maps to one Coordinator DO instance (idFromName(jobId)).
7
+ * The Coordinator DO manages the full map-reduce lifecycle:
8
+ * wave dispatch, alarm chaining, reduce phase.
9
+ *
10
+ * Usage in a CF Worker:
11
+ * ```typescript
12
+ * const jobExecutor = new DOJobExecutor(env.COORDINATOR_DO);
13
+ * ```
14
+ */
15
+ var DOJobExecutor = class {
16
+ constructor(coordinatorNamespace) {
17
+ this.coordinatorNamespace = coordinatorNamespace;
18
+ }
19
+ async submitJob(request) {
20
+ const doId = this.coordinatorNamespace.idFromName(request.jobId);
21
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/start", {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(request)
25
+ }));
26
+ if (!response.ok) {
27
+ const text = await response.text().catch(() => "");
28
+ throw new Error(`Coordinator returned ${response.status}: ${text}`);
29
+ }
30
+ return { jobId: (await response.json()).jobId };
31
+ }
32
+ async cancelJob(jobId) {
33
+ const doId = this.coordinatorNamespace.idFromName(jobId);
34
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/cancel", { method: "POST" }));
35
+ if (!response.ok) {
36
+ const text = await response.text().catch(() => "");
37
+ throw new Error(`Coordinator cancel returned ${response.status}: ${text}`);
38
+ }
39
+ }
40
+ async getStatus(jobId) {
41
+ const doId = this.coordinatorNamespace.idFromName(jobId);
42
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/status", { method: "GET" }));
43
+ if (response.status === 404) return;
44
+ if (!response.ok) {
45
+ const text = await response.text().catch(() => "");
46
+ throw new Error(`Coordinator status returned ${response.status}: ${text}`);
47
+ }
48
+ return await response.json();
49
+ }
50
+ };
51
+
52
+ //#endregion
53
+ exports.DOJobExecutor = DOJobExecutor;
@@ -0,0 +1,28 @@
1
+ import { DONamespace, JobStartRequest } from "./do-types.cjs";
2
+ import { JobEntry } from "./types.cjs";
3
+
4
+ //#region src/do-job-executor.d.ts
5
+ /**
6
+ * Client for communicating with Coordinator DOs.
7
+ *
8
+ * Each job maps to one Coordinator DO instance (idFromName(jobId)).
9
+ * The Coordinator DO manages the full map-reduce lifecycle:
10
+ * wave dispatch, alarm chaining, reduce phase.
11
+ *
12
+ * Usage in a CF Worker:
13
+ * ```typescript
14
+ * const jobExecutor = new DOJobExecutor(env.COORDINATOR_DO);
15
+ * ```
16
+ */
17
+ declare class DOJobExecutor {
18
+ private coordinatorNamespace;
19
+ constructor(coordinatorNamespace: DONamespace);
20
+ submitJob(request: JobStartRequest): Promise<{
21
+ jobId: string;
22
+ }>;
23
+ cancelJob(jobId: string): Promise<void>;
24
+ getStatus(jobId: string): Promise<JobEntry | undefined>;
25
+ }
26
+ //#endregion
27
+ export { DOJobExecutor };
28
+ //# sourceMappingURL=do-job-executor.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-job-executor.d.cts","names":[],"sources":["../src/do-job-executor.ts"],"mappings":";;;;;;AAeA;;;;;;;;;;cAAa,aAAA;EAAA,QACS,oBAAA;cAAA,oBAAA,EAAsB,WAAA;EAEpC,SAAA,CAAU,OAAA,EAAS,eAAA,GAAkB,OAAA;IAAU,KAAA;EAAA;EAqB/C,SAAA,CAAU,KAAA,WAAgB,OAAA;EAc1B,SAAA,CAAU,KAAA,WAAgB,OAAA,CAAQ,QAAA;AAAA"}
@@ -0,0 +1,28 @@
1
+ import { DONamespace, JobStartRequest } from "./do-types.mjs";
2
+ import { JobEntry } from "./types.mjs";
3
+
4
+ //#region src/do-job-executor.d.ts
5
+ /**
6
+ * Client for communicating with Coordinator DOs.
7
+ *
8
+ * Each job maps to one Coordinator DO instance (idFromName(jobId)).
9
+ * The Coordinator DO manages the full map-reduce lifecycle:
10
+ * wave dispatch, alarm chaining, reduce phase.
11
+ *
12
+ * Usage in a CF Worker:
13
+ * ```typescript
14
+ * const jobExecutor = new DOJobExecutor(env.COORDINATOR_DO);
15
+ * ```
16
+ */
17
+ declare class DOJobExecutor {
18
+ private coordinatorNamespace;
19
+ constructor(coordinatorNamespace: DONamespace);
20
+ submitJob(request: JobStartRequest): Promise<{
21
+ jobId: string;
22
+ }>;
23
+ cancelJob(jobId: string): Promise<void>;
24
+ getStatus(jobId: string): Promise<JobEntry | undefined>;
25
+ }
26
+ //#endregion
27
+ export { DOJobExecutor };
28
+ //# sourceMappingURL=do-job-executor.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-job-executor.d.mts","names":[],"sources":["../src/do-job-executor.ts"],"mappings":";;;;;;AAeA;;;;;;;;;;cAAa,aAAA;EAAA,QACS,oBAAA;cAAA,oBAAA,EAAsB,WAAA;EAEpC,SAAA,CAAU,OAAA,EAAS,eAAA,GAAkB,OAAA;IAAU,KAAA;EAAA;EAqB/C,SAAA,CAAU,KAAA,WAAgB,OAAA;EAc1B,SAAA,CAAU,KAAA,WAAgB,OAAA,CAAQ,QAAA;AAAA"}
@@ -0,0 +1,53 @@
1
+ //#region src/do-job-executor.ts
2
+ /**
3
+ * Client for communicating with Coordinator DOs.
4
+ *
5
+ * Each job maps to one Coordinator DO instance (idFromName(jobId)).
6
+ * The Coordinator DO manages the full map-reduce lifecycle:
7
+ * wave dispatch, alarm chaining, reduce phase.
8
+ *
9
+ * Usage in a CF Worker:
10
+ * ```typescript
11
+ * const jobExecutor = new DOJobExecutor(env.COORDINATOR_DO);
12
+ * ```
13
+ */
14
+ var DOJobExecutor = class {
15
+ constructor(coordinatorNamespace) {
16
+ this.coordinatorNamespace = coordinatorNamespace;
17
+ }
18
+ async submitJob(request) {
19
+ const doId = this.coordinatorNamespace.idFromName(request.jobId);
20
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/start", {
21
+ method: "POST",
22
+ headers: { "Content-Type": "application/json" },
23
+ body: JSON.stringify(request)
24
+ }));
25
+ if (!response.ok) {
26
+ const text = await response.text().catch(() => "");
27
+ throw new Error(`Coordinator returned ${response.status}: ${text}`);
28
+ }
29
+ return { jobId: (await response.json()).jobId };
30
+ }
31
+ async cancelJob(jobId) {
32
+ const doId = this.coordinatorNamespace.idFromName(jobId);
33
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/cancel", { method: "POST" }));
34
+ if (!response.ok) {
35
+ const text = await response.text().catch(() => "");
36
+ throw new Error(`Coordinator cancel returned ${response.status}: ${text}`);
37
+ }
38
+ }
39
+ async getStatus(jobId) {
40
+ const doId = this.coordinatorNamespace.idFromName(jobId);
41
+ const response = await this.coordinatorNamespace.get(doId).fetch(new Request("https://coordinator/status", { method: "GET" }));
42
+ if (response.status === 404) return;
43
+ if (!response.ok) {
44
+ const text = await response.text().catch(() => "");
45
+ throw new Error(`Coordinator status returned ${response.status}: ${text}`);
46
+ }
47
+ return await response.json();
48
+ }
49
+ };
50
+
51
+ //#endregion
52
+ export { DOJobExecutor };
53
+ //# sourceMappingURL=do-job-executor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-job-executor.mjs","names":[],"sources":["../src/do-job-executor.ts"],"sourcesContent":["import type { DONamespace, JobStartRequest } from \"./do-types.js\";\nimport type { JobEntry } from \"./types.js\";\n\n/**\n * Client for communicating with Coordinator DOs.\n *\n * Each job maps to one Coordinator DO instance (idFromName(jobId)).\n * The Coordinator DO manages the full map-reduce lifecycle:\n * wave dispatch, alarm chaining, reduce phase.\n *\n * Usage in a CF Worker:\n * ```typescript\n * const jobExecutor = new DOJobExecutor(env.COORDINATOR_DO);\n * ```\n */\nexport class DOJobExecutor {\n constructor(private coordinatorNamespace: DONamespace) {}\n\n async submitJob(request: JobStartRequest): Promise<{ jobId: string }> {\n const doId = this.coordinatorNamespace.idFromName(request.jobId);\n const stub = this.coordinatorNamespace.get(doId);\n\n const response = await stub.fetch(\n new Request(\"https://coordinator/start\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n }),\n );\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`Coordinator returned ${response.status}: ${text}`);\n }\n\n const result = (await response.json()) as { success: boolean; jobId: string };\n return { jobId: result.jobId };\n }\n\n async cancelJob(jobId: string): Promise<void> {\n const doId = this.coordinatorNamespace.idFromName(jobId);\n const stub = this.coordinatorNamespace.get(doId);\n\n const response = await stub.fetch(\n new Request(\"https://coordinator/cancel\", { method: \"POST\" }),\n );\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`Coordinator cancel returned ${response.status}: ${text}`);\n }\n }\n\n async getStatus(jobId: string): Promise<JobEntry | undefined> {\n const doId = this.coordinatorNamespace.idFromName(jobId);\n const stub = this.coordinatorNamespace.get(doId);\n\n const response = await stub.fetch(new Request(\"https://coordinator/status\", { method: \"GET\" }));\n\n if (response.status === 404) {\n return undefined;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(`Coordinator status returned ${response.status}: ${text}`);\n }\n\n return (await response.json()) as JobEntry;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,IAAa,gBAAb,MAA2B;CACzB,YAAY,AAAQ,sBAAmC;EAAnC;;CAEpB,MAAM,UAAU,SAAsD;EACpE,MAAM,OAAO,KAAK,qBAAqB,WAAW,QAAQ,MAAM;EAGhE,MAAM,WAAW,MAFJ,KAAK,qBAAqB,IAAI,KAAK,CAEpB,MAC1B,IAAI,QAAQ,6BAA6B;GACvC,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,QAAQ;GAC9B,CAAC,CACH;AAED,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,GAAG;AAClD,SAAM,IAAI,MAAM,wBAAwB,SAAS,OAAO,IAAI,OAAO;;AAIrE,SAAO,EAAE,QADO,MAAM,SAAS,MAAM,EACd,OAAO;;CAGhC,MAAM,UAAU,OAA8B;EAC5C,MAAM,OAAO,KAAK,qBAAqB,WAAW,MAAM;EAGxD,MAAM,WAAW,MAFJ,KAAK,qBAAqB,IAAI,KAAK,CAEpB,MAC1B,IAAI,QAAQ,8BAA8B,EAAE,QAAQ,QAAQ,CAAC,CAC9D;AAED,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,GAAG;AAClD,SAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,IAAI,OAAO;;;CAI9E,MAAM,UAAU,OAA8C;EAC5D,MAAM,OAAO,KAAK,qBAAqB,WAAW,MAAM;EAGxD,MAAM,WAAW,MAFJ,KAAK,qBAAqB,IAAI,KAAK,CAEpB,MAAM,IAAI,QAAQ,8BAA8B,EAAE,QAAQ,OAAO,CAAC,CAAC;AAE/F,MAAI,SAAS,WAAW,IACtB;AAGF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,GAAG;AAClD,SAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,IAAI,OAAO;;AAG5E,SAAQ,MAAM,SAAS,MAAM"}
@@ -0,0 +1,66 @@
1
+ //#region src/do-types.d.ts
2
+ /**
3
+ * Minimal interfaces matching Cloudflare Durable Object APIs.
4
+ * Any implementation satisfying these can be used with DOExecutor —
5
+ * no @cloudflare/workers-types dependency needed.
6
+ */
7
+ /** Matches CF DurableObjectNamespace */
8
+ interface DONamespace {
9
+ idFromName(name: string): DOId;
10
+ get(id: DOId): DOStub;
11
+ }
12
+ /** Opaque identifier for a Durable Object instance */
13
+ interface DOId {
14
+ toString(): string;
15
+ }
16
+ /** Stub for communicating with a Durable Object */
17
+ interface DOStub {
18
+ fetch(request: Request): Promise<Response>;
19
+ }
20
+ /** Request body sent to TaskRunner DO /run endpoint */
21
+ interface TaskRunRequest {
22
+ taskId: string;
23
+ taskPath: string;
24
+ args: unknown;
25
+ context?: {
26
+ procId?: string;
27
+ };
28
+ }
29
+ /** Response body from TaskRunner DO /run endpoint */
30
+ interface TaskRunResponse {
31
+ success: boolean;
32
+ data?: unknown;
33
+ error?: string;
34
+ }
35
+ /** Minimal subset of Cloudflare DurableObjectStorage */
36
+ interface DOStorage {
37
+ get<T>(key: string): Promise<T | undefined>;
38
+ put(key: string, value: unknown): Promise<void>;
39
+ delete(key: string): Promise<boolean>;
40
+ setAlarm(scheduledTime: number | Date): Promise<void>;
41
+ deleteAlarm(): Promise<void>;
42
+ }
43
+ /** Minimal subset of Cloudflare DurableObjectState */
44
+ interface DOState {
45
+ storage: DOStorage;
46
+ id: DOId;
47
+ }
48
+ /** Request body for Coordinator DO POST /start */
49
+ interface JobStartRequest {
50
+ jobId: string;
51
+ name?: string;
52
+ mapTask: string;
53
+ reduceTask?: string;
54
+ totalItems: number;
55
+ batchSize: number;
56
+ concurrency: number;
57
+ args?: unknown;
58
+ timeout?: number;
59
+ }
60
+ /** Environment bindings the Coordinator DO expects */
61
+ interface JobCoordinatorEnv {
62
+ TASK_DO: DONamespace;
63
+ }
64
+ //#endregion
65
+ export { DOId, DONamespace, DOState, DOStorage, DOStub, JobCoordinatorEnv, JobStartRequest, TaskRunRequest, TaskRunResponse };
66
+ //# sourceMappingURL=do-types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-types.d.cts","names":[],"sources":["../src/do-types.ts"],"mappings":";;AASA;;;;;UAAiB,WAAA;EACf,UAAA,CAAW,IAAA,WAAe,IAAA;EAC1B,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,MAAA;AAAA;;UAIA,IAAA;EACf,QAAA;AAAA;;UAIe,MAAA;EACf,KAAA,CAAM,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,QAAA;AAAA;AANnC;AAAA,UAYiB,cAAA;EACf,MAAA;EACA,QAAA;EACA,IAAA;EACA,OAAA;IAAY,MAAA;EAAA;AAAA;;UAIG,eAAA;EACf,OAAA;EACA,IAAA;EACA,KAAA;AAAA;;UAMe,SAAA;EACf,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,CAAA;EAC7B,GAAA,CAAI,GAAA,UAAa,KAAA,YAAiB,OAAA;EAClC,MAAA,CAAO,GAAA,WAAc,OAAA;EACrB,QAAA,CAAS,aAAA,WAAwB,IAAA,GAAO,OAAA;EACxC,WAAA,IAAe,OAAA;AAAA;;UAIA,OAAA;EACf,OAAA,EAAS,SAAA;EACT,EAAA,EAAI,IAAA;AAAA;;UAMW,eAAA;EACf,KAAA;EACA,IAAA;EACA,OAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;EACA,WAAA;EACA,IAAA;EACA,OAAA;AAAA;AA1BF;AAAA,UA8BiB,iBAAA;EACf,OAAA,EAAS,WAAA;AAAA"}
@@ -0,0 +1,66 @@
1
+ //#region src/do-types.d.ts
2
+ /**
3
+ * Minimal interfaces matching Cloudflare Durable Object APIs.
4
+ * Any implementation satisfying these can be used with DOExecutor —
5
+ * no @cloudflare/workers-types dependency needed.
6
+ */
7
+ /** Matches CF DurableObjectNamespace */
8
+ interface DONamespace {
9
+ idFromName(name: string): DOId;
10
+ get(id: DOId): DOStub;
11
+ }
12
+ /** Opaque identifier for a Durable Object instance */
13
+ interface DOId {
14
+ toString(): string;
15
+ }
16
+ /** Stub for communicating with a Durable Object */
17
+ interface DOStub {
18
+ fetch(request: Request): Promise<Response>;
19
+ }
20
+ /** Request body sent to TaskRunner DO /run endpoint */
21
+ interface TaskRunRequest {
22
+ taskId: string;
23
+ taskPath: string;
24
+ args: unknown;
25
+ context?: {
26
+ procId?: string;
27
+ };
28
+ }
29
+ /** Response body from TaskRunner DO /run endpoint */
30
+ interface TaskRunResponse {
31
+ success: boolean;
32
+ data?: unknown;
33
+ error?: string;
34
+ }
35
+ /** Minimal subset of Cloudflare DurableObjectStorage */
36
+ interface DOStorage {
37
+ get<T>(key: string): Promise<T | undefined>;
38
+ put(key: string, value: unknown): Promise<void>;
39
+ delete(key: string): Promise<boolean>;
40
+ setAlarm(scheduledTime: number | Date): Promise<void>;
41
+ deleteAlarm(): Promise<void>;
42
+ }
43
+ /** Minimal subset of Cloudflare DurableObjectState */
44
+ interface DOState {
45
+ storage: DOStorage;
46
+ id: DOId;
47
+ }
48
+ /** Request body for Coordinator DO POST /start */
49
+ interface JobStartRequest {
50
+ jobId: string;
51
+ name?: string;
52
+ mapTask: string;
53
+ reduceTask?: string;
54
+ totalItems: number;
55
+ batchSize: number;
56
+ concurrency: number;
57
+ args?: unknown;
58
+ timeout?: number;
59
+ }
60
+ /** Environment bindings the Coordinator DO expects */
61
+ interface JobCoordinatorEnv {
62
+ TASK_DO: DONamespace;
63
+ }
64
+ //#endregion
65
+ export { DOId, DONamespace, DOState, DOStorage, DOStub, JobCoordinatorEnv, JobStartRequest, TaskRunRequest, TaskRunResponse };
66
+ //# sourceMappingURL=do-types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do-types.d.mts","names":[],"sources":["../src/do-types.ts"],"mappings":";;AASA;;;;;UAAiB,WAAA;EACf,UAAA,CAAW,IAAA,WAAe,IAAA;EAC1B,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,MAAA;AAAA;;UAIA,IAAA;EACf,QAAA;AAAA;;UAIe,MAAA;EACf,KAAA,CAAM,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,QAAA;AAAA;AANnC;AAAA,UAYiB,cAAA;EACf,MAAA;EACA,QAAA;EACA,IAAA;EACA,OAAA;IAAY,MAAA;EAAA;AAAA;;UAIG,eAAA;EACf,OAAA;EACA,IAAA;EACA,KAAA;AAAA;;UAMe,SAAA;EACf,GAAA,IAAO,GAAA,WAAc,OAAA,CAAQ,CAAA;EAC7B,GAAA,CAAI,GAAA,UAAa,KAAA,YAAiB,OAAA;EAClC,MAAA,CAAO,GAAA,WAAc,OAAA;EACrB,QAAA,CAAS,aAAA,WAAwB,IAAA,GAAO,OAAA;EACxC,WAAA,IAAe,OAAA;AAAA;;UAIA,OAAA;EACf,OAAA,EAAS,SAAA;EACT,EAAA,EAAI,IAAA;AAAA;;UAMW,eAAA;EACf,KAAA;EACA,IAAA;EACA,OAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;EACA,WAAA;EACA,IAAA;EACA,OAAA;AAAA;AA1BF;AAAA,UA8BiB,iBAAA;EACf,OAAA,EAAS,WAAA;AAAA"}
package/dist/index.cjs ADDED
@@ -0,0 +1,34 @@
1
+ Object.defineProperty(exports, '__esModule', { value: true });
2
+ const require_cron_parser = require('./cron-parser.cjs');
3
+ const require_do_executor = require('./do-executor.cjs');
4
+ const require_do_job_executor = require('./do-job-executor.cjs');
5
+ const require_job_coordinator = require('./job-coordinator.cjs');
6
+ const require_local_executor = require('./local-executor.cjs');
7
+ const require_task_store = require('./task-store.cjs');
8
+ const require_types = require('./types.cjs');
9
+ const require_scheduler_provider = require('./scheduler-provider.cjs');
10
+ const require_task_runner = require('./task-runner.cjs');
11
+
12
+ exports.AFSScheduler = require_scheduler_provider.AFSScheduler;
13
+ exports.CancelArgsSchema = require_types.CancelArgsSchema;
14
+ exports.CancelJobArgsSchema = require_types.CancelJobArgsSchema;
15
+ exports.ClaimArgsSchema = require_types.ClaimArgsSchema;
16
+ exports.DOExecutor = require_do_executor.DOExecutor;
17
+ exports.DOJobExecutor = require_do_job_executor.DOJobExecutor;
18
+ exports.DispatchArgsSchema = require_types.DispatchArgsSchema;
19
+ exports.HeartbeatArgsSchema = require_types.HeartbeatArgsSchema;
20
+ exports.LocalExecutor = require_local_executor.LocalExecutor;
21
+ exports.RetryArgsSchema = require_types.RetryArgsSchema;
22
+ exports.ScheduleArgsSchema = require_types.ScheduleArgsSchema;
23
+ exports.SchedulerSnapshotSchema = require_types.SchedulerSnapshotSchema;
24
+ exports.SubmitArgsSchema = require_types.SubmitArgsSchema;
25
+ exports.SubmitJobArgsSchema = require_types.SubmitJobArgsSchema;
26
+ exports.TaskStore = require_task_store.TaskStore;
27
+ exports.UnscheduleArgsSchema = require_types.UnscheduleArgsSchema;
28
+ exports.default = require_scheduler_provider.AFSScheduler;
29
+ exports.handleJobCoordinatorAlarm = require_job_coordinator.handleJobCoordinatorAlarm;
30
+ exports.handleJobCoordinatorRequest = require_job_coordinator.handleJobCoordinatorRequest;
31
+ exports.handleTaskRequest = require_task_runner.handleTaskRequest;
32
+ exports.isDue = require_cron_parser.isDue;
33
+ exports.nextRun = require_cron_parser.nextRun;
34
+ exports.parseCron = require_cron_parser.parseCron;
@@ -0,0 +1,11 @@
1
+ import { CronExpression, CronPart, isDue, nextRun, parseCron } from "./cron-parser.cjs";
2
+ import { DOId, DONamespace, DOState, DOStorage, DOStub, JobCoordinatorEnv, JobStartRequest, TaskRunRequest, TaskRunResponse } from "./do-types.cjs";
3
+ import { BudgetEstimate, CancelArgs, CancelArgsSchema, CancelJobArgs, CancelJobArgsSchema, ClaimArgs, ClaimArgsSchema, DispatchArgs, DispatchArgsSchema, HeartbeatArgs, HeartbeatArgsSchema, JobEntry, JobProgress, JobStatus, RetryArgs, RetryArgsSchema, ScheduleArgs, ScheduleArgsSchema, ScheduleEntry, SchedulerProviderOptions, SchedulerSnapshot, SchedulerSnapshotSchema, SubmitArgs, SubmitArgsSchema, SubmitJobArgs, SubmitJobArgsSchema, TaskContext, TaskEntry, TaskExecutor, TaskResult, TaskStatus, TickResult, UnscheduleArgs, UnscheduleArgsSchema } from "./types.cjs";
4
+ import { DOExecutor } from "./do-executor.cjs";
5
+ import { DOJobExecutor } from "./do-job-executor.cjs";
6
+ import { handleJobCoordinatorAlarm, handleJobCoordinatorRequest } from "./job-coordinator.cjs";
7
+ import { LocalExecutor } from "./local-executor.cjs";
8
+ import { TaskStore } from "./task-store.cjs";
9
+ import { AFSScheduler } from "./scheduler-provider.cjs";
10
+ import { handleTaskRequest } from "./task-runner.cjs";
11
+ export { AFSScheduler, type BudgetEstimate, type CancelArgs, CancelArgsSchema, type CancelJobArgs, CancelJobArgsSchema, type ClaimArgs, ClaimArgsSchema, type CronExpression, type CronPart, DOExecutor, type DOId, DOJobExecutor, type DONamespace, type DOState, type DOStorage, type DOStub, type DispatchArgs, DispatchArgsSchema, type HeartbeatArgs, HeartbeatArgsSchema, type JobCoordinatorEnv, type JobEntry, type JobProgress, type JobStartRequest, type JobStatus, LocalExecutor, type RetryArgs, RetryArgsSchema, type ScheduleArgs, ScheduleArgsSchema, type ScheduleEntry, type SchedulerProviderOptions, type SchedulerSnapshot, SchedulerSnapshotSchema, type SubmitArgs, SubmitArgsSchema, type SubmitJobArgs, SubmitJobArgsSchema, type TaskContext, type TaskEntry, type TaskExecutor, type TaskResult, type TaskRunRequest, type TaskRunResponse, type TaskStatus, TaskStore, type TickResult, type UnscheduleArgs, UnscheduleArgsSchema, AFSScheduler as default, handleJobCoordinatorAlarm, handleJobCoordinatorRequest, handleTaskRequest, isDue, nextRun, parseCron };
@@ -0,0 +1,11 @@
1
+ import { CronExpression, CronPart, isDue, nextRun, parseCron } from "./cron-parser.mjs";
2
+ import { DOId, DONamespace, DOState, DOStorage, DOStub, JobCoordinatorEnv, JobStartRequest, TaskRunRequest, TaskRunResponse } from "./do-types.mjs";
3
+ import { BudgetEstimate, CancelArgs, CancelArgsSchema, CancelJobArgs, CancelJobArgsSchema, ClaimArgs, ClaimArgsSchema, DispatchArgs, DispatchArgsSchema, HeartbeatArgs, HeartbeatArgsSchema, JobEntry, JobProgress, JobStatus, RetryArgs, RetryArgsSchema, ScheduleArgs, ScheduleArgsSchema, ScheduleEntry, SchedulerProviderOptions, SchedulerSnapshot, SchedulerSnapshotSchema, SubmitArgs, SubmitArgsSchema, SubmitJobArgs, SubmitJobArgsSchema, TaskContext, TaskEntry, TaskExecutor, TaskResult, TaskStatus, TickResult, UnscheduleArgs, UnscheduleArgsSchema } from "./types.mjs";
4
+ import { DOExecutor } from "./do-executor.mjs";
5
+ import { DOJobExecutor } from "./do-job-executor.mjs";
6
+ import { handleJobCoordinatorAlarm, handleJobCoordinatorRequest } from "./job-coordinator.mjs";
7
+ import { LocalExecutor } from "./local-executor.mjs";
8
+ import { TaskStore } from "./task-store.mjs";
9
+ import { AFSScheduler } from "./scheduler-provider.mjs";
10
+ import { handleTaskRequest } from "./task-runner.mjs";
11
+ export { AFSScheduler, type BudgetEstimate, type CancelArgs, CancelArgsSchema, type CancelJobArgs, CancelJobArgsSchema, type ClaimArgs, ClaimArgsSchema, type CronExpression, type CronPart, DOExecutor, type DOId, DOJobExecutor, type DONamespace, type DOState, type DOStorage, type DOStub, type DispatchArgs, DispatchArgsSchema, type HeartbeatArgs, HeartbeatArgsSchema, type JobCoordinatorEnv, type JobEntry, type JobProgress, type JobStartRequest, type JobStatus, LocalExecutor, type RetryArgs, RetryArgsSchema, type ScheduleArgs, ScheduleArgsSchema, type ScheduleEntry, type SchedulerProviderOptions, type SchedulerSnapshot, SchedulerSnapshotSchema, type SubmitArgs, SubmitArgsSchema, type SubmitJobArgs, SubmitJobArgsSchema, type TaskContext, type TaskEntry, type TaskExecutor, type TaskResult, type TaskRunRequest, type TaskRunResponse, type TaskStatus, TaskStore, type TickResult, type UnscheduleArgs, UnscheduleArgsSchema, AFSScheduler as default, handleJobCoordinatorAlarm, handleJobCoordinatorRequest, handleTaskRequest, isDue, nextRun, parseCron };
package/dist/index.mjs ADDED
@@ -0,0 +1,11 @@
1
+ import { isDue, nextRun, parseCron } from "./cron-parser.mjs";
2
+ import { DOExecutor } from "./do-executor.mjs";
3
+ import { DOJobExecutor } from "./do-job-executor.mjs";
4
+ import { handleJobCoordinatorAlarm, handleJobCoordinatorRequest } from "./job-coordinator.mjs";
5
+ import { LocalExecutor } from "./local-executor.mjs";
6
+ import { TaskStore } from "./task-store.mjs";
7
+ import { CancelArgsSchema, CancelJobArgsSchema, ClaimArgsSchema, DispatchArgsSchema, HeartbeatArgsSchema, RetryArgsSchema, ScheduleArgsSchema, SchedulerSnapshotSchema, SubmitArgsSchema, SubmitJobArgsSchema, UnscheduleArgsSchema } from "./types.mjs";
8
+ import { AFSScheduler } from "./scheduler-provider.mjs";
9
+ import { handleTaskRequest } from "./task-runner.mjs";
10
+
11
+ export { AFSScheduler, CancelArgsSchema, CancelJobArgsSchema, ClaimArgsSchema, DOExecutor, DOJobExecutor, DispatchArgsSchema, HeartbeatArgsSchema, LocalExecutor, RetryArgsSchema, ScheduleArgsSchema, SchedulerSnapshotSchema, SubmitArgsSchema, SubmitJobArgsSchema, TaskStore, UnscheduleArgsSchema, AFSScheduler as default, handleJobCoordinatorAlarm, handleJobCoordinatorRequest, handleTaskRequest, isDue, nextRun, parseCron };