@sonamu-kit/tasks 0.2.0 → 0.3.0

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 (215) hide show
  1. package/.oxlintrc.json +3 -0
  2. package/AGENTS.md +21 -0
  3. package/dist/backend.d.ts +126 -107
  4. package/dist/backend.d.ts.map +1 -1
  5. package/dist/backend.js +4 -1
  6. package/dist/backend.js.map +1 -1
  7. package/dist/client.d.ts +145 -132
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +219 -213
  10. package/dist/client.js.map +1 -1
  11. package/dist/config.d.ts +15 -8
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +22 -17
  14. package/dist/config.js.map +1 -1
  15. package/dist/core/duration.d.ts +5 -4
  16. package/dist/core/duration.d.ts.map +1 -1
  17. package/dist/core/duration.js +54 -59
  18. package/dist/core/duration.js.map +1 -1
  19. package/dist/core/error.d.ts +10 -7
  20. package/dist/core/error.d.ts.map +1 -1
  21. package/dist/core/error.js +21 -21
  22. package/dist/core/error.js.map +1 -1
  23. package/dist/core/json.d.ts +8 -3
  24. package/dist/core/json.d.ts.map +1 -1
  25. package/dist/core/result.d.ts +10 -14
  26. package/dist/core/result.d.ts.map +1 -1
  27. package/dist/core/result.js +21 -16
  28. package/dist/core/result.js.map +1 -1
  29. package/dist/core/retry.d.ts +37 -31
  30. package/dist/core/retry.d.ts.map +1 -1
  31. package/dist/core/retry.js +44 -51
  32. package/dist/core/retry.js.map +1 -1
  33. package/dist/core/schema.d.ts +57 -53
  34. package/dist/core/schema.d.ts.map +1 -1
  35. package/dist/core/step.d.ts +28 -78
  36. package/dist/core/step.d.ts.map +1 -1
  37. package/dist/core/step.js +53 -63
  38. package/dist/core/step.js.map +1 -1
  39. package/dist/core/workflow.d.ts +33 -61
  40. package/dist/core/workflow.d.ts.map +1 -1
  41. package/dist/core/workflow.js +31 -41
  42. package/dist/core/workflow.js.map +1 -1
  43. package/dist/database/backend.d.ts +53 -46
  44. package/dist/database/backend.d.ts.map +1 -1
  45. package/dist/database/backend.js +544 -577
  46. package/dist/database/backend.js.map +1 -1
  47. package/dist/database/base.js +48 -25
  48. package/dist/database/base.js.map +1 -1
  49. package/dist/database/migrations/20251212000000_0_init.d.ts +10 -0
  50. package/dist/database/migrations/20251212000000_0_init.d.ts.map +1 -0
  51. package/dist/database/migrations/20251212000000_0_init.js +8 -4
  52. package/dist/database/migrations/20251212000000_0_init.js.map +1 -1
  53. package/dist/database/migrations/20251212000000_1_tables.d.ts +10 -0
  54. package/dist/database/migrations/20251212000000_1_tables.d.ts.map +1 -0
  55. package/dist/database/migrations/20251212000000_1_tables.js +81 -83
  56. package/dist/database/migrations/20251212000000_1_tables.js.map +1 -1
  57. package/dist/database/migrations/20251212000000_2_fk.d.ts +10 -0
  58. package/dist/database/migrations/20251212000000_2_fk.d.ts.map +1 -0
  59. package/dist/database/migrations/20251212000000_2_fk.js +20 -43
  60. package/dist/database/migrations/20251212000000_2_fk.js.map +1 -1
  61. package/dist/database/migrations/20251212000000_3_indexes.d.ts +10 -0
  62. package/dist/database/migrations/20251212000000_3_indexes.d.ts.map +1 -0
  63. package/dist/database/migrations/20251212000000_3_indexes.js +88 -102
  64. package/dist/database/migrations/20251212000000_3_indexes.js.map +1 -1
  65. package/dist/database/pubsub.d.ts +7 -16
  66. package/dist/database/pubsub.d.ts.map +1 -1
  67. package/dist/database/pubsub.js +75 -73
  68. package/dist/database/pubsub.js.map +1 -1
  69. package/dist/execution.d.ts +20 -59
  70. package/dist/execution.d.ts.map +1 -1
  71. package/dist/execution.js +175 -188
  72. package/dist/execution.js.map +1 -1
  73. package/dist/index.d.ts +5 -8
  74. package/dist/index.js +5 -5
  75. package/dist/internal.d.ts +12 -13
  76. package/dist/internal.js +4 -4
  77. package/dist/registry.d.ts +33 -27
  78. package/dist/registry.d.ts.map +1 -1
  79. package/dist/registry.js +58 -49
  80. package/dist/registry.js.map +1 -1
  81. package/dist/worker.d.ts +57 -50
  82. package/dist/worker.d.ts.map +1 -1
  83. package/dist/worker.js +194 -199
  84. package/dist/worker.js.map +1 -1
  85. package/dist/workflow.d.ts +26 -30
  86. package/dist/workflow.d.ts.map +1 -1
  87. package/dist/workflow.js +20 -15
  88. package/dist/workflow.js.map +1 -1
  89. package/nodemon.json +1 -1
  90. package/package.json +17 -19
  91. package/src/backend.ts +25 -9
  92. package/src/chaos.test.ts +3 -1
  93. package/src/client.test.ts +2 -0
  94. package/src/client.ts +30 -8
  95. package/src/config.test.ts +1 -0
  96. package/src/config.ts +3 -2
  97. package/src/core/duration.test.ts +2 -1
  98. package/src/core/duration.ts +1 -1
  99. package/src/core/error.test.ts +1 -0
  100. package/src/core/error.ts +1 -1
  101. package/src/core/result.test.ts +1 -0
  102. package/src/core/retry.test.ts +3 -2
  103. package/src/core/retry.ts +1 -1
  104. package/src/core/schema.ts +2 -2
  105. package/src/core/step.test.ts +2 -1
  106. package/src/core/step.ts +4 -3
  107. package/src/core/workflow.test.ts +2 -1
  108. package/src/core/workflow.ts +4 -3
  109. package/src/database/backend.test.ts +1 -0
  110. package/src/database/backend.testsuite.ts +44 -40
  111. package/src/database/backend.ts +207 -25
  112. package/src/database/base.test.ts +41 -0
  113. package/src/database/base.ts +51 -2
  114. package/src/database/migrations/20251212000000_0_init.ts +2 -1
  115. package/src/database/migrations/20251212000000_1_tables.ts +2 -1
  116. package/src/database/migrations/20251212000000_2_fk.ts +2 -1
  117. package/src/database/migrations/20251212000000_3_indexes.ts +2 -1
  118. package/src/database/pubsub.test.ts +6 -3
  119. package/src/database/pubsub.ts +55 -33
  120. package/src/execution.test.ts +2 -0
  121. package/src/execution.ts +49 -10
  122. package/src/internal.ts +15 -15
  123. package/src/practices/01-remote-workflow.ts +1 -0
  124. package/src/registry.test.ts +1 -0
  125. package/src/registry.ts +1 -1
  126. package/src/testing/connection.ts +3 -1
  127. package/src/worker.test.ts +2 -0
  128. package/src/worker.ts +30 -9
  129. package/src/workflow.test.ts +1 -0
  130. package/src/workflow.ts +3 -3
  131. package/templates/openworkflow.config.ts +2 -1
  132. package/tsdown.config.ts +31 -0
  133. package/.swcrc +0 -17
  134. package/dist/chaos.test.d.ts +0 -2
  135. package/dist/chaos.test.d.ts.map +0 -1
  136. package/dist/chaos.test.js +0 -92
  137. package/dist/chaos.test.js.map +0 -1
  138. package/dist/client.test.d.ts +0 -2
  139. package/dist/client.test.d.ts.map +0 -1
  140. package/dist/client.test.js +0 -340
  141. package/dist/client.test.js.map +0 -1
  142. package/dist/config.test.d.ts +0 -2
  143. package/dist/config.test.d.ts.map +0 -1
  144. package/dist/config.test.js +0 -24
  145. package/dist/config.test.js.map +0 -1
  146. package/dist/core/duration.test.d.ts +0 -2
  147. package/dist/core/duration.test.d.ts.map +0 -1
  148. package/dist/core/duration.test.js +0 -265
  149. package/dist/core/duration.test.js.map +0 -1
  150. package/dist/core/error.test.d.ts +0 -2
  151. package/dist/core/error.test.d.ts.map +0 -1
  152. package/dist/core/error.test.js +0 -63
  153. package/dist/core/error.test.js.map +0 -1
  154. package/dist/core/json.js +0 -3
  155. package/dist/core/json.js.map +0 -1
  156. package/dist/core/result.test.d.ts +0 -2
  157. package/dist/core/result.test.d.ts.map +0 -1
  158. package/dist/core/result.test.js +0 -19
  159. package/dist/core/result.test.js.map +0 -1
  160. package/dist/core/retry.test.d.ts +0 -2
  161. package/dist/core/retry.test.d.ts.map +0 -1
  162. package/dist/core/retry.test.js +0 -198
  163. package/dist/core/retry.test.js.map +0 -1
  164. package/dist/core/schema.js +0 -4
  165. package/dist/core/schema.js.map +0 -1
  166. package/dist/core/step.test.d.ts +0 -2
  167. package/dist/core/step.test.d.ts.map +0 -1
  168. package/dist/core/step.test.js +0 -356
  169. package/dist/core/step.test.js.map +0 -1
  170. package/dist/core/workflow.test.d.ts +0 -2
  171. package/dist/core/workflow.test.d.ts.map +0 -1
  172. package/dist/core/workflow.test.js +0 -172
  173. package/dist/core/workflow.test.js.map +0 -1
  174. package/dist/database/backend.test.d.ts +0 -2
  175. package/dist/database/backend.test.d.ts.map +0 -1
  176. package/dist/database/backend.test.js +0 -19
  177. package/dist/database/backend.test.js.map +0 -1
  178. package/dist/database/backend.testsuite.d.ts +0 -20
  179. package/dist/database/backend.testsuite.d.ts.map +0 -1
  180. package/dist/database/backend.testsuite.js +0 -1280
  181. package/dist/database/backend.testsuite.js.map +0 -1
  182. package/dist/database/base.d.ts +0 -12
  183. package/dist/database/base.d.ts.map +0 -1
  184. package/dist/database/pubsub.test.d.ts +0 -2
  185. package/dist/database/pubsub.test.d.ts.map +0 -1
  186. package/dist/database/pubsub.test.js +0 -86
  187. package/dist/database/pubsub.test.js.map +0 -1
  188. package/dist/execution.test.d.ts +0 -2
  189. package/dist/execution.test.d.ts.map +0 -1
  190. package/dist/execution.test.js +0 -662
  191. package/dist/execution.test.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/internal.d.ts.map +0 -1
  195. package/dist/internal.js.map +0 -1
  196. package/dist/practices/01-remote-workflow.d.ts +0 -2
  197. package/dist/practices/01-remote-workflow.d.ts.map +0 -1
  198. package/dist/practices/01-remote-workflow.js +0 -70
  199. package/dist/practices/01-remote-workflow.js.map +0 -1
  200. package/dist/registry.test.d.ts +0 -2
  201. package/dist/registry.test.d.ts.map +0 -1
  202. package/dist/registry.test.js +0 -95
  203. package/dist/registry.test.js.map +0 -1
  204. package/dist/testing/connection.d.ts +0 -7
  205. package/dist/testing/connection.d.ts.map +0 -1
  206. package/dist/testing/connection.js +0 -39
  207. package/dist/testing/connection.js.map +0 -1
  208. package/dist/worker.test.d.ts +0 -2
  209. package/dist/worker.test.d.ts.map +0 -1
  210. package/dist/worker.test.js +0 -1164
  211. package/dist/worker.test.js.map +0 -1
  212. package/dist/workflow.test.d.ts +0 -2
  213. package/dist/workflow.test.d.ts.map +0 -1
  214. package/dist/workflow.test.js +0 -73
  215. package/dist/workflow.test.js.map +0 -1
