@durable-effect/jobs 0.0.1-next.1

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 (199) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/dist/client/client.d.ts +34 -0
  4. package/dist/client/client.d.ts.map +1 -0
  5. package/dist/client/client.js +427 -0
  6. package/dist/client/client.js.map +1 -0
  7. package/dist/client/index.d.ts +4 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +4 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/response.d.ts +99 -0
  12. package/dist/client/response.d.ts.map +1 -0
  13. package/dist/client/response.js +92 -0
  14. package/dist/client/response.js.map +1 -0
  15. package/dist/client/types.d.ts +242 -0
  16. package/dist/client/types.d.ts.map +1 -0
  17. package/dist/client/types.js +3 -0
  18. package/dist/client/types.js.map +1 -0
  19. package/dist/definitions/continuous.d.ts +110 -0
  20. package/dist/definitions/continuous.d.ts.map +1 -0
  21. package/dist/definitions/continuous.js +79 -0
  22. package/dist/definitions/continuous.js.map +1 -0
  23. package/dist/definitions/debounce.d.ts +67 -0
  24. package/dist/definitions/debounce.d.ts.map +1 -0
  25. package/dist/definitions/debounce.js +28 -0
  26. package/dist/definitions/debounce.js.map +1 -0
  27. package/dist/definitions/index.d.ts +4 -0
  28. package/dist/definitions/index.d.ts.map +1 -0
  29. package/dist/definitions/index.js +5 -0
  30. package/dist/definitions/index.js.map +1 -0
  31. package/dist/definitions/task.d.ts +234 -0
  32. package/dist/definitions/task.d.ts.map +1 -0
  33. package/dist/definitions/task.js +106 -0
  34. package/dist/definitions/task.js.map +1 -0
  35. package/dist/engine/engine.d.ts +60 -0
  36. package/dist/engine/engine.d.ts.map +1 -0
  37. package/dist/engine/engine.js +89 -0
  38. package/dist/engine/engine.js.map +1 -0
  39. package/dist/engine/index.d.ts +3 -0
  40. package/dist/engine/index.d.ts.map +1 -0
  41. package/dist/engine/index.js +3 -0
  42. package/dist/engine/index.js.map +1 -0
  43. package/dist/engine/types.d.ts +53 -0
  44. package/dist/engine/types.d.ts.map +1 -0
  45. package/dist/engine/types.js +3 -0
  46. package/dist/engine/types.js.map +1 -0
  47. package/dist/errors.d.ts +119 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +80 -0
  50. package/dist/errors.js.map +1 -0
  51. package/dist/factory.d.ts +97 -0
  52. package/dist/factory.d.ts.map +1 -0
  53. package/dist/factory.js +94 -0
  54. package/dist/factory.js.map +1 -0
  55. package/dist/handlers/continuous/context.d.ts +25 -0
  56. package/dist/handlers/continuous/context.d.ts.map +1 -0
  57. package/dist/handlers/continuous/context.js +38 -0
  58. package/dist/handlers/continuous/context.js.map +1 -0
  59. package/dist/handlers/continuous/executor.d.ts +10 -0
  60. package/dist/handlers/continuous/executor.d.ts.map +1 -0
  61. package/dist/handlers/continuous/executor.js +83 -0
  62. package/dist/handlers/continuous/executor.js.map +1 -0
  63. package/dist/handlers/continuous/handler.d.ts +14 -0
  64. package/dist/handlers/continuous/handler.d.ts.map +1 -0
  65. package/dist/handlers/continuous/handler.js +283 -0
  66. package/dist/handlers/continuous/handler.js.map +1 -0
  67. package/dist/handlers/continuous/index.d.ts +4 -0
  68. package/dist/handlers/continuous/index.d.ts.map +1 -0
  69. package/dist/handlers/continuous/index.js +4 -0
  70. package/dist/handlers/continuous/index.js.map +1 -0
  71. package/dist/handlers/continuous/types.d.ts +36 -0
  72. package/dist/handlers/continuous/types.d.ts.map +1 -0
  73. package/dist/handlers/continuous/types.js +3 -0
  74. package/dist/handlers/continuous/types.js.map +1 -0
  75. package/dist/handlers/debounce/handler.d.ts +14 -0
  76. package/dist/handlers/debounce/handler.d.ts.map +1 -0
  77. package/dist/handlers/debounce/handler.js +261 -0
  78. package/dist/handlers/debounce/handler.js.map +1 -0
  79. package/dist/handlers/debounce/index.d.ts +3 -0
  80. package/dist/handlers/debounce/index.d.ts.map +1 -0
  81. package/dist/handlers/debounce/index.js +3 -0
  82. package/dist/handlers/debounce/index.js.map +1 -0
  83. package/dist/handlers/debounce/types.d.ts +10 -0
  84. package/dist/handlers/debounce/types.d.ts.map +1 -0
  85. package/dist/handlers/debounce/types.js +3 -0
  86. package/dist/handlers/debounce/types.js.map +1 -0
  87. package/dist/handlers/index.d.ts +14 -0
  88. package/dist/handlers/index.d.ts.map +1 -0
  89. package/dist/handlers/index.js +25 -0
  90. package/dist/handlers/index.js.map +1 -0
  91. package/dist/handlers/task/context.d.ts +35 -0
  92. package/dist/handlers/task/context.d.ts.map +1 -0
  93. package/dist/handlers/task/context.js +156 -0
  94. package/dist/handlers/task/context.js.map +1 -0
  95. package/dist/handlers/task/handler.d.ts +13 -0
  96. package/dist/handlers/task/handler.d.ts.map +1 -0
  97. package/dist/handlers/task/handler.js +280 -0
  98. package/dist/handlers/task/handler.js.map +1 -0
  99. package/dist/handlers/task/index.d.ts +3 -0
  100. package/dist/handlers/task/index.d.ts.map +1 -0
  101. package/dist/handlers/task/index.js +2 -0
  102. package/dist/handlers/task/index.js.map +1 -0
  103. package/dist/handlers/task/types.d.ts +10 -0
  104. package/dist/handlers/task/types.d.ts.map +1 -0
  105. package/dist/handlers/task/types.js +3 -0
  106. package/dist/handlers/task/types.js.map +1 -0
  107. package/dist/index.d.ts +28 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +79 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/registry/index.d.ts +5 -0
  112. package/dist/registry/index.d.ts.map +1 -0
  113. package/dist/registry/index.js +4 -0
  114. package/dist/registry/index.js.map +1 -0
  115. package/dist/registry/registry.d.ts +74 -0
  116. package/dist/registry/registry.d.ts.map +1 -0
  117. package/dist/registry/registry.js +159 -0
  118. package/dist/registry/registry.js.map +1 -0
  119. package/dist/registry/typed.d.ts +146 -0
  120. package/dist/registry/typed.d.ts.map +1 -0
  121. package/dist/registry/typed.js +29 -0
  122. package/dist/registry/typed.js.map +1 -0
  123. package/dist/registry/types.d.ts +497 -0
  124. package/dist/registry/types.d.ts.map +1 -0
  125. package/dist/registry/types.js +3 -0
  126. package/dist/registry/types.js.map +1 -0
  127. package/dist/retry/errors.d.ts +31 -0
  128. package/dist/retry/errors.d.ts.map +1 -0
  129. package/dist/retry/errors.js +22 -0
  130. package/dist/retry/errors.js.map +1 -0
  131. package/dist/retry/executor.d.ts +53 -0
  132. package/dist/retry/executor.d.ts.map +1 -0
  133. package/dist/retry/executor.js +112 -0
  134. package/dist/retry/executor.js.map +1 -0
  135. package/dist/retry/index.d.ts +4 -0
  136. package/dist/retry/index.d.ts.map +1 -0
  137. package/dist/retry/index.js +4 -0
  138. package/dist/retry/index.js.map +1 -0
  139. package/dist/retry/types.d.ts +29 -0
  140. package/dist/retry/types.d.ts.map +1 -0
  141. package/dist/retry/types.js +3 -0
  142. package/dist/retry/types.js.map +1 -0
  143. package/dist/runtime/dispatcher.d.ts +39 -0
  144. package/dist/runtime/dispatcher.d.ts.map +1 -0
  145. package/dist/runtime/dispatcher.js +76 -0
  146. package/dist/runtime/dispatcher.js.map +1 -0
  147. package/dist/runtime/index.d.ts +4 -0
  148. package/dist/runtime/index.d.ts.map +1 -0
  149. package/dist/runtime/index.js +6 -0
  150. package/dist/runtime/index.js.map +1 -0
  151. package/dist/runtime/runtime.d.ts +88 -0
  152. package/dist/runtime/runtime.d.ts.map +1 -0
  153. package/dist/runtime/runtime.js +116 -0
  154. package/dist/runtime/runtime.js.map +1 -0
  155. package/dist/runtime/types.d.ts +182 -0
  156. package/dist/runtime/types.d.ts.map +1 -0
  157. package/dist/runtime/types.js +3 -0
  158. package/dist/runtime/types.js.map +1 -0
  159. package/dist/services/alarm.d.ts +37 -0
  160. package/dist/services/alarm.d.ts.map +1 -0
  161. package/dist/services/alarm.js +39 -0
  162. package/dist/services/alarm.js.map +1 -0
  163. package/dist/services/cleanup.d.ts +27 -0
  164. package/dist/services/cleanup.d.ts.map +1 -0
  165. package/dist/services/cleanup.js +25 -0
  166. package/dist/services/cleanup.js.map +1 -0
  167. package/dist/services/entity-state.d.ts +49 -0
  168. package/dist/services/entity-state.d.ts.map +1 -0
  169. package/dist/services/entity-state.js +72 -0
  170. package/dist/services/entity-state.js.map +1 -0
  171. package/dist/services/execution.d.ts +70 -0
  172. package/dist/services/execution.d.ts.map +1 -0
  173. package/dist/services/execution.js +159 -0
  174. package/dist/services/execution.js.map +1 -0
  175. package/dist/services/execution_test.d.ts +13 -0
  176. package/dist/services/execution_test.d.ts.map +1 -0
  177. package/dist/services/execution_test.js +11 -0
  178. package/dist/services/execution_test.js.map +1 -0
  179. package/dist/services/idempotency.d.ts +36 -0
  180. package/dist/services/idempotency.d.ts.map +1 -0
  181. package/dist/services/idempotency.js +48 -0
  182. package/dist/services/idempotency.js.map +1 -0
  183. package/dist/services/index.d.ts +19 -0
  184. package/dist/services/index.d.ts.map +1 -0
  185. package/dist/services/index.js +33 -0
  186. package/dist/services/index.js.map +1 -0
  187. package/dist/services/metadata.d.ts +64 -0
  188. package/dist/services/metadata.d.ts.map +1 -0
  189. package/dist/services/metadata.js +56 -0
  190. package/dist/services/metadata.js.map +1 -0
  191. package/dist/services/registry.d.ts +19 -0
  192. package/dist/services/registry.d.ts.map +1 -0
  193. package/dist/services/registry.js +17 -0
  194. package/dist/services/registry.js.map +1 -0
  195. package/dist/storage-keys.d.ts +38 -0
  196. package/dist/storage-keys.d.ts.map +1 -0
  197. package/dist/storage-keys.js +47 -0
  198. package/dist/storage-keys.js.map +1 -0
  199. package/package.json +35 -0
