@n8n/expression-runtime 0.10.0 → 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.
Files changed (71) hide show
  1. package/dist/bundle/runtime.esm.js +1 -1
  2. package/dist/bundle/runtime.esm.js.map +3 -3
  3. package/dist/bundle/runtime.iife.js +1 -1
  4. package/dist/bundle/runtime.iife.js.map +3 -3
  5. package/dist/cjs/build.tsbuildinfo +1 -1
  6. package/dist/cjs/evaluator/error-classification.d.ts +3 -0
  7. package/dist/cjs/evaluator/error-classification.d.ts.map +1 -0
  8. package/dist/cjs/evaluator/error-classification.js +26 -0
  9. package/dist/cjs/evaluator/error-classification.js.map +1 -0
  10. package/dist/cjs/evaluator/expression-evaluator.d.ts.map +1 -1
  11. package/dist/cjs/evaluator/expression-evaluator.js +31 -16
  12. package/dist/cjs/evaluator/expression-evaluator.js.map +1 -1
  13. package/dist/cjs/extensions/function-extensions.d.ts.map +1 -1
  14. package/dist/cjs/extensions/function-extensions.js +8 -5
  15. package/dist/cjs/extensions/function-extensions.js.map +1 -1
  16. package/dist/cjs/index.d.ts +5 -0
  17. package/dist/cjs/index.d.ts.map +1 -1
  18. package/dist/cjs/index.js +8 -2
  19. package/dist/cjs/index.js.map +1 -1
  20. package/dist/cjs/observability/metrics.d.ts +65 -0
  21. package/dist/cjs/observability/metrics.d.ts.map +1 -0
  22. package/dist/cjs/observability/metrics.js +70 -0
  23. package/dist/cjs/observability/metrics.js.map +1 -0
  24. package/dist/cjs/observability/noop-provider.d.ts +3 -0
  25. package/dist/cjs/observability/noop-provider.d.ts.map +1 -0
  26. package/dist/cjs/observability/noop-provider.js +39 -0
  27. package/dist/cjs/observability/noop-provider.js.map +1 -0
  28. package/dist/cjs/pool/idle-scaling-pool.d.ts +35 -0
  29. package/dist/cjs/pool/idle-scaling-pool.d.ts.map +1 -0
  30. package/dist/cjs/pool/idle-scaling-pool.js +154 -0
  31. package/dist/cjs/pool/idle-scaling-pool.js.map +1 -0
  32. package/dist/cjs/pool/isolate-pool.d.ts +9 -1
  33. package/dist/cjs/pool/isolate-pool.d.ts.map +1 -1
  34. package/dist/cjs/pool/isolate-pool.js.map +1 -1
  35. package/dist/cjs/types/evaluator.d.ts +2 -0
  36. package/dist/cjs/types/evaluator.d.ts.map +1 -1
  37. package/dist/cjs/types/evaluator.js.map +1 -1
  38. package/dist/esm/build.tsbuildinfo +1 -1
  39. package/dist/esm/evaluator/error-classification.d.ts +3 -0
  40. package/dist/esm/evaluator/error-classification.d.ts.map +1 -0
  41. package/dist/esm/evaluator/error-classification.js +13 -0
  42. package/dist/esm/evaluator/error-classification.js.map +1 -0
  43. package/dist/esm/evaluator/expression-evaluator.d.ts.map +1 -1
  44. package/dist/esm/evaluator/expression-evaluator.js +30 -15
  45. package/dist/esm/evaluator/expression-evaluator.js.map +1 -1
  46. package/dist/esm/extensions/function-extensions.d.ts.map +1 -1
  47. package/dist/esm/extensions/function-extensions.js +8 -5
  48. package/dist/esm/extensions/function-extensions.js.map +1 -1
  49. package/dist/esm/index.d.ts +5 -0
  50. package/dist/esm/index.d.ts.map +1 -1
  51. package/dist/esm/index.js +3 -0
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/observability/metrics.d.ts +65 -0
  54. package/dist/esm/observability/metrics.d.ts.map +1 -0
  55. package/dist/esm/observability/metrics.js +57 -0
  56. package/dist/esm/observability/metrics.js.map +1 -0
  57. package/dist/esm/observability/noop-provider.d.ts +3 -0
  58. package/dist/esm/observability/noop-provider.d.ts.map +1 -0
  59. package/dist/esm/observability/noop-provider.js +26 -0
  60. package/dist/esm/observability/noop-provider.js.map +1 -0
  61. package/dist/esm/pool/idle-scaling-pool.d.ts +35 -0
  62. package/dist/esm/pool/idle-scaling-pool.d.ts.map +1 -0
  63. package/dist/esm/pool/idle-scaling-pool.js +140 -0
  64. package/dist/esm/pool/idle-scaling-pool.js.map +1 -0
  65. package/dist/esm/pool/isolate-pool.d.ts +9 -1
  66. package/dist/esm/pool/isolate-pool.d.ts.map +1 -1
  67. package/dist/esm/pool/isolate-pool.js.map +1 -1
  68. package/dist/esm/types/evaluator.d.ts +2 -0
  69. package/dist/esm/types/evaluator.d.ts.map +1 -1
  70. package/dist/esm/types/evaluator.js.map +1 -1
  71. package/package.json +5 -5
