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