@trigger.dev/core 4.0.2 → 4.0.4

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 (131) 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/queueConsumer.d.ts +7 -4
  35. package/dist/commonjs/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  36. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  37. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +161 -0
  38. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  39. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  40. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +293 -0
  41. package/dist/commonjs/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  42. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  43. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js +153 -0
  44. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  45. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  46. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js +235 -0
  47. package/dist/commonjs/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  48. package/dist/commonjs/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  49. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js +14 -8
  50. package/dist/commonjs/v3/runEngineWorker/supervisor/session.js.map +1 -1
  51. package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +80 -111
  52. package/dist/commonjs/v3/runEngineWorker/workload/http.js +36 -14
  53. package/dist/commonjs/v3/runEngineWorker/workload/http.js.map +1 -1
  54. package/dist/commonjs/v3/schemas/api.d.ts +139 -0
  55. package/dist/commonjs/v3/schemas/api.js +11 -3
  56. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  57. package/dist/commonjs/v3/utils/globals.d.ts +2 -0
  58. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  59. package/dist/commonjs/v3/utils/ioSerialization.d.ts +1 -0
  60. package/dist/commonjs/v3/utils/ioSerialization.js +92 -3
  61. package/dist/commonjs/v3/utils/ioSerialization.js.map +1 -1
  62. package/dist/commonjs/v3/workers/index.d.ts +1 -0
  63. package/dist/commonjs/v3/workers/index.js +3 -1
  64. package/dist/commonjs/v3/workers/index.js.map +1 -1
  65. package/dist/commonjs/version.js +1 -1
  66. package/dist/esm/v3/errors.d.ts +1 -0
  67. package/dist/esm/v3/errors.js +34 -2
  68. package/dist/esm/v3/errors.js.map +1 -1
  69. package/dist/esm/v3/heartbeats/api.d.ts +14 -0
  70. package/dist/esm/v3/heartbeats/api.js +54 -0
  71. package/dist/esm/v3/heartbeats/api.js.map +1 -0
  72. package/dist/esm/v3/heartbeats/manager.d.ts +16 -0
  73. package/dist/esm/v3/heartbeats/manager.js +68 -0
  74. package/dist/esm/v3/heartbeats/manager.js.map +1 -0
  75. package/dist/esm/v3/heartbeats/types.d.ts +7 -0
  76. package/dist/esm/v3/heartbeats/types.js +2 -0
  77. package/dist/esm/v3/heartbeats/types.js.map +1 -0
  78. package/dist/esm/v3/heartbeats-api.d.ts +3 -0
  79. package/dist/esm/v3/heartbeats-api.js +6 -0
  80. package/dist/esm/v3/heartbeats-api.js.map +1 -0
  81. package/dist/esm/v3/index.d.ts +1 -0
  82. package/dist/esm/v3/index.js +1 -0
  83. package/dist/esm/v3/index.js.map +1 -1
  84. package/dist/esm/v3/links.d.ts +1 -0
  85. package/dist/esm/v3/links.js +1 -0
  86. package/dist/esm/v3/links.js.map +1 -1
  87. package/dist/esm/v3/runEngineWorker/index.d.ts +1 -0
  88. package/dist/esm/v3/runEngineWorker/index.js +1 -0
  89. package/dist/esm/v3/runEngineWorker/index.js.map +1 -1
  90. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.d.ts +71 -0
  91. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js +312 -0
  92. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.js.map +1 -0
  93. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.d.ts +1 -0
  94. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js +587 -0
  95. package/dist/esm/v3/runEngineWorker/supervisor/consumerPool.test.js.map +1 -0
  96. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.d.ts +43 -0
  97. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js +127 -0
  98. package/dist/esm/v3/runEngineWorker/supervisor/consumerPoolMetrics.js.map +1 -0
  99. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.d.ts +7 -4
  100. package/dist/esm/v3/runEngineWorker/supervisor/queueConsumer.js.map +1 -1
  101. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.d.ts +76 -0
  102. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js +157 -0
  103. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.js.map +1 -0
  104. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.d.ts +1 -0
  105. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js +291 -0
  106. package/dist/esm/v3/runEngineWorker/supervisor/queueMetricsProcessor.test.js.map +1 -0
  107. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.d.ts +67 -0
  108. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js +146 -0
  109. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.js.map +1 -0
  110. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.d.ts +1 -0
  111. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js +233 -0
  112. package/dist/esm/v3/runEngineWorker/supervisor/scalingStrategies.test.js.map +1 -0
  113. package/dist/esm/v3/runEngineWorker/supervisor/session.d.ts +5 -2
  114. package/dist/esm/v3/runEngineWorker/supervisor/session.js +14 -8
  115. package/dist/esm/v3/runEngineWorker/supervisor/session.js.map +1 -1
  116. package/dist/esm/v3/runEngineWorker/workload/http.d.ts +80 -111
  117. package/dist/esm/v3/runEngineWorker/workload/http.js +37 -15
  118. package/dist/esm/v3/runEngineWorker/workload/http.js.map +1 -1
  119. package/dist/esm/v3/schemas/api.d.ts +139 -0
  120. package/dist/esm/v3/schemas/api.js +8 -0
  121. package/dist/esm/v3/schemas/api.js.map +1 -1
  122. package/dist/esm/v3/utils/globals.d.ts +2 -0
  123. package/dist/esm/v3/utils/globals.js.map +1 -1
  124. package/dist/esm/v3/utils/ioSerialization.d.ts +1 -0
  125. package/dist/esm/v3/utils/ioSerialization.js +92 -3
  126. package/dist/esm/v3/utils/ioSerialization.js.map +1 -1
  127. package/dist/esm/v3/workers/index.d.ts +1 -0
  128. package/dist/esm/v3/workers/index.js +1 -0
  129. package/dist/esm/v3/workers/index.js.map +1 -1
  130. package/dist/esm/version.js +1 -1
  131. package/package.json +1 -1
