@workflow/core 4.0.1-beta.8 → 4.1.0-beta.51
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/builtins.js +1 -1
- package/dist/class-serialization.d.ts +26 -0
- package/dist/class-serialization.d.ts.map +1 -0
- package/dist/class-serialization.js +66 -0
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.d.ts +40 -25
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +22 -27
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +5 -1
- package/dist/flushable-stream.d.ts +82 -0
- package/dist/flushable-stream.d.ts.map +1 -0
- package/dist/flushable-stream.js +214 -0
- package/dist/global.d.ts +4 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -9
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logger.js +1 -1
- package/dist/observability.d.ts +60 -0
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +265 -32
- package/dist/private.d.ts +10 -1
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +6 -1
- package/dist/runtime/helpers.d.ts +52 -0
- package/dist/runtime/helpers.d.ts.map +1 -0
- package/dist/runtime/helpers.js +264 -0
- package/dist/runtime/resume-hook.d.ts +17 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +79 -64
- package/dist/runtime/start.d.ts +14 -0
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +71 -45
- package/dist/runtime/step-handler.d.ts +7 -0
- package/dist/runtime/step-handler.d.ts.map +1 -0
- package/dist/runtime/step-handler.js +337 -0
- package/dist/runtime/suspension-handler.d.ts +25 -0
- package/dist/runtime/suspension-handler.d.ts.map +1 -0
- package/dist/runtime/suspension-handler.js +182 -0
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +20 -21
- package/dist/runtime.d.ts +3 -7
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +103 -410
- package/dist/schemas.d.ts +1 -15
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +2 -15
- package/dist/serialization.d.ts +112 -21
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +469 -85
- package/dist/sleep.d.ts +10 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +1 -1
- package/dist/source-map.d.ts +10 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +56 -0
- package/dist/step/context-storage.d.ts +2 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts +9 -0
- package/dist/step/get-closure-vars.d.ts.map +1 -0
- package/dist/step/get-closure-vars.js +16 -0
- package/dist/step/get-step-metadata.js +1 -1
- package/dist/step/get-workflow-metadata.js +1 -1
- package/dist/{writable-stream.d.ts → step/writable-stream.d.ts} +5 -5
- package/dist/step/writable-stream.d.ts.map +1 -0
- package/dist/step/writable-stream.js +30 -0
- package/dist/step.d.ts +1 -1
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +93 -47
- package/dist/symbols.d.ts +6 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +7 -1
- package/dist/telemetry/semantic-conventions.d.ts +66 -38
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +16 -3
- package/dist/telemetry.d.ts +8 -4
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +39 -6
- package/dist/types.js +1 -1
- package/dist/util.d.ts +5 -24
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +19 -38
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/vm/index.js +2 -2
- package/dist/vm/uuid.js +1 -1
- package/dist/workflow/create-hook.js +1 -1
- package/dist/workflow/define-hook.d.ts +3 -3
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +1 -1
- package/dist/workflow/get-workflow-metadata.js +1 -1
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +49 -14
- package/dist/workflow/index.d.ts +1 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -2
- package/dist/workflow/sleep.d.ts +1 -1
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +26 -39
- package/dist/workflow/writable-stream.d.ts +1 -1
- package/dist/workflow/writable-stream.d.ts.map +1 -1
- package/dist/workflow/writable-stream.js +1 -1
- package/dist/workflow.d.ts +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +72 -9
- package/docs/api-reference/create-hook.mdx +133 -0
- package/docs/api-reference/create-webhook.mdx +225 -0
- package/docs/api-reference/define-hook.mdx +206 -0
- package/docs/api-reference/fatal-error.mdx +37 -0
- package/docs/api-reference/fetch.mdx +139 -0
- package/docs/api-reference/get-step-metadata.mdx +76 -0
- package/docs/api-reference/get-workflow-metadata.mdx +44 -0
- package/docs/api-reference/get-writable.mdx +292 -0
- package/docs/api-reference/index.mdx +55 -0
- package/docs/api-reference/meta.json +3 -0
- package/docs/api-reference/retryable-error.mdx +106 -0
- package/docs/api-reference/sleep.mdx +59 -0
- package/docs/foundations/common-patterns.mdx +253 -0
- package/docs/foundations/errors-and-retries.mdx +190 -0
- package/docs/foundations/hooks.mdx +455 -0
- package/docs/foundations/idempotency.mdx +55 -0
- package/docs/foundations/index.mdx +32 -0
- package/docs/foundations/meta.json +14 -0
- package/docs/foundations/serialization.mdx +157 -0
- package/docs/foundations/starting-workflows.mdx +211 -0
- package/docs/foundations/streaming.mdx +569 -0
- package/docs/foundations/workflows-and-steps.mdx +197 -0
- package/docs/how-it-works/code-transform.mdx +334 -0
- package/docs/how-it-works/event-sourcing.mdx +254 -0
- package/docs/how-it-works/framework-integrations.mdx +437 -0
- package/docs/how-it-works/meta.json +10 -0
- package/docs/how-it-works/understanding-directives.mdx +611 -0
- package/package.json +31 -25
- package/dist/builtins.js.map +0 -1
- package/dist/create-hook.js.map +0 -1
- package/dist/define-hook.js.map +0 -1
- package/dist/events-consumer.js.map +0 -1
- package/dist/global.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/observability.js.map +0 -1
- package/dist/parse-name.d.ts +0 -25
- package/dist/parse-name.d.ts.map +0 -1
- package/dist/parse-name.js +0 -40
- package/dist/parse-name.js.map +0 -1
- package/dist/private.js.map +0 -1
- package/dist/runtime/resume-hook.js.map +0 -1
- package/dist/runtime/start.js.map +0 -1
- package/dist/runtime/world.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/schemas.js.map +0 -1
- package/dist/serialization.js.map +0 -1
- package/dist/sleep.js.map +0 -1
- package/dist/step/context-storage.js.map +0 -1
- package/dist/step/get-step-metadata.js.map +0 -1
- package/dist/step/get-workflow-metadata.js.map +0 -1
- package/dist/step.js.map +0 -1
- package/dist/symbols.js.map +0 -1
- package/dist/telemetry/semantic-conventions.js.map +0 -1
- package/dist/telemetry.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/util.js.map +0 -1
- package/dist/vm/index.js.map +0 -1
- package/dist/vm/uuid.js.map +0 -1
- package/dist/workflow/create-hook.js.map +0 -1
- package/dist/workflow/define-hook.js.map +0 -1
- package/dist/workflow/get-workflow-metadata.js.map +0 -1
- package/dist/workflow/hook.js.map +0 -1
- package/dist/workflow/index.js.map +0 -1
- package/dist/workflow/sleep.js.map +0 -1
- package/dist/workflow/writable-stream.js.map +0 -1
- package/dist/workflow.js.map +0 -1
- package/dist/writable-stream.d.ts.map +0 -1
- package/dist/writable-stream.js +0 -16
- package/dist/writable-stream.js.map +0 -1
package/dist/sleep.d.ts
CHANGED
|
@@ -20,4 +20,14 @@ export declare function sleep(duration: StringValue): Promise<void>;
|
|
|
20
20
|
* @returns A promise that resolves when the sleep is complete.
|
|
21
21
|
*/
|
|
22
22
|
export declare function sleep(date: Date): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Sleep within a workflow for a given duration in milliseconds.
|
|
25
|
+
*
|
|
26
|
+
* This is a built-in runtime function that uses timer events in the event log.
|
|
27
|
+
*
|
|
28
|
+
* @param durationMs - The duration to sleep for in milliseconds.
|
|
29
|
+
* @overload
|
|
30
|
+
* @returns A promise that resolves when the sleep is complete.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sleep(durationMs: number): Promise<void>;
|
|
23
33
|
//# sourceMappingURL=sleep.d.ts.map
|
package/dist/sleep.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../src/sleep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElE;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../src/sleep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElE;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/sleep.js
CHANGED
|
@@ -7,4 +7,4 @@ export async function sleep(param) {
|
|
|
7
7
|
}
|
|
8
8
|
return sleepFn(param);
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQW9DOUMsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQUMsS0FBa0M7SUFDNUQsZ0dBQWdHO0lBQ2hHLE1BQU0sT0FBTyxHQUFJLFVBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remaps an error stack trace using inline source maps to show original source locations.
|
|
3
|
+
*
|
|
4
|
+
* @param stack - The error stack trace to remap
|
|
5
|
+
* @param filename - The workflow filename to match in stack frames
|
|
6
|
+
* @param workflowCode - The workflow bundle code containing inline source maps
|
|
7
|
+
* @returns The remapped stack trace with original source locations
|
|
8
|
+
*/
|
|
9
|
+
export declare function remapErrorStack(stack: string, filename: string, workflowCode: string): string;
|
|
10
|
+
//# sourceMappingURL=source-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-map.d.ts","sourceRoot":"","sources":["../src/source-map.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CA0DR"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { originalPositionFor, TraceMap } from '@jridgewell/trace-mapping';
|
|
2
|
+
/**
|
|
3
|
+
* Remaps an error stack trace using inline source maps to show original source locations.
|
|
4
|
+
*
|
|
5
|
+
* @param stack - The error stack trace to remap
|
|
6
|
+
* @param filename - The workflow filename to match in stack frames
|
|
7
|
+
* @param workflowCode - The workflow bundle code containing inline source maps
|
|
8
|
+
* @returns The remapped stack trace with original source locations
|
|
9
|
+
*/
|
|
10
|
+
export function remapErrorStack(stack, filename, workflowCode) {
|
|
11
|
+
// Extract inline source map from workflow code
|
|
12
|
+
const sourceMapMatch = workflowCode.match(/\/\/# sourceMappingURL=data:application\/json;base64,(.+)/);
|
|
13
|
+
if (!sourceMapMatch) {
|
|
14
|
+
return stack; // No source map found
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const base64 = sourceMapMatch[1];
|
|
18
|
+
const sourceMapJson = Buffer.from(base64, 'base64').toString('utf-8');
|
|
19
|
+
const sourceMapData = JSON.parse(sourceMapJson);
|
|
20
|
+
// Use TraceMap (pure JS, no WASM required)
|
|
21
|
+
const tracer = new TraceMap(sourceMapData);
|
|
22
|
+
// Parse and remap each line in the stack trace
|
|
23
|
+
const lines = stack.split('\n');
|
|
24
|
+
const remappedLines = lines.map((line) => {
|
|
25
|
+
// Match stack frames: "at functionName (filename:line:column)" or "at filename:line:column"
|
|
26
|
+
const frameMatch = line.match(/^\s*at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?$/);
|
|
27
|
+
if (!frameMatch) {
|
|
28
|
+
return line; // Not a stack frame, return as-is
|
|
29
|
+
}
|
|
30
|
+
const [, functionName, file, lineStr, colStr] = frameMatch;
|
|
31
|
+
// Only remap frames from our workflow file
|
|
32
|
+
if (!file.includes(filename)) {
|
|
33
|
+
return line;
|
|
34
|
+
}
|
|
35
|
+
const lineNumber = parseInt(lineStr, 10);
|
|
36
|
+
const columnNumber = parseInt(colStr, 10);
|
|
37
|
+
// Map to original source position
|
|
38
|
+
const original = originalPositionFor(tracer, {
|
|
39
|
+
line: lineNumber,
|
|
40
|
+
column: columnNumber,
|
|
41
|
+
});
|
|
42
|
+
if (original.source && original.line !== null) {
|
|
43
|
+
const func = functionName || original.name || 'anonymous';
|
|
44
|
+
const col = original.column !== null ? original.column : columnNumber;
|
|
45
|
+
return ` at ${func} (${original.source}:${original.line}:${col})`;
|
|
46
|
+
}
|
|
47
|
+
return line; // Couldn't map, return original
|
|
48
|
+
});
|
|
49
|
+
return remappedLines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
// If source map processing fails, return original stack
|
|
53
|
+
return stack;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zb3VyY2UtbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsS0FBYSxFQUNiLFFBQWdCLEVBQ2hCLFlBQW9CO0lBRXBCLCtDQUErQztJQUMvQyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUN2QywyREFBMkQsQ0FDNUQsQ0FBQztJQUNGLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQyxDQUFDLHNCQUFzQjtJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWhELDJDQUEyQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzQywrQ0FBK0M7UUFDL0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkMsNEZBQTRGO1lBQzVGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzNCLCtDQUErQyxDQUNoRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPLElBQUksQ0FBQyxDQUFDLGtDQUFrQztZQUNqRCxDQUFDO1lBRUQsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBRTNELDJDQUEyQztZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM3QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFMUMsa0NBQWtDO1lBQ2xDLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtnQkFDM0MsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE1BQU0sRUFBRSxZQUFZO2FBQ3JCLENBQUMsQ0FBQztZQUVILElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM5QyxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7Z0JBQzFELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBQ3RFLE9BQU8sVUFBVSxJQUFJLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLHdEQUF3RDtRQUN4RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -4,5 +4,7 @@ import type { StepMetadata } from './get-step-metadata.js';
|
|
|
4
4
|
export declare const contextStorage: AsyncLocalStorage<{
|
|
5
5
|
stepMetadata: StepMetadata;
|
|
6
6
|
workflowMetadata: WorkflowMetadata;
|
|
7
|
+
ops: Promise<void>[];
|
|
8
|
+
closureVars?: Record<string, any>;
|
|
7
9
|
}>;
|
|
8
10
|
//# sourceMappingURL=context-storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-storage.d.ts","sourceRoot":"","sources":["../../src/step/context-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,eAAO,MAAM,cAAc;kBACX,YAAY;sBACR,gBAAgB;
|
|
1
|
+
{"version":3,"file":"context-storage.d.ts","sourceRoot":"","sources":["../../src/step/context-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,eAAO,MAAM,cAAc;kBACX,YAAY;sBACR,gBAAgB;SAC7B,OAAO,CAAC,IAAI,CAAC,EAAE;kBACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;EAC/B,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
export const contextStorage = /* @__PURE__ */ new AsyncLocalStorage();
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvY29udGV4dC1zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXJELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsSUFBSSxpQkFBaUIsRUFLL0QsQ0FBQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the closure variables for the current step function.
|
|
3
|
+
* This is an internal function used by the SWC transform to access
|
|
4
|
+
* variables from the parent workflow scope.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare function __private_getClosureVars(): Record<string, any>;
|
|
9
|
+
//# sourceMappingURL=get-closure-vars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-closure-vars.d.ts","sourceRoot":"","sources":["../../src/step/get-closure-vars.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ9D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { contextStorage } from './context-storage.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the closure variables for the current step function.
|
|
4
|
+
* This is an internal function used by the SWC transform to access
|
|
5
|
+
* variables from the parent workflow scope.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export function __private_getClosureVars() {
|
|
10
|
+
const ctx = contextStorage.getStore();
|
|
11
|
+
if (!ctx) {
|
|
12
|
+
throw new Error('Closure variables can only be accessed inside a step function');
|
|
13
|
+
}
|
|
14
|
+
return ctx.closureVars || {};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWNsb3N1cmUtdmFycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGVwL2dldC1jbG9zdXJlLXZhcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXREOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUMvQixDQUFDIn0=
|
|
@@ -11,4 +11,4 @@ export function getStepMetadata() {
|
|
|
11
11
|
}
|
|
12
12
|
return ctx.stepMetadata;
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXN0ZXAtbWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RlcC9nZXQtc3RlcC1tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFvQ3REOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0QsQ0FDaEUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUM7QUFDMUIsQ0FBQyJ9
|
|
@@ -9,4 +9,4 @@ export function getWorkflowMetadata() {
|
|
|
9
9
|
}
|
|
10
10
|
return ctx.workflowMetadata;
|
|
11
11
|
}
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUl0RDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IsK0VBQStFLENBQ2hGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7QUFDOUIsQ0FBQyJ9
|
|
@@ -11,12 +11,12 @@ export interface WorkflowWritableStreamOptions {
|
|
|
11
11
|
/**
|
|
12
12
|
* Retrieves a writable stream that is associated with the current workflow.
|
|
13
13
|
*
|
|
14
|
-
* The writable stream is intended to be
|
|
15
|
-
*
|
|
16
|
-
* by using readable method of getRun.
|
|
14
|
+
* The writable stream is intended to be used within step functions to write
|
|
15
|
+
* data that can be read outside the workflow by using the readable method of getRun.
|
|
17
16
|
*
|
|
18
|
-
* @
|
|
19
|
-
* @returns The writable stream
|
|
17
|
+
* @param options - Optional configuration for the writable stream
|
|
18
|
+
* @returns The writable stream associated with the current workflow run
|
|
19
|
+
* @throws Error if called outside a workflow or step function
|
|
20
20
|
*/
|
|
21
21
|
export declare function getWritable<W = any>(options?: WorkflowWritableStreamOptions): WritableStream<W>;
|
|
22
22
|
//# sourceMappingURL=writable-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writable-stream.d.ts","sourceRoot":"","sources":["../../src/step/writable-stream.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,OAAO,GAAE,6BAAkC,GAC1C,cAAc,CAAC,CAAC,CAAC,CAyBnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getExternalReducers, getSerializeStream, WorkflowServerWritableStream, } from '../serialization.js';
|
|
2
|
+
import { getWorkflowRunStreamId } from '../util.js';
|
|
3
|
+
import { contextStorage } from './context-storage.js';
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves a writable stream that is associated with the current workflow.
|
|
6
|
+
*
|
|
7
|
+
* The writable stream is intended to be used within step functions to write
|
|
8
|
+
* data that can be read outside the workflow by using the readable method of getRun.
|
|
9
|
+
*
|
|
10
|
+
* @param options - Optional configuration for the writable stream
|
|
11
|
+
* @returns The writable stream associated with the current workflow run
|
|
12
|
+
* @throws Error if called outside a workflow or step function
|
|
13
|
+
*/
|
|
14
|
+
export function getWritable(options = {}) {
|
|
15
|
+
const ctx = contextStorage.getStore();
|
|
16
|
+
if (!ctx) {
|
|
17
|
+
throw new Error('`getWritable()` can only be called inside a workflow or step function');
|
|
18
|
+
}
|
|
19
|
+
const { namespace } = options;
|
|
20
|
+
const runId = ctx.workflowMetadata.workflowRunId;
|
|
21
|
+
const name = getWorkflowRunStreamId(runId, namespace);
|
|
22
|
+
// Create a transform stream that serializes chunks and pipes to the workflow server
|
|
23
|
+
const serialize = getSerializeStream(getExternalReducers(globalThis, ctx.ops, runId));
|
|
24
|
+
// Pipe the serialized data to the workflow server stream
|
|
25
|
+
// Register this async operation with the runtime's ops array so it's awaited via waitUntil
|
|
26
|
+
ctx.ops.push(serialize.readable.pipeTo(new WorkflowServerWritableStream(name, runId)));
|
|
27
|
+
// Return the writable side of the transform stream
|
|
28
|
+
return serialize.writable;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGFibGUtc3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZXAvd3JpdGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLDRCQUE0QixHQUM3QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFhdEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsVUFBeUMsRUFBRTtJQUUzQyxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUUsQ0FDeEUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRELG9GQUFvRjtJQUNwRixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FDbEMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQ2hELENBQUM7SUFFRix5REFBeUQ7SUFDekQsMkZBQTJGO0lBQzNGLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNWLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksNEJBQTRCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ3pFLENBQUM7SUFFRixtREFBbUQ7SUFDbkQsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQzVCLENBQUMifQ==
|
package/dist/step.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { WorkflowOrchestratorContext } from './private.js';
|
|
2
2
|
import type { Serializable } from './schemas.js';
|
|
3
|
-
export declare function createUseStep(ctx: WorkflowOrchestratorContext): <Args extends Serializable[], Result>(stepName: string) => (...args: Args) => Promise<Result>;
|
|
3
|
+
export declare function createUseStep(ctx: WorkflowOrchestratorContext): <Args extends Serializable[], Result>(stepName: string, closureVarsFn?: () => Record<string, Serializable>) => (this: unknown, ...args: Args) => Promise<Result>;
|
|
4
4
|
//# sourceMappingURL=step.d.ts.map
|
package/dist/step.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,wBAAgB,aAAa,CAAC,GAAG,EAAE,2BAA2B,IACpC,IAAI,SAAS,YAAY,EAAE,EAAE,MAAM,EACzD,UAAU,MAAM,EAChB,gBAAgB,MAAM,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,YAI1C,OAAO,WACJ,IAAI,KACZ,OAAO,CAAC,MAAM,CAAC,CAiLrB"}
|
package/dist/step.js
CHANGED
|
@@ -1,24 +1,32 @@
|
|
|
1
1
|
import { FatalError, WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
+
import { withResolvers } from '@workflow/utils';
|
|
2
3
|
import { EventConsumerResult } from './events-consumer.js';
|
|
3
4
|
import { WorkflowSuspension } from './global.js';
|
|
4
5
|
import { stepLogger } from './logger.js';
|
|
5
6
|
import { hydrateStepReturnValue } from './serialization.js';
|
|
6
|
-
import { withResolvers } from './util.js';
|
|
7
7
|
export function createUseStep(ctx) {
|
|
8
|
-
return function useStep(stepName) {
|
|
9
|
-
|
|
8
|
+
return function useStep(stepName, closureVarsFn) {
|
|
9
|
+
// Use a regular function (not arrow) so we can capture `this` when invoked as a method
|
|
10
|
+
const stepFunction = function (...args) {
|
|
10
11
|
const { promise, resolve, reject } = withResolvers();
|
|
11
12
|
const correlationId = `step_${ctx.generateUlid()}`;
|
|
12
|
-
|
|
13
|
+
const queueItem = {
|
|
13
14
|
type: 'step',
|
|
14
15
|
correlationId,
|
|
15
16
|
stepName,
|
|
16
17
|
args,
|
|
17
|
-
}
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
};
|
|
19
|
+
// Capture `this` value for method invocations (e.g., MyClass.method())
|
|
20
|
+
// Only include if `this` is defined and not the global object
|
|
21
|
+
if (this !== undefined && this !== null && this !== globalThis) {
|
|
22
|
+
queueItem.thisVal = this;
|
|
23
|
+
}
|
|
24
|
+
// Invoke the closure variables function to get the closure scope
|
|
25
|
+
const closureVars = closureVarsFn?.();
|
|
26
|
+
if (closureVars) {
|
|
27
|
+
queueItem.closureVars = closureVars;
|
|
28
|
+
}
|
|
29
|
+
ctx.invocationsQueue.set(correlationId, queueItem);
|
|
22
30
|
stepLogger.debug('Step consumer setup', {
|
|
23
31
|
correlationId,
|
|
24
32
|
stepName,
|
|
@@ -44,61 +52,99 @@ export function createUseStep(ctx) {
|
|
|
44
52
|
eventType: event.eventType,
|
|
45
53
|
});
|
|
46
54
|
if (event.correlationId !== correlationId) {
|
|
47
|
-
// We're not interested in this event - the correlationId belongs to a different
|
|
55
|
+
// We're not interested in this event - the correlationId belongs to a different entity
|
|
48
56
|
return EventConsumerResult.NotConsumed;
|
|
49
57
|
}
|
|
50
|
-
if (event.eventType === '
|
|
51
|
-
// Step has
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
else {
|
|
59
|
-
setTimeout(() => {
|
|
60
|
-
reject(new WorkflowRuntimeError(`Corrupted event log: step ${correlationId} (${stepName}) started but not found in invocation queue`));
|
|
61
|
-
}, 0);
|
|
62
|
-
return EventConsumerResult.Finished;
|
|
63
|
-
}
|
|
64
|
-
hasSeenStepStarted = true;
|
|
65
|
-
}
|
|
66
|
-
// If this is a subsequent "step_started" event (after a retry), we just consume it
|
|
67
|
-
// without trying to remove from the queue again or logging a warning
|
|
68
|
-
return EventConsumerResult.Consumed;
|
|
69
|
-
}
|
|
70
|
-
if (event.eventType === 'step_failed') {
|
|
71
|
-
// Step failed - bubble up to workflow
|
|
72
|
-
if (event.eventData.fatal) {
|
|
58
|
+
if (event.eventType === 'step_created') {
|
|
59
|
+
// Step has been created (registered for execution) - mark as having event
|
|
60
|
+
// but keep in queue so suspension handler knows to queue execution without
|
|
61
|
+
// creating a duplicate step_created event
|
|
62
|
+
const queueItem = ctx.invocationsQueue.get(correlationId);
|
|
63
|
+
if (!queueItem || queueItem.type !== 'step') {
|
|
64
|
+
// This indicates event log corruption - step_created received
|
|
65
|
+
// but the step was never invoked in the workflow during replay.
|
|
73
66
|
setTimeout(() => {
|
|
74
|
-
reject(new
|
|
67
|
+
reject(new WorkflowRuntimeError(`Corrupted event log: step ${correlationId} (${stepName}) created but not found in invocation queue`));
|
|
75
68
|
}, 0);
|
|
76
69
|
return EventConsumerResult.Finished;
|
|
77
70
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return EventConsumerResult.Consumed;
|
|
82
|
-
}
|
|
71
|
+
queueItem.hasCreatedEvent = true;
|
|
72
|
+
// Continue waiting for step_started/step_completed/step_failed events
|
|
73
|
+
return EventConsumerResult.Consumed;
|
|
83
74
|
}
|
|
84
|
-
|
|
85
|
-
// Step
|
|
86
|
-
|
|
75
|
+
if (event.eventType === 'step_started') {
|
|
76
|
+
// Step was started - don't do anything. The step is left in the invocationQueue which
|
|
77
|
+
// will allow it to be re-enqueued. We rely on the queue's idempotency to prevent it from
|
|
78
|
+
// actually being over enqueued.
|
|
79
|
+
return EventConsumerResult.Consumed;
|
|
80
|
+
}
|
|
81
|
+
if (event.eventType === 'step_retrying') {
|
|
82
|
+
// Step is being retried - just consume the event and wait for next step_started
|
|
83
|
+
return EventConsumerResult.Consumed;
|
|
84
|
+
}
|
|
85
|
+
if (event.eventType === 'step_failed') {
|
|
86
|
+
// Terminal state - we can remove the invocationQueue item
|
|
87
|
+
ctx.invocationsQueue.delete(event.correlationId);
|
|
88
|
+
// Step failed - bubble up to workflow
|
|
87
89
|
setTimeout(() => {
|
|
88
|
-
|
|
90
|
+
const errorData = event.eventData.error;
|
|
91
|
+
const isErrorObject = typeof errorData === 'object' && errorData !== null;
|
|
92
|
+
const errorMessage = isErrorObject
|
|
93
|
+
? (errorData.message ?? 'Unknown error')
|
|
94
|
+
: typeof errorData === 'string'
|
|
95
|
+
? errorData
|
|
96
|
+
: 'Unknown error';
|
|
97
|
+
const errorStack = (isErrorObject ? errorData.stack : undefined) ??
|
|
98
|
+
event.eventData.stack;
|
|
99
|
+
const error = new FatalError(errorMessage);
|
|
100
|
+
if (errorStack) {
|
|
101
|
+
error.stack = errorStack;
|
|
102
|
+
}
|
|
103
|
+
reject(error);
|
|
89
104
|
}, 0);
|
|
90
105
|
return EventConsumerResult.Finished;
|
|
91
106
|
}
|
|
92
|
-
|
|
93
|
-
//
|
|
107
|
+
if (event.eventType === 'step_completed') {
|
|
108
|
+
// Terminal state - we can remove the invocationQueue item
|
|
109
|
+
ctx.invocationsQueue.delete(event.correlationId);
|
|
110
|
+
// Step has completed, so resolve the Promise with the cached result
|
|
111
|
+
const hydratedResult = hydrateStepReturnValue(event.eventData.result, ctx.globalThis);
|
|
94
112
|
setTimeout(() => {
|
|
95
|
-
|
|
113
|
+
resolve(hydratedResult);
|
|
96
114
|
}, 0);
|
|
97
115
|
return EventConsumerResult.Finished;
|
|
98
116
|
}
|
|
117
|
+
// An unexpected event type has been received, this event log looks corrupted. Let's fail immediately.
|
|
118
|
+
setTimeout(() => {
|
|
119
|
+
ctx.onWorkflowError(new WorkflowRuntimeError(`Unexpected event type for step ${correlationId} (name: ${stepName}) "${event.eventType}"`));
|
|
120
|
+
}, 0);
|
|
121
|
+
return EventConsumerResult.Finished;
|
|
99
122
|
});
|
|
100
123
|
return promise;
|
|
101
124
|
};
|
|
125
|
+
// Ensure the "name" property matches the original step function name
|
|
126
|
+
// Extract function name from stepName (format: "step//filepath//functionName")
|
|
127
|
+
const functionName = stepName.split('//').pop();
|
|
128
|
+
Object.defineProperty(stepFunction, 'name', {
|
|
129
|
+
value: functionName,
|
|
130
|
+
});
|
|
131
|
+
// Add the step function identifier to the step function for serialization
|
|
132
|
+
Object.defineProperty(stepFunction, 'stepId', {
|
|
133
|
+
value: stepName,
|
|
134
|
+
writable: false,
|
|
135
|
+
enumerable: false,
|
|
136
|
+
configurable: false,
|
|
137
|
+
});
|
|
138
|
+
// Store the closure variables function for serialization
|
|
139
|
+
if (closureVarsFn) {
|
|
140
|
+
Object.defineProperty(stepFunction, '__closureVarsFn', {
|
|
141
|
+
value: closureVarsFn,
|
|
142
|
+
writable: false,
|
|
143
|
+
enumerable: false,
|
|
144
|
+
configurable: false,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return stepFunction;
|
|
102
148
|
};
|
|
103
149
|
}
|
|
104
|
-
//# sourceMappingURL=
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBZ0M7SUFDNUQsT0FBTyxTQUFTLE9BQU8sQ0FDckIsUUFBZ0IsRUFDaEIsYUFBa0Q7UUFFbEQsdUZBQXVGO1FBQ3ZGLE1BQU0sWUFBWSxHQUFHLFVBRW5CLEdBQUcsSUFBVTtZQUViLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBVSxDQUFDO1lBRTdELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFFbkQsTUFBTSxTQUFTLEdBQTRCO2dCQUN6QyxJQUFJLEVBQUUsTUFBTTtnQkFDWixhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsSUFBSTthQUNMLENBQUM7WUFFRix1RUFBdUU7WUFDdkUsOERBQThEO1lBQzlELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDL0QsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFvQixDQUFDO1lBQzNDLENBQUM7WUFFRCxpRUFBaUU7WUFDakUsTUFBTSxXQUFXLEdBQUcsYUFBYSxFQUFFLEVB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
|
package/dist/symbols.d.ts
CHANGED
|
@@ -3,8 +3,14 @@ export declare const WORKFLOW_CREATE_HOOK: unique symbol;
|
|
|
3
3
|
export declare const WORKFLOW_SLEEP: unique symbol;
|
|
4
4
|
export declare const WORKFLOW_CONTEXT: unique symbol;
|
|
5
5
|
export declare const WORKFLOW_GET_STREAM_ID: unique symbol;
|
|
6
|
+
export declare const STABLE_ULID: unique symbol;
|
|
6
7
|
export declare const STREAM_NAME_SYMBOL: unique symbol;
|
|
7
8
|
export declare const STREAM_TYPE_SYMBOL: unique symbol;
|
|
8
9
|
export declare const BODY_INIT_SYMBOL: unique symbol;
|
|
9
10
|
export declare const WEBHOOK_RESPONSE_WRITABLE: unique symbol;
|
|
11
|
+
/**
|
|
12
|
+
* Symbol used to store the class registry on globalThis in workflow mode.
|
|
13
|
+
* This allows the deserializer to find classes by classId in the VM context.
|
|
14
|
+
*/
|
|
15
|
+
export declare const WORKFLOW_CLASS_REGISTRY: unique symbol;
|
|
10
16
|
//# sourceMappingURL=symbols.d.ts.map
|
package/dist/symbols.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAkC,CAAC;AACjE,eAAO,MAAM,oBAAoB,eAAqC,CAAC;AACvE,eAAO,MAAM,cAAc,eAA+B,CAAC;AAC3D,eAAO,MAAM,gBAAgB,eAAiC,CAAC;AAC/D,eAAO,MAAM,sBAAsB,eAAuC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,eAAqC,CAAC;AACrE,eAAO,MAAM,kBAAkB,eAAqC,CAAC;AACrE,eAAO,MAAM,gBAAgB,eAA0B,CAAC;AACxD,eAAO,MAAM,yBAAyB,eAErC,CAAC"}
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAkC,CAAC;AACjE,eAAO,MAAM,oBAAoB,eAAqC,CAAC;AACvE,eAAO,MAAM,cAAc,eAA+B,CAAC;AAC3D,eAAO,MAAM,gBAAgB,eAAiC,CAAC;AAC/D,eAAO,MAAM,sBAAsB,eAAuC,CAAC;AAC3E,eAAO,MAAM,WAAW,eAAqC,CAAC;AAC9D,eAAO,MAAM,kBAAkB,eAAqC,CAAC;AACrE,eAAO,MAAM,kBAAkB,eAAqC,CAAC;AACrE,eAAO,MAAM,gBAAgB,eAA0B,CAAC;AACxD,eAAO,MAAM,yBAAyB,eAErC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAwC,CAAC"}
|
package/dist/symbols.js
CHANGED
|
@@ -3,8 +3,14 @@ export const WORKFLOW_CREATE_HOOK = Symbol.for('WORKFLOW_CREATE_HOOK');
|
|
|
3
3
|
export const WORKFLOW_SLEEP = Symbol.for('WORKFLOW_SLEEP');
|
|
4
4
|
export const WORKFLOW_CONTEXT = Symbol.for('WORKFLOW_CONTEXT');
|
|
5
5
|
export const WORKFLOW_GET_STREAM_ID = Symbol.for('WORKFLOW_GET_STREAM_ID');
|
|
6
|
+
export const STABLE_ULID = Symbol.for('WORKFLOW_STABLE_ULID');
|
|
6
7
|
export const STREAM_NAME_SYMBOL = Symbol.for('WORKFLOW_STREAM_NAME');
|
|
7
8
|
export const STREAM_TYPE_SYMBOL = Symbol.for('WORKFLOW_STREAM_TYPE');
|
|
8
9
|
export const BODY_INIT_SYMBOL = Symbol.for('BODY_INIT');
|
|
9
10
|
export const WEBHOOK_RESPONSE_WRITABLE = Symbol.for('WEBHOOK_RESPONSE_WRITABLE');
|
|
10
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Symbol used to store the class registry on globalThis in workflow mode.
|
|
13
|
+
* This allows the deserializer to find classes by classId in the VM context.
|
|
14
|
+
*/
|
|
15
|
+
export const WORKFLOW_CLASS_REGISTRY = Symbol.for('workflow-class-registry');
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeW1ib2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDdkUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ2pELDJCQUEyQixDQUM1QixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDIn0=
|