@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.
Files changed (179) hide show
  1. package/dist/builtins.js +1 -1
  2. package/dist/class-serialization.d.ts +26 -0
  3. package/dist/class-serialization.d.ts.map +1 -0
  4. package/dist/class-serialization.js +66 -0
  5. package/dist/create-hook.js +1 -1
  6. package/dist/define-hook.d.ts +40 -25
  7. package/dist/define-hook.d.ts.map +1 -1
  8. package/dist/define-hook.js +22 -27
  9. package/dist/events-consumer.d.ts.map +1 -1
  10. package/dist/events-consumer.js +5 -1
  11. package/dist/flushable-stream.d.ts +82 -0
  12. package/dist/flushable-stream.d.ts.map +1 -0
  13. package/dist/flushable-stream.js +214 -0
  14. package/dist/global.d.ts +4 -1
  15. package/dist/global.d.ts.map +1 -1
  16. package/dist/global.js +21 -9
  17. package/dist/index.d.ts +3 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -3
  20. package/dist/logger.js +1 -1
  21. package/dist/observability.d.ts +60 -0
  22. package/dist/observability.d.ts.map +1 -1
  23. package/dist/observability.js +265 -32
  24. package/dist/private.d.ts +10 -1
  25. package/dist/private.d.ts.map +1 -1
  26. package/dist/private.js +6 -1
  27. package/dist/runtime/helpers.d.ts +52 -0
  28. package/dist/runtime/helpers.d.ts.map +1 -0
  29. package/dist/runtime/helpers.js +264 -0
  30. package/dist/runtime/resume-hook.d.ts +17 -12
  31. package/dist/runtime/resume-hook.d.ts.map +1 -1
  32. package/dist/runtime/resume-hook.js +79 -64
  33. package/dist/runtime/start.d.ts +14 -0
  34. package/dist/runtime/start.d.ts.map +1 -1
  35. package/dist/runtime/start.js +71 -45
  36. package/dist/runtime/step-handler.d.ts +7 -0
  37. package/dist/runtime/step-handler.d.ts.map +1 -0
  38. package/dist/runtime/step-handler.js +337 -0
  39. package/dist/runtime/suspension-handler.d.ts +25 -0
  40. package/dist/runtime/suspension-handler.d.ts.map +1 -0
  41. package/dist/runtime/suspension-handler.js +182 -0
  42. package/dist/runtime/world.d.ts.map +1 -1
  43. package/dist/runtime/world.js +20 -21
  44. package/dist/runtime.d.ts +3 -7
  45. package/dist/runtime.d.ts.map +1 -1
  46. package/dist/runtime.js +103 -410
  47. package/dist/schemas.d.ts +1 -15
  48. package/dist/schemas.d.ts.map +1 -1
  49. package/dist/schemas.js +2 -15
  50. package/dist/serialization.d.ts +112 -21
  51. package/dist/serialization.d.ts.map +1 -1
  52. package/dist/serialization.js +469 -85
  53. package/dist/sleep.d.ts +10 -0
  54. package/dist/sleep.d.ts.map +1 -1
  55. package/dist/sleep.js +1 -1
  56. package/dist/source-map.d.ts +10 -0
  57. package/dist/source-map.d.ts.map +1 -0
  58. package/dist/source-map.js +56 -0
  59. package/dist/step/context-storage.d.ts +2 -0
  60. package/dist/step/context-storage.d.ts.map +1 -1
  61. package/dist/step/context-storage.js +1 -1
  62. package/dist/step/get-closure-vars.d.ts +9 -0
  63. package/dist/step/get-closure-vars.d.ts.map +1 -0
  64. package/dist/step/get-closure-vars.js +16 -0
  65. package/dist/step/get-step-metadata.js +1 -1
  66. package/dist/step/get-workflow-metadata.js +1 -1
  67. package/dist/{writable-stream.d.ts → step/writable-stream.d.ts} +5 -5
  68. package/dist/step/writable-stream.d.ts.map +1 -0
  69. package/dist/step/writable-stream.js +30 -0
  70. package/dist/step.d.ts +1 -1
  71. package/dist/step.d.ts.map +1 -1
  72. package/dist/step.js +93 -47
  73. package/dist/symbols.d.ts +6 -0
  74. package/dist/symbols.d.ts.map +1 -1
  75. package/dist/symbols.js +7 -1
  76. package/dist/telemetry/semantic-conventions.d.ts +66 -38
  77. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  78. package/dist/telemetry/semantic-conventions.js +16 -3
  79. package/dist/telemetry.d.ts +8 -4
  80. package/dist/telemetry.d.ts.map +1 -1
  81. package/dist/telemetry.js +39 -6
  82. package/dist/types.js +1 -1
  83. package/dist/util.d.ts +5 -24
  84. package/dist/util.d.ts.map +1 -1
  85. package/dist/util.js +19 -38
  86. package/dist/version.d.ts +2 -0
  87. package/dist/version.d.ts.map +1 -0
  88. package/dist/version.js +3 -0
  89. package/dist/vm/index.js +2 -2
  90. package/dist/vm/uuid.js +1 -1
  91. package/dist/workflow/create-hook.js +1 -1
  92. package/dist/workflow/define-hook.d.ts +3 -3
  93. package/dist/workflow/define-hook.d.ts.map +1 -1
  94. package/dist/workflow/define-hook.js +1 -1
  95. package/dist/workflow/get-workflow-metadata.js +1 -1
  96. package/dist/workflow/hook.d.ts.map +1 -1
  97. package/dist/workflow/hook.js +49 -14
  98. package/dist/workflow/index.d.ts +1 -1
  99. package/dist/workflow/index.d.ts.map +1 -1
  100. package/dist/workflow/index.js +2 -2
  101. package/dist/workflow/sleep.d.ts +1 -1
  102. package/dist/workflow/sleep.d.ts.map +1 -1
  103. package/dist/workflow/sleep.js +26 -39
  104. package/dist/workflow/writable-stream.d.ts +1 -1
  105. package/dist/workflow/writable-stream.d.ts.map +1 -1
  106. package/dist/workflow/writable-stream.js +1 -1
  107. package/dist/workflow.d.ts +1 -1
  108. package/dist/workflow.d.ts.map +1 -1
  109. package/dist/workflow.js +72 -9
  110. package/docs/api-reference/create-hook.mdx +133 -0
  111. package/docs/api-reference/create-webhook.mdx +225 -0
  112. package/docs/api-reference/define-hook.mdx +206 -0
  113. package/docs/api-reference/fatal-error.mdx +37 -0
  114. package/docs/api-reference/fetch.mdx +139 -0
  115. package/docs/api-reference/get-step-metadata.mdx +76 -0
  116. package/docs/api-reference/get-workflow-metadata.mdx +44 -0
  117. package/docs/api-reference/get-writable.mdx +292 -0
  118. package/docs/api-reference/index.mdx +55 -0
  119. package/docs/api-reference/meta.json +3 -0
  120. package/docs/api-reference/retryable-error.mdx +106 -0
  121. package/docs/api-reference/sleep.mdx +59 -0
  122. package/docs/foundations/common-patterns.mdx +253 -0
  123. package/docs/foundations/errors-and-retries.mdx +190 -0
  124. package/docs/foundations/hooks.mdx +455 -0
  125. package/docs/foundations/idempotency.mdx +55 -0
  126. package/docs/foundations/index.mdx +32 -0
  127. package/docs/foundations/meta.json +14 -0
  128. package/docs/foundations/serialization.mdx +157 -0
  129. package/docs/foundations/starting-workflows.mdx +211 -0
  130. package/docs/foundations/streaming.mdx +569 -0
  131. package/docs/foundations/workflows-and-steps.mdx +197 -0
  132. package/docs/how-it-works/code-transform.mdx +334 -0
  133. package/docs/how-it-works/event-sourcing.mdx +254 -0
  134. package/docs/how-it-works/framework-integrations.mdx +437 -0
  135. package/docs/how-it-works/meta.json +10 -0
  136. package/docs/how-it-works/understanding-directives.mdx +611 -0
  137. package/package.json +31 -25
  138. package/dist/builtins.js.map +0 -1
  139. package/dist/create-hook.js.map +0 -1
  140. package/dist/define-hook.js.map +0 -1
  141. package/dist/events-consumer.js.map +0 -1
  142. package/dist/global.js.map +0 -1
  143. package/dist/index.js.map +0 -1
  144. package/dist/logger.js.map +0 -1
  145. package/dist/observability.js.map +0 -1
  146. package/dist/parse-name.d.ts +0 -25
  147. package/dist/parse-name.d.ts.map +0 -1
  148. package/dist/parse-name.js +0 -40
  149. package/dist/parse-name.js.map +0 -1
  150. package/dist/private.js.map +0 -1
  151. package/dist/runtime/resume-hook.js.map +0 -1
  152. package/dist/runtime/start.js.map +0 -1
  153. package/dist/runtime/world.js.map +0 -1
  154. package/dist/runtime.js.map +0 -1
  155. package/dist/schemas.js.map +0 -1
  156. package/dist/serialization.js.map +0 -1
  157. package/dist/sleep.js.map +0 -1
  158. package/dist/step/context-storage.js.map +0 -1
  159. package/dist/step/get-step-metadata.js.map +0 -1
  160. package/dist/step/get-workflow-metadata.js.map +0 -1
  161. package/dist/step.js.map +0 -1
  162. package/dist/symbols.js.map +0 -1
  163. package/dist/telemetry/semantic-conventions.js.map +0 -1
  164. package/dist/telemetry.js.map +0 -1
  165. package/dist/types.js.map +0 -1
  166. package/dist/util.js.map +0 -1
  167. package/dist/vm/index.js.map +0 -1
  168. package/dist/vm/uuid.js.map +0 -1
  169. package/dist/workflow/create-hook.js.map +0 -1
  170. package/dist/workflow/define-hook.js.map +0 -1
  171. package/dist/workflow/get-workflow-metadata.js.map +0 -1
  172. package/dist/workflow/hook.js.map +0 -1
  173. package/dist/workflow/index.js.map +0 -1
  174. package/dist/workflow/sleep.js.map +0 -1
  175. package/dist/workflow/writable-stream.js.map +0 -1
  176. package/dist/workflow.js.map +0 -1
  177. package/dist/writable-stream.d.ts.map +0 -1
  178. package/dist/writable-stream.js +0 -16
  179. 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
