openworkflow 0.4.0 → 0.4.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 (133) hide show
  1. package/README.md +17 -11
  2. package/dist/backend-sqlite/backend.d.ts +38 -0
  3. package/dist/backend-sqlite/backend.d.ts.map +1 -0
  4. package/dist/backend-sqlite/backend.js +628 -0
  5. package/dist/backend-sqlite/backend.js.map +1 -0
  6. package/dist/backend-sqlite/index.d.ts +2 -0
  7. package/dist/backend-sqlite/index.d.ts.map +1 -0
  8. package/dist/backend-sqlite/index.js +2 -0
  9. package/dist/backend-sqlite/index.js.map +1 -0
  10. package/dist/backend-sqlite/sqlite.d.ts +45 -0
  11. package/dist/backend-sqlite/sqlite.d.ts.map +1 -0
  12. package/dist/backend-sqlite/sqlite.js +229 -0
  13. package/dist/backend-sqlite/sqlite.js.map +1 -0
  14. package/dist/config/config.d.ts +102 -0
  15. package/dist/config/config.d.ts.map +1 -0
  16. package/dist/config/config.js +29 -0
  17. package/dist/config/config.js.map +1 -0
  18. package/dist/config/index.d.ts +3 -0
  19. package/dist/config/index.d.ts.map +1 -0
  20. package/dist/config/index.js +2 -0
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/config.d.ts +28 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +41 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/core/backend-test-suite.d.ts +22 -0
  27. package/dist/core/backend-test-suite.d.ts.map +1 -0
  28. package/dist/core/backend-test-suite.js +960 -0
  29. package/dist/core/backend-test-suite.js.map +1 -0
  30. package/dist/core/backend.d.ts +103 -0
  31. package/dist/core/backend.d.ts.map +1 -0
  32. package/dist/core/backend.js +2 -0
  33. package/dist/core/backend.js.map +1 -0
  34. package/dist/core/backend.testsuite.d.ts +21 -0
  35. package/dist/core/backend.testsuite.d.ts.map +1 -0
  36. package/dist/core/backend.testsuite.js +958 -0
  37. package/dist/core/backend.testsuite.js.map +1 -0
  38. package/dist/{duration.d.ts → core/duration.d.ts} +2 -1
  39. package/dist/core/duration.d.ts.map +1 -0
  40. package/dist/{duration.js → core/duration.js} +6 -5
  41. package/dist/core/duration.js.map +1 -0
  42. package/dist/core/duration.test.d.ts +2 -0
  43. package/dist/core/duration.test.d.ts.map +1 -0
  44. package/dist/core/duration.test.js +264 -0
  45. package/dist/core/duration.test.js.map +1 -0
  46. package/dist/core/json.d.ts +5 -0
  47. package/dist/core/json.d.ts.map +1 -0
  48. package/dist/core/json.js +2 -0
  49. package/dist/core/json.js.map +1 -0
  50. package/dist/core/result.d.ts +12 -0
  51. package/dist/core/result.d.ts.map +1 -0
  52. package/dist/core/result.js +7 -0
  53. package/dist/core/result.js.map +1 -0
  54. package/dist/core/result.test.d.ts +2 -0
  55. package/dist/core/result.test.d.ts.map +1 -0
  56. package/dist/core/result.test.js +11 -0
  57. package/dist/core/result.test.js.map +1 -0
  58. package/dist/core/retry.d.ts +16 -0
  59. package/dist/core/retry.d.ts.map +1 -0
  60. package/dist/{backend.js → core/retry.js} +1 -3
  61. package/dist/core/retry.js.map +1 -0
  62. package/dist/core/retry.test.d.ts +2 -0
  63. package/dist/core/retry.test.d.ts.map +1 -0
  64. package/dist/core/retry.test.js +36 -0
  65. package/dist/core/retry.test.js.map +1 -0
  66. package/dist/core/schema.d.ts.map +1 -0
  67. package/dist/core/schema.js.map +1 -0
  68. package/dist/core/step.d.ts +120 -0
  69. package/dist/core/step.d.ts.map +1 -0
  70. package/dist/core/step.js +101 -0
  71. package/dist/core/step.js.map +1 -0
  72. package/dist/core/step.test.d.ts +2 -0
  73. package/dist/core/step.test.d.ts.map +1 -0
  74. package/dist/core/step.test.js +340 -0
  75. package/dist/core/step.test.js.map +1 -0
  76. package/dist/core/workflow.d.ts +108 -0
  77. package/dist/core/workflow.d.ts.map +1 -0
  78. package/dist/core/workflow.js +79 -0
  79. package/dist/core/workflow.js.map +1 -0
  80. package/dist/core/workflow.test.d.ts +2 -0
  81. package/dist/core/workflow.test.d.ts.map +1 -0
  82. package/dist/core/workflow.test.js +216 -0
  83. package/dist/core/workflow.test.js.map +1 -0
  84. package/dist/execution/execution.d.ts +91 -0
  85. package/dist/execution/execution.d.ts.map +1 -0
  86. package/dist/execution/execution.js +188 -0
  87. package/dist/execution/execution.js.map +1 -0
  88. package/dist/execution/execution.test.d.ts +2 -0
  89. package/dist/execution/execution.test.d.ts.map +1 -0
  90. package/dist/execution/execution.test.js +382 -0
  91. package/dist/execution/execution.test.js.map +1 -0
  92. package/dist/global.d.ts +62 -0
  93. package/dist/global.d.ts.map +1 -0
  94. package/dist/global.js +78 -0
  95. package/dist/global.js.map +1 -0
  96. package/dist/index.d.ts +9 -5
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +4 -3
  99. package/dist/index.js.map +1 -1
  100. package/dist/sdk/sdk.d.ts +182 -0
  101. package/dist/sdk/sdk.d.ts.map +1 -0
  102. package/dist/sdk/sdk.js +208 -0
  103. package/dist/sdk/sdk.js.map +1 -0
  104. package/dist/sdk/sdk.test.d.ts +2 -0
  105. package/dist/sdk/sdk.test.d.ts.map +1 -0
  106. package/dist/sdk/sdk.test.js +195 -0
  107. package/dist/sdk/sdk.test.js.map +1 -0
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/dist/{worker.d.ts → worker/worker.d.ts} +3 -3
  110. package/dist/worker/worker.d.ts.map +1 -0
  111. package/dist/worker/worker.js +208 -0
  112. package/dist/worker/worker.js.map +1 -0
  113. package/dist/worker/worker.test.d.ts +2 -0
  114. package/dist/worker/worker.test.d.ts.map +1 -0
  115. package/dist/worker/worker.test.js +786 -0
  116. package/dist/worker/worker.test.js.map +1 -0
  117. package/package.json +6 -6
  118. package/dist/backend.d.ts +0 -173
  119. package/dist/backend.d.ts.map +0 -1
  120. package/dist/backend.js.map +0 -1
  121. package/dist/client.d.ts +0 -153
  122. package/dist/client.d.ts.map +0 -1
  123. package/dist/client.js +0 -151
  124. package/dist/client.js.map +0 -1
  125. package/dist/duration.d.ts.map +0 -1
  126. package/dist/duration.js.map +0 -1
  127. package/dist/schema.d.ts.map +0 -1
  128. package/dist/schema.js.map +0 -1
  129. package/dist/worker.d.ts.map +0 -1
  130. package/dist/worker.js +0 -384
  131. package/dist/worker.js.map +0 -1
  132. /package/dist/{schema.d.ts → core/schema.d.ts} +0 -0
  133. /package/dist/{schema.js → core/schema.js} +0 -0
