@trigger.dev/core 4.0.1 → 4.0.3

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 (145) hide show
  1. package/dist/commonjs/v3/errors.d.ts +1 -0
  2. package/dist/commonjs/v3/errors.js +35 -2
  3. package/dist/commonjs/v3/errors.js.map +1 -1
  4. package/dist/commonjs/v3/heartbeats/api.d.ts +14 -0
  5. package/dist/commonjs/v3/heartbeats/api.js +58 -0
  6. package/dist/commonjs/v3/heartbeats/api.js.map +1 -0
  7. package/dist/commonjs/v3/heartbeats/manager.d.ts +16 -0
  8. package/dist/commonjs/v3/heartbeats/manager.js +72 -0
  9. package/dist/commonjs/v3/heartbeats/manager.js.map +1 -0
  10. package/dist/commonjs/v3/heartbeats/types.d.ts +7 -0
  11. package/dist/commonjs/v3/heartbeats/types.js +3 -0
  12. package/dist/commonjs/v3/heartbeats/types.js.map +1 -0
  13. package/dist/commonjs/v3/heartbeats-api.d.ts +3 -0
  14. package/dist/commonjs/v3/heartbeats-api.js +9 -0
  15. package/dist/commonjs/v3/heartbeats-api.js.map +1 -0
  16. package/dist/commonjs/v3/index.d.ts +1 -0
  17. package/dist/commonjs/v3/index.js +1 -0
  18. package/dist/commonjs/v3/index.js.map +1 -1
  19. package/dist/commonjs/v3/links.d.ts +1 -0
  20. package/dist/commonjs/v3/links.js +1 -0
  21. package/dist/commonjs/v3/links.js.map +1 -1
  22. package/dist/commonjs/v3/runEngineWorker/index.d.ts +1 -0
  23. package/dist/commonjs/v3/runEngineWorker/index.js +1 -0
  24. package/dist/commonjs/v3/runEngineWorker/index.js.map +1 -1
  25. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
  26. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js +316 -0
  27. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
  28. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
  29. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js +589 -0
  30. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
  31. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
  32. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +131 -0
  33. package/dist/commonjs/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
  34. package/dist/commonjs/v3/runEngineWorker/supervisor/http.d.ts +2 -0
  35. package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
  36. package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  37. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  38. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +161 -0
  39. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  40. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  41. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +293 -0
  42. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  43. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  44. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js +153 -0
  45. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  46. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  47. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js +235 -0
  48. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  49. package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.d.ts +6 -0
  50. package/dist/commonjs/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  51. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js +14 -8
  52. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js.map +1 -1
  53. package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +81 -111
  54. package/dist/commonjs/v3/runEngineWorker/workload/http.js +36 -14
  55. package/dist/commonjs/v3/runEngineWorker/workload/http.js.map +1 -1
  56. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +3 -0
  57. package/dist/commonjs/v3/schemas/api.d.ts +144 -0
  58. package/dist/commonjs/v3/schemas/api.js +11 -3
  59. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  60. package/dist/commonjs/v3/schemas/checkpoints.d.ts +3 -0
  61. package/dist/commonjs/v3/schemas/runEngine.d.ts +3 -0
  62. package/dist/commonjs/v3/schemas/runEngine.js +1 -0
  63. package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
  64. package/dist/commonjs/v3/utils/globals.d.ts +2 -0
  65. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  66. package/dist/commonjs/v3/utils/ioSerialization.d.ts +1 -0
  67. package/dist/commonjs/v3/utils/ioSerialization.js +92 -3
  68. package/dist/commonjs/v3/utils/ioSerialization.js.map +1 -1
  69. package/dist/commonjs/v3/workers/index.d.ts +1 -0
  70. package/dist/commonjs/v3/workers/index.js +3 -1
  71. package/dist/commonjs/v3/workers/index.js.map +1 -1
  72. package/dist/commonjs/version.js +1 -1
  73. package/dist/esm/v3/errors.d.ts +1 -0
  74. package/dist/esm/v3/errors.js +34 -2
  75. package/dist/esm/v3/errors.js.map +1 -1
  76. package/dist/esm/v3/heartbeats/api.d.ts +14 -0
  77. package/dist/esm/v3/heartbeats/api.js +54 -0
  78. package/dist/esm/v3/heartbeats/api.js.map +1 -0
  79. package/dist/esm/v3/heartbeats/manager.d.ts +16 -0
  80. package/dist/esm/v3/heartbeats/manager.js +68 -0
  81. package/dist/esm/v3/heartbeats/manager.js.map +1 -0
  82. package/dist/esm/v3/heartbeats/types.d.ts +7 -0
  83. package/dist/esm/v3/heartbeats/types.js +2 -0
  84. package/dist/esm/v3/heartbeats/types.js.map +1 -0
  85. package/dist/esm/v3/heartbeats-api.d.ts +3 -0
  86. package/dist/esm/v3/heartbeats-api.js +6 -0
  87. package/dist/esm/v3/heartbeats-api.js.map +1 -0
  88. package/dist/esm/v3/index.d.ts +1 -0
  89. package/dist/esm/v3/index.js +1 -0
  90. package/dist/esm/v3/index.js.map +1 -1
  91. package/dist/esm/v3/links.d.ts +1 -0
  92. package/dist/esm/v3/links.js +1 -0
  93. package/dist/esm/v3/links.js.map +1 -1
  94. package/dist/esm/v3/runEngineWorker/index.d.ts +1 -0
  95. package/dist/esm/v3/runEngineWorker/index.js +1 -0
  96. package/dist/esm/v3/runEngineWorker/index.js.map +1 -1
  97. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
  98. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js +312 -0
  99. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
  100. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
  101. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js +587 -0
  102. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
  103. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
  104. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +127 -0
  105. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
  106. package/dist/esm/v3/runEngineWorker/supervisor/http.d.ts +2 -0
  107. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
  108. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  109. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  110. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +157 -0
  111. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  112. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  113. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +291 -0
  114. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  115. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  116. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js +146 -0
  117. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  118. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  119. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js +233 -0
  120. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  121. package/dist/esm/v3/runEngineWorker/supervisor/schemas.d.ts +6 -0
  122. package/dist/esm/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  123. package/dist/esm/v3/runEngineWorker/supervisor/session.js +14 -8
  124. package/dist/esm/v3/runEngineWorker/supervisor/session.js.map +1 -1
  125. package/dist/esm/v3/runEngineWorker/workload/http.d.ts +81 -111
  126. package/dist/esm/v3/runEngineWorker/workload/http.js +37 -15
  127. package/dist/esm/v3/runEngineWorker/workload/http.js.map +1 -1
  128. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +3 -0
  129. package/dist/esm/v3/schemas/api.d.ts +144 -0
  130. package/dist/esm/v3/schemas/api.js +8 -0
  131. package/dist/esm/v3/schemas/api.js.map +1 -1
  132. package/dist/esm/v3/schemas/checkpoints.d.ts +3 -0
  133. package/dist/esm/v3/schemas/runEngine.d.ts +3 -0
  134. package/dist/esm/v3/schemas/runEngine.js +1 -0
  135. package/dist/esm/v3/schemas/runEngine.js.map +1 -1
  136. package/dist/esm/v3/utils/globals.d.ts +2 -0
  137. package/dist/esm/v3/utils/globals.js.map +1 -1
  138. package/dist/esm/v3/utils/ioSerialization.d.ts +1 -0
  139. package/dist/esm/v3/utils/ioSerialization.js +92 -3
  140. package/dist/esm/v3/utils/ioSerialization.js.map +1 -1
  141. package/dist/esm/v3/workers/index.d.ts +1 -0
  142. package/dist/esm/v3/workers/index.js +1 -0
  143. package/dist/esm/v3/workers/index.js.map +1 -1
  144. package/dist/esm/version.js +1 -1
  145. package/package.json +1 -1
