@workflow/world-testing 5.0.0-beta.4 → 5.0.0-beta.41
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/dist/.well-known/workflow/v1/__step_registrations.mjs +34348 -0
- package/dist/.well-known/workflow/v1/flow.mjs +132112 -54487
- package/dist/.well-known/workflow/v1/manifest.json +1562 -46
- package/dist/src/addition.mjs +2 -2
- package/dist/src/errors.mjs +2 -2
- package/dist/src/event-limit.d.mts +2 -0
- package/dist/src/event-limit.d.mts.map +1 -0
- package/dist/src/event-limit.mjs +29 -0
- package/dist/src/hooks.mjs +2 -2
- package/dist/src/idempotency.mjs +2 -2
- package/dist/src/index.d.mts.map +1 -1
- package/dist/src/index.mjs +5 -1
- package/dist/src/inline-batches-debug.d.mts +15 -0
- package/dist/src/inline-batches-debug.d.mts.map +1 -0
- package/dist/src/inline-batches-debug.mjs +208 -0
- package/dist/src/inline-execution.d.mts +13 -0
- package/dist/src/inline-execution.d.mts.map +1 -0
- package/dist/src/inline-execution.mjs +100 -0
- package/dist/src/jsonlines.mjs +1 -1
- package/dist/src/lineage.d.mts +8 -0
- package/dist/src/lineage.d.mts.map +1 -0
- package/dist/src/lineage.mjs +48 -0
- package/dist/src/null-byte.mjs +2 -2
- package/dist/src/server.mjs +53 -5
- package/dist/src/util.d.mts +27 -16
- package/dist/src/util.d.mts.map +1 -1
- package/dist/src/util.mjs +59 -6
- package/dist/workflows/hooks.js +1 -1
- package/package.json +13 -12
- package/dist/.well-known/workflow/v1/step.mjs +0 -64515
- package/dist/src/addition.mjs.map +0 -1
- package/dist/src/errors.mjs.map +0 -1
- package/dist/src/hooks.mjs.map +0 -1
- package/dist/src/idempotency.mjs.map +0 -1
- package/dist/src/index.mjs.map +0 -1
- package/dist/src/jsonlines.mjs.map +0 -1
- package/dist/src/null-byte.mjs.map +0 -1
- package/dist/src/server.mjs.map +0 -1
- package/dist/src/util.mjs.map +0 -1
- package/dist/workflows/hooks.js.map +0 -1
package/dist/src/addition.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect, test, vi } from 'vitest';
|
|
2
1
|
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
3
|
import { createFetcher, startServer } from './util.mjs';
|
|
4
4
|
export function addition(world) {
|
|
5
5
|
test('runs an addition', { timeout: 30_000 }, async () => {
|
|
@@ -19,4 +19,4 @@ export function addition(world) {
|
|
|
19
19
|
expect(output).toEqual(3);
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
-
//# sourceMappingURL=
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkaXRpb24ubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkZGl0aW9uLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFhO0lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FDaEMsdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDUCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0Q7WUFDRSxRQUFRLEVBQUUsR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQ0YsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQzdDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGV4cGVjdCwgdGVzdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZGl0aW9uKHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgncnVucyBhbiBhZGRpdGlvbicsIHsgdGltZW91dDogMzBfMDAwIH0sIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICd3b3JrZmxvd3MvYWRkaXRpb24udHMnLFxuICAgICAgJ2FkZGl0aW9uJyxcbiAgICAgIFsxLCAyXVxuICAgICk7XG4gICAgZXhwZWN0KHJlc3VsdC5ydW5JZCkudG9NYXRjaCgvXndydW5fLisvKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgZXhwZWN0KHJ1bi5vdXRwdXQpLnRvQmVJbnN0YW5jZU9mKFVpbnQ4QXJyYXkpO1xuICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgdGltZW91dDogMjVfMDAwLFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICBydW4ub3V0cHV0ISxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCgzKTtcbiAgfSk7XG59XG4iXX0=
|
package/dist/src/errors.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect, test, vi } from 'vitest';
|
|
2
1
|
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
3
|
import { createFetcher, startServer } from './util.mjs';
|
|
4
4
|
export function errors(world) {
|
|
5
5
|
test('retriable and fatal errors', { timeout: 59_000 }, async () => {
|
|
@@ -28,4 +28,4 @@ export function errors(world) {
|
|
|
28
28
|
expect(output.retryableResult.duration).toBeGreaterThanOrEqual(2000);
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWE7SUFDbEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQyxrQ0FBa0MsRUFDbEMsZ0NBQWdDLEVBQ2hDLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBc0I7Z0JBQzdDLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNEO1lBQ0UsUUFBUSxFQUFFLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUNGLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sMEJBQTBCLENBQzlDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBUSxDQUFDO1FBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyQixhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUU7Z0JBQ2YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUM1QixhQUFhLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7YUFDaEM7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JzKHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgncmV0cmlhYmxlIGFuZCBmYXRhbCBlcnJvcnMnLCB7IHRpbWVvdXQ6IDU5XzAwMCB9LCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5pbnZva2UoXG4gICAgICAnd29ya2Zsb3dzL3JldHJpYWJsZS1hbmQtZmF0YWwudHMnLFxuICAgICAgJ3JldHJ5YWJsZUFuZEZhdGFsRXJyb3JXb3JrZmxvdycsXG4gICAgICBbXVxuICAgICk7XG4gICAgZXhwZWN0KHJlc3VsdC5ydW5JZCkudG9NYXRjaCgvXndydW5fLisvKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgIGV4cGVjdChydW4pLnRvTWF0Y2hPYmplY3Q8UGFydGlhbDx0eXBlb2YgcnVuPj4oe1xuICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgdGltZW91dDogNTBfMDAwLFxuICAgICAgfVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gKGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgcnVuLm91dHB1dCEsXG4gICAgICBydW4ucnVuSWQsXG4gICAgICB1bmRlZmluZWRcbiAgICApKSBhcyBhbnk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBnb3RGYXRhbEVycm9yOiB0cnVlLFxuICAgICAgcmV0cnlhYmxlUmVzdWx0OiB7XG4gICAgICAgIGF0dGVtcHQ6IDIsXG4gICAgICAgIGR1cmF0aW9uOiBleHBlY3QuYW55KE51bWJlciksXG4gICAgICAgIHN0ZXBTdGFydGVkQXQ6IGV4cGVjdC5hbnkoRGF0ZSksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChvdXRwdXQucmV0cnlhYmxlUmVzdWx0LmR1cmF0aW9uKS50b0JlR3JlYXRlclRoYW5PckVxdWFsKDIwMDApO1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-limit.d.mts","sourceRoot":"","sources":["../../src/event-limit.mts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,QAsCvC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { expect, test, vi } from 'vitest';
|
|
2
|
+
import { createFetcher, startServer } from './util.mjs';
|
|
3
|
+
export function eventLimit(world) {
|
|
4
|
+
// Cover enforcement end-to-end under both configs (turbo is the production
|
|
5
|
+
// default). Against the local world these don't isolate the turbo run_started
|
|
6
|
+
// threading — a non-turbo continuation backfills the ceiling regardless — but
|
|
7
|
+
// they guard that a runaway run fails under each.
|
|
8
|
+
for (const turbo of ['1', '0']) {
|
|
9
|
+
test(`fails a runaway run at the server-supplied event limit (turbo=${turbo})`, { timeout: 59_000 }, async () => {
|
|
10
|
+
// Low ceiling to trip it fast.
|
|
11
|
+
const server = await startServer({
|
|
12
|
+
world,
|
|
13
|
+
env: { WORKFLOW_MAX_EVENTS: '10', WORKFLOW_TURBO: turbo },
|
|
14
|
+
}).then(createFetcher);
|
|
15
|
+
const result = await server.invoke('workflows/event-limit.ts', 'runawayWorkflow', []);
|
|
16
|
+
expect(result.runId).toMatch(/^wrun_.+/);
|
|
17
|
+
const run = await vi.waitFor(async () => {
|
|
18
|
+
const run = await server.getRun(result.runId);
|
|
19
|
+
expect(run.status).toBe('failed');
|
|
20
|
+
return run;
|
|
21
|
+
}, {
|
|
22
|
+
interval: 200,
|
|
23
|
+
timeout: 50_000,
|
|
24
|
+
});
|
|
25
|
+
expect(run.errorCode).toBe('MAX_EVENTS_EXCEEDED');
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbGltaXQubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V2ZW50LWxpbWl0Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhO0lBQ3RDLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLGtEQUFrRDtJQUNsRCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBVSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUNGLGlFQUFpRSxLQUFLLEdBQUcsRUFDekUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQ25CLEtBQUssSUFBSSxFQUFFO1lBQ1QsK0JBQStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDO2dCQUMvQixLQUFLO2dCQUNMLEdBQUcsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFO2FBQzFELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQywwQkFBMEIsRUFDMUIsaUJBQWlCLEVBQ2pCLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtnQkFDVCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsT0FBTyxFQUFFLE1BQU07YUFDaEIsQ0FDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhwZWN0LCB0ZXN0LCB2aSB9IGZyb20gJ3ZpdGVzdCc7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRMaW1pdCh3b3JsZDogc3RyaW5nKSB7XG4gIC8vIENvdmVyIGVuZm9yY2VtZW50IGVuZC10by1lbmQgdW5kZXIgYm90aCBjb25maWdzICh0dXJibyBpcyB0aGUgcHJvZHVjdGlvblxuICAvLyBkZWZhdWx0KS4gQWdhaW5zdCB0aGUgbG9jYWwgd29ybGQgdGhlc2UgZG9uJ3QgaXNvbGF0ZSB0aGUgdHVyYm8gcnVuX3N0YXJ0ZWRcbiAgLy8gdGhyZWFkaW5nIOKAlCBhIG5vbi10dXJibyBjb250aW51YXRpb24gYmFja2ZpbGxzIHRoZSBjZWlsaW5nIHJlZ2FyZGxlc3Mg4oCUIGJ1dFxuICAvLyB0aGV5IGd1YXJkIHRoYXQgYSBydW5hd2F5IHJ1biBmYWlscyB1bmRlciBlYWNoLlxuICBmb3IgKGNvbnN0IHR1cmJvIG9mIFsnMScsICcwJ10gYXMgY29uc3QpIHtcbiAgICB0ZXN0KFxuICAgICAgYGZhaWxzIGEgcnVuYXdheSBydW4gYXQgdGhlIHNlcnZlci1zdXBwbGllZCBldmVudCBsaW1pdCAodHVyYm89JHt0dXJib30pYCxcbiAgICAgIHsgdGltZW91dDogNTlfMDAwIH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExvdyBjZWlsaW5nIHRvIHRyaXAgaXQgZmFzdC5cbiAgICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoe1xuICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgIGVudjogeyBXT1JLRkxPV19NQVhfRVZFTlRTOiAnMTAnLCBXT1JLRkxPV19UVVJCTzogdHVyYm8gfSxcbiAgICAgICAgfSkudGhlbihjcmVhdGVGZXRjaGVyKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAgICd3b3JrZmxvd3MvZXZlbnQtbGltaXQudHMnLFxuICAgICAgICAgICdydW5hd2F5V29ya2Zsb3cnLFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQucnVuSWQpLnRvTWF0Y2goL153cnVuXy4rLyk7XG5cbiAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgdmkud2FpdEZvcihcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydW4gPSBhd2FpdCBzZXJ2ZXIuZ2V0UnVuKHJlc3VsdC5ydW5JZCk7XG4gICAgICAgICAgICBleHBlY3QocnVuLnN0YXR1cykudG9CZSgnZmFpbGVkJyk7XG4gICAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW50ZXJ2YWw6IDIwMCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDUwXzAwMCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChydW4uZXJyb3JDb2RlKS50b0JlKCdNQVhfRVZFTlRTX0VYQ0VFREVEJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIl19
|
package/dist/src/hooks.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect, test, vi } from 'vitest';
|
|
2
1
|
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
3
|
import { jsonlines } from './jsonlines.mjs';
|
|
4
4
|
import { createFetcher, startServer } from './util.mjs';
|
|
5
5
|
export function hooks(world) {
|
|
@@ -71,4 +71,4 @@ export function hooks(world) {
|
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
|
-
//# sourceMappingURL=
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3MubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhELE1BQU0sVUFBVSxLQUFLLENBQUMsS0FBYTtJQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsS0FBSyxFQUFFLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQyxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUNwQixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBUSxDQUFDO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsRUFBZSxDQUFDO1FBRTFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDVixJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxHQUFHLEVBQUUsS0FBSyxLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUNqQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLEdBQUcsRUFBRSxLQUFLLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQ2pDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BDLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDZCxtQ0FBbUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFFMUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBYyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxlQUFlO2FBQ3RCLENBQUMsQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBYyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxnQkFBZ0I7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFjLEtBQUssRUFBRTtnQkFDMUMsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FDMUIsS0FBSyxJQUFJLEVBQUU7WUFDVCxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQXNCO2dCQUM3QyxNQUFNLEVBQUUsV0FBVzthQUNwQixDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRDtZQUNFLFFBQVEsRUFBRSxHQUFHO1lBQ2IsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FDRixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSwwQkFBMEIsQ0FDN0MsR0FBRyxDQUFDLE1BQU8sRUFDWCxHQUFHLENBQUMsS0FBSyxFQUNULFNBQVMsQ0FDVixDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRTtpQkFDekI7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFO2lCQUN6QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZUFBZTtvQkFDckIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFO29CQUN4QixJQUFJLEVBQUUsSUFBSTtpQkFDWDthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGV4cGVjdCwgdGVzdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHR5cGUgeyBIb29rIH0gZnJvbSAnLi4vd29ya2Zsb3dzL2hvb2tzLnRzJztcbmltcG9ydCB7IGpzb25saW5lcyB9IGZyb20gJy4vanNvbmxpbmVzLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVGZXRjaGVyLCBzdGFydFNlcnZlciB9IGZyb20gJy4vdXRpbC5tanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaG9va3Mod29ybGQ6IHN0cmluZykge1xuICB0ZXN0KCdob29rcycsIHsgdGltZW91dDogNjBfMDAwIH0sIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgY29uc3QgdG9rZW4gPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICBjb25zdCBjdXN0b21EYXRhID0gYG15LWN1c3RvbS1kYXRhLSR7dG9rZW59YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgJ3dvcmtmbG93cy9ob29rcy50cycsXG4gICAgICAnY29sbGVjdFdpdGhIb29rJyxcbiAgICAgIFt0b2tlbiwgY3VzdG9tRGF0YV1cbiAgICApO1xuICAgIGV4cGVjdChyZXN1bHQucnVuSWQpLnRvTWF0Y2goL153cnVuXy4rLyk7XG4gICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBzZXJ2ZXIuZ2V0UmVhZGFibGUocmVzdWx0LnJ1bklkKTtcbiAgICBjb25zdCBldmVudHMgPSBqc29ubGluZXMocmVhZGFibGUpO1xuICAgIGNvbnN0IGhvb2tDcmVhdGVkID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG4gICAgY29uc3QgaG9va1Jlc3VtZWRFdmVudHMgPSBbXSBhcyB1bmtub3duW107XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBvYmogb2YgZXZlbnRzKSB7XG4gICAgICAgIGlmIChvYmo/LmV2ZW50ID09PSAnaG9va0NyZWF0ZWQnKSB7XG4gICAgICAgICAgaG9va0NyZWF0ZWQucmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaj8uZXZlbnQgPT09ICdob29rUmVzdW1lZCcpIHtcbiAgICAgICAgICBob29rUmVzdW1lZEV2ZW50cy5wdXNoKG9iai5wYXlsb2FkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmhhbmRsZWQgZXZlbnQnLCBvYmopO1xuICAgICAgfVxuICAgIH0pKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gaWdub3JlIGVycm9ycyBmb3IgcmVhZGluZyBzdHJlYW1cbiAgICB9KTtcblxuICAgIGF3YWl0IGhvb2tDcmVhdGVkLnByb21pc2U7XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgc2VydmVyLnJlc3VtZUhvb2s8dHlwZW9mIEhvb2s+KHRva2VuLCB7XG4gICAgICAgIGRhdGE6ICdmaXJzdCBwYXlsb2FkJyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgc2VydmVyLnJlc3VtZUhvb2s8dHlwZW9mIEhvb2s+KHRva2VuLCB7XG4gICAgICAgIGRhdGE6ICdzZWNvbmQgcGF5bG9hZCcsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHNlcnZlci5yZXN1bWVIb29rPHR5cGVvZiBIb29rPih0b2tlbiwge1xuICAgICAgICBkYXRhOiAndGhpcmQgcGF5bG9hZCcsXG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgdmkud2FpdEZvcihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICBleHBlY3QocnVuKS50b01hdGNoT2JqZWN0PFBhcnRpYWw8dHlwZW9mIHJ1bj4+KHtcbiAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGludGVydmFsOiAyMDAsXG4gICAgICAgIHRpbWVvdXQ6IDU5XzAwMCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICBydW4ub3V0cHV0ISxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBjb2xsZWN0ZWQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6ICdmaXJzdCBwYXlsb2FkJyxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjdXN0b21EYXRhIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhOiAnc2Vjb25kIHBheWxvYWQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IGN1c3RvbURhdGEgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6ICd0aGlyZCBwYXlsb2FkJyxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjdXN0b21EYXRhIH0sXG4gICAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
package/dist/src/idempotency.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect, test, vi } from 'vitest';
|
|
2
1
|
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
3
|
import { createFetcher, startServer } from './util.mjs';
|
|
4
4
|
export function idempotency(world) {
|
|
5
5
|
test('idempotency', { timeout: 60_000 }, async () => {
|
|
@@ -22,4 +22,4 @@ export function idempotency(world) {
|
|
|
22
22
|
});
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
|
-
//# sourceMappingURL=
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3kubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lkZW1wb3RlbmN5Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBc0I7Z0JBQzdDLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUNEO1lBQ0UsUUFBUSxFQUFFLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLDBCQUEwQixDQUM3QyxHQUFHLENBQUMsTUFBTyxFQUNYLEdBQUcsQ0FBQyxLQUFLLEVBQ1QsU0FBUyxDQUNWLENBQUM7UUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGV4cGVjdCwgdGVzdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW1wb3RlbmN5KHdvcmxkOiBzdHJpbmcpIHtcbiAgdGVzdCgnaWRlbXBvdGVuY3knLCB7IHRpbWVvdXQ6IDYwXzAwMCB9LCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5pbnZva2UoJ3dvcmtmbG93cy9ub29wLnRzJywgJ2Jyb2tlbldmJywgWzEsIDJdKTtcbiAgICBleHBlY3QocmVzdWx0LnJ1bklkKS50b01hdGNoKC9ed3J1bl8uKy8pO1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHZpLndhaXRGb3IoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHNlcnZlci5nZXRSdW4ocmVzdWx0LnJ1bklkKTtcbiAgICAgICAgZXhwZWN0KHJ1bikudG9NYXRjaE9iamVjdDxQYXJ0aWFsPHR5cGVvZiBydW4+Pih7XG4gICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBydW47XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpbnRlcnZhbDogMjAwLFxuICAgICAgICB0aW1lb3V0OiA1OV8wMDAsXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlKFxuICAgICAgcnVuLm91dHB1dCEsXG4gICAgICBydW4ucnVuSWQsXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgZXhwZWN0KG91dHB1dCkudG9FcXVhbCh7XG4gICAgICBudW1iZXJzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMCB9LCAoKSA9PiBleHBlY3QuYW55KE51bWJlcikpLFxuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
|
package/dist/src/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,QAQ9C"}
|
package/dist/src/index.mjs
CHANGED
|
@@ -2,6 +2,8 @@ import { addition } from './addition.mjs';
|
|
|
2
2
|
import { errors } from './errors.mjs';
|
|
3
3
|
import { hooks } from './hooks.mjs';
|
|
4
4
|
import { idempotency } from './idempotency.mjs';
|
|
5
|
+
import { inlineExecution } from './inline-execution.mjs';
|
|
6
|
+
import { lineage } from './lineage.mjs';
|
|
5
7
|
import { nullByte } from './null-byte.mjs';
|
|
6
8
|
export function createTestSuite(pkgName) {
|
|
7
9
|
addition(pkgName);
|
|
@@ -9,5 +11,7 @@ export function createTestSuite(pkgName) {
|
|
|
9
11
|
hooks(pkgName);
|
|
10
12
|
nullByte(pkgName);
|
|
11
13
|
errors(pkgName);
|
|
14
|
+
inlineExecution(pkgName);
|
|
15
|
+
lineage(pkgName);
|
|
12
16
|
}
|
|
13
|
-
//# sourceMappingURL=
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luZGV4Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUFlO0lBQzdDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2YsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQixlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRpdGlvbiB9IGZyb20gJy4vYWRkaXRpb24ubWpzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJy4vZXJyb3JzLm1qcyc7XG5pbXBvcnQgeyBob29rcyB9IGZyb20gJy4vaG9va3MubWpzJztcbmltcG9ydCB7IGlkZW1wb3RlbmN5IH0gZnJvbSAnLi9pZGVtcG90ZW5jeS5tanMnO1xuaW1wb3J0IHsgaW5saW5lRXhlY3V0aW9uIH0gZnJvbSAnLi9pbmxpbmUtZXhlY3V0aW9uLm1qcyc7XG5pbXBvcnQgeyBsaW5lYWdlIH0gZnJvbSAnLi9saW5lYWdlLm1qcyc7XG5pbXBvcnQgeyBudWxsQnl0ZSB9IGZyb20gJy4vbnVsbC1ieXRlLm1qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXN0U3VpdGUocGtnTmFtZTogc3RyaW5nKSB7XG4gIGFkZGl0aW9uKHBrZ05hbWUpO1xuICBpZGVtcG90ZW5jeShwa2dOYW1lKTtcbiAgaG9va3MocGtnTmFtZSk7XG4gIG51bGxCeXRlKHBrZ05hbWUpO1xuICBlcnJvcnMocGtnTmFtZSk7XG4gIGlubGluZUV4ZWN1dGlvbihwa2dOYW1lKTtcbiAgbGluZWFnZShwa2dOYW1lKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instrumented test: runs `threeBatchesOfFiveWorkflow` with
|
|
3
|
+
* DEBUG=workflow:runtime:* and prints a summary of V2 handler behavior:
|
|
4
|
+
* - total flow invocations
|
|
5
|
+
* - per-invocation replay iterations
|
|
6
|
+
* - event loads (full vs incremental) and sizes
|
|
7
|
+
* - redundant/skipped step executions
|
|
8
|
+
* - concurrent "all parallel steps done" replay races
|
|
9
|
+
* - unconsumed-event skips
|
|
10
|
+
*
|
|
11
|
+
* Not part of the default suite; run with:
|
|
12
|
+
* pnpm vitest run packages/world-testing/test/inline-batches-debug.test.ts
|
|
13
|
+
*/
|
|
14
|
+
export declare function inlineBatchesDebug(world: string): void;
|
|
15
|
+
//# sourceMappingURL=inline-batches-debug.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-batches-debug.d.mts","sourceRoot":"","sources":["../../src/inline-batches-debug.mts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,QAuP/C"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
|
+
import { createFetcher, startServer } from './util.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* Instrumented test: runs `threeBatchesOfFiveWorkflow` with
|
|
6
|
+
* DEBUG=workflow:runtime:* and prints a summary of V2 handler behavior:
|
|
7
|
+
* - total flow invocations
|
|
8
|
+
* - per-invocation replay iterations
|
|
9
|
+
* - event loads (full vs incremental) and sizes
|
|
10
|
+
* - redundant/skipped step executions
|
|
11
|
+
* - concurrent "all parallel steps done" replay races
|
|
12
|
+
* - unconsumed-event skips
|
|
13
|
+
*
|
|
14
|
+
* Not part of the default suite; run with:
|
|
15
|
+
* pnpm vitest run packages/world-testing/test/inline-batches-debug.test.ts
|
|
16
|
+
*/
|
|
17
|
+
export function inlineBatchesDebug(world) {
|
|
18
|
+
test('three batches of five parallel steps — report V2 handler behavior', { timeout: 60_000 }, async () => {
|
|
19
|
+
const server = await startServer({
|
|
20
|
+
world,
|
|
21
|
+
env: {
|
|
22
|
+
DEBUG: 'workflow:runtime:*',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const client = createFetcher(server);
|
|
26
|
+
const result = await client.invoke('workflows/inline-execution.ts', 'threeBatchesOfFiveWorkflow', []);
|
|
27
|
+
const run = await vi.waitFor(async () => {
|
|
28
|
+
const run = await client.getRun(result.runId);
|
|
29
|
+
expect(run.status).toBe('completed');
|
|
30
|
+
return run;
|
|
31
|
+
}, { interval: 200, timeout: 59_000 });
|
|
32
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
33
|
+
// Expected output: 3 batches × [11, 21, 31, 41, 51] | [12, 22, ...] | ...
|
|
34
|
+
expect(output).toEqual([
|
|
35
|
+
11, 21, 31, 41, 51, 12, 22, 32, 42, 52, 13, 23, 33, 43, 53,
|
|
36
|
+
]);
|
|
37
|
+
const flowInvocations = await client.getFlowInvocationCount(result.runId);
|
|
38
|
+
// Wait a short moment to flush late log lines
|
|
39
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
40
|
+
const logs = server.getOutput();
|
|
41
|
+
// --- Parse log lines ---
|
|
42
|
+
// 1) Replay iterations + the `eventCount` passed into each replay.
|
|
43
|
+
// The runtime logs: "Starting workflow replay" with `eventCount: N`.
|
|
44
|
+
const replayEventCounts = [];
|
|
45
|
+
for (const line of logs.split('\n')) {
|
|
46
|
+
if (!line.includes(result.runId))
|
|
47
|
+
continue;
|
|
48
|
+
if (!line.includes('Starting workflow replay'))
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// eventCount is often on the next line in a multi-line object literal
|
|
52
|
+
// (console.debug prints the second argument with util.inspect). Pull all
|
|
53
|
+
// eventCount occurrences that are within ~6 lines of a replay start
|
|
54
|
+
// line referencing this runId.
|
|
55
|
+
const lines = logs.split('\n');
|
|
56
|
+
for (let i = 0; i < lines.length; i++) {
|
|
57
|
+
if (!lines[i].includes('Starting workflow replay'))
|
|
58
|
+
continue;
|
|
59
|
+
// find the runId in the surrounding 8 lines
|
|
60
|
+
const window = lines.slice(i, i + 8).join('\n');
|
|
61
|
+
if (!window.includes(result.runId))
|
|
62
|
+
continue;
|
|
63
|
+
const m = window.match(/eventCount:\s*(\d+)/);
|
|
64
|
+
if (m)
|
|
65
|
+
replayEventCounts.push(Number.parseInt(m[1], 10));
|
|
66
|
+
}
|
|
67
|
+
const replayStarts = replayEventCounts.length;
|
|
68
|
+
// 3) "All parallel steps done, replaying inline" (per-run)
|
|
69
|
+
const allDoneInlineReplays = matchCount(logs, /All parallel steps done, replaying inline/g, result.runId);
|
|
70
|
+
// 4) "Background step done but other steps pending" (per-run)
|
|
71
|
+
const backgroundStepPendingReturns = matchCount(logs, /Background step done but other steps pending/g, result.runId);
|
|
72
|
+
// 5) Step skipped because step was already in terminal state
|
|
73
|
+
// (background handler arrived after inline path already completed it).
|
|
74
|
+
// This is emitted from the step_started conflict path in step-executor.ts
|
|
75
|
+
// ("Step in terminal state, skipping"). The step_completed 409 path
|
|
76
|
+
// ("Tried completing step, but step has already finished") fires only
|
|
77
|
+
// when two handlers both ran the step body concurrently.
|
|
78
|
+
const stepsSkippedAlreadyDone = matchCount(logs, /Step in terminal state, skipping/g, result.runId);
|
|
79
|
+
const stepCompletedRaces = matchCount(logs, /Tried completing step, but step has already finished/g, result.runId);
|
|
80
|
+
// 6) Unconsumed event skips (debug message emitted by workflow.ts skip logic)
|
|
81
|
+
const unconsumedEventSkips = matchCount(logs, /Skipping unconsumed step event/g, result.runId);
|
|
82
|
+
// 7) Hook/step started with already-running: via concurrent handler
|
|
83
|
+
const maxDeliveries = matchCount(logs, /Max retries reached/g);
|
|
84
|
+
console.log('\n====================================');
|
|
85
|
+
console.log('V2 handler behavior — 3 batches × 5 steps');
|
|
86
|
+
console.log('====================================');
|
|
87
|
+
console.log(`Flow handler invocations: ${flowInvocations}`);
|
|
88
|
+
console.log(`Replay iterations (total): ${replayStarts}`);
|
|
89
|
+
console.log(`Event counts per replay: [${replayEventCounts.join(', ')}]`);
|
|
90
|
+
console.log(`"All steps done, replay inline" hits: ${allDoneInlineReplays}`);
|
|
91
|
+
console.log(`"Background step pending, return" hits: ${backgroundStepPendingReturns}`);
|
|
92
|
+
console.log(`Step skipped (already terminal, step_started 409): ${stepsSkippedAlreadyDone}`);
|
|
93
|
+
console.log(`Step body ran twice (step_completed 409): ${stepCompletedRaces}`);
|
|
94
|
+
console.log(`Unconsumed events skipped by consumer: ${unconsumedEventSkips}`);
|
|
95
|
+
console.log(`Max retries reached (bad): ${maxDeliveries}`);
|
|
96
|
+
console.log('====================================\n');
|
|
97
|
+
// Also print the key timeline: one line per "significant" runtime
|
|
98
|
+
// debug event, in order. Many debug lines put the runId in the
|
|
99
|
+
// metadata object on a following line, so look at a small forward
|
|
100
|
+
// window around each match.
|
|
101
|
+
const timeline = [];
|
|
102
|
+
const sigRegex = /Starting workflow replay|All parallel steps done|Background step done but|Workflow suspended|Workflow replay completed|Run already finished, skipping background step|Step in terminal state|Tried completing step|Max retries reached|Skipping unconsumed step event/;
|
|
103
|
+
for (let i = 0; i < lines.length; i++) {
|
|
104
|
+
if (!sigRegex.test(lines[i]))
|
|
105
|
+
continue;
|
|
106
|
+
const window = lines.slice(i, i + 8).join('\n');
|
|
107
|
+
if (!window.includes(result.runId))
|
|
108
|
+
continue;
|
|
109
|
+
timeline.push(lines[i]);
|
|
110
|
+
}
|
|
111
|
+
console.log('--- Timeline (runtime debug events for this run) ---');
|
|
112
|
+
for (const line of timeline) {
|
|
113
|
+
const short = line.replace(/\s+/g, ' ').slice(0, 180);
|
|
114
|
+
console.log(short);
|
|
115
|
+
}
|
|
116
|
+
console.log(`Timeline entries: ${timeline.length}`);
|
|
117
|
+
console.log('----------------------------------------------------\n');
|
|
118
|
+
// Raw counts — total occurrences in the whole log regardless of runId
|
|
119
|
+
// (for sanity-checking the windowed matcher above).
|
|
120
|
+
const rawUnconsumed = (logs.match(/Skipping unconsumed step event/g) || []).length;
|
|
121
|
+
const rawAllDone = (logs.match(/All parallel steps done, replaying inline/g) || []).length;
|
|
122
|
+
const rawPending = (logs.match(/Background step done but other steps pending/g) || []).length;
|
|
123
|
+
const rawTerminal = (logs.match(/Step in terminal state, skipping/g) || []).length;
|
|
124
|
+
const rawCompleted409 = (logs.match(/Tried completing step, but step has already finished/g) ||
|
|
125
|
+
[]).length;
|
|
126
|
+
console.log('--- Raw counts (no runId filter) ---');
|
|
127
|
+
console.log(`Skipping unconsumed step event: ${rawUnconsumed}`);
|
|
128
|
+
console.log(`All parallel steps done, replaying inline: ${rawAllDone}`);
|
|
129
|
+
console.log(`Background step done but other steps pending: ${rawPending}`);
|
|
130
|
+
console.log(`Step in terminal state, skipping: ${rawTerminal}`);
|
|
131
|
+
console.log(`Tried completing step, but step has already finished: ${rawCompleted409}`);
|
|
132
|
+
console.log('-------------------------------------\n');
|
|
133
|
+
// Breakdown of unconsumed event types. The log format emits the
|
|
134
|
+
// message on one line and the metadata object (eventType,
|
|
135
|
+
// correlationId) on the following lines. Walk a 12-line window after
|
|
136
|
+
// each match and extract the fields.
|
|
137
|
+
const skippedByEventType = new Map();
|
|
138
|
+
const skippedEvents = [];
|
|
139
|
+
for (let i = 0; i < lines.length; i++) {
|
|
140
|
+
if (!lines[i].includes('Skipping unconsumed step event'))
|
|
141
|
+
continue;
|
|
142
|
+
const window = lines.slice(i, i + 12).join('\n');
|
|
143
|
+
const et = window.match(/eventType:\s*'([^']+)'/);
|
|
144
|
+
const cid = window.match(/correlationId:\s*'([^']+)'/);
|
|
145
|
+
if (et && cid) {
|
|
146
|
+
skippedByEventType.set(et[1], (skippedByEventType.get(et[1]) ?? 0) + 1);
|
|
147
|
+
skippedEvents.push({ eventType: et[1], correlationId: cid[1] });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
console.log('--- Unconsumed event type breakdown ---');
|
|
151
|
+
for (const [eventType, count] of skippedByEventType) {
|
|
152
|
+
console.log(` ${eventType}: ${count}`);
|
|
153
|
+
}
|
|
154
|
+
// For each skipped event, look up all occurrences of its correlationId
|
|
155
|
+
// in the event log order so we can see whether it's a trailing
|
|
156
|
+
// duplicate lifecycle event after step_completed.
|
|
157
|
+
// We reconstruct event order from the "replaying iteration" logs isn't
|
|
158
|
+
// reliable, so instead ask the server directly.
|
|
159
|
+
const eventsResp = await fetch(`http://localhost:${server.info.port}/runs/${encodeURIComponent(result.runId)}/events`);
|
|
160
|
+
const eventsData = (await eventsResp.json().catch(() => null));
|
|
161
|
+
if (eventsData?.events) {
|
|
162
|
+
console.log(` Total events in log: ${eventsData.events.length}`);
|
|
163
|
+
// For each correlationId that had a skipped event, show the event
|
|
164
|
+
// sequence in the log for that correlationId.
|
|
165
|
+
const shownCids = new Set();
|
|
166
|
+
for (const skip of skippedEvents.slice(0, 6)) {
|
|
167
|
+
if (shownCids.has(skip.correlationId))
|
|
168
|
+
continue;
|
|
169
|
+
shownCids.add(skip.correlationId);
|
|
170
|
+
const seq = eventsData.events
|
|
171
|
+
.filter((e) => e.correlationId === skip.correlationId)
|
|
172
|
+
.map((e) => e.eventType);
|
|
173
|
+
console.log(` cid=${skip.correlationId.slice(0, 20)}... seq=[${seq.join(', ')}]`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log(' (events endpoint not available, skipping sequence dump)');
|
|
178
|
+
}
|
|
179
|
+
console.log('-----------------------------------------\n');
|
|
180
|
+
// Sanity: the run did complete. Everything else is diagnostic.
|
|
181
|
+
expect(run.status).toBe('completed');
|
|
182
|
+
// Hard assertion: no step should have hit max retries for this workflow.
|
|
183
|
+
expect(maxDeliveries).toBe(0);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Count matches of `pattern` in `logs`. If `runId` is provided, only count
|
|
188
|
+
* matches where `runId` appears within an 8-line window starting at the
|
|
189
|
+
* match — many debug lines put `workflowRunId` in the metadata object on
|
|
190
|
+
* a following line.
|
|
191
|
+
*/
|
|
192
|
+
function matchCount(logs, pattern, runId) {
|
|
193
|
+
const lines = logs.split('\n');
|
|
194
|
+
let n = 0;
|
|
195
|
+
for (let i = 0; i < lines.length; i++) {
|
|
196
|
+
pattern.lastIndex = 0;
|
|
197
|
+
if (!pattern.test(lines[i]))
|
|
198
|
+
continue;
|
|
199
|
+
if (runId) {
|
|
200
|
+
const window = lines.slice(i, i + 8).join('\n');
|
|
201
|
+
if (!window.includes(runId))
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
n++;
|
|
205
|
+
}
|
|
206
|
+
return n;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWJhdGNoZXMtZGVidWcubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lubGluZS1iYXRjaGVzLWRlYnVnLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWE7SUFDOUMsSUFBSSxDQUNGLG1FQUFtRSxFQUNuRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDbkIsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQztZQUMvQixLQUFLO1lBQ0wsR0FBRyxFQUFFO2dCQUNILEtBQUssRUFBRSxvQkFBb0I7YUFDNUI7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUNoQywrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzVCLEVBQUUsQ0FDSCxDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixLQUFLLElBQUksRUFBRTtZQUNULE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxRQUFR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QUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztRQUN4QyxDQUFDO1FBQ0QsQ0FBQyxFQUFFLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGV4cGVjdCwgdGVzdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuLyoqXG4gKiBJbnN0cnVtZW50ZWQgdGVzdDogcnVucyBgdGhyZWVCYXRjaGVzT2ZGaXZlV29ya2Zsb3dgIHdpdGhcbiAqIERFQlVHPXdvcmtmbG93OnJ1bnRpbWU6KiBhbmQgcHJpbnRzIGEgc3VtbWFyeSBvZiBWMiBoYW5kbGVyIGJlaGF2aW9yOlxuICogICAtIHRvdGFsIGZsb3cgaW52b2NhdGlvbnNcbiAqICAgLSBwZXItaW52b2NhdGlvbiByZXBsYXkgaXRlcmF0aW9uc1xuICogICAtIGV2ZW50IGxvYWRzIChmdWxsIHZzIGluY3JlbWVudGFsKSBhbmQgc2l6ZXNcbiAqICAgLSByZWR1bmRhbnQvc2tpcHBlZCBzdGVwIGV4ZWN1dGlvbnNcbiAqICAgLSBjb25jdXJyZW50IFwiYWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmVcIiByZXBsYXkgcmFjZXNcbiAqICAgLSB1bmNvbnN1bWVkLWV2ZW50IHNraXBzXG4gKlxuICogTm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgc3VpdGU7IHJ1biB3aXRoOlxuICogICBwbnBtIHZpdGVzdCBydW4gcGFja2FnZXMvd29ybGQtdGVzdGluZy90ZXN0L2lubGluZS1iYXRjaGVzLWRlYnVnLnRlc3QudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlubGluZUJhdGNoZXNEZWJ1Zyh3b3JsZDogc3RyaW5nKSB7XG4gIHRlc3QoXG4gICAgJ3RocmVlIGJhdGNoZXMgb2YgZml2ZSBwYXJhbGxlbCBzdGVwcyDigJQgcmVwb3J0IFYyIGhhbmRsZXIgYmVoYXZpb3InLFxuICAgIHsgdGltZW91dDogNjBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoe1xuICAgICAgICB3b3JsZCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgREVCVUc6ICd3b3JrZmxvdzpydW50aW1lOionLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVGZXRjaGVyKHNlcnZlcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG4gICAgICAgICd3b3JrZmxvd3MvaW5saW5lLWV4ZWN1dGlvbi50cycsXG4gICAgICAgICd0aHJlZUJhdGNoZXNPZkZpdmVXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgY2xpZW50LmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDU5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgLy8gRXhwZWN0ZWQgb3V0cHV0OiAzIGJhdGNoZXMgw5cgWzExLCAyMSwgMzEsIDQxLCA1MV0gfCBbMTIsIDIyLCAuLi5dIHwgLi4uXG4gICAgICBleHBlY3Qob3V0cHV0KS50b0VxdWFsKFtcbiAgICAgICAgMTEsIDIxLCAzMSwgNDEsIDUxLCAxMiwgMjIsIDMyLCA0MiwgNTIsIDEzLCAyMywgMzMsIDQzLCA1MyxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBmbG93SW52b2NhdGlvbnMgPSBhd2FpdCBjbGllbnQuZ2V0Rmxvd0ludm9jYXRpb25Db3VudChyZXN1bHQucnVuSWQpO1xuXG4gICAgICAvLyBXYWl0IGEgc2hvcnQgbW9tZW50IHRvIGZsdXNoIGxhdGUgbG9nIGxpbmVzXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgIGNvbnN0IGxvZ3MgPSBzZXJ2ZXIuZ2V0T3V0cHV0KCk7XG5cbiAgICAgIC8vIC0tLSBQYXJzZSBsb2cgbGluZXMgLS0tXG5cbiAgICAgIC8vIDEpIFJlcGxheSBpdGVyYXRpb25zICsgdGhlIGBldmVudENvdW50YCBwYXNzZWQgaW50byBlYWNoIHJlcGxheS5cbiAgICAgIC8vIFRoZSBydW50aW1lIGxvZ3M6IFwiU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5XCIgd2l0aCBgZXZlbnRDb3VudDogTmAuXG4gICAgICBjb25zdCByZXBsYXlFdmVudENvdW50czogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsb2dzLnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBpZiAoIWxpbmUuaW5jbHVkZXMocmVzdWx0LnJ1bklkKSkgY29udGludWU7XG4gICAgICAgIGlmICghbGluZS5pbmNsdWRlcygnU3RhcnRpbmcgd29ya2Zsb3cgcmVwbGF5JykpIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gZXZlbnRDb3VudCBpcyBvZnRlbiBvbiB0aGUgbmV4dCBsaW5lIGluIGEgbXVsdGktbGluZSBvYmplY3QgbGl0ZXJhbFxuICAgICAgLy8gKGNvbnNvbGUuZGVidWcgcHJpbnRzIHRoZSBzZWNvbmQgYXJndW1lbnQgd2l0aCB1dGlsLmluc3BlY3QpLiBQdWxsIGFsbFxuICAgICAgLy8gZXZlbnRDb3VudCBvY2N1cnJlbmNlcyB0aGF0IGFyZSB3aXRoaW4gfjYgbGluZXMgb2YgYSByZXBsYXkgc3RhcnRcbiAgICAgIC8vIGxpbmUgcmVmZXJlbmNpbmcgdGhpcyBydW5JZC5cbiAgICAgIGNvbnN0IGxpbmVzID0gbG9ncy5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbGluZXNbaV0hLmluY2x1ZGVzKCdTdGFydGluZyB3b3JrZmxvdyByZXBsYXknKSkgY29udGludWU7XG4gICAgICAgIC8vIGZpbmQgdGhlIHJ1bklkIGluIHRoZSBzdXJyb3VuZGluZyA4IGxpbmVzXG4gICAgICAgIGNvbnN0IHdpbmRvdyA9IGxpbmVzLnNsaWNlKGksIGkgKyA4KS5qb2luKCdcXG4nKTtcbiAgICAgICAgaWYgKCF3aW5kb3cuaW5jbHVkZXMocmVzdWx0LnJ1bklkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG0gPSB3aW5kb3cubWF0Y2goL2V2ZW50Q291bnQ6XFxzKihcXGQrKS8pO1xuICAgICAgICBpZiAobSkgcmVwbGF5RXZlbnRDb3VudHMucHVzaChOdW1iZXIucGFyc2VJbnQobVsxXSEsIDEwKSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBsYXlTdGFydHMgPSByZXBsYXlFdmVudENvdW50cy5sZW5ndGg7XG5cbiAgICAgIC8vIDMpIFwiQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmVcIiAocGVyLXJ1bilcbiAgICAgIGNvbnN0IGFsbERvbmVJbmxpbmVSZXBsYXlzID0gbWF0Y2hDb3VudChcbiAgICAgICAgbG9ncyxcbiAgICAgICAgL0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcblxuICAgICAgLy8gNCkgXCJCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZ1wiIChwZXItcnVuKVxuICAgICAgY29uc3QgYmFja2dyb3VuZFN0ZXBQZW5kaW5nUmV0dXJucyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9CYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZy9nLFxuICAgICAgICByZXN1bHQucnVuSWRcbiAgICAgICk7XG5cbiAgICAgIC8vIDUpIFN0ZXAgc2tpcHBlZCBiZWNhdXNlIHN0ZXAgd2FzIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgIC8vIChiYWNrZ3JvdW5kIGhhbmRsZXIgYXJyaXZlZCBhZnRlciBpbmxpbmUgcGF0aCBhbHJlYWR5IGNvbXBsZXRlZCBpdCkuXG4gICAgICAvLyBUaGlzIGlzIGVtaXR0ZWQgZnJvbSB0aGUgc3RlcF9zdGFydGVkIGNvbmZsaWN0IHBhdGggaW4gc3RlcC1leGVjdXRvci50c1xuICAgICAgLy8gKFwiU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgc2tpcHBpbmdcIikuIFRoZSBzdGVwX2NvbXBsZXRlZCA0MDkgcGF0aFxuICAgICAgLy8gKFwiVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZFwiKSBmaXJlcyBvbmx5XG4gICAgICAvLyB3aGVuIHR3byBoYW5kbGVycyBib3RoIHJhbiB0aGUgc3RlcCBib2R5IGNvbmN1cnJlbnRseS5cbiAgICAgIGNvbnN0IHN0ZXBzU2tpcHBlZEFscmVhZHlEb25lID0gbWF0Y2hDb3VudChcbiAgICAgICAgbG9ncyxcbiAgICAgICAgL1N0ZXAgaW4gdGVybWluYWwgc3RhdGUsIHNraXBwaW5nL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0ZXBDb21wbGV0ZWRSYWNlcyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9UcmllZCBjb21wbGV0aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkL2csXG4gICAgICAgIHJlc3VsdC5ydW5JZFxuICAgICAgKTtcblxuICAgICAgLy8gNikgVW5jb25zdW1lZCBldmVudCBza2lwcyAoZGVidWcgbWVzc2FnZSBlbWl0dGVkIGJ5IHdvcmtmbG93LnRzIHNraXAgbG9naWMpXG4gICAgICBjb25zdCB1bmNvbnN1bWVkRXZlbnRTa2lwcyA9IG1hdGNoQ291bnQoXG4gICAgICAgIGxvZ3MsXG4gICAgICAgIC9Ta2lwcGluZyB1bmNvbnN1bWVkIHN0ZXAgZXZlbnQvZyxcbiAgICAgICAgcmVzdWx0LnJ1bklkXG4gICAgICApO1xuXG4gICAgICAvLyA3KSBIb29rL3N0ZXAgc3RhcnRlZCB3aXRoIGFscmVhZHktcnVubmluZzogdmlhIGNvbmN1cnJlbnQgaGFuZGxlclxuICAgICAgY29uc3QgbWF4RGVsaXZlcmllcyA9IG1hdGNoQ291bnQobG9ncywgL01heCByZXRyaWVzIHJlYWNoZWQvZyk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgICAgIGNvbnNvbGUubG9nKCdWMiBoYW5kbGVyIGJlaGF2aW9yIOKAlCAzIGJhdGNoZXMgw5cgNSBzdGVwcycpO1xuICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgY29uc29sZS5sb2coYEZsb3cgaGFuZGxlciBpbnZvY2F0aW9uczogJHtmbG93SW52b2NhdGlvbnN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgUmVwbGF5IGl0ZXJhdGlvbnMgKHRvdGFsKTogJHtyZXBsYXlTdGFydHN9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgRXZlbnQgY291bnRzIHBlciByZXBsYXk6IFske3JlcGxheUV2ZW50Q291bnRzLmpvaW4oJywgJyl9XWApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcIkFsbCBzdGVwcyBkb25lLCByZXBsYXkgaW5saW5lXCIgaGl0czogJHthbGxEb25lSW5saW5lUmVwbGF5c31gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBcIkJhY2tncm91bmQgc3RlcCBwZW5kaW5nLCByZXR1cm5cIiBoaXRzOiAke2JhY2tncm91bmRTdGVwUGVuZGluZ1JldHVybnN9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgU3RlcCBza2lwcGVkIChhbHJlYWR5IHRlcm1pbmFsLCBzdGVwX3N0YXJ0ZWQgNDA5KTogJHtzdGVwc1NraXBwZWRBbHJlYWR5RG9uZX1gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBTdGVwIGJvZHkgcmFuIHR3aWNlIChzdGVwX2NvbXBsZXRlZCA0MDkpOiAgICAgICAgICAgJHtzdGVwQ29tcGxldGVkUmFjZXN9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVW5jb25zdW1lZCBldmVudHMgc2tpcHBlZCBieSBjb25zdW1lcjogJHt1bmNvbnN1bWVkRXZlbnRTa2lwc31gXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coYE1heCByZXRyaWVzIHJlYWNoZWQgKGJhZCk6ICR7bWF4RGVsaXZlcmllc31gKTtcbiAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4nKTtcblxuICAgICAgLy8gQWxzbyBwcmludCB0aGUga2V5IHRpbWVsaW5lOiBvbmUgbGluZSBwZXIgXCJzaWduaWZpY2FudFwiIHJ1bnRpbWVcbiAgICAgIC8vIGRlYnVnIGV2ZW50LCBpbiBvcmRlci4gTWFueSBkZWJ1ZyBsaW5lcyBwdXQgdGhlIHJ1bklkIGluIHRoZVxuICAgICAgLy8gbWV0YWRhdGEgb2JqZWN0IG9uIGEgZm9sbG93aW5nIGxpbmUsIHNvIGxvb2sgYXQgYSBzbWFsbCBmb3J3YXJkXG4gICAgICAvLyB3aW5kb3cgYXJvdW5kIGVhY2ggbWF0Y2guXG4gICAgICBjb25zdCB0aW1lbGluZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHNpZ1JlZ2V4ID1cbiAgICAgICAgL1N0YXJ0aW5nIHdvcmtmbG93IHJlcGxheXxBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZXxCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXR8V29ya2Zsb3cgc3VzcGVuZGVkfFdvcmtmbG93IHJlcGxheSBjb21wbGV0ZWR8UnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcHxTdGVwIGluIHRlcm1pbmFsIHN0YXRlfFRyaWVkIGNvbXBsZXRpbmcgc3RlcHxNYXggcmV0cmllcyByZWFjaGVkfFNraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudC87XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghc2lnUmVnZXgudGVzdChsaW5lc1tpXSEpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gbGluZXMuc2xpY2UoaSwgaSArIDgpLmpvaW4oJ1xcbicpO1xuICAgICAgICBpZiAoIXdpbmRvdy5pbmNsdWRlcyhyZXN1bHQucnVuSWQpKSBjb250aW51ZTtcbiAgICAgICAgdGltZWxpbmUucHVzaChsaW5lc1tpXSEpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJy0tLSBUaW1lbGluZSAocnVudGltZSBkZWJ1ZyBldmVudHMgZm9yIHRoaXMgcnVuKSAtLS0nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aW1lbGluZSkge1xuICAgICAgICBjb25zdCBzaG9ydCA9IGxpbmUucmVwbGFjZSgvXFxzKy9nLCAnICcpLnNsaWNlKDAsIDE4MCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHNob3J0KTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGBUaW1lbGluZSBlbnRyaWVzOiAke3RpbWVsaW5lLmxlbmd0aH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XG5cbiAgICAgIC8vIFJhdyBjb3VudHMg4oCUIHRvdGFsIG9jY3VycmVuY2VzIGluIHRoZSB3aG9sZSBsb2cgcmVnYXJkbGVzcyBvZiBydW5JZFxuICAgICAgLy8gKGZvciBzYW5pdHktY2hlY2tpbmcgdGhlIHdpbmRvd2VkIG1hdGNoZXIgYWJvdmUpLlxuICAgICAgY29uc3QgcmF3VW5jb25zdW1lZCA9IChcbiAgICAgICAgbG9ncy5tYXRjaCgvU2tpcHBpbmcgdW5jb25zdW1lZCBzdGVwIGV2ZW50L2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd0FsbERvbmUgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lL2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd1BlbmRpbmcgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nL2cpIHx8IFtdXG4gICAgICApLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJhd1Rlcm1pbmFsID0gKFxuICAgICAgICBsb2dzLm1hdGNoKC9TdGVwIGluIHRlcm1pbmFsIHN0YXRlLCBza2lwcGluZy9nKSB8fCBbXVxuICAgICAgKS5sZW5ndGg7XG4gICAgICBjb25zdCByYXdDb21wbGV0ZWQ0MDkgPSAoXG4gICAgICAgIGxvZ3MubWF0Y2goL1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQvZykgfHxcbiAgICAgICAgW11cbiAgICAgICkubGVuZ3RoO1xuICAgICAgY29uc29sZS5sb2coJy0tLSBSYXcgY291bnRzIChubyBydW5JZCBmaWx0ZXIpIC0tLScpO1xuICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudDogJHtyYXdVbmNvbnN1bWVkfWApO1xuICAgICAgY29uc29sZS5sb2coYEFsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lOiAke3Jhd0FsbERvbmV9YCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEJhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nOiAke3Jhd1BlbmRpbmd9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGBTdGVwIGluIHRlcm1pbmFsIHN0YXRlLCBza2lwcGluZzogJHtyYXdUZXJtaW5hbH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZDogJHtyYXdDb21wbGV0ZWQ0MDl9YFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XG5cbiAgICAgIC8vIEJyZWFrZG93biBvZiB1bmNvbnN1bWVkIGV2ZW50IHR5cGVzLiBUaGUgbG9nIGZvcm1hdCBlbWl0cyB0aGVcbiAgICAgIC8vIG1lc3NhZ2Ugb24gb25lIGxpbmUgYW5kIHRoZSBtZXRhZGF0YSBvYmplY3QgKGV2ZW50VHlwZSxcbiAgICAgIC8vIGNvcnJlbGF0aW9uSWQpIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuIFdhbGsgYSAxMi1saW5lIHdpbmRvdyBhZnRlclxuICAgICAgLy8gZWFjaCBtYXRjaCBhbmQgZXh0cmFjdCB0aGUgZmllbGRzLlxuICAgICAgY29uc3Qgc2tpcHBlZEJ5RXZlbnRUeXBlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGNvbnN0IHNraXBwZWRFdmVudHM6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFsaW5lc1tpXSEuaW5jbHVkZXMoJ1NraXBwaW5nIHVuY29uc3VtZWQgc3RlcCBldmVudCcpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgd2luZG93ID0gbGluZXMuc2xpY2UoaSwgaSArIDEyKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgZXQgPSB3aW5kb3cubWF0Y2goL2V2ZW50VHlwZTpcXHMqJyhbXiddKyknLyk7XG4gICAgICAgIGNvbnN0IGNpZCA9IHdpbmRvdy5tYXRjaCgvY29ycmVsYXRpb25JZDpcXHMqJyhbXiddKyknLyk7XG4gICAgICAgIGlmIChldCAmJiBjaWQpIHtcbiAgICAgICAgICBza2lwcGVkQnlFdmVudFR5cGUuc2V0KFxuICAgICAgICAgICAgZXRbMV0hLFxuICAgICAgICAgICAgKHNraXBwZWRCeUV2ZW50VHlwZS5nZXQoZXRbMV0hKSA/PyAwKSArIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIHNraXBwZWRFdmVudHMucHVzaCh7IGV2ZW50VHlwZTogZXRbMV0hLCBjb3JyZWxhdGlvbklkOiBjaWRbMV0hIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnLS0tIFVuY29uc3VtZWQgZXZlbnQgdHlwZSBicmVha2Rvd24gLS0tJyk7XG4gICAgICBmb3IgKGNvbnN0IFtldmVudFR5cGUsIGNvdW50XSBvZiBza2lwcGVkQnlFdmVudFR5cGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtldmVudFR5cGV9OiAke2NvdW50fWApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgZWFjaCBza2lwcGVkIGV2ZW50LCBsb29rIHVwIGFsbCBvY2N1cnJlbmNlcyBvZiBpdHMgY29ycmVsYXRpb25JZFxuICAgICAgLy8gaW4gdGhlIGV2ZW50IGxvZyBvcmRlciBzbyB3ZSBjYW4gc2VlIHdoZXRoZXIgaXQncyBhIHRyYWlsaW5nXG4gICAgICAvLyBkdXBsaWNhdGUgbGlmZWN5Y2xlIGV2ZW50IGFmdGVyIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gV2UgcmVjb25zdHJ1Y3QgZXZlbnQgb3JkZXIgZnJvbSB0aGUgXCJyZXBsYXlpbmcgaXRlcmF0aW9uXCIgbG9ncyBpc24ndFxuICAgICAgLy8gcmVsaWFibGUsIHNvIGluc3RlYWQgYXNrIHRoZSBzZXJ2ZXIgZGlyZWN0bHkuXG4gICAgICBjb25zdCBldmVudHNSZXNwID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwOi8vbG9jYWxob3N0OiR7c2VydmVyLmluZm8ucG9ydH0vcnVucy8ke2VuY29kZVVSSUNvbXBvbmVudChyZXN1bHQucnVuSWQpfS9ldmVudHNgXG4gICAgICApO1xuICAgICAgY29uc3QgZXZlbnRzRGF0YSA9IChhd2FpdCBldmVudHNSZXNwLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKSkgYXMge1xuICAgICAgICBldmVudHM6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmcgfVtdO1xuICAgICAgfSB8IG51bGw7XG4gICAgICBpZiAoZXZlbnRzRGF0YT8uZXZlbnRzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIFRvdGFsIGV2ZW50cyBpbiBsb2c6ICR7ZXZlbnRzRGF0YS5ldmVudHMubGVuZ3RofWApO1xuICAgICAgICAvLyBGb3IgZWFjaCBjb3JyZWxhdGlvbklkIHRoYXQgaGFkIGEgc2tpcHBlZCBldmVudCwgc2hvdyB0aGUgZXZlbnRcbiAgICAgICAgLy8gc2VxdWVuY2UgaW4gdGhlIGxvZyBmb3IgdGhhdCBjb3JyZWxhdGlvbklkLlxuICAgICAgICBjb25zdCBzaG93bkNpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgZm9yIChjb25zdCBza2lwIG9mIHNraXBwZWRFdmVudHMuc2xpY2UoMCwgNikpIHtcbiAgICAgICAgICBpZiAoc2hvd25DaWRzLmhhcyhza2lwLmNvcnJlbGF0aW9uSWQpKSBjb250aW51ZTtcbiAgICAgICAgICBzaG93bkNpZHMuYWRkKHNraXAuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgY29uc3Qgc2VxID0gZXZlbnRzRGF0YS5ldmVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc2tpcC5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5ldmVudFR5cGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCAgY2lkPSR7c2tpcC5jb3JyZWxhdGlvbklkLnNsaWNlKDAsIDIwKX0uLi4gc2VxPVske3NlcS5qb2luKCcsICcpfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgJyAgKGV2ZW50cyBlbmRwb2ludCBub3QgYXZhaWxhYmxlLCBza2lwcGluZyBzZXF1ZW5jZSBkdW1wKSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpO1xuXG4gICAgICAvLyBTYW5pdHk6IHRoZSBydW4gZGlkIGNvbXBsZXRlLiBFdmVyeXRoaW5nIGVsc2UgaXMgZGlhZ25vc3RpYy5cbiAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgIC8vIEhhcmQgYXNzZXJ0aW9uOiBubyBzdGVwIHNob3VsZCBoYXZlIGhpdCBtYXggcmV0cmllcyBmb3IgdGhpcyB3b3JrZmxvdy5cbiAgICAgIGV4cGVjdChtYXhEZWxpdmVyaWVzKS50b0JlKDApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDb3VudCBtYXRjaGVzIG9mIGBwYXR0ZXJuYCBpbiBgbG9nc2AuIElmIGBydW5JZGAgaXMgcHJvdmlkZWQsIG9ubHkgY291bnRcbiAqIG1hdGNoZXMgd2hlcmUgYHJ1bklkYCBhcHBlYXJzIHdpdGhpbiBhbiA4LWxpbmUgd2luZG93IHN0YXJ0aW5nIGF0IHRoZVxuICogbWF0Y2gg4oCUIG1hbnkgZGVidWcgbGluZXMgcHV0IGB3b3JrZmxvd1J1bklkYCBpbiB0aGUgbWV0YWRhdGEgb2JqZWN0IG9uXG4gKiBhIGZvbGxvd2luZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtYXRjaENvdW50KGxvZ3M6IHN0cmluZywgcGF0dGVybjogUmVnRXhwLCBydW5JZD86IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGxpbmVzID0gbG9ncy5zcGxpdCgnXFxuJyk7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChsaW5lc1tpXSEpKSBjb250aW51ZTtcbiAgICBpZiAocnVuSWQpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IGxpbmVzLnNsaWNlKGksIGkgKyA4KS5qb2luKCdcXG4nKTtcbiAgICAgIGlmICghd2luZG93LmluY2x1ZGVzKHJ1bklkKSkgY29udGludWU7XG4gICAgfVxuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests that the V2 inline execution loop correctly minimizes flow
|
|
3
|
+
* handler invocations. Each test verifies a specific pattern:
|
|
4
|
+
*
|
|
5
|
+
* - Sequential steps (no streams): 1 invocation
|
|
6
|
+
* - Sequential steps with WritableStream: 1 invocation (sync flush)
|
|
7
|
+
* - Sleep + step: 2 invocations (sleep requires queue round-trip)
|
|
8
|
+
* - Parallel steps (Promise.all): 1-3 invocations depending on whether the
|
|
9
|
+
* embedded harness observes the background step and continuation separately
|
|
10
|
+
* - Hook + resume: 2 invocations (hook requires external resume)
|
|
11
|
+
*/
|
|
12
|
+
export declare function inlineExecution(world: string): void;
|
|
13
|
+
//# sourceMappingURL=inline-execution.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-execution.d.mts","sourceRoot":"","sources":["../../src/inline-execution.mts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,QAmL5C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { hydrateWorkflowReturnValue } from '@workflow/core/serialization';
|
|
2
|
+
import { expect, test, vi } from 'vitest';
|
|
3
|
+
import { createFetcher, startServer } from './util.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* Tests that the V2 inline execution loop correctly minimizes flow
|
|
6
|
+
* handler invocations. Each test verifies a specific pattern:
|
|
7
|
+
*
|
|
8
|
+
* - Sequential steps (no streams): 1 invocation
|
|
9
|
+
* - Sequential steps with WritableStream: 1 invocation (sync flush)
|
|
10
|
+
* - Sleep + step: 2 invocations (sleep requires queue round-trip)
|
|
11
|
+
* - Parallel steps (Promise.all): 1-3 invocations depending on whether the
|
|
12
|
+
* embedded harness observes the background step and continuation separately
|
|
13
|
+
* - Hook + resume: 2 invocations (hook requires external resume)
|
|
14
|
+
*/
|
|
15
|
+
export function inlineExecution(world) {
|
|
16
|
+
test('sequential steps complete in a single flow invocation', { timeout: 30_000 }, async () => {
|
|
17
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
18
|
+
const result = await server.invoke('workflows/inline-execution.ts', 'sequentialStepsWorkflow', [10]);
|
|
19
|
+
const run = await vi.waitFor(async () => {
|
|
20
|
+
const run = await server.getRun(result.runId);
|
|
21
|
+
expect(run.status).toBe('completed');
|
|
22
|
+
return run;
|
|
23
|
+
}, { interval: 200, timeout: 29_000 });
|
|
24
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
25
|
+
expect(output).toBe(20);
|
|
26
|
+
const count = await server.getFlowInvocationCount(result.runId);
|
|
27
|
+
expect(count).toBe(1);
|
|
28
|
+
});
|
|
29
|
+
test('sequential steps with stream complete in a single flow invocation', { timeout: 30_000 }, async () => {
|
|
30
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
31
|
+
const result = await server.invoke('workflows/inline-execution.ts', 'sequentialStepsWithStreamWorkflow', []);
|
|
32
|
+
const run = await vi.waitFor(async () => {
|
|
33
|
+
const run = await server.getRun(result.runId);
|
|
34
|
+
expect(run.status).toBe('completed');
|
|
35
|
+
return run;
|
|
36
|
+
}, { interval: 200, timeout: 29_000 });
|
|
37
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
38
|
+
expect(output).toBe('hello world');
|
|
39
|
+
const count = await server.getFlowInvocationCount(result.runId);
|
|
40
|
+
expect(count).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
test('sleep workflow requires exactly 2 flow invocations', { timeout: 30_000 }, async () => {
|
|
43
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
44
|
+
const result = await server.invoke('workflows/inline-execution.ts', 'sleepWorkflow', []);
|
|
45
|
+
const run = await vi.waitFor(async () => {
|
|
46
|
+
const run = await server.getRun(result.runId);
|
|
47
|
+
expect(run.status).toBe('completed');
|
|
48
|
+
return run;
|
|
49
|
+
}, { interval: 200, timeout: 29_000 });
|
|
50
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
51
|
+
expect(output).toBe(3);
|
|
52
|
+
// Invocation 1: replay → sleep → return {timeoutSeconds}
|
|
53
|
+
// Invocation 2: sleep completed → replay → step inline → complete
|
|
54
|
+
const count = await server.getFlowInvocationCount(result.runId);
|
|
55
|
+
expect(count).toBe(2);
|
|
56
|
+
});
|
|
57
|
+
test('parallel steps (Promise.all) complete in 1-3 flow invocations', { timeout: 30_000 }, async () => {
|
|
58
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
59
|
+
const result = await server.invoke('workflows/inline-execution.ts', 'parallelStepsWorkflow', []);
|
|
60
|
+
const run = await vi.waitFor(async () => {
|
|
61
|
+
const run = await server.getRun(result.runId);
|
|
62
|
+
expect(run.status).toBe('completed');
|
|
63
|
+
return run;
|
|
64
|
+
}, { interval: 200, timeout: 29_000 });
|
|
65
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
66
|
+
expect(output).toBe(33); // (10+1) + (20+2)
|
|
67
|
+
// In the embedded harness the background step can finish quickly enough
|
|
68
|
+
// that the run completes before we observe a distinct continuation pass,
|
|
69
|
+
// so the lower bound is 1 even though production often shows 2.
|
|
70
|
+
// With higher queue concurrency, the background step's continuation may
|
|
71
|
+
// also race with the inline handler's loop, adding a 3rd no-op invocation.
|
|
72
|
+
const count = await server.getFlowInvocationCount(result.runId);
|
|
73
|
+
expect(count).toBeGreaterThanOrEqual(1);
|
|
74
|
+
expect(count).toBeLessThanOrEqual(3);
|
|
75
|
+
});
|
|
76
|
+
test('sequential steps carrying an AbortSignal still run in a single flow invocation', { timeout: 30_000 }, async () => {
|
|
77
|
+
// Regression for vercel/workflow#2795: a serialized AbortSignal in step
|
|
78
|
+
// arguments opens a real-time abort-stream reader for the step's
|
|
79
|
+
// duration. If that reader isn't torn down before the step's ops-settle
|
|
80
|
+
// check, its never-resolving read() makes every signal-bearing step
|
|
81
|
+
// report `hasPendingOps`, forcing a queue continuation per step (N+1
|
|
82
|
+
// invocations) instead of running inline.
|
|
83
|
+
const server = await startServer({ world }).then(createFetcher);
|
|
84
|
+
const count = 5;
|
|
85
|
+
const result = await server.invoke('workflows/signal-cost.ts', 'signalCostWorkflow', [{ count, withSignal: true }]);
|
|
86
|
+
const run = await vi.waitFor(async () => {
|
|
87
|
+
const run = await server.getRun(result.runId);
|
|
88
|
+
expect(run.status).toBe('completed');
|
|
89
|
+
return run;
|
|
90
|
+
}, { interval: 200, timeout: 29_000 });
|
|
91
|
+
const output = await hydrateWorkflowReturnValue(run.output, run.runId, undefined);
|
|
92
|
+
expect(output).toBe('done');
|
|
93
|
+
const invocations = await server.getFlowInvocationCount(result.runId);
|
|
94
|
+
expect(invocations).toBe(1);
|
|
95
|
+
});
|
|
96
|
+
// Hook invocation counting is tested by the existing hooks test suite.
|
|
97
|
+
// The hook pattern requires external resume, which involves complex
|
|
98
|
+
// timing. The invocation count for hooks is 2: create + resume.
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWV4ZWN1dGlvbi5tanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5saW5lLWV4ZWN1dGlvbi5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWE7SUFDM0MsSUFBSSxDQUNGLHVEQUF1RCxFQUN2RCxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDbkIsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FDaEMsK0JBQStCLEVBQy9CLHlCQUF5QixFQUN6QixDQUFDLEVBQUUsQ0FBQyxDQUNMLENBQUM7UUFFRixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQzFCLEtBQUssSUFBSSxFQUFFO1lBQ1QsTUFBTSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNuQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcs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RUFBRSxNQUFNLEVBQUUsQ0FDbkMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQzdDLEdBQUcsQ0FBQyxNQUFPLEVBQ1gsR0FBRyxDQUFDLEtBQUssRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUNGLENBQUM7SUFFRix1RUFBdUU7SUFDdkUsb0VBQW9FO0lBQ3BFLGdFQUFnRTtBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGV4cGVjdCwgdGVzdCwgdmkgfSBmcm9tICd2aXRlc3QnO1xuaW1wb3J0IHsgY3JlYXRlRmV0Y2hlciwgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3V0aWwubWpzJztcblxuLyoqXG4gKiBUZXN0cyB0aGF0IHRoZSBWMiBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgY29ycmVjdGx5IG1pbmltaXplcyBmbG93XG4gKiBoYW5kbGVyIGludm9jYXRpb25zLiBFYWNoIHRlc3QgdmVyaWZpZXMgYSBzcGVjaWZpYyBwYXR0ZXJuOlxuICpcbiAqIC0gU2VxdWVudGlhbCBzdGVwcyAobm8gc3RyZWFtcyk6IDEgaW52b2NhdGlvblxuICogLSBTZXF1ZW50aWFsIHN0ZXBzIHdpdGggV3JpdGFibGVTdHJlYW06IDEgaW52b2NhdGlvbiAoc3luYyBmbHVzaClcbiAqIC0gU2xlZXAgKyBzdGVwOiAyIGludm9jYXRpb25zIChzbGVlcCByZXF1aXJlcyBxdWV1ZSByb3VuZC10cmlwKVxuICogLSBQYXJhbGxlbCBzdGVwcyAoUHJvbWlzZS5hbGwpOiAxLTMgaW52b2NhdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlXG4gKiAgIGVtYmVkZGVkIGhhcm5lc3Mgb2JzZXJ2ZXMgdGhlIGJhY2tncm91bmQgc3RlcCBhbmQgY29udGludWF0aW9uIHNlcGFyYXRlbHlcbiAqIC0gSG9vayArIHJlc3VtZTogMiBpbnZvY2F0aW9ucyAoaG9vayByZXF1aXJlcyBleHRlcm5hbCByZXN1bWUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmxpbmVFeGVjdXRpb24od29ybGQ6IHN0cmluZykge1xuICB0ZXN0KFxuICAgICdzZXF1ZW50aWFsIHN0ZXBzIGNvbXBsZXRlIGluIGEgc2luZ2xlIGZsb3cgaW52b2NhdGlvbicsXG4gICAgeyB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAnd29ya2Zsb3dzL2lubGluZS1leGVjdXRpb24udHMnLFxuICAgICAgICAnc2VxdWVudGlhbFN0ZXBzV29ya2Zsb3cnLFxuICAgICAgICBbMTBdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgyMCk7XG5cbiAgICAgIGNvbnN0IGNvdW50ID0gYXdhaXQgc2VydmVyLmdldEZsb3dJbnZvY2F0aW9uQ291bnQocmVzdWx0LnJ1bklkKTtcbiAgICAgIGV4cGVjdChjb3VudCkudG9CZSgxKTtcbiAgICB9XG4gICk7XG5cbiAgdGVzdChcbiAgICAnc2VxdWVudGlhbCBzdGVwcyB3aXRoIHN0cmVhbSBjb21wbGV0ZSBpbiBhIHNpbmdsZSBmbG93IGludm9jYXRpb24nLFxuICAgIHsgdGltZW91dDogMzBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICAgJ3dvcmtmbG93cy9pbmxpbmUtZXhlY3V0aW9uLnRzJyxcbiAgICAgICAgJ3NlcXVlbnRpYWxTdGVwc1dpdGhTdHJlYW1Xb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgnaGVsbG8gd29ybGQnKTtcblxuICAgICAgY29uc3QgY291bnQgPSBhd2FpdCBzZXJ2ZXIuZ2V0Rmxvd0ludm9jYXRpb25Db3VudChyZXN1bHQucnVuSWQpO1xuICAgICAgZXhwZWN0KGNvdW50KS50b0JlKDEpO1xuICAgIH1cbiAgKTtcblxuICB0ZXN0KFxuICAgICdzbGVlcCB3b3JrZmxvdyByZXF1aXJlcyBleGFjdGx5IDIgZmxvdyBpbnZvY2F0aW9ucycsXG4gICAgeyB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcih7IHdvcmxkIH0pLnRoZW4oY3JlYXRlRmV0Y2hlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2ZXIuaW52b2tlKFxuICAgICAgICAnd29ya2Zsb3dzL2lubGluZS1leGVjdXRpb24udHMnLFxuICAgICAgICAnc2xlZXBXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgzKTtcblxuICAgICAgLy8gSW52b2NhdGlvbiAxOiByZXBsYXkg4oaSIHNsZWVwIOKGkiByZXR1cm4ge3RpbWVvdXRTZWNvbmRzfVxuICAgICAgLy8gSW52b2NhdGlvbiAyOiBzbGVlcCBjb21wbGV0ZWQg4oaSIHJlcGxheSDihpIgc3RlcCBpbmxpbmUg4oaSIGNvbXBsZXRlXG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IHNlcnZlci5nZXRGbG93SW52b2NhdGlvbkNvdW50KHJlc3VsdC5ydW5JZCk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmUoMik7XG4gICAgfVxuICApO1xuXG4gIHRlc3QoXG4gICAgJ3BhcmFsbGVsIHN0ZXBzIChQcm9taXNlLmFsbCkgY29tcGxldGUgaW4gMS0zIGZsb3cgaW52b2NhdGlvbnMnLFxuICAgIHsgdGltZW91dDogMzBfMDAwIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICAgJ3dvcmtmbG93cy9pbmxpbmUtZXhlY3V0aW9uLnRzJyxcbiAgICAgICAgJ3BhcmFsbGVsU3RlcHNXb3JrZmxvdycsXG4gICAgICAgIFtdXG4gICAgICApO1xuXG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB2aS53YWl0Rm9yKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgc2VydmVyLmdldFJ1bihyZXN1bHQucnVuSWQpO1xuICAgICAgICAgIGV4cGVjdChydW4uc3RhdHVzKS50b0JlKCdjb21wbGV0ZWQnKTtcbiAgICAgICAgICByZXR1cm4gcnVuO1xuICAgICAgICB9LFxuICAgICAgICB7IGludGVydmFsOiAyMDAsIHRpbWVvdXQ6IDI5XzAwMCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcnVuLm91dHB1dCEsXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgZXhwZWN0KG91dHB1dCkudG9CZSgzMyk7IC8vICgxMCsxKSArICgyMCsyKVxuXG4gICAgICAvLyBJbiB0aGUgZW1iZWRkZWQgaGFybmVzcyB0aGUgYmFja2dyb3VuZCBzdGVwIGNhbiBmaW5pc2ggcXVpY2tseSBlbm91Z2hcbiAgICAgIC8vIHRoYXQgdGhlIHJ1biBjb21wbGV0ZXMgYmVmb3JlIHdlIG9ic2VydmUgYSBkaXN0aW5jdCBjb250aW51YXRpb24gcGFzcyxcbiAgICAgIC8vIHNvIHRoZSBsb3dlciBib3VuZCBpcyAxIGV2ZW4gdGhvdWdoIHByb2R1Y3Rpb24gb2Z0ZW4gc2hvd3MgMi5cbiAgICAgIC8vIFdpdGggaGlnaGVyIHF1ZXVlIGNvbmN1cnJlbmN5LCB0aGUgYmFja2dyb3VuZCBzdGVwJ3MgY29udGludWF0aW9uIG1heVxuICAgICAgLy8gYWxzbyByYWNlIHdpdGggdGhlIGlubGluZSBoYW5kbGVyJ3MgbG9vcCwgYWRkaW5nIGEgM3JkIG5vLW9wIGludm9jYXRpb24uXG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IHNlcnZlci5nZXRGbG93SW52b2NhdGlvbkNvdW50KHJlc3VsdC5ydW5JZCk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMSk7XG4gICAgICBleHBlY3QoY291bnQpLnRvQmVMZXNzVGhhbk9yRXF1YWwoMyk7XG4gICAgfVxuICApO1xuXG4gIHRlc3QoXG4gICAgJ3NlcXVlbnRpYWwgc3RlcHMgY2FycnlpbmcgYW4gQWJvcnRTaWduYWwgc3RpbGwgcnVuIGluIGEgc2luZ2xlIGZsb3cgaW52b2NhdGlvbicsXG4gICAgeyB0aW1lb3V0OiAzMF8wMDAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBSZWdyZXNzaW9uIGZvciB2ZXJjZWwvd29ya2Zsb3cjMjc5NTogYSBzZXJpYWxpemVkIEFib3J0U2lnbmFsIGluIHN0ZXBcbiAgICAgIC8vIGFyZ3VtZW50cyBvcGVucyBhIHJlYWwtdGltZSBhYm9ydC1zdHJlYW0gcmVhZGVyIGZvciB0aGUgc3RlcCdzXG4gICAgICAvLyBkdXJhdGlvbi4gSWYgdGhhdCByZWFkZXIgaXNuJ3QgdG9ybiBkb3duIGJlZm9yZSB0aGUgc3RlcCdzIG9wcy1zZXR0bGVcbiAgICAgIC8vIGNoZWNrLCBpdHMgbmV2ZXItcmVzb2x2aW5nIHJlYWQoKSBtYWtlcyBldmVyeSBzaWduYWwtYmVhcmluZyBzdGVwXG4gICAgICAvLyByZXBvcnQgYGhhc1BlbmRpbmdPcHNgLCBmb3JjaW5nIGEgcXVldWUgY29udGludWF0aW9uIHBlciBzdGVwIChOKzFcbiAgICAgIC8vIGludm9jYXRpb25zKSBpbnN0ZWFkIG9mIHJ1bm5pbmcgaW5saW5lLlxuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoeyB3b3JsZCB9KS50aGVuKGNyZWF0ZUZldGNoZXIpO1xuICAgICAgY29uc3QgY291bnQgPSA1O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmVyLmludm9rZShcbiAgICAgICAgJ3dvcmtmbG93cy9zaWduYWwtY29zdC50cycsXG4gICAgICAgICdzaWduYWxDb3N0V29ya2Zsb3cnLFxuICAgICAgICBbeyBjb3VudCwgd2l0aFNpZ25hbDogdHJ1ZSB9XVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcnVuID0gYXdhaXQgdmkud2FpdEZvcihcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHNlcnZlci5nZXRSdW4ocmVzdWx0LnJ1bklkKTtcbiAgICAgICAgICBleHBlY3QocnVuLnN0YXR1cykudG9CZSgnY29tcGxldGVkJyk7XG4gICAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgICAgfSxcbiAgICAgICAgeyBpbnRlcnZhbDogMjAwLCB0aW1lb3V0OiAyOV8wMDAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICAgIHJ1bi5vdXRwdXQhLFxuICAgICAgICBydW4ucnVuSWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQmUoJ2RvbmUnKTtcblxuICAgICAgY29uc3QgaW52b2NhdGlvbnMgPSBhd2FpdCBzZXJ2ZXIuZ2V0Rmxvd0ludm9jYXRpb25Db3VudChyZXN1bHQucnVuSWQpO1xuICAgICAgZXhwZWN0KGludm9jYXRpb25zKS50b0JlKDEpO1xuICAgIH1cbiAgKTtcblxuICAvLyBIb29rIGludm9jYXRpb24gY291bnRpbmcgaXMgdGVzdGVkIGJ5IHRoZSBleGlzdGluZyBob29rcyB0ZXN0IHN1aXRlLlxuICAvLyBUaGUgaG9vayBwYXR0ZXJuIHJlcXVpcmVzIGV4dGVybmFsIHJlc3VtZSwgd2hpY2ggaW52b2x2ZXMgY29tcGxleFxuICAvLyB0aW1pbmcuIFRoZSBpbnZvY2F0aW9uIGNvdW50IGZvciBob29rcyBpcyAyOiBjcmVhdGUgKyByZXN1bWUuXG59XG4iXX0=
|
package/dist/src/jsonlines.mjs
CHANGED
|
@@ -29,4 +29,4 @@ export async function* jsonlines(readable) {
|
|
|
29
29
|
}
|
|
30
30
|
yield* bufferedObjects();
|
|
31
31
|
}
|
|
32
|
-
//# sourceMappingURL=
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmxpbmVzLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29ubGluZXMubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFvQztJQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNwQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixLQUFLLFNBQVMsQ0FBQyxDQUFDLGVBQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksSUFBSSxDQUFDO1lBQ2YsS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbioganNvbmxpbmVzKHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pikge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICBsZXQgYnVmZmVyID0gJyc7XG5cbiAgY29uc3QgYnVmZmVyZWRMaW5lcyA9ICgpID0+IHtcbiAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuJyk7XG4gICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJyc7XG4gICAgcmV0dXJuIGxpbmVzO1xuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uKiBidWZmZXJlZE9iamVjdHMoKSB7XG4gICAgY29uc3QgbGluZXMgPSBidWZmZXJlZExpbmVzKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB5aWVsZCBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKHJlYWQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGVyLmRlY29kZShyZWFkLnZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIGJ1ZmZlciArPSB0ZXh0O1xuICAgICAgeWllbGQqIGJ1ZmZlcmVkT2JqZWN0cygpO1xuICAgIH1cbiAgICBpZiAocmVhZC5kb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB5aWVsZCogYnVmZmVyZWRPYmplY3RzKCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proves end-to-end that `start()` called from a workflow *body* (the canonical
|
|
3
|
+
* child-workflow spawn, not from inside a step) records cross-run lineage. The
|
|
4
|
+
* spawned child must carry `$parentRunId`/`$rootRunId` pointing at the parent,
|
|
5
|
+
* while the top-level parent itself carries none.
|
|
6
|
+
*/
|
|
7
|
+
export declare function lineage(world: string): void;
|
|
8
|
+
//# sourceMappingURL=lineage.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineage.d.mts","sourceRoot":"","sources":["../../src/lineage.mts"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,QAuDpC"}
|