@workflow/core 4.0.1-beta.0

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 (143) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +3 -0
  3. package/dist/builtins.d.ts +4 -0
  4. package/dist/builtins.d.ts.map +1 -0
  5. package/dist/builtins.js +13 -0
  6. package/dist/builtins.js.map +1 -0
  7. package/dist/create-hook.d.ts +123 -0
  8. package/dist/create-hook.d.ts.map +1 -0
  9. package/dist/create-hook.js +32 -0
  10. package/dist/create-hook.js.map +1 -0
  11. package/dist/define-hook.d.ts +53 -0
  12. package/dist/define-hook.d.ts.map +1 -0
  13. package/dist/define-hook.js +59 -0
  14. package/dist/define-hook.js.map +1 -0
  15. package/dist/events-consumer.d.ts +35 -0
  16. package/dist/events-consumer.d.ts.map +1 -0
  17. package/dist/events-consumer.js +72 -0
  18. package/dist/events-consumer.js.map +1 -0
  19. package/dist/global.d.ts +29 -0
  20. package/dist/global.d.ts.map +1 -0
  21. package/dist/global.js +50 -0
  22. package/dist/global.js.map +1 -0
  23. package/dist/index.d.ts +18 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +18 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/logger.d.ts +31 -0
  28. package/dist/logger.d.ts.map +1 -0
  29. package/dist/logger.js +32 -0
  30. package/dist/logger.js.map +1 -0
  31. package/dist/observability.d.ts +24 -0
  32. package/dist/observability.d.ts.map +1 -0
  33. package/dist/observability.js +126 -0
  34. package/dist/observability.js.map +1 -0
  35. package/dist/parse-name.d.ts +25 -0
  36. package/dist/parse-name.d.ts.map +1 -0
  37. package/dist/parse-name.js +40 -0
  38. package/dist/parse-name.js.map +1 -0
  39. package/dist/private.d.ts +26 -0
  40. package/dist/private.d.ts.map +1 -0
  41. package/dist/private.js +17 -0
  42. package/dist/private.js.map +1 -0
  43. package/dist/runtime/resume-hook.d.ts +71 -0
  44. package/dist/runtime/resume-hook.d.ts.map +1 -0
  45. package/dist/runtime/resume-hook.js +180 -0
  46. package/dist/runtime/resume-hook.js.map +1 -0
  47. package/dist/runtime/start.d.ts +28 -0
  48. package/dist/runtime/start.d.ts.map +1 -0
  49. package/dist/runtime/start.js +57 -0
  50. package/dist/runtime/start.js.map +1 -0
  51. package/dist/runtime/world.d.ts +24 -0
  52. package/dist/runtime/world.d.ts.map +1 -0
  53. package/dist/runtime/world.js +84 -0
  54. package/dist/runtime/world.js.map +1 -0
  55. package/dist/runtime.d.ts +121 -0
  56. package/dist/runtime.d.ts.map +1 -0
  57. package/dist/runtime.js +554 -0
  58. package/dist/runtime.js.map +1 -0
  59. package/dist/schemas.d.ts +29 -0
  60. package/dist/schemas.d.ts.map +1 -0
  61. package/dist/schemas.js +15 -0
  62. package/dist/schemas.js.map +1 -0
  63. package/dist/serialization.d.ts +188 -0
  64. package/dist/serialization.d.ts.map +1 -0
  65. package/dist/serialization.js +725 -0
  66. package/dist/serialization.js.map +1 -0
  67. package/dist/step/context-storage.d.ts +8 -0
  68. package/dist/step/context-storage.d.ts.map +1 -0
  69. package/dist/step/context-storage.js +3 -0
  70. package/dist/step/context-storage.js.map +1 -0
  71. package/dist/step/get-step-metadata.d.ts +38 -0
  72. package/dist/step/get-step-metadata.d.ts.map +1 -0
  73. package/dist/step/get-step-metadata.js +14 -0
  74. package/dist/step/get-step-metadata.js.map +1 -0
  75. package/dist/step/get-workflow-metadata.d.ts +7 -0
  76. package/dist/step/get-workflow-metadata.d.ts.map +1 -0
  77. package/dist/step/get-workflow-metadata.js +12 -0
  78. package/dist/step/get-workflow-metadata.js.map +1 -0
  79. package/dist/step.d.ts +4 -0
  80. package/dist/step.d.ts.map +1 -0
  81. package/dist/step.js +92 -0
  82. package/dist/step.js.map +1 -0
  83. package/dist/symbols.d.ts +9 -0
  84. package/dist/symbols.d.ts.map +1 -0
  85. package/dist/symbols.js +9 -0
  86. package/dist/symbols.js.map +1 -0
  87. package/dist/telemetry/semantic-conventions.d.ts +175 -0
  88. package/dist/telemetry/semantic-conventions.d.ts.map +1 -0
  89. package/dist/telemetry/semantic-conventions.js +121 -0
  90. package/dist/telemetry/semantic-conventions.js.map +1 -0
  91. package/dist/telemetry.d.ts +24 -0
  92. package/dist/telemetry.d.ts.map +1 -0
  93. package/dist/telemetry.js +121 -0
  94. package/dist/telemetry.js.map +1 -0
  95. package/dist/types.d.ts +10 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +39 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/util.d.ts +43 -0
  100. package/dist/util.d.ts.map +1 -0
  101. package/dist/util.js +76 -0
  102. package/dist/util.js.map +1 -0
  103. package/dist/vm/index.d.ts +17 -0
  104. package/dist/vm/index.d.ts.map +1 -0
  105. package/dist/vm/index.js +93 -0
  106. package/dist/vm/index.js.map +1 -0
  107. package/dist/vm/uuid.d.ts +10 -0
  108. package/dist/vm/uuid.d.ts.map +1 -0
  109. package/dist/vm/uuid.js +30 -0
  110. package/dist/vm/uuid.js.map +1 -0
  111. package/dist/workflow/create-hook.d.ts +7 -0
  112. package/dist/workflow/create-hook.d.ts.map +1 -0
  113. package/dist/workflow/create-hook.js +22 -0
  114. package/dist/workflow/create-hook.js.map +1 -0
  115. package/dist/workflow/define-hook.d.ts +10 -0
  116. package/dist/workflow/define-hook.d.ts.map +1 -0
  117. package/dist/workflow/define-hook.js +15 -0
  118. package/dist/workflow/define-hook.js.map +1 -0
  119. package/dist/workflow/get-workflow-metadata.d.ts +17 -0
  120. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -0
  121. package/dist/workflow/get-workflow-metadata.js +11 -0
  122. package/dist/workflow/get-workflow-metadata.js.map +1 -0
  123. package/dist/workflow/hook.d.ts +4 -0
  124. package/dist/workflow/hook.d.ts.map +1 -0
  125. package/dist/workflow/hook.js +101 -0
  126. package/dist/workflow/hook.js.map +1 -0
  127. package/dist/workflow/index.d.ts +10 -0
  128. package/dist/workflow/index.d.ts.map +1 -0
  129. package/dist/workflow/index.js +14 -0
  130. package/dist/workflow/index.js.map +1 -0
  131. package/dist/workflow/writable-stream.d.ts +3 -0
  132. package/dist/workflow/writable-stream.d.ts.map +1 -0
  133. package/dist/workflow/writable-stream.js +12 -0
  134. package/dist/workflow/writable-stream.js.map +1 -0
  135. package/dist/workflow.d.ts +3 -0
  136. package/dist/workflow.d.ts.map +1 -0
  137. package/dist/workflow.js +454 -0
  138. package/dist/workflow.js.map +1 -0
  139. package/dist/writable-stream.d.ts +22 -0
  140. package/dist/writable-stream.d.ts.map +1 -0
  141. package/dist/writable-stream.js +16 -0
  142. package/dist/writable-stream.js.map +1 -0
  143. package/package.json +73 -0
