@n8n/expression-runtime 0.10.1 → 0.11.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/build.tsbuildinfo +1 -1
- package/dist/cjs/evaluator/error-classification.d.ts +3 -0
- package/dist/cjs/evaluator/error-classification.d.ts.map +1 -0
- package/dist/cjs/evaluator/error-classification.js +26 -0
- package/dist/cjs/evaluator/error-classification.js.map +1 -0
- package/dist/cjs/evaluator/expression-evaluator.d.ts.map +1 -1
- package/dist/cjs/evaluator/expression-evaluator.js +31 -16
- package/dist/cjs/evaluator/expression-evaluator.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/observability/metrics.d.ts +65 -0
- package/dist/cjs/observability/metrics.d.ts.map +1 -0
- package/dist/cjs/observability/metrics.js +70 -0
- package/dist/cjs/observability/metrics.js.map +1 -0
- package/dist/cjs/observability/noop-provider.d.ts +3 -0
- package/dist/cjs/observability/noop-provider.d.ts.map +1 -0
- package/dist/cjs/observability/noop-provider.js +39 -0
- package/dist/cjs/observability/noop-provider.js.map +1 -0
- package/dist/cjs/pool/idle-scaling-pool.d.ts +35 -0
- package/dist/cjs/pool/idle-scaling-pool.d.ts.map +1 -0
- package/dist/cjs/pool/idle-scaling-pool.js +154 -0
- package/dist/cjs/pool/idle-scaling-pool.js.map +1 -0
- package/dist/cjs/pool/isolate-pool.d.ts +9 -1
- package/dist/cjs/pool/isolate-pool.d.ts.map +1 -1
- package/dist/cjs/pool/isolate-pool.js.map +1 -1
- package/dist/cjs/types/evaluator.d.ts +2 -0
- package/dist/cjs/types/evaluator.d.ts.map +1 -1
- package/dist/cjs/types/evaluator.js.map +1 -1
- package/dist/esm/build.tsbuildinfo +1 -1
- package/dist/esm/evaluator/error-classification.d.ts +3 -0
- package/dist/esm/evaluator/error-classification.d.ts.map +1 -0
- package/dist/esm/evaluator/error-classification.js +13 -0
- package/dist/esm/evaluator/error-classification.js.map +1 -0
- package/dist/esm/evaluator/expression-evaluator.d.ts.map +1 -1
- package/dist/esm/evaluator/expression-evaluator.js +30 -15
- package/dist/esm/evaluator/expression-evaluator.js.map +1 -1
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/observability/metrics.d.ts +65 -0
- package/dist/esm/observability/metrics.d.ts.map +1 -0
- package/dist/esm/observability/metrics.js +57 -0
- package/dist/esm/observability/metrics.js.map +1 -0
- package/dist/esm/observability/noop-provider.d.ts +3 -0
- package/dist/esm/observability/noop-provider.d.ts.map +1 -0
- package/dist/esm/observability/noop-provider.js +26 -0
- package/dist/esm/observability/noop-provider.js.map +1 -0
- package/dist/esm/pool/idle-scaling-pool.d.ts +35 -0
- package/dist/esm/pool/idle-scaling-pool.d.ts.map +1 -0
- package/dist/esm/pool/idle-scaling-pool.js +140 -0
- package/dist/esm/pool/idle-scaling-pool.js.map +1 -0
- package/dist/esm/pool/isolate-pool.d.ts +9 -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/types/evaluator.d.ts +2 -0
- package/dist/esm/types/evaluator.d.ts.map +1 -1
- package/dist/esm/types/evaluator.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-classification.d.ts","sourceRoot":"","sources":["../../../src/evaluator/error-classification.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAM3E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MemoryLimitError, SecurityViolationError, SyntaxError, TimeoutError } from '../types';
|
|
2
|
+
export function classifyExpressionError(error) {
|
|
3
|
+
if (error instanceof TimeoutError)
|
|
4
|
+
return 'timeout';
|
|
5
|
+
if (error instanceof MemoryLimitError)
|
|
6
|
+
return 'memory_limit';
|
|
7
|
+
if (error instanceof SecurityViolationError)
|
|
8
|
+
return 'security';
|
|
9
|
+
if (error instanceof SyntaxError)
|
|
10
|
+
return 'syntax';
|
|
11
|
+
return 'unknown';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=error-classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-classification.js","sourceRoot":"","sources":["../../../src/evaluator/error-classification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI/F,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,KAAK,YAAY,gBAAgB;QAAE,OAAO,cAAc,CAAC;IAC7D,IAAI,KAAK,YAAY,sBAAsB;QAAE,OAAO,UAAU,CAAC;IAC/D,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -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,
|
|
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;gBAEhD,MAAM,EAAE,eAAe;IA8B7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C,QAAQ,CACP,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACvB,OAAO;IAuBV,OAAO,CAAC,SAAS;IAeX,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3C;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA8BpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,UAAU,IAAI,OAAO;CAGrB"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import { Tournament } from '@n8n/tournament';
|
|
2
2
|
import { DEFAULT_BRIDGE_CONFIG } from '../types/bridge';
|
|
3
3
|
import { IsolateError } from '@n8n/errors';
|
|
4
|
+
import { IdleScalingPool } from '../pool/idle-scaling-pool';
|
|
4
5
|
import { IsolatePool, PoolDisposedError, PoolExhaustedError } from '../pool/isolate-pool';
|
|
6
|
+
import { EXPRESSION_METRICS } from '../observability/metrics';
|
|
7
|
+
import { classifyExpressionError } from './error-classification';
|
|
5
8
|
import { LruCache } from './lru-cache';
|
|
9
|
+
function recordOutcome(observability, start, status, error) {
|
|
10
|
+
if (!observability)
|
|
11
|
+
return;
|
|
12
|
+
const durationSeconds = (performance.now() - start) / 1000;
|
|
13
|
+
const errorType = error !== undefined ? classifyExpressionError(error) : undefined;
|
|
14
|
+
observability.metrics.histogram(EXPRESSION_METRICS.evaluationDuration.name, durationSeconds, {
|
|
15
|
+
status,
|
|
16
|
+
type: errorType ?? 'none',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
6
19
|
export class ExpressionEvaluator {
|
|
7
20
|
config;
|
|
8
21
|
disposed = false;
|
|
@@ -17,7 +30,7 @@ export class ExpressionEvaluator {
|
|
|
17
30
|
constructor(config) {
|
|
18
31
|
this.config = config;
|
|
19
32
|
this.codeCache = new LruCache(config.maxCodeCacheSize, () => {
|
|
20
|
-
this.config.observability?.metrics.counter(
|
|
33
|
+
this.config.observability?.metrics.counter(EXPRESSION_METRICS.codeCacheEviction.name, 1);
|
|
21
34
|
});
|
|
22
35
|
const logger = config.logger ?? DEFAULT_BRIDGE_CONFIG.logger;
|
|
23
36
|
this.createBridge = async () => {
|
|
@@ -25,10 +38,14 @@ export class ExpressionEvaluator {
|
|
|
25
38
|
await bridge.initialize();
|
|
26
39
|
return bridge;
|
|
27
40
|
};
|
|
28
|
-
|
|
41
|
+
const onReplenishFailed = (error) => {
|
|
29
42
|
logger.error('[IsolatePool] Failed to replenish bridge', { error });
|
|
30
|
-
config.observability?.metrics.counter(
|
|
31
|
-
}
|
|
43
|
+
config.observability?.metrics.counter(EXPRESSION_METRICS.poolReplenishFailed.name, 1);
|
|
44
|
+
};
|
|
45
|
+
this.pool =
|
|
46
|
+
config.idleTimeoutMs === undefined
|
|
47
|
+
? new IsolatePool(this.createBridge, config.poolSize ?? 1, onReplenishFailed, logger)
|
|
48
|
+
: new IdleScalingPool(this.createBridge, config.poolSize ?? 1, config.idleTimeoutMs, onReplenishFailed, logger, config.observability);
|
|
32
49
|
}
|
|
33
50
|
async initialize() {
|
|
34
51
|
await this.pool.initialize();
|
|
@@ -47,7 +64,7 @@ export class ExpressionEvaluator {
|
|
|
47
64
|
throw error;
|
|
48
65
|
bridge = await this.createBridge();
|
|
49
66
|
}
|
|
50
|
-
this.config.observability?.metrics.counter(
|
|
67
|
+
this.config.observability?.metrics.counter(EXPRESSION_METRICS.poolAcquired.name, 1);
|
|
51
68
|
this.bridgesByCaller.set(caller, bridge);
|
|
52
69
|
}
|
|
53
70
|
evaluate(expression, data, caller, options) {
|
|
@@ -56,19 +73,17 @@ export class ExpressionEvaluator {
|
|
|
56
73
|
const bridge = this.getBridge(caller);
|
|
57
74
|
// Transform template expression → sanitized JavaScript (cached)
|
|
58
75
|
const transformedCode = this.getTransformedCode(expression);
|
|
76
|
+
const { observability } = this.config;
|
|
77
|
+
const start = performance.now();
|
|
59
78
|
try {
|
|
60
79
|
const result = bridge.execute(transformedCode, data, {
|
|
61
80
|
timezone: options?.timezone,
|
|
62
81
|
});
|
|
63
|
-
|
|
64
|
-
this.config.observability.metrics.counter('expression.evaluation.success', 1);
|
|
65
|
-
}
|
|
82
|
+
recordOutcome(observability, start, 'success');
|
|
66
83
|
return result;
|
|
67
84
|
}
|
|
68
85
|
catch (error) {
|
|
69
|
-
|
|
70
|
-
this.config.observability.metrics.counter('expression.evaluation.error', 1);
|
|
71
|
-
}
|
|
86
|
+
recordOutcome(observability, start, 'error', error);
|
|
72
87
|
throw error;
|
|
73
88
|
}
|
|
74
89
|
}
|
|
@@ -106,10 +121,10 @@ export class ExpressionEvaluator {
|
|
|
106
121
|
getTransformedCode(expression) {
|
|
107
122
|
const cached = this.codeCache.get(expression);
|
|
108
123
|
if (cached !== undefined) {
|
|
109
|
-
this.config.observability?.metrics.counter(
|
|
124
|
+
this.config.observability?.metrics.counter(EXPRESSION_METRICS.codeCacheHit.name, 1);
|
|
110
125
|
return cached;
|
|
111
126
|
}
|
|
112
|
-
this.config.observability?.metrics.counter(
|
|
127
|
+
this.config.observability?.metrics.counter(EXPRESSION_METRICS.codeCacheMiss.name, 1);
|
|
113
128
|
if (!this.tournament) {
|
|
114
129
|
// Tournament requires an errorHandler but we only use getExpressionCode()
|
|
115
130
|
// for AST transformation — we never call tournament.execute(), so this
|
|
@@ -123,13 +138,13 @@ export class ExpressionEvaluator {
|
|
|
123
138
|
}
|
|
124
139
|
const [transformedCode] = this.tournament.getExpressionCode(expression);
|
|
125
140
|
this.codeCache.set(expression, transformedCode);
|
|
126
|
-
this.config.observability?.metrics.gauge(
|
|
141
|
+
this.config.observability?.metrics.gauge(EXPRESSION_METRICS.codeCacheSize.name, this.codeCache.size);
|
|
127
142
|
return transformedCode;
|
|
128
143
|
}
|
|
129
144
|
async dispose() {
|
|
130
145
|
this.disposed = true;
|
|
131
146
|
this.codeCache.clear();
|
|
132
|
-
this.config.observability?.metrics.gauge(
|
|
147
|
+
this.config.observability?.metrics.gauge(EXPRESSION_METRICS.codeCacheSize.name, 0);
|
|
133
148
|
await this.pool.dispose();
|
|
134
149
|
}
|
|
135
150
|
isDisposed() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-evaluator.js","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"expression-evaluator.js","sourceRoot":"","sources":["../../../src/evaluator/expression-evaluator.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ export { IsolatedVmBridge } from './bridge/isolated-vm-bridge';
|
|
|
3
3
|
export type { IExpressionEvaluator, EvaluatorConfig, WorkflowData, EvaluateOptions, ExecuteOptions, RuntimeBridge, BridgeConfig, Logger, ObservabilityProvider, MetricsAPI, TracesAPI, Span, LogsAPI, } from './types';
|
|
4
4
|
export { ExpressionError, MemoryLimitError, TimeoutError, SecurityViolationError, SyntaxError, } from './types';
|
|
5
5
|
export { IsolateError } from '@n8n/errors';
|
|
6
|
+
export { NoOpProvider } from './observability/noop-provider';
|
|
7
|
+
export { EXPRESSION_METRICS } from './observability/metrics';
|
|
8
|
+
export type { ExpressionMetricDef, ExpressionMetricKey, MetricDef } from './observability/metrics';
|
|
9
|
+
export { classifyExpressionError } from './evaluator/error-classification';
|
|
10
|
+
export type { ExpressionErrorType } from './evaluator/error-classification';
|
|
6
11
|
export { extend, extendOptional, EXTENSION_OBJECTS } from './extensions/extend';
|
|
7
12
|
export { ExpressionExtensionError } from './extensions/expression-extension-error';
|
|
8
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAIvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,YAAY,EACX,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,IAAI,EACJ,OAAO,GACP,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,WAAW,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAIvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,YAAY,EACX,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,IAAI,EACJ,OAAO,GACP,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,WAAW,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,YAAY,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAG5E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -6,6 +6,9 @@ export { IsolatedVmBridge } from './bridge/isolated-vm-bridge';
|
|
|
6
6
|
// Error types
|
|
7
7
|
export { ExpressionError, MemoryLimitError, TimeoutError, SecurityViolationError, SyntaxError, } from './types';
|
|
8
8
|
export { IsolateError } from '@n8n/errors';
|
|
9
|
+
export { NoOpProvider } from './observability/noop-provider';
|
|
10
|
+
export { EXPRESSION_METRICS } from './observability/metrics';
|
|
11
|
+
export { classifyExpressionError } from './evaluator/error-classification';
|
|
9
12
|
// Extension runtime exports
|
|
10
13
|
export { extend, extendOptional, EXTENSION_OBJECTS } from './extensions/extend';
|
|
11
14
|
export { ExpressionExtensionError } from './extensions/expression-extension-error';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,uEAAuE;AACvE,6EAA6E;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAmB/D,cAAc;AACd,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,WAAW,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,4BAA4B;AAC5B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,uEAAuE;AACvE,6EAA6E;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAmB/D,cAAc;AACd,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,sBAAsB,EACtB,WAAW,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAG3E,4BAA4B;AAC5B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export interface MetricDef {
|
|
2
|
+
name: string;
|
|
3
|
+
kind: 'counter' | 'gauge' | 'histogram';
|
|
4
|
+
labels: readonly string[];
|
|
5
|
+
help: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const EXPRESSION_METRICS: {
|
|
8
|
+
readonly evaluationDuration: {
|
|
9
|
+
readonly name: "expression.evaluation.duration_seconds";
|
|
10
|
+
readonly kind: "histogram";
|
|
11
|
+
readonly labels: readonly ["status", "type"];
|
|
12
|
+
readonly help: "Duration of VM-based expression evaluation in seconds.";
|
|
13
|
+
};
|
|
14
|
+
readonly codeCacheHit: {
|
|
15
|
+
readonly name: "expression.code_cache.hit";
|
|
16
|
+
readonly kind: "counter";
|
|
17
|
+
readonly labels: readonly [];
|
|
18
|
+
readonly help: "Expression code cache hits.";
|
|
19
|
+
};
|
|
20
|
+
readonly codeCacheMiss: {
|
|
21
|
+
readonly name: "expression.code_cache.miss";
|
|
22
|
+
readonly kind: "counter";
|
|
23
|
+
readonly labels: readonly [];
|
|
24
|
+
readonly help: "Expression code cache misses.";
|
|
25
|
+
};
|
|
26
|
+
readonly codeCacheEviction: {
|
|
27
|
+
readonly name: "expression.code_cache.eviction";
|
|
28
|
+
readonly kind: "counter";
|
|
29
|
+
readonly labels: readonly [];
|
|
30
|
+
readonly help: "Expression code cache evictions.";
|
|
31
|
+
};
|
|
32
|
+
readonly codeCacheSize: {
|
|
33
|
+
readonly name: "expression.code_cache.size";
|
|
34
|
+
readonly kind: "gauge";
|
|
35
|
+
readonly labels: readonly [];
|
|
36
|
+
readonly help: "Current expression code cache size.";
|
|
37
|
+
};
|
|
38
|
+
readonly poolAcquired: {
|
|
39
|
+
readonly name: "expression.pool.acquired";
|
|
40
|
+
readonly kind: "counter";
|
|
41
|
+
readonly labels: readonly [];
|
|
42
|
+
readonly help: "Bridges acquired from the expression pool.";
|
|
43
|
+
};
|
|
44
|
+
readonly poolReplenishFailed: {
|
|
45
|
+
readonly name: "expression.pool.replenish_failed";
|
|
46
|
+
readonly kind: "counter";
|
|
47
|
+
readonly labels: readonly [];
|
|
48
|
+
readonly help: "Failed pool bridge replenishments.";
|
|
49
|
+
};
|
|
50
|
+
readonly poolScaledUp: {
|
|
51
|
+
readonly name: "expression.pool.scaled_up";
|
|
52
|
+
readonly kind: "counter";
|
|
53
|
+
readonly labels: readonly [];
|
|
54
|
+
readonly help: "Expression pool scaled up from idle.";
|
|
55
|
+
};
|
|
56
|
+
readonly poolScaledToZero: {
|
|
57
|
+
readonly name: "expression.pool.scaled_to_zero";
|
|
58
|
+
readonly kind: "counter";
|
|
59
|
+
readonly labels: readonly [];
|
|
60
|
+
readonly help: "Expression pool scaled to zero after inactivity.";
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
export type ExpressionMetricKey = keyof typeof EXPRESSION_METRICS;
|
|
64
|
+
export type ExpressionMetricDef = (typeof EXPRESSION_METRICS)[ExpressionMetricKey];
|
|
65
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDe,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export const EXPRESSION_METRICS = {
|
|
2
|
+
evaluationDuration: {
|
|
3
|
+
name: 'expression.evaluation.duration_seconds',
|
|
4
|
+
kind: 'histogram',
|
|
5
|
+
labels: ['status', 'type'],
|
|
6
|
+
help: 'Duration of VM-based expression evaluation in seconds.',
|
|
7
|
+
},
|
|
8
|
+
codeCacheHit: {
|
|
9
|
+
name: 'expression.code_cache.hit',
|
|
10
|
+
kind: 'counter',
|
|
11
|
+
labels: [],
|
|
12
|
+
help: 'Expression code cache hits.',
|
|
13
|
+
},
|
|
14
|
+
codeCacheMiss: {
|
|
15
|
+
name: 'expression.code_cache.miss',
|
|
16
|
+
kind: 'counter',
|
|
17
|
+
labels: [],
|
|
18
|
+
help: 'Expression code cache misses.',
|
|
19
|
+
},
|
|
20
|
+
codeCacheEviction: {
|
|
21
|
+
name: 'expression.code_cache.eviction',
|
|
22
|
+
kind: 'counter',
|
|
23
|
+
labels: [],
|
|
24
|
+
help: 'Expression code cache evictions.',
|
|
25
|
+
},
|
|
26
|
+
codeCacheSize: {
|
|
27
|
+
name: 'expression.code_cache.size',
|
|
28
|
+
kind: 'gauge',
|
|
29
|
+
labels: [],
|
|
30
|
+
help: 'Current expression code cache size.',
|
|
31
|
+
},
|
|
32
|
+
poolAcquired: {
|
|
33
|
+
name: 'expression.pool.acquired',
|
|
34
|
+
kind: 'counter',
|
|
35
|
+
labels: [],
|
|
36
|
+
help: 'Bridges acquired from the expression pool.',
|
|
37
|
+
},
|
|
38
|
+
poolReplenishFailed: {
|
|
39
|
+
name: 'expression.pool.replenish_failed',
|
|
40
|
+
kind: 'counter',
|
|
41
|
+
labels: [],
|
|
42
|
+
help: 'Failed pool bridge replenishments.',
|
|
43
|
+
},
|
|
44
|
+
poolScaledUp: {
|
|
45
|
+
name: 'expression.pool.scaled_up',
|
|
46
|
+
kind: 'counter',
|
|
47
|
+
labels: [],
|
|
48
|
+
help: 'Expression pool scaled up from idle.',
|
|
49
|
+
},
|
|
50
|
+
poolScaledToZero: {
|
|
51
|
+
name: 'expression.pool.scaled_to_zero',
|
|
52
|
+
kind: 'counter',
|
|
53
|
+
labels: [],
|
|
54
|
+
help: 'Expression pool scaled to zero after inactivity.',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/observability/metrics.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,kBAAkB,EAAE;QACnB,IAAI,EAAE,wCAAwC;QAC9C,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,IAAI,EAAE,wDAAwD;KAC9D;IACD,YAAY,EAAE;QACb,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,6BAA6B;KACnC;IACD,aAAa,EAAE;QACd,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,+BAA+B;KACrC;IACD,iBAAiB,EAAE;QAClB,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,kCAAkC;KACxC;IACD,aAAa,EAAE;QACd,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,qCAAqC;KAC3C;IACD,YAAY,EAAE;QACb,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,4CAA4C;KAClD;IACD,mBAAmB,EAAE;QACpB,IAAI,EAAE,kCAAkC;QACxC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,oCAAoC;KAC1C;IACD,YAAY,EAAE;QACb,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,sCAAsC;KAC5C;IACD,gBAAgB,EAAE;QACjB,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,kDAAkD;KACxD;CAC4C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-provider.d.ts","sourceRoot":"","sources":["../../../src/observability/noop-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,qBAAqB,EAAmB,MAAM,UAAU,CAAC;AA0B5F,eAAO,MAAM,YAAY,EAAE,qBAI1B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const noopSpan = {
|
|
2
|
+
setStatus() { },
|
|
3
|
+
setAttribute() { },
|
|
4
|
+
recordException() { },
|
|
5
|
+
end() { },
|
|
6
|
+
};
|
|
7
|
+
const noopMetrics = {
|
|
8
|
+
counter() { },
|
|
9
|
+
gauge() { },
|
|
10
|
+
histogram() { },
|
|
11
|
+
};
|
|
12
|
+
const noopTraces = {
|
|
13
|
+
startSpan: () => noopSpan,
|
|
14
|
+
};
|
|
15
|
+
const noopLogs = {
|
|
16
|
+
error() { },
|
|
17
|
+
warn() { },
|
|
18
|
+
info() { },
|
|
19
|
+
debug() { },
|
|
20
|
+
};
|
|
21
|
+
export const NoOpProvider = {
|
|
22
|
+
metrics: noopMetrics,
|
|
23
|
+
traces: noopTraces,
|
|
24
|
+
logs: noopLogs,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=noop-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-provider.js","sourceRoot":"","sources":["../../../src/observability/noop-provider.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAS;IACtB,SAAS,KAAI,CAAC;IACd,YAAY,KAAI,CAAC;IACjB,eAAe,KAAI,CAAC;IACpB,GAAG,KAAI,CAAC;CACR,CAAC;AAEF,MAAM,WAAW,GAAe;IAC/B,OAAO,KAAI,CAAC;IACZ,KAAK,KAAI,CAAC;IACV,SAAS,KAAI,CAAC;CACd,CAAC;AAEF,MAAM,UAAU,GAAc;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ;CACzB,CAAC;AAEF,MAAM,QAAQ,GAAY;IACzB,KAAK,KAAI,CAAC;IACV,IAAI,KAAI,CAAC;IACT,IAAI,KAAI,CAAC;IACT,KAAK,KAAI,CAAC;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA0B;IAClD,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,QAAQ;CACd,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ObservabilityProvider, RuntimeBridge } from '../types';
|
|
2
|
+
import type { Logger } from '../types/bridge';
|
|
3
|
+
import type { IPool } from './isolate-pool';
|
|
4
|
+
/**
|
|
5
|
+
* Wraps an `IsolatePool`, disposing it after a configured idle period and
|
|
6
|
+
* recreating it on the next acquire. The inner pool either fully exists or
|
|
7
|
+
* does not; callers never observe a partial state.
|
|
8
|
+
*/
|
|
9
|
+
export declare class IdleScalingPool implements IPool {
|
|
10
|
+
private readonly createBridge;
|
|
11
|
+
private readonly size;
|
|
12
|
+
private readonly idleTimeoutMs?;
|
|
13
|
+
private readonly onReplenishFailed?;
|
|
14
|
+
private readonly logger?;
|
|
15
|
+
private readonly observability?;
|
|
16
|
+
private innerPool;
|
|
17
|
+
private pendingScaleUp;
|
|
18
|
+
private pendingScaleDown;
|
|
19
|
+
private idleTimer?;
|
|
20
|
+
private disposed;
|
|
21
|
+
private disposePromise?;
|
|
22
|
+
constructor(createBridge: () => Promise<RuntimeBridge>, size: number, idleTimeoutMs?: number | undefined, onReplenishFailed?: ((error: unknown) => void) | undefined, logger?: Logger | undefined, observability?: ObservabilityProvider | undefined);
|
|
23
|
+
initialize(): Promise<void>;
|
|
24
|
+
acquire(): RuntimeBridge;
|
|
25
|
+
release(bridge: RuntimeBridge): Promise<void>;
|
|
26
|
+
dispose(): Promise<void>;
|
|
27
|
+
private doDispose;
|
|
28
|
+
waitForReplenishment(): Promise<void>;
|
|
29
|
+
private drainPendingTransitions;
|
|
30
|
+
private createInnerPool;
|
|
31
|
+
private resetIdleTimer;
|
|
32
|
+
private triggerScaleUp;
|
|
33
|
+
private triggerScaleDown;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=idle-scaling-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-scaling-pool.d.ts","sourceRoot":"","sources":["../../../src/pool/idle-scaling-pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,KAAK;IAS3C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbhC,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAC,CAAgB;gBAGrB,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,EAC1C,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,YAAA,EACtB,iBAAiB,CAAC,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,aAAA,EAC5C,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,aAAa,CAAC,EAAE,qBAAqB,YAAA;IAGjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,OAAO,IAAI,aAAa;IAUlB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAIhB,SAAS;IAcjB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;YAK7B,uBAAuB;IAUrC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,gBAAgB;CAkBxB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { EXPRESSION_METRICS } from '../observability/metrics';
|
|
2
|
+
import { IsolatePool, PoolDisposedError, PoolExhaustedError } from './isolate-pool';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps an `IsolatePool`, disposing it after a configured idle period and
|
|
5
|
+
* recreating it on the next acquire. The inner pool either fully exists or
|
|
6
|
+
* does not; callers never observe a partial state.
|
|
7
|
+
*/
|
|
8
|
+
export class IdleScalingPool {
|
|
9
|
+
createBridge;
|
|
10
|
+
size;
|
|
11
|
+
idleTimeoutMs;
|
|
12
|
+
onReplenishFailed;
|
|
13
|
+
logger;
|
|
14
|
+
observability;
|
|
15
|
+
innerPool = null;
|
|
16
|
+
pendingScaleUp = null;
|
|
17
|
+
pendingScaleDown = null;
|
|
18
|
+
idleTimer;
|
|
19
|
+
disposed = false;
|
|
20
|
+
disposePromise;
|
|
21
|
+
constructor(createBridge, size, idleTimeoutMs, onReplenishFailed, logger, observability) {
|
|
22
|
+
this.createBridge = createBridge;
|
|
23
|
+
this.size = size;
|
|
24
|
+
this.idleTimeoutMs = idleTimeoutMs;
|
|
25
|
+
this.onReplenishFailed = onReplenishFailed;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.observability = observability;
|
|
28
|
+
}
|
|
29
|
+
async initialize() {
|
|
30
|
+
this.innerPool = this.createInnerPool();
|
|
31
|
+
await this.innerPool.initialize();
|
|
32
|
+
this.resetIdleTimer();
|
|
33
|
+
}
|
|
34
|
+
acquire() {
|
|
35
|
+
if (this.disposed)
|
|
36
|
+
throw new PoolDisposedError();
|
|
37
|
+
if (!this.innerPool) {
|
|
38
|
+
this.triggerScaleUp();
|
|
39
|
+
throw new PoolExhaustedError();
|
|
40
|
+
}
|
|
41
|
+
this.resetIdleTimer();
|
|
42
|
+
return this.innerPool.acquire();
|
|
43
|
+
}
|
|
44
|
+
async release(bridge) {
|
|
45
|
+
if (this.innerPool && !this.disposed) {
|
|
46
|
+
// Pool is live: delegate so the inner pool disposes and replenishes.
|
|
47
|
+
await this.innerPool.release(bridge);
|
|
48
|
+
}
|
|
49
|
+
else if (!bridge.isDisposed()) {
|
|
50
|
+
// Pool is idle, disposed, or the bridge came from cold-start fallback:
|
|
51
|
+
// no pool to delegate to, just dispose to free the V8 isolate.
|
|
52
|
+
await bridge.dispose();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async dispose() {
|
|
56
|
+
return (this.disposePromise ??= this.doDispose());
|
|
57
|
+
}
|
|
58
|
+
async doDispose() {
|
|
59
|
+
this.disposed = true;
|
|
60
|
+
if (this.idleTimer) {
|
|
61
|
+
clearTimeout(this.idleTimer);
|
|
62
|
+
this.idleTimer = undefined;
|
|
63
|
+
}
|
|
64
|
+
await this.drainPendingTransitions();
|
|
65
|
+
if (this.innerPool) {
|
|
66
|
+
const toDispose = this.innerPool;
|
|
67
|
+
this.innerPool = null;
|
|
68
|
+
await toDispose.dispose();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async waitForReplenishment() {
|
|
72
|
+
await this.drainPendingTransitions();
|
|
73
|
+
if (this.innerPool)
|
|
74
|
+
await this.innerPool.waitForReplenishment();
|
|
75
|
+
}
|
|
76
|
+
async drainPendingTransitions() {
|
|
77
|
+
// Snapshot both fields before awaiting so a transition starting between reads
|
|
78
|
+
// can't be missed. Waits for transitions in flight now, not ones started later.
|
|
79
|
+
const promises = [];
|
|
80
|
+
if (this.pendingScaleUp)
|
|
81
|
+
promises.push(this.pendingScaleUp.catch(() => { }));
|
|
82
|
+
if (this.pendingScaleDown)
|
|
83
|
+
promises.push(this.pendingScaleDown.catch(() => { }));
|
|
84
|
+
await Promise.all(promises);
|
|
85
|
+
}
|
|
86
|
+
createInnerPool() {
|
|
87
|
+
return new IsolatePool(this.createBridge, this.size, this.onReplenishFailed, this.logger);
|
|
88
|
+
}
|
|
89
|
+
resetIdleTimer() {
|
|
90
|
+
if (this.idleTimeoutMs === undefined)
|
|
91
|
+
return;
|
|
92
|
+
if (this.idleTimer)
|
|
93
|
+
clearTimeout(this.idleTimer);
|
|
94
|
+
this.idleTimer = setTimeout(() => this.triggerScaleDown(), this.idleTimeoutMs);
|
|
95
|
+
this.idleTimer.unref();
|
|
96
|
+
}
|
|
97
|
+
triggerScaleUp() {
|
|
98
|
+
if (this.pendingScaleUp || this.innerPool || this.disposed)
|
|
99
|
+
return;
|
|
100
|
+
this.logger?.info('[IdleScalingPool] Scaling up from idle');
|
|
101
|
+
this.observability?.metrics.counter(EXPRESSION_METRICS.poolScaledUp.name, 1);
|
|
102
|
+
const newInner = this.createInnerPool();
|
|
103
|
+
this.pendingScaleUp = newInner
|
|
104
|
+
.initialize()
|
|
105
|
+
.then(async () => {
|
|
106
|
+
if (this.disposed) {
|
|
107
|
+
await newInner.dispose();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.innerPool = newInner;
|
|
111
|
+
this.resetIdleTimer();
|
|
112
|
+
})
|
|
113
|
+
.catch(async (error) => {
|
|
114
|
+
this.logger?.error('[IdleScalingPool] Scale-up failed', { error });
|
|
115
|
+
await newInner.dispose().catch(() => { });
|
|
116
|
+
})
|
|
117
|
+
.finally(() => {
|
|
118
|
+
this.pendingScaleUp = null;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
triggerScaleDown() {
|
|
122
|
+
if (this.pendingScaleDown || this.pendingScaleUp || !this.innerPool || this.disposed)
|
|
123
|
+
return;
|
|
124
|
+
this.logger?.info('[IdleScalingPool] Scaling to 0 after inactivity', {
|
|
125
|
+
idleTimeoutMs: this.idleTimeoutMs,
|
|
126
|
+
});
|
|
127
|
+
this.observability?.metrics.counter(EXPRESSION_METRICS.poolScaledToZero.name, 1);
|
|
128
|
+
const oldInner = this.innerPool;
|
|
129
|
+
this.innerPool = null;
|
|
130
|
+
this.pendingScaleDown = oldInner
|
|
131
|
+
.dispose()
|
|
132
|
+
.catch((error) => {
|
|
133
|
+
this.logger?.error('[IdleScalingPool] Scale-down dispose failed', { error });
|
|
134
|
+
})
|
|
135
|
+
.finally(() => {
|
|
136
|
+
this.pendingScaleDown = null;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=idle-scaling-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-scaling-pool.js","sourceRoot":"","sources":["../../../src/pool/idle-scaling-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,15 @@ export declare class PoolDisposedError extends IsolateError {
|
|
|
7
7
|
export declare class PoolExhaustedError extends IsolateError {
|
|
8
8
|
constructor();
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
/** Public contract shared by IsolatePool and IdleScalingPool. */
|
|
11
|
+
export interface IPool {
|
|
12
|
+
initialize(): Promise<void>;
|
|
13
|
+
acquire(): RuntimeBridge;
|
|
14
|
+
release(bridge: RuntimeBridge): Promise<void>;
|
|
15
|
+
dispose(): Promise<void>;
|
|
16
|
+
waitForReplenishment(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare class IsolatePool implements IPool {
|
|
11
19
|
private readonly createBridge;
|
|
12
20
|
private readonly size;
|
|
13
21
|
private readonly onReplenishFailed?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolate-pool.d.ts","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,qBAAa,iBAAkB,SAAQ,YAAY;;CAKlD;AAED,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD;AAED,
|
|
1
|
+
{"version":3,"file":"isolate-pool.d.ts","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,qBAAa,iBAAkB,SAAQ,YAAY;;CAKlD;AAED,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD;AAED,iEAAiE;AACjE,MAAM,WAAW,KAAK;IACrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,aAAa,CAAC;IACzB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,qBAAa,WAAY,YAAW,KAAK;IASvC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAXzB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,iDAAiD;IACjD,OAAO,CAAC,OAAO,CAAK;IACpB,gDAAgD;IAChD,OAAO,CAAC,iBAAiB,CAA4B;gBAGnC,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,EAC1C,IAAI,EAAE,MAAM,EACZ,iBAAiB,CAAC,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,aAAA,EAC5C,MAAM,CAAC,EAAE,MAAM,YAAA;IAG3B,UAAU;IAoBhB;;;OAGG;IACH,OAAO,IAAI,aAAa;IAQlB,OAAO,CAAC,MAAM,EAAE,aAAa;IAK7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAK;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAEhD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3C,OAAO,CAAC,SAAS;CA4BjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolate-pool.js","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAClD;QACC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACjC,CAAC;CACD;AAED,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACnD;QACC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IAClC,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"isolate-pool.js","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,8 @@ export interface EvaluatorConfig {
|
|
|
30
30
|
* to give each concurrent execution a pre-warmed bridge.
|
|
31
31
|
*/
|
|
32
32
|
poolSize?: number;
|
|
33
|
+
/** If set, scale the pool to 0 warm bridges after this many ms with no isolate acquire. */
|
|
34
|
+
idleTimeoutMs?: number;
|
|
33
35
|
/** Optional logger. Passed through to pool. Falls back to no-op. */
|
|
34
36
|
logger?: Logger;
|
|
35
37
|
}
|