@@ -0,0 +1,587 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { RunQueueConsumerPool, } from "./consumerPool.js";
3
+ // Mock only the logger
4
+ vi.mock("../../utils/structuredLogger.js");
5
+ // Test implementation of QueueConsumer
6
+ class TestQueueConsumer {
7
+ started = false;
8
+ stopped = false;
9
+ onDequeue;
10
+ constructor(opts) {
11
+ this.onDequeue = opts.onDequeue;
12
+ }
13
+ start() {
14
+ this.started = true;
15
+ this.stopped = false;
16
+ }
17
+ stop() {
18
+ this.stopped = true;
19
+ this.started = false;
20
+ }
21
+ }
22
+ describe("RunQueueConsumerPool", () => {
23
+ let mockClient;
24
+ let mockOnDequeue;
25
+ let pool;
26
+ let defaultOptions;
27
+ let testConsumers;
28
+ let testConsumerFactory;
29
+ beforeEach(() => {
30
+ vi.clearAllMocks();
31
+ vi.useFakeTimers();
32
+ mockClient = {};
33
+ mockOnDequeue = vi.fn();
34
+ testConsumers = [];
35
+ testConsumerFactory = (opts) => {
36
+ const consumer = new TestQueueConsumer(opts);
37
+ testConsumers.push(consumer);
38
+ return consumer;
39
+ };
40
+ defaultOptions = {
41
+ consumer: {
42
+ client: mockClient,
43
+ intervalMs: 0,
44
+ idleIntervalMs: 1000,
45
+ onDequeue: mockOnDequeue,
46
+ },
47
+ consumerFactory: testConsumerFactory,
48
+ };
49
+ });
50
+ afterEach(() => {
51
+ vi.useRealTimers();
52
+ if (pool) {
53
+ pool.stop();
54
+ }
55
+ });
56
+ function advanceTimeAndProcessMetrics(ms) {
57
+ vi.advanceTimersByTime(ms);
58
+ // Trigger batch processing if ready (without adding a sample)
59
+ if (pool["metricsProcessor"].shouldProcessBatch()) {
60
+ pool["processMetricsBatch"]();
61
+ }
62
+ }
63
+ describe("Static mode (strategy='none')", () => {
64
+ it("should start with maxConsumerCount in static mode", async () => {
65
+ pool = new RunQueueConsumerPool({
66
+ ...defaultOptions,
67
+ scaling: { strategy: "none", maxConsumerCount: 5 },
68
+ });
69
+ await pool.start();
70
+ expect(pool.size).toBe(5);
71
+ expect(testConsumers.length).toBe(5);
72
+ });
73
+ it("should not scale in static mode even with queue length updates", async () => {
74
+ pool = new RunQueueConsumerPool({
75
+ ...defaultOptions,
76
+ scaling: { strategy: "none", maxConsumerCount: 3 },
77
+ });
78
+ await pool.start();
79
+ const initialCount = pool.size;
80
+ pool.updateQueueLength(100);
81
+ vi.advanceTimersByTime(2000);
82
+ expect(pool.size).toBe(initialCount);
83
+ expect(pool.size).toBe(3);
84
+ });
85
+ });
86
+ describe("Smooth scaling strategy", () => {
87
+ it("should scale smoothly with damping", async () => {
88
+ pool = new RunQueueConsumerPool({
89
+ ...defaultOptions,
90
+ scaling: {
91
+ strategy: "smooth",
92
+ minConsumerCount: 1,
93
+ maxConsumerCount: 10,
94
+ scaleUpCooldownMs: 0,
95
+ disableJitter: true,
96
+ },
97
+ });
98
+ await pool.start();
99
+ expect(pool.size).toBe(1);
100
+ pool.updateQueueLength(5);
101
+ advanceTimeAndProcessMetrics(1100);
102
+ expect(pool.size).toBe(4); // Damped scaling
103
+ pool.updateQueueLength(5);
104
+ advanceTimeAndProcessMetrics(1100);
105
+ expect(pool.size).toBe(5); // Gradually approaches target
106
+ });
107
+ it("should respect max consumer count", async () => {
108
+ pool = new RunQueueConsumerPool({
109
+ ...defaultOptions,
110
+ scaling: {
111
+ strategy: "smooth",
112
+ minConsumerCount: 1,
113
+ maxConsumerCount: 5,
114
+ scaleUpCooldownMs: 0,
115
+ disableJitter: true,
116
+ },
117
+ });
118
+ await pool.start();
119
+ expect(pool.size).toBe(1);
120
+ pool.updateQueueLength(100);
121
+ advanceTimeAndProcessMetrics(1100);
122
+ expect(pool.size).toBe(5);
123
+ pool.updateQueueLength(100);
124
+ advanceTimeAndProcessMetrics(1100);
125
+ expect(pool.size).toBe(5);
126
+ });
127
+ });
128
+ describe("Aggressive scaling strategy", () => {
129
+ it("should scale up quickly based on queue pressure", async () => {
130
+ pool = new RunQueueConsumerPool({
131
+ ...defaultOptions,
132
+ scaling: {
133
+ strategy: "aggressive",
134
+ minConsumerCount: 2,
135
+ maxConsumerCount: 10,
136
+ scaleUpCooldownMs: 0,
137
+ disableJitter: true,
138
+ },
139
+ });
140
+ await pool.start();
141
+ expect(pool.size).toBe(2);
142
+ pool.updateQueueLength(10);
143
+ advanceTimeAndProcessMetrics(1100);
144
+ expect(pool.size).toBe(3);
145
+ pool.updateQueueLength(20);
146
+ advanceTimeAndProcessMetrics(1100);
147
+ expect(pool.size).toBe(4);
148
+ });
149
+ it("should scale down cautiously when queue is small", async () => {
150
+ pool = new RunQueueConsumerPool({
151
+ ...defaultOptions,
152
+ scaling: {
153
+ strategy: "aggressive",
154
+ minConsumerCount: 1,
155
+ maxConsumerCount: 10,
156
+ scaleUpCooldownMs: 0,
157
+ scaleDownCooldownMs: 0,
158
+ disableJitter: true,
159
+ },
160
+ });
161
+ await pool.start();
162
+ expect(pool.size).toBe(1);
163
+ pool.updateQueueLength(10);
164
+ advanceTimeAndProcessMetrics(1100);
165
+ expect(pool.size).toBe(2);
166
+ pool.updateQueueLength(0.5);
167
+ advanceTimeAndProcessMetrics(1100);
168
+ expect(pool.size).toBe(3); // EWMA smoothing delays scale down
169
+ pool.updateQueueLength(0.5);
170
+ advanceTimeAndProcessMetrics(1100);
171
+ expect(pool.size).toBeGreaterThanOrEqual(3); // Stays in optimal zone
172
+ });
173
+ it("should maintain current level in optimal zone", async () => {
174
+ pool = new RunQueueConsumerPool({
175
+ ...defaultOptions,
176
+ scaling: {
177
+ strategy: "aggressive",
178
+ minConsumerCount: 3,
179
+ maxConsumerCount: 10,
180
+ scaleUpCooldownMs: 0,
181
+ disableJitter: true,
182
+ },
183
+ });
184
+ await pool.start();
185
+ expect(pool.size).toBe(3);
186
+ pool.updateQueueLength(3);
187
+ advanceTimeAndProcessMetrics(1100);
188
+ expect(pool.size).toBe(3);
189
+ pool.updateQueueLength(4);
190
+ advanceTimeAndProcessMetrics(1100);
191
+ expect(pool.size).toBe(3);
192
+ });
193
+ });
194
+ describe("Smooth scaling with EWMA", () => {
195
+ it("should use exponential smoothing for stable scaling", async () => {
196
+ pool = new RunQueueConsumerPool({
197
+ ...defaultOptions,
198
+ scaling: {
199
+ strategy: "smooth",
200
+ minConsumerCount: 1,
201
+ maxConsumerCount: 10,
202
+ disableJitter: true,
203
+ },
204
+ });
205
+ await pool.start();
206
+ const queueLengths = [10, 2, 8, 3, 9, 1, 7];
207
+ for (const length of queueLengths) {
208
+ pool.updateQueueLength(length);
209
+ vi.advanceTimersByTime(200);
210
+ }
211
+ vi.advanceTimersByTime(900);
212
+ const metrics = pool.getMetrics();
213
+ expect(metrics.smoothedQueueLength).toBeGreaterThan(0);
214
+ expect(metrics.smoothedQueueLength).toBeLessThan(10);
215
+ });
216
+ it("should apply damping factor to avoid rapid changes", async () => {
217
+ pool = new RunQueueConsumerPool({
218
+ ...defaultOptions,
219
+ scaling: {
220
+ strategy: "smooth",
221
+ minConsumerCount: 1,
222
+ maxConsumerCount: 10,
223
+ disableJitter: true,
224
+ },
225
+ });
226
+ await pool.start();
227
+ pool.updateQueueLength(2);
228
+ advanceTimeAndProcessMetrics(1100);
229
+ const metrics1 = pool.getMetrics();
230
+ expect(metrics1.smoothedQueueLength).toBe(2);
231
+ pool.updateQueueLength(20);
232
+ advanceTimeAndProcessMetrics(1100);
233
+ const metrics2 = pool.getMetrics();
234
+ expect(metrics2.smoothedQueueLength).toBeGreaterThan(2);
235
+ expect(metrics2.smoothedQueueLength).toBeLessThan(20);
236
+ });
237
+ });
238
+ describe("High throughput parallel dequeuing", () => {
239
+ it("should handle rapid parallel queue updates", async () => {
240
+ pool = new RunQueueConsumerPool({
241
+ ...defaultOptions,
242
+ scaling: {
243
+ strategy: "aggressive",
244
+ minConsumerCount: 1,
245
+ maxConsumerCount: 20,
246
+ disableJitter: true,
247
+ },
248
+ });
249
+ await pool.start();
250
+ const updates = [];
251
+ for (let i = 0; i < 100; i++) {
252
+ updates.push(Math.floor(Math.random() * 50) + 10);
253
+ }
254
+ updates.forEach((length, index) => {
255
+ setTimeout(() => pool.updateQueueLength(length), index * 10);
256
+ });
257
+ advanceTimeAndProcessMetrics(1100);
258
+ const metrics = pool.getMetrics();
259
+ expect(metrics.queueLength).toBeDefined();
260
+ });
261
+ it("should batch metrics updates to avoid excessive scaling", async () => {
262
+ pool = new RunQueueConsumerPool({
263
+ ...defaultOptions,
264
+ scaling: {
265
+ strategy: "smooth",
266
+ minConsumerCount: 1,
267
+ maxConsumerCount: 10,
268
+ disableJitter: true,
269
+ },
270
+ });
271
+ await pool.start();
272
+ const evaluateScalingSpy = vi.spyOn(pool, "evaluateScaling");
273
+ pool.updateQueueLength(10);
274
+ for (let i = 1; i < 50; i++) {
275
+ pool.updateQueueLength(Math.floor(Math.random() * 20) + 5);
276
+ }
277
+ expect(evaluateScalingSpy).not.toHaveBeenCalled();
278
+ advanceTimeAndProcessMetrics(1000);
279
+ expect(evaluateScalingSpy).toHaveBeenCalledTimes(1);
280
+ });
281
+ it("should use median to filter outliers in high-frequency updates", async () => {
282
+ pool = new RunQueueConsumerPool({
283
+ ...defaultOptions,
284
+ scaling: {
285
+ strategy: "aggressive",
286
+ minConsumerCount: 1,
287
+ maxConsumerCount: 10,
288
+ disableJitter: true,
289
+ },
290
+ });
291
+ await pool.start();
292
+ const updates = [10, 11, 9, 12, 10, 100, 11, 10, 9, 11, 1];
293
+ updates.forEach((length) => pool.updateQueueLength(length));
294
+ advanceTimeAndProcessMetrics(1100);
295
+ const metrics = pool.getMetrics();
296
+ expect(metrics.queueLength).toBeGreaterThanOrEqual(9);
297
+ expect(metrics.queueLength).toBeLessThanOrEqual(12);
298
+ });
299
+ });
300
+ describe("Scaling cooldowns and jitter", () => {
301
+ it("should respect scale-up cooldown", async () => {
302
+ pool = new RunQueueConsumerPool({
303
+ ...defaultOptions,
304
+ scaling: {
305
+ strategy: "smooth",
306
+ scaleUpCooldownMs: 5000,
307
+ minConsumerCount: 1,
308
+ maxConsumerCount: 10,
309
+ disableJitter: true,
310
+ },
311
+ });
312
+ await pool.start();
313
+ pool["scaleToTarget"](5);
314
+ const scaleToTargetSpy = vi.spyOn(pool, "scaleToTarget");
315
+ pool.updateQueueLength(10);
316
+ advanceTimeAndProcessMetrics(1100);
317
+ expect(scaleToTargetSpy).not.toHaveBeenCalled();
318
+ vi.advanceTimersByTime(10000);
319
+ pool.updateQueueLength(20);
320
+ advanceTimeAndProcessMetrics(1100);
321
+ });
322
+ it("should respect scale-down cooldown (longer than scale-up)", async () => {
323
+ pool = new RunQueueConsumerPool({
324
+ ...defaultOptions,
325
+ scaling: {
326
+ strategy: "aggressive",
327
+ minConsumerCount: 1,
328
+ maxConsumerCount: 10,
329
+ disableJitter: true,
330
+ },
331
+ });
332
+ await pool.start();
333
+ for (let i = 0; i < 4; i++) {
334
+ pool["addConsumers"](1);
335
+ }
336
+ pool["scaleToTarget"](5);
337
+ pool["metrics"].lastScaleTime = new Date(Date.now() - 70000);
338
+ pool.updateQueueLength(1);
339
+ advanceTimeAndProcessMetrics(1100);
340
+ const metrics = pool.getMetrics();
341
+ expect(metrics.queueLength).toBe(1);
342
+ });
343
+ it("should add random jitter to prevent thundering herd", async () => {
344
+ const pools = [];
345
+ const scaleTimes = [];
346
+ for (let i = 0; i < 3; i++) {
347
+ const p = new RunQueueConsumerPool({
348
+ ...defaultOptions,
349
+ scaling: {
350
+ strategy: "smooth",
351
+ minConsumerCount: 1,
352
+ maxConsumerCount: 10,
353
+ disableJitter: true,
354
+ },
355
+ });
356
+ const originalScale = p["scaleToTarget"];
357
+ p["scaleToTarget"] = vi.fn(async (target) => {
358
+ scaleTimes.push(Date.now());
359
+ return originalScale.call(p, target);
360
+ });
361
+ pools.push(p);
362
+ await p.start();
363
+ }
364
+ pools.forEach((p) => p.updateQueueLength(20));
365
+ advanceTimeAndProcessMetrics(1100);
366
+ vi.advanceTimersByTime(15000);
367
+ await Promise.all(pools.map((p) => p.stop()));
368
+ });
369
+ });
370
+ describe("Consumer lifecycle management", () => {
371
+ it("should properly start and stop consumers", async () => {
372
+ pool = new RunQueueConsumerPool({
373
+ ...defaultOptions,
374
+ scaling: {
375
+ strategy: "none",
376
+ maxConsumerCount: 3,
377
+ disableJitter: true,
378
+ },
379
+ });
380
+ await pool.start();
381
+ expect(pool.size).toBe(3);
382
+ expect(testConsumers.length).toBe(3);
383
+ testConsumers.forEach((consumer) => {
384
+ expect(consumer.started).toBe(true);
385
+ });
386
+ await pool.stop();
387
+ testConsumers.forEach((consumer) => {
388
+ expect(consumer.stopped).toBe(true);
389
+ });
390
+ });
391
+ it("should forward dequeue messages with queue length updates", async () => {
392
+ pool = new RunQueueConsumerPool({
393
+ ...defaultOptions,
394
+ scaling: {
395
+ strategy: "aggressive",
396
+ maxConsumerCount: 2,
397
+ disableJitter: true,
398
+ },
399
+ });
400
+ await pool.start();
401
+ const messages = [{ workerQueueLength: 15 }];
402
+ if (testConsumers[0]?.onDequeue) {
403
+ await testConsumers[0].onDequeue(messages);
404
+ }
405
+ expect(mockOnDequeue).toHaveBeenCalledWith(messages);
406
+ advanceTimeAndProcessMetrics(1100);
407
+ const metrics = pool.getMetrics();
408
+ expect(metrics.queueLength).toBe(15);
409
+ });
410
+ });
411
+ describe("Memory leak prevention", () => {
412
+ it("should collect all samples within batch window without limit", async () => {
413
+ pool = new RunQueueConsumerPool({
414
+ ...defaultOptions,
415
+ scaling: {
416
+ strategy: "aggressive",
417
+ minConsumerCount: 1,
418
+ maxConsumerCount: 10,
419
+ disableJitter: true,
420
+ },
421
+ });
422
+ await pool.start();
423
+ for (let i = 0; i < 100; i++) {
424
+ pool.updateQueueLength(i);
425
+ }
426
+ const metrics = pool.getMetrics();
427
+ expect(metrics.queueLength).toBeUndefined();
428
+ });
429
+ it("should clear consumer map on stop", async () => {
430
+ pool = new RunQueueConsumerPool({
431
+ ...defaultOptions,
432
+ scaling: {
433
+ strategy: "none",
434
+ maxConsumerCount: 5,
435
+ disableJitter: true,
436
+ },
437
+ });
438
+ await pool.start();
439
+ expect(pool.size).toBe(5);
440
+ await pool.stop();
441
+ expect(pool.size).toBe(0);
442
+ });
443
+ it("should clear recentQueueLengths after processing batch", async () => {
444
+ pool = new RunQueueConsumerPool({
445
+ ...defaultOptions,
446
+ scaling: { strategy: "smooth" },
447
+ });
448
+ await pool.start();
449
+ for (let i = 0; i < 5; i++) {
450
+ pool.updateQueueLength(10 + i);
451
+ }
452
+ advanceTimeAndProcessMetrics(1100);
453
+ const metrics = pool.getMetrics();
454
+ expect(metrics.queueLength).toBeDefined();
455
+ });
456
+ it("should not accumulate scaling operations in memory", async () => {
457
+ pool = new RunQueueConsumerPool({
458
+ ...defaultOptions,
459
+ scaling: {
460
+ strategy: "aggressive",
461
+ scaleUpCooldownMs: 100,
462
+ scaleDownCooldownMs: 100,
463
+ minConsumerCount: 1,
464
+ maxConsumerCount: 10,
465
+ disableJitter: true,
466
+ },
467
+ });
468
+ await pool.start();
469
+ for (let i = 0; i < 5; i++) {
470
+ pool["metrics"].lastScaleTime = new Date(0);
471
+ pool.updateQueueLength(i % 2 === 0 ? 50 : 1);
472
+ vi.advanceTimersByTime(1100);
473
+ }
474
+ expect(pool.size).toBeGreaterThanOrEqual(1);
475
+ expect(pool.size).toBeLessThanOrEqual(10);
476
+ });
477
+ });
478
+ describe("Edge cases", () => {
479
+ it("should handle empty recent queue lengths", async () => {
480
+ pool = new RunQueueConsumerPool({
481
+ ...defaultOptions,
482
+ scaling: { strategy: "aggressive" },
483
+ });
484
+ await pool.start();
485
+ const metrics = pool.getMetrics();
486
+ expect(metrics.queueLength).toBeUndefined();
487
+ });
488
+ it("should clamp consumer count to min/max bounds", async () => {
489
+ pool = new RunQueueConsumerPool({
490
+ ...defaultOptions,
491
+ scaling: {
492
+ strategy: "smooth",
493
+ minConsumerCount: 2,
494
+ maxConsumerCount: 5,
495
+ disableJitter: true,
496
+ },
497
+ });
498
+ await pool.start();
499
+ expect(pool.size).toBe(2);
500
+ pool.updateQueueLength(100);
501
+ advanceTimeAndProcessMetrics(1100);
502
+ expect(pool.size).toBeLessThanOrEqual(5);
503
+ });
504
+ it("should respect custom targetRatio with smooth strategy", async () => {
505
+ pool = new RunQueueConsumerPool({
506
+ ...defaultOptions,
507
+ scaling: {
508
+ strategy: "smooth",
509
+ targetRatio: 5,
510
+ scaleUpCooldownMs: 0,
511
+ minConsumerCount: 1,
512
+ maxConsumerCount: 10,
513
+ disableJitter: true,
514
+ },
515
+ });
516
+ await pool.start();
517
+ expect(pool.size).toBe(1);
518
+ pool.updateQueueLength(10);
519
+ advanceTimeAndProcessMetrics(1100);
520
+ const firstSize = pool.size;
521
+ expect(firstSize).toBeGreaterThanOrEqual(1);
522
+ expect(firstSize).toBeLessThanOrEqual(2);
523
+ pool.updateQueueLength(10);
524
+ advanceTimeAndProcessMetrics(1100);
525
+ expect(pool.size).toBeLessThanOrEqual(2);
526
+ });
527
+ it("should respect custom targetRatio with aggressive strategy", async () => {
528
+ pool = new RunQueueConsumerPool({
529
+ ...defaultOptions,
530
+ scaling: {
531
+ strategy: "aggressive",
532
+ targetRatio: 5,
533
+ scaleUpCooldownMs: 0,
534
+ minConsumerCount: 1,
535
+ maxConsumerCount: 10,
536
+ disableJitter: true,
537
+ },
538
+ });
539
+ await pool.start();
540
+ expect(pool.size).toBe(1);
541
+ pool.updateQueueLength(20);
542
+ advanceTimeAndProcessMetrics(1100);
543
+ const sizeAfterFirstScale = pool.size;
544
+ expect(sizeAfterFirstScale).toBeGreaterThanOrEqual(1);
545
+ pool.updateQueueLength(20);
546
+ advanceTimeAndProcessMetrics(1100);
547
+ expect(pool.size).toBeLessThanOrEqual(6);
548
+ });
549
+ it("should scale down when no items are dequeued (zero queue length)", async () => {
550
+ pool = new RunQueueConsumerPool({
551
+ ...defaultOptions,
552
+ scaling: {
553
+ strategy: "smooth",
554
+ minConsumerCount: 1,
555
+ maxConsumerCount: 10,
556
+ scaleUpCooldownMs: 0,
557
+ scaleDownCooldownMs: 0,
558
+ disableJitter: true,
559
+ },
560
+ });
561
+ await pool.start();
562
+ expect(pool.size).toBe(1);
563
+ // Scale up first
564
+ pool.updateQueueLength(20);
565
+ advanceTimeAndProcessMetrics(1100);
566
+ expect(pool.size).toBeGreaterThan(1);
567
+ const sizeAfterScaleUp = pool.size;
568
+ // Now send multiple zero queue lengths to converge EWMA to 0
569
+ // The EWMA needs time to converge due to exponential smoothing
570
+ for (let i = 0; i < 5; i++) {
571
+ pool.updateQueueLength(0);
572
+ advanceTimeAndProcessMetrics(1100);
573
+ }
574
+ // After multiple iterations with zero queue, should scale down but not to minimum yet
575
+ expect(pool.size).toBeLessThan(sizeAfterScaleUp);
576
+ expect(pool.size).toBeGreaterThan(1);
577
+ // Continue until we reach minimum
578
+ for (let i = 0; i < 5; i++) {
579
+ pool.updateQueueLength(0);
580
+ advanceTimeAndProcessMetrics(1100);
581
+ }
582
+ // Should eventually reach minimum
583
+ expect(pool.size).toBe(1);
584
+ });
585
+ });
586
+ });
587
+ //# sourceMappingURL=consumerPool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumerPool.test.js","sourceRoot":"","sources":["../../../../../src/v3/runEngineWorker/supervisor/consumerPool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Counter, Gauge, Registry } from "prom-client";
2
+ export interface ConsumerPoolMetricsOptions {
3
+ register?: Registry;
4
+ prefix?: string;
5
+ }
6
+ export declare class ConsumerPoolMetrics {
7
+ private readonly register;
8
+ private readonly prefix;
9
+ readonly consumerCount: Gauge;
10
+ readonly queueLength: Gauge;
11
+ readonly smoothedQueueLength: Gauge;
12
+ readonly targetConsumerCount: Gauge;
13
+ readonly scalingStrategy: Gauge;
14
+ readonly scalingOperationsTotal: Counter;
15
+ readonly consumersAddedTotal: Counter;
16
+ readonly consumersRemovedTotal: Counter;
17
+ readonly scalingCooldownsApplied: Counter;
18
+ readonly queueLengthUpdatesTotal: Counter;
19
+ readonly batchesProcessedTotal: Counter;
20
+ constructor(opts?: ConsumerPoolMetricsOptions);
21
+ /**
22
+ * Update all gauge metrics with current state
23
+ */
24
+ updateState(state: {
25
+ consumerCount: number;
26
+ queueLength?: number;
27
+ smoothedQueueLength: number;
28
+ targetConsumerCount: number;
29
+ strategy: string;
30
+ }): void;
31
+ /**
32
+ * Record a scaling operation
33
+ */
34
+ recordScalingOperation(direction: "up" | "down" | "none", strategy: string, count: number): void;
35
+ /**
36
+ * Record that scaling was prevented by cooldown
37
+ */
38
+ recordCooldownApplied(direction: "up" | "down"): void;
39
+ /**
40
+ * Record a queue length update
41
+ */
42
+ recordQueueLengthUpdate(): void;
43
+ }