@@ -0,0 +1,188 @@
1
+ import { serializeError, createStepAttemptCacheFromAttempts, getCachedStepAttempt, addToStepAttemptCache, normalizeStepOutput, calculateSleepResumeAt, createSleepContext, } from "../core/step.js";
2
+ /**
3
+ * Signal thrown when a workflow needs to sleep. Contains the time when the
4
+ * workflow should resume.
5
+ */
6
+ export class SleepSignal extends Error {
7
+ resumeAt;
8
+ constructor(resumeAt) {
9
+ super("SleepSignal");
10
+ this.name = "SleepSignal";
11
+ this.resumeAt = resumeAt;
12
+ }
13
+ }
14
+ /**
15
+ * Replays prior step attempts and persists new ones while memoizing
16
+ * deterministic step outputs.
17
+ */
18
+ export class StepExecutor {
19
+ backend;
20
+ workflowRunId;
21
+ workerId;
22
+ cache;
23
+ constructor(options) {
24
+ this.backend = options.backend;
25
+ this.workflowRunId = options.workflowRunId;
26
+ this.workerId = options.workerId;
27
+ this.cache = createStepAttemptCacheFromAttempts(options.attempts);
28
+ }
29
+ async run(config, fn) {
30
+ const { name } = config;
31
+ // return cached result if available
32
+ const existingAttempt = getCachedStepAttempt(this.cache, name);
33
+ if (existingAttempt) {
34
+ return existingAttempt.output;
35
+ }
36
+ // not in cache, create new step attempt
37
+ const attempt = await this.backend.createStepAttempt({
38
+ workflowRunId: this.workflowRunId,
39
+ workerId: this.workerId,
40
+ stepName: name,
41
+ kind: "function",
42
+ config: {},
43
+ context: null,
44
+ });
45
+ try {
46
+ // execute step function
47
+ const result = await fn();
48
+ const output = normalizeStepOutput(result);
49
+ // mark success
50
+ const savedAttempt = await this.backend.completeStepAttempt({
51
+ workflowRunId: this.workflowRunId,
52
+ stepAttemptId: attempt.id,
53
+ workerId: this.workerId,
54
+ output,
55
+ });
56
+ // cache result
57
+ this.cache = addToStepAttemptCache(this.cache, savedAttempt);
58
+ return savedAttempt.output;
59
+ }
60
+ catch (error) {
61
+ // mark failure
62
+ await this.backend.failStepAttempt({
63
+ workflowRunId: this.workflowRunId,
64
+ stepAttemptId: attempt.id,
65
+ workerId: this.workerId,
66
+ error: serializeError(error),
67
+ });
68
+ throw error;
69
+ }
70
+ }
71
+ async sleep(name, duration) {
72
+ // return cached result if this sleep already completed
73
+ const existingAttempt = getCachedStepAttempt(this.cache, name);
74
+ if (existingAttempt)
75
+ return;
76
+ // create new step attempt for the sleep
77
+ const result = calculateSleepResumeAt(duration);
78
+ if (!result.ok) {
79
+ throw result.error;
80
+ }
81
+ const resumeAt = result.value;
82
+ const context = createSleepContext(resumeAt);
83
+ await this.backend.createStepAttempt({
84
+ workflowRunId: this.workflowRunId,
85
+ workerId: this.workerId,
86
+ stepName: name,
87
+ kind: "sleep",
88
+ config: {},
89
+ context,
90
+ });
91
+ // throw sleep signal to trigger postponement
92
+ // we do not mark the step as completed here; it will be updated
93
+ // when the workflow resumes
94
+ throw new SleepSignal(resumeAt);
95
+ }
96
+ }
97
+ /**
98
+ * Execute a workflow run. This is the core application use case that handles:
99
+ * - Loading step history
100
+ * - Handling sleeping steps
101
+ * - Creating the step executor
102
+ * - Executing the workflow function
103
+ * - Completing, failing, or sleeping the workflow run based on the outcome
104
+ *
105
+ * @param params - The execution parameters
106
+ */
107
+ export async function executeWorkflow(params) {
108
+ const { backend, workflowRun, workflowFn, workflowVersion, workerId } = params;
109
+ try {
110
+ // load all pages of step history
111
+ const attempts = [];
112
+ let cursor;
113
+ do {
114
+ const response = await backend.listStepAttempts({
115
+ workflowRunId: workflowRun.id,
116
+ ...(cursor ? { after: cursor } : {}),
117
+ limit: 1000,
118
+ });
119
+ attempts.push(...response.data);
120
+ cursor = response.pagination.next ?? undefined;
121
+ } while (cursor);
122
+ // mark any sleep steps as completed if their sleep duration has elapsed,
123
+ // or rethrow SleepSignal if still sleeping
124
+ for (let i = 0; i < attempts.length; i++) {
125
+ const attempt = attempts[i];
126
+ if (!attempt)
127
+ continue;
128
+ if (attempt.status === "running" &&
129
+ attempt.kind === "sleep" &&
130
+ attempt.context?.kind === "sleep") {
131
+ const now = Date.now();
132
+ const resumeAt = new Date(attempt.context.resumeAt);
133
+ const resumeAtMs = resumeAt.getTime();
134
+ if (now < resumeAtMs) {
135
+ // sleep duration HAS NOT elapsed yet, throw signal to put workflow
136
+ // back to sleep
137
+ throw new SleepSignal(resumeAt);
138
+ }
139
+ // sleep duration HAS elapsed, mark the step as completed and continue
140
+ const completed = await backend.completeStepAttempt({
141
+ workflowRunId: workflowRun.id,
142
+ stepAttemptId: attempt.id,
143
+ workerId,
144
+ output: null,
145
+ });
146
+ // update cache w/ completed attempt
147
+ attempts[i] = completed;
148
+ }
149
+ }
150
+ // create step executor
151
+ const executor = new StepExecutor({
152
+ backend,
153
+ workflowRunId: workflowRun.id,
154
+ workerId,
155
+ attempts,
156
+ });
157
+ // execute workflow
158
+ const output = await workflowFn({
159
+ input: workflowRun.input,
160
+ step: executor,
161
+ version: workflowVersion,
162
+ });
163
+ // mark success
164
+ await backend.completeWorkflowRun({
165
+ workflowRunId: workflowRun.id,
166
+ workerId,
167
+ output: (output ?? null),
168
+ });
169
+ }
170
+ catch (error) {
171
+ // handle sleep signal by setting workflow to sleeping status
172
+ if (error instanceof SleepSignal) {
173
+ await backend.sleepWorkflowRun({
174
+ workflowRunId: workflowRun.id,
175
+ workerId,
176
+ availableAt: error.resumeAt,
177
+ });
178
+ return;
179
+ }
180
+ // mark failure
181
+ await backend.failWorkflowRun({
182
+ workflowRunId: workflowRun.id,
183
+ workerId,
184
+ error: serializeError(error),
185
+ });
186
+ }
187
+ }
188
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../execution/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=execution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.test.d.ts","sourceRoot":"","sources":["../../execution/execution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,382 @@
1
+ import { BackendPostgres } from "../../backend-postgres/backend.js";
2
+ import { DEFAULT_DATABASE_URL } from "../../backend-postgres/postgres.js";
3
+ import { OpenWorkflow } from "../sdk/sdk.js";
4
+ import { randomUUID } from "node:crypto";
5
+ import { describe, test, expect } from "vitest";
6
+ describe("StepExecutor", () => {
7
+ test("executes step and returns result", async () => {
8
+ const backend = await createBackend();
9
+ const client = new OpenWorkflow({ backend });
10
+ const workflow = client.defineWorkflow({ name: "executor-basic" }, async ({ step }) => {
11
+ const result = await step.run({ name: "add" }, () => 5 + 3);
12
+ return result;
13
+ });
14
+ const worker = client.newWorker();
15
+ const handle = await workflow.run();
16
+ await worker.tick();
17
+ const result = await handle.result();
18
+ expect(result).toBe(8);
19
+ });
20
+ test("caches step results for same step name", async () => {
21
+ const backend = await createBackend();
22
+ const client = new OpenWorkflow({ backend });
23
+ let executionCount = 0;
24
+ const workflow = client.defineWorkflow({ name: "executor-cached" }, async ({ step }) => {
25
+ const first = await step.run({ name: "cached-step" }, () => {
26
+ executionCount++;
27
+ return "first-execution";
28
+ });
29
+ const second = await step.run({ name: "cached-step" }, () => {
30
+ executionCount++;
31
+ return "second-execution";
32
+ });
33
+ return { first, second };
34
+ });
35
+ const worker = client.newWorker();
36
+ const handle = await workflow.run();
37
+ await worker.tick();
38
+ const result = await handle.result();
39
+ expect(result).toEqual({
40
+ first: "first-execution",
41
+ second: "first-execution",
42
+ });
43
+ expect(executionCount).toBe(1);
44
+ });
45
+ test("different step names execute independently", async () => {
46
+ const backend = await createBackend();
47
+ const client = new OpenWorkflow({ backend });
48
+ let executionCount = 0;
49
+ const workflow = client.defineWorkflow({ name: "executor-different-steps" }, async ({ step }) => {
50
+ const first = await step.run({ name: "step-1" }, () => {
51
+ executionCount++;
52
+ return "a";
53
+ });
54
+ const second = await step.run({ name: "step-2" }, () => {
55
+ executionCount++;
56
+ return "b";
57
+ });
58
+ return { first, second };
59
+ });
60
+ const worker = client.newWorker();
61
+ const handle = await workflow.run();
62
+ await worker.tick();
63
+ const result = await handle.result();
64
+ expect(result).toEqual({ first: "a", second: "b" });
65
+ expect(executionCount).toBe(2);
66
+ });
67
+ test("propagates step errors with deadline exceeded", async () => {
68
+ const backend = await createBackend();
69
+ const client = new OpenWorkflow({ backend });
70
+ const workflow = client.defineWorkflow({ name: "executor-error" }, async ({ step }) => {
71
+ await step.run({ name: "failing-step" }, () => {
72
+ throw new Error("Step failed intentionally");
73
+ });
74
+ return "should not reach";
75
+ });
76
+ const worker = client.newWorker();
77
+ // Use deadline to force immediate failure without retries
78
+ const handle = await workflow.run({}, { deadlineAt: new Date() });
79
+ await worker.tick();
80
+ await sleep(100);
81
+ await expect(handle.result()).rejects.toThrow(/deadline exceeded/);
82
+ });
83
+ test("sleep puts workflow in sleeping status", async () => {
84
+ const backend = await createBackend();
85
+ const client = new OpenWorkflow({ backend });
86
+ const workflow = client.defineWorkflow({ name: "executor-sleep" }, async ({ step }) => {
87
+ await step.sleep("sleep-1", "5s");
88
+ return "after sleep";
89
+ });
90
+ const handle = await workflow.run();
91
+ const worker = client.newWorker();
92
+ await worker.tick();
93
+ const workflowRun = await backend.getWorkflowRun({
94
+ workflowRunId: handle.workflowRun.id,
95
+ });
96
+ expect(workflowRun?.status).toBe("sleeping");
97
+ expect(workflowRun?.availableAt).not.toBeNull();
98
+ });
99
+ test("workflow resumes after sleep duration", async () => {
100
+ const backend = await createBackend();
101
+ const client = new OpenWorkflow({ backend });
102
+ const workflow = client.defineWorkflow({ name: "resume-after-sleep" }, async ({ step }) => {
103
+ const value = await step.run({ name: "before" }, () => 5);
104
+ await step.sleep("wait", "10ms");
105
+ return value + 10;
106
+ });
107
+ const handle = await workflow.run();
108
+ const worker = client.newWorker();
109
+ // First tick - hits sleep
110
+ await worker.tick();
111
+ await sleep(50); // Wait for tick to complete
112
+ const sleeping = await backend.getWorkflowRun({
113
+ workflowRunId: handle.workflowRun.id,
114
+ });
115
+ expect(sleeping?.status).toBe("sleeping");
116
+ // Wait for sleep to elapse
117
+ await sleep(50);
118
+ // Second tick - completes
119
+ await worker.tick();
120
+ const result = await handle.result();
121
+ expect(result).toBe(15);
122
+ });
123
+ });
124
+ describe("executeWorkflow", () => {
125
+ describe("successful execution", () => {
126
+ test("executes a simple workflow", async () => {
127
+ const backend = await createBackend();
128
+ const client = new OpenWorkflow({ backend });
129
+ const workflow = client.defineWorkflow({ name: "simple-workflow" }, ({ input }) => {
130
+ return input.a + input.b;
131
+ });
132
+ const worker = client.newWorker();
133
+ const handle = await workflow.run({ a: 10, b: 5 });
134
+ await worker.tick();
135
+ const result = await handle.result();
136
+ expect(result).toBe(15);
137
+ });
138
+ test("executes a multi-step workflow", async () => {
139
+ const backend = await createBackend();
140
+ const client = new OpenWorkflow({ backend });
141
+ const workflow = client.defineWorkflow({ name: "multi-step-workflow" }, async ({ input, step }) => {
142
+ const sum = await step.run({ name: "add" }, () => input.value + 5);
143
+ const product = await step.run({ name: "multiply" }, () => sum * 2);
144
+ return product;
145
+ });
146
+ const worker = client.newWorker();
147
+ const handle = await workflow.run({ value: 10 });
148
+ await worker.tick();
149
+ const result = await handle.result();
150
+ expect(result).toBe(30);
151
+ });
152
+ test("returns null for workflows without return", async () => {
153
+ const backend = await createBackend();
154
+ const client = new OpenWorkflow({ backend });
155
+ const workflow = client.defineWorkflow({ name: "void-workflow" }, () => null);
156
+ const worker = client.newWorker();
157
+ const handle = await workflow.run();
158
+ await worker.tick();
159
+ const result = await handle.result();
160
+ expect(result).toBeNull();
161
+ });
162
+ test("returns null from workflow", async () => {
163
+ const backend = await createBackend();
164
+ const client = new OpenWorkflow({ backend });
165
+ const workflow = client.defineWorkflow({ name: "null-workflow" }, () => null);
166
+ const worker = client.newWorker();
167
+ const handle = await workflow.run();
168
+ await worker.tick();
169
+ const result = await handle.result();
170
+ expect(result).toBeNull();
171
+ });
172
+ });
173
+ describe("error handling", () => {
174
+ test("handles workflow errors with deadline exceeded", async () => {
175
+ const backend = await createBackend();
176
+ const client = new OpenWorkflow({ backend });
177
+ const workflow = client.defineWorkflow({ name: "failing-workflow" }, () => {
178
+ throw new Error("Workflow error");
179
+ });
180
+ const worker = client.newWorker();
181
+ // Use deadline to skip retries - fails with deadline exceeded
182
+ const handle = await workflow.run({}, { deadlineAt: new Date() });
183
+ await worker.tick();
184
+ await sleep(100);
185
+ await expect(handle.result()).rejects.toThrow(/deadline exceeded/);
186
+ });
187
+ test("handles step errors with deadline exceeded", async () => {
188
+ const backend = await createBackend();
189
+ const client = new OpenWorkflow({ backend });
190
+ const workflow = client.defineWorkflow({ name: "step-error-workflow" }, async ({ step }) => {
191
+ await step.run({ name: "failing" }, () => {
192
+ throw new Error("Step error");
193
+ });
194
+ return "unreachable";
195
+ });
196
+ const worker = client.newWorker();
197
+ const handle = await workflow.run({}, { deadlineAt: new Date() });
198
+ await worker.tick();
199
+ await sleep(100);
200
+ await expect(handle.result()).rejects.toThrow(/deadline exceeded/);
201
+ });
202
+ test("serializes non-Error exceptions", async () => {
203
+ const backend = await createBackend();
204
+ const client = new OpenWorkflow({ backend });
205
+ const workflow = client.defineWorkflow({ name: "non-error-workflow" }, async ({ step }) => {
206
+ await step.run({ name: "throw-object" }, () => {
207
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
208
+ throw { custom: "error", code: 500 };
209
+ });
210
+ return "nope";
211
+ });
212
+ const worker = client.newWorker();
213
+ const handle = await workflow.run({}, { deadlineAt: new Date() });
214
+ await worker.tick();
215
+ await sleep(100);
216
+ await expect(handle.result()).rejects.toThrow();
217
+ });
218
+ });
219
+ describe("sleep handling", () => {
220
+ test("workflow enters sleeping status", async () => {
221
+ const backend = await createBackend();
222
+ const client = new OpenWorkflow({ backend });
223
+ const workflow = client.defineWorkflow({ name: "sleep-workflow" }, async ({ step }) => {
224
+ await step.sleep("wait", "5s");
225
+ return "after sleep";
226
+ });
227
+ const handle = await workflow.run();
228
+ const worker = client.newWorker();
229
+ await worker.tick();
230
+ const workflowRun = await backend.getWorkflowRun({
231
+ workflowRunId: handle.workflowRun.id,
232
+ });
233
+ expect(workflowRun?.status).toBe("sleeping");
234
+ });
235
+ test("resumes workflow after sleep duration", async () => {
236
+ const backend = await createBackend();
237
+ const client = new OpenWorkflow({ backend });
238
+ const workflow = client.defineWorkflow({ name: "resume-after-sleep" }, async ({ input, step }) => {
239
+ const sum = await step.run({ name: "add" }, () => input.value + 1);
240
+ await step.sleep("wait", "10ms");
241
+ return sum + 10;
242
+ });
243
+ const handle = await workflow.run({ value: 5 });
244
+ const worker = client.newWorker();
245
+ // first tick - hits sleep
246
+ await worker.tick();
247
+ await sleep(50);
248
+ const sleeping = await backend.getWorkflowRun({
249
+ workflowRunId: handle.workflowRun.id,
250
+ });
251
+ expect(sleeping?.status).toBe("sleeping");
252
+ // wait for sleep
253
+ await sleep(50);
254
+ await worker.tick();
255
+ const result = await handle.result();
256
+ expect(result).toBe(16);
257
+ });
258
+ });
259
+ describe("workflow with complex data", () => {
260
+ test("handles objects as input and output", async () => {
261
+ const backend = await createBackend();
262
+ const client = new OpenWorkflow({ backend });
263
+ const workflow = client.defineWorkflow({ name: "user-workflow" }, ({ input }) => {
264
+ return {
265
+ greeting: `Hello, ${input.name}! You are ${String(input.age)} years old.`,
266
+ processed: true,
267
+ };
268
+ });
269
+ const worker = client.newWorker();
270
+ const handle = await workflow.run({ name: "Alice", age: 30 });
271
+ await worker.tick();
272
+ const result = await handle.result();
273
+ expect(result).toEqual({
274
+ greeting: "Hello, Alice! You are 30 years old.",
275
+ processed: true,
276
+ });
277
+ });
278
+ test("handles arrays in workflow", async () => {
279
+ const backend = await createBackend();
280
+ const client = new OpenWorkflow({ backend });
281
+ const workflow = client.defineWorkflow({ name: "array-workflow" }, ({ input }) => {
282
+ return input.numbers.reduce((a, b) => a + b, 0);
283
+ });
284
+ const worker = client.newWorker();
285
+ const handle = await workflow.run({ numbers: [1, 2, 3, 4, 5] });
286
+ await worker.tick();
287
+ const result = await handle.result();
288
+ expect(result).toBe(15);
289
+ });
290
+ });
291
+ describe("result type handling", () => {
292
+ test("returns success with numeric result", async () => {
293
+ const backend = await createBackend();
294
+ const client = new OpenWorkflow({ backend });
295
+ const workflow = client.defineWorkflow({ name: "numeric-result" }, async ({ step }) => {
296
+ return await step.run({ name: "compute" }, () => 100 + 200);
297
+ });
298
+ const worker = client.newWorker();
299
+ const handle = await workflow.run();
300
+ await worker.tick();
301
+ const result = await handle.result();
302
+ expect(result).toBe(300);
303
+ });
304
+ test("returns success with string result", async () => {
305
+ const backend = await createBackend();
306
+ const client = new OpenWorkflow({ backend });
307
+ const workflow = client.defineWorkflow({ name: "string-result" }, ({ input }) => {
308
+ return input.text.toUpperCase();
309
+ });
310
+ const worker = client.newWorker();
311
+ const handle = await workflow.run({ text: "hello world" });
312
+ await worker.tick();
313
+ const result = await handle.result();
314
+ expect(result).toBe("HELLO WORLD");
315
+ });
316
+ test("returns success with boolean result", async () => {
317
+ const backend = await createBackend();
318
+ const client = new OpenWorkflow({ backend });
319
+ const workflow = client.defineWorkflow({ name: "bool-result" }, ({ input }) => {
320
+ return input.value > 0;
321
+ });
322
+ const worker = client.newWorker();
323
+ const handle = await workflow.run({ value: 42 });
324
+ await worker.tick();
325
+ const result = await handle.result();
326
+ expect(result).toBe(true);
327
+ });
328
+ });
329
+ describe("step execution order", () => {
330
+ test("executes steps in sequence", async () => {
331
+ const backend = await createBackend();
332
+ const client = new OpenWorkflow({ backend });
333
+ const order = [];
334
+ const workflow = client.defineWorkflow({ name: "sequence-workflow" }, async ({ step }) => {
335
+ await step.run({ name: "first" }, () => order.push("first"));
336
+ await step.run({ name: "second" }, () => order.push("second"));
337
+ await step.run({ name: "third" }, () => order.push("third"));
338
+ return order;
339
+ });
340
+ const worker = client.newWorker();
341
+ const handle = await workflow.run();
342
+ await worker.tick();
343
+ const result = await handle.result();
344
+ expect(result).toEqual(["first", "second", "third"]);
345
+ });
346
+ });
347
+ describe("version handling", () => {
348
+ test("passes version to workflow function", async () => {
349
+ const backend = await createBackend();
350
+ const client = new OpenWorkflow({ backend });
351
+ const workflow = client.defineWorkflow({ name: "version-workflow", version: "1.0.0" }, ({ version }) => {
352
+ return { receivedVersion: version };
353
+ });
354
+ const worker = client.newWorker();
355
+ const handle = await workflow.run();
356
+ await worker.tick();
357
+ const result = await handle.result();
358
+ expect(result).toEqual({ receivedVersion: "1.0.0" });
359
+ });
360
+ test("passes null version when not specified", async () => {
361
+ const backend = await createBackend();
362
+ const client = new OpenWorkflow({ backend });
363
+ const workflow = client.defineWorkflow({ name: "no-version-workflow" }, ({ version }) => {
364
+ return { receivedVersion: version };
365
+ });
366
+ const worker = client.newWorker();
367
+ const handle = await workflow.run();
368
+ await worker.tick();
369
+ const result = await handle.result();
370
+ expect(result).toEqual({ receivedVersion: null });
371
+ });
372
+ });
373
+ });
374
+ async function createBackend() {
375
+ return await BackendPostgres.connect(DEFAULT_DATABASE_URL, {
376
+ namespaceId: randomUUID(),
377
+ });
378
+ }
379
+ function sleep(ms) {
380
+ return new Promise((resolve) => setTimeout(resolve, ms));
381
+ }
382
+ //# sourceMappingURL=execution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.test.js","sourceRoot":"","sources":["../../execution/execution.test.ts"],"names":[],"mappings":"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"}