package/dist/client.js CHANGED
@@ -3,222 +3,228 @@ import { validateInput } from "./core/workflow.js";
3
3
  import { WorkflowRegistry } from "./registry.js";
4
4
  import { Worker } from "./worker.js";
5
5
  import { defineWorkflow, defineWorkflowSpec } from "./workflow.js";
6
- const DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s
7
- const DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m
6
+
7
+ //#region src/client.ts
8
+ const DEFAULT_RESULT_POLL_INTERVAL_MS = 1e3;
9
+ const DEFAULT_RESULT_TIMEOUT_MS = 300 * 1e3;
8
10
  /**
9
- * Client used to register workflows and start runs.
10
- */ export class OpenWorkflow {
11
- backend;
12
- registry = new WorkflowRegistry();
13
- constructor(options){
14
- this.backend = options.backend;
15
- }
16
- /**
17
- * Create a new Worker with this client's backend and workflows.
18
- * @param options - Worker options
19
- * @param options.concurrency - Max concurrent workflow runs
20
- * @returns Worker instance
21
- */ newWorker(options) {
22
- return new Worker({
23
- backend: this.backend,
24
- registry: this.registry,
25
- concurrency: options?.concurrency,
26
- usePubSub: options?.usePubSub,
27
- listenDelay: options?.listenDelay
28
- });
29
- }
30
- /**
31
- * Provide the implementation for a declared workflow. This links the workflow
32
- * specification to its execution logic and registers it with this
33
- * OpenWorkflow instance for worker execution.
34
- * @param spec - Workflow spec
35
- * @param fn - Workflow implementation
36
- */ implementWorkflow(spec, fn) {
37
- const workflow = {
38
- spec,
39
- fn
40
- };
41
- this.registry.register(workflow);
42
- }
43
- /**
44
- * Run a workflow from its specification. This is the primary way to schedule
45
- * a workflow using only its WorkflowSpec.
46
- * @param spec - Workflow spec
47
- * @param input - Workflow input
48
- * @param options - Run options
49
- * @returns Handle for awaiting the result
50
- * @example
51
- * ```ts
52
- * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });
53
- * const result = await handle.result();
54
- * ```
55
- */ async runWorkflow(spec, input, options) {
56
- const validationResult = await validateInput(spec.schema, input);
57
- if (!validationResult.success) {
58
- throw new Error(validationResult.error);
59
- }
60
- const parsedInput = validationResult.value;
61
- const workflowRun = await this.backend.createWorkflowRun({
62
- workflowName: spec.name,
63
- version: spec.version ?? null,
64
- idempotencyKey: null,
65
- config: {},
66
- context: null,
67
- input: parsedInput ?? null,
68
- availableAt: null,
69
- deadlineAt: options?.deadlineAt ?? null,
70
- retryPolicy: spec.retryPolicy ? serializeRetryPolicy(spec.retryPolicy) : undefined
71
- });
72
- if (options?.publishToChannel) {
73
- await this.backend.publish(workflowRun.id);
74
- }
75
- return new WorkflowRunHandle({
76
- backend: this.backend,
77
- workflowRun: workflowRun,
78
- resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,
79
- resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS
80
- });
81
- }
82
- /**
83
- * Define and register a new workflow.
84
- *
85
- * This is a convenience method that combines `declareWorkflow` and
86
- * `implementWorkflow` into a single call. For better code splitting and to
87
- * separate declaration from implementation, consider using those methods
88
- * separately.
89
- * @param config - Workflow config
90
- * @param fn - Workflow implementation
91
- * @returns Runnable workflow
92
- * @example
93
- * ```ts
94
- * const workflow = ow.defineWorkflow(
95
- * { name: 'my-workflow' },
96
- * async ({ input, step }) => {
97
- * // workflow implementation
98
- * },
99
- * );
100
- * ```
101
- */ defineWorkflow(spec, fn) {
102
- const workflow = defineWorkflow(spec, fn);
103
- this.registry.register(workflow);
104
- return new RunnableWorkflow(this, workflow);
105
- }
106
- /**
107
- * Unregister a workflow from the registry.
108
- * @param name - The workflow name
109
- * @param version - The workflow version (null for unversioned)
110
- * @example
111
- * ```ts
112
- * ow.unregisterWorkflow("my-workflow", "v1");
113
- * ```
114
- */ unregisterWorkflow(name, version) {
115
- this.registry.remove(name, version);
116
- }
117
- /**
118
- * Check if a workflow is registered in the registry.
119
- * @param name - The workflow name
120
- * @param version - The workflow version (null for unversioned)
121
- * @returns True if the workflow is registered, false otherwise
122
- * @example
123
- * ```ts
124
- * ow.isWorkflowRegistered("my-workflow", "v1");
125
- * ```
126
- */ isWorkflowRegistered(name, version) {
127
- return this.registry.has(name, version);
128
- }
129
- }
11
+ * Client used to register workflows and start runs.
12
+ */
13
+ var OpenWorkflow = class {
14
+ backend;
15
+ registry = new WorkflowRegistry();
16
+ constructor(options) {
17
+ this.backend = options.backend;
18
+ }
19
+ /**
20
+ * Create a new Worker with this client's backend and workflows.
21
+ * @param options - Worker options
22
+ * @param options.concurrency - Max concurrent workflow runs
23
+ * @returns Worker instance
24
+ */
25
+ newWorker(options) {
26
+ return new Worker({
27
+ backend: this.backend,
28
+ registry: this.registry,
29
+ concurrency: options?.concurrency,
30
+ usePubSub: options?.usePubSub,
31
+ listenDelay: options?.listenDelay
32
+ });
33
+ }
34
+ /**
35
+ * Provide the implementation for a declared workflow. This links the workflow
36
+ * specification to its execution logic and registers it with this
37
+ * OpenWorkflow instance for worker execution.
38
+ * @param spec - Workflow spec
39
+ * @param fn - Workflow implementation
40
+ */
41
+ implementWorkflow(spec, fn) {
42
+ const workflow = {
43
+ spec,
44
+ fn
45
+ };
46
+ this.registry.register(workflow);
47
+ }
48
+ /**
49
+ * Run a workflow from its specification. This is the primary way to schedule
50
+ * a workflow using only its WorkflowSpec.
51
+ * @param spec - Workflow spec
52
+ * @param input - Workflow input
53
+ * @param options - Run options
54
+ * @returns Handle for awaiting the result
55
+ * @example
56
+ * ```ts
57
+ * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });
58
+ * const result = await handle.result();
59
+ * ```
60
+ */
61
+ async runWorkflow(spec, input, options) {
62
+ const validationResult = await validateInput(spec.schema, input);
63
+ if (!validationResult.success) throw new Error(validationResult.error);
64
+ const parsedInput = validationResult.value;
65
+ const workflowRun = await this.backend.createWorkflowRun({
66
+ workflowName: spec.name,
67
+ version: spec.version ?? null,
68
+ idempotencyKey: null,
69
+ config: {},
70
+ context: null,
71
+ input: parsedInput ?? null,
72
+ availableAt: null,
73
+ deadlineAt: options?.deadlineAt ?? null,
74
+ retryPolicy: spec.retryPolicy ? serializeRetryPolicy(spec.retryPolicy) : void 0
75
+ });
76
+ if (options?.publishToChannel) await this.backend.publish(workflowRun.id);
77
+ return new WorkflowRunHandle({
78
+ backend: this.backend,
79
+ workflowRun,
80
+ resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,
81
+ resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS
82
+ });
83
+ }
84
+ /**
85
+ * Define and register a new workflow.
86
+ *
87
+ * This is a convenience method that combines `declareWorkflow` and
88
+ * `implementWorkflow` into a single call. For better code splitting and to
89
+ * separate declaration from implementation, consider using those methods
90
+ * separately.
91
+ * @param config - Workflow config
92
+ * @param fn - Workflow implementation
93
+ * @returns Runnable workflow
94
+ * @example
95
+ * ```ts
96
+ * const workflow = ow.defineWorkflow(
97
+ * { name: 'my-workflow' },
98
+ * async ({ input, step }) => {
99
+ * // workflow implementation
100
+ * },
101
+ * );
102
+ * ```
103
+ */
104
+ defineWorkflow(spec, fn) {
105
+ const workflow = defineWorkflow(spec, fn);
106
+ this.registry.register(workflow);
107
+ return new RunnableWorkflow(this, workflow);
108
+ }
109
+ /**
110
+ * Unregister a workflow from the registry.
111
+ * @param name - The workflow name
112
+ * @param version - The workflow version (null for unversioned)
113
+ * @example
114
+ * ```ts
115
+ * ow.unregisterWorkflow("my-workflow", "v1");
116
+ * ```
117
+ */
118
+ unregisterWorkflow(name, version) {
119
+ this.registry.remove(name, version);
120
+ }
121
+ /**
122
+ * Check if a workflow is registered in the registry.
123
+ * @param name - The workflow name
124
+ * @param version - The workflow version (null for unversioned)
125
+ * @returns True if the workflow is registered, false otherwise
126
+ * @example
127
+ * ```ts
128
+ * ow.isWorkflowRegistered("my-workflow", "v1");
129
+ * ```
130
+ */
131
+ isWorkflowRegistered(name, version) {
132
+ return this.registry.has(name, version);
133
+ }
134
+ };
130
135
  /**
131
- * Declare a workflow without providing its implementation (which is provided
132
- * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec
133
- * that can be used to schedule workflow runs.
134
- * @param spec - Workflow spec
135
- * @returns Workflow spec
136
- * @example
137
- * ```ts
138
- * export const emailWorkflow = declareWorkflow({
139
- * name: 'send-email',
140
- * schema: z.object({ to: z.string().email() }),
141
- * });
142
- * ```
143
- */ // kept for backwards compatibility, to be deprecated
144
- // eslint-disable-next-line unicorn/prefer-export-from
145
- export const declareWorkflow = defineWorkflowSpec;
146
- //
147
- // --- Workflow Definition
148
- //
136
+ * Declare a workflow without providing its implementation (which is provided
137
+ * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec
138
+ * that can be used to schedule workflow runs.
139
+ * @param spec - Workflow spec
140
+ * @returns Workflow spec
141
+ * @example
142
+ * ```ts
143
+ * export const emailWorkflow = declareWorkflow({
144
+ * name: 'send-email',
145
+ * schema: z.object({ to: z.string().email() }),
146
+ * });
147
+ * ```
148
+ */
149
+ const declareWorkflow = defineWorkflowSpec;
149
150
  /**
150
- * A fully defined workflow with its implementation. This class is returned by
151
- * `defineWorkflow` and provides the `.run()` method for scheduling workflow
152
- * runs.
153
- */ export class RunnableWorkflow {
154
- ow;
155
- workflow;
156
- constructor(ow, workflow){
157
- this.ow = ow;
158
- this.workflow = workflow;
159
- }
160
- /**
161
- * Starts a new workflow run.
162
- * @param input - Workflow input
163
- * @param options - Run options
164
- * @returns Workflow run handle
165
- */ async run(input, options) {
166
- return this.ow.runWorkflow(this.workflow.spec, input, options);
167
- }
168
- }
151
+ * A fully defined workflow with its implementation. This class is returned by
152
+ * `defineWorkflow` and provides the `.run()` method for scheduling workflow
153
+ * runs.
154
+ */
155
+ var RunnableWorkflow = class {
156
+ ow;
157
+ workflow;
158
+ constructor(ow, workflow) {
159
+ this.ow = ow;
160
+ this.workflow = workflow;
161
+ }
162
+ /**
163
+ * Starts a new workflow run.
164
+ * @param input - Workflow input
165
+ * @param options - Run options
166
+ * @returns Workflow run handle
167
+ */
168
+ async run(input, options) {
169
+ return this.ow.runWorkflow(this.workflow.spec, input, options);
170
+ }
171
+ };
169
172
  /**
170
- * Represents a started workflow run and provides methods to await its result.
171
- * Returned from `workflowDef.run()`.
172
- */ export class WorkflowRunHandle {
173
- backend;
174
- workflowRun;
175
- resultPollIntervalMs;
176
- resultTimeoutMs;
177
- constructor(options){
178
- this.backend = options.backend;
179
- this.workflowRun = options.workflowRun;
180
- this.resultPollIntervalMs = options.resultPollIntervalMs;
181
- this.resultTimeoutMs = options.resultTimeoutMs;
182
- }
183
- /**
184
- * Waits for the workflow run to complete and returns the result.
185
- * @returns Workflow output
186
- */ async result() {
187
- const start = Date.now();
188
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
189
- while(true){
190
- const latest = await this.backend.getWorkflowRun({
191
- workflowRunId: this.workflowRun.id
192
- });
193
- if (!latest) {
194
- throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);
195
- }
196
- // 'succeeded' status is deprecated
197
- if (latest.status === "succeeded" || latest.status === "completed") {
198
- return latest.output;
199
- }
200
- if (latest.status === "failed") {
201
- throw new Error(`Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`);
202
- }
203
- if (latest.status === "canceled") {
204
- throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);
205
- }
206
- if (Date.now() - start > this.resultTimeoutMs) {
207
- throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);
208
- }
209
- await new Promise((resolve)=>{
210
- setTimeout(resolve, this.resultPollIntervalMs);
211
- });
212
- }
213
- }
214
- /**
215
- * Cancels the workflow run. Only workflows in pending, running, or sleeping
216
- * status can be canceled.
217
- */ async cancel() {
218
- await this.backend.cancelWorkflowRun({
219
- workflowRunId: this.workflowRun.id
220
- });
221
- }
222
- }
173
+ * Represents a started workflow run and provides methods to await its result.
174
+ * Returned from `workflowDef.run()`.
175
+ */
176
+ var WorkflowRunHandle = class {
177
+ backend;
178
+ workflowRun;
179
+ resultPollIntervalMs;
180
+ resultTimeoutMs;
181
+ constructor(options) {
182
+ this.backend = options.backend;
183
+ this.workflowRun = options.workflowRun;
184
+ this.resultPollIntervalMs = options.resultPollIntervalMs;
185
+ this.resultTimeoutMs = options.resultTimeoutMs;
186
+ }
187
+ /**
188
+ * Waits for the workflow run to complete and returns the result.
189
+ * @returns Workflow output
190
+ */
191
+ async result() {
192
+ const start = Date.now();
193
+ while (true) {
194
+ const latest = await this.backend.getWorkflowRun({ workflowRunId: this.workflowRun.id });
195
+ if (!latest) throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);
196
+ if (latest.status === "succeeded" || latest.status === "completed") return latest.output;
197
+ if (latest.status === "failed") throw new Error(`Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`);
198
+ if (latest.status === "canceled") throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);
199
+ if (Date.now() - start > this.resultTimeoutMs) throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);
200
+ await new Promise((resolve) => {
201
+ setTimeout(resolve, this.resultPollIntervalMs);
202
+ });
203
+ }
204
+ }
205
+ /**
206
+ * Cancels the workflow run. Only workflows in pending, running, sleeping,
207
+ * or paused status can be canceled.
208
+ */
209
+ async cancel() {
210
+ await this.backend.cancelWorkflowRun({ workflowRunId: this.workflowRun.id });
211
+ }
212
+ /**
213
+ * Pauses the workflow run. Only workflows in pending, running, or sleeping
214
+ * status can be paused.
215
+ */
216
+ async pause() {
217
+ await this.backend.pauseWorkflowRun({ workflowRunId: this.workflowRun.id });
218
+ }
219
+ /**
220
+ * Resumes a paused workflow run. Sets the status back to pending so that
221
+ * a worker can reclaim it.
222
+ */
223
+ async resume() {
224
+ await this.backend.resumeWorkflowRun({ workflowRunId: this.workflowRun.id });
225
+ }
226
+ };
223
227
 
