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