@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,154 +1,144 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IdleScalingPool = void 0;
|
|
4
|
+
const metrics_1 = require("../observability/metrics");
|
|
5
|
+
const isolate_pool_1 = require("./isolate-pool");
|
|
6
|
+
/**
|
|
7
|
+
* Wraps an `IsolatePool`, disposing it after a configured idle period and
|
|
8
|
+
* recreating it on the next acquire. The inner pool either fully exists or
|
|
9
|
+
* does not; callers never observe a partial state.
|
|
10
|
+
*/
|
|
11
|
+
class IdleScalingPool {
|
|
12
|
+
createBridge;
|
|
13
|
+
size;
|
|
14
|
+
idleTimeoutMs;
|
|
15
|
+
onReplenishFailed;
|
|
16
|
+
logger;
|
|
17
|
+
observability;
|
|
18
|
+
innerPool = null;
|
|
19
|
+
pendingScaleUp = null;
|
|
20
|
+
pendingScaleDown = null;
|
|
21
|
+
idleTimer;
|
|
22
|
+
disposed = false;
|
|
23
|
+
disposePromise;
|
|
24
|
+
constructor(createBridge, size, idleTimeoutMs, onReplenishFailed, logger, observability) {
|
|
25
|
+
this.createBridge = createBridge;
|
|
26
|
+
this.size = size;
|
|
27
|
+
this.idleTimeoutMs = idleTimeoutMs;
|
|
28
|
+
this.onReplenishFailed = onReplenishFailed;
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.observability = observability;
|
|
5
31
|
}
|
|
6
|
-
|
|
7
|
-
|
|
32
|
+
async initialize() {
|
|
33
|
+
this.innerPool = this.createInnerPool();
|
|
34
|
+
await this.innerPool.initialize();
|
|
35
|
+
this.resetIdleTimer();
|
|
8
36
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Wraps an `IsolatePool`, disposing it after a configured idle period and
|
|
17
|
-
* recreating it on the next acquire. The inner pool either fully exists or
|
|
18
|
-
* does not; callers never observe a partial state.
|
|
19
|
-
*/
|
|
20
|
-
class IdleScalingPool {
|
|
21
|
-
createBridge;
|
|
22
|
-
size;
|
|
23
|
-
idleTimeoutMs;
|
|
24
|
-
onReplenishFailed;
|
|
25
|
-
logger;
|
|
26
|
-
observability;
|
|
27
|
-
innerPool = null;
|
|
28
|
-
pendingScaleUp = null;
|
|
29
|
-
pendingScaleDown = null;
|
|
30
|
-
idleTimer;
|
|
31
|
-
disposed = false;
|
|
32
|
-
disposePromise;
|
|
33
|
-
constructor(createBridge, size, idleTimeoutMs, onReplenishFailed, logger, observability) {
|
|
34
|
-
this.createBridge = createBridge;
|
|
35
|
-
this.size = size;
|
|
36
|
-
this.idleTimeoutMs = idleTimeoutMs;
|
|
37
|
-
this.onReplenishFailed = onReplenishFailed;
|
|
38
|
-
this.logger = logger;
|
|
39
|
-
this.observability = observability;
|
|
37
|
+
acquire() {
|
|
38
|
+
if (this.disposed)
|
|
39
|
+
throw new isolate_pool_1.PoolDisposedError();
|
|
40
|
+
if (!this.innerPool) {
|
|
41
|
+
this.triggerScaleUp();
|
|
42
|
+
throw new isolate_pool_1.PoolExhaustedError();
|
|
40
43
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
throw new isolate_pool_1.PoolDisposedError();
|
|
49
|
-
if (!this.innerPool) {
|
|
50
|
-
this.triggerScaleUp();
|
|
51
|
-
throw new isolate_pool_1.PoolExhaustedError();
|
|
52
|
-
}
|
|
53
|
-
this.resetIdleTimer();
|
|
54
|
-
return this.innerPool.acquire();
|
|
55
|
-
}
|
|
56
|
-
async release(bridge) {
|
|
57
|
-
if (this.innerPool && !this.disposed) {
|
|
58
|
-
// Pool is live: delegate so the inner pool disposes and replenishes.
|
|
59
|
-
await this.innerPool.release(bridge);
|
|
60
|
-
}
|
|
61
|
-
else if (!bridge.isDisposed()) {
|
|
62
|
-
// Pool is idle, disposed, or the bridge came from cold-start fallback:
|
|
63
|
-
// no pool to delegate to, just dispose to free the V8 isolate.
|
|
64
|
-
await bridge.dispose();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async dispose() {
|
|
68
|
-
return (this.disposePromise ??= this.doDispose());
|
|
69
|
-
}
|
|
70
|
-
async doDispose() {
|
|
71
|
-
this.disposed = true;
|
|
72
|
-
if (this.idleTimer) {
|
|
73
|
-
clearTimeout(this.idleTimer);
|
|
74
|
-
this.idleTimer = undefined;
|
|
75
|
-
}
|
|
76
|
-
await this.drainPendingTransitions();
|
|
77
|
-
if (this.innerPool) {
|
|
78
|
-
const toDispose = this.innerPool;
|
|
79
|
-
this.innerPool = null;
|
|
80
|
-
await toDispose.dispose();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async waitForReplenishment() {
|
|
84
|
-
await this.drainPendingTransitions();
|
|
85
|
-
if (this.innerPool)
|
|
86
|
-
await this.innerPool.waitForReplenishment();
|
|
87
|
-
}
|
|
88
|
-
async drainPendingTransitions() {
|
|
89
|
-
// Snapshot both fields before awaiting so a transition starting between reads
|
|
90
|
-
// can't be missed. Waits for transitions in flight now, not ones started later.
|
|
91
|
-
const promises = [];
|
|
92
|
-
if (this.pendingScaleUp)
|
|
93
|
-
promises.push(this.pendingScaleUp.catch(() => { }));
|
|
94
|
-
if (this.pendingScaleDown)
|
|
95
|
-
promises.push(this.pendingScaleDown.catch(() => { }));
|
|
96
|
-
await Promise.all(promises);
|
|
44
|
+
this.resetIdleTimer();
|
|
45
|
+
return this.innerPool.acquire();
|
|
46
|
+
}
|
|
47
|
+
async release(bridge) {
|
|
48
|
+
if (this.innerPool && !this.disposed) {
|
|
49
|
+
// Pool is live: delegate so the inner pool disposes and replenishes.
|
|
50
|
+
await this.innerPool.release(bridge);
|
|
97
51
|
}
|
|
98
|
-
|
|
99
|
-
|
|
52
|
+
else if (!bridge.isDisposed()) {
|
|
53
|
+
// Pool is idle, disposed, or the bridge came from cold-start fallback:
|
|
54
|
+
// no pool to delegate to, just dispose to free the V8 isolate.
|
|
55
|
+
await bridge.dispose();
|
|
100
56
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (this.pendingScaleUp || this.innerPool || this.disposed)
|
|
111
|
-
return;
|
|
112
|
-
this.logger?.debug('[IdleScalingPool] Scaling up from idle');
|
|
113
|
-
this.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolScaledUp.name, 1);
|
|
114
|
-
const newInner = this.createInnerPool();
|
|
115
|
-
this.pendingScaleUp = newInner
|
|
116
|
-
.initialize()
|
|
117
|
-
.then(async () => {
|
|
118
|
-
if (this.disposed) {
|
|
119
|
-
await newInner.dispose();
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
this.innerPool = newInner;
|
|
123
|
-
this.resetIdleTimer();
|
|
124
|
-
})
|
|
125
|
-
.catch(async (error) => {
|
|
126
|
-
this.logger?.error('[IdleScalingPool] Scale-up failed', { error });
|
|
127
|
-
await newInner.dispose().catch(() => { });
|
|
128
|
-
})
|
|
129
|
-
.finally(() => {
|
|
130
|
-
this.pendingScaleUp = null;
|
|
131
|
-
});
|
|
57
|
+
}
|
|
58
|
+
async dispose() {
|
|
59
|
+
return (this.disposePromise ??= this.doDispose());
|
|
60
|
+
}
|
|
61
|
+
async doDispose() {
|
|
62
|
+
this.disposed = true;
|
|
63
|
+
if (this.idleTimer) {
|
|
64
|
+
clearTimeout(this.idleTimer);
|
|
65
|
+
this.idleTimer = undefined;
|
|
132
66
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.logger?.debug('[IdleScalingPool] Scaling to 0 after inactivity', {
|
|
137
|
-
idleTimeoutMs: this.idleTimeoutMs,
|
|
138
|
-
});
|
|
139
|
-
this.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolScaledToZero.name, 1);
|
|
140
|
-
const oldInner = this.innerPool;
|
|
67
|
+
await this.drainPendingTransitions();
|
|
68
|
+
if (this.innerPool) {
|
|
69
|
+
const toDispose = this.innerPool;
|
|
141
70
|
this.innerPool = null;
|
|
142
|
-
|
|
143
|
-
.dispose()
|
|
144
|
-
.catch((error) => {
|
|
145
|
-
this.logger?.error('[IdleScalingPool] Scale-down dispose failed', { error });
|
|
146
|
-
})
|
|
147
|
-
.finally(() => {
|
|
148
|
-
this.pendingScaleDown = null;
|
|
149
|
-
});
|
|
71
|
+
await toDispose.dispose();
|
|
150
72
|
}
|
|
151
73
|
}
|
|
152
|
-
|
|
153
|
-
|
|
74
|
+
async waitForReplenishment() {
|
|
75
|
+
await this.drainPendingTransitions();
|
|
76
|
+
if (this.innerPool)
|
|
77
|
+
await this.innerPool.waitForReplenishment();
|
|
78
|
+
}
|
|
79
|
+
async drainPendingTransitions() {
|
|
80
|
+
// Snapshot both fields before awaiting so a transition starting between reads
|
|
81
|
+
// can't be missed. Waits for transitions in flight now, not ones started later.
|
|
82
|
+
const promises = [];
|
|
83
|
+
if (this.pendingScaleUp)
|
|
84
|
+
promises.push(this.pendingScaleUp.catch(() => { }));
|
|
85
|
+
if (this.pendingScaleDown)
|
|
86
|
+
promises.push(this.pendingScaleDown.catch(() => { }));
|
|
87
|
+
await Promise.all(promises);
|
|
88
|
+
}
|
|
89
|
+
createInnerPool() {
|
|
90
|
+
return new isolate_pool_1.IsolatePool(this.createBridge, this.size, this.onReplenishFailed, this.logger);
|
|
91
|
+
}
|
|
92
|
+
resetIdleTimer() {
|
|
93
|
+
if (this.idleTimeoutMs === undefined)
|
|
94
|
+
return;
|
|
95
|
+
if (this.idleTimer)
|
|
96
|
+
clearTimeout(this.idleTimer);
|
|
97
|
+
this.idleTimer = setTimeout(() => this.triggerScaleDown(), this.idleTimeoutMs);
|
|
98
|
+
this.idleTimer.unref();
|
|
99
|
+
}
|
|
100
|
+
triggerScaleUp() {
|
|
101
|
+
if (this.pendingScaleUp || this.innerPool || this.disposed)
|
|
102
|
+
return;
|
|
103
|
+
this.logger?.debug('[IdleScalingPool] Scaling up from idle');
|
|
104
|
+
this.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolScaledUp.name, 1);
|
|
105
|
+
const newInner = this.createInnerPool();
|
|
106
|
+
this.pendingScaleUp = newInner
|
|
107
|
+
.initialize()
|
|
108
|
+
.then(async () => {
|
|
109
|
+
if (this.disposed) {
|
|
110
|
+
await newInner.dispose();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.innerPool = newInner;
|
|
114
|
+
this.resetIdleTimer();
|
|
115
|
+
})
|
|
116
|
+
.catch(async (error) => {
|
|
117
|
+
this.logger?.error('[IdleScalingPool] Scale-up failed', { error });
|
|
118
|
+
await newInner.dispose().catch(() => { });
|
|
119
|
+
})
|
|
120
|
+
.finally(() => {
|
|
121
|
+
this.pendingScaleUp = null;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
triggerScaleDown() {
|
|
125
|
+
if (this.pendingScaleDown || this.pendingScaleUp || !this.innerPool || this.disposed)
|
|
126
|
+
return;
|
|
127
|
+
this.logger?.debug('[IdleScalingPool] Scaling to 0 after inactivity', {
|
|
128
|
+
idleTimeoutMs: this.idleTimeoutMs,
|
|
129
|
+
});
|
|
130
|
+
this.observability?.metrics.counter(metrics_1.EXPRESSION_METRICS.poolScaledToZero.name, 1);
|
|
131
|
+
const oldInner = this.innerPool;
|
|
132
|
+
this.innerPool = null;
|
|
133
|
+
this.pendingScaleDown = oldInner
|
|
134
|
+
.dispose()
|
|
135
|
+
.catch((error) => {
|
|
136
|
+
this.logger?.error('[IdleScalingPool] Scale-down dispose failed', { error });
|
|
137
|
+
})
|
|
138
|
+
.finally(() => {
|
|
139
|
+
this.pendingScaleDown = null;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.IdleScalingPool = IdleScalingPool;
|
|
154
144
|
//# sourceMappingURL=idle-scaling-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idle-scaling-pool.js","sourceRoot":"","sources":["../../../src/pool/idle-scaling-pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"idle-scaling-pool.js","sourceRoot":"","sources":["../../../src/pool/idle-scaling-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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;IAClD,cAGC;CACD;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IACnD,cAGC;CACD;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;IAErD,YACkB,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,EAC7B;IAEE,UAAU,kBAkBf;IAED;;;OAGG;IACH,OAAO,IAAI,aAAa,CAMvB;IAEK,OAAO,CAAC,MAAM,EAAE,aAAa,iBAGlC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7B;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAK;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAEhD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1C;IAED,OAAO,CAAC,SAAS;CA4BjB"}
|
|
@@ -1,123 +1,113 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IsolatePool = exports.PoolExhaustedError = exports.PoolDisposedError = void 0;
|
|
4
|
+
const errors_1 = require("@n8n/errors");
|
|
5
|
+
class PoolDisposedError extends errors_1.IsolateError {
|
|
6
|
+
constructor() {
|
|
7
|
+
super('Pool is disposed');
|
|
8
|
+
this.name = 'PoolDisposedError';
|
|
5
9
|
}
|
|
6
|
-
|
|
7
|
-
|
|
10
|
+
}
|
|
11
|
+
exports.PoolDisposedError = PoolDisposedError;
|
|
12
|
+
class PoolExhaustedError extends errors_1.IsolateError {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('No isolate bridge available in pool');
|
|
15
|
+
this.name = 'PoolExhaustedError';
|
|
8
16
|
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
}
|
|
18
|
+
exports.PoolExhaustedError = PoolExhaustedError;
|
|
19
|
+
class IsolatePool {
|
|
20
|
+
createBridge;
|
|
21
|
+
size;
|
|
22
|
+
onReplenishFailed;
|
|
23
|
+
logger;
|
|
24
|
+
bridges = [];
|
|
25
|
+
disposed = false;
|
|
26
|
+
/** Number of bridges currently being created. */
|
|
27
|
+
warming = 0;
|
|
28
|
+
/** In-flight isolate replenishment promises. */
|
|
29
|
+
replenishPromises = new Set();
|
|
30
|
+
constructor(createBridge, size, onReplenishFailed, logger) {
|
|
31
|
+
this.createBridge = createBridge;
|
|
32
|
+
this.size = size;
|
|
33
|
+
this.onReplenishFailed = onReplenishFailed;
|
|
34
|
+
this.logger = logger;
|
|
26
35
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
logger;
|
|
33
|
-
bridges = [];
|
|
34
|
-
disposed = false;
|
|
35
|
-
/** Number of bridges currently being created. */
|
|
36
|
-
warming = 0;
|
|
37
|
-
/** In-flight isolate replenishment promises. */
|
|
38
|
-
replenishPromises = new Set();
|
|
39
|
-
constructor(createBridge, size, onReplenishFailed, logger) {
|
|
40
|
-
this.createBridge = createBridge;
|
|
41
|
-
this.size = size;
|
|
42
|
-
this.onReplenishFailed = onReplenishFailed;
|
|
43
|
-
this.logger = logger;
|
|
44
|
-
}
|
|
45
|
-
async initialize() {
|
|
46
|
-
const results = await Promise.allSettled(Array.from({ length: this.size }, () => this.createBridge()));
|
|
47
|
-
for (const result of results) {
|
|
48
|
-
if (result.status === 'fulfilled') {
|
|
49
|
-
this.bridges.push(result.value);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
this.logger?.error('[IsolatePool] Failed to create bridge during init', {
|
|
53
|
-
error: result.reason,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
36
|
+
async initialize() {
|
|
37
|
+
const results = await Promise.allSettled(Array.from({ length: this.size }, () => this.createBridge()));
|
|
38
|
+
for (const result of results) {
|
|
39
|
+
if (result.status === 'fulfilled') {
|
|
40
|
+
this.bridges.push(result.value);
|
|
56
41
|
}
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
else {
|
|
43
|
+
this.logger?.error('[IsolatePool] Failed to create bridge during init', {
|
|
44
|
+
error: result.reason,
|
|
45
|
+
});
|
|
59
46
|
}
|
|
60
47
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* Throws if disposed or pool is empty. Callers are expected to handle the empty case by falling back to cold-start bridge creation.
|
|
64
|
-
*/
|
|
65
|
-
acquire() {
|
|
66
|
-
if (this.disposed)
|
|
67
|
-
throw new PoolDisposedError();
|
|
68
|
-
const bridge = this.bridges.shift();
|
|
69
|
-
if (!bridge)
|
|
70
|
-
throw new PoolExhaustedError();
|
|
71
|
-
void this.replenish();
|
|
72
|
-
return bridge;
|
|
48
|
+
if (this.bridges.length === 0) {
|
|
49
|
+
throw new errors_1.IsolateError('IsolatePool failed to create any bridges');
|
|
73
50
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Pops a warm bridge from the pool. Kickstarts replenishment.
|
|
54
|
+
* Throws if disposed or pool is empty. Callers are expected to handle the empty case by falling back to cold-start bridge creation.
|
|
55
|
+
*/
|
|
56
|
+
acquire() {
|
|
57
|
+
if (this.disposed)
|
|
58
|
+
throw new PoolDisposedError();
|
|
59
|
+
const bridge = this.bridges.shift();
|
|
60
|
+
if (!bridge)
|
|
61
|
+
throw new PoolExhaustedError();
|
|
62
|
+
void this.replenish();
|
|
63
|
+
return bridge;
|
|
64
|
+
}
|
|
65
|
+
async release(bridge) {
|
|
66
|
+
if (!bridge.isDisposed())
|
|
67
|
+
await bridge.dispose();
|
|
68
|
+
this.replenish();
|
|
69
|
+
}
|
|
70
|
+
async dispose() {
|
|
71
|
+
this.disposed = true;
|
|
72
|
+
await Promise.all([...this.replenishPromises]);
|
|
73
|
+
await Promise.all(this.bridges.map((b) => b.dispose()));
|
|
74
|
+
this.bridges = [];
|
|
75
|
+
}
|
|
76
|
+
static MAX_REPLENISH_RETRIES = 3;
|
|
77
|
+
static REPLENISH_RETRY_BASE_MS = 500;
|
|
78
|
+
async waitForReplenishment() {
|
|
79
|
+
if (this.replenishPromises.size > 0) {
|
|
81
80
|
await Promise.all([...this.replenishPromises]);
|
|
82
|
-
await Promise.all(this.bridges.map((b) => b.dispose()));
|
|
83
|
-
this.bridges = [];
|
|
84
|
-
}
|
|
85
|
-
static MAX_REPLENISH_RETRIES = 3;
|
|
86
|
-
static REPLENISH_RETRY_BASE_MS = 500;
|
|
87
|
-
async waitForReplenishment() {
|
|
88
|
-
if (this.replenishPromises.size > 0) {
|
|
89
|
-
await Promise.all([...this.replenishPromises]);
|
|
90
|
-
}
|
|
91
81
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
82
|
+
}
|
|
83
|
+
replenish(attempt = 0) {
|
|
84
|
+
if (this.disposed)
|
|
85
|
+
return;
|
|
86
|
+
if (this.bridges.length + this.warming >= this.size)
|
|
87
|
+
return;
|
|
88
|
+
this.warming++;
|
|
89
|
+
let promise;
|
|
90
|
+
promise = this.createBridge()
|
|
91
|
+
.then((bridge) => {
|
|
92
|
+
this.warming--;
|
|
93
|
+
this.replenishPromises.delete(promise);
|
|
94
|
+
if (this.disposed) {
|
|
95
|
+
void bridge.dispose();
|
|
96
96
|
return;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
this.warming--;
|
|
111
|
-
this.replenishPromises.delete(promise);
|
|
112
|
-
this.onReplenishFailed?.(error);
|
|
113
|
-
if (attempt < IsolatePool.MAX_REPLENISH_RETRIES) {
|
|
114
|
-
const delay = IsolatePool.REPLENISH_RETRY_BASE_MS * 2 ** attempt;
|
|
115
|
-
setTimeout(() => this.replenish(attempt + 1), delay).unref();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
this.replenishPromises.add(promise);
|
|
119
|
-
}
|
|
97
|
+
}
|
|
98
|
+
this.bridges.push(bridge);
|
|
99
|
+
})
|
|
100
|
+
.catch((error) => {
|
|
101
|
+
this.warming--;
|
|
102
|
+
this.replenishPromises.delete(promise);
|
|
103
|
+
this.onReplenishFailed?.(error);
|
|
104
|
+
if (attempt < IsolatePool.MAX_REPLENISH_RETRIES) {
|
|
105
|
+
const delay = IsolatePool.REPLENISH_RETRY_BASE_MS * 2 ** attempt;
|
|
106
|
+
setTimeout(() => this.replenish(attempt + 1), delay).unref();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
this.replenishPromises.add(promise);
|
|
120
110
|
}
|
|
121
|
-
|
|
122
|
-
|
|
111
|
+
}
|
|
112
|
+
exports.IsolatePool = IsolatePool;
|
|
123
113
|
//# sourceMappingURL=isolate-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolate-pool.js","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isolate-pool.js","sourceRoot":"","sources":["../../../src/pool/isolate-pool.ts"],"names":[],"mappings":"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"}
|