@workflow/core 4.5.0 → 4.6.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.
- package/dist/capabilities.d.ts +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +52 -4
- package/dist/classify-error.d.ts +15 -0
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +47 -3
- package/dist/events-consumer.d.ts +9 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +56 -18
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +48 -2
- package/dist/private.d.ts +31 -0
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +13 -1
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +14 -8
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +63 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +6 -5
- package/dist/runtime/start.d.ts +11 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +81 -25
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +7 -2
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +2 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +20 -2
- package/dist/serialization.d.ts +72 -3
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +229 -30
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +6 -3
- package/dist/step-hydration-cache.d.ts +148 -0
- package/dist/step-hydration-cache.d.ts.map +1 -0
- package/dist/step-hydration-cache.js +171 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +18 -2
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +2 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow.d.ts +10 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +37 -6
- package/docs/api-reference/create-hook.mdx +2 -2
- package/docs/foundations/hooks.mdx +1 -1
- package/package.json +10 -6
package/dist/symbols.js
CHANGED
|
@@ -6,6 +6,7 @@ export const WORKFLOW_GET_STREAM_ID = Symbol.for('WORKFLOW_GET_STREAM_ID');
|
|
|
6
6
|
export const STABLE_ULID = Symbol.for('WORKFLOW_STABLE_ULID');
|
|
7
7
|
export const STREAM_NAME_SYMBOL = Symbol.for('WORKFLOW_STREAM_NAME');
|
|
8
8
|
export const STREAM_TYPE_SYMBOL = Symbol.for('WORKFLOW_STREAM_TYPE');
|
|
9
|
+
export const STREAM_FRAMING_SYMBOL = Symbol.for('WORKFLOW_STREAM_FRAMING');
|
|
9
10
|
/**
|
|
10
11
|
* Stamped on a real `WritableStream` (the user-visible `serialize.writable`
|
|
11
12
|
* returned from a step-side reviver or step-context `getWritable()`) to
|
|
@@ -35,4 +36,4 @@ export const WEBHOOK_RESPONSE_WRITABLE = Symbol.for('WEBHOOK_RESPONSE_WRITABLE')
|
|
|
35
36
|
* This allows the deserializer to find classes by classId in the VM context.
|
|
36
37
|
*/
|
|
37
38
|
export const WORKFLOW_CLASS_REGISTRY = Symbol.for('workflow-class-registry');
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeW1ib2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDdkUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDM0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUNuRCwrQkFBK0IsQ0FDaEMsQ0FBQztBQUNGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUMxRCxzQ0FBc0MsQ0FDdkMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDakQsMkJBQTJCLENBQzVCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgV09SS0ZMT1dfVVNFX1NURVAgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpO1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0NSRUFURV9IT09LID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQ1JFQVRFX0hPT0snKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19TTEVFUCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NMRUVQJyk7XG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0NPTlRFWFQnKTtcbmV4cG9ydCBjb25zdCBXT1JLRkxPV19HRVRfU1RSRUFNX0lEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCcpO1xuZXhwb3J0IGNvbnN0IFNUQUJMRV9VTElEID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RBQkxFX1VMSUQnKTtcbmV4cG9ydCBjb25zdCBTVFJFQU1fTkFNRV9TWU1CT0wgPSBTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpO1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9UWVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyk7XG5leHBvcnQgY29uc3QgU1RSRUFNX0ZSQU1JTkdfU1lNQk9MID0gU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnKTtcbi8qKlxuICogU3RhbXBlZCBvbiBhIHJlYWwgYFdyaXRhYmxlU3RyZWFtYCAodGhlIHVzZXItdmlzaWJsZSBgc2VyaWFsaXplLndyaXRhYmxlYFxuICogcmV0dXJuZWQgZnJvbSBhIHN0ZXAtc2lkZSByZXZpdmVyIG9yIHN0ZXAtY29udGV4dCBgZ2V0V3JpdGFibGUoKWApIHRvXG4gKiByZWNvcmQgdGhlIGBydW5JZGAgb2YgdGhlIHdvcmtmbG93IHJ1biB0aGF0IG93bnMgdGhlIHVuZGVybHlpbmcgc2VydmVyXG4gKiBzdHJlYW0uIFVzZWQgdG9nZXRoZXIgd2l0aCBgU1RSRUFNX05BTUVfU1lNQk9MYC5cbiAqXG4gKiBXaGVuIGBnZXRFeHRlcm5hbFJlZHVjZXJzLldyaXRhYmxlU3RyZWFtYCAodGhlIGRlaHlkcmF0aW9uIHBhdGggdXNlZCBieVxuICogYHN0YXJ0KClgKSBzZWVzIGJvdGggc3ltYm9scyBvbiBhIHdyaXRhYmxlLCBpdCBpbmNsdWRlcyB0aGUgYHJ1bklkYCBpblxuICogdGhlIGRlc2NyaXB0b3IgaXQgZW1pdHMuIFRoZSBjaGlsZCBydW4ncyBzdGVwLXNpZGUgcmV2aXZlciB0aGVuIG9wZW5zXG4gKiBhIHNlcnZlciB3cml0YWJsZSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgKHJ1bklkLCBuYW1lKWAgYW5kIHJlc29sdmVzXG4gKiB0aGF0IHJ1bidzIGVuY3J5cHRpb24ga2V5IGRpcmVjdGx5IOKAlCBzbyB0aGUgY2hpbGQncyB3cml0ZXMgbGFuZCBvblxuICogdGhlIHBhcmVudCdzIHN0cmVhbSBhcy1pcywgd2l0aCBubyBjbGllbnQgcHJvY2VzcyBpbiB0aGUgbG9vcC4gVGhhdFxuICoga2VlcHMgdGhlIGZvcndhcmRpbmcgYWxpdmUgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBjaGlsZCBydW4sXG4gKiBub3QganVzdCBmb3IgdGhlIHBhcmVudCBzdGVwIHRoYXQgaW5pdGlhdGVkIGBzdGFydCgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9TRVJWRVJfUlVOX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCdcbik7XG4vKipcbiAqIFN0YW1wZWQgYWxvbmdzaWRlIGBTVFJFQU1fU0VSVkVSX1JVTl9JRF9TWU1CT0xgIHdoZW4gdGhlIGRlcGxveW1lbnQgdGhhdFxuICogb3ducyBhIGZvcndhcmRlZCB3cml0YWJsZSBzdHJlYW0gaXMga25vd24uIENyb3NzLWRlcGxveW1lbnQgY29uc3VtZXJzIHVzZVxuICogaXQgdG8gcmVzb2x2ZSB0aGUgb3duaW5nIHJ1bidzIGVuY3J5cHRpb24ga2V5IHdpdGhvdXQgbG9hZGluZyB0aGUgcnVuIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gICdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnXG4pO1xuZXhwb3J0IGNvbnN0IEJPRFlfSU5JVF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKTtcbmV4cG9ydCBjb25zdCBXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFID0gU3ltYm9sLmZvcihcbiAgJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnXG4pO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIHRvIHN0b3JlIHRoZSBjbGFzcyByZWdpc3RyeSBvbiBnbG9iYWxUaGlzIGluIHdvcmtmbG93IG1vZGUuXG4gKiBUaGlzIGFsbG93cyB0aGUgZGVzZXJpYWxpemVyIHRvIGZpbmQgY2xhc3NlcyBieSBjbGFzc0lkIGluIHRoZSBWTSBjb250ZXh0LlxuICovXG5leHBvcnQgY29uc3QgV09SS0ZMT1dfQ0xBU1NfUkVHSVNUUlkgPSBTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpO1xuIl19
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "4.
|
|
1
|
+
export declare const version = "4.6.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Generated by genversion.
|
|
2
|
-
export const version = '4.
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
export const version = '4.6.0';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc0LjYuMCdcbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type Context, Script } from 'node:vm';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a compiled `vm.Script` for the given workflow bundle code and
|
|
4
|
+
* filename, compiling and caching it on first use. Subsequent calls with the
|
|
5
|
+
* same `(code, filename)` return the cached `Script`.
|
|
6
|
+
*
|
|
7
|
+
* The returned `Script` is not yet bound to any context; the caller runs it
|
|
8
|
+
* against a specific VM context via `script.runInContext(context)`. This is
|
|
9
|
+
* equivalent to `vm.runInContext(code, context, { filename })` but skips the
|
|
10
|
+
* recompile.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getCachedWorkflowScript(code: string, filename: string): Script;
|
|
13
|
+
/**
|
|
14
|
+
* Runs the cached workflow-bundle `Script` against `context`. Compiles and
|
|
15
|
+
* caches the `Script` on first use for the given `(code, filename)`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runCachedWorkflowScript(code: string, filename: string, context: Context): unknown;
|
|
18
|
+
/**
|
|
19
|
+
* Clears the compiled-script cache. Intended for tests that want to assert
|
|
20
|
+
* compile-vs-cache behaviour in isolation; not used on the hot path.
|
|
21
|
+
*/
|
|
22
|
+
export declare function clearWorkflowScriptCache(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Number of distinct bundle (`code`) versions currently retained. Exposed for
|
|
25
|
+
* tests asserting the LRU bound; not used on the hot path.
|
|
26
|
+
*/
|
|
27
|
+
export declare function workflowScriptCacheSize(): number;
|
|
28
|
+
//# sourceMappingURL=script-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-cache.d.ts","sourceRoot":"","sources":["../../src/vm/script-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA0F/C;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Script } from 'node:vm';
|
|
2
|
+
/**
|
|
3
|
+
* Module-level cache of compiled workflow-bundle `vm.Script` objects.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists
|
|
6
|
+
* ---------------
|
|
7
|
+
* Replaying a workflow re-evaluates the workflow bundle against a fresh VM
|
|
8
|
+
* context on every iteration of the inline replay loop (see
|
|
9
|
+
* `runWorkflow` in `../workflow.ts`). The bundle is a single string that
|
|
10
|
+
* contains every workflow function in the app and registers them on
|
|
11
|
+
* `globalThis.__private_workflows`. Previously each replay called
|
|
12
|
+
* `vm.runInContext(workflowCode, context, { filename })`, which RE-PARSES and
|
|
13
|
+
* RE-COMPILES the entire bundle every time — O(N) full re-parses for a
|
|
14
|
+
* sequential workflow of N steps, plus the same parse cost repeated across
|
|
15
|
+
* every invocation in the process.
|
|
16
|
+
*
|
|
17
|
+
* Compilation is a pure function of `(code, filename)`: a `vm.Script` carries
|
|
18
|
+
* no realm/context state — it is only bound to a context at `runInContext`
|
|
19
|
+
* time. So a single compiled `Script` can be reused across replays AND across
|
|
20
|
+
* workflow invocations in the same process without affecting determinism: the
|
|
21
|
+
* produced workflow function is identical to the previous re-parse-every-time
|
|
22
|
+
* behaviour, with identical `filename` source attribution (see the precise
|
|
23
|
+
* claim — and its one caveat — in `runWorkflow`).
|
|
24
|
+
*
|
|
25
|
+
* Keying
|
|
26
|
+
* ------
|
|
27
|
+
* Keyed by `code` then `filename`. The `filename` is part of the key on
|
|
28
|
+
* purpose, NOT as a dedupe key: it is baked into the compiled script's source
|
|
29
|
+
* attribution and surfaces in stack traces, where `remapErrorStack` keys on it
|
|
30
|
+
* to map frames back to the user's source. Two workflows in the same bundle
|
|
31
|
+
* share the same `code` but have different `filename`s, so they intentionally
|
|
32
|
+
* compile to distinct `Script`s — collapsing them onto a single shared `Script`
|
|
33
|
+
* would misattribute one workflow's stack frames to another file. The cost of
|
|
34
|
+
* keeping them distinct is that the whole bundle is compiled once per distinct
|
|
35
|
+
* `filename` (not once per bundle); in practice that is bounded by the number
|
|
36
|
+
* of source files that define a workflow, and because V8 lazily compiles
|
|
37
|
+
* function bodies the duplicated work is the (cheap) top-level parse, not full
|
|
38
|
+
* per-workflow codegen.
|
|
39
|
+
*
|
|
40
|
+
* We use a nested Map (code -> filename -> Script) so that evicting a bundle
|
|
41
|
+
* (e.g. a new deployment/hot-reload producing a different `code`) drops the old
|
|
42
|
+
* code string and all of its per-filename scripts together.
|
|
43
|
+
*
|
|
44
|
+
* Bounding
|
|
45
|
+
* --------
|
|
46
|
+
* The top-level (`code`-keyed) map is an insertion-ordered LRU capped at
|
|
47
|
+
* `MAX_BUNDLES` entries. In production this bound is never reached: a
|
|
48
|
+
* deployment is its own process serving exactly one build-time bundle literal
|
|
49
|
+
* (skew protection runs old versions as separate processes), so there is a
|
|
50
|
+
* single `code` key for the process lifetime. The bound exists for dev/watch
|
|
51
|
+
* mode, where the dev route re-reads `workflowCode` from disk and re-invokes
|
|
52
|
+
* the entrypoint on every edit — each edit produces a NEW bundle string, which
|
|
53
|
+
* without a bound would pin every historical version forever (~0.8MB per edit,
|
|
54
|
+
* growing monotonically with edit count). The dev path only ever needs the
|
|
55
|
+
* latest bundle, so an LRU that keeps the few most-recent bundles and evicts
|
|
56
|
+
* the rest preserves the pre-cache GC behaviour while still serving the
|
|
57
|
+
* steady-state single-bundle case for free. The per-`filename` inner map is not
|
|
58
|
+
* separately bounded: it is naturally bounded by the (small) number of workflow
|
|
59
|
+
* source files in a bundle and is dropped wholesale when its parent `code`
|
|
60
|
+
* entry is evicted.
|
|
61
|
+
*/
|
|
62
|
+
const scriptCache = new Map();
|
|
63
|
+
/**
|
|
64
|
+
* Max number of distinct bundle (`code`) versions to retain. One is enough for
|
|
65
|
+
* production; a handful covers pathological dev hot-reload / repeated-rebuild
|
|
66
|
+
* churn within a single long-lived process (e.g. a watch session or a test
|
|
67
|
+
* file) without unbounded growth. Kept deliberately small — there is no value
|
|
68
|
+
* in retaining stale bundles, only a memory cost.
|
|
69
|
+
*/
|
|
70
|
+
const MAX_BUNDLES = 8;
|
|
71
|
+
/**
|
|
72
|
+
* Looks up the per-filename map for `code`, marking it most-recently-used.
|
|
73
|
+
* Relies on `Map` preserving insertion order: deleting and re-inserting an
|
|
74
|
+
* existing key moves it to the end (newest), so the first key is always the
|
|
75
|
+
* least-recently-used eviction candidate.
|
|
76
|
+
*/
|
|
77
|
+
function touchBundle(code) {
|
|
78
|
+
const byFilename = scriptCache.get(code);
|
|
79
|
+
if (byFilename === undefined) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
// Move to the most-recently-used position (end of insertion order).
|
|
83
|
+
scriptCache.delete(code);
|
|
84
|
+
scriptCache.set(code, byFilename);
|
|
85
|
+
return byFilename;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Returns a compiled `vm.Script` for the given workflow bundle code and
|
|
89
|
+
* filename, compiling and caching it on first use. Subsequent calls with the
|
|
90
|
+
* same `(code, filename)` return the cached `Script`.
|
|
91
|
+
*
|
|
92
|
+
* The returned `Script` is not yet bound to any context; the caller runs it
|
|
93
|
+
* against a specific VM context via `script.runInContext(context)`. This is
|
|
94
|
+
* equivalent to `vm.runInContext(code, context, { filename })` but skips the
|
|
95
|
+
* recompile.
|
|
96
|
+
*/
|
|
97
|
+
export function getCachedWorkflowScript(code, filename) {
|
|
98
|
+
let byFilename = touchBundle(code);
|
|
99
|
+
if (byFilename === undefined) {
|
|
100
|
+
byFilename = new Map();
|
|
101
|
+
scriptCache.set(code, byFilename);
|
|
102
|
+
// Evict the least-recently-used bundle(s) when over the cap. New bundles
|
|
103
|
+
// are appended at the end, so the oldest live at the front.
|
|
104
|
+
while (scriptCache.size > MAX_BUNDLES) {
|
|
105
|
+
const oldest = scriptCache.keys().next().value;
|
|
106
|
+
if (oldest === undefined) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
scriptCache.delete(oldest);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
let script = byFilename.get(filename);
|
|
113
|
+
if (script === undefined) {
|
|
114
|
+
script = new Script(code, { filename });
|
|
115
|
+
byFilename.set(filename, script);
|
|
116
|
+
}
|
|
117
|
+
return script;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Runs the cached workflow-bundle `Script` against `context`. Compiles and
|
|
121
|
+
* caches the `Script` on first use for the given `(code, filename)`.
|
|
122
|
+
*/
|
|
123
|
+
export function runCachedWorkflowScript(code, filename, context) {
|
|
124
|
+
return getCachedWorkflowScript(code, filename).runInContext(context);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Clears the compiled-script cache. Intended for tests that want to assert
|
|
128
|
+
* compile-vs-cache behaviour in isolation; not used on the hot path.
|
|
129
|
+
*/
|
|
130
|
+
export function clearWorkflowScriptCache() {
|
|
131
|
+
scriptCache.clear();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Number of distinct bundle (`code`) versions currently retained. Exposed for
|
|
135
|
+
* tests asserting the LRU bound; not used on the hot path.
|
|
136
|
+
*/
|
|
137
|
+
export function workflowScriptCacheSize() {
|
|
138
|
+
return scriptCache.size;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZtL3NjcmlwdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyREc7QUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztBQUUzRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELG9FQUFvRTtJQUNwRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQjtJQUVoQixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLHlFQUF5RTtRQUN6RSw0REFBNEQ7UUFDNUQsT0FBTyxXQUFXLENBQUMsSUFBSSxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDL0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixDQUFDO1lBQ0QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQixFQUNoQixPQUFnQjtJQUVoQixPQUFPLHVCQUF1QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb250ZXh0LCBTY3JpcHQgfSBmcm9tICdub2RlOnZtJztcblxuLyoqXG4gKiBNb2R1bGUtbGV2ZWwgY2FjaGUgb2YgY29tcGlsZWQgd29ya2Zsb3ctYnVuZGxlIGB2bS5TY3JpcHRgIG9iamVjdHMuXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzXG4gKiAtLS0tLS0tLS0tLS0tLS1cbiAqIFJlcGxheWluZyBhIHdvcmtmbG93IHJlLWV2YWx1YXRlcyB0aGUgd29ya2Zsb3cgYnVuZGxlIGFnYWluc3QgYSBmcmVzaCBWTVxuICogY29udGV4dCBvbiBldmVyeSBpdGVyYXRpb24gb2YgdGhlIGlubGluZSByZXBsYXkgbG9vcCAoc2VlXG4gKiBgcnVuV29ya2Zsb3dgIGluIGAuLi93b3JrZmxvdy50c2ApLiBUaGUgYnVuZGxlIGlzIGEgc2luZ2xlIHN0cmluZyB0aGF0XG4gKiBjb250YWlucyBldmVyeSB3b3JrZmxvdyBmdW5jdGlvbiBpbiB0aGUgYXBwIGFuZCByZWdpc3RlcnMgdGhlbSBvblxuICogYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93c2AuIFByZXZpb3VzbHkgZWFjaCByZXBsYXkgY2FsbGVkXG4gKiBgdm0ucnVuSW5Db250ZXh0KHdvcmtmbG93Q29kZSwgY29udGV4dCwgeyBmaWxlbmFtZSB9KWAsIHdoaWNoIFJFLVBBUlNFUyBhbmRcbiAqIFJFLUNPTVBJTEVTIHRoZSBlbnRpcmUgYnVuZGxlIGV2ZXJ5IHRpbWUg4oCUIE8oTikgZnVsbCByZS1wYXJzZXMgZm9yIGFcbiAqIHNlcXVlbnRpYWwgd29ya2Zsb3cgb2YgTiBzdGVwcywgcGx1cyB0aGUgc2FtZSBwYXJzZSBjb3N0IHJlcGVhdGVkIGFjcm9zc1xuICogZXZlcnkgaW52b2NhdGlvbiBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBDb21waWxhdGlvbiBpcyBhIHB1cmUgZnVuY3Rpb24gb2YgYChjb2RlLCBmaWxlbmFtZSlgOiBhIGB2bS5TY3JpcHRgIGNhcnJpZXNcbiAqIG5vIHJlYWxtL2NvbnRleHQgc3RhdGUg4oCUIGl0IGlzIG9ubHkgYm91bmQgdG8gYSBjb250ZXh0IGF0IGBydW5JbkNvbnRleHRgXG4gKiB0aW1lLiBTbyBhIHNpbmdsZSBjb21waWxlZCBgU2NyaXB0YCBjYW4gYmUgcmV1c2VkIGFjcm9zcyByZXBsYXlzIEFORCBhY3Jvc3NcbiAqIHdvcmtmbG93IGludm9jYXRpb25zIGluIHRoZSBzYW1lIHByb2Nlc3Mgd2l0aG91dCBhZmZlY3RpbmcgZGV0ZXJtaW5pc206IHRoZVxuICogcHJvZHVjZWQgd29ya2Zsb3cgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyByZS1wYXJzZS1ldmVyeS10aW1lXG4gKiBiZWhhdmlvdXIsIHdpdGggaWRlbnRpY2FsIGBmaWxlbmFtZWAgc291cmNlIGF0dHJpYnV0aW9uIChzZWUgdGhlIHByZWNpc2VcbiAqIGNsYWltIOKAlCBhbmQgaXRzIG9uZSBjYXZlYXQg4oCUIGluIGBydW5Xb3JrZmxvd2ApLlxuICpcbiAqIEtleWluZ1xuICogLS0tLS0tXG4gKiBLZXllZCBieSBgY29kZWAgdGhlbiBgZmlsZW5hbWVgLiBUaGUgYGZpbGVuYW1lYCBpcyBwYXJ0IG9mIHRoZSBrZXkgb25cbiAqIHB1cnBvc2UsIE5PVCBhcyBhIGRlZHVwZSBrZXk6IGl0IGlzIGJha2VkIGludG8gdGhlIGNvbXBpbGVkIHNjcmlwdCdzIHNvdXJjZVxuICogYXR0cmlidXRpb24gYW5kIHN1cmZhY2VzIGluIHN0YWNrIHRyYWNlcywgd2hlcmUgYHJlbWFwRXJyb3JTdGFja2Aga2V5cyBvbiBpdFxuICogdG8gbWFwIGZyYW1lcyBiYWNrIHRvIHRoZSB1c2VyJ3Mgc291cmNlLiBUd28gd29ya2Zsb3dzIGluIHRoZSBzYW1lIGJ1bmRsZVxuICogc2hhcmUgdGhlIHNhbWUgYGNvZGVgIGJ1dCBoYXZlIGRpZmZlcmVudCBgZmlsZW5hbWVgcywgc28gdGhleSBpbnRlbnRpb25hbGx5XG4gKiBjb21waWxlIHRvIGRpc3RpbmN0IGBTY3JpcHRgcyDigJQgY29sbGFwc2luZyB0aGVtIG9udG8gYSBzaW5nbGUgc2hhcmVkIGBTY3JpcHRgXG4gKiB3b3VsZCBtaXNhdHRyaWJ1dGUgb25lIHdvcmtmbG93J3Mgc3RhY2sgZnJhbWVzIHRvIGFub3RoZXIgZmlsZS4gVGhlIGNvc3Qgb2ZcbiAqIGtlZXBpbmcgdGhlbSBkaXN0aW5jdCBpcyB0aGF0IHRoZSB3aG9sZSBidW5kbGUgaXMgY29tcGlsZWQgb25jZSBwZXIgZGlzdGluY3RcbiAqIGBmaWxlbmFtZWAgKG5vdCBvbmNlIHBlciBidW5kbGUpOyBpbiBwcmFjdGljZSB0aGF0IGlzIGJvdW5kZWQgYnkgdGhlIG51bWJlclxuICogb2Ygc291cmNlIGZpbGVzIHRoYXQgZGVmaW5lIGEgd29ya2Zsb3csIGFuZCBiZWNhdXNlIFY4IGxhemlseSBjb21waWxlc1xuICogZnVuY3Rpb24gYm9kaWVzIHRoZSBkdXBsaWNhdGVkIHdvcmsgaXMgdGhlIChjaGVhcCkgdG9wLWxldmVsIHBhcnNlLCBub3QgZnVsbFxuICogcGVyLXdvcmtmbG93IGNvZGVnZW4uXG4gKlxuICogV2UgdXNlIGEgbmVzdGVkIE1hcCAoY29kZSAtPiBmaWxlbmFtZSAtPiBTY3JpcHQpIHNvIHRoYXQgZXZpY3RpbmcgYSBidW5kbGVcbiAqIChlLmcuIGEgbmV3IGRlcGxveW1lbnQvaG90LXJlbG9hZCBwcm9kdWNpbmcgYSBkaWZmZXJlbnQgYGNvZGVgKSBkcm9wcyB0aGUgb2xkXG4gKiBjb2RlIHN0cmluZyBhbmQgYWxsIG9mIGl0cyBwZXItZmlsZW5hbWUgc2NyaXB0cyB0b2dldGhlci5cbiAqXG4gKiBCb3VuZGluZ1xuICogLS0tLS0tLS1cbiAqIFRoZSB0b3AtbGV2ZWwgKGBjb2RlYC1rZXllZCkgbWFwIGlzIGFuIGluc2VydGlvbi1vcmRlcmVkIExSVSBjYXBwZWQgYXRcbiAqIGBNQVhfQlVORExFU2AgZW50cmllcy4gSW4gcHJvZHVjdGlvbiB0aGlzIGJvdW5kIGlzIG5ldmVyIHJlYWNoZWQ6IGFcbiAqIGRlcGxveW1lbnQgaXMgaXRzIG93biBwcm9jZXNzIHNlcnZpbmcgZXhhY3RseSBvbmUgYnVpbGQtdGltZSBidW5kbGUgbGl0ZXJhbFxuICogKHNrZXcgcHJvdGVjdGlvbiBydW5zIG9sZCB2ZXJzaW9ucyBhcyBzZXBhcmF0ZSBwcm9jZXNzZXMpLCBzbyB0aGVyZSBpcyBhXG4gKiBzaW5nbGUgYGNvZGVgIGtleSBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUuIFRoZSBib3VuZCBleGlzdHMgZm9yIGRldi93YXRjaFxuICogbW9kZSwgd2hlcmUgdGhlIGRldiByb3V0ZSByZS1yZWFkcyBgd29ya2Zsb3dDb2RlYCBmcm9tIGRpc2sgYW5kIHJlLWludm9rZXNcbiAqIHRoZSBlbnRyeXBvaW50IG9uIGV2ZXJ5IGVkaXQg4oCUIGVhY2ggZWRpdCBwcm9kdWNlcyBhIE5FVyBidW5kbGUgc3RyaW5nLCB3aGljaFxuICogd2l0aG91dCBhIGJvdW5kIHdvdWxkIHBpbiBldmVyeSBoaXN0b3JpY2FsIHZlcnNpb24gZm9yZXZlciAofjAuOE1CIHBlciBlZGl0LFxuICogZ3Jvd2luZyBtb25vdG9uaWNhbGx5IHdpdGggZWRpdCBjb3VudCkuIFRoZSBkZXYgcGF0aCBvbmx5IGV2ZXIgbmVlZHMgdGhlXG4gKiBsYXRlc3QgYnVuZGxlLCBzbyBhbiBMUlUgdGhhdCBrZWVwcyB0aGUgZmV3IG1vc3QtcmVjZW50IGJ1bmRsZXMgYW5kIGV2aWN0c1xuICogdGhlIHJlc3QgcHJlc2VydmVzIHRoZSBwcmUtY2FjaGUgR0MgYmVoYXZpb3VyIHdoaWxlIHN0aWxsIHNlcnZpbmcgdGhlXG4gKiBzdGVhZHktc3RhdGUgc2luZ2xlLWJ1bmRsZSBjYXNlIGZvciBmcmVlLiBUaGUgcGVyLWBmaWxlbmFtZWAgaW5uZXIgbWFwIGlzIG5vdFxuICogc2VwYXJhdGVseSBib3VuZGVkOiBpdCBpcyBuYXR1cmFsbHkgYm91bmRlZCBieSB0aGUgKHNtYWxsKSBudW1iZXIgb2Ygd29ya2Zsb3dcbiAqIHNvdXJjZSBmaWxlcyBpbiBhIGJ1bmRsZSBhbmQgaXMgZHJvcHBlZCB3aG9sZXNhbGUgd2hlbiBpdHMgcGFyZW50IGBjb2RlYFxuICogZW50cnkgaXMgZXZpY3RlZC5cbiAqL1xuY29uc3Qgc2NyaXB0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2NyaXB0Pj4oKTtcblxuLyoqXG4gKiBNYXggbnVtYmVyIG9mIGRpc3RpbmN0IGJ1bmRsZSAoYGNvZGVgKSB2ZXJzaW9ucyB0byByZXRhaW4uIE9uZSBpcyBlbm91Z2ggZm9yXG4gKiBwcm9kdWN0aW9uOyBhIGhhbmRmdWwgY292ZXJzIHBhdGhvbG9naWNhbCBkZXYgaG90LXJlbG9hZCAvIHJlcGVhdGVkLXJlYnVpbGRcbiAqIGNodXJuIHdpdGhpbiBhIHNpbmdsZSBsb25nLWxpdmVkIHByb2Nlc3MgKGUuZy4gYSB3YXRjaCBzZXNzaW9uIG9yIGEgdGVzdFxuICogZmlsZSkgd2l0aG91dCB1bmJvdW5kZWQgZ3Jvd3RoLiBLZXB0IGRlbGliZXJhdGVseSBzbWFsbCDigJQgdGhlcmUgaXMgbm8gdmFsdWVcbiAqIGluIHJldGFpbmluZyBzdGFsZSBidW5kbGVzLCBvbmx5IGEgbWVtb3J5IGNvc3QuXG4gKi9cbmNvbnN0IE1BWF9CVU5ETEVTID0gODtcblxuLyoqXG4gKiBMb29rcyB1cCB0aGUgcGVyLWZpbGVuYW1lIG1hcCBmb3IgYGNvZGVgLCBtYXJraW5nIGl0IG1vc3QtcmVjZW50bHktdXNlZC5cbiAqIFJlbGllcyBvbiBgTWFwYCBwcmVzZXJ2aW5nIGluc2VydGlvbiBvcmRlcjogZGVsZXRpbmcgYW5kIHJlLWluc2VydGluZyBhblxuICogZXhpc3Rpbmcga2V5IG1vdmVzIGl0IHRvIHRoZSBlbmQgKG5ld2VzdCksIHNvIHRoZSBmaXJzdCBrZXkgaXMgYWx3YXlzIHRoZVxuICogbGVhc3QtcmVjZW50bHktdXNlZCBldmljdGlvbiBjYW5kaWRhdGUuXG4gKi9cbmZ1bmN0aW9uIHRvdWNoQnVuZGxlKGNvZGU6IHN0cmluZyk6IE1hcDxzdHJpbmcsIFNjcmlwdD4gfCB1bmRlZmluZWQge1xuICBjb25zdCBieUZpbGVuYW1lID0gc2NyaXB0Q2FjaGUuZ2V0KGNvZGUpO1xuICBpZiAoYnlGaWxlbmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBNb3ZlIHRvIHRoZSBtb3N0LXJlY2VudGx5LXVzZWQgcG9zaXRpb24gKGVuZCBvZiBpbnNlcnRpb24gb3JkZXIpLlxuICBzY3JpcHRDYWNoZS5kZWxldGUoY29kZSk7XG4gIHNjcmlwdENhY2hlLnNldChjb2RlLCBieUZpbGVuYW1lKTtcbiAgcmV0dXJuIGJ5RmlsZW5hbWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBpbGVkIGB2bS5TY3JpcHRgIGZvciB0aGUgZ2l2ZW4gd29ya2Zsb3cgYnVuZGxlIGNvZGUgYW5kXG4gKiBmaWxlbmFtZSwgY29tcGlsaW5nIGFuZCBjYWNoaW5nIGl0IG9uIGZpcnN0IHVzZS4gU3Vic2VxdWVudCBjYWxscyB3aXRoIHRoZVxuICogc2FtZSBgKGNvZGUsIGZpbGVuYW1lKWAgcmV0dXJuIHRoZSBjYWNoZWQgYFNjcmlwdGAuXG4gKlxuICogVGhlIHJldHVybmVkIGBTY3JpcHRgIGlzIG5vdCB5ZXQgYm91bmQgdG8gYW55IGNvbnRleHQ7IHRoZSBjYWxsZXIgcnVucyBpdFxuICogYWdhaW5zdCBhIHNwZWNpZmljIFZNIGNvbnRleHQgdmlhIGBzY3JpcHQucnVuSW5Db250ZXh0KGNvbnRleHQpYC4gVGhpcyBpc1xuICogZXF1aXZhbGVudCB0byBgdm0ucnVuSW5Db250ZXh0KGNvZGUsIGNvbnRleHQsIHsgZmlsZW5hbWUgfSlgIGJ1dCBza2lwcyB0aGVcbiAqIHJlY29tcGlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZFdvcmtmbG93U2NyaXB0KFxuICBjb2RlOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmdcbik6IFNjcmlwdCB7XG4gIGxldCBieUZpbGVuYW1lID0gdG91Y2hCdW5kbGUoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBieUZpbGVuYW1lID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdD4oKTtcbiAgICBzY3JpcHRDYWNoZS5zZXQoY29kZSwgYnlGaWxlbmFtZSk7XG4gICAgLy8gRXZpY3QgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgYnVuZGxlKHMpIHdoZW4gb3ZlciB0aGUgY2FwLiBOZXcgYnVuZGxlc1xuICAgIC8vIGFyZSBhcHBlbmRlZCBhdCB0aGUgZW5kLCBzbyB0aGUgb2xkZXN0IGxpdmUgYXQgdGhlIGZyb250LlxuICAgIHdoaWxlIChzY3JpcHRDYWNoZS5zaXplID4gTUFYX0JVTkRMRVMpIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHNjcmlwdENhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY3JpcHRDYWNoZS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cbiAgbGV0IHNjcmlwdCA9IGJ5RmlsZW5hbWUuZ2V0KGZpbGVuYW1lKTtcbiAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2NyaXB0ID0gbmV3IFNjcmlwdChjb2RlLCB7IGZpbGVuYW1lIH0pO1xuICAgIGJ5RmlsZW5hbWUuc2V0KGZpbGVuYW1lLCBzY3JpcHQpO1xuICB9XG4gIHJldHVybiBzY3JpcHQ7XG59XG5cbi8qKlxuICogUnVucyB0aGUgY2FjaGVkIHdvcmtmbG93LWJ1bmRsZSBgU2NyaXB0YCBhZ2FpbnN0IGBjb250ZXh0YC4gQ29tcGlsZXMgYW5kXG4gKiBjYWNoZXMgdGhlIGBTY3JpcHRgIG9uIGZpcnN0IHVzZSBmb3IgdGhlIGdpdmVuIGAoY29kZSwgZmlsZW5hbWUpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0KFxuICBjb2RlOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IENvbnRleHRcbik6IHVua25vd24ge1xuICByZXR1cm4gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQoY29kZSwgZmlsZW5hbWUpLnJ1bkluQ29udGV4dChjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGNvbXBpbGVkLXNjcmlwdCBjYWNoZS4gSW50ZW5kZWQgZm9yIHRlc3RzIHRoYXQgd2FudCB0byBhc3NlcnRcbiAqIGNvbXBpbGUtdnMtY2FjaGUgYmVoYXZpb3VyIGluIGlzb2xhdGlvbjsgbm90IHVzZWQgb24gdGhlIGhvdCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXb3JrZmxvd1NjcmlwdENhY2hlKCk6IHZvaWQge1xuICBzY3JpcHRDYWNoZS5jbGVhcigpO1xufVxuXG4vKipcbiAqIE51bWJlciBvZiBkaXN0aW5jdCBidW5kbGUgKGBjb2RlYCkgdmVyc2lvbnMgY3VycmVudGx5IHJldGFpbmVkLiBFeHBvc2VkIGZvclxuICogdGVzdHMgYXNzZXJ0aW5nIHRoZSBMUlUgYm91bmQ7IG5vdCB1c2VkIG9uIHRoZSBob3QgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93U2NyaXB0Q2FjaGVTaXplKCk6IG51bWJlciB7XG4gIHJldHVybiBzY3JpcHRDYWNoZS5zaXplO1xufVxuIl19
|
package/dist/workflow.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { Event, WorkflowRun } from '@workflow/world';
|
|
2
2
|
import type { CryptoKey } from './encryption.js';
|
|
3
|
-
|
|
3
|
+
import type { StepHydrationCache } from './step-hydration-cache.js';
|
|
4
|
+
export declare function runWorkflow(workflowCode: string, workflowRun: WorkflowRun, events: Event[], encryptionKey: CryptoKey | undefined,
|
|
5
|
+
/**
|
|
6
|
+
* Optional per-run cache for hydrated step return values, owned by the inline
|
|
7
|
+
* replay loop so it survives across the loop's iterations (each of which
|
|
8
|
+
* creates a fresh context). Memoizes the decrypt + devalue-parse of completed
|
|
9
|
+
* step results to turn O(N²) replay hydration into O(N). Omitted by callers
|
|
10
|
+
* that replay only once (then there is nothing to reuse).
|
|
11
|
+
*/
|
|
12
|
+
stepHydrationCache?: StepHydrationCache): Promise<Uint8Array | unknown>;
|
|
4
13
|
//# sourceMappingURL=workflow.d.ts.map
|
package/dist/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAYjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAyDpE,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,KAAK,EAAE,EACf,aAAa,EAAE,SAAS,GAAG,SAAS;AACpC;;;;;;GAMG;AACH,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAqsB/B"}
|