@@ -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=sleep.js.map
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;EAChC,CAAC"}
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=context-storage.js.map
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=get-step-metadata.js.map
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=get-workflow-metadata.js.map
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 passed as an argument to steps which can
15
- * write to it. Chunks written to this stream can be read outside the workflow
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
- * @note This function can only be called inside a workflow function.
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
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,wBAAgB,aAAa,CAAC,GAAG,EAAE,2BAA2B,IACpC,IAAI,SAAS,YAAY,EAAE,EAAE,MAAM,EACzD,UAAU,MAAM,MAER,GAAG,MAAM,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC,CAkH1C"}
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
- return (...args) => {
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
- ctx.invocationsQueue.push({
13
+ const queueItem = {
13
14
  type: 'step',
14
15
  correlationId,
15
16
  stepName,
16
17
  args,
17
- });
18
- // Track whether we've already seen a "step_started" event for this step.
19
- // This is important because after a retryable failure, the step moves back to
20
- // "pending" status which causes another "step_started" event to be emitted.
21
- let hasSeenStepStarted = false;
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 step
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 === 'step_started') {
51
- // Step has started - so remove from the invocations queue (only on the first "step_started" event)
52
- if (!hasSeenStepStarted) {
53
- const invocationsQueueIndex = ctx.invocationsQueue.findIndex((invocation) => invocation.type === 'step' &&
54
- invocation.correlationId === correlationId);
55
- if (invocationsQueueIndex !== -1) {
56
- ctx.invocationsQueue.splice(invocationsQueueIndex, 1);
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 FatalError(event.eventData.error));
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
- else {
79
- // This is a retryable error, so nothing to do here,
80
- // but we will consume the event
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
- else if (event.eventType === 'step_completed') {
85
- // Step has already completed, so resolve the Promise with the cached result
86
- const hydratedResult = hydrateStepReturnValue(event.eventData.result, ctx.globalThis);
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
- resolve(hydratedResult);
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
- else {
93
- // An unexpected event type has been received, but it does belong to this step (matching `correlationId`)
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
- reject(new WorkflowRuntimeError(`Unexpected event type: "${event.eventType}"`));
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=step.js.map
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBZ0M7SUFDNUQsT0FBTyxTQUFTLE9BQU8sQ0FDckIsUUFBZ0IsRUFDaEIsYUFBa0Q7UUFFbEQsdUZBQXVGO1FBQ3ZGLE1BQU0sWUFBWSxHQUFHLFVBRW5CLEdBQUcsSUFBVTtZQUViLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBVSxDQUFDO1lBRTdELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFFbkQsTUFBTSxTQUFTLEdBQTRCO2dCQUN6QyxJQUFJLEVBQUUsTUFBTTtnQkFDWixhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsSUFBSTthQUNMLENBQUM7WUFFRix1RUFBdUU7WUFDdkUsOERBQThEO1lBQzlELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDL0QsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFvQixDQUFDO1lBQzNDLENBQUM7WUFFRCxpRUFBaUU7WUFDakUsTUFBTSxXQUFXLEdBQUcsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixTQUFTLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUN0QyxDQUFDO1lBRUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFbkQsVUFBVSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRTtnQkFDdEMsYUFBYTtnQkFDYixRQUFRO2dCQUNSLElBQUk7YUFDTCxDQUFDLENBQUM7WUFDSCxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ1gscUdBQXFHO29CQUNyRyx5REFBeUQ7b0JBQ3pELDJFQUEyRTtvQkFDM0UsdUZBQXVGO29CQUN2RixVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLEdBQUcsQ0FBQyxlQUFlLENBQ2pCLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FDN0QsQ0FBQztvQkFDSixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ04sT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7Z0JBQ3pDLENBQUM7Z0JBRUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRTtvQkFDakQsYUFBYTtvQkFDYixRQUFRO29CQUNSLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDckIscUJBQXFCLEVBQUUsS0FBSyxDQUFDLGFBQWE7b0JBQzFDLE9BQU8sRUFBRSxhQUFhLEtBQUssS0FBSyxDQUFDLGFBQWE7b0JBQzlDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztpQkFDM0IsQ0FBQyxDQUFDO2dCQUVILElBQUksS0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztvQkFDMUMsdUZBQXVGO29CQUN2RixPQUFPLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztnQkFDekMsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ3ZDLDBFQUEwRTtvQkFDMUUsMkVBQTJFO29CQUMzRSwwQ0FBMEM7b0JBQzFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQzFELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDNUMsOERBQThEO3dCQUM5RCxnRUFBZ0U7d0JBQ2hFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsTUFBTSxDQUNKLElBQUksb0JBQW9CLENBQ3RCLDZCQUE2QixhQUFhLEtBQUssUUFBUSw2Q0FBNkMsQ0FDckcsQ0FDRixDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDTixPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztvQkFDdEMsQ0FBQztvQkFDRCxTQUFTLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDakMsc0VBQXNFO29CQUN0RSxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ3ZDLHNGQUFzRjtvQkFDdEYseUZBQXlGO29CQUN6RixnQ0FBZ0M7b0JBQ2hDLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO2dCQUN0QyxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsQ0FBQztvQkFDeEMsZ0ZBQWdGO29CQUNoRixPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQ3RDLDBEQUEwRDtvQkFDMUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ2pELHNDQUFzQztvQkFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQzt3QkFDeEMsTUFBTSxhQUFhLEdBQ2pCLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO3dCQUV0RCxNQUFNLFlBQVksR0FBRyxhQUFhOzRCQUNoQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQzs0QkFDeEMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxLQUFLLFFBQVE7Z0NBQzdCLENBQUMsQ0FBQyxTQUFTO2dDQUNYLENBQUMsQ0FBQyxlQUFlLENBQUM7d0JBRXRCLE1BQU0sVUFBVSxHQUNkLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQzdDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO3dCQUV4QixNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQzs0QkFDZixLQUFLLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQzt3QkFDM0IsQ0FBQzt3QkFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDTixPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztvQkFDekMsMERBQTBEO29CQUMxRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFFakQsb0VBQW9FO29CQUNwRSxNQUFNLGNBQWMsR0FBRyxzQkFBc0IsQ0FDM0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQ3RCLEdBQUcsQ0FBQyxVQUFVLENBQ2YsQ0FBQztvQkFDRixVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDMUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNOLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO2dCQUN0QyxDQUFDO2dCQUVELHNHQUFzRztnQkFDdEcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxHQUFHLENBQUMsZUFBZSxDQUNqQixJQUFJLG9CQUFvQixDQUN0QixrQ0FBa0MsYUFBYSxXQUFXLFFBQVEsTUFBTSxLQUFLLENBQUMsU0FBUyxHQUFHLENBQzNGLENBQ0YsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7UUFFRixxRUFBcUU7UUFDckUsK0VBQStFO1FBQy9FLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFO1lBQzFDLEtBQUssRUFBRSxZQUFZO1NBQ3BCLENBQUMsQ0FBQztRQUVILDBFQUEwRTtRQUMxRSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUU7WUFDNUMsS0FBSyxFQUFFLFFBQVE7WUFDZixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFO2dCQUNyRCxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxLQUFLO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDLENBQUM7QUFDSixDQUFDIn0=
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
@@ -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
- //# sourceMappingURL=symbols.js.map
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=