@@ -0,0 +1,3 @@
1
+ export type ExpressionErrorType = 'timeout' | 'memory_limit' | 'security' | 'syntax' | 'unknown';
2
+ export declare function classifyExpressionError(error: unknown): ExpressionErrorType;
3
+ //# sourceMappingURL=error-classification.d.ts.map
@@ -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,EAEf,MAAM,UAAU,CAAC;AAMlB,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,CAAc;IAE1B,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;gBAEhD,MAAM,EAAE,eAAe;IAsB7B,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;IA0BV,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;IA2BpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,UAAU,IAAI,OAAO;CAGrB"}
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('expression.code_cache.eviction', 1);
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
- this.pool = new IsolatePool(this.createBridge, config.poolSize ?? 1, (error) => {
41
+ const onReplenishFailed = (error) => {
29
42
  logger.error('[IsolatePool] Failed to replenish bridge', { error });
30
- config.observability?.metrics.counter('expression.pool.replenish_failed', 1);
31
- }, logger);
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('expression.pool.acquired', 1);
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
- if (this.config.observability) {
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
- if (this.config.observability) {
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('expression.code_cache.hit', 1);
124
+ this.config.observability?.metrics.counter(EXPRESSION_METRICS.codeCacheHit.name, 1);
110
125
  return cached;
111
126
  }
112
- this.config.observability?.metrics.counter('expression.code_cache.miss', 1);
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('expression.code_cache.size', this.codeCache.size);
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('expression.code_cache.size', 0);
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":"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"}
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":"function-extensions.d.ts","sourceRoot":"","sources":["../../../src/extensions/function-extensions.ts"],"names":[],"mappings":"AAyCA,iBAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,gBAsB/C;kBAtBQ,OAAO;;;;;;;;;;;;AAoChB,eAAO,MAAM,iBAAiB;;;iBAxCV,OAAO,KAAG,OAAO;uBAJX,MAAM,EAAE;wBA3BP,MAAM,OAAO,MAAM,KAAG,MAAM,EAAE;gBAgBtC,OAAO,EAAE,UAAU,OAAO,EAAE,KAAG,OAAO;;;wBAW/B,MAAM,EAAE;kBAId,OAAO,KAAG,OAAO;;CAoDpC,CAAC"}
1
+ {"version":3,"file":"function-extensions.d.ts","sourceRoot":"","sources":["../../../src/extensions/function-extensions.ts"],"names":[],"mappings":"AA4CA,iBAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,gBAsB/C;kBAtBQ,OAAO;;;;;;;;;;;;AAoChB,eAAO,MAAM,iBAAiB;;;iBAxCV,OAAO,KAAG,OAAO;uBAJX,MAAM,EAAE;wBA9BP,MAAM,OAAO,MAAM,KAAG,MAAM,EAAE;gBAgBtC,OAAO,EAAE,UAAU,OAAO,EAAE,KAAG,OAAO;;;wBAc/B,MAAM,EAAE;kBAId,OAAO,KAAG,OAAO;;CAoDpC,CAAC"}
@@ -17,14 +17,17 @@ const numberList = (start, end) => {
17
17
  return arr;
18
18
  };
19
19
  const zip = (keys, values) => {
20
+ if (!Array.isArray(keys) || !Array.isArray(values)) {
21
+ throw new ExpressionExtensionError('keys and values must be arrays');
22
+ }
20
23
  if (keys.length !== values.length) {
21
24
  throw new ExpressionExtensionError('keys and values not of equal length');
22
25
  }
23
- return keys.reduce((p, c, i) => {
24
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
25
- p[c] = values[i];
26
- return p;
27
- }, {});
26
+ const result = {};
27
+ for (let i = 0; i < keys.length; i++) {
28
+ result[keys[i]] = values[i];
29
+ }
30
+ return result;
28
31
  };
29
32
  const average = (...args) => {
30
33
  return aAverage(args);
@@ -1 +1 @@
1
- {"version":3,"file":"function-extensions.js","sourceRoot":"","sources":["../../../src/extensions/function-extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"function-extensions.js","sourceRoot":"","sources":["../../../src/extensions/function-extensions.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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;AAG3C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,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';
@@ -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,3 @@
1
+ import type { ObservabilityProvider } from '../types';
2
+ export declare const NoOpProvider: ObservabilityProvider;
3
+ //# sourceMappingURL=noop-provider.d.ts.map
@@ -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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"}