@n8n/expression-runtime 0.3.0 → 0.5.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/README.md +3 -3
- package/dist/bundle/runtime.esm.js +17 -17
- package/dist/bundle/runtime.esm.js.map +4 -4
- package/dist/bundle/runtime.iife.js +17 -17
- package/dist/bundle/runtime.iife.js.map +4 -4
- package/dist/{bridge → cjs/bridge}/isolated-vm-bridge.d.ts +3 -2
- package/dist/cjs/bridge/isolated-vm-bridge.d.ts.map +1 -0
- package/dist/cjs/bridge/isolated-vm-bridge.js +512 -0
- package/dist/cjs/bridge/isolated-vm-bridge.js.map +1 -0
- package/dist/cjs/build.tsbuildinfo +1 -0
- package/dist/cjs/evaluator/expression-evaluator.d.ts +23 -0
- package/dist/cjs/evaluator/expression-evaluator.d.ts.map +1 -0
- package/dist/cjs/evaluator/expression-evaluator.js +89 -0
- package/dist/cjs/evaluator/expression-evaluator.js.map +1 -0
- package/dist/cjs/extensions/array-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/array-extensions.js +637 -0
- package/dist/cjs/extensions/array-extensions.js.map +1 -0
- package/dist/cjs/extensions/boolean-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/boolean-extensions.js +49 -0
- package/dist/cjs/extensions/boolean-extensions.js.map +1 -0
- package/dist/cjs/extensions/date-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/date-extensions.js +528 -0
- package/dist/cjs/extensions/date-extensions.js.map +1 -0
- package/dist/cjs/extensions/expression-extension-error.d.ts.map +1 -0
- package/dist/cjs/extensions/expression-extension-error.js +25 -0
- package/dist/cjs/extensions/expression-extension-error.js.map +1 -0
- package/dist/cjs/extensions/extend.d.ts.map +1 -0
- package/dist/cjs/extensions/extend.js +149 -0
- package/dist/cjs/extensions/extend.js.map +1 -0
- package/dist/cjs/extensions/extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/extensions.js +13 -0
- package/dist/cjs/extensions/extensions.js.map +1 -0
- package/dist/cjs/extensions/function-extensions.d.ts +28 -0
- package/dist/cjs/extensions/function-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/function-extensions.js +92 -0
- package/dist/cjs/extensions/function-extensions.js.map +1 -0
- package/dist/cjs/extensions/number-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/number-extensions.js +244 -0
- package/dist/cjs/extensions/number-extensions.js.map +1 -0
- package/dist/cjs/extensions/object-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/object-extensions.js +305 -0
- package/dist/cjs/extensions/object-extensions.js.map +1 -0
- package/dist/cjs/extensions/string-extensions.d.ts.map +1 -0
- package/dist/cjs/extensions/string-extensions.js +790 -0
- package/dist/cjs/extensions/string-extensions.js.map +1 -0
- package/dist/cjs/extensions/utils.d.ts.map +1 -0
- package/dist/cjs/extensions/utils.js +42 -0
- package/dist/cjs/extensions/utils.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/runtime/index.d.ts +34 -0
- package/dist/cjs/runtime/index.d.ts.map +1 -0
- package/dist/cjs/runtime/index.js +39 -0
- package/dist/cjs/runtime/index.js.map +1 -0
- package/dist/{runtime → cjs/runtime}/lazy-proxy.d.ts +4 -0
- package/dist/cjs/runtime/lazy-proxy.d.ts.map +1 -0
- package/dist/cjs/runtime/lazy-proxy.js +179 -0
- package/dist/cjs/runtime/lazy-proxy.js.map +1 -0
- package/dist/{runtime → cjs/runtime}/reset.d.ts +1 -1
- package/dist/cjs/runtime/reset.d.ts.map +1 -0
- package/dist/cjs/runtime/reset.js +157 -0
- package/dist/cjs/runtime/reset.js.map +1 -0
- package/dist/cjs/runtime/safe-globals.d.ts.map +1 -0
- package/dist/cjs/runtime/safe-globals.js +125 -0
- package/dist/cjs/runtime/safe-globals.js.map +1 -0
- package/dist/cjs/runtime/serialize.d.ts +19 -0
- package/dist/cjs/runtime/serialize.d.ts.map +1 -0
- package/dist/cjs/runtime/serialize.js +67 -0
- package/dist/cjs/runtime/serialize.js.map +1 -0
- package/dist/{types → cjs/types}/bridge.d.ts +11 -1
- package/dist/cjs/types/bridge.d.ts.map +1 -0
- package/dist/cjs/types/bridge.js +26 -0
- package/dist/cjs/types/bridge.js.map +1 -0
- package/dist/{types → cjs/types}/evaluator.d.ts +6 -7
- package/dist/cjs/types/evaluator.d.ts.map +1 -0
- package/dist/cjs/types/evaluator.js +47 -0
- package/dist/cjs/types/evaluator.js.map +1 -0
- package/dist/{types → cjs/types}/index.d.ts +3 -2
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +30 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/runtime.d.ts.map +1 -0
- package/dist/cjs/types/runtime.js +39 -0
- package/dist/cjs/types/runtime.js.map +1 -0
- package/dist/esm/bridge/isolated-vm-bridge.d.ts +133 -0
- package/dist/esm/bridge/isolated-vm-bridge.d.ts.map +1 -0
- package/dist/{bridge → esm/bridge}/isolated-vm-bridge.js +62 -24
- package/dist/esm/bridge/isolated-vm-bridge.js.map +1 -0
- package/dist/esm/build.tsbuildinfo +1 -0
- package/dist/esm/evaluator/expression-evaluator.d.ts +23 -0
- package/dist/esm/evaluator/expression-evaluator.d.ts.map +1 -0
- package/dist/esm/evaluator/expression-evaluator.js +75 -0
- package/dist/esm/evaluator/expression-evaluator.js.map +1 -0
- package/dist/esm/extensions/array-extensions.d.ts +34 -0
- package/dist/esm/extensions/array-extensions.d.ts.map +1 -0
- package/dist/{extensions → esm/extensions}/array-extensions.js +6 -1
- package/dist/esm/extensions/array-extensions.js.map +1 -0
- package/dist/esm/extensions/boolean-extensions.d.ts +6 -0
- package/dist/esm/extensions/boolean-extensions.d.ts.map +1 -0
- package/dist/esm/extensions/boolean-extensions.js.map +1 -0
- package/dist/esm/extensions/date-extensions.d.ts +3 -0
- package/dist/esm/extensions/date-extensions.d.ts.map +1 -0
- package/dist/esm/extensions/date-extensions.js.map +1 -0
- package/dist/esm/extensions/expression-extension-error.d.ts +7 -0
- package/dist/esm/extensions/expression-extension-error.d.ts.map +1 -0
- package/dist/esm/extensions/expression-extension-error.js.map +1 -0
- package/dist/esm/extensions/extend.d.ts +12 -0
- package/dist/esm/extensions/extend.d.ts.map +1 -0
- package/dist/esm/extensions/extend.js.map +1 -0
- package/dist/esm/extensions/extensions.d.ts +43 -0
- package/dist/esm/extensions/extensions.d.ts.map +1 -0
- package/dist/esm/extensions/extensions.js.map +1 -0
- package/dist/esm/extensions/function-extensions.d.ts +28 -0
- package/dist/esm/extensions/function-extensions.d.ts.map +1 -0
- package/dist/esm/extensions/function-extensions.js +79 -0
- package/dist/esm/extensions/function-extensions.js.map +1 -0
- package/dist/esm/extensions/number-extensions.d.ts +27 -0
- package/dist/esm/extensions/number-extensions.d.ts.map +1 -0
- package/dist/{extensions → esm/extensions}/number-extensions.js +10 -1
- package/dist/esm/extensions/number-extensions.js.map +1 -0
- package/dist/esm/extensions/object-extensions.d.ts +46 -0
- package/dist/esm/extensions/object-extensions.d.ts.map +1 -0
- package/dist/{extensions → esm/extensions}/object-extensions.js +9 -1
- package/dist/esm/extensions/object-extensions.js.map +1 -0
- package/dist/esm/extensions/string-extensions.d.ts +38 -0
- package/dist/esm/extensions/string-extensions.d.ts.map +1 -0
- package/dist/{extensions → esm/extensions}/string-extensions.js +41 -4
- package/dist/esm/extensions/string-extensions.js.map +1 -0
- package/dist/esm/extensions/utils.d.ts +4 -0
- package/dist/esm/extensions/utils.d.ts.map +1 -0
- package/dist/esm/extensions/utils.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/runtime/index.d.ts +34 -0
- package/dist/esm/runtime/index.d.ts.map +1 -0
- package/dist/{runtime → esm/runtime}/index.js +5 -1
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/lazy-proxy.d.ts +22 -0
- package/dist/esm/runtime/lazy-proxy.d.ts.map +1 -0
- package/dist/{runtime → esm/runtime}/lazy-proxy.js +20 -6
- package/dist/esm/runtime/lazy-proxy.js.map +1 -0
- package/dist/esm/runtime/reset.d.ts +16 -0
- package/dist/esm/runtime/reset.d.ts.map +1 -0
- package/dist/{runtime → esm/runtime}/reset.js +21 -1
- package/dist/esm/runtime/reset.js.map +1 -0
- package/dist/esm/runtime/safe-globals.d.ts +21 -0
- package/dist/esm/runtime/safe-globals.d.ts.map +1 -0
- package/dist/esm/runtime/safe-globals.js.map +1 -0
- package/dist/esm/runtime/serialize.d.ts +19 -0
- package/dist/esm/runtime/serialize.d.ts.map +1 -0
- package/dist/esm/runtime/serialize.js +54 -0
- package/dist/esm/runtime/serialize.js.map +1 -0
- package/dist/esm/types/bridge.d.ts +71 -0
- package/dist/esm/types/bridge.d.ts.map +1 -0
- package/dist/{types → esm/types}/bridge.js +6 -1
- package/dist/esm/types/bridge.js.map +1 -0
- package/dist/esm/types/evaluator.d.ts +196 -0
- package/dist/esm/types/evaluator.d.ts.map +1 -0
- package/dist/esm/types/evaluator.js.map +1 -0
- package/dist/esm/types/index.d.ts +11 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/{types → esm/types}/index.js +1 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/runtime.d.ts +20 -0
- package/dist/esm/types/runtime.d.ts.map +1 -0
- package/dist/esm/types/runtime.js.map +1 -0
- package/package.json +16 -5
- package/dist/bridge/isolated-vm-bridge.d.ts.map +0 -1
- package/dist/bridge/isolated-vm-bridge.js.map +0 -1
- package/dist/build.tsbuildinfo +0 -1
- package/dist/extensions/array-extensions.d.ts.map +0 -1
- package/dist/extensions/array-extensions.js.map +0 -1
- package/dist/extensions/boolean-extensions.d.ts.map +0 -1
- package/dist/extensions/boolean-extensions.js.map +0 -1
- package/dist/extensions/date-extensions.d.ts.map +0 -1
- package/dist/extensions/date-extensions.js.map +0 -1
- package/dist/extensions/expression-extension-error.d.ts.map +0 -1
- package/dist/extensions/expression-extension-error.js.map +0 -1
- package/dist/extensions/extend.d.ts.map +0 -1
- package/dist/extensions/extend.js.map +0 -1
- package/dist/extensions/extensions.d.ts.map +0 -1
- package/dist/extensions/extensions.js.map +0 -1
- package/dist/extensions/number-extensions.d.ts.map +0 -1
- package/dist/extensions/number-extensions.js.map +0 -1
- package/dist/extensions/object-extensions.d.ts.map +0 -1
- package/dist/extensions/object-extensions.js.map +0 -1
- package/dist/extensions/string-extensions.d.ts.map +0 -1
- package/dist/extensions/string-extensions.js.map +0 -1
- package/dist/extensions/utils.d.ts.map +0 -1
- package/dist/extensions/utils.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -17
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/lazy-proxy.d.ts.map +0 -1
- package/dist/runtime/lazy-proxy.js.map +0 -1
- package/dist/runtime/reset.d.ts.map +0 -1
- package/dist/runtime/reset.js.map +0 -1
- package/dist/runtime/safe-globals.d.ts.map +0 -1
- package/dist/runtime/safe-globals.js.map +0 -1
- package/dist/types/bridge.d.ts.map +0 -1
- package/dist/types/bridge.js.map +0 -1
- package/dist/types/evaluator.d.ts.map +0 -1
- package/dist/types/evaluator.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/runtime.d.ts.map +0 -1
- package/dist/types/runtime.js.map +0 -1
- /package/dist/{extensions → cjs/extensions}/array-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/boolean-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/date-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/expression-extension-error.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/extend.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/number-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/object-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/string-extensions.d.ts +0 -0
- /package/dist/{extensions → cjs/extensions}/utils.d.ts +0 -0
- /package/dist/{runtime → cjs/runtime}/safe-globals.d.ts +0 -0
- /package/dist/{types → cjs/types}/runtime.d.ts +0 -0
- /package/dist/{extensions → esm/extensions}/boolean-extensions.js +0 -0
- /package/dist/{extensions → esm/extensions}/date-extensions.js +0 -0
- /package/dist/{extensions → esm/extensions}/expression-extension-error.js +0 -0
- /package/dist/{extensions → esm/extensions}/extend.js +0 -0
- /package/dist/{extensions → esm/extensions}/extensions.js +0 -0
- /package/dist/{extensions → esm/extensions}/utils.js +0 -0
- /package/dist/{runtime → esm/runtime}/safe-globals.js +0 -0
- /package/dist/{types → esm/types}/evaluator.js +0 -0
- /package/dist/{types → esm/types}/runtime.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RuntimeBridge, BridgeConfig } from '../types';
|
|
1
|
+
import type { RuntimeBridge, BridgeConfig, ExecuteOptions } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* IsolatedVmBridge - Runtime bridge using isolated-vm for secure expression evaluation.
|
|
4
4
|
*
|
|
@@ -20,6 +20,7 @@ export declare class IsolatedVmBridge implements RuntimeBridge {
|
|
|
20
20
|
private valueAtPathRef?;
|
|
21
21
|
private arrayElementRef?;
|
|
22
22
|
private callFunctionRef?;
|
|
23
|
+
private resetDataProxiesRef?;
|
|
23
24
|
constructor(config?: BridgeConfig);
|
|
24
25
|
/**
|
|
25
26
|
* Initialize the isolate and create execution context.
|
|
@@ -115,7 +116,7 @@ export declare class IsolatedVmBridge implements RuntimeBridge {
|
|
|
115
116
|
* @returns Result of the expression
|
|
116
117
|
* @throws {Error} If bridge not initialized or execution fails
|
|
117
118
|
*/
|
|
118
|
-
execute(code: string, data: Record<string, unknown
|
|
119
|
+
execute(code: string, data: Record<string, unknown>, options?: ExecuteOptions): unknown;
|
|
119
120
|
/**
|
|
120
121
|
* Dispose of the isolate and free resources.
|
|
121
122
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated-vm-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/isolated-vm-bridge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAwC5E;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IACrD,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAyB;IAIvC,OAAO,CAAC,WAAW,CAAiC;IAIpD,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,eAAe,CAAC,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAgB;IAKxC,OAAO,CAAC,mBAAmB,CAAC,CAAgB;gBAEhC,MAAM,GAAE,YAAiB;IAWrC;;;;;;;;;;OAUG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCjC;;;;;;;;;;;OAWG;YACW,mBAAmB;IAoCjC;;;;;;;;OAQG;YACW,iBAAiB;IA+B/B;;;;;;;;;;;OAWG;YACW,kBAAkB;IA0BhC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,iBAAiB;IAiIzB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO;IAsDvF;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B;;;;OAIG;IACH,UAAU,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
2
|
+
if (k2 === undefined) k2 = k;
|
|
3
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(o, k2, desc);
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
13
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
14
|
+
}) : function(o, v) {
|
|
15
|
+
o["default"] = v;
|
|
16
|
+
});
|
|
17
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
18
|
+
var ownKeys = function(o) {
|
|
19
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
20
|
+
var ar = [];
|
|
21
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
22
|
+
return ar;
|
|
23
|
+
};
|
|
24
|
+
return ownKeys(o);
|
|
25
|
+
};
|
|
26
|
+
return function (mod) {
|
|
27
|
+
if (mod && mod.__esModule) return mod;
|
|
28
|
+
var result = {};
|
|
29
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
30
|
+
__setModuleDefault(result, mod);
|
|
31
|
+
return result;
|
|
32
|
+
};
|
|
33
|
+
})();
|
|
34
|
+
(function (factory) {
|
|
35
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
36
|
+
var v = factory(require, exports);
|
|
37
|
+
if (v !== undefined) module.exports = v;
|
|
38
|
+
}
|
|
39
|
+
else if (typeof define === "function" && define.amd) {
|
|
40
|
+
define(["require", "exports", "node:fs/promises", "node:path", "../types"], factory);
|
|
41
|
+
}
|
|
42
|
+
})(function (require, exports) {
|
|
43
|
+
"use strict";
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.IsolatedVmBridge = void 0;
|
|
46
|
+
const promises_1 = require("node:fs/promises");
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const types_1 = require("../types");
|
|
49
|
+
let _ivm = null;
|
|
50
|
+
function getIvm() {
|
|
51
|
+
if (!_ivm) {
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
53
|
+
_ivm = require('isolated-vm');
|
|
54
|
+
}
|
|
55
|
+
return _ivm;
|
|
56
|
+
}
|
|
57
|
+
const BUNDLE_RELATIVE_PATH = path.join('dist', 'bundle', 'runtime.iife.js');
|
|
58
|
+
/**
|
|
59
|
+
* Read the runtime IIFE bundle by walking up from `__dirname` until
|
|
60
|
+
* `dist/bundle/runtime.iife.js` is found.
|
|
61
|
+
*
|
|
62
|
+
* This works regardless of where the compiled output lives:
|
|
63
|
+
* - `src/bridge/` (vitest running against source)
|
|
64
|
+
* - `dist/cjs/bridge/` (CJS build)
|
|
65
|
+
*/
|
|
66
|
+
async function readRuntimeBundle() {
|
|
67
|
+
let dir = __dirname;
|
|
68
|
+
while (dir !== path.dirname(dir)) {
|
|
69
|
+
try {
|
|
70
|
+
return await (0, promises_1.readFile)(path.join(dir, BUNDLE_RELATIVE_PATH), 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
dir = path.dirname(dir);
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`Could not find runtime bundle (${BUNDLE_RELATIVE_PATH}) in any parent of ${__dirname}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* IsolatedVmBridge - Runtime bridge using isolated-vm for secure expression evaluation.
|
|
79
|
+
*
|
|
80
|
+
* This bridge creates a V8 isolate with:
|
|
81
|
+
* - Hard memory limit (128MB default)
|
|
82
|
+
* - No access to Node.js APIs
|
|
83
|
+
* - Timeout enforcement
|
|
84
|
+
* - Complete isolation from host process
|
|
85
|
+
*
|
|
86
|
+
* Context reuse pattern: Create isolate/context once, reset state between evaluations.
|
|
87
|
+
*/
|
|
88
|
+
class IsolatedVmBridge {
|
|
89
|
+
isolate;
|
|
90
|
+
context;
|
|
91
|
+
initialized = false;
|
|
92
|
+
disposed = false;
|
|
93
|
+
config;
|
|
94
|
+
// Script compilation cache for performance
|
|
95
|
+
// Maps expression code -> compiled ivm.Script
|
|
96
|
+
scriptCache = new Map();
|
|
97
|
+
// Active ivm.Reference callbacks — released before each re-registration
|
|
98
|
+
// to prevent reference accumulation across execute() calls
|
|
99
|
+
valueAtPathRef;
|
|
100
|
+
arrayElementRef;
|
|
101
|
+
callFunctionRef;
|
|
102
|
+
// Pre-resolved reference to resetDataProxies() inside the isolate.
|
|
103
|
+
// Using applySync on a stored reference avoids the per-call
|
|
104
|
+
// ScriptCompiler::Compile() cost that evalSync incurs.
|
|
105
|
+
resetDataProxiesRef;
|
|
106
|
+
constructor(config = {}) {
|
|
107
|
+
this.config = {
|
|
108
|
+
...types_1.DEFAULT_BRIDGE_CONFIG,
|
|
109
|
+
...config,
|
|
110
|
+
};
|
|
111
|
+
// Create isolate with memory limit
|
|
112
|
+
// Note: memoryLimit is in MB
|
|
113
|
+
this.isolate = new (getIvm().Isolate)({ memoryLimit: this.config.memoryLimit });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Initialize the isolate and create execution context.
|
|
117
|
+
*
|
|
118
|
+
* Steps:
|
|
119
|
+
* 1. Create context
|
|
120
|
+
* 2. Set up basic globals (global reference)
|
|
121
|
+
* 3. Load runtime bundle (DateTime, extend, proxy system)
|
|
122
|
+
* 4. Verify proxy system
|
|
123
|
+
*
|
|
124
|
+
* Must be called before execute().
|
|
125
|
+
*/
|
|
126
|
+
async initialize() {
|
|
127
|
+
if (this.initialized) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Create context in the isolate
|
|
131
|
+
this.context = await this.isolate.createContext();
|
|
132
|
+
// Set up basic globals
|
|
133
|
+
// jail is a reference to the context's global object
|
|
134
|
+
const jail = this.context.global;
|
|
135
|
+
// Set 'global' to reference itself (pattern from POC)
|
|
136
|
+
// This allows code in isolate to access 'global.something'
|
|
137
|
+
await jail.set('global', jail.derefInto());
|
|
138
|
+
// Load runtime bundle (DateTime, extend, SafeObject, proxy system)
|
|
139
|
+
await this.loadVendorLibraries();
|
|
140
|
+
// Verify proxy system loaded correctly
|
|
141
|
+
await this.verifyProxySystem();
|
|
142
|
+
// Inject E() error handler needed by tournament-generated try-catch code
|
|
143
|
+
await this.injectErrorHandler();
|
|
144
|
+
// Store a reference to resetDataProxies for efficient per-call invocation
|
|
145
|
+
this.resetDataProxiesRef = await this.context.global.get('resetDataProxies', {
|
|
146
|
+
reference: true,
|
|
147
|
+
});
|
|
148
|
+
this.initialized = true;
|
|
149
|
+
if (this.config.debug) {
|
|
150
|
+
console.log('[IsolatedVmBridge] Initialized successfully');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Load runtime bundle into the isolate.
|
|
155
|
+
*
|
|
156
|
+
* The runtime bundle includes:
|
|
157
|
+
* - DateTime, extend, extendOptional (expression engine globals)
|
|
158
|
+
* - SafeObject and SafeError wrappers
|
|
159
|
+
* - createDeepLazyProxy function
|
|
160
|
+
* - __data object initialization
|
|
161
|
+
*
|
|
162
|
+
* @private
|
|
163
|
+
* @throws {Error} If context not initialized or bundle loading fails
|
|
164
|
+
*/
|
|
165
|
+
async loadVendorLibraries() {
|
|
166
|
+
if (!this.context) {
|
|
167
|
+
throw new Error('Context not initialized');
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
// Load runtime bundle (includes vendor libraries + proxy system)
|
|
171
|
+
const runtimeBundle = await readRuntimeBundle();
|
|
172
|
+
// Evaluate bundle in isolate context
|
|
173
|
+
// This makes all exported globals available (DateTime, extend, extendOptional, SafeObject, SafeError, createDeepLazyProxy, resetDataProxies, __data)
|
|
174
|
+
await this.context.eval(runtimeBundle);
|
|
175
|
+
if (this.config.debug) {
|
|
176
|
+
console.log('[IsolatedVmBridge] Runtime bundle loaded');
|
|
177
|
+
}
|
|
178
|
+
// Verify vendor libraries loaded correctly
|
|
179
|
+
const hasDateTime = await this.context.eval('typeof DateTime !== "undefined"');
|
|
180
|
+
const hasExtend = await this.context.eval('typeof extend !== "undefined"');
|
|
181
|
+
if (!hasDateTime || !hasExtend) {
|
|
182
|
+
throw new Error(`Library verification failed: DateTime=${hasDateTime}, extend=${hasExtend}`);
|
|
183
|
+
}
|
|
184
|
+
if (this.config.debug) {
|
|
185
|
+
console.log('[IsolatedVmBridge] Vendor libraries verified successfully');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
190
|
+
throw new Error(`Failed to load runtime bundle: ${errorMessage}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Verify the proxy system loaded correctly.
|
|
195
|
+
*
|
|
196
|
+
* The proxy system is loaded as part of the runtime bundle in loadVendorLibraries().
|
|
197
|
+
* This method verifies all required components are available.
|
|
198
|
+
*
|
|
199
|
+
* @private
|
|
200
|
+
* @throws {Error} If context not initialized or proxy system verification fails
|
|
201
|
+
*/
|
|
202
|
+
async verifyProxySystem() {
|
|
203
|
+
if (!this.context) {
|
|
204
|
+
throw new Error('Context not initialized');
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
// Verify proxy system components loaded correctly
|
|
208
|
+
const hasProxyCreator = await this.context.eval('typeof createDeepLazyProxy !== "undefined"');
|
|
209
|
+
const hasData = await this.context.eval('typeof __data !== "undefined"');
|
|
210
|
+
const hasSafeObject = await this.context.eval('typeof SafeObject !== "undefined"');
|
|
211
|
+
const hasSafeError = await this.context.eval('typeof SafeError !== "undefined"');
|
|
212
|
+
const hasResetFunction = await this.context.eval('typeof resetDataProxies !== "undefined"');
|
|
213
|
+
if (!hasProxyCreator || !hasData || !hasSafeObject || !hasSafeError || !hasResetFunction) {
|
|
214
|
+
throw new Error(`Proxy system verification failed: ` +
|
|
215
|
+
`createDeepLazyProxy=${hasProxyCreator}, __data=${hasData}, ` +
|
|
216
|
+
`SafeObject=${hasSafeObject}, SafeError=${hasSafeError}, ` +
|
|
217
|
+
`resetDataProxies=${hasResetFunction}`);
|
|
218
|
+
}
|
|
219
|
+
if (this.config.debug) {
|
|
220
|
+
console.log('[IsolatedVmBridge] Proxy system verified successfully');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
225
|
+
throw new Error(`Failed to verify proxy system: ${errorMessage}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Inject the E() error handler into the isolate context.
|
|
230
|
+
*
|
|
231
|
+
* Tournament wraps expressions with try-catch that calls E(error, this).
|
|
232
|
+
* This handler:
|
|
233
|
+
* - Re-throws security violations from __sanitize
|
|
234
|
+
* - Swallows TypeErrors (failed attack attempts return undefined)
|
|
235
|
+
* - Re-throws all other errors
|
|
236
|
+
*
|
|
237
|
+
* @private
|
|
238
|
+
* @throws {Error} If context not initialized
|
|
239
|
+
*/
|
|
240
|
+
async injectErrorHandler() {
|
|
241
|
+
if (!this.context) {
|
|
242
|
+
throw new Error('Context not initialized');
|
|
243
|
+
}
|
|
244
|
+
await this.context.eval(`
|
|
245
|
+
if (typeof E === 'undefined') {
|
|
246
|
+
globalThis.E = function(error, _context) {
|
|
247
|
+
// Re-throw security violations from __sanitize
|
|
248
|
+
if (error && error.message && error.message.includes('due to security concerns')) {
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
// Swallow TypeErrors (failed attack attempts return undefined)
|
|
252
|
+
if (error instanceof TypeError) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
throw error;
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
`);
|
|
259
|
+
if (this.config.debug) {
|
|
260
|
+
console.log('[IsolatedVmBridge] Error handler injected successfully');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Reset data proxies in the isolate context.
|
|
265
|
+
*
|
|
266
|
+
* This method should be called before each execute() to:
|
|
267
|
+
* 1. Clear proxy caches from previous evaluations
|
|
268
|
+
* 2. Initialize fresh workflow data references
|
|
269
|
+
* 3. Expose workflow properties to globalThis
|
|
270
|
+
*
|
|
271
|
+
* The reset function runs in the isolate and calls back to the host
|
|
272
|
+
* via ivm.Reference callbacks to fetch workflow data.
|
|
273
|
+
*
|
|
274
|
+
* @private
|
|
275
|
+
* @throws {Error} If context not initialized or reset fails
|
|
276
|
+
*/
|
|
277
|
+
resetDataProxies(timezone) {
|
|
278
|
+
if (!this.resetDataProxiesRef) {
|
|
279
|
+
throw new Error('Context not initialized');
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
this.resetDataProxiesRef.applySync(null, [timezone ?? null], {
|
|
283
|
+
arguments: { copy: true },
|
|
284
|
+
});
|
|
285
|
+
if (this.config.debug) {
|
|
286
|
+
console.log('[IsolatedVmBridge] Data proxies reset successfully');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
291
|
+
throw new Error(`Failed to reset data proxies: ${errorMessage}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Register callback functions for cross-isolate communication.
|
|
296
|
+
*
|
|
297
|
+
* Creates three ivm.Reference callbacks that the runtime bundle uses
|
|
298
|
+
* to fetch data from the host process:
|
|
299
|
+
*
|
|
300
|
+
* - __getValueAtPath: Returns metadata or primitive for a property path
|
|
301
|
+
* - __getArrayElement: Returns individual array elements
|
|
302
|
+
* - __callFunctionAtPath: Executes functions in host context
|
|
303
|
+
*
|
|
304
|
+
* These callbacks are called synchronously from isolate proxy traps.
|
|
305
|
+
*
|
|
306
|
+
* @param data - Current workflow data to use for callback responses
|
|
307
|
+
* @private
|
|
308
|
+
*/
|
|
309
|
+
registerCallbacks(data) {
|
|
310
|
+
if (!this.context) {
|
|
311
|
+
throw new Error('Context not initialized');
|
|
312
|
+
}
|
|
313
|
+
// Callback 1: Get value/metadata at path
|
|
314
|
+
// Used by createDeepLazyProxy when accessing properties
|
|
315
|
+
const getValueAtPath = new (getIvm().Reference)((path) => {
|
|
316
|
+
// Navigate to value
|
|
317
|
+
let value = data;
|
|
318
|
+
for (const key of path) {
|
|
319
|
+
value = value?.[key];
|
|
320
|
+
if (value === undefined || value === null) {
|
|
321
|
+
return value;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Handle functions - return metadata marker
|
|
325
|
+
if (typeof value === 'function') {
|
|
326
|
+
const fnString = value.toString();
|
|
327
|
+
// Block native functions for security
|
|
328
|
+
if (fnString.includes('[native code]')) {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
return { __isFunction: true, __name: path[path.length - 1] };
|
|
332
|
+
}
|
|
333
|
+
// Handle arrays - always lazy, only transfer length
|
|
334
|
+
if (Array.isArray(value)) {
|
|
335
|
+
return {
|
|
336
|
+
__isArray: true,
|
|
337
|
+
__length: value.length,
|
|
338
|
+
__data: null,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
// Handle objects - return metadata with keys
|
|
342
|
+
if (value !== null && typeof value === 'object') {
|
|
343
|
+
return {
|
|
344
|
+
__isObject: true,
|
|
345
|
+
__keys: Object.keys(value),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
// Primitive value
|
|
349
|
+
return value;
|
|
350
|
+
});
|
|
351
|
+
// Callback 2: Get array element at index
|
|
352
|
+
// Used by array proxy when accessing numeric indices
|
|
353
|
+
const getArrayElement = new (getIvm().Reference)((path, index) => {
|
|
354
|
+
// Navigate to array
|
|
355
|
+
let arr = data;
|
|
356
|
+
for (const key of path) {
|
|
357
|
+
arr = arr?.[key];
|
|
358
|
+
if (arr === undefined || arr === null) {
|
|
359
|
+
return undefined;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (!Array.isArray(arr)) {
|
|
363
|
+
return undefined;
|
|
364
|
+
}
|
|
365
|
+
const element = arr[index];
|
|
366
|
+
// If element is object/array, return metadata
|
|
367
|
+
if (element !== null && typeof element === 'object') {
|
|
368
|
+
if (Array.isArray(element)) {
|
|
369
|
+
return {
|
|
370
|
+
__isArray: true,
|
|
371
|
+
__length: element.length,
|
|
372
|
+
__data: null,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
__isObject: true,
|
|
377
|
+
__keys: Object.keys(element),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// Primitive element
|
|
381
|
+
return element;
|
|
382
|
+
});
|
|
383
|
+
// Callback 3: Call function at path with arguments
|
|
384
|
+
// Used when expressions invoke functions from workflow data
|
|
385
|
+
const callFunctionAtPath = new (getIvm().Reference)((path, ...args) => {
|
|
386
|
+
// Navigate to function, tracking parent to preserve `this` context
|
|
387
|
+
let fn = data;
|
|
388
|
+
let parent = undefined;
|
|
389
|
+
for (const key of path) {
|
|
390
|
+
parent = fn;
|
|
391
|
+
fn = fn?.[key];
|
|
392
|
+
}
|
|
393
|
+
if (typeof fn !== 'function') {
|
|
394
|
+
throw new Error(`${path.join('.')} is not a function`);
|
|
395
|
+
}
|
|
396
|
+
// Block native functions for security (same check as getValueAtPath)
|
|
397
|
+
if (fn.toString().includes('[native code]')) {
|
|
398
|
+
throw new Error(`${path.join('.')} is a native function and cannot be called`);
|
|
399
|
+
}
|
|
400
|
+
// Execute function with parent as `this` to preserve method context
|
|
401
|
+
return fn.call(parent, ...args);
|
|
402
|
+
});
|
|
403
|
+
// Release previous references before replacing to avoid accumulation
|
|
404
|
+
this.valueAtPathRef?.release();
|
|
405
|
+
this.arrayElementRef?.release();
|
|
406
|
+
this.callFunctionRef?.release();
|
|
407
|
+
// Store references so they can be released on the next call or on dispose()
|
|
408
|
+
this.valueAtPathRef = getValueAtPath;
|
|
409
|
+
this.arrayElementRef = getArrayElement;
|
|
410
|
+
this.callFunctionRef = callFunctionAtPath;
|
|
411
|
+
// Register all callbacks in isolate global context
|
|
412
|
+
this.context.global.setSync('__getValueAtPath', getValueAtPath);
|
|
413
|
+
this.context.global.setSync('__getArrayElement', getArrayElement);
|
|
414
|
+
this.context.global.setSync('__callFunctionAtPath', callFunctionAtPath);
|
|
415
|
+
if (this.config.debug) {
|
|
416
|
+
console.log('[IsolatedVmBridge] Callbacks registered successfully');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Execute JavaScript code in the isolated context.
|
|
421
|
+
*
|
|
422
|
+
* Flow:
|
|
423
|
+
* 1. Register callbacks as ivm.Reference for cross-isolate communication
|
|
424
|
+
* 2. Call resetDataProxies() to initialize workflow data proxies
|
|
425
|
+
* 3. Compile script (with caching for performance)
|
|
426
|
+
* 4. Execute with timeout enforcement
|
|
427
|
+
* 5. Return result (copied from isolate)
|
|
428
|
+
*
|
|
429
|
+
* @param code - JavaScript expression to evaluate
|
|
430
|
+
* @param data - Workflow data (e.g., { $json: {...}, $runIndex: 0 })
|
|
431
|
+
* @returns Result of the expression
|
|
432
|
+
* @throws {Error} If bridge not initialized or execution fails
|
|
433
|
+
*/
|
|
434
|
+
execute(code, data, options) {
|
|
435
|
+
if (!this.initialized || !this.context) {
|
|
436
|
+
throw new Error('Bridge not initialized. Call initialize() first.');
|
|
437
|
+
}
|
|
438
|
+
try {
|
|
439
|
+
// Step 1: Register callbacks with current data context
|
|
440
|
+
this.registerCallbacks(data);
|
|
441
|
+
// Step 2: Reset proxies for this evaluation
|
|
442
|
+
// This initializes $json, $binary, etc. as lazy proxies
|
|
443
|
+
this.resetDataProxies(options?.timezone);
|
|
444
|
+
// Step 3: Wrap transformed code so 'this' === __data in the isolate.
|
|
445
|
+
// Tournament generates: this.$json.email, this.$items(), etc.
|
|
446
|
+
// __data has $json, $items, etc. as lazy proxies (set in resetDataProxies).
|
|
447
|
+
const wrappedCode = `(function() { var __result = (function() {\n${code}\n}).call(__data); return __prepareForTransfer(__result); })()`;
|
|
448
|
+
let script = this.scriptCache.get(code);
|
|
449
|
+
if (!script) {
|
|
450
|
+
script = this.isolate.compileScriptSync(wrappedCode);
|
|
451
|
+
this.scriptCache.set(code, script);
|
|
452
|
+
if (this.config.debug) {
|
|
453
|
+
console.log('[IsolatedVmBridge] Script compiled and cached');
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
// Step 4: Execute with timeout and copy result back
|
|
457
|
+
const result = script.runSync(this.context, {
|
|
458
|
+
timeout: this.config.timeout,
|
|
459
|
+
copy: true,
|
|
460
|
+
});
|
|
461
|
+
if (this.config.debug) {
|
|
462
|
+
console.log('[IsolatedVmBridge] Expression executed successfully');
|
|
463
|
+
}
|
|
464
|
+
return result;
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
468
|
+
if (errorMessage.includes('Script execution timed out')) {
|
|
469
|
+
throw new types_1.TimeoutError(`Expression timed out after ${this.config.timeout}ms`, {});
|
|
470
|
+
}
|
|
471
|
+
if (errorMessage.includes('memory limit')) {
|
|
472
|
+
throw new types_1.MemoryLimitError(`Expression exceeded memory limit of ${this.config.memoryLimit}MB`, {});
|
|
473
|
+
}
|
|
474
|
+
throw new Error(`Expression evaluation failed: ${errorMessage}`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Dispose of the isolate and free resources.
|
|
479
|
+
*
|
|
480
|
+
* After disposal, the bridge cannot be used again.
|
|
481
|
+
*/
|
|
482
|
+
async dispose() {
|
|
483
|
+
if (this.disposed) {
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
// Dispose isolate (this also disposes all contexts, references, etc.)
|
|
487
|
+
if (!this.isolate.isDisposed) {
|
|
488
|
+
this.isolate.dispose();
|
|
489
|
+
}
|
|
490
|
+
// Release callback references
|
|
491
|
+
this.valueAtPathRef?.release();
|
|
492
|
+
this.arrayElementRef?.release();
|
|
493
|
+
this.callFunctionRef?.release();
|
|
494
|
+
this.disposed = true;
|
|
495
|
+
this.initialized = false;
|
|
496
|
+
this.scriptCache.clear();
|
|
497
|
+
if (this.config.debug) {
|
|
498
|
+
console.log('[IsolatedVmBridge] Disposed');
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Check if the bridge has been disposed.
|
|
503
|
+
*
|
|
504
|
+
* @returns true if disposed, false otherwise
|
|
505
|
+
*/
|
|
506
|
+
isDisposed() {
|
|
507
|
+
return this.disposed;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
exports.IsolatedVmBridge = IsolatedVmBridge;
|
|
511
|
+
});
|
|
512
|
+
//# sourceMappingURL=isolated-vm-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated-vm-bridge.js","sourceRoot":"","sources":["../../../src/bridge/isolated-vm-bridge.ts"],"names":[],"mappings":"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"}
|