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.
- package/README.md +17 -11
- package/dist/backend-sqlite/backend.d.ts +38 -0
- package/dist/backend-sqlite/backend.d.ts.map +1 -0
- package/dist/backend-sqlite/backend.js +628 -0
- package/dist/backend-sqlite/backend.js.map +1 -0
- package/dist/backend-sqlite/index.d.ts +2 -0
- package/dist/backend-sqlite/index.d.ts.map +1 -0
- package/dist/backend-sqlite/index.js +2 -0
- package/dist/backend-sqlite/index.js.map +1 -0
- package/dist/backend-sqlite/sqlite.d.ts +45 -0
- package/dist/backend-sqlite/sqlite.d.ts.map +1 -0
- package/dist/backend-sqlite/sqlite.js +229 -0
- package/dist/backend-sqlite/sqlite.js.map +1 -0
- package/dist/config/config.d.ts +102 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +29 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/core/backend-test-suite.d.ts +22 -0
- package/dist/core/backend-test-suite.d.ts.map +1 -0
- package/dist/core/backend-test-suite.js +960 -0
- package/dist/core/backend-test-suite.js.map +1 -0
- package/dist/core/backend.d.ts +103 -0
- package/dist/core/backend.d.ts.map +1 -0
- package/dist/core/backend.js +2 -0
- package/dist/core/backend.js.map +1 -0
- package/dist/core/backend.testsuite.d.ts +21 -0
- package/dist/core/backend.testsuite.d.ts.map +1 -0
- package/dist/core/backend.testsuite.js +958 -0
- package/dist/core/backend.testsuite.js.map +1 -0
- package/dist/{duration.d.ts → core/duration.d.ts} +2 -1
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/{duration.js → core/duration.js} +6 -5
- package/dist/core/duration.js.map +1 -0
- package/dist/core/duration.test.d.ts +2 -0
- package/dist/core/duration.test.d.ts.map +1 -0
- package/dist/core/duration.test.js +264 -0
- package/dist/core/duration.test.js.map +1 -0
- package/dist/core/json.d.ts +5 -0
- package/dist/core/json.d.ts.map +1 -0
- package/dist/core/json.js +2 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/result.d.ts +12 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +7 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/result.test.d.ts +2 -0
- package/dist/core/result.test.d.ts.map +1 -0
- package/dist/core/result.test.js +11 -0
- package/dist/core/result.test.js.map +1 -0
- package/dist/core/retry.d.ts +16 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/{backend.js → core/retry.js} +1 -3
- package/dist/core/retry.js.map +1 -0
- package/dist/core/retry.test.d.ts +2 -0
- package/dist/core/retry.test.d.ts.map +1 -0
- package/dist/core/retry.test.js +36 -0
- package/dist/core/retry.test.js.map +1 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/step.d.ts +120 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +101 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/step.test.d.ts +2 -0
- package/dist/core/step.test.d.ts.map +1 -0
- package/dist/core/step.test.js +340 -0
- package/dist/core/step.test.js.map +1 -0
- package/dist/core/workflow.d.ts +108 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +79 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/core/workflow.test.d.ts +2 -0
- package/dist/core/workflow.test.d.ts.map +1 -0
- package/dist/core/workflow.test.js +216 -0
- package/dist/core/workflow.test.js.map +1 -0
- package/dist/execution/execution.d.ts +91 -0
- package/dist/execution/execution.d.ts.map +1 -0
- package/dist/execution/execution.js +188 -0
- package/dist/execution/execution.js.map +1 -0
- package/dist/execution/execution.test.d.ts +2 -0
- package/dist/execution/execution.test.d.ts.map +1 -0
- package/dist/execution/execution.test.js +382 -0
- package/dist/execution/execution.test.js.map +1 -0
- package/dist/global.d.ts +62 -0
- package/dist/global.d.ts.map +1 -0
- package/dist/global.js +78 -0
- package/dist/global.js.map +1 -0
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/sdk/sdk.d.ts +182 -0
- package/dist/sdk/sdk.d.ts.map +1 -0
- package/dist/sdk/sdk.js +208 -0
- package/dist/sdk/sdk.js.map +1 -0
- package/dist/sdk/sdk.test.d.ts +2 -0
- package/dist/sdk/sdk.test.d.ts.map +1 -0
- package/dist/sdk/sdk.test.js +195 -0
- package/dist/sdk/sdk.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/{worker.d.ts → worker/worker.d.ts} +3 -3
- package/dist/worker/worker.d.ts.map +1 -0
- package/dist/worker/worker.js +208 -0
- package/dist/worker/worker.js.map +1 -0
- package/dist/worker/worker.test.d.ts +2 -0
- package/dist/worker/worker.test.d.ts.map +1 -0
- package/dist/worker/worker.test.js +786 -0
- package/dist/worker/worker.test.js.map +1 -0
- package/package.json +6 -6
- package/dist/backend.d.ts +0 -173
- package/dist/backend.d.ts.map +0 -1
- package/dist/backend.js.map +0 -1
- package/dist/client.d.ts +0 -153
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -151
- package/dist/client.js.map +0 -1
- package/dist/duration.d.ts.map +0 -1
- package/dist/duration.js.map +0 -1
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js.map +0 -1
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -384
- package/dist/worker.js.map +0 -1
- /package/dist/{schema.d.ts → core/schema.d.ts} +0 -0
- /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 @@
|
|
|
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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"}
|