@n8n/expression-runtime 0.36.0 → 0.37.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 +2 -1
- package/dist/bundle/runtime.esm.js +1 -1
- package/dist/bundle/runtime.esm.js.map +3 -3
- package/dist/bundle/runtime.iife.js +1 -1
- package/dist/bundle/runtime.iife.js.map +3 -3
- package/dist/cjs/bridge/isolated-vm-bridge.d.ts +0 -3
- package/dist/cjs/bridge/isolated-vm-bridge.d.ts.map +1 -1
- package/dist/cjs/bridge/isolated-vm-bridge.js +21 -14
- package/dist/cjs/bridge/isolated-vm-bridge.js.map +1 -1
- package/dist/cjs/bridge/quickjs-bridge.d.ts +33 -0
- package/dist/cjs/bridge/quickjs-bridge.d.ts.map +1 -1
- package/dist/cjs/bridge/quickjs-bridge.js +183 -27
- package/dist/cjs/bridge/quickjs-bridge.js.map +1 -1
- package/dist/cjs/build.tsbuildinfo +1 -1
- package/dist/cjs/extensions/array-extensions.d.ts.map +1 -1
- package/dist/cjs/extensions/array-extensions.js +26 -12
- package/dist/cjs/extensions/array-extensions.js.map +1 -1
- package/dist/esm/bridge/isolated-vm-bridge.d.ts +0 -3
- package/dist/esm/bridge/isolated-vm-bridge.d.ts.map +1 -1
- package/dist/esm/bridge/isolated-vm-bridge.js +21 -14
- package/dist/esm/bridge/isolated-vm-bridge.js.map +1 -1
- package/dist/esm/bridge/quickjs-bridge.d.ts +33 -0
- package/dist/esm/bridge/quickjs-bridge.d.ts.map +1 -1
- package/dist/esm/bridge/quickjs-bridge.js +183 -27
- package/dist/esm/bridge/quickjs-bridge.js.map +1 -1
- package/dist/esm/build.tsbuildinfo +1 -1
- package/dist/esm/extensions/array-extensions.d.ts.map +1 -1
- package/dist/esm/extensions/array-extensions.js +26 -12
- package/dist/esm/extensions/array-extensions.js.map +1 -1
- package/package.json +3 -3
|
@@ -82,7 +82,6 @@ export declare class IsolatedVmBridge implements RuntimeBridge {
|
|
|
82
82
|
* for navigation and guard semantics); errors are caught and returned
|
|
83
83
|
* as sentinels instead of crossing the isolate boundary.
|
|
84
84
|
*
|
|
85
|
-
* @param data - Current workflow data to use for callback responses
|
|
86
85
|
* @private
|
|
87
86
|
*/
|
|
88
87
|
private createGetValueAtPathRef;
|
|
@@ -93,7 +92,6 @@ export declare class IsolatedVmBridge implements RuntimeBridge {
|
|
|
93
92
|
* for navigation and guard semantics); errors are caught and returned
|
|
94
93
|
* as sentinels instead of crossing the isolate boundary.
|
|
95
94
|
*
|
|
96
|
-
* @param data - Current workflow data to use for callback responses
|
|
97
95
|
* @private
|
|
98
96
|
*/
|
|
99
97
|
private createGetArrayElementRef;
|
|
@@ -111,7 +109,6 @@ export declare class IsolatedVmBridge implements RuntimeBridge {
|
|
|
111
109
|
* not isolated-vm objects (`Reference`/`ExternalCopy`) or other
|
|
112
110
|
* non-cloneable values.
|
|
113
111
|
*
|
|
114
|
-
* @param data - Current workflow data
|
|
115
112
|
* @private
|
|
116
113
|
*/
|
|
117
114
|
private createCallHostRef;
|
|
@@ -1 +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,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
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,YAAY,EAAE,MAAM,UAAU,CAAC;AAwH1F;;;;;;;;;;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;IACvC,OAAO,CAAC,MAAM,CAAmC;IAEjD,YAAY,MAAM,GAAE,YAAiB,EAUpC;IAED;;;;;;;;;;OAUG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhC;IAED;;;;;;;;;;;OAWG;YACW,mBAAmB;IA8BjC;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,kBAAkB;IAUhC;;;;;;OAMG;IACH,cAAc,IAAI,IAAI,CAgCrB;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAkH3E;IAED;;;OAGG;IACH,OAAO,CAAC,YAAY;IASpB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAc7B;IAED;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAEpB;CACD"}
|
|
@@ -121,6 +121,11 @@ function loadRuntimeBundle() {
|
|
|
121
121
|
}
|
|
122
122
|
throw new Error(`Could not find runtime bundle (${BUNDLE_RELATIVE_PATH}) in any parent of ${__dirname}`);
|
|
123
123
|
}
|
|
124
|
+
function heldData(holder) {
|
|
125
|
+
if (!holder.data)
|
|
126
|
+
throw new Error('Host callback called after its expression finished');
|
|
127
|
+
return holder.data;
|
|
128
|
+
}
|
|
124
129
|
/**
|
|
125
130
|
* IsolatedVmBridge - Runtime bridge using isolated-vm for secure expression evaluation.
|
|
126
131
|
*
|
|
@@ -290,13 +295,12 @@ class IsolatedVmBridge {
|
|
|
290
295
|
* for navigation and guard semantics); errors are caught and returned
|
|
291
296
|
* as sentinels instead of crossing the isolate boundary.
|
|
292
297
|
*
|
|
293
|
-
* @param data - Current workflow data to use for callback responses
|
|
294
298
|
* @private
|
|
295
299
|
*/
|
|
296
|
-
createGetValueAtPathRef(
|
|
300
|
+
createGetValueAtPathRef(holder) {
|
|
297
301
|
return new (getIvm().Callback)((pathArr) => {
|
|
298
302
|
try {
|
|
299
|
-
return (0, host_functions_1.getValueAtPath)(
|
|
303
|
+
return (0, host_functions_1.getValueAtPath)(heldData(holder), pathArr);
|
|
300
304
|
}
|
|
301
305
|
catch (err) {
|
|
302
306
|
return (0, host_functions_1.serializeError)(err);
|
|
@@ -310,13 +314,12 @@ class IsolatedVmBridge {
|
|
|
310
314
|
* for navigation and guard semantics); errors are caught and returned
|
|
311
315
|
* as sentinels instead of crossing the isolate boundary.
|
|
312
316
|
*
|
|
313
|
-
* @param data - Current workflow data to use for callback responses
|
|
314
317
|
* @private
|
|
315
318
|
*/
|
|
316
|
-
createGetArrayElementRef(
|
|
319
|
+
createGetArrayElementRef(holder) {
|
|
317
320
|
return new (getIvm().Callback)((pathArr, index) => {
|
|
318
321
|
try {
|
|
319
|
-
return (0, host_functions_1.getArrayElement)(
|
|
322
|
+
return (0, host_functions_1.getArrayElement)(heldData(holder), pathArr, index);
|
|
320
323
|
}
|
|
321
324
|
catch (err) {
|
|
322
325
|
return (0, host_functions_1.serializeError)(err);
|
|
@@ -337,13 +340,12 @@ class IsolatedVmBridge {
|
|
|
337
340
|
* not isolated-vm objects (`Reference`/`ExternalCopy`) or other
|
|
338
341
|
* non-cloneable values.
|
|
339
342
|
*
|
|
340
|
-
* @param data - Current workflow data
|
|
341
343
|
* @private
|
|
342
344
|
*/
|
|
343
|
-
createCallHostRef(
|
|
345
|
+
createCallHostRef(holder) {
|
|
344
346
|
return new (getIvm().Callback)((rawMsg) => {
|
|
345
347
|
try {
|
|
346
|
-
return (0, host_functions_1.dispatchHostCall)(rawMsg,
|
|
348
|
+
return (0, host_functions_1.dispatchHostCall)(rawMsg, heldData(holder));
|
|
347
349
|
}
|
|
348
350
|
catch (err) {
|
|
349
351
|
return (0, host_functions_1.serializeError)(err);
|
|
@@ -393,11 +395,13 @@ class IsolatedVmBridge {
|
|
|
393
395
|
}
|
|
394
396
|
// Host callbacks are ivm.Callback instances: inside the isolate they
|
|
395
397
|
// arrive as plain functions with structured-clone marshaling, so the
|
|
396
|
-
// runtime invokes them directly.
|
|
397
|
-
//
|
|
398
|
-
|
|
399
|
-
const
|
|
400
|
-
const
|
|
398
|
+
// runtime invokes them directly. isolated-vm frees a callback only at the
|
|
399
|
+
// next isolated-vm call in the process, even after the isolate is disposed.
|
|
400
|
+
// So the callbacks read the data from a holder that `finally` clears.
|
|
401
|
+
const holder = { data };
|
|
402
|
+
const getValueAtPath = this.createGetValueAtPathRef(holder);
|
|
403
|
+
const getArrayElement = this.createGetArrayElementRef(holder);
|
|
404
|
+
const callHost = this.createCallHostRef(holder);
|
|
401
405
|
try {
|
|
402
406
|
const timezone = options?.timezone ? safeStringify(options.timezone) : 'undefined';
|
|
403
407
|
// Wrap transformed code so 'this' === the closure-scoped context.
|
|
@@ -465,6 +469,9 @@ try {
|
|
|
465
469
|
}
|
|
466
470
|
throw new Error(`Expression evaluation failed: ${errorMessage}`);
|
|
467
471
|
}
|
|
472
|
+
finally {
|
|
473
|
+
holder.data = undefined;
|
|
474
|
+
}
|
|
468
475
|
}
|
|
469
476
|
/**
|
|
470
477
|
* Always names the configured limit, never the reduced budget a nested call
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolated-vm-bridge.js","sourceRoot":"","sources":["../../../src/bridge/isolated-vm-bridge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"isolated-vm-bridge.js","sourceRoot":"","sources":["../../../src/bridge/isolated-vm-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,10 +14,21 @@ import type { RuntimeBridge, BridgeConfig, ExecuteOptions, WorkflowData } from '
|
|
|
14
14
|
* the host callback functions directly.
|
|
15
15
|
*/
|
|
16
16
|
export declare class QuickJsBridge implements RuntimeBridge {
|
|
17
|
+
private wasm;
|
|
17
18
|
private runtime;
|
|
18
19
|
private vm;
|
|
19
20
|
private initialized;
|
|
20
21
|
private disposed;
|
|
22
|
+
/**
|
|
23
|
+
* Set when a host error escapes a call into the runtime, for example V8
|
|
24
|
+
* running out of native stack in deep recursion. QuickJS reports its own
|
|
25
|
+
* errors as results, so an escaped error means that the unwind skipped
|
|
26
|
+
* QuickJS cleanup. The runtime is not used again, and execute() builds a new
|
|
27
|
+
* one on a new module.
|
|
28
|
+
*/
|
|
29
|
+
private broken;
|
|
30
|
+
/** The bundle that the runtime loaded. A rebuild loads it again. */
|
|
31
|
+
private runtimeBundle;
|
|
21
32
|
private config;
|
|
22
33
|
private logger;
|
|
23
34
|
private intlHandles;
|
|
@@ -103,6 +114,28 @@ export declare class QuickJsBridge implements RuntimeBridge {
|
|
|
103
114
|
* 4. Reconstruct error sentinels into real Errors
|
|
104
115
|
*/
|
|
105
116
|
execute(code: string, data: WorkflowData, options?: ExecuteOptions): unknown;
|
|
117
|
+
/**
|
|
118
|
+
* Run the wrapped code and give back its outcome as host values. QuickJS
|
|
119
|
+
* reports guest errors as results, so a throw from here is a host error.
|
|
120
|
+
*/
|
|
121
|
+
private runInGuest;
|
|
122
|
+
/**
|
|
123
|
+
* Build a new runtime in place of a broken one, so that the caller that holds
|
|
124
|
+
* this bridge can go on. The runtime goes on the current module, which is
|
|
125
|
+
* never the retired one.
|
|
126
|
+
*/
|
|
127
|
+
private rebuildRuntime;
|
|
128
|
+
/**
|
|
129
|
+
* Free the runtime of a failed rebuild. It ran no guest call, so it can
|
|
130
|
+
* usually be freed. If the free aborts, the module is unusable.
|
|
131
|
+
*/
|
|
132
|
+
private discardFailedRuntime;
|
|
133
|
+
/**
|
|
134
|
+
* Drop a broken runtime without freeing it. JS_FreeRuntime asserts that no
|
|
135
|
+
* objects are left, and the unwind left some, so a free aborts the module.
|
|
136
|
+
* The memory is released when the module is garbage collected.
|
|
137
|
+
*/
|
|
138
|
+
private abandonRuntime;
|
|
106
139
|
/**
|
|
107
140
|
* Always names the configured limit, never the reduced budget a nested call
|
|
108
141
|
* ran on — reporting "timed out after 137ms" would misstate the limit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quickjs-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/quickjs-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"quickjs-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/quickjs-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAU,YAAY,EAAE,MAAM,UAAU,CAAC;AAgelG;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,aAAa;IAClD,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,OAAO,CAA0D;IACzE,OAAO,CAAC,EAAE,CAA0D;IACpE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB,oEAAoE;IACpE,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAmC;IAGjD,OAAO,CAAC,WAAW,CAAyD;IAM5E,OAAO,CAAC,kBAAkB,CAAsC;IAMhE,OAAO,CAAC,SAAS,CAAgB;IAEjC,YAAY,MAAM,GAAE,YAAiB,EAMpC;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhC;IAED;;;;;OAKG;IACH,cAAc,IAAI,IAAI,CAgBrB;IAED,4EAA4E;IAC5E,OAAO,CAAC,YAAY;IA0CpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqM1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAoCpB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAqK7B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,iBAAiB;IA0BzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,qBAAqB;IAyC7B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAqChC;;;;;;;;OAQG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CA0I3E;IAED;;;OAGG;IACH,OAAO,CAAC,UAAU;IA2BlB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAyBtB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAUtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,eAAe;IAcjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB7B;IAED,UAAU,IAAI,OAAO,CAEpB;CACD"}
|
|
@@ -43,11 +43,13 @@ const transfer_1 = require("../runtime/transfer");
|
|
|
43
43
|
const host_functions_1 = require("./host-functions");
|
|
44
44
|
let _quickjs = null;
|
|
45
45
|
/**
|
|
46
|
-
* The instantiated WASM module, cached after the first
|
|
47
|
-
* Creating runtimes/contexts from it is synchronous, so
|
|
48
|
-
* (pool warmup does this) initializeSync() can build a
|
|
46
|
+
* The instantiated WASM module that new bridges use, cached after the first
|
|
47
|
+
* async initialize(). Creating runtimes/contexts from it is synchronous, so
|
|
48
|
+
* once it is cached (pool warmup does this) initializeSync() can build a
|
|
49
|
+
* bridge on demand. retireQuickJSWasm() replaces it.
|
|
49
50
|
*/
|
|
50
51
|
let _quickjsWasm = null;
|
|
52
|
+
let _quickjsWasmLoading = null;
|
|
51
53
|
/** Runtime bundle source, read once per process by loadRuntimeBundle(). */
|
|
52
54
|
let _runtimeBundle = null;
|
|
53
55
|
async function getQuickJSModule() {
|
|
@@ -56,6 +58,40 @@ async function getQuickJSModule() {
|
|
|
56
58
|
}
|
|
57
59
|
return _quickjs;
|
|
58
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Our own module instance, not the library's getQuickJS() singleton: that one
|
|
63
|
+
* cannot be replaced after it is retired.
|
|
64
|
+
*/
|
|
65
|
+
async function loadQuickJSWasm() {
|
|
66
|
+
if (_quickjsWasm)
|
|
67
|
+
return _quickjsWasm;
|
|
68
|
+
_quickjsWasmLoading ??= getQuickJSModule()
|
|
69
|
+
.then(async ({ newQuickJSWASMModule }) => await newQuickJSWASMModule())
|
|
70
|
+
.then((wasm) => {
|
|
71
|
+
_quickjsWasm = wasm;
|
|
72
|
+
return wasm;
|
|
73
|
+
})
|
|
74
|
+
.finally(() => {
|
|
75
|
+
_quickjsWasmLoading = null;
|
|
76
|
+
});
|
|
77
|
+
return await _quickjsWasmLoading;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stop building runtimes on a module that a host error unwound through. The
|
|
81
|
+
* unwind skips the code that restores the module's stack pointer, and all
|
|
82
|
+
* runtimes in the module share that stack. Runtimes that already exist keep
|
|
83
|
+
* their stack limit, but a new one would take its limit from the lowered
|
|
84
|
+
* pointer and could write past the end of the stack.
|
|
85
|
+
*/
|
|
86
|
+
function retireQuickJSWasm(wasm, logger) {
|
|
87
|
+
if (_quickjsWasm !== wasm)
|
|
88
|
+
return;
|
|
89
|
+
_quickjsWasm = null;
|
|
90
|
+
// Load the replacement now, so that the next initializeSync() finds it.
|
|
91
|
+
loadQuickJSWasm().catch((error) => {
|
|
92
|
+
logger.error('[QuickJsBridge] Failed to load a replacement WASM module', { error });
|
|
93
|
+
});
|
|
94
|
+
}
|
|
59
95
|
// Joined by hand, not with `path.join`. This runs at module load, and a browser
|
|
60
96
|
// build resolves `node:path` to an empty module, so `path.join` is undefined there.
|
|
61
97
|
const BUNDLE_RELATIVE_PATH = ['dist', 'bundle', 'runtime.iife.js'].join('/');
|
|
@@ -411,10 +447,21 @@ const INTL_DISPATCH = {
|
|
|
411
447
|
* the host callback functions directly.
|
|
412
448
|
*/
|
|
413
449
|
class QuickJsBridge {
|
|
450
|
+
wasm;
|
|
414
451
|
runtime;
|
|
415
452
|
vm;
|
|
416
453
|
initialized = false;
|
|
417
454
|
disposed = false;
|
|
455
|
+
/**
|
|
456
|
+
* Set when a host error escapes a call into the runtime, for example V8
|
|
457
|
+
* running out of native stack in deep recursion. QuickJS reports its own
|
|
458
|
+
* errors as results, so an escaped error means that the unwind skipped
|
|
459
|
+
* QuickJS cleanup. The runtime is not used again, and execute() builds a new
|
|
460
|
+
* one on a new module.
|
|
461
|
+
*/
|
|
462
|
+
broken = false;
|
|
463
|
+
/** The bundle that the runtime loaded. A rebuild loads it again. */
|
|
464
|
+
runtimeBundle;
|
|
418
465
|
config;
|
|
419
466
|
logger;
|
|
420
467
|
// Long-lived host-callback handles (Intl polyfills) — disposed on dispose()
|
|
@@ -442,9 +489,7 @@ class QuickJsBridge {
|
|
|
442
489
|
throw new Error('Bridge has been disposed and cannot be reinitialized.');
|
|
443
490
|
if (this.initialized)
|
|
444
491
|
return;
|
|
445
|
-
const
|
|
446
|
-
const QuickJS = await getQuickJS();
|
|
447
|
-
_quickjsWasm = QuickJS;
|
|
492
|
+
const QuickJS = await loadQuickJSWasm();
|
|
448
493
|
// A host without a filesystem (the browser) passes the bundle in, so
|
|
449
494
|
// loadRuntimeBundle() — the only Node-only code here — is never reached.
|
|
450
495
|
const runtimeBundle = this.config.runtimeBundle || _runtimeBundle || loadRuntimeBundle();
|
|
@@ -466,15 +511,17 @@ class QuickJsBridge {
|
|
|
466
511
|
return;
|
|
467
512
|
// Both caches are populated by the same async initialize() (pool
|
|
468
513
|
// warmup), so the sync path never touches the filesystem or the
|
|
469
|
-
// event loop beyond the context setup itself.
|
|
514
|
+
// event loop beyond the context setup itself. The module is also empty
|
|
515
|
+
// while a replacement for a retired one loads.
|
|
470
516
|
if (_quickjsWasm === null || _runtimeBundle === null) {
|
|
471
517
|
throw new Error('QuickJS WASM module and runtime bundle are not loaded yet: an async initialize() ' +
|
|
472
|
-
'must
|
|
518
|
+
'must load them before bridges can be created synchronously');
|
|
473
519
|
}
|
|
474
520
|
this.setupContext(_quickjsWasm, _runtimeBundle);
|
|
475
521
|
}
|
|
476
522
|
/** Everything after module/bundle acquisition is synchronous and shared. */
|
|
477
523
|
setupContext(QuickJS, runtimeBundle) {
|
|
524
|
+
this.wasm = QuickJS;
|
|
478
525
|
// Create runtime with memory limit (MB → bytes)
|
|
479
526
|
this.runtime = QuickJS.newRuntime();
|
|
480
527
|
this.runtime.setMemoryLimit(this.config.memoryLimit * 1024 * 1024);
|
|
@@ -482,7 +529,8 @@ class QuickJsBridge {
|
|
|
482
529
|
// Install the interrupt handler once. It reads the live deadline stack, so
|
|
483
530
|
// nested execute() calls share one budget: the earliest deadline wins.
|
|
484
531
|
// Math.min() of an empty stack is Infinity, so an idle runtime never fires.
|
|
485
|
-
|
|
532
|
+
// A broken runtime also stops the outer call that a nested call broke it in.
|
|
533
|
+
this.runtime.setInterruptHandler(() => (this.broken && this.deadlines.length > 0) || Date.now() > Math.min(...this.deadlines));
|
|
486
534
|
// Set up 'global' / 'globalThis' self-reference
|
|
487
535
|
const globalHandle = this.vm.global;
|
|
488
536
|
this.vm.setProp(globalHandle, 'global', globalHandle);
|
|
@@ -491,12 +539,14 @@ class QuickJsBridge {
|
|
|
491
539
|
this.injectIntlPolyfill();
|
|
492
540
|
// Load runtime bundle (DateTime, extend, SafeObject, proxy system, buildContext)
|
|
493
541
|
this.loadRuntimeBundle(runtimeBundle);
|
|
542
|
+
this.runtimeBundle = runtimeBundle;
|
|
494
543
|
// Wrap __prepareForTransfer to mark Date/NaN/Map/Set/Error so they survive vm.dump()
|
|
495
544
|
this.injectTransferWrapper();
|
|
496
545
|
// Inject E() error handler matching IsolatedVmBridge's E() semantics
|
|
497
546
|
this.injectErrorHandler();
|
|
498
547
|
this.verifyProxySystem();
|
|
499
548
|
this.initialized = true;
|
|
549
|
+
this.broken = false;
|
|
500
550
|
this.logger.info('[QuickJsBridge] Initialized successfully');
|
|
501
551
|
}
|
|
502
552
|
/**
|
|
@@ -1025,7 +1075,8 @@ class QuickJsBridge {
|
|
|
1025
1075
|
hostValueToQuickJSHandle(value) {
|
|
1026
1076
|
if (!this.vm)
|
|
1027
1077
|
throw new Error('Context not initialized');
|
|
1028
|
-
|
|
1078
|
+
// Building a value runs guest code, which a broken runtime must not do.
|
|
1079
|
+
if (value === undefined || this.broken)
|
|
1029
1080
|
return this.vm.undefined;
|
|
1030
1081
|
if (value === null)
|
|
1031
1082
|
return this.vm.null;
|
|
@@ -1067,9 +1118,12 @@ class QuickJsBridge {
|
|
|
1067
1118
|
* 4. Reconstruct error sentinels into real Errors
|
|
1068
1119
|
*/
|
|
1069
1120
|
execute(code, data, options) {
|
|
1121
|
+
if (this.broken && !this.disposed)
|
|
1122
|
+
this.rebuildRuntime();
|
|
1070
1123
|
if (!this.initialized || !this.vm || !this.runtime) {
|
|
1071
1124
|
throw new Error('Bridge not initialized. Call initialize() first.');
|
|
1072
1125
|
}
|
|
1126
|
+
const vm = this.vm;
|
|
1073
1127
|
// A nested call runs on what is left of the configured timeout, so the
|
|
1074
1128
|
// chain shares one budget (mirrors IsolatedVmBridge). A configured
|
|
1075
1129
|
// timeout of 0 means "no limit", so there is nothing to share.
|
|
@@ -1082,7 +1136,6 @@ class QuickJsBridge {
|
|
|
1082
1136
|
throw this.timeoutError(true);
|
|
1083
1137
|
}
|
|
1084
1138
|
const callbackHandles = this.createCallbackHandles(data);
|
|
1085
|
-
let wrapperFn;
|
|
1086
1139
|
// Push this call's deadline; the interrupt handler (set in initialize)
|
|
1087
1140
|
// interrupts on the earliest in-flight deadline. Popped in finally so a
|
|
1088
1141
|
// nested call can't leave the outer budget extended.
|
|
@@ -1121,17 +1174,19 @@ class QuickJsBridge {
|
|
|
1121
1174
|
};
|
|
1122
1175
|
}
|
|
1123
1176
|
})`;
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1177
|
+
let outcome;
|
|
1178
|
+
try {
|
|
1179
|
+
outcome = this.runInGuest(vm, wrappedCode, callbackHandles);
|
|
1180
|
+
}
|
|
1181
|
+
catch (error) {
|
|
1182
|
+
this.broken = true;
|
|
1183
|
+
throw error;
|
|
1129
1184
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1185
|
+
if (outcome.kind === 'compileError') {
|
|
1186
|
+
throw new Error(`Expression compilation failed: ${String(outcome.dump)}`);
|
|
1187
|
+
}
|
|
1188
|
+
if (outcome.kind === 'error') {
|
|
1189
|
+
const errDump = outcome.dump;
|
|
1135
1190
|
// buildContext throws on invalid timezone — propagate the original message
|
|
1136
1191
|
const errStr = String(typeof errDump === 'object' && errDump !== null
|
|
1137
1192
|
? (errDump.message ?? errDump)
|
|
@@ -1146,9 +1201,7 @@ class QuickJsBridge {
|
|
|
1146
1201
|
}
|
|
1147
1202
|
throw new Error(`Expression evaluation failed: ${errStr}`);
|
|
1148
1203
|
}
|
|
1149
|
-
const
|
|
1150
|
-
execResult.value.dispose();
|
|
1151
|
-
const result = unwrapSentinels(rawResult);
|
|
1204
|
+
const result = unwrapSentinels(outcome.dump);
|
|
1152
1205
|
if ((0, host_functions_1.isErrorSentinel)(result)) {
|
|
1153
1206
|
throw (0, host_functions_1.reconstructError)(result);
|
|
1154
1207
|
}
|
|
@@ -1164,6 +1217,10 @@ class QuickJsBridge {
|
|
|
1164
1217
|
throw error;
|
|
1165
1218
|
}
|
|
1166
1219
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1220
|
+
// A host error, for example a WASM trap, can name memory without the
|
|
1221
|
+
// guest reaching its memory limit.
|
|
1222
|
+
if (this.broken)
|
|
1223
|
+
throw new Error(`Expression evaluation failed: ${errorMessage}`);
|
|
1167
1224
|
if (errorMessage.includes('interrupted')) {
|
|
1168
1225
|
throw this.timeoutError(nested);
|
|
1169
1226
|
}
|
|
@@ -1174,11 +1231,108 @@ class QuickJsBridge {
|
|
|
1174
1231
|
}
|
|
1175
1232
|
finally {
|
|
1176
1233
|
this.deadlines.pop();
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1234
|
+
if (!this.broken) {
|
|
1235
|
+
for (const handle of callbackHandles) {
|
|
1236
|
+
handle.dispose();
|
|
1237
|
+
}
|
|
1180
1238
|
}
|
|
1239
|
+
else if (this.deadlines.length === 0) {
|
|
1240
|
+
// Only the outermost call drops the runtime. A nested call returns
|
|
1241
|
+
// into the frames of the outer call, which still use the runtime.
|
|
1242
|
+
this.abandonRuntime();
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
/**
|
|
1247
|
+
* Run the wrapped code and give back its outcome as host values. QuickJS
|
|
1248
|
+
* reports guest errors as results, so a throw from here is a host error.
|
|
1249
|
+
*/
|
|
1250
|
+
runInGuest(vm, wrappedCode, callbackHandles) {
|
|
1251
|
+
const wrapperResult = vm.evalCode(wrappedCode);
|
|
1252
|
+
if (wrapperResult.error) {
|
|
1253
|
+
const dump = vm.dump(wrapperResult.error);
|
|
1254
|
+
wrapperResult.error.dispose();
|
|
1255
|
+
return { kind: 'compileError', dump };
|
|
1256
|
+
}
|
|
1257
|
+
const wrapperFn = wrapperResult.value;
|
|
1258
|
+
const execResult = vm.callFunction(wrapperFn, vm.undefined, ...callbackHandles);
|
|
1259
|
+
// A nested execute() that broke the runtime returned into this call.
|
|
1260
|
+
if (this.broken)
|
|
1261
|
+
throw new Error('A nested expression stopped the expression engine');
|
|
1262
|
+
wrapperFn.dispose();
|
|
1263
|
+
if (execResult.error) {
|
|
1264
|
+
const dump = vm.dump(execResult.error);
|
|
1265
|
+
execResult.error.dispose();
|
|
1266
|
+
return { kind: 'error', dump };
|
|
1181
1267
|
}
|
|
1268
|
+
const dump = vm.dump(execResult.value);
|
|
1269
|
+
execResult.value.dispose();
|
|
1270
|
+
return { kind: 'value', dump };
|
|
1271
|
+
}
|
|
1272
|
+
/**
|
|
1273
|
+
* Build a new runtime in place of a broken one, so that the caller that holds
|
|
1274
|
+
* this bridge can go on. The runtime goes on the current module, which is
|
|
1275
|
+
* never the retired one.
|
|
1276
|
+
*/
|
|
1277
|
+
rebuildRuntime() {
|
|
1278
|
+
// A nested call must not enter a runtime that an inner call has broken.
|
|
1279
|
+
if (this.vm || _quickjsWasm === null) {
|
|
1280
|
+
// Retries a failed load. A load that is in progress is reused.
|
|
1281
|
+
loadQuickJSWasm().catch((error) => {
|
|
1282
|
+
this.logger.error('[QuickJsBridge] Failed to load a replacement WASM module', { error });
|
|
1283
|
+
});
|
|
1284
|
+
throw new Error('Expression evaluation failed: the expression engine is restarting after an earlier error. Try again.');
|
|
1285
|
+
}
|
|
1286
|
+
if (this.runtimeBundle === undefined) {
|
|
1287
|
+
throw new Error('Bridge not initialized. Call initialize() first.');
|
|
1288
|
+
}
|
|
1289
|
+
// The process-wide bundle cache holds the bundle of the bridge that
|
|
1290
|
+
// initialized last, which can differ from the bundle of this bridge.
|
|
1291
|
+
try {
|
|
1292
|
+
this.setupContext(_quickjsWasm, this.runtimeBundle);
|
|
1293
|
+
}
|
|
1294
|
+
catch (error) {
|
|
1295
|
+
// Clears this.vm, so the next execute() tries the rebuild again.
|
|
1296
|
+
this.discardFailedRuntime();
|
|
1297
|
+
throw error;
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
/**
|
|
1301
|
+
* Free the runtime of a failed rebuild. It ran no guest call, so it can
|
|
1302
|
+
* usually be freed. If the free aborts, the module is unusable.
|
|
1303
|
+
*/
|
|
1304
|
+
discardFailedRuntime() {
|
|
1305
|
+
try {
|
|
1306
|
+
for (const handle of this.intlHandles)
|
|
1307
|
+
handle.dispose();
|
|
1308
|
+
this.vm?.dispose();
|
|
1309
|
+
this.runtime?.dispose();
|
|
1310
|
+
}
|
|
1311
|
+
catch {
|
|
1312
|
+
if (this.wasm)
|
|
1313
|
+
retireQuickJSWasm(this.wasm, this.logger);
|
|
1314
|
+
}
|
|
1315
|
+
finally {
|
|
1316
|
+
this.intlHandles = [];
|
|
1317
|
+
this.vm = undefined;
|
|
1318
|
+
this.runtime = undefined;
|
|
1319
|
+
this.wasm = undefined;
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
/**
|
|
1323
|
+
* Drop a broken runtime without freeing it. JS_FreeRuntime asserts that no
|
|
1324
|
+
* objects are left, and the unwind left some, so a free aborts the module.
|
|
1325
|
+
* The memory is released when the module is garbage collected.
|
|
1326
|
+
*/
|
|
1327
|
+
abandonRuntime() {
|
|
1328
|
+
if (this.wasm)
|
|
1329
|
+
retireQuickJSWasm(this.wasm, this.logger);
|
|
1330
|
+
this.wasm = undefined;
|
|
1331
|
+
this.vm = undefined;
|
|
1332
|
+
this.runtime = undefined;
|
|
1333
|
+
this.intlHandles = [];
|
|
1334
|
+
this.initialized = false;
|
|
1335
|
+
this.logger.warn('[QuickJsBridge] Discarded the runtime after a host error in a guest call');
|
|
1182
1336
|
}
|
|
1183
1337
|
/**
|
|
1184
1338
|
* Always names the configured limit, never the reduced budget a nested call
|
|
@@ -1205,6 +1359,8 @@ class QuickJsBridge {
|
|
|
1205
1359
|
async dispose() {
|
|
1206
1360
|
if (this.disposed)
|
|
1207
1361
|
return;
|
|
1362
|
+
if (this.broken && this.vm)
|
|
1363
|
+
this.abandonRuntime();
|
|
1208
1364
|
for (const handle of this.intlHandles) {
|
|
1209
1365
|
handle.dispose();
|
|
1210
1366
|
}
|