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