@workflow/world-testing 4.0.1-beta.3 → 4.0.1-beta.4
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/.turbo/turbo-build.log +15 -0
- package/CHANGELOG.md +9 -0
- package/dist/src/addition.d.mts +2 -0
- package/dist/src/addition.d.mts.map +1 -0
- package/dist/src/addition.mjs +20 -0
- package/dist/src/addition.mjs.map +1 -0
- package/dist/src/idempotency.d.mts +2 -0
- package/dist/src/idempotency.d.mts.map +1 -0
- package/dist/src/idempotency.mjs +25 -0
- package/dist/src/idempotency.mjs.map +1 -0
- package/dist/src/index.d.mts +2 -0
- package/dist/src/index.d.mts.map +1 -0
- package/dist/src/index.mjs +7 -0
- package/dist/src/index.mjs.map +1 -0
- package/dist/src/server.d.mts +2 -0
- package/dist/src/server.d.mts.map +1 -0
- package/dist/src/server.mjs +79 -0
- package/dist/src/server.mjs.map +1 -0
- package/dist/src/util.d.mts +45 -0
- package/dist/src/util.d.mts.map +1 -0
- package/dist/src/util.mjs +77 -0
- package/dist/src/util.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
> @workflow/world-testing@4.0.1-beta.4 build /home/runner/work/workflow/workflow/packages/world-testing
|
|
3
|
+
> wf build && tsc
|
|
4
|
+
|
|
5
|
+
Using target: standalone
|
|
6
|
+
Building with StandaloneBuilder
|
|
7
|
+
Creating Vercel API steps bundle at ./.well-known/workflow/v1/step.js
|
|
8
|
+
Discovering workflow directives 193ms
|
|
9
|
+
Created steps bundle 628ms
|
|
10
|
+
Creating vercel API workflows bundle at ./.well-known/workflow/v1/flow.js
|
|
11
|
+
Created intermediate workflow bundle 6ms
|
|
12
|
+
Created final workflow bundle 61ms
|
|
13
|
+
Creating vercel API webhook bundle at ./.well-known/workflow/v1/webhook.js
|
|
14
|
+
Creating webhook route
|
|
15
|
+
Build completed successfully!
|
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addition.d.mts","sourceRoot":"","sources":["../../src/addition.mts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,QAuBrC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { expect, test, vi } from 'vitest';
|
|
2
|
+
import { createFetcher, startServer } from './util.mjs';
|
|
3
|
+
export function addition(world) {
|
|
4
|
+
test('runs an addition', { timeout: 12_000 }, async () => {
|
|
5
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
6
|
+
const result = await server.invoke('workflows/addition.ts', 'addition', [1, 2]);
|
|
7
|
+
expect(result.runId).toMatch(/^wrun_.+/);
|
|
8
|
+
await vi.waitFor(async () => {
|
|
9
|
+
const run = await server.getRun(result.runId);
|
|
10
|
+
expect(run).toMatchObject({
|
|
11
|
+
status: 'completed',
|
|
12
|
+
output: [3],
|
|
13
|
+
});
|
|
14
|
+
}, {
|
|
15
|
+
interval: 200,
|
|
16
|
+
timeout: 10_000,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=addition.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addition.mjs","sourceRoot":"","sources":["../../src/addition.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,uBAAuB,EACvB,UAAU,EACV,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,EAAE,CAAC,OAAO,CACd,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,CAAC,CAAC,CAAC;aACZ,CAAC,CAAC;QACL,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.mts","sourceRoot":"","sources":["../../src/idempotency.mts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,QAyBxC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { expect, test, vi } from 'vitest';
|
|
2
|
+
import { hydrateWorkflowReturnValue } from 'workflow/internal/serialization';
|
|
3
|
+
import { createFetcher, startServer } from './util.mjs';
|
|
4
|
+
export function idempotency(world) {
|
|
5
|
+
test('idempotency', { timeout: 60_000 }, async () => {
|
|
6
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
7
|
+
const result = await server.invoke('workflows/noop.ts', 'brokenWf', [1, 2]);
|
|
8
|
+
expect(result.runId).toMatch(/^wrun_.+/);
|
|
9
|
+
const run = await vi.waitFor(async () => {
|
|
10
|
+
const run = await server.getRun(result.runId);
|
|
11
|
+
expect(run).toMatchObject({
|
|
12
|
+
status: 'completed',
|
|
13
|
+
});
|
|
14
|
+
return run;
|
|
15
|
+
}, {
|
|
16
|
+
interval: 200,
|
|
17
|
+
timeout: 59_000,
|
|
18
|
+
});
|
|
19
|
+
const output = await hydrateWorkflowReturnValue(run.output, [], globalThis);
|
|
20
|
+
expect(output).toEqual({
|
|
21
|
+
numbers: Array.from({ length: 110 }, () => expect.any(Number)),
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=idempotency.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.mjs","sourceRoot":"","sources":["../../src/idempotency.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAsB;gBAC7C,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;QAE5E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAG9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,WAAW,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { serve } from '@hono/node-server';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import { getRun, start } from 'workflow/api';
|
|
5
|
+
import { getWorld } from 'workflow/runtime';
|
|
6
|
+
import * as z from 'zod';
|
|
7
|
+
import flow from '../.well-known/workflow/v1/flow.js';
|
|
8
|
+
import manifest from '../.well-known/workflow/v1/manifest.debug.json' with {
|
|
9
|
+
type: 'json'
|
|
10
|
+
};
|
|
11
|
+
import step from '../.well-known/workflow/v1/step.js';
|
|
12
|
+
if (!process.env.WORKFLOW_TARGET_WORLD) {
|
|
13
|
+
console.error('Error: WORKFLOW_TARGET_WORLD environment variable is not set.');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const Invoke = z
|
|
17
|
+
.object({
|
|
18
|
+
file: z.literal(Object.keys(manifest.workflows)),
|
|
19
|
+
workflow: z.string(),
|
|
20
|
+
args: z.unknown().array().default([]),
|
|
21
|
+
})
|
|
22
|
+
.transform((obj) => {
|
|
23
|
+
const file = obj.file;
|
|
24
|
+
const workflow = z
|
|
25
|
+
.literal(Object.keys(manifest.workflows[file]))
|
|
26
|
+
.parse(obj.workflow);
|
|
27
|
+
return {
|
|
28
|
+
args: obj.args,
|
|
29
|
+
workflow: manifest.workflows[file][workflow],
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
const app = new Hono()
|
|
33
|
+
.post('/.well-known/workflow/v1/flow', (ctx) => {
|
|
34
|
+
return flow.POST(ctx.req.raw);
|
|
35
|
+
})
|
|
36
|
+
.post('/.well-known/workflow/v1/step', (ctx) => {
|
|
37
|
+
return step.POST(ctx.req.raw);
|
|
38
|
+
})
|
|
39
|
+
.get('/_manifest', (ctx) => ctx.json(manifest))
|
|
40
|
+
.post('/invoke', async (ctx) => {
|
|
41
|
+
const json = await ctx.req.json().then(Invoke.parse);
|
|
42
|
+
const handler = await start(json.workflow, json.args);
|
|
43
|
+
return ctx.json({ runId: handler.runId });
|
|
44
|
+
})
|
|
45
|
+
.get('/runs/:runId', async (ctx) => {
|
|
46
|
+
return ctx.json(await getWorld().runs.get(ctx.req.param('runId')));
|
|
47
|
+
})
|
|
48
|
+
.get('/runs/:runId/readable', async (ctx) => {
|
|
49
|
+
const runId = ctx.req.param('runId');
|
|
50
|
+
const run = getRun(runId);
|
|
51
|
+
return new Response(run.getReadable());
|
|
52
|
+
});
|
|
53
|
+
serve({
|
|
54
|
+
fetch: app.fetch,
|
|
55
|
+
port: Number(process.env.PORT) || 0,
|
|
56
|
+
}, async (info) => {
|
|
57
|
+
console.log(`👂 listening on http://${info.address}:${info.port}`);
|
|
58
|
+
console.log('');
|
|
59
|
+
process.env.PORT = info.port.toString();
|
|
60
|
+
for (const [filename, workflows] of Object.entries(manifest.workflows)) {
|
|
61
|
+
for (const workflowName of Object.keys(workflows)) {
|
|
62
|
+
console.log(`$ curl -X POST http://localhost:${info.port}/invoke -d '${JSON.stringify({
|
|
63
|
+
file: filename,
|
|
64
|
+
workflow: workflowName,
|
|
65
|
+
})}'`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const world = getWorld();
|
|
69
|
+
if (world.start) {
|
|
70
|
+
console.log(`starting background tasks...`);
|
|
71
|
+
await world.start().then(() => console.log('background tasks started.'), (err) => console.error('❗ error starting background tasks:', err));
|
|
72
|
+
}
|
|
73
|
+
if (process.env.CONTROL_FD === '3') {
|
|
74
|
+
const control = fs.createWriteStream('', { fd: 3 });
|
|
75
|
+
control.write(`${JSON.stringify({ state: 'listening', info })}\n`);
|
|
76
|
+
control.end();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.mjs","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,IAAI,MAAM,oCAAoC,CAAC;AACtD,OAAO,QAAQ,MAAM,gDAAgD,CAAC;IACpE,IAAI,EAAE,MAAM;CACb,CAAC;AACF,OAAO,IAAI,MAAM,oCAAoC,CAAC;AAEtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACvC,OAAO,CAAC,KAAK,CACX,+DAA+D,CAChE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAKD,MAAM,MAAM,GAAG,CAAC;KACb,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAY,CAAC;IAC3D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACtC,CAAC;KACD,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAuC,CAAC;IACzD,MAAM,QAAQ,GAAG,CAAC;SACf,OAAO,CACN,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAA6B,CAClE;SACA,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;KAC7C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;KACnB,IAAI,CAAC,+BAA+B,EAAE,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC,CAAC;KACD,IAAI,CAAC,+BAA+B,EAAE,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC,CAAC;KACD,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAC9C,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC;KACD,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IACjC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC;KACD,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEL,KAAK,CACH;IACE,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;CACpC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvE,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CACT,mCAAmC,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,SAAS,CACvE;gBACE,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,YAAY;aACvB,CACF,GAAG,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAC9C,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAClE,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import type manifest from '../.well-known/workflow/v1/manifest.debug.json';
|
|
3
|
+
export declare const Control: z.ZodObject<{
|
|
4
|
+
state: z.ZodLiteral<"listening">;
|
|
5
|
+
info: z.ZodObject<{
|
|
6
|
+
port: z.ZodNumber;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
type Control = z.infer<typeof Control>;
|
|
10
|
+
type Files = keyof typeof manifest.workflows;
|
|
11
|
+
type Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];
|
|
12
|
+
export declare const Worlds: {
|
|
13
|
+
embedded: string;
|
|
14
|
+
postgres: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function startServer(opts: {
|
|
17
|
+
world: string;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
state: "listening";
|
|
20
|
+
info: {
|
|
21
|
+
port: number;
|
|
22
|
+
};
|
|
23
|
+
}>;
|
|
24
|
+
export declare function createFetcher(control: Control): {
|
|
25
|
+
invoke<F extends Files, W extends Workflows<F>>(file: F, workflow: W, args: unknown[]): Promise<{
|
|
26
|
+
runId: string;
|
|
27
|
+
}>;
|
|
28
|
+
getRun(id: string): Promise<{
|
|
29
|
+
runId: string;
|
|
30
|
+
deploymentId: string;
|
|
31
|
+
status: "pending" | "running" | "completed" | "failed" | "paused" | "cancelled";
|
|
32
|
+
workflowName: string;
|
|
33
|
+
input: any[];
|
|
34
|
+
createdAt: Date;
|
|
35
|
+
updatedAt: Date;
|
|
36
|
+
executionContext?: Record<string, any> | undefined;
|
|
37
|
+
output?: any;
|
|
38
|
+
error?: string | undefined;
|
|
39
|
+
errorCode?: string | undefined;
|
|
40
|
+
startedAt?: Date | undefined;
|
|
41
|
+
completedAt?: Date | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=util.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.mts","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,gDAAgD,CAAC;AAE3E,eAAO,MAAM,OAAO;;;;;iBAKlB,CAAC;AACH,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;AAEvC,KAAK,KAAK,GAAG,MAAM,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC7C,KAAK,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,MAAM,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvE,eAAO,MAAM,MAAM;;;CAGlB,CAAC;AAEF,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;GA4CxD;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO;WAE7B,CAAC,SAAS,KAAK,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,QAC5C,CAAC,YACG,CAAC,QACL,OAAO,EAAE;;;eAYA,MAAM;;;;;;;;;;;;;;;EAQ1B"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import cp from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { WorkflowRunSchema } from '@workflow/world';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import jsonlines from 'jsonlines';
|
|
6
|
+
import { assert, onTestFailed, onTestFinished } from 'vitest';
|
|
7
|
+
import * as z from 'zod';
|
|
8
|
+
export const Control = z.object({
|
|
9
|
+
state: z.literal('listening'),
|
|
10
|
+
info: z.object({
|
|
11
|
+
port: z.number(),
|
|
12
|
+
}),
|
|
13
|
+
});
|
|
14
|
+
export const Worlds = {
|
|
15
|
+
embedded: 'embedded',
|
|
16
|
+
postgres: '@workflow/world-postgres',
|
|
17
|
+
};
|
|
18
|
+
export async function startServer(opts) {
|
|
19
|
+
let serverPath = new URL('./server.mts', import.meta.url).pathname;
|
|
20
|
+
if (!existsSync(serverPath)) {
|
|
21
|
+
serverPath = new URL('./server.mjs', import.meta.url).pathname;
|
|
22
|
+
}
|
|
23
|
+
const proc = cp.spawn('node', [serverPath], {
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe', 'pipe'],
|
|
25
|
+
env: {
|
|
26
|
+
...process.env,
|
|
27
|
+
WORKFLOW_TARGET_WORLD: opts.world,
|
|
28
|
+
CONTROL_FD: '3',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
onTestFinished(() => {
|
|
32
|
+
proc.kill();
|
|
33
|
+
});
|
|
34
|
+
const stdio = [];
|
|
35
|
+
proc.stdout?.on('data', (chunk) => {
|
|
36
|
+
stdio.push({ stream: chalk.white, chunk: chunk.toString() });
|
|
37
|
+
});
|
|
38
|
+
proc.stderr?.on('data', (chunk) => {
|
|
39
|
+
stdio.push({ stream: chalk.red, chunk: chunk.toString() });
|
|
40
|
+
});
|
|
41
|
+
onTestFailed(() => {
|
|
42
|
+
console.log('=== SERVER STDIO ===');
|
|
43
|
+
let buffer = '';
|
|
44
|
+
for (const { stream, chunk } of stdio) {
|
|
45
|
+
buffer += stream.inverse(chunk);
|
|
46
|
+
}
|
|
47
|
+
console.log(buffer);
|
|
48
|
+
});
|
|
49
|
+
const fd3 = proc.stdio[3];
|
|
50
|
+
assert(fd3, 'fd3 should be defined');
|
|
51
|
+
for await (const chunk of fd3.pipe(jsonlines.parse())) {
|
|
52
|
+
return Control.parse(chunk);
|
|
53
|
+
}
|
|
54
|
+
throw new Error('Server did not start correctly');
|
|
55
|
+
}
|
|
56
|
+
const Invoke = z.object({ runId: z.coerce.string() });
|
|
57
|
+
export function createFetcher(control) {
|
|
58
|
+
return {
|
|
59
|
+
async invoke(file, workflow, args) {
|
|
60
|
+
const x = await fetch(`http://localhost:${control.info.port}/invoke`, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers: {
|
|
63
|
+
'content-type': 'application/json',
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify({ file, workflow, args }),
|
|
66
|
+
});
|
|
67
|
+
const data = await x.json().then(Invoke.parse);
|
|
68
|
+
return data;
|
|
69
|
+
},
|
|
70
|
+
async getRun(id) {
|
|
71
|
+
const x = await fetch(`http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}`);
|
|
72
|
+
const data = await x.json();
|
|
73
|
+
return WorkflowRunSchema.parseAsync(data);
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=util.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.mjs","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/world-testing",
|
|
3
|
-
"version": "4.0.1-beta.
|
|
3
|
+
"version": "4.0.1-beta.4",
|
|
4
4
|
"description": "Testing utilities and World implementation for Workflow DevKit",
|
|
5
5
|
"main": "dist/src/index.mjs",
|
|
6
6
|
"publishConfig": {
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"hono": "^4.9.10",
|
|
19
19
|
"jsonlines": "^0.1.1",
|
|
20
20
|
"zod": "4.1.11",
|
|
21
|
-
"@workflow/cli": "4.0.1-beta.
|
|
22
|
-
"workflow": "4.0.1-beta.
|
|
23
|
-
"
|
|
21
|
+
"@workflow/cli": "4.0.1-beta.4",
|
|
22
|
+
"@workflow/world": "4.0.1-beta.2",
|
|
23
|
+
"workflow": "4.0.1-beta.4"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "24.6.2",
|