@n8n/expression-runtime 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/bridge/bridge-messages.d.ts +8 -8
- package/dist/cjs/bridge/bridge-messages.js +234 -244
- package/dist/cjs/bridge/bridge-messages.js.map +1 -1
- package/dist/cjs/bridge/isolated-vm-bridge.d.ts.map +1 -1
- package/dist/cjs/bridge/isolated-vm-bridge.js +633 -643
- package/dist/cjs/bridge/isolated-vm-bridge.js.map +1 -1
- package/dist/cjs/build.tsbuildinfo +1 -1
- package/dist/cjs/evaluator/error-classification.js +15 -25
- package/dist/cjs/evaluator/error-classification.js.map +1 -1
- package/dist/cjs/evaluator/expression-evaluator.d.ts +7 -1
- package/dist/cjs/evaluator/expression-evaluator.d.ts.map +1 -1
- package/dist/cjs/evaluator/expression-evaluator.js +152 -155
- package/dist/cjs/evaluator/expression-evaluator.js.map +1 -1
- package/dist/cjs/evaluator/lru-cache.d.ts.map +1 -1
- package/dist/cjs/evaluator/lru-cache.js +35 -45
- package/dist/cjs/evaluator/lru-cache.js.map +1 -1
- package/dist/cjs/extensions/array-extensions.js +589 -599
- package/dist/cjs/extensions/array-extensions.js.map +1 -1
- package/dist/cjs/extensions/boolean-extensions.js +38 -48
- package/dist/cjs/extensions/boolean-extensions.js.map +1 -1
- package/dist/cjs/extensions/date-extensions.js +500 -510
- package/dist/cjs/extensions/date-extensions.js.map +1 -1
- package/dist/cjs/extensions/expression-extension-error.d.ts.map +1 -1
- package/dist/cjs/extensions/expression-extension-error.js +12 -22
- package/dist/cjs/extensions/expression-extension-error.js.map +1 -1
- package/dist/cjs/extensions/extend.js +162 -172
- package/dist/cjs/extensions/extend.js.map +1 -1
- package/dist/cjs/extensions/extensions.js +2 -12
- package/dist/cjs/extensions/function-extensions.d.ts +10 -18
- package/dist/cjs/extensions/function-extensions.d.ts.map +1 -1
- package/dist/cjs/extensions/function-extensions.js +78 -88
- package/dist/cjs/extensions/function-extensions.js.map +1 -1
- package/dist/cjs/extensions/number-extensions.js +225 -235
- package/dist/cjs/extensions/number-extensions.js.map +1 -1
- package/dist/cjs/extensions/object-extensions.js +286 -296
- package/dist/cjs/extensions/object-extensions.js.map +1 -1
- package/dist/cjs/extensions/string-extensions.d.ts +1 -1
- package/dist/cjs/extensions/string-extensions.d.ts.map +1 -1
- package/dist/cjs/extensions/string-extensions.js +758 -768
- package/dist/cjs/extensions/string-extensions.js.map +1 -1
- package/dist/cjs/extensions/utils.d.ts.map +1 -1
- package/dist/cjs/extensions/utils.js +28 -38
- package/dist/cjs/extensions/utils.js.map +1 -1
- package/dist/cjs/index.js +32 -42
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/observability/metrics.d.ts +27 -27
- package/dist/cjs/observability/metrics.d.ts.map +1 -1
- package/dist/cjs/observability/metrics.js +59 -69
- package/dist/cjs/observability/metrics.js.map +1 -1
- package/dist/cjs/observability/noop-provider.js +28 -38
- package/dist/cjs/observability/noop-provider.js.map +1 -1
- package/dist/cjs/pool/idle-scaling-pool.d.ts.map +1 -1
- package/dist/cjs/pool/idle-scaling-pool.js +134 -144
- package/dist/cjs/pool/idle-scaling-pool.js.map +1 -1
- package/dist/cjs/pool/isolate-pool.d.ts.map +1 -1
- package/dist/cjs/pool/isolate-pool.js +101 -111
- package/dist/cjs/pool/isolate-pool.js.map +1 -1
- package/dist/cjs/runtime/context.js +418 -428
- package/dist/cjs/runtime/context.js.map +1 -1
- package/dist/cjs/runtime/index.js +26 -36
- package/dist/cjs/runtime/index.js.map +1 -1
- package/dist/cjs/runtime/jmespath.js +72 -82
- package/dist/cjs/runtime/jmespath.js.map +1 -1
- package/dist/cjs/runtime/lazy-proxy.js +238 -248
- package/dist/cjs/runtime/lazy-proxy.js.map +1 -1
- package/dist/cjs/runtime/safe-globals.d.ts.map +1 -1
- package/dist/cjs/runtime/safe-globals.js +134 -144
- package/dist/cjs/runtime/safe-globals.js.map +1 -1
- package/dist/cjs/runtime/serialize.js +54 -64
- package/dist/cjs/runtime/serialize.js.map +1 -1
- package/dist/cjs/runtime/utils.js +20 -30
- package/dist/cjs/runtime/utils.js.map +1 -1
- package/dist/cjs/types/bridge.js +15 -25
- package/dist/cjs/types/bridge.js.map +1 -1
- package/dist/cjs/types/evaluator.d.ts +5 -1
- package/dist/cjs/types/evaluator.d.ts.map +1 -1
- package/dist/cjs/types/evaluator.js +35 -45
- package/dist/cjs/types/evaluator.js.map +1 -1
- package/dist/cjs/types/index.js +14 -24
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/runtime.d.ts.map +1 -1
- package/dist/cjs/types/runtime.js +27 -37
- package/dist/cjs/types/runtime.js.map +1 -1
- package/dist/esm/bridge/bridge-messages.d.ts +8 -8
- package/dist/esm/bridge/isolated-vm-bridge.d.ts.map +1 -1
- package/dist/esm/bridge/isolated-vm-bridge.js.map +1 -1
- package/dist/esm/build.tsbuildinfo +1 -1
- package/dist/esm/evaluator/expression-evaluator.d.ts +7 -1
- package/dist/esm/evaluator/expression-evaluator.d.ts.map +1 -1
- package/dist/esm/evaluator/expression-evaluator.js +8 -1
- package/dist/esm/evaluator/expression-evaluator.js.map +1 -1
- package/dist/esm/evaluator/lru-cache.d.ts.map +1 -1
- package/dist/esm/evaluator/lru-cache.js.map +1 -1
- package/dist/esm/extensions/expression-extension-error.d.ts.map +1 -1
- package/dist/esm/extensions/function-extensions.d.ts +10 -18
- package/dist/esm/extensions/function-extensions.d.ts.map +1 -1
- package/dist/esm/extensions/number-extensions.js.map +1 -1
- package/dist/esm/extensions/string-extensions.d.ts +1 -1
- package/dist/esm/extensions/string-extensions.d.ts.map +1 -1
- package/dist/esm/extensions/string-extensions.js.map +1 -1
- package/dist/esm/extensions/utils.d.ts.map +1 -1
- package/dist/esm/observability/metrics.d.ts +27 -27
- package/dist/esm/observability/metrics.d.ts.map +1 -1
- package/dist/esm/pool/idle-scaling-pool.d.ts.map +1 -1
- package/dist/esm/pool/idle-scaling-pool.js.map +1 -1
- package/dist/esm/pool/isolate-pool.d.ts.map +1 -1
- package/dist/esm/pool/isolate-pool.js.map +1 -1
- package/dist/esm/runtime/lazy-proxy.js.map +1 -1
- package/dist/esm/runtime/safe-globals.d.ts.map +1 -1
- package/dist/esm/types/evaluator.d.ts +5 -1
- package/dist/esm/types/evaluator.d.ts.map +1 -1
- package/dist/esm/types/evaluator.js.map +1 -1
- package/dist/esm/types/runtime.d.ts.map +1 -1
- package/dist/esm/types/runtime.js.map +1 -1
- package/package.json +7 -6
|
@@ -1,26 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return 'timeout';
|
|
17
|
-
if (error instanceof types_1.MemoryLimitError)
|
|
18
|
-
return 'memory_limit';
|
|
19
|
-
if (error instanceof types_1.SecurityViolationError)
|
|
20
|
-
return 'security';
|
|
21
|
-
if (error instanceof types_1.SyntaxError)
|
|
22
|
-
return 'syntax';
|
|
23
|
-
return 'unknown';
|
|
24
|
-
}
|
|
25
|
-
});
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classifyExpressionError = classifyExpressionError;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
function classifyExpressionError(error) {
|
|
6
|
+
if (error instanceof types_1.TimeoutError)
|
|
7
|
+
return 'timeout';
|
|
8
|
+
if (error instanceof types_1.MemoryLimitError)
|
|
9
|
+
return 'memory_limit';
|
|
10
|
+
if (error instanceof types_1.SecurityViolationError)
|
|
11
|
+
return 'security';
|
|
12
|
+
if (error instanceof types_1.SyntaxError)
|
|
13
|
+
return 'syntax';
|
|
14
|
+
return 'unknown';
|
|
15
|
+
}
|
|
26
16
|
//# sourceMappingURL=error-classification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-classification.js","sourceRoot":"","sources":["../../../src/evaluator/error-classification.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"error-classification.js","sourceRoot":"","sources":["../../../src/evaluator/error-classification.ts"],"names":[],"mappings":";;;AAAA,oCAA+F;AAI/F,iCAAwC,KAAc;IACrD,IAAI,KAAK,YAAY,oBAAY;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,KAAK,YAAY,wBAAgB;QAAE,OAAO,cAAc,CAAC;IAC7D,IAAI,KAAK,YAAY,8BAAsB;QAAE,OAAO,UAAU,CAAC;IAC/D,IAAI,KAAK,YAAY,mBAAW;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -9,7 +9,13 @@ export declare class ExpressionEvaluator implements IExpressionEvaluator {
|
|
|
9
9
|
private readonly createBridge;
|
|
10
10
|
constructor(config: EvaluatorConfig);
|
|
11
11
|
initialize(): Promise<void>;
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Acquire a bridge for the caller. Returns whether a bridge was newly
|
|
14
|
+
* acquired: `false` means the caller already held one, so the current
|
|
15
|
+
* scope must not release it (release is not reference-counted and would
|
|
16
|
+
* return the caller's bridge to the pool mid-use).
|
|
17
|
+
*/
|
|
18
|
+
acquire(caller: object): Promise<boolean>;
|
|
13
19
|
evaluate(expression: string, data: WorkflowData, caller: object, options?: EvaluateOptions): unknown;
|
|
14
20
|
private getBridge;
|
|
15
21
|
release(caller: object): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-evaluator.d.ts","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,eAAe,EAGf,MAAM,UAAU,CAAC;AAyBlB,qBAAa,mBAAoB,YAAW,oBAAoB;IAC/D,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,UAAU,CAAC,CAAa;IAIhC,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;
|
|
1
|
+
{"version":3,"file":"expression-evaluator.d.ts","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,eAAe,EAGf,MAAM,UAAU,CAAC;AAyBlB,qBAAa,mBAAoB,YAAW,oBAAoB;IAC/D,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,UAAU,CAAC,CAAa;IAIhC,OAAO,CAAC,SAAS,CAA2B;IAE5C,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAE5D,YAAY,MAAM,EAAE,eAAe,EA4BlC;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED;;;;;OAKG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa9C;IAED,QAAQ,CACP,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACvB,OAAO,CAqBT;IAED,OAAO,CAAC,SAAS;IAeX,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3C;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAED;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA8BpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,UAAU,IAAI,OAAO,CAEpB;CACD"}
|
|
@@ -1,168 +1,165 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExpressionEvaluator = void 0;
|
|
4
|
+
const tournament_1 = require("@n8n/tournament");
|
|
5
|
+
const bridge_1 = require("../types/bridge");
|
|
6
|
+
const errors_1 = require("@n8n/errors");
|
|
7
|
+
const idle_scaling_pool_1 = require("../pool/idle-scaling-pool");
|
|
8
|
+
const isolate_pool_1 = require("../pool/isolate-pool");
|
|
9
|
+
const metrics_1 = require("../observability/metrics");
|
|
10
|
+
const error_classification_1 = require("./error-classification");
|
|
11
|
+
const lru_cache_1 = require("./lru-cache");
|
|
12
|
+
function recordOutcome(observability, start, status, error) {
|
|
13
|
+
if (!observability)
|
|
14
|
+
return;
|
|
15
|
+
const durationSeconds = (performance.now() - start) / 1000;
|
|
16
|
+
const errorType = error !== undefined ? (0, error_classification_1.classifyExpressionError)(error) : undefined;
|
|
17
|
+
observability.metrics.histogram(metrics_1.EXPRESSION_METRICS.evaluationDuration.name, durationSeconds, {
|
|
18
|
+
status,
|
|
19
|
+
type: errorType ?? 'none',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
class ExpressionEvaluator {
|
|
23
|
+
config;
|
|
24
|
+
disposed = false;
|
|
25
|
+
// Lazy-initialized tournament instance (expensive to create, reused across evaluations)
|
|
26
|
+
tournament;
|
|
27
|
+
// Cache: template expression → tournament-transformed JavaScript code
|
|
28
|
+
// Cache hit rate in production: ~99.9% (same expressions repeat within a workflow)
|
|
29
|
+
codeCache;
|
|
30
|
+
pool;
|
|
31
|
+
bridgesByCaller = new WeakMap();
|
|
32
|
+
createBridge;
|
|
33
|
+
constructor(config) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.codeCache = new lru_cache_1.LruCache(config.maxCodeCacheSize, () => {
|
|
36
|
+
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.codeCacheEviction.name, 1);
|
|
29
37
|
});
|
|
38
|
+
const logger = config.logger ?? bridge_1.DEFAULT_BRIDGE_CONFIG.logger;
|
|
39
|
+
this.createBridge = async () => {
|
|
40
|
+
const bridge = config.createBridge();
|
|
41
|
+
await bridge.initialize();
|
|
42
|
+
return bridge;
|
|
43
|
+
};
|
|
44
|
+
const onReplenishFailed = (error) => {
|
|
45
|
+
logger.error('[IsolatePool] Failed to replenish bridge', { error });
|
|
46
|
+
config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolReplenishFailed.name, 1);
|
|
47
|
+
};
|
|
48
|
+
this.pool =
|
|
49
|
+
config.idleTimeoutMs === undefined
|
|
50
|
+
? new isolate_pool_1.IsolatePool(this.createBridge, config.poolSize ?? 1, onReplenishFailed, logger)
|
|
51
|
+
: new idle_scaling_pool_1.IdleScalingPool(this.createBridge, config.poolSize ?? 1, config.idleTimeoutMs, onReplenishFailed, logger, config.observability);
|
|
30
52
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
47
|
-
const logger = config.logger ?? bridge_1.DEFAULT_BRIDGE_CONFIG.logger;
|
|
48
|
-
this.createBridge = async () => {
|
|
49
|
-
const bridge = config.createBridge();
|
|
50
|
-
await bridge.initialize();
|
|
51
|
-
return bridge;
|
|
52
|
-
};
|
|
53
|
-
const onReplenishFailed = (error) => {
|
|
54
|
-
logger.error('[IsolatePool] Failed to replenish bridge', { error });
|
|
55
|
-
config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolReplenishFailed.name, 1);
|
|
56
|
-
};
|
|
57
|
-
this.pool =
|
|
58
|
-
config.idleTimeoutMs === undefined
|
|
59
|
-
? new isolate_pool_1.IsolatePool(this.createBridge, config.poolSize ?? 1, onReplenishFailed, logger)
|
|
60
|
-
: new idle_scaling_pool_1.IdleScalingPool(this.createBridge, config.poolSize ?? 1, config.idleTimeoutMs, onReplenishFailed, logger, config.observability);
|
|
61
|
-
}
|
|
62
|
-
async initialize() {
|
|
63
|
-
await this.pool.initialize();
|
|
64
|
-
}
|
|
65
|
-
async acquire(caller) {
|
|
66
|
-
if (this.bridgesByCaller.has(caller))
|
|
67
|
-
return;
|
|
68
|
-
let bridge;
|
|
69
|
-
try {
|
|
70
|
-
bridge = this.pool.acquire();
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
if (error instanceof isolate_pool_1.PoolDisposedError)
|
|
74
|
-
throw error;
|
|
75
|
-
if (!(error instanceof isolate_pool_1.PoolExhaustedError))
|
|
76
|
-
throw error;
|
|
77
|
-
bridge = await this.createBridge();
|
|
78
|
-
}
|
|
79
|
-
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolAcquired.name, 1);
|
|
80
|
-
this.bridgesByCaller.set(caller, bridge);
|
|
53
|
+
async initialize() {
|
|
54
|
+
await this.pool.initialize();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Acquire a bridge for the caller. Returns whether a bridge was newly
|
|
58
|
+
* acquired: `false` means the caller already held one, so the current
|
|
59
|
+
* scope must not release it (release is not reference-counted and would
|
|
60
|
+
* return the caller's bridge to the pool mid-use).
|
|
61
|
+
*/
|
|
62
|
+
async acquire(caller) {
|
|
63
|
+
if (this.bridgesByCaller.has(caller))
|
|
64
|
+
return false;
|
|
65
|
+
let bridge;
|
|
66
|
+
try {
|
|
67
|
+
bridge = this.pool.acquire();
|
|
81
68
|
}
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
throw new errors_1.IsolateError('Evaluator disposed');
|
|
85
|
-
const bridge = this.getBridge(caller);
|
|
86
|
-
// Transform template expression → sanitized JavaScript (cached)
|
|
87
|
-
const transformedCode = this.getTransformedCode(expression);
|
|
88
|
-
const { observability } = this.config;
|
|
89
|
-
const start = performance.now();
|
|
90
|
-
try {
|
|
91
|
-
const result = bridge.execute(transformedCode, data, {
|
|
92
|
-
timezone: options?.timezone,
|
|
93
|
-
});
|
|
94
|
-
recordOutcome(observability, start, 'success');
|
|
95
|
-
return result;
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
recordOutcome(observability, start, 'error', error);
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof isolate_pool_1.PoolDisposedError)
|
|
99
71
|
throw error;
|
|
100
|
-
|
|
72
|
+
if (!(error instanceof isolate_pool_1.PoolExhaustedError))
|
|
73
|
+
throw error;
|
|
74
|
+
bridge = await this.createBridge();
|
|
101
75
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
76
|
+
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolAcquired.name, 1);
|
|
77
|
+
this.bridgesByCaller.set(caller, bridge);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
evaluate(expression, data, caller, options) {
|
|
81
|
+
if (this.disposed)
|
|
82
|
+
throw new errors_1.IsolateError('Evaluator disposed');
|
|
83
|
+
const bridge = this.getBridge(caller);
|
|
84
|
+
// Transform template expression → sanitized JavaScript (cached)
|
|
85
|
+
const transformedCode = this.getTransformedCode(expression);
|
|
86
|
+
const { observability } = this.config;
|
|
87
|
+
const start = performance.now();
|
|
88
|
+
try {
|
|
89
|
+
const result = bridge.execute(transformedCode, data, {
|
|
90
|
+
timezone: options?.timezone,
|
|
91
|
+
});
|
|
92
|
+
recordOutcome(observability, start, 'success');
|
|
93
|
+
return result;
|
|
113
94
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
return;
|
|
118
|
-
this.bridgesByCaller.delete(caller);
|
|
119
|
-
await this.pool.release(bridge);
|
|
95
|
+
catch (error) {
|
|
96
|
+
recordOutcome(observability, start, 'error', error);
|
|
97
|
+
throw error;
|
|
120
98
|
}
|
|
121
|
-
|
|
122
|
-
|
|
99
|
+
}
|
|
100
|
+
getBridge(caller) {
|
|
101
|
+
const bridge = this.bridgesByCaller.get(caller);
|
|
102
|
+
if (!bridge) {
|
|
103
|
+
throw new errors_1.IsolateError('No bridge acquired for this context. Call acquire() first.');
|
|
123
104
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
* Output: JavaScript string with tournament security transforms applied
|
|
129
|
-
* ($json → this.$json, computed access wrapped in this.__sanitize(), etc.)
|
|
130
|
-
*
|
|
131
|
-
* Result is cached by expression string (tournament AST parsing is expensive).
|
|
132
|
-
*/
|
|
133
|
-
getTransformedCode(expression) {
|
|
134
|
-
const cached = this.codeCache.get(expression);
|
|
135
|
-
if (cached !== undefined) {
|
|
136
|
-
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.codeCacheHit.name, 1);
|
|
137
|
-
return cached;
|
|
138
|
-
}
|
|
139
|
-
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.codeCacheMiss.name, 1);
|
|
140
|
-
if (!this.tournament) {
|
|
141
|
-
// Tournament requires an errorHandler but we only use getExpressionCode()
|
|
142
|
-
// for AST transformation — we never call tournament.execute(), so this
|
|
143
|
-
// handler is never invoked. Runtime errors are handled by the bridge's
|
|
144
|
-
// own E() injection in injectErrorHandler().
|
|
145
|
-
const errorHandler = () => { };
|
|
146
|
-
this.tournament = new tournament_1.Tournament(errorHandler, undefined, undefined, {
|
|
147
|
-
before: this.config.hooks?.before ?? [],
|
|
148
|
-
after: this.config.hooks?.after ?? [],
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
const [transformedCode] = this.tournament.getExpressionCode(expression);
|
|
152
|
-
this.codeCache.set(expression, transformedCode);
|
|
153
|
-
this.config.observability?.metrics.gauge(metrics_1.EXPRESSION_METRICS.codeCacheSize.name, this.codeCache.size);
|
|
154
|
-
return transformedCode;
|
|
105
|
+
// If the isolate died mid-execution (e.g. OOM), all remaining expressions
|
|
106
|
+
// in this execution are expected to fail. Recovery is per-execution, not per-expression.
|
|
107
|
+
if (bridge.isDisposed()) {
|
|
108
|
+
throw new errors_1.IsolateError('Isolate for this caller is no longer available');
|
|
155
109
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
110
|
+
return bridge;
|
|
111
|
+
}
|
|
112
|
+
async release(caller) {
|
|
113
|
+
const bridge = this.bridgesByCaller.get(caller);
|
|
114
|
+
if (!bridge)
|
|
115
|
+
return;
|
|
116
|
+
this.bridgesByCaller.delete(caller);
|
|
117
|
+
await this.pool.release(bridge);
|
|
118
|
+
}
|
|
119
|
+
async waitForReplenishment() {
|
|
120
|
+
await this.pool.waitForReplenishment();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Transform a template expression to executable JavaScript via tournament.
|
|
124
|
+
*
|
|
125
|
+
* Input: "{{ $json.email }}"
|
|
126
|
+
* Output: JavaScript string with tournament security transforms applied
|
|
127
|
+
* ($json → this.$json, computed access wrapped in this.__sanitize(), etc.)
|
|
128
|
+
*
|
|
129
|
+
* Result is cached by expression string (tournament AST parsing is expensive).
|
|
130
|
+
*/
|
|
131
|
+
getTransformedCode(expression) {
|
|
132
|
+
const cached = this.codeCache.get(expression);
|
|
133
|
+
if (cached !== undefined) {
|
|
134
|
+
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.codeCacheHit.name, 1);
|
|
135
|
+
return cached;
|
|
161
136
|
}
|
|
162
|
-
|
|
163
|
-
|
|
137
|
+
this.config.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.codeCacheMiss.name, 1);
|
|
138
|
+
if (!this.tournament) {
|
|
139
|
+
// Tournament requires an errorHandler but we only use getExpressionCode()
|
|
140
|
+
// for AST transformation — we never call tournament.execute(), so this
|
|
141
|
+
// handler is never invoked. Runtime errors are handled by the bridge's
|
|
142
|
+
// own E() injection in injectErrorHandler().
|
|
143
|
+
const errorHandler = () => { };
|
|
144
|
+
this.tournament = new tournament_1.Tournament(errorHandler, undefined, undefined, {
|
|
145
|
+
before: this.config.hooks?.before ?? [],
|
|
146
|
+
after: this.config.hooks?.after ?? [],
|
|
147
|
+
});
|
|
164
148
|
}
|
|
149
|
+
const [transformedCode] = this.tournament.getExpressionCode(expression);
|
|
150
|
+
this.codeCache.set(expression, transformedCode);
|
|
151
|
+
this.config.observability?.metrics.gauge(metrics_1.EXPRESSION_METRICS.codeCacheSize.name, this.codeCache.size);
|
|
152
|
+
return transformedCode;
|
|
153
|
+
}
|
|
154
|
+
async dispose() {
|
|
155
|
+
this.disposed = true;
|
|
156
|
+
this.codeCache.clear();
|
|
157
|
+
this.config.observability?.metrics.gauge(metrics_1.EXPRESSION_METRICS.codeCacheSize.name, 0);
|
|
158
|
+
await this.pool.dispose();
|
|
159
|
+
}
|
|
160
|
+
isDisposed() {
|
|
161
|
+
return this.disposed;
|
|
165
162
|
}
|
|
166
|
-
|
|
167
|
-
|
|
163
|
+
}
|
|
164
|
+
exports.ExpressionEvaluator = ExpressionEvaluator;
|
|
168
165
|
//# sourceMappingURL=expression-evaluator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-evaluator.js","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expression-evaluator.js","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../../src/evaluator/lru-cache.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC;IAIxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAJ1B,OAAO,CAAC,GAAG,CAAmB;
|
|
1
|
+
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../../src/evaluator/lru-cache.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC;IAIxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAJ1B,OAAO,CAAC,GAAG,CAAmB;IAE9B,YACkB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,aAAA,EAKrD;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAMzB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAQ1B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI,CAEZ;CACD"}
|
|
@@ -1,50 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LruCache = void 0;
|
|
4
|
+
class LruCache {
|
|
5
|
+
capacity;
|
|
6
|
+
onEvict;
|
|
7
|
+
map = new Map();
|
|
8
|
+
constructor(capacity, onEvict) {
|
|
9
|
+
this.capacity = capacity;
|
|
10
|
+
this.onEvict = onEvict;
|
|
11
|
+
if (capacity < 1) {
|
|
12
|
+
throw new Error('LruCache capacity must be at least 1');
|
|
13
|
+
}
|
|
5
14
|
}
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
get(key) {
|
|
16
|
+
const value = this.map.get(key);
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
this.map.delete(key);
|
|
20
|
+
this.map.set(key, value);
|
|
21
|
+
return value;
|
|
8
22
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
map = new Map();
|
|
17
|
-
constructor(capacity, onEvict) {
|
|
18
|
-
this.capacity = capacity;
|
|
19
|
-
this.onEvict = onEvict;
|
|
20
|
-
if (capacity < 1) {
|
|
21
|
-
throw new Error('LruCache capacity must be at least 1');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
get(key) {
|
|
25
|
-
const value = this.map.get(key);
|
|
26
|
-
if (value === undefined)
|
|
27
|
-
return undefined;
|
|
28
|
-
this.map.delete(key);
|
|
29
|
-
this.map.set(key, value);
|
|
30
|
-
return value;
|
|
31
|
-
}
|
|
32
|
-
set(key, value) {
|
|
33
|
-
this.map.delete(key);
|
|
34
|
-
this.map.set(key, value);
|
|
35
|
-
if (this.map.size > this.capacity) {
|
|
36
|
-
const [oldestKey, oldestValue] = this.map.entries().next().value;
|
|
37
|
-
this.map.delete(oldestKey);
|
|
38
|
-
this.onEvict?.(oldestKey, oldestValue);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
get size() {
|
|
42
|
-
return this.map.size;
|
|
43
|
-
}
|
|
44
|
-
clear() {
|
|
45
|
-
this.map.clear();
|
|
23
|
+
set(key, value) {
|
|
24
|
+
this.map.delete(key);
|
|
25
|
+
this.map.set(key, value);
|
|
26
|
+
if (this.map.size > this.capacity) {
|
|
27
|
+
const [oldestKey, oldestValue] = this.map.entries().next().value;
|
|
28
|
+
this.map.delete(oldestKey);
|
|
29
|
+
this.onEvict?.(oldestKey, oldestValue);
|
|
46
30
|
}
|
|
47
31
|
}
|
|
48
|
-
|
|
49
|
-
|
|
32
|
+
get size() {
|
|
33
|
+
return this.map.size;
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this.map.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.LruCache = LruCache;
|
|
50
40
|
//# sourceMappingURL=lru-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../../src/evaluator/lru-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../../src/evaluator/lru-cache.ts"],"names":[],"mappings":";;;AAAA;IAImB,QAAQ;IACR,OAAO;IAJjB,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;IAE9B,YACkB,QAAgB,EAChB,OAAoC;wBADpC,QAAQ;uBACR,OAAO;QAExB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAED,GAAG,CAAC,GAAM;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QACnB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAClE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxC,CAAC;IACF,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACD"}
|