@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.
- package/.oxlintrc.json +3 -0
- package/AGENTS.md +21 -0
- package/dist/backend.d.ts +126 -107
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +4 -1
- package/dist/backend.js.map +1 -1
- package/dist/client.d.ts +145 -132
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +219 -213
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +15 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -17
- package/dist/config.js.map +1 -1
- package/dist/core/duration.d.ts +5 -4
- package/dist/core/duration.d.ts.map +1 -1
- package/dist/core/duration.js +54 -59
- package/dist/core/duration.js.map +1 -1
- package/dist/core/error.d.ts +10 -7
- package/dist/core/error.d.ts.map +1 -1
- package/dist/core/error.js +21 -21
- package/dist/core/error.js.map +1 -1
- package/dist/core/json.d.ts +8 -3
- package/dist/core/json.d.ts.map +1 -1
- package/dist/core/result.d.ts +10 -14
- package/dist/core/result.d.ts.map +1 -1
- package/dist/core/result.js +21 -16
- package/dist/core/result.js.map +1 -1
- package/dist/core/retry.d.ts +37 -31
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/core/retry.js +44 -51
- package/dist/core/retry.js.map +1 -1
- package/dist/core/schema.d.ts +57 -53
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/step.d.ts +28 -78
- package/dist/core/step.d.ts.map +1 -1
- package/dist/core/step.js +53 -63
- package/dist/core/step.js.map +1 -1
- package/dist/core/workflow.d.ts +33 -61
- package/dist/core/workflow.d.ts.map +1 -1
- package/dist/core/workflow.js +31 -41
- package/dist/core/workflow.js.map +1 -1
- package/dist/database/backend.d.ts +53 -46
- package/dist/database/backend.d.ts.map +1 -1
- package/dist/database/backend.js +544 -577
- package/dist/database/backend.js.map +1 -1
- package/dist/database/base.js +48 -25
- package/dist/database/base.js.map +1 -1
- package/dist/database/migrations/20251212000000_0_init.d.ts +10 -0
- package/dist/database/migrations/20251212000000_0_init.d.ts.map +1 -0
- package/dist/database/migrations/20251212000000_0_init.js +8 -4
- package/dist/database/migrations/20251212000000_0_init.js.map +1 -1
- package/dist/database/migrations/20251212000000_1_tables.d.ts +10 -0
- package/dist/database/migrations/20251212000000_1_tables.d.ts.map +1 -0
- package/dist/database/migrations/20251212000000_1_tables.js +81 -83
- package/dist/database/migrations/20251212000000_1_tables.js.map +1 -1
- package/dist/database/migrations/20251212000000_2_fk.d.ts +10 -0
- package/dist/database/migrations/20251212000000_2_fk.d.ts.map +1 -0
- package/dist/database/migrations/20251212000000_2_fk.js +20 -43
- package/dist/database/migrations/20251212000000_2_fk.js.map +1 -1
- package/dist/database/migrations/20251212000000_3_indexes.d.ts +10 -0
- package/dist/database/migrations/20251212000000_3_indexes.d.ts.map +1 -0
- package/dist/database/migrations/20251212000000_3_indexes.js +88 -102
- package/dist/database/migrations/20251212000000_3_indexes.js.map +1 -1
- package/dist/database/pubsub.d.ts +7 -16
- package/dist/database/pubsub.d.ts.map +1 -1
- package/dist/database/pubsub.js +75 -73
- package/dist/database/pubsub.js.map +1 -1
- package/dist/execution.d.ts +20 -59
- package/dist/execution.d.ts.map +1 -1
- package/dist/execution.js +175 -188
- package/dist/execution.js.map +1 -1
- package/dist/index.d.ts +5 -8
- package/dist/index.js +5 -5
- package/dist/internal.d.ts +12 -13
- package/dist/internal.js +4 -4
- package/dist/registry.d.ts +33 -27
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +58 -49
- package/dist/registry.js.map +1 -1
- package/dist/worker.d.ts +57 -50
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +194 -199
- package/dist/worker.js.map +1 -1
- package/dist/workflow.d.ts +26 -30
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +20 -15
- package/dist/workflow.js.map +1 -1
- package/nodemon.json +1 -1
- package/package.json +17 -19
- package/src/backend.ts +25 -9
- package/src/chaos.test.ts +3 -1
- package/src/client.test.ts +2 -0
- package/src/client.ts +30 -8
- package/src/config.test.ts +1 -0
- package/src/config.ts +3 -2
- package/src/core/duration.test.ts +2 -1
- package/src/core/duration.ts +1 -1
- package/src/core/error.test.ts +1 -0
- package/src/core/error.ts +1 -1
- package/src/core/result.test.ts +1 -0
- package/src/core/retry.test.ts +3 -2
- package/src/core/retry.ts +1 -1
- package/src/core/schema.ts +2 -2
- package/src/core/step.test.ts +2 -1
- package/src/core/step.ts +4 -3
- package/src/core/workflow.test.ts +2 -1
- package/src/core/workflow.ts +4 -3
- package/src/database/backend.test.ts +1 -0
- package/src/database/backend.testsuite.ts +44 -40
- package/src/database/backend.ts +207 -25
- package/src/database/base.test.ts +41 -0
- package/src/database/base.ts +51 -2
- package/src/database/migrations/20251212000000_0_init.ts +2 -1
- package/src/database/migrations/20251212000000_1_tables.ts +2 -1
- package/src/database/migrations/20251212000000_2_fk.ts +2 -1
- package/src/database/migrations/20251212000000_3_indexes.ts +2 -1
- package/src/database/pubsub.test.ts +6 -3
- package/src/database/pubsub.ts +55 -33
- package/src/execution.test.ts +2 -0
- package/src/execution.ts +49 -10
- package/src/internal.ts +15 -15
- package/src/practices/01-remote-workflow.ts +1 -0
- package/src/registry.test.ts +1 -0
- package/src/registry.ts +1 -1
- package/src/testing/connection.ts +3 -1
- package/src/worker.test.ts +2 -0
- package/src/worker.ts +30 -9
- package/src/workflow.test.ts +1 -0
- package/src/workflow.ts +3 -3
- package/templates/openworkflow.config.ts +2 -1
- package/tsdown.config.ts +31 -0
- package/.swcrc +0 -17
- package/dist/chaos.test.d.ts +0 -2
- package/dist/chaos.test.d.ts.map +0 -1
- package/dist/chaos.test.js +0 -92
- package/dist/chaos.test.js.map +0 -1
- package/dist/client.test.d.ts +0 -2
- package/dist/client.test.d.ts.map +0 -1
- package/dist/client.test.js +0 -340
- package/dist/client.test.js.map +0 -1
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -24
- package/dist/config.test.js.map +0 -1
- package/dist/core/duration.test.d.ts +0 -2
- package/dist/core/duration.test.d.ts.map +0 -1
- package/dist/core/duration.test.js +0 -265
- package/dist/core/duration.test.js.map +0 -1
- package/dist/core/error.test.d.ts +0 -2
- package/dist/core/error.test.d.ts.map +0 -1
- package/dist/core/error.test.js +0 -63
- package/dist/core/error.test.js.map +0 -1
- package/dist/core/json.js +0 -3
- package/dist/core/json.js.map +0 -1
- package/dist/core/result.test.d.ts +0 -2
- package/dist/core/result.test.d.ts.map +0 -1
- package/dist/core/result.test.js +0 -19
- package/dist/core/result.test.js.map +0 -1
- package/dist/core/retry.test.d.ts +0 -2
- package/dist/core/retry.test.d.ts.map +0 -1
- package/dist/core/retry.test.js +0 -198
- package/dist/core/retry.test.js.map +0 -1
- package/dist/core/schema.js +0 -4
- package/dist/core/schema.js.map +0 -1
- package/dist/core/step.test.d.ts +0 -2
- package/dist/core/step.test.d.ts.map +0 -1
- package/dist/core/step.test.js +0 -356
- package/dist/core/step.test.js.map +0 -1
- package/dist/core/workflow.test.d.ts +0 -2
- package/dist/core/workflow.test.d.ts.map +0 -1
- package/dist/core/workflow.test.js +0 -172
- package/dist/core/workflow.test.js.map +0 -1
- package/dist/database/backend.test.d.ts +0 -2
- package/dist/database/backend.test.d.ts.map +0 -1
- package/dist/database/backend.test.js +0 -19
- package/dist/database/backend.test.js.map +0 -1
- package/dist/database/backend.testsuite.d.ts +0 -20
- package/dist/database/backend.testsuite.d.ts.map +0 -1
- package/dist/database/backend.testsuite.js +0 -1280
- package/dist/database/backend.testsuite.js.map +0 -1
- package/dist/database/base.d.ts +0 -12
- package/dist/database/base.d.ts.map +0 -1
- package/dist/database/pubsub.test.d.ts +0 -2
- package/dist/database/pubsub.test.d.ts.map +0 -1
- package/dist/database/pubsub.test.js +0 -86
- package/dist/database/pubsub.test.js.map +0 -1
- package/dist/execution.test.d.ts +0 -2
- package/dist/execution.test.d.ts.map +0 -1
- package/dist/execution.test.js +0 -662
- package/dist/execution.test.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal.d.ts.map +0 -1
- package/dist/internal.js.map +0 -1
- package/dist/practices/01-remote-workflow.d.ts +0 -2
- package/dist/practices/01-remote-workflow.d.ts.map +0 -1
- package/dist/practices/01-remote-workflow.js +0 -70
- package/dist/practices/01-remote-workflow.js.map +0 -1
- package/dist/registry.test.d.ts +0 -2
- package/dist/registry.test.d.ts.map +0 -1
- package/dist/registry.test.js +0 -95
- package/dist/registry.test.js.map +0 -1
- package/dist/testing/connection.d.ts +0 -7
- package/dist/testing/connection.d.ts.map +0 -1
- package/dist/testing/connection.js +0 -39
- package/dist/testing/connection.js.map +0 -1
- package/dist/worker.test.d.ts +0 -2
- package/dist/worker.test.d.ts.map +0 -1
- package/dist/worker.test.js +0 -1164
- package/dist/worker.test.js.map +0 -1
- package/dist/workflow.test.d.ts +0 -2
- package/dist/workflow.test.d.ts.map +0 -1
- package/dist/workflow.test.js +0 -73
- package/dist/workflow.test.js.map +0 -1
package/tsdown.config.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readdirSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { defineConfig } from "tsdown";
|
|
5
|
+
|
|
6
|
+
const migrationsDir = path.join(import.meta.dirname, "src/database/migrations");
|
|
7
|
+
const migrationEntries = Object.fromEntries(
|
|
8
|
+
readdirSync(migrationsDir)
|
|
9
|
+
.filter((filename) => filename.endsWith(".ts"))
|
|
10
|
+
.map((filename) => [
|
|
11
|
+
`database/migrations/${filename.replace(/\.ts$/, "")}`,
|
|
12
|
+
`src/database/migrations/${filename}`,
|
|
13
|
+
]),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export default defineConfig({
|
|
17
|
+
clean: true,
|
|
18
|
+
dts: {
|
|
19
|
+
sourcemap: true,
|
|
20
|
+
},
|
|
21
|
+
entry: {
|
|
22
|
+
index: "src/index.ts",
|
|
23
|
+
internal: "src/internal.ts",
|
|
24
|
+
...migrationEntries,
|
|
25
|
+
},
|
|
26
|
+
format: "esm",
|
|
27
|
+
platform: "node",
|
|
28
|
+
sourcemap: true,
|
|
29
|
+
target: "esnext",
|
|
30
|
+
unbundle: true,
|
|
31
|
+
});
|
package/.swcrc
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://swc.rs/schema.json",
|
|
3
|
-
"module": {
|
|
4
|
-
"type": "es6", // import/export 쓰는 esm으로 가겠습니다.
|
|
5
|
-
"resolveFully": true // esm이 요구하는 대로, 임포트 경로를 실제 파일 경로(확장자 포함)로 풀어줍니다.
|
|
6
|
-
},
|
|
7
|
-
"jsc": {
|
|
8
|
-
"parser": {
|
|
9
|
-
"syntax": "typescript",
|
|
10
|
-
"decorators": true
|
|
11
|
-
},
|
|
12
|
-
"baseUrl": ".", // 위 resolveFully 옵션이 작동하려면 이게 필요합니다. 이 파일이 있는 로컬에서 쉘에 직접 실행할 때에는 baseUrl에 이 파일이 위치한 경로 기준으로 절대경로가 resolve되어 들어갑니다. 그러나 만약 swc를 코드 상에서 import해서 쓰거나, 아니면 설정 파일(.swcrc) 대신 -C로 설정을 명령줄에 직접 넘기는 경우, baseUrl에 직접 올바른 절대경로를 넣어주어야 합니다.
|
|
13
|
-
"target": "esnext" // 타겟은 그냥 최신 문법으로.
|
|
14
|
-
},
|
|
15
|
-
"minify": false, // 어차피 용량 10%정도 차이밖에 안 남. minify를 끄면 혹시 혹시 정말 혹시나 나중에 소스맵 없이 코드를 봐야 하는 끔찍한 상황에 조금이나마 도움이 될 수 있지 않을까 해서 끔.
|
|
16
|
-
"sourceMaps": true // 소스맵 생성. 선언맵은 밖에서 tsc로 따로 만들거예요.
|
|
17
|
-
}
|
package/dist/chaos.test.d.ts
DELETED
package/dist/chaos.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chaos.test.d.ts","sourceRoot":"","sources":["../src/chaos.test.ts"],"names":[],"mappings":""}
|
package/dist/chaos.test.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { randomInt } from "node:crypto";
|
|
2
|
-
import { describe, expect, test } from "vitest";
|
|
3
|
-
import { OpenWorkflow } from "./client.js";
|
|
4
|
-
import { createBackend } from "./testing/connection.js";
|
|
5
|
-
const TOTAL_STEPS = 50;
|
|
6
|
-
const WORKER_COUNT = 3;
|
|
7
|
-
const WORKER_CONCURRENCY = 2;
|
|
8
|
-
const STEP_DURATION_MS = 25;
|
|
9
|
-
const CHAOS_DURATION_MS = 5000;
|
|
10
|
-
const CHAOS_INTERVAL_MS = 200;
|
|
11
|
-
const TEST_TIMEOUT_MS = 30_000;
|
|
12
|
-
describe("chaos test", ()=>{
|
|
13
|
-
test("workflow completes despite random worker deaths (known slow test)", async ()=>{
|
|
14
|
-
const backend = await createBackend();
|
|
15
|
-
const client = new OpenWorkflow({
|
|
16
|
-
backend
|
|
17
|
-
});
|
|
18
|
-
const workflow = client.defineWorkflow({
|
|
19
|
-
name: "chaos-workflow"
|
|
20
|
-
}, async ({ step })=>{
|
|
21
|
-
const results = [];
|
|
22
|
-
for(let i = 0; i < TOTAL_STEPS; i++){
|
|
23
|
-
const stepName = `step-${i.toString()}`;
|
|
24
|
-
const result = await step.run({
|
|
25
|
-
name: stepName
|
|
26
|
-
}, async ()=>{
|
|
27
|
-
await sleep(STEP_DURATION_MS); // fake work
|
|
28
|
-
return i;
|
|
29
|
-
});
|
|
30
|
-
results.push(result);
|
|
31
|
-
}
|
|
32
|
-
return results;
|
|
33
|
-
});
|
|
34
|
-
const workers = await Promise.all(Array.from({
|
|
35
|
-
length: WORKER_COUNT
|
|
36
|
-
}, ()=>createAndStartWorker(client)));
|
|
37
|
-
const handle = await workflow.run();
|
|
38
|
-
let workflowCompleted = false;
|
|
39
|
-
let chaosTask = null;
|
|
40
|
-
try {
|
|
41
|
-
chaosTask = runChaosTest({
|
|
42
|
-
client,
|
|
43
|
-
workers,
|
|
44
|
-
durationMs: CHAOS_DURATION_MS,
|
|
45
|
-
intervalMs: CHAOS_INTERVAL_MS,
|
|
46
|
-
shouldStop: ()=>workflowCompleted
|
|
47
|
-
});
|
|
48
|
-
const result = await handle.result();
|
|
49
|
-
workflowCompleted = true;
|
|
50
|
-
const restarts = await chaosTask;
|
|
51
|
-
expect(result).toHaveLength(TOTAL_STEPS);
|
|
52
|
-
expect(result[TOTAL_STEPS - 1]).toBe(TOTAL_STEPS - 1);
|
|
53
|
-
expect(restarts).toBeGreaterThan(0);
|
|
54
|
-
} finally{
|
|
55
|
-
workflowCompleted = true;
|
|
56
|
-
if (chaosTask) await chaosTask;
|
|
57
|
-
await Promise.all(workers.map((worker)=>worker.stop()));
|
|
58
|
-
await backend.stop();
|
|
59
|
-
}
|
|
60
|
-
}, TEST_TIMEOUT_MS);
|
|
61
|
-
});
|
|
62
|
-
async function runChaosTest(params) {
|
|
63
|
-
const { client, workers, durationMs, intervalMs, shouldStop } = params;
|
|
64
|
-
const chaosEndsAt = Date.now() + durationMs;
|
|
65
|
-
let restartCount = 0;
|
|
66
|
-
while(Date.now() < chaosEndsAt && !shouldStop()){
|
|
67
|
-
await sleep(intervalMs);
|
|
68
|
-
if (workers.length === 0) {
|
|
69
|
-
workers.push(await createAndStartWorker(client));
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const index = randomInt(workers.length);
|
|
73
|
-
const victim = workers.splice(index, 1)[0];
|
|
74
|
-
await victim?.stop();
|
|
75
|
-
const replacement = await createAndStartWorker(client);
|
|
76
|
-
workers.push(replacement);
|
|
77
|
-
restartCount++;
|
|
78
|
-
}
|
|
79
|
-
return restartCount;
|
|
80
|
-
}
|
|
81
|
-
async function createAndStartWorker(client) {
|
|
82
|
-
const worker = client.newWorker({
|
|
83
|
-
concurrency: WORKER_CONCURRENCY
|
|
84
|
-
});
|
|
85
|
-
await worker.start();
|
|
86
|
-
return worker;
|
|
87
|
-
}
|
|
88
|
-
function sleep(ms) {
|
|
89
|
-
return new Promise((resolve)=>setTimeout(resolve, ms));
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
//# sourceMappingURL=chaos.test.js.map
|
package/dist/chaos.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chaos.test.ts"],"sourcesContent":["import { randomInt } from \"node:crypto\";\nimport { describe, expect, test } from \"vitest\";\nimport { OpenWorkflow } from \"./client\";\nimport { createBackend } from \"./testing/connection\";\nimport type { Worker } from \"./worker\";\n\nconst TOTAL_STEPS = 50;\nconst WORKER_COUNT = 3;\nconst WORKER_CONCURRENCY = 2;\nconst STEP_DURATION_MS = 25;\nconst CHAOS_DURATION_MS = 5000;\nconst CHAOS_INTERVAL_MS = 200;\nconst TEST_TIMEOUT_MS = 30_000;\n\ndescribe(\"chaos test\", () => {\n test(\n \"workflow completes despite random worker deaths (known slow test)\",\n async () => {\n const backend = await createBackend();\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"chaos-workflow\" }, async ({ step }) => {\n const results: number[] = [];\n for (let i = 0; i < TOTAL_STEPS; i++) {\n const stepName = `step-${i.toString()}`;\n const result = await step.run({ name: stepName }, async () => {\n await sleep(STEP_DURATION_MS); // fake work\n return i;\n });\n results.push(result);\n }\n return results;\n });\n\n const workers = await Promise.all(\n Array.from({ length: WORKER_COUNT }, () => createAndStartWorker(client)),\n );\n\n const handle = await workflow.run();\n let workflowCompleted = false;\n let chaosTask: Promise<number> | null = null;\n\n try {\n chaosTask = runChaosTest({\n client,\n workers,\n durationMs: CHAOS_DURATION_MS,\n intervalMs: CHAOS_INTERVAL_MS,\n shouldStop: () => workflowCompleted,\n });\n\n const result = await handle.result();\n workflowCompleted = true;\n const restarts = await chaosTask;\n\n expect(result).toHaveLength(TOTAL_STEPS);\n expect(result[TOTAL_STEPS - 1]).toBe(TOTAL_STEPS - 1);\n expect(restarts).toBeGreaterThan(0);\n } finally {\n workflowCompleted = true;\n if (chaosTask) await chaosTask;\n await Promise.all(workers.map((worker) => worker.stop()));\n await backend.stop();\n }\n },\n TEST_TIMEOUT_MS,\n );\n});\n\nasync function runChaosTest(params: {\n client: OpenWorkflow;\n workers: Worker[];\n durationMs: number;\n intervalMs: number;\n shouldStop: () => boolean;\n}): Promise<number> {\n const { client, workers, durationMs, intervalMs, shouldStop } = params;\n const chaosEndsAt = Date.now() + durationMs;\n let restartCount = 0;\n\n while (Date.now() < chaosEndsAt && !shouldStop()) {\n await sleep(intervalMs);\n if (workers.length === 0) {\n workers.push(await createAndStartWorker(client));\n continue;\n }\n\n const index = randomInt(workers.length);\n const victim = workers.splice(index, 1)[0];\n await victim?.stop();\n\n const replacement = await createAndStartWorker(client);\n workers.push(replacement);\n restartCount++;\n }\n\n return restartCount;\n}\n\nasync function createAndStartWorker(client: OpenWorkflow): Promise<Worker> {\n const worker = client.newWorker({ concurrency: WORKER_CONCURRENCY });\n await worker.start();\n return worker;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],"names":["randomInt","describe","expect","test","OpenWorkflow","createBackend","TOTAL_STEPS","WORKER_COUNT","WORKER_CONCURRENCY","STEP_DURATION_MS","CHAOS_DURATION_MS","CHAOS_INTERVAL_MS","TEST_TIMEOUT_MS","backend","client","workflow","defineWorkflow","name","step","results","i","stepName","toString","result","run","sleep","push","workers","Promise","all","Array","from","length","createAndStartWorker","handle","workflowCompleted","chaosTask","runChaosTest","durationMs","intervalMs","shouldStop","restarts","toHaveLength","toBe","toBeGreaterThan","map","worker","stop","params","chaosEndsAt","Date","now","restartCount","index","victim","splice","replacement","newWorker","concurrency","start","ms","resolve","setTimeout"],"mappings":"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"}
|
package/dist/client.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
|
package/dist/client.test.js
DELETED
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, test } from "vitest";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
import { BackendPostgres } from "./index.js";
|
|
5
|
-
import { declareWorkflow, OpenWorkflow } from "./client.js";
|
|
6
|
-
import { KNEX_GLOBAL_CONFIG } from "./testing/connection.js";
|
|
7
|
-
describe("OpenWorkflow", ()=>{
|
|
8
|
-
let backend;
|
|
9
|
-
beforeEach(async ()=>{
|
|
10
|
-
backend = new BackendPostgres(KNEX_GLOBAL_CONFIG, {
|
|
11
|
-
namespaceId: randomUUID(),
|
|
12
|
-
runMigrations: false
|
|
13
|
-
});
|
|
14
|
-
await backend.initialize();
|
|
15
|
-
});
|
|
16
|
-
afterEach(async ()=>{
|
|
17
|
-
await backend.stop();
|
|
18
|
-
});
|
|
19
|
-
test("enqueues workflow runs via backend", async ()=>{
|
|
20
|
-
const client = new OpenWorkflow({
|
|
21
|
-
backend
|
|
22
|
-
});
|
|
23
|
-
const workflow = client.defineWorkflow({
|
|
24
|
-
name: "enqueue-test"
|
|
25
|
-
}, noopFn);
|
|
26
|
-
await workflow.run({
|
|
27
|
-
docUrl: "https://example.com"
|
|
28
|
-
});
|
|
29
|
-
const workerId = "enqueue-worker";
|
|
30
|
-
const claimed = await backend.claimWorkflowRun({
|
|
31
|
-
workerId,
|
|
32
|
-
leaseDurationMs: 1000
|
|
33
|
-
});
|
|
34
|
-
expect(claimed?.workflowName).toBe("enqueue-test");
|
|
35
|
-
expect(claimed?.workerId).toBe(workerId);
|
|
36
|
-
expect(claimed?.input).toEqual({
|
|
37
|
-
docUrl: "https://example.com"
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
describe("schema validation", ()=>{
|
|
41
|
-
describe("Zod schema", ()=>{
|
|
42
|
-
const schema = z.object({
|
|
43
|
-
userId: z.uuid(),
|
|
44
|
-
count: z.number().int().positive()
|
|
45
|
-
});
|
|
46
|
-
test("accepts valid input", async ()=>{
|
|
47
|
-
const client = new OpenWorkflow({
|
|
48
|
-
backend
|
|
49
|
-
});
|
|
50
|
-
const workflow = client.defineWorkflow({
|
|
51
|
-
name: "schema-zod-valid",
|
|
52
|
-
schema
|
|
53
|
-
}, noopFn);
|
|
54
|
-
const handle = await workflow.run({
|
|
55
|
-
userId: randomUUID(),
|
|
56
|
-
count: 3
|
|
57
|
-
});
|
|
58
|
-
await handle.cancel();
|
|
59
|
-
});
|
|
60
|
-
test("rejects invalid input", async ()=>{
|
|
61
|
-
const client = new OpenWorkflow({
|
|
62
|
-
backend
|
|
63
|
-
});
|
|
64
|
-
const workflow = client.defineWorkflow({
|
|
65
|
-
name: "schema-zod-invalid",
|
|
66
|
-
schema
|
|
67
|
-
}, noopFn);
|
|
68
|
-
await expect(workflow.run({
|
|
69
|
-
userId: "not-a-uuid",
|
|
70
|
-
count: 0
|
|
71
|
-
})).rejects.toThrow();
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
test("result resolves when workflow succeeds", async ()=>{
|
|
76
|
-
const client = new OpenWorkflow({
|
|
77
|
-
backend
|
|
78
|
-
});
|
|
79
|
-
const workflow = client.defineWorkflow({
|
|
80
|
-
name: "result-success"
|
|
81
|
-
}, noopFn);
|
|
82
|
-
const handle = await workflow.run({
|
|
83
|
-
value: 1
|
|
84
|
-
});
|
|
85
|
-
const workerId = "test-worker";
|
|
86
|
-
const claimed = await backend.claimWorkflowRun({
|
|
87
|
-
workerId,
|
|
88
|
-
leaseDurationMs: 1000
|
|
89
|
-
});
|
|
90
|
-
expect(claimed).not.toBeNull();
|
|
91
|
-
if (!claimed) throw new Error("workflow run was not claimed");
|
|
92
|
-
await backend.completeWorkflowRun({
|
|
93
|
-
workflowRunId: claimed.id,
|
|
94
|
-
workerId,
|
|
95
|
-
output: {
|
|
96
|
-
ok: true
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
// eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
|
|
100
|
-
const result = await handle.result();
|
|
101
|
-
expect(result).toEqual({
|
|
102
|
-
ok: true
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
test("result rejects when workflow fails", async ()=>{
|
|
106
|
-
const client = new OpenWorkflow({
|
|
107
|
-
backend
|
|
108
|
-
});
|
|
109
|
-
const workflow = client.defineWorkflow({
|
|
110
|
-
name: "result-failure"
|
|
111
|
-
}, noopFn);
|
|
112
|
-
await workflow.run({
|
|
113
|
-
value: 1
|
|
114
|
-
});
|
|
115
|
-
const workerId = "test-worker";
|
|
116
|
-
const claimed = await backend.claimWorkflowRun({
|
|
117
|
-
workerId,
|
|
118
|
-
leaseDurationMs: 1000
|
|
119
|
-
});
|
|
120
|
-
expect(claimed).not.toBeNull();
|
|
121
|
-
if (!claimed) throw new Error("workflow run was not claimed");
|
|
122
|
-
// mark as failed (should reschedule))
|
|
123
|
-
await backend.failWorkflowRun({
|
|
124
|
-
workflowRunId: claimed.id,
|
|
125
|
-
workerId,
|
|
126
|
-
error: {
|
|
127
|
-
message: "boom"
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
const rescheduled = await backend.getWorkflowRun({
|
|
131
|
-
workflowRunId: claimed.id
|
|
132
|
-
});
|
|
133
|
-
expect(rescheduled?.status).toBe("pending");
|
|
134
|
-
expect(rescheduled?.error).toEqual({
|
|
135
|
-
message: "boom"
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
test("creates workflow run with deadline", async ()=>{
|
|
139
|
-
const client = new OpenWorkflow({
|
|
140
|
-
backend
|
|
141
|
-
});
|
|
142
|
-
const workflow = client.defineWorkflow({
|
|
143
|
-
name: "deadline-test"
|
|
144
|
-
}, noopFn);
|
|
145
|
-
const deadline = new Date(Date.now() + 60_000); // in 1 minute
|
|
146
|
-
const handle = await workflow.run({
|
|
147
|
-
value: 1
|
|
148
|
-
}, {
|
|
149
|
-
deadlineAt: deadline
|
|
150
|
-
});
|
|
151
|
-
expect(handle.workflowRun.deadlineAt).not.toBeNull();
|
|
152
|
-
expect(handle.workflowRun.deadlineAt?.getTime()).toBe(deadline.getTime());
|
|
153
|
-
});
|
|
154
|
-
test("creates workflow run with version", async ()=>{
|
|
155
|
-
const client = new OpenWorkflow({
|
|
156
|
-
backend
|
|
157
|
-
});
|
|
158
|
-
const workflow = client.defineWorkflow({
|
|
159
|
-
name: "versioned-test",
|
|
160
|
-
version: "v2.0"
|
|
161
|
-
}, noopFn);
|
|
162
|
-
const handle = await workflow.run({
|
|
163
|
-
value: 1
|
|
164
|
-
});
|
|
165
|
-
expect(handle.workflowRun.version).toBe("v2.0");
|
|
166
|
-
});
|
|
167
|
-
test("creates workflow run without version", async ()=>{
|
|
168
|
-
const client = new OpenWorkflow({
|
|
169
|
-
backend
|
|
170
|
-
});
|
|
171
|
-
const workflow = client.defineWorkflow({
|
|
172
|
-
name: "unversioned-test"
|
|
173
|
-
}, noopFn);
|
|
174
|
-
const handle = await workflow.run({
|
|
175
|
-
value: 1
|
|
176
|
-
});
|
|
177
|
-
expect(handle.workflowRun.version).toBeNull();
|
|
178
|
-
});
|
|
179
|
-
test("cancels workflow run via handle", async ()=>{
|
|
180
|
-
const client = new OpenWorkflow({
|
|
181
|
-
backend
|
|
182
|
-
});
|
|
183
|
-
const workflow = client.defineWorkflow({
|
|
184
|
-
name: "cancel-test"
|
|
185
|
-
}, noopFn);
|
|
186
|
-
const handle = await workflow.run({
|
|
187
|
-
value: 1
|
|
188
|
-
});
|
|
189
|
-
await handle.cancel();
|
|
190
|
-
const workflowRun = await backend.getWorkflowRun({
|
|
191
|
-
workflowRunId: handle.workflowRun.id
|
|
192
|
-
});
|
|
193
|
-
expect(workflowRun?.status).toBe("canceled");
|
|
194
|
-
expect(workflowRun?.finishedAt).not.toBeNull();
|
|
195
|
-
});
|
|
196
|
-
describe("declareWorkflow / implementWorkflow API", ()=>{
|
|
197
|
-
test("declareWorkflow returns a spec that can be used to schedule runs", async ()=>{
|
|
198
|
-
const client = new OpenWorkflow({
|
|
199
|
-
backend
|
|
200
|
-
});
|
|
201
|
-
const spec = declareWorkflow({
|
|
202
|
-
name: "declare-test"
|
|
203
|
-
});
|
|
204
|
-
const handle = await client.runWorkflow(spec, {
|
|
205
|
-
message: "hello"
|
|
206
|
-
});
|
|
207
|
-
expect(handle.workflowRun.workflowName).toBe("declare-test");
|
|
208
|
-
await handle.cancel();
|
|
209
|
-
});
|
|
210
|
-
test("implementWorkflow registers the workflow for worker execution", async ()=>{
|
|
211
|
-
const client = new OpenWorkflow({
|
|
212
|
-
backend
|
|
213
|
-
});
|
|
214
|
-
const spec = declareWorkflow({
|
|
215
|
-
name: "implement-test"
|
|
216
|
-
});
|
|
217
|
-
client.implementWorkflow(spec, ({ input })=>{
|
|
218
|
-
return {
|
|
219
|
-
received: input
|
|
220
|
-
};
|
|
221
|
-
});
|
|
222
|
-
const handle = await client.runWorkflow(spec, {
|
|
223
|
-
data: 42
|
|
224
|
-
});
|
|
225
|
-
const worker = client.newWorker();
|
|
226
|
-
await worker.tick();
|
|
227
|
-
await sleep(100); // wait for background execution
|
|
228
|
-
const result = await handle.result();
|
|
229
|
-
expect(result).toEqual({
|
|
230
|
-
received: {
|
|
231
|
-
data: 42
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
test("implementWorkflow throws when workflow is already registered", async ()=>{
|
|
236
|
-
const client = new OpenWorkflow({
|
|
237
|
-
backend
|
|
238
|
-
});
|
|
239
|
-
const spec = declareWorkflow({
|
|
240
|
-
name: "duplicate-test"
|
|
241
|
-
});
|
|
242
|
-
client.implementWorkflow(spec, noopFn);
|
|
243
|
-
expect(()=>{
|
|
244
|
-
client.implementWorkflow(spec, noopFn);
|
|
245
|
-
}).toThrow('Workflow "duplicate-test" is already registered');
|
|
246
|
-
});
|
|
247
|
-
test("implementWorkflow allows registering different versions of the same workflow", async ()=>{
|
|
248
|
-
const client = new OpenWorkflow({
|
|
249
|
-
backend
|
|
250
|
-
});
|
|
251
|
-
const specV1 = declareWorkflow({
|
|
252
|
-
name: "multi-version",
|
|
253
|
-
version: "v1"
|
|
254
|
-
});
|
|
255
|
-
const specV2 = declareWorkflow({
|
|
256
|
-
name: "multi-version",
|
|
257
|
-
version: "v2"
|
|
258
|
-
});
|
|
259
|
-
// no throwing...
|
|
260
|
-
client.implementWorkflow(specV1, noopFn);
|
|
261
|
-
client.implementWorkflow(specV2, noopFn);
|
|
262
|
-
});
|
|
263
|
-
test("implementWorkflow throws for same name+version combination", async ()=>{
|
|
264
|
-
const client = new OpenWorkflow({
|
|
265
|
-
backend
|
|
266
|
-
});
|
|
267
|
-
const spec1 = declareWorkflow({
|
|
268
|
-
name: "version-duplicate",
|
|
269
|
-
version: "v1"
|
|
270
|
-
});
|
|
271
|
-
const spec2 = declareWorkflow({
|
|
272
|
-
name: "version-duplicate",
|
|
273
|
-
version: "v1"
|
|
274
|
-
});
|
|
275
|
-
client.implementWorkflow(spec1, noopFn);
|
|
276
|
-
expect(()=>{
|
|
277
|
-
client.implementWorkflow(spec2, noopFn);
|
|
278
|
-
}).toThrow('Workflow "version-duplicate" (version: v1) is already registered');
|
|
279
|
-
});
|
|
280
|
-
test("declareWorkflow with schema validates input on runWorkflow", async ()=>{
|
|
281
|
-
const client = new OpenWorkflow({
|
|
282
|
-
backend
|
|
283
|
-
});
|
|
284
|
-
const schema = z.object({
|
|
285
|
-
email: z.email()
|
|
286
|
-
});
|
|
287
|
-
const spec = declareWorkflow({
|
|
288
|
-
name: "declare-schema-test",
|
|
289
|
-
schema
|
|
290
|
-
});
|
|
291
|
-
const handle = await client.runWorkflow(spec, {
|
|
292
|
-
email: "test@example.com"
|
|
293
|
-
});
|
|
294
|
-
await handle.cancel();
|
|
295
|
-
await expect(client.runWorkflow(spec, {
|
|
296
|
-
email: "not-an-email"
|
|
297
|
-
})).rejects.toThrow();
|
|
298
|
-
});
|
|
299
|
-
test("declareWorkflow with version sets version on workflow run", async ()=>{
|
|
300
|
-
const client = new OpenWorkflow({
|
|
301
|
-
backend
|
|
302
|
-
});
|
|
303
|
-
const spec = declareWorkflow({
|
|
304
|
-
name: "declare-version-test",
|
|
305
|
-
version: "v1.2.3"
|
|
306
|
-
});
|
|
307
|
-
const handle = await client.runWorkflow(spec);
|
|
308
|
-
expect(handle.workflowRun.version).toBe("v1.2.3");
|
|
309
|
-
await handle.cancel();
|
|
310
|
-
});
|
|
311
|
-
test("defineWorkflow wraps declareWorkflow and implementWorkflow", async ()=>{
|
|
312
|
-
const client = new OpenWorkflow({
|
|
313
|
-
backend
|
|
314
|
-
});
|
|
315
|
-
const workflow = client.defineWorkflow({
|
|
316
|
-
name: "define-wrap-test"
|
|
317
|
-
}, ({ input })=>({
|
|
318
|
-
doubled: input.n * 2
|
|
319
|
-
}));
|
|
320
|
-
const handle = await workflow.run({
|
|
321
|
-
n: 21
|
|
322
|
-
});
|
|
323
|
-
const worker = client.newWorker();
|
|
324
|
-
await worker.tick();
|
|
325
|
-
await sleep(100); // wait for background execution
|
|
326
|
-
const result = await handle.result();
|
|
327
|
-
expect(result).toEqual({
|
|
328
|
-
doubled: 42
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
function sleep(ms) {
|
|
334
|
-
return new Promise((resolve)=>setTimeout(resolve, ms));
|
|
335
|
-
}
|
|
336
|
-
async function noopFn() {
|
|
337
|
-
// no-op
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
//# sourceMappingURL=client.test.js.map
|
package/dist/client.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.test.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { afterEach, beforeEach, describe, expect, test } from \"vitest\";\nimport { z } from \"zod\";\nimport { BackendPostgres } from \".\";\nimport { declareWorkflow, OpenWorkflow } from \"./client\";\nimport { KNEX_GLOBAL_CONFIG } from \"./testing/connection\";\n\ndescribe(\"OpenWorkflow\", () => {\n let backend: BackendPostgres;\n\n beforeEach(async () => {\n backend = new BackendPostgres(KNEX_GLOBAL_CONFIG, {\n namespaceId: randomUUID(),\n runMigrations: false,\n });\n await backend.initialize();\n });\n\n afterEach(async () => {\n await backend.stop();\n });\n\n test(\"enqueues workflow runs via backend\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"enqueue-test\" }, noopFn);\n await workflow.run({ docUrl: \"https://example.com\" });\n\n const workerId = \"enqueue-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n\n expect(claimed?.workflowName).toBe(\"enqueue-test\");\n expect(claimed?.workerId).toBe(workerId);\n expect(claimed?.input).toEqual({ docUrl: \"https://example.com\" });\n });\n\n describe(\"schema validation\", () => {\n describe(\"Zod schema\", () => {\n const schema = z.object({\n userId: z.uuid(),\n count: z.number().int().positive(),\n });\n\n test(\"accepts valid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-valid\", schema }, noopFn);\n\n const handle = await workflow.run({\n userId: randomUUID(),\n count: 3,\n });\n\n await handle.cancel();\n });\n\n test(\"rejects invalid input\", async () => {\n const client = new OpenWorkflow({ backend });\n const workflow = client.defineWorkflow({ name: \"schema-zod-invalid\", schema }, noopFn);\n\n await expect(workflow.run({ userId: \"not-a-uuid\", count: 0 } as never)).rejects.toThrow();\n });\n });\n });\n\n test(\"result resolves when workflow succeeds\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-success\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n await backend.completeWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n output: { ok: true },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n const result = await handle.result();\n expect(result).toEqual({ ok: true });\n });\n\n test(\"result rejects when workflow fails\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"result-failure\" }, noopFn);\n await workflow.run({ value: 1 });\n\n const workerId = \"test-worker\";\n const claimed = await backend.claimWorkflowRun({\n workerId,\n leaseDurationMs: 1000,\n });\n expect(claimed).not.toBeNull();\n if (!claimed) throw new Error(\"workflow run was not claimed\");\n\n // mark as failed (should reschedule))\n await backend.failWorkflowRun({\n workflowRunId: claimed.id,\n workerId,\n error: { message: \"boom\" },\n });\n\n const rescheduled = await backend.getWorkflowRun({\n workflowRunId: claimed.id,\n });\n expect(rescheduled?.status).toBe(\"pending\");\n expect(rescheduled?.error).toEqual({ message: \"boom\" });\n });\n\n test(\"creates workflow run with deadline\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"deadline-test\" }, noopFn);\n const deadline = new Date(Date.now() + 60_000); // in 1 minute\n const handle = await workflow.run({ value: 1 }, { deadlineAt: deadline });\n\n expect(handle.workflowRun.deadlineAt).not.toBeNull();\n expect(handle.workflowRun.deadlineAt?.getTime()).toBe(deadline.getTime());\n });\n\n test(\"creates workflow run with version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"versioned-test\", version: \"v2.0\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBe(\"v2.0\");\n });\n\n test(\"creates workflow run without version\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"unversioned-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n expect(handle.workflowRun.version).toBeNull();\n });\n\n test(\"cancels workflow run via handle\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"cancel-test\" }, noopFn);\n const handle = await workflow.run({ value: 1 });\n\n await handle.cancel();\n\n const workflowRun = await backend.getWorkflowRun({\n workflowRunId: handle.workflowRun.id,\n });\n expect(workflowRun?.status).toBe(\"canceled\");\n expect(workflowRun?.finishedAt).not.toBeNull();\n });\n\n describe(\"declareWorkflow / implementWorkflow API\", () => {\n test(\"declareWorkflow returns a spec that can be used to schedule runs\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"declare-test\" });\n\n const handle = await client.runWorkflow(spec, { message: \"hello\" });\n expect(handle.workflowRun.workflowName).toBe(\"declare-test\");\n\n await handle.cancel();\n });\n\n test(\"implementWorkflow registers the workflow for worker execution\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"implement-test\" });\n client.implementWorkflow(spec, ({ input }) => {\n return { received: input };\n });\n\n const handle = await client.runWorkflow(spec, { data: 42 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ received: { data: 42 } });\n });\n\n test(\"implementWorkflow throws when workflow is already registered\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({ name: \"duplicate-test\" });\n client.implementWorkflow(spec, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec, noopFn);\n }).toThrow('Workflow \"duplicate-test\" is already registered');\n });\n\n test(\"implementWorkflow allows registering different versions of the same workflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const specV1 = declareWorkflow({\n name: \"multi-version\",\n version: \"v1\",\n });\n const specV2 = declareWorkflow({\n name: \"multi-version\",\n version: \"v2\",\n });\n\n // no throwing...\n client.implementWorkflow(specV1, noopFn);\n client.implementWorkflow(specV2, noopFn);\n });\n\n test(\"implementWorkflow throws for same name+version combination\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec1 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n const spec2 = declareWorkflow({\n name: \"version-duplicate\",\n version: \"v1\",\n });\n\n client.implementWorkflow(spec1, noopFn);\n\n expect(() => {\n client.implementWorkflow(spec2, noopFn);\n }).toThrow('Workflow \"version-duplicate\" (version: v1) is already registered');\n });\n\n test(\"declareWorkflow with schema validates input on runWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const schema = z.object({\n email: z.email(),\n });\n const spec = declareWorkflow({\n name: \"declare-schema-test\",\n schema,\n });\n\n const handle = await client.runWorkflow(spec, {\n email: \"test@example.com\",\n });\n await handle.cancel();\n\n await expect(client.runWorkflow(spec, { email: \"not-an-email\" })).rejects.toThrow();\n });\n\n test(\"declareWorkflow with version sets version on workflow run\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const spec = declareWorkflow({\n name: \"declare-version-test\",\n version: \"v1.2.3\",\n });\n\n const handle = await client.runWorkflow(spec);\n expect(handle.workflowRun.version).toBe(\"v1.2.3\");\n\n await handle.cancel();\n });\n\n test(\"defineWorkflow wraps declareWorkflow and implementWorkflow\", async () => {\n const client = new OpenWorkflow({ backend });\n\n const workflow = client.defineWorkflow({ name: \"define-wrap-test\" }, ({ input }) => ({\n doubled: (input as { n: number }).n * 2,\n }));\n\n const handle = await workflow.run({ n: 21 });\n const worker = client.newWorker();\n await worker.tick();\n await sleep(100); // wait for background execution\n\n const result = await handle.result();\n expect(result).toEqual({ doubled: 42 });\n });\n });\n});\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function noopFn() {\n // no-op\n}\n"],"names":["randomUUID","afterEach","beforeEach","describe","expect","test","z","BackendPostgres","declareWorkflow","OpenWorkflow","KNEX_GLOBAL_CONFIG","backend","namespaceId","runMigrations","initialize","stop","client","workflow","defineWorkflow","name","noopFn","run","docUrl","workerId","claimed","claimWorkflowRun","leaseDurationMs","workflowName","toBe","input","toEqual","schema","object","userId","uuid","count","number","int","positive","handle","cancel","rejects","toThrow","value","not","toBeNull","Error","completeWorkflowRun","workflowRunId","id","output","ok","result","failWorkflowRun","error","message","rescheduled","getWorkflowRun","status","deadline","Date","now","deadlineAt","workflowRun","getTime","version","finishedAt","spec","runWorkflow","implementWorkflow","received","data","worker","newWorker","tick","sleep","specV1","specV2","spec1","spec2","email","doubled","n","ms","Promise","resolve","setTimeout"],"mappings":"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"}
|
package/dist/config.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":""}
|
package/dist/config.test.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "vitest";
|
|
2
|
-
import { defineConfig } from "./config.js";
|
|
3
|
-
import { createBackend } from "./testing/connection.js";
|
|
4
|
-
describe("defineConfig", async ()=>{
|
|
5
|
-
const backend = await createBackend();
|
|
6
|
-
test("returns the same config", ()=>{
|
|
7
|
-
const config = {
|
|
8
|
-
backend
|
|
9
|
-
};
|
|
10
|
-
const result = defineConfig(config);
|
|
11
|
-
expect(result).toBe(config);
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
describe("loadConfig", ()=>{
|
|
15
|
-
test("loads config file in the specified directory", async ()=>{
|
|
16
|
-
const { loadConfig } = await import("./config.js");
|
|
17
|
-
const { config, configFile } = await loadConfig("./templates");
|
|
18
|
-
expect(config).toBeDefined();
|
|
19
|
-
expect(config.backend).toBeDefined();
|
|
20
|
-
expect(configFile).toContain("/templates/openworkflow.config.ts");
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
//# sourceMappingURL=config.test.js.map
|
package/dist/config.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.test.ts"],"sourcesContent":["import { describe, expect, test } from \"vitest\";\nimport { defineConfig } from \"./config\";\nimport { createBackend } from \"./testing/connection\";\n\ndescribe(\"defineConfig\", async () => {\n const backend = await createBackend();\n\n test(\"returns the same config\", () => {\n const config = { backend };\n const result = defineConfig(config);\n expect(result).toBe(config);\n });\n});\n\ndescribe(\"loadConfig\", () => {\n test(\"loads config file in the specified directory\", async () => {\n const { loadConfig } = await import(\"./config\");\n const { config, configFile } = await loadConfig(\"./templates\");\n expect(config).toBeDefined();\n expect(config.backend).toBeDefined();\n expect(configFile).toContain(\"/templates/openworkflow.config.ts\");\n });\n});\n"],"names":["describe","expect","test","defineConfig","createBackend","backend","config","result","toBe","loadConfig","configFile","toBeDefined","toContain"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAQ,SAAS;AAChD,SAASC,YAAY,QAAQ,cAAW;AACxC,SAASC,aAAa,QAAQ,0BAAuB;AAErDJ,SAAS,gBAAgB;IACvB,MAAMK,UAAU,MAAMD;IAEtBF,KAAK,2BAA2B;QAC9B,MAAMI,SAAS;YAAED;QAAQ;QACzB,MAAME,SAASJ,aAAaG;QAC5BL,OAAOM,QAAQC,IAAI,CAACF;IACtB;AACF;AAEAN,SAAS,cAAc;IACrBE,KAAK,gDAAgD;QACnD,MAAM,EAAEO,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC;QACpC,MAAM,EAAEH,MAAM,EAAEI,UAAU,EAAE,GAAG,MAAMD,WAAW;QAChDR,OAAOK,QAAQK,WAAW;QAC1BV,OAAOK,OAAOD,OAAO,EAAEM,WAAW;QAClCV,OAAOS,YAAYE,SAAS,CAAC;IAC/B;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duration.test.d.ts","sourceRoot":"","sources":["../../src/core/duration.test.ts"],"names":[],"mappings":""}
|