@@ -0,0 +1,24 @@
1
+ import type { Span, SpanOptions } from '@opentelemetry/api';
2
+ /**
3
+ * Serializes the current trace context into a format that can be passed through queues
4
+ * @returns A record of strings representing the trace context
5
+ */
6
+ export declare function serializeTraceCarrier(): Promise<Record<string, string>>;
7
+ /**
8
+ * Deserializes trace context and returns a context that can be used to continue the trace
9
+ * @param traceCarrier The serialized trace context
10
+ * @returns OpenTelemetry context with the restored trace
11
+ */
12
+ export declare function deserializeTraceCarrier(traceCarrier: Record<string, string>): Promise<import("@opentelemetry/api").Context | undefined>;
13
+ /**
14
+ * Runs a function within the context of a deserialized trace
15
+ * @param traceCarrier The serialized trace carrier (optional)
16
+ * @param fn The function to run within the trace context
17
+ * @returns The result of the function
18
+ */
19
+ export declare function withTraceContext<T>(traceCarrier: Record<string, string> | undefined, fn: () => Promise<T>): Promise<T>;
20
+ export declare function trace<T>(spanName: string, ...args: [fn: (span?: Span) => Promise<T>] | [opts: SpanOptions, fn: (span?: Span) => Promise<T>]): Promise<T>;
21
+ export declare function getSpanContextForTraceCarrier(carrier: Record<string, string>): Promise<import("@opentelemetry/api").SpanContext | undefined>;
22
+ export declare function getActiveSpan(): Promise<Span | null | undefined>;
23
+ export declare function instrumentObject<T extends object>(prefix: string, o: T): T;
24
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAO5D;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO7E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,6DAMrC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAiBD,wBAAsB,KAAK,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,IAAI,EACH,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACjC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,iEAQhC;AAED,wBAAsB,aAAa,qCAIlC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAa1E"}
@@ -0,0 +1,121 @@
1
+ import { once } from './util.js';
2
+ // ============================================================
3
+ // Trace Context Propagation Utilities
4
+ // ============================================================
5
+ /**
6
+ * Serializes the current trace context into a format that can be passed through queues
7
+ * @returns A record of strings representing the trace context
8
+ */
9
+ export async function serializeTraceCarrier() {
10
+ const otel = await OtelApi.value;
11
+ if (!otel)
12
+ return {};
13
+ const carrier = {};
14
+ // Inject the current context into the carrier
15
+ otel.propagation.inject(otel.context.active(), carrier);
16
+ return carrier;
17
+ }
18
+ /**
19
+ * Deserializes trace context and returns a context that can be used to continue the trace
20
+ * @param traceCarrier The serialized trace context
21
+ * @returns OpenTelemetry context with the restored trace
22
+ */
23
+ export async function deserializeTraceCarrier(traceCarrier) {
24
+ const otel = await OtelApi.value;
25
+ if (!otel)
26
+ return;
27
+ // Extract the context from the carrier
28
+ return otel.propagation.extract(otel.context.active(), traceCarrier);
29
+ }
30
+ /**
31
+ * Runs a function within the context of a deserialized trace
32
+ * @param traceCarrier The serialized trace carrier (optional)
33
+ * @param fn The function to run within the trace context
34
+ * @returns The result of the function
35
+ */
36
+ export async function withTraceContext(traceCarrier, fn) {
37
+ if (!traceCarrier) {
38
+ return fn();
39
+ }
40
+ const otel = await OtelApi.value;
41
+ if (!otel)
42
+ return fn();
43
+ const extractedContext = await deserializeTraceCarrier(traceCarrier);
44
+ if (!extractedContext) {
45
+ return fn();
46
+ }
47
+ return otel.context.with(extractedContext, async () => await fn());
48
+ }
49
+ const OtelApi = once(async () => {
50
+ try {
51
+ return await import('@opentelemetry/api');
52
+ }
53
+ catch {
54
+ console.warn('OpenTelemetry not available, tracing will be disabled');
55
+ return null;
56
+ }
57
+ });
58
+ const Tracer = once(async () => {
59
+ const api = await OtelApi.value;
60
+ if (!api)
61
+ return null;
62
+ return api.trace.getTracer('workflow');
63
+ });
64
+ export async function trace(spanName, ...args) {
65
+ const [tracer, otel] = await Promise.all([Tracer.value, OtelApi.value]);
66
+ const { fn, opts } = typeof args[0] === 'function'
67
+ ? { fn: args[0], opts: {} }
68
+ : { fn: args[1], opts: args[0] };
69
+ if (!fn)
70
+ throw new Error('Function to trace must be provided');
71
+ if (!tracer || !otel) {
72
+ return await fn();
73
+ }
74
+ return tracer.startActiveSpan(spanName, opts, async (span) => {
75
+ try {
76
+ const result = await fn(span);
77
+ span.setStatus({ code: otel.SpanStatusCode.OK });
78
+ return result;
79
+ }
80
+ catch (e) {
81
+ span.setStatus({
82
+ code: otel.SpanStatusCode.ERROR,
83
+ message: e.message,
84
+ });
85
+ throw e;
86
+ }
87
+ finally {
88
+ span.end();
89
+ }
90
+ });
91
+ }
92
+ export async function getSpanContextForTraceCarrier(carrier) {
93
+ const [deserialized, otel] = await Promise.all([
94
+ deserializeTraceCarrier(carrier),
95
+ OtelApi.value,
96
+ ]);
97
+ if (!deserialized || !otel)
98
+ return;
99
+ return otel.trace.getSpanContext(deserialized);
100
+ }
101
+ export async function getActiveSpan() {
102
+ const otel = await OtelApi.value;
103
+ if (!otel)
104
+ return null;
105
+ return otel.trace.getActiveSpan();
106
+ }
107
+ export function instrumentObject(prefix, o) {
108
+ const handlers = {};
109
+ for (const key of Object.keys(o)) {
110
+ if (typeof o[key] !== 'function') {
111
+ handlers[key] = o[key];
112
+ }
113
+ else {
114
+ const f = o[key];
115
+ // @ts-expect-error
116
+ handlers[key] = async (...args) => trace(`${prefix}.${String(key)}`, {}, () => f(...args));
117
+ }
118
+ }
119
+ return handlers;
120
+ }
121
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare function getConstructorName(obj: unknown): string | null;
2
+ export declare function getConstructorNames(obj: unknown): string[];
3
+ /**
4
+ * `instanceof` operator that works across different `vm` contexts,
5
+ * based on the `name` property of the constructors of the prototype chain.
6
+ */
7
+ export declare function isInstanceOf<T>(v: unknown, ctor: new (...args: any[]) => T): v is T;
8
+ export declare function getErrorName(v: unknown): string;
9
+ export declare function getErrorStack(v: unknown): string;
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAS9D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAO1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,CAAC,EAAE,OAAO,EACV,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAC9B,CAAC,IAAI,CAAC,CAER;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAK/C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKhD"}
package/dist/types.js ADDED
@@ -0,0 +1,39 @@
1
+ import { types } from 'node:util';
2
+ export function getConstructorName(obj) {
3
+ if (obj === null || obj === undefined) {
4
+ return null;
5
+ }
6
+ const ctor = obj.constructor;
7
+ if (!ctor || ctor.name === 'Object') {
8
+ return null;
9
+ }
10
+ return ctor.name;
11
+ }
12
+ export function getConstructorNames(obj) {
13
+ const proto = Object.getPrototypeOf(obj);
14
+ const name = getConstructorName(proto);
15
+ if (name === null) {
16
+ return [];
17
+ }
18
+ return [name, ...getConstructorNames(proto)];
19
+ }
20
+ /**
21
+ * `instanceof` operator that works across different `vm` contexts,
22
+ * based on the `name` property of the constructors of the prototype chain.
23
+ */
24
+ export function isInstanceOf(v, ctor) {
25
+ return getConstructorNames(v).includes(ctor.name);
26
+ }
27
+ export function getErrorName(v) {
28
+ if (types.isNativeError(v)) {
29
+ return v.name;
30
+ }
31
+ return 'Error';
32
+ }
33
+ export function getErrorStack(v) {
34
+ if (types.isNativeError(v)) {
35
+ return v.stack ?? '';
36
+ }
37
+ return '';
38
+ }
39
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,CAAU,EACV,IAA+B;IAE/B,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ export interface PromiseWithResolvers<T> {
2
+ promise: Promise<T>;
3
+ resolve: (value: T) => void;
4
+ reject: (reason?: any) => void;
5
+ }
6
+ /**
7
+ * Polyfill for `Promise.withResolvers()`.
8
+ *
9
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
10
+ */
11
+ export declare function withResolvers<T>(): PromiseWithResolvers<T>;
12
+ /**
13
+ * Creates a lazily-evaluated, memoized version of the provided function.
14
+ *
15
+ * The returned object exposes a `value` getter that calls `fn` only once,
16
+ * caches its result, and returns the cached value on subsequent accesses.
17
+ *
18
+ * @typeParam T - The return type of the provided function.
19
+ * @param fn - The function to be called once and whose result will be cached.
20
+ * @returns An object with a `value` property that returns the memoized result of `fn`.
21
+ */
22
+ export declare function once<T>(fn: () => T): {
23
+ readonly value: T;
24
+ };
25
+ /**
26
+ * Builds a workflow suspension log message based on the counts of steps and hooks.
27
+ * @param runId - The workflow run ID
28
+ * @param stepCount - Number of steps to be enqueued
29
+ * @param hookCount - Number of hooks to be enqueued
30
+ * @returns The formatted log message or null if both counts are 0
31
+ */
32
+ export declare function buildWorkflowSuspensionMessage(runId: string, stepCount: number, hookCount: number): string | null;
33
+ /**
34
+ * Generates a stream ID for a workflow run.
35
+ * User-defined streams include a "user" segment for isolation from future system-defined streams.
36
+ * Namespaces are base64-encoded to handle characters not allowed in Redis key names.
37
+ *
38
+ * @param runId - The workflow run ID
39
+ * @param namespace - Optional namespace for the stream
40
+ * @returns The stream ID in format: `strm_{ULID}_user_{base64(namespace)?}`
41
+ */
42
+ export declare function getWorkflowRunStreamId(runId: string, namespace?: string): string;
43
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAQ1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC;;EASlC;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAmBf;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,UAUvE"}
package/dist/util.js ADDED
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Polyfill for `Promise.withResolvers()`.
3
+ *
4
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers
5
+ */
6
+ export function withResolvers() {
7
+ let resolve;
8
+ let reject;
9
+ const promise = new Promise((_resolve, _reject) => {
10
+ resolve = _resolve;
11
+ reject = _reject;
12
+ });
13
+ return { promise, resolve, reject };
14
+ }
15
+ /**
16
+ * Creates a lazily-evaluated, memoized version of the provided function.
17
+ *
18
+ * The returned object exposes a `value` getter that calls `fn` only once,
19
+ * caches its result, and returns the cached value on subsequent accesses.
20
+ *
21
+ * @typeParam T - The return type of the provided function.
22
+ * @param fn - The function to be called once and whose result will be cached.
23
+ * @returns An object with a `value` property that returns the memoized result of `fn`.
24
+ */
25
+ export function once(fn) {
26
+ const result = {
27
+ get value() {
28
+ const value = fn();
29
+ Object.defineProperty(result, 'value', { value });
30
+ return value;
31
+ },
32
+ };
33
+ return result;
34
+ }
35
+ /**
36
+ * Builds a workflow suspension log message based on the counts of steps and hooks.
37
+ * @param runId - The workflow run ID
38
+ * @param stepCount - Number of steps to be enqueued
39
+ * @param hookCount - Number of hooks to be enqueued
40
+ * @returns The formatted log message or null if both counts are 0
41
+ */
42
+ export function buildWorkflowSuspensionMessage(runId, stepCount, hookCount) {
43
+ if (stepCount === 0 && hookCount === 0) {
44
+ return null;
45
+ }
46
+ const parts = [];
47
+ if (stepCount > 0) {
48
+ parts.push(`${stepCount} ${stepCount === 1 ? 'step' : 'steps'}`);
49
+ }
50
+ if (hookCount > 0) {
51
+ parts.push(`${hookCount} ${hookCount === 1 ? 'hook' : 'hooks'}`);
52
+ }
53
+ const resumeMsg = hookCount > 0
54
+ ? 'steps are created and hooks are triggered'
55
+ : 'steps are created';
56
+ return `[Workflows] "${runId}" - ${parts.join(' and ')} to be enqueued\n Workflow will suspend and resume when ${resumeMsg}`;
57
+ }
58
+ /**
59
+ * Generates a stream ID for a workflow run.
60
+ * User-defined streams include a "user" segment for isolation from future system-defined streams.
61
+ * Namespaces are base64-encoded to handle characters not allowed in Redis key names.
62
+ *
63
+ * @param runId - The workflow run ID
64
+ * @param namespace - Optional namespace for the stream
65
+ * @returns The stream ID in format: `strm_{ULID}_user_{base64(namespace)?}`
66
+ */
67
+ export function getWorkflowRunStreamId(runId, namespace) {
68
+ const streamId = `${runId.replace('wrun_', 'strm_')}_user`;
69
+ if (!namespace) {
70
+ return streamId;
71
+ }
72
+ // Base64 encode the namespace to handle special characters that may not be allowed in Redis keys
73
+ const encodedNamespace = Buffer.from(namespace, 'utf-8').toString('base64url');
74
+ return `${streamId}_${encodedNamespace}`;
75
+ }
76
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAA4B,CAAC;IACjC,IAAI,MAA+B,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACnD,OAAO,GAAG,QAAQ,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAI,EAAW;IACjC,MAAM,MAAM,GAAG;QACb,IAAI,KAAK;YACP,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAAa,EACb,SAAiB,EACjB,SAAiB;IAEjB,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GACb,SAAS,GAAG,CAAC;QACX,CAAC,CAAC,2CAA2C;QAC7C,CAAC,CAAC,mBAAmB,CAAC;IAE1B,OAAO,gBAAgB,KAAK,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,4DAA4D,SAAS,EAAE,CAAC;AAChI,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAkB;IACtE,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,iGAAiG;IACjG,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAC/D,WAAW,CACZ,CAAC;IACF,OAAO,GAAG,QAAQ,IAAI,gBAAgB,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface CreateContextOptions {
2
+ seed: string;
3
+ fixedTimestamp: number;
4
+ }
5
+ /**
6
+ * Creates a Node.js `vm.Context` configured to be usable for
7
+ * executing workflow logic in a deterministic environment.
8
+ *
9
+ * @param options - The options for the context.
10
+ * @returns The context.
11
+ */
12
+ export declare function createContext(options: CreateContextOptions): {
13
+ context: import("vm").Context;
14
+ globalThis: typeof globalThis;
15
+ updateTimestamp: (timestamp: number) => void;
16
+ };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vm/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;iCA0F1B,MAAM;EAItC"}
@@ -0,0 +1,93 @@
1
+ import { runInContext, createContext as vmCreateContext } from 'node:vm';
2
+ import seedrandom from 'seedrandom';
3
+ import { createRandomUUID } from './uuid.js';
4
+ /**
5
+ * Creates a Node.js `vm.Context` configured to be usable for
6
+ * executing workflow logic in a deterministic environment.
7
+ *
8
+ * @param options - The options for the context.
9
+ * @returns The context.
10
+ */
11
+ export function createContext(options) {
12
+ let { fixedTimestamp } = options;
13
+ const { seed } = options;
14
+ const rng = seedrandom(seed);
15
+ const context = vmCreateContext();
16
+ const g = runInContext('globalThis', context);
17
+ // Deterministic `Math.random()`
18
+ g.Math.random = rng;
19
+ // Override `Date` constructor to return fixed time when called without arguments
20
+ const Date_ = g.Date;
21
+ // biome-ignore lint/suspicious/noShadowRestrictedNames: We're shadowing the global `Date` property to make it deterministic.
22
+ g.Date = function Date(...args) {
23
+ if (args.length === 0) {
24
+ return new Date_(fixedTimestamp);
25
+ }
26
+ // @ts-expect-error - Args is `Date` constructor arguments
27
+ return new Date_(...args);
28
+ };
29
+ g.Date.prototype = Date_.prototype;
30
+ // Preserve static methods
31
+ Object.setPrototypeOf(g.Date, Date_);
32
+ g.Date.now = () => fixedTimestamp;
33
+ // Deterministic `crypto` using Proxy to avoid mutating global objects
34
+ const originalCrypto = globalThis.crypto;
35
+ const originalSubtle = originalCrypto.subtle;
36
+ function getRandomValues(array) {
37
+ for (let i = 0; i < array.length; i++) {
38
+ array[i] = Math.floor(rng() * 256);
39
+ }
40
+ return array;
41
+ }
42
+ const randomUUID = createRandomUUID(rng);
43
+ const boundDigest = originalSubtle.digest.bind(originalSubtle);
44
+ g.crypto = new Proxy(originalCrypto, {
45
+ get(target, prop) {
46
+ if (prop === 'getRandomValues') {
47
+ return getRandomValues;
48
+ }
49
+ if (prop === 'randomUUID') {
50
+ return randomUUID;
51
+ }
52
+ if (prop === 'subtle') {
53
+ return new Proxy(originalSubtle, {
54
+ get(target, prop) {
55
+ if (prop === 'generateKey') {
56
+ return () => {
57
+ throw new Error('Not implemented');
58
+ };
59
+ }
60
+ else if (prop === 'digest') {
61
+ return boundDigest;
62
+ }
63
+ return target[prop];
64
+ },
65
+ });
66
+ }
67
+ return target[prop];
68
+ },
69
+ });
70
+ // Propagate environment variables
71
+ g.process = {
72
+ env: process.env,
73
+ };
74
+ // Stateless + synchronous Web APIs that are made available inside the sandbox
75
+ g.Headers = globalThis.Headers;
76
+ g.TextEncoder = globalThis.TextEncoder;
77
+ g.TextDecoder = globalThis.TextDecoder;
78
+ g.console = globalThis.console;
79
+ g.URL = globalThis.URL;
80
+ g.URLSearchParams = globalThis.URLSearchParams;
81
+ g.structuredClone = globalThis.structuredClone;
82
+ // HACK: Shim `exports` for the bundle
83
+ g.exports = {};
84
+ g.module = { exports: g.exports };
85
+ return {
86
+ context,
87
+ globalThis: g,
88
+ updateTimestamp: (timestamp) => {
89
+ fixedTimestamp = timestamp;
90
+ },
91
+ };
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vm/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns a function that generates a random UUID, based on the given RNG.
3
+ *
4
+ * `rng` is expected to be a seeded random number generator (i.e. `seedrandom.PRNG` instance).
5
+ *
6
+ * @param rng - A function that returns a random number between 0 and 1.
7
+ * @returns A `crypto.randomUUID`-like function.
8
+ */
9
+ export declare function createRandomUUID(rng: () => number): () => ReturnType<typeof crypto.randomUUID>;
10
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/vm/uuid.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,MAAM,SAClB,UAAU,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,CAgBnE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Returns a function that generates a random UUID, based on the given RNG.
3
+ *
4
+ * `rng` is expected to be a seeded random number generator (i.e. `seedrandom.PRNG` instance).
5
+ *
6
+ * @param rng - A function that returns a random number between 0 and 1.
7
+ * @returns A `crypto.randomUUID`-like function.
8
+ */
9
+ export function createRandomUUID(rng) {
10
+ return function randomUUID() {
11
+ const chars = '0123456789abcdef';
12
+ let uuid = '';
13
+ for (let i = 0; i < 36; i++) {
14
+ if (i === 8 || i === 13 || i === 18 || i === 23) {
15
+ uuid += '-';
16
+ }
17
+ else if (i === 14) {
18
+ uuid += '4'; // Version 4 UUID
19
+ }
20
+ else if (i === 19) {
21
+ uuid += chars[Math.floor(rng() * 4) + 8]; // 8, 9, a, or b
22
+ }
23
+ else {
24
+ uuid += chars[Math.floor(rng() * 16)];
25
+ }
26
+ }
27
+ return uuid;
28
+ };
29
+ }
30
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/vm/uuid.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,OAAO,SAAS,UAAU;QACxB,MAAM,KAAK,GAAG,kBAAkB,CAAC;QACjC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBAChD,IAAI,IAAI,GAAG,CAAC;YACd,CAAC;iBAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACpB,IAAI,IAAI,GAAG,CAAC,CAAC,iBAAiB;YAChC,CAAC;iBAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACpB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB;YAC5D,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,IAA4C,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Hook, HookOptions, RequestWithResponse, Webhook, WebhookOptions } from '../create-hook.js';
2
+ export declare function createHook<T = any>(options?: HookOptions): Hook<T>;
3
+ export declare function createWebhook(options: WebhookOptions & {
4
+ respondWith: 'manual';
5
+ }): Webhook<RequestWithResponse>;
6
+ export declare function createWebhook(options?: WebhookOptions): Webhook<Request>;
7
+ //# sourceMappingURL=create-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/create-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,cAAc,EACf,MAAM,mBAAmB,CAAC;AAI3B,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAWlE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG;IAAE,WAAW,EAAE,QAAQ,CAAA;CAAE,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAChC,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { WORKFLOW_CREATE_HOOK } from '../symbols.js';
2
+ import { getWorkflowMetadata } from './get-workflow-metadata.js';
3
+ export function createHook(options) {
4
+ // Inside the workflow VM, the hook function is stored in the globalThis object behind a symbol
5
+ const createHookFn = globalThis[WORKFLOW_CREATE_HOOK];
6
+ if (!createHookFn) {
7
+ throw new Error('`createHook()` can only be called inside a workflow function');
8
+ }
9
+ return createHookFn(options);
10
+ }
11
+ export function createWebhook(options) {
12
+ const { respondWith, ...rest } = options ?? {};
13
+ let metadata;
14
+ if (typeof respondWith !== 'undefined') {
15
+ metadata = { respondWith };
16
+ }
17
+ const hook = createHook({ ...rest, metadata });
18
+ const { url } = getWorkflowMetadata();
19
+ hook.url = `${url}/.well-known/workflow/v1/webhook/${encodeURIComponent(hook.token)}`;
20
+ return hook;
21
+ }
22
+ //# sourceMappingURL=create-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-hook.js","sourceRoot":"","sources":["../../src/workflow/create-hook.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,UAAU,UAAU,CAAU,OAAqB;IACvD,+FAA+F;IAC/F,MAAM,YAAY,GAAI,UAAkB,CACtC,oBAAoB,CACG,CAAC;IAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAMD,MAAM,UAAU,aAAa,CAC3B,OAAwB;IAExB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC/C,IAAI,QAAyD,CAAC;IAC9D,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,QAAQ,GAAG,EAAE,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAEb,CAAC;IAEjC,MAAM,EAAE,GAAG,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAEtF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Hook as HookEntity } from '@workflow/world';
2
+ import type { Hook, HookOptions } from '../create-hook.js';
3
+ /**
4
+ * NOTE: This is the implementation of `defineHook()` that is used in workflow contexts.
5
+ */
6
+ export declare function defineHook<T>(): {
7
+ create(options?: HookOptions): Hook<T>;
8
+ resume(_token: string, _payload: T): Promise<HookEntity | null>;
9
+ };
10
+ //# sourceMappingURL=define-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/define-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG3D;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC;qBAEP,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC;mBAIvB,MAAM,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;EAMlE"}
@@ -0,0 +1,15 @@
1
+ import { createHook } from './create-hook.js';
2
+ /**
3
+ * NOTE: This is the implementation of `defineHook()` that is used in workflow contexts.
4
+ */
5
+ export function defineHook() {
6
+ return {
7
+ create(options) {
8
+ return createHook(options);
9
+ },
10
+ resume(_token, _payload) {
11
+ throw new Error('`defineHook().resume()` can only be called from external contexts (e.g. API routes).');
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=define-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-hook.js","sourceRoot":"","sources":["../../src/workflow/define-hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,MAAM,CAAC,OAAqB;YAC1B,OAAO,UAAU,CAAI,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,CAAC,MAAc,EAAE,QAAW;YAChC,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface WorkflowMetadata {
2
+ /**
3
+ * Unique identifier for the workflow run.
4
+ */
5
+ workflowRunId: string;
6
+ /**
7
+ * Timestamp when the workflow run started.
8
+ */
9
+ workflowStartedAt: Date;
10
+ /**
11
+ * The URL where the workflow can be triggered.
12
+ */
13
+ url: string;
14
+ }
15
+ export declare const WORKFLOW_CONTEXT_SYMBOL: unique symbol;
16
+ export declare function getWorkflowMetadata(): WorkflowMetadata;
17
+ //# sourceMappingURL=get-workflow-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-workflow-metadata.d.ts","sourceRoot":"","sources":["../../src/workflow/get-workflow-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,iBAAiB,EAAE,IAAI,CAAC;IAExB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,uBAAuB,eACY,CAAC;AAEjD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAStD"}
@@ -0,0 +1,11 @@
1
+ export const WORKFLOW_CONTEXT_SYMBOL =
2
+ /* @__PURE__ */ Symbol.for('WORKFLOW_CONTEXT');
3
+ export function getWorkflowMetadata() {
4
+ // Inside the workflow VM, the context is stored in the globalThis object behind a symbol
5
+ const ctx = globalThis[WORKFLOW_CONTEXT_SYMBOL];
6
+ if (!ctx) {
7
+ throw new Error('`getWorkflowMetadata()` can only be called inside a workflow or step function');
8
+ }
9
+ return ctx;
10
+ }
11
+ //# sourceMappingURL=get-workflow-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-workflow-metadata.js","sourceRoot":"","sources":["../../src/workflow/get-workflow-metadata.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,uBAAuB;AAClC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEjD,MAAM,UAAU,mBAAmB;IACjC,yFAAyF;IACzF,MAAM,GAAG,GAAI,UAAkB,CAAC,uBAAuB,CAAqB,CAAC;IAC7E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Hook, HookOptions } from '../create-hook.js';
2
+ import type { WorkflowOrchestratorContext } from '../private.js';
3
+ export declare function createCreateHook(ctx: WorkflowOrchestratorContext): <T = any>(options?: HookOptions) => Hook<T>;
4
+ //# sourceMappingURL=hook.d.ts.map