@@ -0,0 +1,312 @@
1
+ import { SimpleStructuredLogger } from "../../utils/structuredLogger.js";
2
+ import { RunQueueConsumer } from "./queueConsumer.js";
3
+ import { QueueMetricsProcessor } from "./queueMetricsProcessor.js";
4
+ import { ScalingStrategy, } from "./scalingStrategies.js";
5
+ import { ConsumerPoolMetrics } from "./consumerPoolMetrics.js";
6
+ export class RunQueueConsumerPool {
7
+ consumerOptions;
8
+ logger = new SimpleStructuredLogger("consumer-pool");
9
+ promMetrics;
10
+ minConsumerCount;
11
+ maxConsumerCount;
12
+ scalingStrategy;
13
+ disableJitter;
14
+ consumers = new Map();
15
+ consumerFactory;
16
+ isEnabled = false;
17
+ isScaling = false;
18
+ metrics;
19
+ metricsProcessor;
20
+ // Scaling parameters
21
+ ewmaAlpha;
22
+ scaleUpCooldownMs;
23
+ scaleDownCooldownMs;
24
+ batchWindowMs;
25
+ constructor(opts) {
26
+ this.consumerOptions = opts.consumer;
27
+ // Initialize Prometheus metrics if registry provided
28
+ if (opts.metricsRegistry) {
29
+ this.promMetrics = new ConsumerPoolMetrics({
30
+ register: opts.metricsRegistry,
31
+ });
32
+ }
33
+ this.minConsumerCount = Math.max(1, opts.scaling.minConsumerCount ?? 1);
34
+ this.maxConsumerCount = Math.max(this.minConsumerCount, opts.scaling.maxConsumerCount ?? 10);
35
+ this.scaleUpCooldownMs = opts.scaling.scaleUpCooldownMs ?? 10000; // 10 seconds default
36
+ this.scaleDownCooldownMs = opts.scaling.scaleDownCooldownMs ?? 60000; // 60 seconds default
37
+ this.disableJitter = opts.scaling.disableJitter ?? false;
38
+ // Configure EWMA parameters from options
39
+ this.ewmaAlpha = opts.scaling.ewmaAlpha ?? 0.3;
40
+ this.batchWindowMs = opts.scaling.batchWindowMs ?? 1000;
41
+ // Validate EWMA parameters
42
+ if (this.ewmaAlpha < 0 || this.ewmaAlpha > 1) {
43
+ throw new Error(`ewmaAlpha must be between 0 and 1, got: ${this.ewmaAlpha}`);
44
+ }
45
+ if (this.batchWindowMs <= 0) {
46
+ throw new Error(`batchWindowMs must be positive, got: ${this.batchWindowMs}`);
47
+ }
48
+ // Initialize metrics processor
49
+ this.metricsProcessor = new QueueMetricsProcessor({
50
+ ewmaAlpha: this.ewmaAlpha,
51
+ batchWindowMs: this.batchWindowMs,
52
+ });
53
+ const targetRatio = opts.scaling.targetRatio ?? 1.0;
54
+ const dampingFactor = opts.scaling.dampingFactor;
55
+ // Create scaling strategy with metrics processor injected
56
+ this.scalingStrategy = ScalingStrategy.create(opts.scaling.strategy ?? "none", {
57
+ metricsProcessor: this.metricsProcessor,
58
+ dampingFactor,
59
+ targetRatio,
60
+ minConsumerCount: this.minConsumerCount,
61
+ maxConsumerCount: this.maxConsumerCount,
62
+ });
63
+ // Use provided factory or default to RunQueueConsumer
64
+ this.consumerFactory =
65
+ opts.consumerFactory || ((consumerOpts) => new RunQueueConsumer(consumerOpts));
66
+ this.metrics = {
67
+ targetConsumerCount: this.minConsumerCount,
68
+ queueLength: undefined,
69
+ smoothedQueueLength: 0,
70
+ lastScaleTime: new Date(0),
71
+ lastQueueLengthUpdate: new Date(0),
72
+ };
73
+ this.logger.log("Initialized consumer pool", {
74
+ minConsumerCount: this.minConsumerCount,
75
+ maxConsumerCount: this.maxConsumerCount,
76
+ scalingStrategy: this.scalingStrategy.name,
77
+ mode: this.scalingStrategy.name === "none" ? "static" : "dynamic",
78
+ ewmaAlpha: this.ewmaAlpha,
79
+ batchWindowMs: this.batchWindowMs,
80
+ });
81
+ }
82
+ async start() {
83
+ if (this.isEnabled) {
84
+ return;
85
+ }
86
+ this.isEnabled = true;
87
+ // For 'none' strategy, start with max consumers (static mode)
88
+ // For dynamic strategies, start with minimum
89
+ const initialCount = this.scalingStrategy.name === "none" ? this.maxConsumerCount : this.minConsumerCount;
90
+ // Set initial metrics
91
+ this.metrics.targetConsumerCount = initialCount;
92
+ this.addConsumers(initialCount);
93
+ this.logger.log("Started dynamic consumer pool", {
94
+ initialConsumerCount: this.consumers.size,
95
+ });
96
+ // Initialize Prometheus metrics with initial state
97
+ this.promMetrics?.updateState({
98
+ consumerCount: this.consumers.size,
99
+ queueLength: this.metrics.queueLength,
100
+ smoothedQueueLength: this.metrics.smoothedQueueLength,
101
+ targetConsumerCount: initialCount,
102
+ strategy: this.scalingStrategy.name,
103
+ });
104
+ }
105
+ async stop() {
106
+ if (!this.isEnabled) {
107
+ return;
108
+ }
109
+ this.isEnabled = false;
110
+ // Stop all consumers
111
+ Array.from(this.consumers.values()).forEach((consumer) => consumer.stop());
112
+ this.consumers.clear();
113
+ this.logger.log("Stopped dynamic consumer pool");
114
+ }
115
+ /**
116
+ * Updates the queue length metric and triggers scaling decisions
117
+ * Uses QueueMetricsProcessor for batching and EWMA smoothing
118
+ */
119
+ updateQueueLength(queueLength) {
120
+ // Track queue length update in metrics
121
+ this.promMetrics?.recordQueueLengthUpdate();
122
+ // Skip metrics tracking for static mode
123
+ if (this.scalingStrategy.name === "none") {
124
+ return;
125
+ }
126
+ // Add sample to metrics processor
127
+ this.metricsProcessor.addSample(queueLength);
128
+ // Check if we should process the current batch
129
+ if (this.metricsProcessor.shouldProcessBatch()) {
130
+ this.processMetricsBatch();
131
+ }
132
+ }
133
+ processMetricsBatch() {
134
+ // Process batch using the metrics processor
135
+ const result = this.metricsProcessor.processBatch();
136
+ if (!result) {
137
+ this.logger.debug("No queue length samples in batch window - skipping scaling evaluation");
138
+ return;
139
+ }
140
+ // Update metrics
141
+ this.metrics.queueLength = result.median;
142
+ this.metrics.smoothedQueueLength = result.smoothedValue;
143
+ this.metrics.lastQueueLengthUpdate = new Date();
144
+ this.logger.verbose("Queue metrics batch processed", {
145
+ samples: result.sampleCount,
146
+ median: result.median,
147
+ smoothed: result.smoothedValue,
148
+ currentConsumerCount: this.consumers.size,
149
+ });
150
+ // Make scaling decision
151
+ this.evaluateScaling();
152
+ }
153
+ evaluateScaling() {
154
+ if (!this.isEnabled) {
155
+ return;
156
+ }
157
+ // No scaling in static mode
158
+ if (this.scalingStrategy.name === "none") {
159
+ return;
160
+ }
161
+ // Skip if already scaling
162
+ if (this.isScaling) {
163
+ this.logger.debug("Scaling blocked - operation already in progress", {
164
+ currentCount: this.consumers.size,
165
+ targetCount: this.metrics.targetConsumerCount,
166
+ actualCount: this.consumers.size,
167
+ });
168
+ return;
169
+ }
170
+ const targetCount = this.calculateTargetConsumerCount();
171
+ if (targetCount === this.consumers.size) {
172
+ return;
173
+ }
174
+ const timeSinceLastScale = Date.now() - this.metrics.lastScaleTime.getTime();
175
+ // Add random jitter to avoid thundering herd when multiple replicas exist
176
+ // Works without needing to know replica index or count
177
+ const jitterMs = this.disableJitter ? 0 : Math.random() * 3000; // 0-3 seconds random jitter
178
+ // Check cooldown periods with jitter
179
+ if (targetCount > this.consumers.size) {
180
+ // Scale up
181
+ const effectiveCooldown = this.scaleUpCooldownMs + jitterMs;
182
+ if (timeSinceLastScale < effectiveCooldown) {
183
+ this.logger.debug("Scale up blocked by cooldown", {
184
+ timeSinceLastScale,
185
+ cooldownMs: effectiveCooldown,
186
+ jitterMs,
187
+ remainingMs: effectiveCooldown - timeSinceLastScale,
188
+ });
189
+ this.promMetrics?.recordCooldownApplied("up");
190
+ return;
191
+ }
192
+ }
193
+ else if (targetCount < this.consumers.size) {
194
+ // Scale down
195
+ const effectiveCooldown = this.scaleDownCooldownMs + jitterMs;
196
+ if (timeSinceLastScale < effectiveCooldown) {
197
+ this.logger.debug("Scale down blocked by cooldown", {
198
+ timeSinceLastScale,
199
+ cooldownMs: effectiveCooldown,
200
+ jitterMs,
201
+ remainingMs: effectiveCooldown - timeSinceLastScale,
202
+ });
203
+ this.promMetrics?.recordCooldownApplied("down");
204
+ return;
205
+ }
206
+ }
207
+ this.logger.info("Scaling consumer pool", {
208
+ from: this.consumers.size,
209
+ to: targetCount,
210
+ queueLength: this.metrics.queueLength,
211
+ smoothedQueueLength: this.metrics.smoothedQueueLength,
212
+ strategy: this.scalingStrategy,
213
+ });
214
+ // Set flag before scaling
215
+ this.isScaling = true;
216
+ // Update target metric for visibility
217
+ const previousTarget = this.metrics.targetConsumerCount;
218
+ this.metrics.targetConsumerCount = targetCount;
219
+ try {
220
+ this.scaleToTarget(targetCount);
221
+ }
222
+ catch (error) {
223
+ this.logger.error("Failed to scale consumer pool", { error });
224
+ // Revert target on failure
225
+ this.metrics.targetConsumerCount = previousTarget;
226
+ }
227
+ finally {
228
+ this.isScaling = false;
229
+ }
230
+ }
231
+ calculateTargetConsumerCount() {
232
+ return this.scalingStrategy.calculateTargetCount(this.consumers.size);
233
+ }
234
+ scaleToTarget(targetCount) {
235
+ const actualCurrentCount = this.consumers.size;
236
+ if (targetCount > actualCurrentCount) {
237
+ // Scale up
238
+ const count = targetCount - actualCurrentCount;
239
+ this.addConsumers(count);
240
+ this.promMetrics?.recordScalingOperation("up", this.scalingStrategy.name, count);
241
+ }
242
+ else if (targetCount < actualCurrentCount) {
243
+ // Scale down
244
+ const count = actualCurrentCount - targetCount;
245
+ this.removeConsumers(count);
246
+ this.promMetrics?.recordScalingOperation("down", this.scalingStrategy.name, count);
247
+ }
248
+ this.metrics.lastScaleTime = new Date();
249
+ // Update Prometheus state metrics
250
+ this.promMetrics?.updateState({
251
+ consumerCount: this.consumers.size,
252
+ queueLength: this.metrics.queueLength,
253
+ smoothedQueueLength: this.metrics.smoothedQueueLength,
254
+ targetConsumerCount: targetCount,
255
+ strategy: this.scalingStrategy.name,
256
+ });
257
+ }
258
+ addConsumers(count) {
259
+ const newConsumers = [];
260
+ for (let i = 0; i < count; i++) {
261
+ const consumerId = `consumer-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
262
+ const consumer = this.consumerFactory({
263
+ ...this.consumerOptions,
264
+ onDequeue: async (messages) => {
265
+ // Always update queue length, default to 0 for empty dequeues or missing value
266
+ this.updateQueueLength(messages[0]?.workerQueueLength ?? 0);
267
+ // Forward to the original handler
268
+ await this.consumerOptions.onDequeue(messages);
269
+ },
270
+ });
271
+ this.consumers.set(consumerId, consumer);
272
+ newConsumers.push(consumer);
273
+ }
274
+ // Start all new consumers
275
+ newConsumers.forEach((c) => c.start());
276
+ this.logger.info("Added consumers", {
277
+ count,
278
+ totalConsumers: this.consumers.size,
279
+ });
280
+ }
281
+ removeConsumers(count) {
282
+ const allIds = Array.from(this.consumers.keys());
283
+ const consumerIds = allIds.slice(-count); // Take from the end
284
+ const consumersToStop = [];
285
+ for (const id of consumerIds) {
286
+ const consumer = this.consumers.get(id);
287
+ if (consumer) {
288
+ consumersToStop.push(consumer);
289
+ this.consumers.delete(id);
290
+ }
291
+ }
292
+ // Stop removed consumers
293
+ consumersToStop.forEach((c) => c.stop());
294
+ this.logger.info("Removed consumers", {
295
+ count: consumersToStop.length,
296
+ totalConsumers: this.consumers.size,
297
+ });
298
+ }
299
+ /**
300
+ * Get current pool metrics for monitoring
301
+ */
302
+ getMetrics() {
303
+ return { ...this.metrics };
304
+ }
305
+ /**
306
+ * Get current number of consumers in the pool
307
+ */
308
+ get size() {
309
+ return this.consumers.size;
310
+ }
311
+ }
312
+ //# sourceMappingURL=consumerPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumerPool.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/consumerPool.ts"],"names":[],"mappings":"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"}