228
+ //#endregion
229
+ export { OpenWorkflow, declareWorkflow };
224
230
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { Backend } from \"./backend\";\nimport { serializeRetryPolicy } from \"./core/retry\";\nimport type { StandardSchemaV1 } from \"./core/schema\";\nimport type { SchemaInput, SchemaOutput, WorkflowRun } from \"./core/workflow\";\nimport { validateInput } from \"./core/workflow\";\nimport type { WorkflowFunction } from \"./execution\";\nimport { WorkflowRegistry } from \"./registry\";\nimport { Worker, type WorkerOptions } from \"./worker\";\nimport { defineWorkflow, defineWorkflowSpec, type Workflow, type WorkflowSpec } from \"./workflow\";\n\nconst DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s\nconst DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m\n\n/* The data the worker function receives (after transformation). */\ntype WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;\n\n/* The data the client sends (before transformation) */\ntype WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;\n\n/**\n * Options for the OpenWorkflow client.\n */\nexport interface OpenWorkflowOptions {\n backend: Backend;\n}\n\n/**\n * Client used to register workflows and start runs.\n */\nexport class OpenWorkflow {\n private backend: Backend;\n private registry = new WorkflowRegistry();\n\n constructor(options: OpenWorkflowOptions) {\n this.backend = options.backend;\n }\n\n /**\n * Create a new Worker with this client's backend and workflows.\n * @param options - Worker options\n * @param options.concurrency - Max concurrent workflow runs\n * @returns Worker instance\n */\n newWorker(options?: {\n concurrency?: number | undefined;\n usePubSub?: boolean;\n listenDelay?: number;\n }): Worker {\n return new Worker({\n backend: this.backend,\n registry: this.registry,\n concurrency: options?.concurrency,\n usePubSub: options?.usePubSub,\n listenDelay: options?.listenDelay,\n } satisfies WorkerOptions);\n }\n\n /**\n * Provide the implementation for a declared workflow. This links the workflow\n * specification to its execution logic and registers it with this\n * OpenWorkflow instance for worker execution.\n * @param spec - Workflow spec\n * @param fn - Workflow implementation\n */\n implementWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n fn: WorkflowFunction<Input, Output>,\n ): void {\n const workflow: Workflow<Input, Output, RunInput> = { spec, fn };\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n }\n\n /**\n * Run a workflow from its specification. This is the primary way to schedule\n * a workflow using only its WorkflowSpec.\n * @param spec - Workflow spec\n * @param input - Workflow input\n * @param options - Run options\n * @returns Handle for awaiting the result\n * @example\n * ```ts\n * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });\n * const result = await handle.result();\n * ```\n */\n async runWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n input?: RunInput,\n options?: WorkflowRunOptions,\n ): Promise<WorkflowRunHandle<Output>> {\n const validationResult = await validateInput(spec.schema, input);\n if (!validationResult.success) {\n throw new Error(validationResult.error);\n }\n const parsedInput = validationResult.value;\n const workflowRun = await this.backend.createWorkflowRun({\n workflowName: spec.name,\n version: spec.version ?? null,\n idempotencyKey: null,\n config: {},\n context: null,\n input: parsedInput ?? null,\n availableAt: null,\n deadlineAt: options?.deadlineAt ?? null,\n retryPolicy: spec.retryPolicy ? serializeRetryPolicy(spec.retryPolicy) : undefined,\n });\n\n if (options?.publishToChannel) {\n await this.backend.publish(workflowRun.id);\n }\n\n return new WorkflowRunHandle<Output>({\n backend: this.backend,\n workflowRun: workflowRun,\n resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,\n resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS,\n });\n }\n\n /**\n * Define and register a new workflow.\n *\n * This is a convenience method that combines `declareWorkflow` and\n * `implementWorkflow` into a single call. For better code splitting and to\n * separate declaration from implementation, consider using those methods\n * separately.\n * @param config - Workflow config\n * @param fn - Workflow implementation\n * @returns Runnable workflow\n * @example\n * ```ts\n * const workflow = ow.defineWorkflow(\n * { name: 'my-workflow' },\n * async ({ input, step }) => {\n * // workflow implementation\n * },\n * );\n * ```\n */\n defineWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(\n spec: WorkflowSpec<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n >,\n fn: WorkflowFunction<WorkflowHandlerInput<TSchema, Input>, Output>,\n ): RunnableWorkflow<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n > {\n const workflow = defineWorkflow(spec, fn);\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n return new RunnableWorkflow(this, workflow);\n }\n\n /**\n * Unregister a workflow from the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @example\n * ```ts\n * ow.unregisterWorkflow(\"my-workflow\", \"v1\");\n * ```\n */\n unregisterWorkflow(name: string, version: string | null): void {\n this.registry.remove(name, version);\n }\n\n /**\n * Check if a workflow is registered in the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @returns True if the workflow is registered, false otherwise\n * @example\n * ```ts\n * ow.isWorkflowRegistered(\"my-workflow\", \"v1\");\n * ```\n */\n isWorkflowRegistered(name: string, version: string | null): boolean {\n return this.registry.has(name, version);\n }\n}\n\n/**\n * Declare a workflow without providing its implementation (which is provided\n * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec\n * that can be used to schedule workflow runs.\n * @param spec - Workflow spec\n * @returns Workflow spec\n * @example\n * ```ts\n * export const emailWorkflow = declareWorkflow({\n * name: 'send-email',\n * schema: z.object({ to: z.string().email() }),\n * });\n * ```\n */\n// kept for backwards compatibility, to be deprecated\n// eslint-disable-next-line unicorn/prefer-export-from\nexport const declareWorkflow = defineWorkflowSpec;\n\n//\n// --- Workflow Definition\n//\n\n/**\n * A fully defined workflow with its implementation. This class is returned by\n * `defineWorkflow` and provides the `.run()` method for scheduling workflow\n * runs.\n */\nexport class RunnableWorkflow<Input, Output, RunInput = Input> {\n private readonly ow: OpenWorkflow;\n readonly workflow: Workflow<Input, Output, RunInput>;\n\n constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>) {\n this.ow = ow;\n this.workflow = workflow;\n }\n\n /**\n * Starts a new workflow run.\n * @param input - Workflow input\n * @param options - Run options\n * @returns Workflow run handle\n */\n async run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>> {\n return this.ow.runWorkflow(this.workflow.spec, input, options);\n }\n}\n\n//\n// --- Workflow Run\n//\n\n/**\n * Options for creating a new workflow run from a runnable workflow when calling\n * `workflow.run()`.\n */\nexport interface WorkflowRunOptions {\n /**\n * Set a deadline for the workflow run. If the workflow exceeds this deadline,\n * it will be marked as failed.\n */\n deadlineAt?: Date;\n\n /**\n * Publish when the workflow run is created to the channel.\n * Default: true\n */\n publishToChannel?: boolean;\n}\n\n/**\n * Options for WorkflowHandle.\n */\nexport interface WorkflowHandleOptions {\n backend: Backend;\n workflowRun: WorkflowRun;\n resultPollIntervalMs: number;\n resultTimeoutMs: number;\n}\n\n/**\n * Represents a started workflow run and provides methods to await its result.\n * Returned from `workflowDef.run()`.\n */\nexport class WorkflowRunHandle<Output> {\n private backend: Backend;\n readonly workflowRun: WorkflowRun;\n private resultPollIntervalMs: number;\n private resultTimeoutMs: number;\n\n constructor(options: WorkflowHandleOptions) {\n this.backend = options.backend;\n this.workflowRun = options.workflowRun;\n this.resultPollIntervalMs = options.resultPollIntervalMs;\n this.resultTimeoutMs = options.resultTimeoutMs;\n }\n\n /**\n * Waits for the workflow run to complete and returns the result.\n * @returns Workflow output\n */\n async result(): Promise<Output> {\n const start = Date.now();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const latest = await this.backend.getWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n\n if (!latest) {\n throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);\n }\n\n // 'succeeded' status is deprecated\n if (latest.status === \"succeeded\" || latest.status === \"completed\") {\n return latest.output as Output;\n }\n\n if (latest.status === \"failed\") {\n throw new Error(\n `Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`,\n );\n }\n\n if (latest.status === \"canceled\") {\n throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);\n }\n\n if (Date.now() - start > this.resultTimeoutMs) {\n throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, this.resultPollIntervalMs);\n });\n }\n }\n\n /**\n * Cancels the workflow run. Only workflows in pending, running, or sleeping\n * status can be canceled.\n */\n async cancel(): Promise<void> {\n await this.backend.cancelWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n}\n"],"names":["serializeRetryPolicy","validateInput","WorkflowRegistry","Worker","defineWorkflow","defineWorkflowSpec","DEFAULT_RESULT_POLL_INTERVAL_MS","DEFAULT_RESULT_TIMEOUT_MS","OpenWorkflow","backend","registry","options","newWorker","concurrency","usePubSub","listenDelay","implementWorkflow","spec","fn","workflow","register","runWorkflow","input","validationResult","schema","success","Error","error","parsedInput","value","workflowRun","createWorkflowRun","workflowName","name","version","idempotencyKey","config","context","availableAt","deadlineAt","retryPolicy","undefined","publishToChannel","publish","id","WorkflowRunHandle","resultPollIntervalMs","resultTimeoutMs","RunnableWorkflow","unregisterWorkflow","remove","isWorkflowRegistered","has","declareWorkflow","ow","run","result","start","Date","now","latest","getWorkflowRun","workflowRunId","status","output","JSON","stringify","Promise","resolve","setTimeout","cancel","cancelWorkflowRun"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["workflow: Workflow<Input, Output, RunInput>"],"sources":["../src/client.ts"],"sourcesContent":["import { type Backend } from \"./backend\";\nimport { serializeRetryPolicy } from \"./core/retry\";\nimport { type StandardSchemaV1 } from \"./core/schema\";\nimport { type SchemaInput, type SchemaOutput, type WorkflowRun } from \"./core/workflow\";\nimport { validateInput } from \"./core/workflow\";\nimport { type WorkflowFunction } from \"./execution\";\nimport { WorkflowRegistry } from \"./registry\";\nimport { Worker } from \"./worker\";\nimport { type WorkerOptions } from \"./worker\";\nimport { defineWorkflow, defineWorkflowSpec } from \"./workflow\";\nimport { type Workflow, type WorkflowSpec } from \"./workflow\";\n\nconst DEFAULT_RESULT_POLL_INTERVAL_MS = 1000; // 1s\nconst DEFAULT_RESULT_TIMEOUT_MS = 5 * 60 * 1000; // 5m\n\n/* The data the worker function receives (after transformation). */\ntype WorkflowHandlerInput<TSchema, Input> = SchemaOutput<TSchema, Input>;\n\n/* The data the client sends (before transformation) */\ntype WorkflowRunInput<TSchema, Input> = SchemaInput<TSchema, Input>;\n\n/**\n * Options for the OpenWorkflow client.\n */\nexport interface OpenWorkflowOptions {\n backend: Backend;\n}\n\n/**\n * Client used to register workflows and start runs.\n */\nexport class OpenWorkflow {\n private backend: Backend;\n private registry = new WorkflowRegistry();\n\n constructor(options: OpenWorkflowOptions) {\n this.backend = options.backend;\n }\n\n /**\n * Create a new Worker with this client's backend and workflows.\n * @param options - Worker options\n * @param options.concurrency - Max concurrent workflow runs\n * @returns Worker instance\n */\n newWorker(options?: {\n concurrency?: number | undefined;\n usePubSub?: boolean;\n listenDelay?: number;\n }): Worker {\n return new Worker({\n backend: this.backend,\n registry: this.registry,\n concurrency: options?.concurrency,\n usePubSub: options?.usePubSub,\n listenDelay: options?.listenDelay,\n } satisfies WorkerOptions);\n }\n\n /**\n * Provide the implementation for a declared workflow. This links the workflow\n * specification to its execution logic and registers it with this\n * OpenWorkflow instance for worker execution.\n * @param spec - Workflow spec\n * @param fn - Workflow implementation\n */\n implementWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n fn: WorkflowFunction<Input, Output>,\n ): void {\n const workflow: Workflow<Input, Output, RunInput> = { spec, fn };\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n }\n\n /**\n * Run a workflow from its specification. This is the primary way to schedule\n * a workflow using only its WorkflowSpec.\n * @param spec - Workflow spec\n * @param input - Workflow input\n * @param options - Run options\n * @returns Handle for awaiting the result\n * @example\n * ```ts\n * const handle = await ow.runWorkflow(emailWorkflow, { to: 'user@example.com' });\n * const result = await handle.result();\n * ```\n */\n async runWorkflow<Input, Output, RunInput = Input>(\n spec: WorkflowSpec<Input, Output, RunInput>,\n input?: RunInput,\n options?: WorkflowRunOptions,\n ): Promise<WorkflowRunHandle<Output>> {\n const validationResult = await validateInput(spec.schema, input);\n if (!validationResult.success) {\n throw new Error(validationResult.error);\n }\n const parsedInput = validationResult.value;\n const workflowRun = await this.backend.createWorkflowRun({\n workflowName: spec.name,\n version: spec.version ?? null,\n idempotencyKey: null,\n config: {},\n context: null,\n input: parsedInput ?? null,\n availableAt: null,\n deadlineAt: options?.deadlineAt ?? null,\n retryPolicy: spec.retryPolicy ? serializeRetryPolicy(spec.retryPolicy) : undefined,\n });\n\n if (options?.publishToChannel) {\n await this.backend.publish(workflowRun.id);\n }\n\n return new WorkflowRunHandle<Output>({\n backend: this.backend,\n workflowRun: workflowRun,\n resultPollIntervalMs: DEFAULT_RESULT_POLL_INTERVAL_MS,\n resultTimeoutMs: DEFAULT_RESULT_TIMEOUT_MS,\n });\n }\n\n /**\n * Define and register a new workflow.\n *\n * This is a convenience method that combines `declareWorkflow` and\n * `implementWorkflow` into a single call. For better code splitting and to\n * separate declaration from implementation, consider using those methods\n * separately.\n * @param config - Workflow config\n * @param fn - Workflow implementation\n * @returns Runnable workflow\n * @example\n * ```ts\n * const workflow = ow.defineWorkflow(\n * { name: 'my-workflow' },\n * async ({ input, step }) => {\n * // workflow implementation\n * },\n * );\n * ```\n */\n defineWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(\n spec: WorkflowSpec<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n >,\n fn: WorkflowFunction<WorkflowHandlerInput<TSchema, Input>, Output>,\n ): RunnableWorkflow<\n WorkflowHandlerInput<TSchema, Input>,\n Output,\n WorkflowRunInput<TSchema, Input>\n > {\n const workflow = defineWorkflow(spec, fn);\n this.registry.register(workflow as Workflow<unknown, unknown, unknown>);\n return new RunnableWorkflow(this, workflow);\n }\n\n /**\n * Unregister a workflow from the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @example\n * ```ts\n * ow.unregisterWorkflow(\"my-workflow\", \"v1\");\n * ```\n */\n unregisterWorkflow(name: string, version: string | null): void {\n this.registry.remove(name, version);\n }\n\n /**\n * Check if a workflow is registered in the registry.\n * @param name - The workflow name\n * @param version - The workflow version (null for unversioned)\n * @returns True if the workflow is registered, false otherwise\n * @example\n * ```ts\n * ow.isWorkflowRegistered(\"my-workflow\", \"v1\");\n * ```\n */\n isWorkflowRegistered(name: string, version: string | null): boolean {\n return this.registry.has(name, version);\n }\n}\n\n/**\n * Declare a workflow without providing its implementation (which is provided\n * separately via `implementWorkflow`). Returns a lightweight WorkflowSpec\n * that can be used to schedule workflow runs.\n * @param spec - Workflow spec\n * @returns Workflow spec\n * @example\n * ```ts\n * export const emailWorkflow = declareWorkflow({\n * name: 'send-email',\n * schema: z.object({ to: z.string().email() }),\n * });\n * ```\n */\n// kept for backwards compatibility, to be deprecated\n// eslint-disable-next-line unicorn/prefer-export-from\nexport const declareWorkflow = defineWorkflowSpec;\n\n//\n// --- Workflow Definition\n//\n\n/**\n * A fully defined workflow with its implementation. This class is returned by\n * `defineWorkflow` and provides the `.run()` method for scheduling workflow\n * runs.\n */\nexport class RunnableWorkflow<Input, Output, RunInput = Input> {\n private readonly ow: OpenWorkflow;\n readonly workflow: Workflow<Input, Output, RunInput>;\n\n constructor(ow: OpenWorkflow, workflow: Workflow<Input, Output, RunInput>) {\n this.ow = ow;\n this.workflow = workflow;\n }\n\n /**\n * Starts a new workflow run.\n * @param input - Workflow input\n * @param options - Run options\n * @returns Workflow run handle\n */\n async run(input?: RunInput, options?: WorkflowRunOptions): Promise<WorkflowRunHandle<Output>> {\n return this.ow.runWorkflow(this.workflow.spec, input, options);\n }\n}\n\n//\n// --- Workflow Run\n//\n\n/**\n * Options for creating a new workflow run from a runnable workflow when calling\n * `workflow.run()`.\n */\nexport interface WorkflowRunOptions {\n /**\n * Set a deadline for the workflow run. If the workflow exceeds this deadline,\n * it will be marked as failed.\n */\n deadlineAt?: Date;\n\n /**\n * Publish when the workflow run is created to the channel.\n * Default: true\n */\n publishToChannel?: boolean;\n}\n\n/**\n * Options for WorkflowHandle.\n */\nexport interface WorkflowHandleOptions {\n backend: Backend;\n workflowRun: WorkflowRun;\n resultPollIntervalMs: number;\n resultTimeoutMs: number;\n}\n\n/**\n * Represents a started workflow run and provides methods to await its result.\n * Returned from `workflowDef.run()`.\n */\nexport class WorkflowRunHandle<Output> {\n private backend: Backend;\n readonly workflowRun: WorkflowRun;\n private resultPollIntervalMs: number;\n private resultTimeoutMs: number;\n\n constructor(options: WorkflowHandleOptions) {\n this.backend = options.backend;\n this.workflowRun = options.workflowRun;\n this.resultPollIntervalMs = options.resultPollIntervalMs;\n this.resultTimeoutMs = options.resultTimeoutMs;\n }\n\n /**\n * Waits for the workflow run to complete and returns the result.\n * @returns Workflow output\n */\n async result(): Promise<Output> {\n const start = Date.now();\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const latest = await this.backend.getWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n\n if (!latest) {\n throw new Error(`Workflow run ${this.workflowRun.id} no longer exists`);\n }\n\n // 'succeeded' status is deprecated\n if (latest.status === \"succeeded\" || latest.status === \"completed\") {\n return latest.output as Output;\n }\n\n if (latest.status === \"failed\") {\n throw new Error(\n `Workflow ${this.workflowRun.workflowName} failed: ${JSON.stringify(latest.error)}`,\n );\n }\n\n if (latest.status === \"canceled\") {\n throw new Error(`Workflow ${this.workflowRun.workflowName} was canceled`);\n }\n\n if (Date.now() - start > this.resultTimeoutMs) {\n throw new Error(`Timed out waiting for workflow run ${this.workflowRun.id} to finish`);\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, this.resultPollIntervalMs);\n });\n }\n }\n\n /**\n * Cancels the workflow run. Only workflows in pending, running, sleeping,\n * or paused status can be canceled.\n */\n async cancel(): Promise<void> {\n await this.backend.cancelWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n\n /**\n * Pauses the workflow run. Only workflows in pending, running, or sleeping\n * status can be paused.\n */\n async pause(): Promise<void> {\n await this.backend.pauseWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n\n /**\n * Resumes a paused workflow run. Sets the status back to pending so that\n * a worker can reclaim it.\n */\n async resume(): Promise<void> {\n await this.backend.resumeWorkflowRun({\n workflowRunId: this.workflowRun.id,\n });\n }\n}\n"],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,16 +1,19 @@
1
- import type { Backend } from "./backend";
2
- import type { WorkerOptions } from "./worker";
3
- export interface OpenWorkflowConfig {
4
- backend: Backend;
5
- worker?: WorkerConfig;
1
+ import { Backend } from "./backend.js";
2
+ import { WorkerOptions } from "./worker.js";
3
+ import * as c120 from "c12";
4
+
5
+ //#region src/config.d.ts
6
+ interface OpenWorkflowConfig {
7
+ backend: Backend;
8
+ worker?: WorkerConfig;
6
9
  }
7
- export type WorkerConfig = Pick<WorkerOptions, "concurrency">;
10
+ type WorkerConfig = Pick<WorkerOptions, "concurrency">;
8
11
  /**
9
12
  * Create a typed OpenWorkflow configuration.
10
13
  * @param config - the config
11
14
  * @returns the config
12
15
  */
13
- export declare function defineConfig(config: OpenWorkflowConfig): OpenWorkflowConfig;
16
+ declare function defineConfig(config: OpenWorkflowConfig): OpenWorkflowConfig;
14
17
  /**
15
18
  * Load the OpenWorkflow config at openworkflow.config.ts (or other extension;
16
19
  * see https://github.com/unjs/c12)
@@ -18,5 +21,9 @@ export declare function defineConfig(config: OpenWorkflowConfig): OpenWorkflowCo
18
21
  * process.cwd())
19
22
  * @returns The loaded configuration and metadata
20
23
  */
21
- export declare function loadConfig(rootDir?: string): Promise<import("c12").ResolvedConfig<OpenWorkflowConfig, import("c12").ConfigLayerMeta>>;
24
+ declare function loadConfig$1(rootDir?: string): Promise<c120.ResolvedConfig<OpenWorkflowConfig, c120.ConfigLayerMeta>>;
25
+ //# sourceMappingURL=config.d.ts.map
26
+
27
+ //#endregion
28
+ export { OpenWorkflowConfig, WorkerConfig, defineConfig, loadConfig$1 as loadConfig };
22
29
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAE3E;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,4FAOhD"}
1
+ {"version":3,"file":"config.d.ts","names":[],"sources":["../src/config.ts"],"sourcesContent":[],"mappings":";;;;;UAKiB,kBAAA;WACN;WACA;AAFX;AAAmC,KAKvB,YAAA,GAAe,IALQ,CAKH,aALG,EAAA,aAAA,CAAA;;;;AAKnC;;AAAgC,iBAOhB,YAAA,CAPgB,MAAA,EAOK,kBAPL,CAAA,EAO0B,kBAP1B;;;AAOhC;;;;;AAWsB,iBAAA,YAAA,CAAU,OAAA,CAAA,EAAA,MAAA,CAAA,EAAiB,OAAjB,CAAiB,IAAA,CAAA,cAAjB,CAAiB,kBAAjB,EAAiB,IAAA,CAAA,eAAA,CAAjB,CAAA"}
package/dist/config.js CHANGED
@@ -1,23 +1,28 @@
1
- import { loadConfig as loadC12Config } from "c12";
1
+ import { loadConfig } from "c12";
2
+
3
+ //#region src/config.ts
2
4
  /**
3
- * Create a typed OpenWorkflow configuration.
4
- * @param config - the config
5
- * @returns the config
6
- */ export function defineConfig(config) {
7
- return config;
5
+ * Create a typed OpenWorkflow configuration.
6
+ * @param config - the config
7
+ * @returns the config
8
+ */
9
+ function defineConfig(config) {
10
+ return config;
8
11
  }
9
12
  /**
10
- * Load the OpenWorkflow config at openworkflow.config.ts (or other extension;
11
- * see https://github.com/unjs/c12)
12
- * @param rootDir - Optional root directory to search from (defaults to
13
- * process.cwd())
14
- * @returns The loaded configuration and metadata
15
- */ export async function loadConfig(rootDir) {
16
- const cwd = rootDir ?? process.cwd();
17
- return await loadC12Config({
18
- cwd,
19
- name: "openworkflow"
20
- });
13
+ * Load the OpenWorkflow config at openworkflow.config.ts (or other extension;
14
+ * see https://github.com/unjs/c12)
15
+ * @param rootDir - Optional root directory to search from (defaults to
16
+ * process.cwd())
17
+ * @returns The loaded configuration and metadata
18
+ */
19
+ async function loadConfig$1(rootDir) {
20
+ return await loadConfig({
21
+ cwd: rootDir ?? process.cwd(),
22
+ name: "openworkflow"
23
+ });
21
24
  }
22
25
 
26
+ //#endregion
27
+ export { defineConfig, loadConfig$1 as loadConfig };
23
28
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { loadConfig as loadC12Config } from \"c12\";\nimport type { Backend } from \"./backend\";\nimport type { WorkerOptions } from \"./worker\";\n\nexport interface OpenWorkflowConfig {\n backend: Backend;\n worker?: WorkerConfig;\n}\n\nexport type WorkerConfig = Pick<WorkerOptions, \"concurrency\">;\n\n/**\n * Create a typed OpenWorkflow configuration.\n * @param config - the config\n * @returns the config\n */\nexport function defineConfig(config: OpenWorkflowConfig): OpenWorkflowConfig {\n return config;\n}\n\n/**\n * Load the OpenWorkflow config at openworkflow.config.ts (or other extension;\n * see https://github.com/unjs/c12)\n * @param rootDir - Optional root directory to search from (defaults to\n * process.cwd())\n * @returns The loaded configuration and metadata\n */\nexport async function loadConfig(rootDir?: string) {\n const cwd = rootDir ?? process.cwd();\n\n return await loadC12Config<OpenWorkflowConfig>({\n cwd,\n name: \"openworkflow\",\n });\n}\n"],"names":["loadConfig","loadC12Config","defineConfig","config","rootDir","cwd","process","name"],"mappings":"AAAA,SAASA,cAAcC,aAAa,QAAQ,MAAM;AAWlD;;;;CAIC,GACD,OAAO,SAASC,aAAaC,MAA0B;IACrD,OAAOA;AACT;AAEA;;;;;;CAMC,GACD,OAAO,eAAeH,WAAWI,OAAgB;IAC/C,MAAMC,MAAMD,WAAWE,QAAQD,GAAG;IAElC,OAAO,MAAMJ,cAAkC;QAC7CI;QACAE,MAAM;IACR;AACF"}
1
+ {"version":3,"file":"config.js","names":["loadConfig","loadC12Config"],"sources":["../src/config.ts"],"sourcesContent":["import { loadConfig as loadC12Config } from \"c12\";\n\nimport { type Backend } from \"./backend\";\nimport { type WorkerOptions } from \"./worker\";\n\nexport interface OpenWorkflowConfig {\n backend: Backend;\n worker?: WorkerConfig;\n}\n\nexport type WorkerConfig = Pick<WorkerOptions, \"concurrency\">;\n\n/**\n * Create a typed OpenWorkflow configuration.\n * @param config - the config\n * @returns the config\n */\nexport function defineConfig(config: OpenWorkflowConfig): OpenWorkflowConfig {\n return config;\n}\n\n/**\n * Load the OpenWorkflow config at openworkflow.config.ts (or other extension;\n * see https://github.com/unjs/c12)\n * @param rootDir - Optional root directory to search from (defaults to\n * process.cwd())\n * @returns The loaded configuration and metadata\n */\nexport async function loadConfig(rootDir?: string) {\n const cwd = rootDir ?? process.cwd();\n\n return await loadC12Config<OpenWorkflowConfig>({\n cwd,\n name: \"openworkflow\",\n });\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,aAAa,QAAgD;AAC3E,QAAO;;;;;;;;;AAUT,eAAsBA,aAAW,SAAkB;AAGjD,QAAO,MAAMC,WAAkC;EAC7C,KAHU,WAAW,QAAQ,KAAK;EAIlC,MAAM;EACP,CAAC"}