@workflow/world-testing 5.0.0-beta.5 → 5.0.0-beta.50
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 +34960 -0
- package/dist/.well-known/workflow/v1/flow.mjs +104550 -64125
- package/dist/.well-known/workflow/v1/manifest.json +1450 -180
- package/dist/src/addition.mjs +2 -2
- package/dist/src/errors.mjs +2 -2
- package/dist/src/event-ids.d.mts +16 -0
- package/dist/src/event-ids.d.mts.map +1 -0
- package/dist/src/event-ids.mjs +60 -0
- 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.mjs +2 -2
- package/dist/src/inline-execution.d.mts.map +1 -1
- package/dist/src/inline-execution.mjs +22 -2
- 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 +15 -7
- package/dist/src/util.d.mts +26 -6
- package/dist/src/util.d.mts.map +1 -1
- package/dist/src/util.mjs +51 -3
- package/dist/workflows/hooks.js +1 -1
- package/package.json +14 -13
- package/dist/.well-known/workflow/v1/step.mjs +0 -26802
- 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/inline-batches-debug.mjs.map +0 -1
- package/dist/src/inline-execution.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
|
@@ -1 +0,0 @@
|
|
|
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,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,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,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,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function addition(world: string) {\n test('runs an addition', { timeout: 30_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/addition.ts',\n 'addition',\n [1, 2]\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n expect(run.output).toBeInstanceOf(Uint8Array);\n return run;\n },\n {\n interval: 200,\n timeout: 25_000,\n }\n );\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual(3);\n });\n}\n"]}
|
package/dist/src/errors.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","sourceRoot":"","sources":["../../src/errors.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,IAAI,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QACjE,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,kCAAkC,EAClC,gCAAgC,EAChC,EAAE,CACH,CAAC;QACF,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;QACF,MAAM,MAAM,GAAG,CAAC,MAAM,0BAA0B,CAC9C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAQ,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,IAAI;YACnB,eAAe,EAAE;gBACf,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC5B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;aAChC;SACF,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function errors(world: string) {\n test('retriable and fatal errors', { timeout: 59_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/retriable-and-fatal.ts',\n 'retryableAndFatalErrorWorkflow',\n []\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 50_000,\n }\n );\n const output = (await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n )) as any;\n expect(output).toEqual({\n gotFatalError: true,\n retryableResult: {\n attempt: 2,\n duration: expect.any(Number),\n stepStartedAt: expect.any(Date),\n },\n });\n expect(output.retryableResult.duration).toBeGreaterThanOrEqual(2000);\n });\n}\n"]}
|
package/dist/src/hooks.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.mjs","sourceRoot":"","sources":["../../src/hooks.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,kBAAkB,KAAK,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,oBAAoB,EACpB,iBAAiB,EACjB,CAAC,KAAK,EAAE,UAAU,CAAC,CACpB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QAClD,MAAM,iBAAiB,GAAG,EAAe,CAAC;QAE1C,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBAC/B,IAAI,GAAG,EAAE,KAAK,KAAK,aAAa,EAAE,CAAC;oBACjC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtB,SAAS;gBACX,CAAC;gBAED,IAAI,GAAG,EAAE,KAAK,KAAK,aAAa,EAAE,CAAC;oBACjC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACpC,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,mCAAmC;QACrC,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,OAAO,CAAC;QAE1B,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,MAAM,CAAC,UAAU,CAAc,KAAK,EAAE;gBAC1C,IAAI,EAAE,eAAe;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAc,KAAK,EAAE;gBAC1C,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAc,KAAK,EAAE;gBAC1C,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QAEL,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,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,EAAE,UAAU,EAAE;iBACzB;gBACD;oBACE,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,EAAE,UAAU,EAAE;iBACzB;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,QAAQ,EAAE,EAAE,UAAU,EAAE;oBACxB,IAAI,EAAE,IAAI;iBACX;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport type { Hook } from '../workflows/hooks.ts';\nimport { jsonlines } from './jsonlines.mjs';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function hooks(world: string) {\n test('hooks', { timeout: 60_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const token = Date.now().toString(36);\n const customData = `my-custom-data-${token}`;\n const result = await server.invoke(\n 'workflows/hooks.ts',\n 'collectWithHook',\n [token, customData]\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const readable = await server.getReadable(result.runId);\n const events = jsonlines(readable);\n const hookCreated = Promise.withResolvers<void>();\n const hookResumedEvents = [] as unknown[];\n\n (async () => {\n for await (const obj of events) {\n if (obj?.event === 'hookCreated') {\n hookCreated.resolve();\n continue;\n }\n\n if (obj?.event === 'hookResumed') {\n hookResumedEvents.push(obj.payload);\n continue;\n }\n\n console.log('unhandled event', obj);\n }\n })().catch(() => {\n // ignore errors for reading stream\n });\n\n await hookCreated.promise;\n\n (async () => {\n await server.resumeHook<typeof Hook>(token, {\n data: 'first payload',\n });\n await server.resumeHook<typeof Hook>(token, {\n data: 'second payload',\n });\n await server.resumeHook<typeof Hook>(token, {\n data: 'third payload',\n done: true,\n });\n })();\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 59_000,\n }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual({\n collected: [\n {\n data: 'first payload',\n metadata: { customData },\n },\n {\n data: 'second payload',\n metadata: { customData },\n },\n {\n data: 'third payload',\n metadata: { customData },\n done: true,\n },\n ],\n });\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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,8BAA8B,CAAC;AAC1E,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,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function idempotency(world: string) {\n test('idempotency', { timeout: 60_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke('workflows/noop.ts', 'brokenWf', [1, 2]);\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run).toMatchObject<Partial<typeof run>>({\n status: 'completed',\n });\n return run;\n },\n {\n interval: 200,\n timeout: 59_000,\n }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n\n expect(output).toEqual({\n numbers: Array.from({ length: 20 }, () => expect.any(Number)),\n });\n });\n}\n"]}
|
package/dist/src/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,CAAC,OAAO,CAAC,CAAC;IACf,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClB,MAAM,CAAC,OAAO,CAAC,CAAC;IAChB,eAAe,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC","sourcesContent":["import { addition } from './addition.mjs';\nimport { errors } from './errors.mjs';\nimport { hooks } from './hooks.mjs';\nimport { idempotency } from './idempotency.mjs';\nimport { inlineExecution } from './inline-execution.mjs';\nimport { nullByte } from './null-byte.mjs';\n\nexport function createTestSuite(pkgName: string) {\n addition(pkgName);\n idempotency(pkgName);\n hooks(pkgName);\n nullByte(pkgName);\n errors(pkgName);\n inlineExecution(pkgName);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inline-batches-debug.mjs","sourceRoot":"","sources":["../../src/inline-batches-debug.mts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\n/**\n * Instrumented test: runs `threeBatchesOfFiveWorkflow` with\n * DEBUG=workflow:runtime:* and prints a summary of V2 handler behavior:\n * - total flow invocations\n * - per-invocation replay iterations\n * - event loads (full vs incremental) and sizes\n * - redundant/skipped step executions\n * - concurrent \"all parallel steps done\" replay races\n * - unconsumed-event skips\n *\n * Not part of the default suite; run with:\n * pnpm vitest run packages/world-testing/test/inline-batches-debug.test.ts\n */\nexport function inlineBatchesDebug(world: string) {\n test(\n 'three batches of five parallel steps — report V2 handler behavior',\n { timeout: 60_000 },\n async () => {\n const server = await startServer({\n world,\n env: {\n DEBUG: 'workflow:runtime:*',\n },\n });\n const client = createFetcher(server);\n\n const result = await client.invoke(\n 'workflows/inline-execution.ts',\n 'threeBatchesOfFiveWorkflow',\n []\n );\n\n const run = await vi.waitFor(\n async () => {\n const run = await client.getRun(result.runId);\n expect(run.status).toBe('completed');\n return run;\n },\n { interval: 200, timeout: 59_000 }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n // Expected output: 3 batches × [11, 21, 31, 41, 51] | [12, 22, ...] | ...\n expect(output).toEqual([\n 11, 21, 31, 41, 51, 12, 22, 32, 42, 52, 13, 23, 33, 43, 53,\n ]);\n\n const flowInvocations = await client.getFlowInvocationCount(result.runId);\n\n // Wait a short moment to flush late log lines\n await new Promise((r) => setTimeout(r, 500));\n const logs = server.getOutput();\n\n // --- Parse log lines ---\n\n // 1) Replay iterations + the `eventCount` passed into each replay.\n // The runtime logs: \"Starting workflow replay\" with `eventCount: N`.\n const replayEventCounts: number[] = [];\n for (const line of logs.split('\\n')) {\n if (!line.includes(result.runId)) continue;\n if (!line.includes('Starting workflow replay')) continue;\n }\n // eventCount is often on the next line in a multi-line object literal\n // (console.debug prints the second argument with util.inspect). Pull all\n // eventCount occurrences that are within ~6 lines of a replay start\n // line referencing this runId.\n const lines = logs.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]!.includes('Starting workflow replay')) continue;\n // find the runId in the surrounding 8 lines\n const window = lines.slice(i, i + 8).join('\\n');\n if (!window.includes(result.runId)) continue;\n const m = window.match(/eventCount:\\s*(\\d+)/);\n if (m) replayEventCounts.push(Number.parseInt(m[1]!, 10));\n }\n const replayStarts = replayEventCounts.length;\n\n // 3) \"All parallel steps done, replaying inline\" (per-run)\n const allDoneInlineReplays = matchCount(\n logs,\n /All parallel steps done, replaying inline/g,\n result.runId\n );\n\n // 4) \"Background step done but other steps pending\" (per-run)\n const backgroundStepPendingReturns = matchCount(\n logs,\n /Background step done but other steps pending/g,\n result.runId\n );\n\n // 5) Step skipped because step was already in terminal state\n // (background handler arrived after inline path already completed it).\n // This is emitted from the step_started conflict path in step-executor.ts\n // (\"Step in terminal state, skipping\"). The step_completed 409 path\n // (\"Tried completing step, but step has already finished\") fires only\n // when two handlers both ran the step body concurrently.\n const stepsSkippedAlreadyDone = matchCount(\n logs,\n /Step in terminal state, skipping/g,\n result.runId\n );\n const stepCompletedRaces = matchCount(\n logs,\n /Tried completing step, but step has already finished/g,\n result.runId\n );\n\n // 6) Unconsumed event skips (debug message emitted by workflow.ts skip logic)\n const unconsumedEventSkips = matchCount(\n logs,\n /Skipping unconsumed step event/g,\n result.runId\n );\n\n // 7) Hook/step started with already-running: via concurrent handler\n const maxDeliveries = matchCount(logs, /Max retries reached/g);\n\n console.log('\\n====================================');\n console.log('V2 handler behavior — 3 batches × 5 steps');\n console.log('====================================');\n console.log(`Flow handler invocations: ${flowInvocations}`);\n console.log(`Replay iterations (total): ${replayStarts}`);\n console.log(`Event counts per replay: [${replayEventCounts.join(', ')}]`);\n console.log(\n `\"All steps done, replay inline\" hits: ${allDoneInlineReplays}`\n );\n console.log(\n `\"Background step pending, return\" hits: ${backgroundStepPendingReturns}`\n );\n console.log(\n `Step skipped (already terminal, step_started 409): ${stepsSkippedAlreadyDone}`\n );\n console.log(\n `Step body ran twice (step_completed 409): ${stepCompletedRaces}`\n );\n console.log(\n `Unconsumed events skipped by consumer: ${unconsumedEventSkips}`\n );\n console.log(`Max retries reached (bad): ${maxDeliveries}`);\n console.log('====================================\\n');\n\n // Also print the key timeline: one line per \"significant\" runtime\n // debug event, in order. Many debug lines put the runId in the\n // metadata object on a following line, so look at a small forward\n // window around each match.\n const timeline: string[] = [];\n const sigRegex =\n /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/;\n for (let i = 0; i < lines.length; i++) {\n if (!sigRegex.test(lines[i]!)) continue;\n const window = lines.slice(i, i + 8).join('\\n');\n if (!window.includes(result.runId)) continue;\n timeline.push(lines[i]!);\n }\n console.log('--- Timeline (runtime debug events for this run) ---');\n for (const line of timeline) {\n const short = line.replace(/\\s+/g, ' ').slice(0, 180);\n console.log(short);\n }\n console.log(`Timeline entries: ${timeline.length}`);\n console.log('----------------------------------------------------\\n');\n\n // Raw counts — total occurrences in the whole log regardless of runId\n // (for sanity-checking the windowed matcher above).\n const rawUnconsumed = (\n logs.match(/Skipping unconsumed step event/g) || []\n ).length;\n const rawAllDone = (\n logs.match(/All parallel steps done, replaying inline/g) || []\n ).length;\n const rawPending = (\n logs.match(/Background step done but other steps pending/g) || []\n ).length;\n const rawTerminal = (\n logs.match(/Step in terminal state, skipping/g) || []\n ).length;\n const rawCompleted409 = (\n logs.match(/Tried completing step, but step has already finished/g) ||\n []\n ).length;\n console.log('--- Raw counts (no runId filter) ---');\n console.log(`Skipping unconsumed step event: ${rawUnconsumed}`);\n console.log(`All parallel steps done, replaying inline: ${rawAllDone}`);\n console.log(\n `Background step done but other steps pending: ${rawPending}`\n );\n console.log(`Step in terminal state, skipping: ${rawTerminal}`);\n console.log(\n `Tried completing step, but step has already finished: ${rawCompleted409}`\n );\n console.log('-------------------------------------\\n');\n\n // Breakdown of unconsumed event types. The log format emits the\n // message on one line and the metadata object (eventType,\n // correlationId) on the following lines. Walk a 12-line window after\n // each match and extract the fields.\n const skippedByEventType = new Map<string, number>();\n const skippedEvents: { eventType: string; correlationId: string }[] = [];\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]!.includes('Skipping unconsumed step event')) continue;\n const window = lines.slice(i, i + 12).join('\\n');\n const et = window.match(/eventType:\\s*'([^']+)'/);\n const cid = window.match(/correlationId:\\s*'([^']+)'/);\n if (et && cid) {\n skippedByEventType.set(\n et[1]!,\n (skippedByEventType.get(et[1]!) ?? 0) + 1\n );\n skippedEvents.push({ eventType: et[1]!, correlationId: cid[1]! });\n }\n }\n console.log('--- Unconsumed event type breakdown ---');\n for (const [eventType, count] of skippedByEventType) {\n console.log(` ${eventType}: ${count}`);\n }\n\n // For each skipped event, look up all occurrences of its correlationId\n // in the event log order so we can see whether it's a trailing\n // duplicate lifecycle event after step_completed.\n // We reconstruct event order from the \"replaying iteration\" logs isn't\n // reliable, so instead ask the server directly.\n const eventsResp = await fetch(\n `http://localhost:${server.info.port}/runs/${encodeURIComponent(result.runId)}/events`\n );\n const eventsData = (await eventsResp.json().catch(() => null)) as {\n events: { eventType: string; correlationId?: string }[];\n } | null;\n if (eventsData?.events) {\n console.log(` Total events in log: ${eventsData.events.length}`);\n // For each correlationId that had a skipped event, show the event\n // sequence in the log for that correlationId.\n const shownCids = new Set<string>();\n for (const skip of skippedEvents.slice(0, 6)) {\n if (shownCids.has(skip.correlationId)) continue;\n shownCids.add(skip.correlationId);\n const seq = eventsData.events\n .filter((e) => e.correlationId === skip.correlationId)\n .map((e) => e.eventType);\n console.log(\n ` cid=${skip.correlationId.slice(0, 20)}... seq=[${seq.join(', ')}]`\n );\n }\n } else {\n console.log(\n ' (events endpoint not available, skipping sequence dump)'\n );\n }\n console.log('-----------------------------------------\\n');\n\n // Sanity: the run did complete. Everything else is diagnostic.\n expect(run.status).toBe('completed');\n // Hard assertion: no step should have hit max retries for this workflow.\n expect(maxDeliveries).toBe(0);\n }\n );\n}\n\n/**\n * Count matches of `pattern` in `logs`. If `runId` is provided, only count\n * matches where `runId` appears within an 8-line window starting at the\n * match — many debug lines put `workflowRunId` in the metadata object on\n * a following line.\n */\nfunction matchCount(logs: string, pattern: RegExp, runId?: string): number {\n const lines = logs.split('\\n');\n let n = 0;\n for (let i = 0; i < lines.length; i++) {\n pattern.lastIndex = 0;\n if (!pattern.test(lines[i]!)) continue;\n if (runId) {\n const window = lines.slice(i, i + 8).join('\\n');\n if (!window.includes(runId)) continue;\n }\n n++;\n }\n return n;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inline-execution.mjs","sourceRoot":"","sources":["../../src/inline-execution.mts"],"names":[],"mappings":"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","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\n/**\n * Tests that the V2 inline execution loop correctly minimizes flow\n * handler invocations. Each test verifies a specific pattern:\n *\n * - Sequential steps (no streams): 1 invocation\n * - Sequential steps with WritableStream: 1 invocation (sync flush)\n * - Sleep + step: 2 invocations (sleep requires queue round-trip)\n * - Parallel steps (Promise.all): 1-3 invocations depending on whether the\n * embedded harness observes the background step and continuation separately\n * - Hook + resume: 2 invocations (hook requires external resume)\n */\nexport function inlineExecution(world: string) {\n test(\n 'sequential steps complete in a single flow invocation',\n { timeout: 30_000 },\n async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/inline-execution.ts',\n 'sequentialStepsWorkflow',\n [10]\n );\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n return run;\n },\n { interval: 200, timeout: 29_000 }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toBe(20);\n\n const count = await server.getFlowInvocationCount(result.runId);\n expect(count).toBe(1);\n }\n );\n\n test(\n 'sequential steps with stream complete in a single flow invocation',\n { timeout: 30_000 },\n async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/inline-execution.ts',\n 'sequentialStepsWithStreamWorkflow',\n []\n );\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n return run;\n },\n { interval: 200, timeout: 29_000 }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toBe('hello world');\n\n const count = await server.getFlowInvocationCount(result.runId);\n expect(count).toBe(1);\n }\n );\n\n test(\n 'sleep workflow requires exactly 2 flow invocations',\n { timeout: 30_000 },\n async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/inline-execution.ts',\n 'sleepWorkflow',\n []\n );\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n return run;\n },\n { interval: 200, timeout: 29_000 }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toBe(3);\n\n // Invocation 1: replay → sleep → return {timeoutSeconds}\n // Invocation 2: sleep completed → replay → step inline → complete\n const count = await server.getFlowInvocationCount(result.runId);\n expect(count).toBe(2);\n }\n );\n\n test(\n 'parallel steps (Promise.all) complete in 1-3 flow invocations',\n { timeout: 30_000 },\n async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/inline-execution.ts',\n 'parallelStepsWorkflow',\n []\n );\n\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n return run;\n },\n { interval: 200, timeout: 29_000 }\n );\n\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toBe(33); // (10+1) + (20+2)\n\n // In the embedded harness the background step can finish quickly enough\n // that the run completes before we observe a distinct continuation pass,\n // so the lower bound is 1 even though production often shows 2.\n // With higher queue concurrency, the background step's continuation may\n // also race with the inline handler's loop, adding a 3rd no-op invocation.\n const count = await server.getFlowInvocationCount(result.runId);\n expect(count).toBeGreaterThanOrEqual(1);\n expect(count).toBeLessThanOrEqual(3);\n }\n );\n\n // Hook invocation counting is tested by the existing hooks test suite.\n // The hook pattern requires external resume, which involves complex\n // timing. The invocation count for hooks is 2: create + resume.\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonlines.mjs","sourceRoot":"","sources":["../../src/jsonlines.mts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,QAAoC;IACnE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,KAAK,SAAS,CAAC,CAAC,eAAe;QAC7B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,IAAI,CAAC;YACf,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM;QACR,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["export async function* jsonlines(readable: ReadableStream<Uint8Array>) {\n const decoder = new TextDecoder();\n const reader = readable.getReader();\n let buffer = '';\n\n const bufferedLines = () => {\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n return lines;\n };\n\n async function* bufferedObjects() {\n const lines = bufferedLines();\n for (const line of lines) {\n try {\n yield JSON.parse(line);\n } catch {}\n }\n }\n\n while (true) {\n const read = await reader.read();\n if (read.value) {\n const text = decoder.decode(read.value, { stream: true });\n buffer += text;\n yield* bufferedObjects();\n }\n if (read.done) {\n break;\n }\n }\n\n yield* bufferedObjects();\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"null-byte.mjs","sourceRoot":"","sources":["../../src/null-byte.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE;QAC1E,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,wBAAwB,EACxB,kBAAkB,EAClB,EAAE,CACH,CAAC;QACF,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,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAC7C,GAAG,CAAC,MAAO,EACX,GAAG,CAAC,KAAK,EACT,SAAS,CACV,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { expect, test, vi } from 'vitest';\nimport { hydrateWorkflowReturnValue } from '@workflow/core/serialization';\nimport { createFetcher, startServer } from './util.mjs';\n\nexport function nullByte(world: string) {\n test('supports null bytes in step results', { timeout: 12_000 }, async () => {\n const server = await startServer({ world }).then(createFetcher);\n const result = await server.invoke(\n 'workflows/null-byte.ts',\n 'nullByteWorkflow',\n []\n );\n expect(result.runId).toMatch(/^wrun_.+/);\n const run = await vi.waitFor(\n async () => {\n const run = await server.getRun(result.runId);\n expect(run.status).toBe('completed');\n expect(run.output).toBeInstanceOf(Uint8Array);\n return run;\n },\n {\n interval: 200,\n timeout: 10_000,\n }\n );\n const output = await hydrateWorkflowReturnValue(\n run.output!,\n run.runId,\n undefined\n );\n expect(output).toEqual('null byte \\0');\n });\n}\n"]}
|
package/dist/src/server.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","sourceRoot":"","sources":["../../src/server.mts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { getHookByToken, getRun, resumeHook, start } from 'workflow/api';\nimport { getWorld } from 'workflow/runtime';\nimport * as z from 'zod';\nimport { POST as flowPOST } from '../.well-known/workflow/v1/flow.mjs';\nimport manifest from '../.well-known/workflow/v1/manifest.json' with {\n type: 'json',\n};\n\nif (!process.env.WORKFLOW_TARGET_WORLD) {\n console.error(\n 'Error: WORKFLOW_TARGET_WORLD environment variable is not set.'\n );\n process.exit(1);\n}\n\ntype Files = keyof typeof manifest.workflows;\ntype Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];\ntype NonEmptyArray<T> = [T, ...T[]];\n\nconst Invoke = z\n .object({\n file: z.enum(Object.keys(manifest.workflows) as NonEmptyArray<Files>),\n workflow: z.string(),\n args: z.unknown().array().default([]),\n })\n .transform((obj) => {\n const file = obj.file as keyof typeof manifest.workflows;\n const workflow = z\n .enum(\n Object.keys(manifest.workflows[file]) as NonEmptyArray<\n Workflows<typeof file>\n >\n )\n .parse(obj.workflow);\n return {\n args: obj.args,\n workflow: manifest.workflows[file][workflow],\n };\n });\n\n// Track flow handler invocations per run for testing inline execution\nconst flowInvocationCounts = new Map<string, number>();\n\nconst app = new Hono()\n .post('/.well-known/workflow/v1/flow', async (ctx) => {\n // Clone the request to read the body for tracking without consuming it\n const cloned = ctx.req.raw.clone();\n const response = await flowPOST(ctx.req.raw);\n // Extract runId from the request body (queue message payload)\n try {\n const body = (await cloned.json()) as Record<string, unknown>;\n const runId =\n typeof body?.runId === 'string'\n ? body.runId\n : typeof (body.payload as Record<string, unknown> | undefined)\n ?.runId === 'string'\n ? ((body.payload as Record<string, unknown>).runId as string)\n : undefined;\n if (runId) {\n flowInvocationCounts.set(\n runId,\n (flowInvocationCounts.get(runId) ?? 0) + 1\n );\n }\n } catch {\n // Health check or non-JSON messages — ignore\n }\n return response;\n })\n .get('/_flow-invocations/:runId', (ctx) => {\n const count = flowInvocationCounts.get(ctx.req.param('runId')) ?? 0;\n return ctx.json({ count });\n })\n .get('/_manifest', (ctx) => ctx.json(manifest))\n .post('/invoke', async (ctx) => {\n const json = await ctx.req.json().then(Invoke.parse);\n const handler = await start(json.workflow, json.args);\n\n return ctx.json({ runId: handler.runId });\n })\n .post('/hooks/:token', async (ctx) => {\n const hook = await getHookByToken(ctx.req.param('token'));\n const { runId } = await resumeHook(hook.token, {\n ...(await ctx.req.json()),\n metadata: hook.metadata,\n });\n return ctx.json({ runId, hookId: hook.hookId });\n })\n .get('/runs/:runId', async (ctx) => {\n const world = await getWorld();\n const run = await world.runs.get(ctx.req.param('runId'));\n // Custom JSON serialization to handle Uint8Array as base64\n const json = JSON.stringify(run, (_key, value) => {\n if (value instanceof Uint8Array) {\n return {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n }\n return value;\n });\n return new Response(json, {\n headers: { 'Content-Type': 'application/json' },\n });\n })\n .get('/runs/:runId/readable', async (ctx) => {\n const runId = ctx.req.param('runId');\n const run = getRun(runId);\n return new Response(run.getReadable());\n })\n .get('/runs/:runId/events', async (ctx) => {\n const runId = ctx.req.param('runId');\n const world = await getWorld();\n const allEvents: { eventType: string; correlationId?: string }[] = [];\n let cursor: string | undefined = undefined;\n while (true) {\n const page = await world.events.list({\n runId,\n pagination: { sortOrder: 'asc', cursor },\n });\n for (const e of page.data) {\n allEvents.push({\n eventType: e.eventType,\n correlationId: e.correlationId,\n });\n }\n if (!page.hasMore) break;\n cursor = page.cursor ?? undefined;\n if (!cursor) break;\n }\n return ctx.json({ events: allEvents });\n });\n\nserve(\n {\n fetch: app.fetch,\n port: Number(process.env.PORT) || 0,\n },\n async (info) => {\n console.log(`👂 listening on http://${info.address}:${info.port}`);\n console.log('');\n\n process.env.PORT = info.port.toString();\n\n for (const [filename, workflows] of Object.entries(manifest.workflows)) {\n for (const workflowName of Object.keys(\n workflows as Record<string, unknown>\n )) {\n console.log(\n `$ curl -X POST http://localhost:${info.port}/invoke -d '${JSON.stringify(\n {\n file: filename,\n workflow: workflowName,\n }\n )}'`\n );\n }\n }\n\n const world = await getWorld();\n if (world.start) {\n console.log(`starting background tasks...`);\n await world.start().then(\n () => console.log('background tasks started.'),\n (err) => console.error('❗ error starting background tasks:', err)\n );\n }\n\n if (process.env.CONTROL_FD === '3') {\n const control = fs.createWriteStream('', { fd: 3 });\n control.write(`${JSON.stringify({ state: 'listening', info })}\\n`);\n control.end();\n }\n }\n);\n"]}
|
package/dist/src/util.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.mjs","sourceRoot":"","sources":["../../src/util.mts"],"names":[],"mappings":"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","sourcesContent":["import cp from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { WorkflowRunSchema } from '@workflow/world';\nimport chalk, { type ChalkInstance } from 'chalk';\nimport jsonlines from 'jsonlines';\nimport { assert, onTestFailed, onTestFinished } from 'vitest';\nimport type { TypedHook } from 'workflow';\nimport * as z from 'zod';\nimport type manifest from '../.well-known/workflow/v1/manifest.json';\n\nexport const Control = z.object({\n state: z.literal('listening'),\n info: z.object({\n port: z.number(),\n }),\n});\ntype Control = z.infer<typeof Control>;\n\ntype Files = keyof typeof manifest.workflows;\ntype Workflows<F extends Files> = keyof (typeof manifest.workflows)[F];\n\nexport async function startServer(opts: {\n world: string;\n env?: Record<string, string | undefined>;\n}) {\n let serverPath = new URL('./server.mts', import.meta.url);\n\n if (!existsSync(serverPath)) {\n serverPath = new URL('./server.mjs', import.meta.url);\n }\n\n const proc = cp.spawn('node', [fileURLToPath(serverPath)], {\n stdio: ['ignore', 'pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n WORKFLOW_TARGET_WORLD: opts.world,\n CONTROL_FD: '3',\n ...(opts.env ?? {}),\n },\n });\n onTestFinished(() => {\n proc.kill();\n });\n\n const stdio = [] as { stream: ChalkInstance; chunk: string }[];\n // Accumulated raw server output — used by tests that want to inspect\n // debug logs (e.g., count runtime iterations, event loads, etc.).\n const outputBuffer: string[] = [];\n proc.stdout?.on('data', (chunk) => {\n const str = chunk.toString();\n stdio.push({ stream: chalk.white, chunk: str });\n outputBuffer.push(str);\n });\n proc.stderr?.on('data', (chunk) => {\n const str = chunk.toString();\n stdio.push({ stream: chalk.red, chunk: str });\n outputBuffer.push(str);\n });\n\n onTestFailed(() => {\n console.log('=== SERVER STDIO ===');\n let buffer = '';\n for (const { stream, chunk } of stdio) {\n buffer += stream.inverse(chunk);\n }\n console.log(buffer);\n });\n\n const fd3 = proc.stdio[3];\n assert(fd3, 'fd3 should be defined');\n\n for await (const chunk of fd3.pipe(jsonlines.parse())) {\n const control = Control.parse(chunk);\n return {\n ...control,\n getOutput: () => outputBuffer.join(''),\n };\n }\n\n throw new Error('Server did not start correctly');\n}\n\nconst Invoke = z.object({ runId: z.coerce.string() });\n\nexport function createFetcher(control: Control) {\n return {\n async invoke<F extends Files, W extends Workflows<F>>(\n file: F,\n workflow: W,\n args: unknown[]\n ) {\n const x = await fetch(`http://localhost:${control.info.port}/invoke`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ file, workflow, args }),\n });\n const data = await x.json().then(Invoke.parse);\n onTestFailed(() => {\n console.error('Workflow run:', data.runId);\n });\n return data;\n },\n async getFlowInvocationCount(runId: string): Promise<number> {\n const x = await fetch(\n `http://localhost:${control.info.port}/_flow-invocations/${encodeURIComponent(runId)}`\n );\n const data = (await x.json()) as { count: number };\n return data.count;\n },\n async getRun(id: string) {\n const x = await fetch(\n `http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}`\n );\n const text = await x.text();\n // Custom JSON reviver to decode base64 back to Uint8Array\n const data = JSON.parse(text, (_key, value) => {\n if (\n value !== null &&\n typeof value === 'object' &&\n (value as any).__type === 'Uint8Array' &&\n typeof (value as any).data === 'string'\n ) {\n return new Uint8Array(Buffer.from((value as any).data, 'base64'));\n }\n return value;\n });\n return WorkflowRunSchema.parseAsync(data);\n },\n async getReadable(id: string): Promise<ReadableStream<Uint8Array>> {\n const x = await fetch(\n `http://localhost:${control.info.port}/runs/${encodeURIComponent(id)}/readable`\n );\n if (!x.ok) {\n throw new Error(\n `Failed to get readable stream: ${x.status} ${x.statusText}`\n );\n }\n if (!x.body) {\n throw new Error('No body in response');\n }\n return x.body;\n },\n async resumeHook<T extends TypedHook<any, any>>(\n token: string,\n payload: Omit<NoInfer<TypedHook.Input<T>>, 'metadata'>\n ) {\n const res = await fetch(\n `http://localhost:${control.info.port}/hooks/${token}`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(payload),\n }\n );\n res.arrayBuffer().catch(() => {}); // Drain the body to avoid resource leaks\n if (!res.ok) {\n throw new Error(\n `Failed to resume hook: ${res.status} ${res.statusText}`\n );\n }\n },\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../workflows/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,0CAcC;AAzBD,yCAAyD;AACzD,uCAAyB;AAEZ,QAAA,IAAI,GAAG,IAAA,iBAAU,EAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;KACtB,CAAC;CACH,CAAC,CAAC;AAEI,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,UAAkB;IACrE,cAAc,CAAC;IAEf,MAAM,IAAI,GAAG,YAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,SAAS,GAA6C,EAAE,CAAC;IAC/D,MAAM,EAAE,GAAG,IAAA,kBAAW,GAAE,CAAC;IACzB,MAAM,UAAU,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,IAAI;YAAE,MAAM;IACxB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,QAAwB,EACxB,KAAa,EACb,OAAiB;IAEjB,UAAU,CAAC;IAEX,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,MAAM,CAAC,KAAK,CAChB,IAAI,WAAW,EAAE,CAAC,MAAM,CACtB,GAAG,IAAI,CAAC,SAAS,CAAC;QAChB,KAAK;QACL,OAAO;KACR,CAAC,MAAM,CACT,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { defineHook, getWritable } from '@workflow/core';\nimport * as z from 'zod';\n\nexport const Hook = defineHook({\n schema: z.object({\n data: z.string(),\n done: z.boolean().optional(),\n metadata: z.unknown(),\n }),\n});\n\nexport async function collectWithHook(token: string, customData: string) {\n 'use workflow';\n\n const hook = Hook.create({ token, metadata: { customData } });\n const collected: Parameters<(typeof Hook)['resume']>[1][] = [];\n const wf = getWritable();\n await writeEvent(wf, 'hookCreated');\n for await (const event of hook) {\n await writeEvent(wf, 'hookResumed', event);\n collected.push(event);\n if (event.done) break;\n }\n\n return { collected };\n}\n\nasync function writeEvent(\n writable: WritableStream,\n event: string,\n payload?: unknown\n) {\n 'use step';\n\n console.log('writing event', event, payload);\n const writer = writable.getWriter();\n await writer.write(\n new TextEncoder().encode(\n `${JSON.stringify({\n event,\n payload,\n })}\\r\\n`\n )\n );\n}\n"]}
|