@@ -0,0 +1,119 @@
1
+ export { StorageError, SchedulerError } from "@durable-effect/core";
2
+ declare const JobNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
3
+ readonly _tag: "JobNotFoundError";
4
+ } & Readonly<A>;
5
+ /**
6
+ * Job type not found in registry.
7
+ */
8
+ export declare class JobNotFoundError extends JobNotFoundError_base<{
9
+ readonly type: string;
10
+ readonly name: string;
11
+ }> {
12
+ get message(): string;
13
+ }
14
+ declare const InstanceNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
15
+ readonly _tag: "InstanceNotFoundError";
16
+ } & Readonly<A>;
17
+ /**
18
+ * Instance not found (no metadata stored).
19
+ */
20
+ export declare class InstanceNotFoundError extends InstanceNotFoundError_base<{
21
+ readonly instanceId: string;
22
+ }> {
23
+ get message(): string;
24
+ }
25
+ declare const InvalidStateError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
26
+ readonly _tag: "InvalidStateError";
27
+ } & Readonly<A>;
28
+ /**
29
+ * Invalid state transition.
30
+ */
31
+ export declare class InvalidStateError extends InvalidStateError_base<{
32
+ readonly expected: string;
33
+ readonly actual: string;
34
+ readonly operation: string;
35
+ }> {
36
+ get message(): string;
37
+ }
38
+ declare const ValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
39
+ readonly _tag: "ValidationError";
40
+ } & Readonly<A>;
41
+ /**
42
+ * Schema validation failed.
43
+ */
44
+ export declare class ValidationError extends ValidationError_base<{
45
+ readonly schemaName: string;
46
+ readonly issues: unknown;
47
+ }> {
48
+ get message(): string;
49
+ }
50
+ declare const ExecutionError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
51
+ readonly _tag: "ExecutionError";
52
+ } & Readonly<A>;
53
+ /**
54
+ * Execution of user function failed.
55
+ */
56
+ export declare class ExecutionError extends ExecutionError_base<{
57
+ readonly jobType: string;
58
+ readonly jobName: string;
59
+ readonly instanceId: string;
60
+ readonly cause: unknown;
61
+ }> {
62
+ get message(): string;
63
+ }
64
+ declare const RetryExhaustedError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
65
+ readonly _tag: "RetryExhaustedError";
66
+ } & Readonly<A>;
67
+ /**
68
+ * Retry attempts exhausted (WorkerPool job).
69
+ */
70
+ export declare class RetryExhaustedError extends RetryExhaustedError_base<{
71
+ readonly eventId: string;
72
+ readonly attempts: number;
73
+ readonly lastError: unknown;
74
+ }> {
75
+ get message(): string;
76
+ }
77
+ declare const UnknownJobTypeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
78
+ readonly _tag: "UnknownJobTypeError";
79
+ } & Readonly<A>;
80
+ /**
81
+ * Unknown job type in request.
82
+ */
83
+ export declare class UnknownJobTypeError extends UnknownJobTypeError_base<{
84
+ readonly type: string;
85
+ }> {
86
+ get message(): string;
87
+ }
88
+ declare const DuplicateEventError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
89
+ readonly _tag: "DuplicateEventError";
90
+ } & Readonly<A>;
91
+ /**
92
+ * Duplicate event (idempotency check failed).
93
+ */
94
+ export declare class DuplicateEventError extends DuplicateEventError_base<{
95
+ readonly eventId: string;
96
+ }> {
97
+ get message(): string;
98
+ }
99
+ declare const TerminateSignal_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
100
+ readonly _tag: "TerminateSignal";
101
+ } & Readonly<A>;
102
+ /**
103
+ * Signal that the job should terminate.
104
+ *
105
+ * Not a true error - used to short-circuit execution from within
106
+ * the execute function via ctx.terminate().
107
+ */
108
+ export declare class TerminateSignal extends TerminateSignal_base<{
109
+ readonly reason: string | undefined;
110
+ readonly purgeState: boolean;
111
+ }> {
112
+ get message(): string;
113
+ }
114
+ import type { StorageError as CoreStorageError, SchedulerError as CoreSchedulerError } from "@durable-effect/core";
115
+ /**
116
+ * Union of all job errors.
117
+ */
118
+ export type JobError = CoreStorageError | CoreSchedulerError | JobNotFoundError | InstanceNotFoundError | InvalidStateError | ValidationError | ExecutionError | RetryExhaustedError | UnknownJobTypeError | DuplicateEventError;
119
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;;;;AAEpE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,sBAEpC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,2BAEzC;IACA,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;;;;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;IACA,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;AAGD,OAAO,KAAK,EACV,YAAY,IAAI,gBAAgB,EAChC,cAAc,IAAI,kBAAkB,EACrC,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,80 @@
1
+ // packages/jobs/src/errors.ts
2
+ import { Data } from "effect";
3
+ // Re-export core errors for convenience
4
+ export { StorageError, SchedulerError } from "@durable-effect/core";
5
+ /**
6
+ * Job type not found in registry.
7
+ */
8
+ export class JobNotFoundError extends Data.TaggedError("JobNotFoundError") {
9
+ get message() {
10
+ return `Job not found: ${this.type}/${this.name}`;
11
+ }
12
+ }
13
+ /**
14
+ * Instance not found (no metadata stored).
15
+ */
16
+ export class InstanceNotFoundError extends Data.TaggedError("InstanceNotFoundError") {
17
+ get message() {
18
+ return `Instance not found: ${this.instanceId}`;
19
+ }
20
+ }
21
+ /**
22
+ * Invalid state transition.
23
+ */
24
+ export class InvalidStateError extends Data.TaggedError("InvalidStateError") {
25
+ get message() {
26
+ return `Invalid state for ${this.operation}: expected ${this.expected}, got ${this.actual}`;
27
+ }
28
+ }
29
+ /**
30
+ * Schema validation failed.
31
+ */
32
+ export class ValidationError extends Data.TaggedError("ValidationError") {
33
+ get message() {
34
+ return `Validation failed for ${this.schemaName}`;
35
+ }
36
+ }
37
+ /**
38
+ * Execution of user function failed.
39
+ */
40
+ export class ExecutionError extends Data.TaggedError("ExecutionError") {
41
+ get message() {
42
+ return `Execution failed for ${this.jobType}/${this.jobName} (${this.instanceId})`;
43
+ }
44
+ }
45
+ /**
46
+ * Retry attempts exhausted (WorkerPool job).
47
+ */
48
+ export class RetryExhaustedError extends Data.TaggedError("RetryExhaustedError") {
49
+ get message() {
50
+ return `Retry exhausted for event ${this.eventId} after ${this.attempts} attempts`;
51
+ }
52
+ }
53
+ /**
54
+ * Unknown job type in request.
55
+ */
56
+ export class UnknownJobTypeError extends Data.TaggedError("UnknownJobTypeError") {
57
+ get message() {
58
+ return `Unknown job type: ${this.type}`;
59
+ }
60
+ }
61
+ /**
62
+ * Duplicate event (idempotency check failed).
63
+ */
64
+ export class DuplicateEventError extends Data.TaggedError("DuplicateEventError") {
65
+ get message() {
66
+ return `Duplicate event: ${this.eventId}`;
67
+ }
68
+ }
69
+ /**
70
+ * Signal that the job should terminate.
71
+ *
72
+ * Not a true error - used to short-circuit execution from within
73
+ * the execute function via ctx.terminate().
74
+ */
75
+ export class TerminateSignal extends Data.TaggedError("TerminateSignal") {
76
+ get message() {
77
+ return `Terminate signal${this.reason ? `: ${this.reason}` : ""}`;
78
+ }
79
+ }
80
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,wCAAwC;AACxC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CACpD,kBAAkB,CAIlB;IACA,IAAI,OAAO;QACT,OAAO,kBAAkB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CACzD,uBAAuB,CAGvB;IACA,IAAI,OAAO;QACT,OAAO,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAC;IAClD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAIzE;IACA,IAAI,OAAO;QACT,OAAO,qBAAqB,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9F,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;IACA,IAAI,OAAO;QACT,OAAO,yBAAyB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAKnE;IACA,IAAI,OAAO;QACT,OAAO,wBAAwB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC;IACrF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAKrB;IACA,IAAI,OAAO;QACT,OAAO,6BAA6B,IAAI,CAAC,OAAO,UAAU,IAAI,CAAC,QAAQ,WAAW,CAAC;IACrF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAGrB;IACA,IAAI,OAAO;QACT,OAAO,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAGrB;IACA,IAAI,OAAO;QACT,OAAO,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5C,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;IACA,IAAI,OAAO;QACT,OAAO,mBAAmB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;CACF"}
@@ -0,0 +1,97 @@
1
+ import { DurableJobsEngine } from "./engine";
2
+ import { type AnyUnregisteredDefinition, type TypedJobRegistry, type RuntimeJobRegistry } from "./registry";
3
+ import { type JobsClientFactory } from "./client";
4
+ /**
5
+ * Result of creating durable jobs.
6
+ */
7
+ export interface CreateDurableJobsResult<T extends Record<string, AnyUnregisteredDefinition>> {
8
+ /**
9
+ * The Durable Object class to export for Cloudflare.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Export in worker entry point
14
+ * export { Jobs };
15
+ * ```
16
+ */
17
+ readonly Jobs: typeof DurableJobsEngine;
18
+ /**
19
+ * Factory for creating typed clients.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const client = JobsClient.fromBinding(env.JOBS);
24
+ * await client.continuous("tokenRefresher").start({ id: "user-123", input: {...} });
25
+ * ```
26
+ */
27
+ readonly JobsClient: JobsClientFactory<TypedJobRegistry<T>>;
28
+ /**
29
+ * The typed job registry with full type information.
30
+ */
31
+ readonly registry: TypedJobRegistry<T>;
32
+ /**
33
+ * Runtime registry for handler use (backwards compatibility).
34
+ */
35
+ readonly runtimeRegistry: RuntimeJobRegistry;
36
+ }
37
+ /**
38
+ * Type alias for backwards compatibility.
39
+ * @deprecated Use TypedJobRegistry directly instead.
40
+ */
41
+ export type InferRegistryFromDefinitions<T extends Record<string, AnyUnregisteredDefinition>> = TypedJobRegistry<T>;
42
+ /**
43
+ * Create a Durable Jobs engine for a set of jobs.
44
+ *
45
+ * This is the main factory function for creating production jobs engines.
46
+ * It returns:
47
+ * - `Jobs`: The Durable Object class to export
48
+ * - `JobsClient`: Factory for creating typed clients
49
+ * - `registry`: The job registry (for advanced use cases)
50
+ *
51
+ * @param definitions - Object of job definitions (keys become job names)
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { Schema } from "effect";
56
+ * import { createDurableJobs, Continuous, Debounce, WorkerPool } from "@durable-effect/jobs";
57
+ *
58
+ * // Define jobs
59
+ * const tokenRefresher = Continuous.make({
60
+ * stateSchema: Schema.Struct({
61
+ * accessToken: Schema.String,
62
+ * refreshToken: Schema.String,
63
+ * expiresAt: Schema.Number,
64
+ * }),
65
+ * schedule: Continuous.every("30 minutes"),
66
+ * execute: (ctx) => Effect.gen(function* () {
67
+ * // Refresh token logic
68
+ * ctx.setState({ ...ctx.state, accessToken: "new_token" });
69
+ * }),
70
+ * });
71
+ *
72
+ * // Create engine and client - keys become job names
73
+ * const { Jobs, JobsClient } = createDurableJobs({
74
+ * tokenRefresher,
75
+ * });
76
+ *
77
+ * // Export for Cloudflare
78
+ * export { Jobs };
79
+ *
80
+ * // Use client in worker
81
+ * export default {
82
+ * async fetch(request: Request, env: Env): Promise<Response> {
83
+ * const client = JobsClient.fromBinding(env.JOBS);
84
+ *
85
+ * // Start continuous job - name comes from object key
86
+ * yield* client.continuous("tokenRefresher").start({
87
+ * id: "user-123",
88
+ * input: { accessToken: "", refreshToken: "rt_abc", expiresAt: 0 },
89
+ * });
90
+ *
91
+ * return new Response("OK");
92
+ * },
93
+ * };
94
+ * ```
95
+ */
96
+ export declare function createDurableJobs<const T extends Record<string, AnyUnregisteredDefinition>>(definitions: T): CreateDurableJobsResult<T>;
97
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AACpE,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,uBAAuB,CACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAEnD;;;;;;;;OAQG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,iBAAiB,CAAC;IAExC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,MAAM,4BAA4B,CACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,IACjD,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAMxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAEzD,WAAW,EAAE,CAAC,GACb,uBAAuB,CAAC,CAAC,CAAC,CAuC5B"}
@@ -0,0 +1,94 @@
1
+ // packages/jobs/src/factory.ts
2
+ import { Context } from "effect";
3
+ import { DurableJobsEngine } from "./engine";
4
+ import { createTypedJobRegistry, toRuntimeRegistry, } from "./registry";
5
+ import { createJobsClient, } from "./client";
6
+ // =============================================================================
7
+ // Factory Function
8
+ // =============================================================================
9
+ /**
10
+ * Create a Durable Jobs engine for a set of jobs.
11
+ *
12
+ * This is the main factory function for creating production jobs engines.
13
+ * It returns:
14
+ * - `Jobs`: The Durable Object class to export
15
+ * - `JobsClient`: Factory for creating typed clients
16
+ * - `registry`: The job registry (for advanced use cases)
17
+ *
18
+ * @param definitions - Object of job definitions (keys become job names)
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import { Schema } from "effect";
23
+ * import { createDurableJobs, Continuous, Debounce, WorkerPool } from "@durable-effect/jobs";
24
+ *
25
+ * // Define jobs
26
+ * const tokenRefresher = Continuous.make({
27
+ * stateSchema: Schema.Struct({
28
+ * accessToken: Schema.String,
29
+ * refreshToken: Schema.String,
30
+ * expiresAt: Schema.Number,
31
+ * }),
32
+ * schedule: Continuous.every("30 minutes"),
33
+ * execute: (ctx) => Effect.gen(function* () {
34
+ * // Refresh token logic
35
+ * ctx.setState({ ...ctx.state, accessToken: "new_token" });
36
+ * }),
37
+ * });
38
+ *
39
+ * // Create engine and client - keys become job names
40
+ * const { Jobs, JobsClient } = createDurableJobs({
41
+ * tokenRefresher,
42
+ * });
43
+ *
44
+ * // Export for Cloudflare
45
+ * export { Jobs };
46
+ *
47
+ * // Use client in worker
48
+ * export default {
49
+ * async fetch(request: Request, env: Env): Promise<Response> {
50
+ * const client = JobsClient.fromBinding(env.JOBS);
51
+ *
52
+ * // Start continuous job - name comes from object key
53
+ * yield* client.continuous("tokenRefresher").start({
54
+ * id: "user-123",
55
+ * input: { accessToken: "", refreshToken: "rt_abc", expiresAt: 0 },
56
+ * });
57
+ *
58
+ * return new Response("OK");
59
+ * },
60
+ * };
61
+ * ```
62
+ */
63
+ export function createDurableJobs(definitions) {
64
+ // Create typed registry from definitions (preserves literal keys)
65
+ const registry = createTypedJobRegistry(definitions);
66
+ // Create runtime registry for handlers (uses object lookup)
67
+ const runtimeRegistry = toRuntimeRegistry(registry);
68
+ // Create bound DO class with runtime registry injected
69
+ class BoundJobsEngine extends DurableJobsEngine {
70
+ constructor(state, env) {
71
+ // Inject runtime registry into environment
72
+ const enrichedEnv = {
73
+ ...env,
74
+ __JOB_REGISTRY__: runtimeRegistry,
75
+ };
76
+ super(state, enrichedEnv);
77
+ }
78
+ }
79
+ // Create Effect Tag for the client
80
+ const ClientTag = Context.GenericTag("@durable-effect/jobs/Client");
81
+ // Create client factory - no phantom type cast needed!
82
+ // The registry already has __definitions as a real property
83
+ const JobsClientFactory = {
84
+ fromBinding: (binding) => createJobsClient(binding, registry),
85
+ Tag: ClientTag,
86
+ };
87
+ return {
88
+ Jobs: BoundJobsEngine,
89
+ JobsClient: JobsClientFactory,
90
+ registry,
91
+ runtimeRegistry,
92
+ };
93
+ }
94
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AACpE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAIlB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,GAGjB,MAAM,UAAU,CAAC;AAiDlB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,iBAAiB,CAG/B,WAAc;IAEd,kEAAkE;IAClE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAErD,4DAA4D;IAC5D,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEpD,uDAAuD;IACvD,MAAM,eAAgB,SAAQ,iBAAiB;QAC7C,YAAY,KAAyB,EAAE,GAAY;YACjD,2CAA2C;YAC3C,MAAM,WAAW,GAAqB;gBACpC,GAAI,GAAc;gBAClB,gBAAgB,EAAE,eAAe;aAClC,CAAC;YAEF,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5B,CAAC;KACF;IAED,mCAAmC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAElC,6BAA6B,CAAC,CAAC;IAEjC,uDAAuD;IACvD,4DAA4D;IAC5D,MAAM,iBAAiB,GAA2C;QAChE,WAAW,EAAE,CAAC,OAA+B,EAAE,EAAE,CAC/C,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;QACrC,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,eAA2C;QACjD,UAAU,EAAE,iBAAiB;QAC7B,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ContinuousContext } from "../../registry/types";
2
+ /**
3
+ * State holder for mutable state updates during execution.
4
+ *
5
+ * The context provides setState/updateState methods that modify this holder.
6
+ * After execution, we read the final state from here.
7
+ */
8
+ export interface StateHolder<S> {
9
+ current: S;
10
+ dirty: boolean;
11
+ }
12
+ /**
13
+ * Create a ContinuousContext for user's execute function.
14
+ *
15
+ * The context provides:
16
+ * - state: Current state (read-only reference)
17
+ * - setState: Replace entire state
18
+ * - updateState: Update state via function
19
+ * - terminate: Terminate this job instance
20
+ * - instanceId: DO instance identifier
21
+ * - runCount: Number of times execute has been called
22
+ * - jobName: Name of the job
23
+ */
24
+ export declare function createContinuousContext<S>(stateHolder: StateHolder<S>, instanceId: string, runCount: number, jobName: string, attempt?: number): ContinuousContext<S>;
25
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,sBAAsB,CAAC;AAOhF;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAU,GAClB,iBAAiB,CAAC,CAAC,CAAC,CA8BtB"}
@@ -0,0 +1,38 @@
1
+ // packages/jobs/src/handlers/continuous/context.ts
2
+ import { Effect } from "effect";
3
+ import { TerminateSignal } from "../../errors";
4
+ /**
5
+ * Create a ContinuousContext for user's execute function.
6
+ *
7
+ * The context provides:
8
+ * - state: Current state (read-only reference)
9
+ * - setState: Replace entire state
10
+ * - updateState: Update state via function
11
+ * - terminate: Terminate this job instance
12
+ * - instanceId: DO instance identifier
13
+ * - runCount: Number of times execute has been called
14
+ * - jobName: Name of the job
15
+ */
16
+ export function createContinuousContext(stateHolder, instanceId, runCount, jobName, attempt = 1) {
17
+ return {
18
+ state: Effect.sync(() => stateHolder.current),
19
+ setState: (newState) => Effect.sync(() => {
20
+ stateHolder.current = newState;
21
+ stateHolder.dirty = true;
22
+ }),
23
+ updateState: (fn) => Effect.sync(() => {
24
+ stateHolder.current = fn(stateHolder.current);
25
+ stateHolder.dirty = true;
26
+ }),
27
+ instanceId,
28
+ runCount,
29
+ jobName,
30
+ attempt,
31
+ isRetry: attempt > 1,
32
+ terminate: (options) => Effect.fail(new TerminateSignal({
33
+ reason: options?.reason,
34
+ purgeState: true,
35
+ })),
36
+ };
37
+ }
38
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/handlers/continuous/context.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAiB/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAA2B,EAC3B,UAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,UAAkB,CAAC;IAEnB,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;QAE7C,QAAQ,EAAE,CAAC,QAAW,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;YAC/B,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEJ,WAAW,EAAE,CAAC,EAAqB,EAAE,EAAE,CACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;QAEJ,UAAU;QACV,QAAQ;QACR,OAAO;QACP,OAAO;QACP,OAAO,EAAE,OAAO,GAAG,CAAC;QAEpB,SAAS,EAAE,CAAC,OAA0B,EAAE,EAAE,CACxC,MAAM,CAAC,IAAI,CACT,IAAI,eAAe,CAAC;YAClB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,UAAU,EAAE,IAAI;SACjB,CAAC,CACmC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Effect } from "effect";
2
+ import type { ContinuousDefinition } from "../../registry/types";
3
+ import type { EntityStateServiceI } from "../../services/entity-state";
4
+ import { type PrimitiveError } from "../../errors";
5
+ /**
6
+ * @deprecated Use the inline executeUserFunction in handler.ts instead.
7
+ * This function is kept for backwards compatibility with existing tests.
8
+ */
9
+ export declare function executeUserFunction<S>(def: ContinuousDefinition<S, unknown, never>, stateService: EntityStateServiceI<S>, instanceId: string, runCount: number): Effect.Effect<S | null, PrimitiveError>;
10
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/executor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAC5C,YAAY,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,cAAc,CAAC,CAsFzC"}
@@ -0,0 +1,83 @@
1
+ // packages/jobs/src/handlers/continuous/executor.ts
2
+ //
3
+ // NOTE: The execution logic has been moved directly into handler.ts
4
+ // as the executeUserFunction helper. This file is kept for backwards
5
+ // compatibility with tests but the implementation is deprecated.
6
+ //
7
+ // The inline implementation in handler.ts:
8
+ // - Uses proper Effect patterns (catchAll, Effect.try)
9
+ // - Has better error handling
10
+ // - Avoids the matchEffect anti-pattern
11
+ //
12
+ // This file can be removed once tests are updated.
13
+ import { Effect } from "effect";
14
+ import { ExecutionError } from "../../errors";
15
+ import { createContinuousContext } from "./context";
16
+ /**
17
+ * @deprecated Use the inline executeUserFunction in handler.ts instead.
18
+ * This function is kept for backwards compatibility with existing tests.
19
+ */
20
+ export function executeUserFunction(def, stateService, instanceId, runCount) {
21
+ const primitiveName = def.name;
22
+ return Effect.gen(function* () {
23
+ // Get current state
24
+ const currentState = yield* stateService.get().pipe(Effect.mapError((e) => new ExecutionError({
25
+ primitiveType: "continuous",
26
+ primitiveName,
27
+ instanceId,
28
+ cause: e,
29
+ })));
30
+ if (currentState === null) {
31
+ return null;
32
+ }
33
+ // Create mutable state holder
34
+ const stateHolder = {
35
+ current: currentState,
36
+ dirty: false,
37
+ };
38
+ // Create context for user function
39
+ const ctx = createContinuousContext(stateHolder, instanceId, runCount, def.name);
40
+ // Execute user function with error handling
41
+ yield* Effect.try({
42
+ try: () => def.execute(ctx),
43
+ catch: (e) => new ExecutionError({
44
+ primitiveType: "continuous",
45
+ primitiveName: def.name,
46
+ instanceId,
47
+ cause: e,
48
+ }),
49
+ }).pipe(Effect.flatten, Effect.catchAll((error) => {
50
+ if (def.onError) {
51
+ return Effect.try({
52
+ try: () => def.onError(error, ctx),
53
+ catch: (e) => new ExecutionError({
54
+ primitiveType: "continuous",
55
+ primitiveName: def.name,
56
+ instanceId,
57
+ cause: e,
58
+ }),
59
+ }).pipe(Effect.flatten, Effect.asVoid);
60
+ }
61
+ return Effect.fail(error instanceof ExecutionError
62
+ ? error
63
+ : new ExecutionError({
64
+ primitiveType: "continuous",
65
+ primitiveName: def.name,
66
+ instanceId,
67
+ cause: error,
68
+ }));
69
+ }));
70
+ // Persist state if modified
71
+ if (stateHolder.dirty) {
72
+ yield* stateService.set(stateHolder.current).pipe(Effect.mapError((e) => new ExecutionError({
73
+ primitiveType: "continuous",
74
+ primitiveName: def.name,
75
+ instanceId,
76
+ cause: e,
77
+ })));
78
+ return stateHolder.current;
79
+ }
80
+ return null;
81
+ });
82
+ }
83
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/handlers/continuous/executor.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,iEAAiE;AACjE,EAAE;AACF,2CAA2C;AAC3C,uDAAuD;AACvD,8BAA8B;AAC9B,wCAAwC;AACxC,EAAE;AACF,mDAAmD;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAoB,MAAM,WAAW,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA4C,EAC5C,YAAoC,EACpC,UAAkB,EAClB,QAAgB;IAEhB,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC;IAE/B,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,oBAAoB;QACpB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CACjD,MAAM,CAAC,QAAQ,CACb,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,cAAc,CAAC;YACjB,aAAa,EAAE,YAAY;YAC3B,aAAa;YACb,UAAU;YACV,KAAK,EAAE,CAAC;SACT,CAAC,CACL,CACF,CAAC;QAEF,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAAmB;YAClC,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,mCAAmC;QACnC,MAAM,GAAG,GAAG,uBAAuB,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAEjF,4CAA4C;QAC5C,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,cAAc,CAAC;gBACjB,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,GAAG,CAAC,IAAI;gBACvB,UAAU;gBACV,KAAK,EAAE,CAAC;aACT,CAAC;SACL,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC,GAAG,CAAC;oBAChB,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;oBACnC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,cAAc,CAAC;wBACjB,aAAa,EAAE,YAAY;wBAC3B,aAAa,EAAE,GAAG,CAAC,IAAI;wBACvB,UAAU;wBACV,KAAK,EAAE,CAAC;qBACT,CAAC;iBACL,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAChB,KAAK,YAAY,cAAc;gBAC7B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,cAAc,CAAC;oBACjB,aAAa,EAAE,YAAY;oBAC3B,aAAa,EAAE,GAAG,CAAC,IAAI;oBACvB,UAAU;oBACV,KAAK,EAAE,KAAK;iBACb,CAAC,CACP,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,4BAA4B;QAC5B,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/C,MAAM,CAAC,QAAQ,CACb,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,cAAc,CAAC;gBACjB,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,GAAG,CAAC,IAAI;gBACvB,UAAU;gBACV,KAAK,EAAE,CAAC;aACT,CAAC,CACL,CACF,CAAC;YACF,OAAO,WAAW,CAAC,OAAO,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Context, Layer } from "effect";
2
+ import { RuntimeAdapter, StorageAdapter } from "@durable-effect/core";
3
+ import { MetadataService } from "../../services/metadata";
4
+ import { AlarmService } from "../../services/alarm";
5
+ import { RegistryService } from "../../services/registry";
6
+ import { JobExecutionService } from "../../services/execution";
7
+ import { RetryExecutor } from "../../retry";
8
+ import type { ContinuousHandlerI } from "./types";
9
+ declare const ContinuousHandler_base: Context.TagClass<ContinuousHandler, "@durable-effect/jobs/ContinuousHandler", ContinuousHandlerI>;
10
+ export declare class ContinuousHandler extends ContinuousHandler_base {
11
+ }
12
+ export declare const ContinuousHandlerLayer: Layer.Layer<ContinuousHandler, never, MetadataService | RuntimeAdapter | StorageAdapter | AlarmService | RegistryService | RetryExecutor | JobExecutionService>;
13
+ export {};
14
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/continuous/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EACL,cAAc,EACd,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAwB,MAAM,0BAA0B,CAAC;AAOrF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,SAAS,CAAC;;AAGtE,qBAAa,iBAAkB,SAAQ,sBAEG;CAAG;AAI7C,eAAO,MAAM,sBAAsB,iKAsYlC,CAAC"}