@workflow/world-testing 5.0.0-beta.6 → 5.0.0-beta.8

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.
@@ -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"]}