@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,92 @@
1
+ // packages/jobs/src/client/response.ts
2
+ import { Effect } from "effect";
3
+ /**
4
+ * Create a JobCallError.
5
+ */
6
+ export const jobCallError = (cause) => ({
7
+ _tag: "JobCallError",
8
+ cause,
9
+ });
10
+ // =============================================================================
11
+ // Response Narrowing
12
+ // =============================================================================
13
+ /**
14
+ * Runtime error for unexpected response types.
15
+ */
16
+ export class UnexpectedResponseError extends Error {
17
+ _tag = "UnexpectedResponseError";
18
+ expected;
19
+ actual;
20
+ constructor(expected, actual) {
21
+ super(`Expected response type "${expected}" but received "${actual}"`);
22
+ this.name = "UnexpectedResponseError";
23
+ this.expected = expected;
24
+ this.actual = actual;
25
+ }
26
+ }
27
+ /**
28
+ * Type guard to check if a response has a specific _type.
29
+ */
30
+ export function isResponseType(response, expectedType) {
31
+ return response._type === expectedType;
32
+ }
33
+ /**
34
+ * Narrow a response to a specific type with runtime validation.
35
+ *
36
+ * This provides both compile-time type safety AND runtime validation,
37
+ * unlike raw type casts which only provide compile-time types.
38
+ *
39
+ * @throws UnexpectedResponseError if the response type doesn't match
40
+ */
41
+ export function narrowResponse(response, expectedType) {
42
+ if (isResponseType(response, expectedType)) {
43
+ return response;
44
+ }
45
+ throw new UnexpectedResponseError(expectedType, response._type);
46
+ }
47
+ /**
48
+ * Narrow a Promise<JobResponse> to a specific type.
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const response = await narrowResponseAsync(
53
+ * stub.call({ type: "continuous", action: "start", ... }),
54
+ * "continuous.start"
55
+ * );
56
+ * // response is typed as ContinuousStartResponse
57
+ * ```
58
+ */
59
+ export async function narrowResponseAsync(promise, expectedType) {
60
+ const response = await promise;
61
+ return narrowResponse(response, expectedType);
62
+ }
63
+ // =============================================================================
64
+ // Effect-based Response Narrowing
65
+ // =============================================================================
66
+ /**
67
+ * Narrow a Promise<JobResponse> to a specific type, returning an Effect.
68
+ *
69
+ * This is the Effect-based version that properly handles errors and can be used
70
+ * with Effect.gen and yield*.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * const response = yield* narrowResponseEffect(
75
+ * stub.call({ type: "continuous", action: "start", ... }),
76
+ * "continuous.start"
77
+ * );
78
+ * // response is typed as ContinuousStartResponse
79
+ * ```
80
+ */
81
+ export function narrowResponseEffect(promise, expectedType) {
82
+ return Effect.tryPromise({
83
+ try: () => promise,
84
+ catch: (error) => jobCallError(error),
85
+ }).pipe(Effect.flatMap((response) => {
86
+ if (isResponseType(response, expectedType)) {
87
+ return Effect.succeed(response);
88
+ }
89
+ return Effect.fail(new UnexpectedResponseError(expectedType, response._type));
90
+ }));
91
+ }
92
+ //# sourceMappingURL=response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/client/response.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAsChC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAgB,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,cAAc;IACpB,KAAK;CACN,CAAC,CAAC;AAsCH,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,IAAI,GAAG,yBAAyB,CAAC;IACjC,QAAQ,CAAe;IACvB,MAAM,CAAS;IAExB,YAAY,QAAsB,EAAE,MAAc;QAChD,KAAK,CAAC,2BAA2B,QAAQ,mBAAmB,MAAM,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAqB,EACrB,YAAe;IAEf,OAAO,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAqB,EACrB,YAAe;IAEf,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA6B,EAC7B,YAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;IAC/B,OAAO,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAWD,gFAAgF;AAChF,kCAAkC;AAClC,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA6B,EAC7B,YAAe;IAEf,OAAO,MAAM,CAAC,UAAU,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;KACtC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1B,IAAI,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,uBAAuB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAC1D,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,242 @@
1
+ import type { Context, Effect } from "effect";
2
+ import type { TypedJobRegistry, ContinuousKeysOf, DebounceKeysOf, WorkerPoolKeysOf, ContinuousStateOf, DebounceEventOf, DebounceStateOf, WorkerPoolEventOf } from "../registry/typed";
3
+ import type { ContinuousStartResponse, ContinuousTerminateResponse, ContinuousTriggerResponse, ContinuousStatusResponse, ContinuousGetStateResponse, DebounceAddResponse, DebounceFlushResponse, DebounceClearResponse, DebounceStatusResponse, DebounceGetStateResponse, WorkerPoolEnqueueResponse, WorkerPoolPauseResponse, WorkerPoolResumeResponse, WorkerPoolCancelResponse, WorkerPoolStatusResponse, WorkerPoolDrainResponse } from "../runtime/types";
4
+ import type { UnexpectedResponseError, JobCallError } from "./response";
5
+ import type { TaskSendResponse, TaskTriggerResponse, TaskTerminateResponse, TaskStatusResponse, TaskGetStateResponse } from "../runtime/types";
6
+ import type { TaskKeysOf, TaskStateOf, TaskEventOf } from "../registry/typed";
7
+ /**
8
+ * Combined error type for client operations.
9
+ */
10
+ export type ClientError = JobCallError | UnexpectedResponseError;
11
+ export type { JobCallError, UnexpectedResponseError };
12
+ /**
13
+ * Type-safe client for continuous jobs.
14
+ */
15
+ export interface ContinuousClient<S> {
16
+ /**
17
+ * Start the continuous job with initial state.
18
+ *
19
+ * If the instance already exists, returns its current status.
20
+ */
21
+ start(options: {
22
+ readonly id: string;
23
+ readonly input: S;
24
+ }): Effect.Effect<ContinuousStartResponse, ClientError>;
25
+ /**
26
+ * Terminate the continuous job.
27
+ *
28
+ * This fully removes the job - cancels the alarm and deletes all state.
29
+ * After termination, the same ID can be used to start a fresh instance.
30
+ */
31
+ terminate(id: string, options?: {
32
+ readonly reason?: string;
33
+ }): Effect.Effect<ContinuousTerminateResponse, ClientError>;
34
+ /**
35
+ * Trigger immediate execution (bypass schedule).
36
+ */
37
+ trigger(id: string): Effect.Effect<ContinuousTriggerResponse, ClientError>;
38
+ /**
39
+ * Get current status.
40
+ */
41
+ status(id: string): Effect.Effect<ContinuousStatusResponse, ClientError>;
42
+ /**
43
+ * Get current state.
44
+ */
45
+ getState(id: string): Effect.Effect<ContinuousGetStateResponse, ClientError>;
46
+ }
47
+ /**
48
+ * Type-safe client for debounce jobs.
49
+ */
50
+ export interface DebounceClient<I, S> {
51
+ /**
52
+ * Add an event to the debounce.
53
+ *
54
+ * Creates the debounce if it doesn't exist.
55
+ * The id serves as both instance identifier and idempotency key.
56
+ */
57
+ add(options: {
58
+ readonly id: string;
59
+ readonly event: I;
60
+ }): Effect.Effect<DebounceAddResponse, ClientError>;
61
+ /**
62
+ * Manually flush the debounce.
63
+ */
64
+ flush(id: string): Effect.Effect<DebounceFlushResponse, ClientError>;
65
+ /**
66
+ * Clear the debounce without processing.
67
+ */
68
+ clear(id: string): Effect.Effect<DebounceClearResponse, ClientError>;
69
+ /**
70
+ * Get current status.
71
+ */
72
+ status(id: string): Effect.Effect<DebounceStatusResponse, ClientError>;
73
+ /**
74
+ * Get current accumulated state.
75
+ */
76
+ getState(id: string): Effect.Effect<DebounceGetStateResponse, ClientError>;
77
+ }
78
+ /**
79
+ * Type-safe client for workerPool jobs.
80
+ */
81
+ export interface WorkerPoolClient<E> {
82
+ /**
83
+ * Enqueue an event for processing.
84
+ *
85
+ * @param options.id - Unique event ID for idempotency
86
+ * @param options.event - The event data
87
+ * @param options.partitionKey - Optional partition key for routing
88
+ * @param options.priority - Optional priority (higher = processed first)
89
+ */
90
+ enqueue(options: {
91
+ readonly id: string;
92
+ readonly event: E;
93
+ readonly partitionKey?: string;
94
+ readonly priority?: number;
95
+ }): Effect.Effect<WorkerPoolEnqueueResponse, ClientError>;
96
+ /**
97
+ * Pause processing on all or specific instance.
98
+ */
99
+ pause(instanceIndex?: number): Effect.Effect<WorkerPoolPauseResponse, ClientError>;
100
+ /**
101
+ * Resume processing on all or specific instance.
102
+ */
103
+ resume(instanceIndex?: number): Effect.Effect<WorkerPoolResumeResponse, ClientError>;
104
+ /**
105
+ * Cancel a pending event.
106
+ */
107
+ cancel(eventId: string): Effect.Effect<WorkerPoolCancelResponse, ClientError>;
108
+ /**
109
+ * Get aggregated status across all instances.
110
+ */
111
+ status(): Effect.Effect<WorkerPoolAggregatedStatus, ClientError>;
112
+ /**
113
+ * Get status for a specific instance.
114
+ */
115
+ instanceStatus(instanceIndex: number): Effect.Effect<WorkerPoolStatusResponse, ClientError>;
116
+ /**
117
+ * Drain all pending events (cancel and cleanup).
118
+ */
119
+ drain(instanceIndex?: number): Effect.Effect<WorkerPoolDrainResponse, ClientError>;
120
+ }
121
+ /**
122
+ * Aggregated workerPool status across all instances.
123
+ */
124
+ export interface WorkerPoolAggregatedStatus {
125
+ readonly instances: WorkerPoolStatusResponse[];
126
+ readonly totalPending: number;
127
+ readonly totalProcessed: number;
128
+ readonly activeInstances: number;
129
+ readonly pausedInstances: number;
130
+ }
131
+ /**
132
+ * Type-safe client for task jobs.
133
+ */
134
+ export interface TaskClient<S, E> {
135
+ /**
136
+ * Send an event to a task instance.
137
+ * Creates the instance if it doesn't exist.
138
+ */
139
+ send(options: {
140
+ readonly id: string;
141
+ readonly event: E;
142
+ }): Effect.Effect<TaskSendResponse, ClientError>;
143
+ /**
144
+ * Manually trigger execution.
145
+ */
146
+ trigger(id: string): Effect.Effect<TaskTriggerResponse, ClientError>;
147
+ /**
148
+ * Terminate task immediately (delete all state + cancel alarms).
149
+ */
150
+ terminate(id: string): Effect.Effect<TaskTerminateResponse, ClientError>;
151
+ /**
152
+ * Get current status.
153
+ */
154
+ status(id: string): Effect.Effect<TaskStatusResponse, ClientError>;
155
+ /**
156
+ * Get current state.
157
+ */
158
+ getState(id: string): Effect.Effect<TaskGetStateResponse, ClientError>;
159
+ }
160
+ /**
161
+ * The jobs client providing access to all registered jobs.
162
+ *
163
+ * Now uses TypedJobRegistry which preserves literal keys via the __definitions property.
164
+ */
165
+ export interface JobsClient<R extends TypedJobRegistry<any>> {
166
+ /**
167
+ * Get a typed client for a continuous job.
168
+ */
169
+ continuous<K extends ContinuousKeys<R>>(name: K): ContinuousClient<ContinuousStateType<R, K>>;
170
+ /**
171
+ * Get a typed client for a debounce job.
172
+ */
173
+ debounce<K extends DebounceKeys<R>>(name: K): DebounceClient<DebounceEventType<R, K>, DebounceStateType<R, K>>;
174
+ /**
175
+ * Get a typed client for a workerPool job.
176
+ */
177
+ workerPool<K extends WorkerPoolKeys<R>>(name: K): WorkerPoolClient<WorkerPoolEventType<R, K>>;
178
+ /**
179
+ * Get a typed client for a task job.
180
+ */
181
+ task<K extends TaskKeys<R>>(name: K): TaskClient<TaskStateType<R, K>, TaskEventType<R, K>>;
182
+ }
183
+ /**
184
+ * Factory for creating jobs clients.
185
+ */
186
+ export interface JobsClientFactory<R extends TypedJobRegistry<any>> {
187
+ /**
188
+ * Create a client from a Durable Object binding.
189
+ */
190
+ fromBinding(binding: DurableObjectNamespace): JobsClient<R>;
191
+ /**
192
+ * Effect Tag for using the client as a service.
193
+ */
194
+ Tag: Context.Tag<JobsClient<R>, JobsClient<R>>;
195
+ }
196
+ /**
197
+ * Extract the definitions type from a TypedJobRegistry.
198
+ */
199
+ type DefinitionsOf<R extends TypedJobRegistry<any>> = R extends TypedJobRegistry<infer T> ? T : never;
200
+ /**
201
+ * Extract continuous job keys from registry.
202
+ *
203
+ * Simplified: directly uses ContinuousKeysOf from the __definitions type.
204
+ */
205
+ export type ContinuousKeys<R extends TypedJobRegistry<any>> = ContinuousKeysOf<DefinitionsOf<R>>;
206
+ /**
207
+ * Extract debounce job keys from registry.
208
+ */
209
+ export type DebounceKeys<R extends TypedJobRegistry<any>> = DebounceKeysOf<DefinitionsOf<R>>;
210
+ /**
211
+ * Extract workerPool job keys from registry.
212
+ */
213
+ export type WorkerPoolKeys<R extends TypedJobRegistry<any>> = WorkerPoolKeysOf<DefinitionsOf<R>>;
214
+ /**
215
+ * Extract task job keys from registry.
216
+ */
217
+ export type TaskKeys<R extends TypedJobRegistry<any>> = TaskKeysOf<DefinitionsOf<R>>;
218
+ /**
219
+ * Extract state type from continuous definition.
220
+ */
221
+ export type ContinuousStateType<R extends TypedJobRegistry<any>, K extends ContinuousKeys<R>> = ContinuousStateOf<DefinitionsOf<R>, K>;
222
+ /**
223
+ * Extract event type from debounce definition.
224
+ */
225
+ export type DebounceEventType<R extends TypedJobRegistry<any>, K extends DebounceKeys<R>> = DebounceEventOf<DefinitionsOf<R>, K>;
226
+ /**
227
+ * Extract state type from debounce definition.
228
+ */
229
+ export type DebounceStateType<R extends TypedJobRegistry<any>, K extends DebounceKeys<R>> = DebounceStateOf<DefinitionsOf<R>, K>;
230
+ /**
231
+ * Extract event type from workerPool definition.
232
+ */
233
+ export type WorkerPoolEventType<R extends TypedJobRegistry<any>, K extends WorkerPoolKeys<R>> = WorkerPoolEventOf<DefinitionsOf<R>, K>;
234
+ /**
235
+ * Extract state type from task definition.
236
+ */
237
+ export type TaskStateType<R extends TypedJobRegistry<any>, K extends TaskKeys<R>> = TaskStateOf<DefinitionsOf<R>, K>;
238
+ /**
239
+ * Extract event type from task definition.
240
+ */
241
+ export type TaskEventType<R extends TypedJobRegistry<any>, K extends TaskKeys<R>> = TaskEventOf<DefinitionsOf<R>, K>;
242
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // packages/jobs/src/client/types.ts
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,oCAAoC"}
@@ -0,0 +1,110 @@
1
+ import { Duration, type Effect, type Schema } from "effect";
2
+ import type { UnregisteredContinuousDefinition, ContinuousSchedule, ContinuousContext } from "../registry/types";
3
+ import type { JobRetryConfig } from "../retry/types";
4
+ /**
5
+ * Input config for creating a continuous job definition.
6
+ */
7
+ export interface ContinuousMakeConfig<S, E, R> {
8
+ /**
9
+ * Schema for validating and serializing state.
10
+ * Accepts any Effect Schema (Struct, Class, etc.)
11
+ */
12
+ readonly stateSchema: Schema.Schema<S, any, never>;
13
+ /**
14
+ * Schedule for when to execute.
15
+ */
16
+ readonly schedule: ContinuousSchedule;
17
+ /**
18
+ * Whether to execute immediately on start.
19
+ * @default true
20
+ */
21
+ readonly startImmediately?: boolean;
22
+ /**
23
+ * Optional retry configuration for execute handler failures.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { Backoff } from "@durable-effect/core";
28
+ *
29
+ * retry: {
30
+ * maxAttempts: 3,
31
+ * delay: Backoff.exponential({ base: "1 second", max: "30 seconds" }),
32
+ * isRetryable: (error) => error._tag !== "FatalError",
33
+ * }
34
+ * ```
35
+ */
36
+ readonly retry?: JobRetryConfig;
37
+ /**
38
+ * The function to execute on schedule.
39
+ */
40
+ execute(ctx: ContinuousContext<S>): Effect.Effect<void, E, R>;
41
+ }
42
+ /**
43
+ * Namespace for creating continuous job definitions.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * import { Continuous } from "@durable-effect/jobs";
48
+ * import { Schema } from "effect";
49
+ *
50
+ * const dailyReport = Continuous.make({
51
+ * stateSchema: Schema.Struct({
52
+ * lastReportDate: Schema.DateFromSelf,
53
+ * totalReports: Schema.Number,
54
+ * }),
55
+ * schedule: Continuous.every("24 hours"),
56
+ * execute: (ctx) =>
57
+ * Effect.gen(function* () {
58
+ * console.log(`Generating report #${ctx.runCount}`);
59
+ * ctx.updateState((s) => ({
60
+ * ...s,
61
+ * lastReportDate: new Date(),
62
+ * totalReports: s.totalReports + 1,
63
+ * }));
64
+ * }),
65
+ * });
66
+ *
67
+ * // Register with createDurableJobs - name comes from key
68
+ * const { Jobs } = createDurableJobs({ dailyReport });
69
+ * ```
70
+ */
71
+ export declare const Continuous: {
72
+ /**
73
+ * Create a continuous job definition.
74
+ *
75
+ * The name is NOT provided here - it comes from the key when you
76
+ * register the job via createDurableJobs().
77
+ *
78
+ * @param config - Configuration for the job
79
+ * @returns An UnregisteredContinuousDefinition that can be registered
80
+ */
81
+ readonly make: <S, E = never, R = never>(config: ContinuousMakeConfig<S, E, R>) => UnregisteredContinuousDefinition<S, E, R>;
82
+ /**
83
+ * Create a schedule that executes at a fixed interval.
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * Continuous.every("30 minutes")
88
+ * Continuous.every(Duration.hours(1))
89
+ * ```
90
+ */
91
+ readonly every: (interval: Duration.DurationInput) => ContinuousSchedule;
92
+ /**
93
+ * Create a schedule based on a cron expression.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * // Every day at midnight
98
+ * Continuous.cron("0 0 * * *")
99
+ *
100
+ * // Every Monday at 9am
101
+ * Continuous.cron("0 9 * * 1")
102
+ * ```
103
+ */
104
+ readonly cron: (expression: string) => ContinuousSchedule;
105
+ };
106
+ /**
107
+ * Type alias for the Continuous namespace.
108
+ */
109
+ export type ContinuousNamespace = typeof Continuous;
110
+ //# sourceMappingURL=continuous.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuous.d.ts","sourceRoot":"","sources":["../../src/definitions/continuous.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAE/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,UAAU;IACrB;;;;;;;;OAQG;oBACI,CAAC,EAAE,CAAC,UAAU,CAAC,kBACZ,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACpC,gCAAgC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAS5C;;;;;;;;OAQG;+BACe,QAAQ,CAAC,aAAa,KAAG,kBAAkB;IAK7D;;;;;;;;;;;OAWG;gCACgB,MAAM,KAAG,kBAAkB;CAItC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,UAAU,CAAC"}
@@ -0,0 +1,79 @@
1
+ // packages/jobs/src/definitions/continuous.ts
2
+ /**
3
+ * Namespace for creating continuous job definitions.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { Continuous } from "@durable-effect/jobs";
8
+ * import { Schema } from "effect";
9
+ *
10
+ * const dailyReport = Continuous.make({
11
+ * stateSchema: Schema.Struct({
12
+ * lastReportDate: Schema.DateFromSelf,
13
+ * totalReports: Schema.Number,
14
+ * }),
15
+ * schedule: Continuous.every("24 hours"),
16
+ * execute: (ctx) =>
17
+ * Effect.gen(function* () {
18
+ * console.log(`Generating report #${ctx.runCount}`);
19
+ * ctx.updateState((s) => ({
20
+ * ...s,
21
+ * lastReportDate: new Date(),
22
+ * totalReports: s.totalReports + 1,
23
+ * }));
24
+ * }),
25
+ * });
26
+ *
27
+ * // Register with createDurableJobs - name comes from key
28
+ * const { Jobs } = createDurableJobs({ dailyReport });
29
+ * ```
30
+ */
31
+ export const Continuous = {
32
+ /**
33
+ * Create a continuous job definition.
34
+ *
35
+ * The name is NOT provided here - it comes from the key when you
36
+ * register the job via createDurableJobs().
37
+ *
38
+ * @param config - Configuration for the job
39
+ * @returns An UnregisteredContinuousDefinition that can be registered
40
+ */
41
+ make: (config) => ({
42
+ _tag: "ContinuousDefinition",
43
+ stateSchema: config.stateSchema,
44
+ schedule: config.schedule,
45
+ startImmediately: config.startImmediately,
46
+ retry: config.retry,
47
+ execute: config.execute,
48
+ }),
49
+ /**
50
+ * Create a schedule that executes at a fixed interval.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * Continuous.every("30 minutes")
55
+ * Continuous.every(Duration.hours(1))
56
+ * ```
57
+ */
58
+ every: (interval) => ({
59
+ _tag: "Every",
60
+ interval,
61
+ }),
62
+ /**
63
+ * Create a schedule based on a cron expression.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * // Every day at midnight
68
+ * Continuous.cron("0 0 * * *")
69
+ *
70
+ * // Every Monday at 9am
71
+ * Continuous.cron("0 9 * * 1")
72
+ * ```
73
+ */
74
+ cron: (expression) => ({
75
+ _tag: "Cron",
76
+ expression,
77
+ }),
78
+ };
79
+ //# sourceMappingURL=continuous.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuous.js","sourceRoot":"","sources":["../../src/definitions/continuous.ts"],"names":[],"mappings":"AAAA,8CAA8C;AA0D9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;;;;;;OAQG;IACH,IAAI,EAAE,CACJ,MAAqC,EACM,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;IAEF;;;;;;;;OAQG;IACH,KAAK,EAAE,CAAC,QAAgC,EAAsB,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,OAAO;QACb,QAAQ;KACT,CAAC;IAEF;;;;;;;;;;;OAWG;IACH,IAAI,EAAE,CAAC,UAAkB,EAAsB,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,MAAM;QACZ,UAAU;KACX,CAAC;CACM,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { Duration, Effect, type Schema } from "effect";
2
+ import type { UnregisteredDebounceDefinition, DebounceEventContext, DebounceExecuteContext } from "../registry/types";
3
+ import type { JobRetryConfig } from "../retry/types";
4
+ /**
5
+ * Configuration for creating a debounce job definition.
6
+ */
7
+ export interface DebounceMakeConfig<I, S, E, R> {
8
+ /**
9
+ * Schema for validating incoming events.
10
+ */
11
+ readonly eventSchema: Schema.Schema<I, any, never>;
12
+ /**
13
+ * Optional schema for persisted state.
14
+ * Defaults to eventSchema (keep latest event).
15
+ */
16
+ readonly stateSchema?: Schema.Schema<S, any, never>;
17
+ /**
18
+ * Duration to wait after first event before flushing.
19
+ */
20
+ readonly flushAfter: Duration.DurationInput;
21
+ /**
22
+ * Optional max events before immediate flush.
23
+ */
24
+ readonly maxEvents?: number;
25
+ /**
26
+ * Optional retry configuration for flush/execute handler failures.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { Backoff } from "@durable-effect/core";
31
+ *
32
+ * retry: {
33
+ * maxAttempts: 3,
34
+ * delay: Backoff.exponential({ base: "1 second", max: "30 seconds" }),
35
+ * }
36
+ * ```
37
+ */
38
+ readonly retry?: JobRetryConfig;
39
+ /**
40
+ * Reducer for each incoming event. Defaults to returning the latest event.
41
+ */
42
+ onEvent?(ctx: DebounceEventContext<I, S>): Effect.Effect<S, never, R>;
43
+ /**
44
+ * Effect executed when the debounce flushes.
45
+ */
46
+ execute(ctx: DebounceExecuteContext<S>): Effect.Effect<void, E, R>;
47
+ }
48
+ /**
49
+ * Namespace for creating debounce job definitions.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const webhookDebounce = Debounce.make({
54
+ * eventSchema: Schema.Struct({ ... }),
55
+ * flushAfter: "5 minutes",
56
+ * execute: (ctx) => Effect.log(ctx.state),
57
+ * });
58
+ * ```
59
+ */
60
+ export declare const Debounce: {
61
+ make: <I, S = I, E = never, R = never>(config: DebounceMakeConfig<I, S, E, R>) => UnregisteredDebounceDefinition<I, S, E, R>;
62
+ };
63
+ /**
64
+ * Type alias for the Debounce namespace.
65
+ */
66
+ export type DebounceNamespace = typeof Debounce;
67
+ //# sourceMappingURL=debounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/definitions/debounce.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,KAAK,EACV,8BAA8B,EAC9B,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEtE;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAEpE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ;WACZ,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kBACnB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACrC,8BAA8B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAiB9C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,28 @@
1
+ // packages/jobs/src/definitions/debounce.ts
2
+ import { Effect } from "effect";
3
+ /**
4
+ * Namespace for creating debounce job definitions.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const webhookDebounce = Debounce.make({
9
+ * eventSchema: Schema.Struct({ ... }),
10
+ * flushAfter: "5 minutes",
11
+ * execute: (ctx) => Effect.log(ctx.state),
12
+ * });
13
+ * ```
14
+ */
15
+ export const Debounce = {
16
+ make: (config) => ({
17
+ _tag: "DebounceDefinition",
18
+ eventSchema: config.eventSchema,
19
+ stateSchema: (config.stateSchema ?? config.eventSchema),
20
+ flushAfter: config.flushAfter,
21
+ maxEvents: config.maxEvents,
22
+ retry: config.retry,
23
+ onEvent: config.onEvent ??
24
+ ((ctx) => Effect.succeed(ctx.event)),
25
+ execute: config.execute,
26
+ }),
27
+ };
28
+ //# sourceMappingURL=debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/definitions/debounce.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAY,MAAM,EAAe,MAAM,QAAQ,CAAC;AAgEvD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,CACJ,MAAsC,EACM,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAIrD;QACD,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EACL,MAAM,CAAC,OAAO;YACd,CAAC,CAAC,GAA+B,EAAE,EAAE,CACnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAqB,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;CACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { Continuous, type ContinuousMakeConfig, type ContinuousNamespace, } from "./continuous";
2
+ export { Debounce, type DebounceMakeConfig, type DebounceNamespace, } from "./debounce";
3
+ export { Task, type TaskMakeConfig, type TaskNamespace, } from "./task";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/definitions/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,QAAQ,CAAC"}