@powerhousedao/reactor 4.1.0-staging.1 → 5.0.0-staging.2

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 (126) hide show
  1. package/dist/bench/end-to-end-flow.bench.js +64 -36
  2. package/dist/bench/end-to-end-flow.bench.js.map +1 -1
  3. package/dist/bench/event-bus.bench.js.map +1 -1
  4. package/dist/bench/queue-only.bench.js +8 -2
  5. package/dist/bench/queue-only.bench.js.map +1 -1
  6. package/dist/bench/reactor-throughput.bench.js +43 -16
  7. package/dist/bench/reactor-throughput.bench.js.map +1 -1
  8. package/dist/src/events/event-bus.d.ts +2 -2
  9. package/dist/src/events/event-bus.d.ts.map +1 -1
  10. package/dist/src/events/event-bus.js +1 -1
  11. package/dist/src/events/event-bus.js.map +1 -1
  12. package/dist/src/events/interfaces.d.ts +1 -1
  13. package/dist/src/events/interfaces.d.ts.map +1 -1
  14. package/dist/src/events/types.d.ts +1 -1
  15. package/dist/src/events/types.d.ts.map +1 -1
  16. package/dist/src/events/types.js.map +1 -1
  17. package/dist/src/executor/interfaces.d.ts +31 -54
  18. package/dist/src/executor/interfaces.d.ts.map +1 -1
  19. package/dist/src/executor/simple-job-executor-manager.d.ts +27 -0
  20. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
  21. package/dist/src/executor/simple-job-executor-manager.js +128 -0
  22. package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
  23. package/dist/src/executor/simple-job-executor.d.ts +19 -0
  24. package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
  25. package/dist/src/executor/simple-job-executor.js +69 -0
  26. package/dist/src/executor/simple-job-executor.js.map +1 -0
  27. package/dist/src/executor/types.d.ts +23 -8
  28. package/dist/src/executor/types.d.ts.map +1 -1
  29. package/dist/src/executor/types.js.map +1 -1
  30. package/dist/src/index.d.ts +9 -2
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +8 -2
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/interfaces/reactor.d.ts +121 -0
  35. package/dist/src/interfaces/reactor.d.ts.map +1 -0
  36. package/dist/src/interfaces/reactor.js +2 -0
  37. package/dist/src/interfaces/reactor.js.map +1 -0
  38. package/dist/src/queue/interfaces.d.ts +26 -1
  39. package/dist/src/queue/interfaces.d.ts.map +1 -1
  40. package/dist/src/queue/queue.d.ts +33 -3
  41. package/dist/src/queue/queue.d.ts.map +1 -1
  42. package/dist/src/queue/queue.js +164 -17
  43. package/dist/src/queue/queue.js.map +1 -1
  44. package/dist/src/queue/types.d.ts +5 -1
  45. package/dist/src/queue/types.d.ts.map +1 -1
  46. package/dist/src/queue/types.js.map +1 -1
  47. package/dist/src/reactor.d.ts +109 -0
  48. package/dist/src/reactor.d.ts.map +1 -0
  49. package/dist/src/reactor.js +602 -0
  50. package/dist/src/reactor.js.map +1 -0
  51. package/dist/src/registry/implementation.d.ts +62 -0
  52. package/dist/src/registry/implementation.d.ts.map +1 -0
  53. package/dist/src/registry/implementation.js +96 -0
  54. package/dist/src/registry/implementation.js.map +1 -0
  55. package/dist/src/registry/index.d.ts +3 -0
  56. package/dist/src/registry/index.d.ts.map +1 -0
  57. package/dist/src/registry/index.js +2 -0
  58. package/dist/src/registry/index.js.map +1 -0
  59. package/dist/src/registry/interfaces.d.ts +39 -0
  60. package/dist/src/registry/interfaces.d.ts.map +1 -0
  61. package/dist/src/registry/interfaces.js +2 -0
  62. package/dist/src/registry/interfaces.js.map +1 -0
  63. package/dist/src/shared/factories.d.ts +16 -0
  64. package/dist/src/shared/factories.d.ts.map +1 -0
  65. package/dist/src/shared/factories.js +33 -0
  66. package/dist/src/shared/factories.js.map +1 -0
  67. package/dist/src/shared/types.d.ts +83 -19
  68. package/dist/src/shared/types.d.ts.map +1 -1
  69. package/dist/src/shared/types.js +30 -1
  70. package/dist/src/shared/types.js.map +1 -1
  71. package/dist/src/shared/utils.d.ts +3 -0
  72. package/dist/src/shared/utils.d.ts.map +1 -0
  73. package/dist/src/shared/utils.js +8 -0
  74. package/dist/src/shared/utils.js.map +1 -0
  75. package/dist/src/utils.d.ts +11 -0
  76. package/dist/src/utils.d.ts.map +1 -0
  77. package/dist/src/utils.js +29 -0
  78. package/dist/src/utils.js.map +1 -0
  79. package/dist/test/executor-integration.test.d.ts +2 -0
  80. package/dist/test/executor-integration.test.d.ts.map +1 -0
  81. package/dist/test/executor-integration.test.js +290 -0
  82. package/dist/test/executor-integration.test.js.map +1 -0
  83. package/dist/test/factories.d.ts +131 -0
  84. package/dist/test/factories.d.ts.map +1 -0
  85. package/dist/test/factories.js +347 -0
  86. package/dist/test/factories.js.map +1 -0
  87. package/dist/test/queue.test.js +219 -28
  88. package/dist/test/queue.test.js.map +1 -1
  89. package/dist/test/reactor-queue.test.d.ts +2 -0
  90. package/dist/test/reactor-queue.test.d.ts.map +1 -0
  91. package/dist/test/reactor-queue.test.js +328 -0
  92. package/dist/test/reactor-queue.test.js.map +1 -0
  93. package/dist/test/reactor-read.test.d.ts +2 -0
  94. package/dist/test/reactor-read.test.d.ts.map +1 -0
  95. package/dist/test/reactor-read.test.js +355 -0
  96. package/dist/test/reactor-read.test.js.map +1 -0
  97. package/dist/test/registry.test.d.ts +2 -0
  98. package/dist/test/registry.test.d.ts.map +1 -0
  99. package/dist/test/registry.test.js +182 -0
  100. package/dist/test/registry.test.js.map +1 -0
  101. package/dist/test/simple-job-executor-manager.test.d.ts +2 -0
  102. package/dist/test/simple-job-executor-manager.test.d.ts.map +1 -0
  103. package/dist/test/simple-job-executor-manager.test.js +132 -0
  104. package/dist/test/simple-job-executor-manager.test.js.map +1 -0
  105. package/dist/test/simple-job-executor.test.d.ts +2 -0
  106. package/dist/test/simple-job-executor.test.d.ts.map +1 -0
  107. package/dist/test/simple-job-executor.test.js +139 -0
  108. package/dist/test/simple-job-executor.test.js.map +1 -0
  109. package/dist/test/utils.test.d.ts +2 -0
  110. package/dist/test/utils.test.d.ts.map +1 -0
  111. package/dist/test/utils.test.js +66 -0
  112. package/dist/test/utils.test.js.map +1 -0
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/dist/vitest.config.d.ts +3 -0
  115. package/dist/vitest.config.d.ts.map +1 -0
  116. package/dist/vitest.config.js +11 -0
  117. package/dist/vitest.config.js.map +1 -0
  118. package/package.json +6 -1
  119. package/dist/src/executor/job-executor.d.ts +0 -62
  120. package/dist/src/executor/job-executor.d.ts.map +0 -1
  121. package/dist/src/executor/job-executor.js +0 -325
  122. package/dist/src/executor/job-executor.js.map +0 -1
  123. package/dist/test/job-executor.test.d.ts +0 -2
  124. package/dist/test/job-executor.test.d.ts.map +0 -1
  125. package/dist/test/job-executor.test.js +0 -581
  126. package/dist/test/job-executor.test.js.map +0 -1
@@ -1,581 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { EventBus } from "../src/events/event-bus.js";
3
- import { InMemoryJobExecutor, JobExecutorEventTypes, } from "../src/executor/job-executor.js";
4
- import { InMemoryQueue } from "../src/queue/queue.js";
5
- describe("InMemoryJobExecutor", () => {
6
- let executor;
7
- let eventBus;
8
- let queue;
9
- let mockEventBusEmit;
10
- const createTestOperation = (overrides = {}) => ({
11
- index: 1,
12
- timestampUtcMs: new Date().toISOString(),
13
- hash: "test-hash",
14
- skip: 0,
15
- type: "test-operation",
16
- input: { test: "data" },
17
- id: "op-1",
18
- ...overrides,
19
- });
20
- const createTestJob = (overrides = {}) => ({
21
- id: "job-1",
22
- documentId: "doc-1",
23
- scope: "global",
24
- branch: "main",
25
- operation: createTestOperation(),
26
- createdAt: new Date().toISOString(),
27
- retryCount: 0,
28
- maxRetries: 3,
29
- ...overrides,
30
- });
31
- beforeEach(() => {
32
- eventBus = new EventBus();
33
- mockEventBusEmit = vi.fn().mockResolvedValue(undefined);
34
- eventBus.emit = mockEventBusEmit;
35
- queue = new InMemoryQueue(eventBus);
36
- executor = new InMemoryJobExecutor(eventBus, queue);
37
- });
38
- describe("start", () => {
39
- it("should start the executor with default config", async () => {
40
- await executor.start();
41
- const status = await executor.getStatus();
42
- expect(status.isRunning).toBe(true);
43
- expect(status.activeJobs).toBe(0);
44
- expect(status.totalJobsProcessed).toBe(0);
45
- });
46
- it("should start the executor with custom config", async () => {
47
- const config = {
48
- maxConcurrency: 10,
49
- jobTimeout: 60000,
50
- retryBaseDelay: 2000,
51
- retryMaxDelay: 60000,
52
- };
53
- await executor.start(config);
54
- const status = await executor.getStatus();
55
- expect(status.isRunning).toBe(true);
56
- });
57
- it("should emit executor started event", async () => {
58
- await executor.start();
59
- expect(mockEventBusEmit).toHaveBeenCalledWith(JobExecutorEventTypes.EXECUTOR_STARTED, expect.objectContaining({
60
- config: expect.any(Object),
61
- startedAt: expect.any(String),
62
- }));
63
- });
64
- it("should throw error if already running", async () => {
65
- await executor.start();
66
- await expect(executor.start()).rejects.toThrow("Job executor is already running");
67
- });
68
- it("should process existing jobs in queue on start", async () => {
69
- const realEventBus = new EventBus();
70
- const realQueue = new InMemoryQueue(realEventBus);
71
- const realExecutor = new InMemoryJobExecutor(realEventBus, realQueue);
72
- const job = createTestJob();
73
- await realQueue.enqueue(job);
74
- await realExecutor.start({ maxConcurrency: 1 });
75
- // Give time for job processing
76
- await new Promise((resolve) => setTimeout(resolve, 500));
77
- const status = await realExecutor.getStatus();
78
- expect(status.totalJobsProcessed).toBeGreaterThan(0);
79
- await realExecutor.stop();
80
- });
81
- });
82
- describe("stop", () => {
83
- beforeEach(async () => {
84
- await executor.start();
85
- });
86
- it("should stop the executor gracefully", async () => {
87
- await executor.stop(true);
88
- const status = await executor.getStatus();
89
- expect(status.isRunning).toBe(false);
90
- });
91
- it("should stop the executor non-gracefully", async () => {
92
- await executor.stop(false);
93
- const status = await executor.getStatus();
94
- expect(status.isRunning).toBe(false);
95
- });
96
- it("should emit executor stopped event", async () => {
97
- await executor.stop();
98
- expect(mockEventBusEmit).toHaveBeenCalledWith(JobExecutorEventTypes.EXECUTOR_STOPPED, expect.objectContaining({
99
- stoppedAt: expect.any(String),
100
- graceful: true,
101
- }));
102
- });
103
- it("should handle stop when not running", async () => {
104
- await executor.stop();
105
- await expect(executor.stop()).resolves.not.toThrow();
106
- });
107
- it("should wait for active jobs when stopping gracefully", async () => {
108
- const job = createTestJob();
109
- await queue.enqueue(job);
110
- // Give some time for job to start
111
- await new Promise((resolve) => setTimeout(resolve, 50));
112
- const stopPromise = executor.stop(true);
113
- // Should eventually complete
114
- await expect(stopPromise).resolves.not.toThrow();
115
- });
116
- });
117
- describe("executeJob", () => {
118
- beforeEach(async () => {
119
- await executor.start();
120
- });
121
- afterEach(async () => {
122
- await executor.stop();
123
- });
124
- it("should execute a job successfully", async () => {
125
- const job = createTestJob();
126
- const result = await executor.executeJob(job);
127
- expect(result.success).toBe(true);
128
- expect(result.job).toEqual(job);
129
- expect(result.duration).toBeGreaterThan(0);
130
- expect(result.completedAt).toBeDefined();
131
- expect(result.metadata).toBeDefined();
132
- });
133
- it("should emit job started and completed events", async () => {
134
- const job = createTestJob();
135
- await executor.executeJob(job);
136
- expect(mockEventBusEmit).toHaveBeenCalledWith(JobExecutorEventTypes.JOB_STARTED, expect.objectContaining({
137
- job,
138
- startedAt: expect.any(String),
139
- }));
140
- expect(mockEventBusEmit).toHaveBeenCalledWith(JobExecutorEventTypes.JOB_COMPLETED, expect.objectContaining({
141
- job,
142
- result: expect.any(Object),
143
- }));
144
- });
145
- it("should handle job execution failure", async () => {
146
- const job = createTestJob();
147
- // Mock the performJobExecution to always fail
148
- const executorInstance = executor;
149
- const originalPerformJobExecution = executorInstance
150
- .performJobExecution;
151
- executorInstance.performJobExecution = vi
152
- .fn()
153
- .mockRejectedValue(new Error("Test failure"));
154
- const result = await executor.executeJob(job);
155
- expect(result.success).toBe(false);
156
- expect(result.error).toBe("Test failure");
157
- // Restore original method
158
- executorInstance.performJobExecution =
159
- originalPerformJobExecution;
160
- });
161
- it("should emit job failed event on failure", async () => {
162
- const job = createTestJob();
163
- // Mock the performJobExecution to always fail
164
- const executorInstance = executor;
165
- executorInstance.performJobExecution = vi
166
- .fn()
167
- .mockRejectedValue(new Error("Test failure"));
168
- await executor.executeJob(job);
169
- expect(mockEventBusEmit).toHaveBeenCalledWith(JobExecutorEventTypes.JOB_FAILED, expect.objectContaining({
170
- job,
171
- error: "Test failure",
172
- willRetry: true,
173
- retryCount: 0,
174
- }));
175
- });
176
- it("should update statistics on job completion", async () => {
177
- const job = createTestJob();
178
- await executor.executeJob(job);
179
- const status = await executor.getStatus();
180
- expect(status.totalJobsProcessed).toBe(1);
181
- expect(status.totalJobsSucceeded).toBe(1);
182
- expect(status.totalJobsFailed).toBe(0);
183
- expect(status.lastJobCompletedAt).toBeDefined();
184
- });
185
- });
186
- describe("getStatus", () => {
187
- it("should return correct status when not running", async () => {
188
- const status = await executor.getStatus();
189
- expect(status.isRunning).toBe(false);
190
- expect(status.activeJobs).toBe(0);
191
- expect(status.totalJobsProcessed).toBe(0);
192
- expect(status.totalJobsSucceeded).toBe(0);
193
- expect(status.totalJobsFailed).toBe(0);
194
- expect(status.uptime).toBeUndefined();
195
- });
196
- it("should return correct status when running", async () => {
197
- await executor.start();
198
- const status = await executor.getStatus();
199
- expect(status.isRunning).toBe(true);
200
- expect(status.uptime).toBeGreaterThanOrEqual(0);
201
- await executor.stop();
202
- });
203
- it("should track active jobs correctly", async () => {
204
- await executor.start();
205
- const job1 = createTestJob({ id: "job-1" });
206
- const job2 = createTestJob({ id: "job-2" });
207
- // Start jobs concurrently
208
- const promise1 = executor.executeJob(job1);
209
- const promise2 = executor.executeJob(job2);
210
- // Check status while jobs are running
211
- const statusDuringExecution = await executor.getStatus();
212
- expect(statusDuringExecution.activeJobs).toBeGreaterThan(0);
213
- // Wait for jobs to complete
214
- await Promise.all([promise1, promise2]);
215
- // Check status after completion
216
- const statusAfterCompletion = await executor.getStatus();
217
- expect(statusAfterCompletion.activeJobs).toBe(0);
218
- await executor.stop();
219
- });
220
- });
221
- describe("getStats", () => {
222
- beforeEach(async () => {
223
- await executor.start();
224
- });
225
- afterEach(async () => {
226
- await executor.stop();
227
- });
228
- it("should return correct initial stats", async () => {
229
- const stats = await executor.getStats();
230
- expect(stats.averageExecutionTime).toBe(0);
231
- expect(stats.successRate).toBe(0);
232
- expect(stats.jobsPerSecond).toBe(0);
233
- expect(stats.queueBacklog).toBe(0);
234
- });
235
- it("should calculate stats correctly after job execution", async () => {
236
- const job = createTestJob();
237
- await executor.executeJob(job);
238
- const stats = await executor.getStats();
239
- expect(stats.averageExecutionTime).toBeGreaterThan(0);
240
- expect(stats.successRate).toBe(1);
241
- expect(stats.jobsPerSecond).toBeGreaterThan(0);
242
- });
243
- it("should include queue backlog in stats", async () => {
244
- const job1 = createTestJob({ id: "job-1" });
245
- const job2 = createTestJob({ id: "job-2" });
246
- await queue.enqueue(job1);
247
- await queue.enqueue(job2);
248
- const stats = await executor.getStats();
249
- expect(stats.queueBacklog).toBe(2);
250
- });
251
- });
252
- describe("pause and resume", () => {
253
- beforeEach(async () => {
254
- await executor.start();
255
- });
256
- afterEach(async () => {
257
- await executor.stop();
258
- });
259
- it("should pause job execution", async () => {
260
- await executor.pause();
261
- const job = createTestJob();
262
- await queue.enqueue(job);
263
- // Give some time to see if job gets processed
264
- await new Promise((resolve) => setTimeout(resolve, 100));
265
- const queueSize = await queue.totalSize();
266
- expect(queueSize).toBe(1); // Job should still be in queue
267
- });
268
- it("should resume job execution", async () => {
269
- await executor.pause();
270
- const job = createTestJob();
271
- await queue.enqueue(job);
272
- await executor.resume();
273
- // Give some time for job processing
274
- await new Promise((resolve) => setTimeout(resolve, 200));
275
- const queueSize = await queue.totalSize();
276
- expect(queueSize).toBe(0); // Job should be processed
277
- });
278
- });
279
- describe("event subscription", () => {
280
- let realEventBus;
281
- let realExecutor;
282
- beforeEach(async () => {
283
- // Use real event bus for event subscription tests
284
- realEventBus = new EventBus();
285
- const realQueue = new InMemoryQueue(realEventBus);
286
- realExecutor = new InMemoryJobExecutor(realEventBus, realQueue);
287
- await realExecutor.start();
288
- });
289
- afterEach(async () => {
290
- await realExecutor.stop();
291
- });
292
- it("should allow subscribing to job started events", async () => {
293
- const events = [];
294
- const unsubscribe = realExecutor.on("jobStarted", (data) => {
295
- events.push(data);
296
- });
297
- const job = createTestJob();
298
- await realExecutor.executeJob(job);
299
- expect(events).toHaveLength(1);
300
- expect(events[0].job).toEqual(job);
301
- unsubscribe();
302
- });
303
- it("should allow subscribing to job completed events", async () => {
304
- const events = [];
305
- const unsubscribe = realExecutor.on("jobCompleted", (data) => {
306
- events.push(data);
307
- });
308
- const job = createTestJob();
309
- await realExecutor.executeJob(job);
310
- expect(events).toHaveLength(1);
311
- expect(events[0].job).toEqual(job);
312
- expect(events[0].result.success).toBe(true);
313
- unsubscribe();
314
- });
315
- it("should allow subscribing to job failed events", async () => {
316
- const events = [];
317
- const unsubscribe = realExecutor.on("jobFailed", (data) => {
318
- events.push(data);
319
- });
320
- const job = createTestJob();
321
- // Mock the performJobExecution to always fail
322
- const executorInstance = realExecutor;
323
- executorInstance.performJobExecution = vi
324
- .fn()
325
- .mockRejectedValue(new Error("Test failure"));
326
- await realExecutor.executeJob(job);
327
- expect(events).toHaveLength(1);
328
- expect(events[0].job).toEqual(job);
329
- expect(events[0].error).toBe("Test failure");
330
- unsubscribe();
331
- });
332
- it("should allow subscribing to executor started events", async () => {
333
- await realExecutor.stop();
334
- const events = [];
335
- const unsubscribe = realExecutor.on("executorStarted", (data) => {
336
- events.push(data);
337
- });
338
- await realExecutor.start();
339
- expect(events).toHaveLength(1);
340
- expect(events[0].config).toBeDefined();
341
- expect(events[0].startedAt).toBeDefined();
342
- unsubscribe();
343
- });
344
- it("should allow subscribing to executor stopped events", async () => {
345
- const events = [];
346
- const unsubscribe = realExecutor.on("executorStopped", (data) => {
347
- events.push(data);
348
- });
349
- await realExecutor.stop();
350
- expect(events).toHaveLength(1);
351
- expect(events[0].stoppedAt).toBeDefined();
352
- expect(events[0].graceful).toBe(true);
353
- unsubscribe();
354
- });
355
- it("should throw error for unknown event type", () => {
356
- expect(() => {
357
- realExecutor.on("unknownEvent", () => { });
358
- }).toThrow("Unknown event type: unknownEvent");
359
- });
360
- });
361
- describe("concurrency control", () => {
362
- it("should respect maxConcurrency setting", async () => {
363
- const realEventBus = new EventBus();
364
- const realQueue = new InMemoryQueue(realEventBus);
365
- const realExecutor = new InMemoryJobExecutor(realEventBus, realQueue);
366
- await realExecutor.start({ maxConcurrency: 2 });
367
- const jobs = [
368
- createTestJob({ id: "job-1" }),
369
- createTestJob({ id: "job-2" }),
370
- createTestJob({ id: "job-3" }),
371
- createTestJob({ id: "job-4" }),
372
- ];
373
- // Enqueue all jobs
374
- for (const job of jobs) {
375
- await realQueue.enqueue(job);
376
- }
377
- // Give some time for processing to start
378
- await new Promise((resolve) => setTimeout(resolve, 50));
379
- const status = await realExecutor.getStatus();
380
- expect(status.activeJobs).toBeLessThanOrEqual(2);
381
- await realExecutor.stop();
382
- });
383
- it("should process jobs concurrently up to the limit", async () => {
384
- const realEventBus = new EventBus();
385
- const realQueue = new InMemoryQueue(realEventBus);
386
- const realExecutor = new InMemoryJobExecutor(realEventBus, realQueue);
387
- await realExecutor.start({ maxConcurrency: 3 });
388
- // Mock performJobExecution to take longer so we can observe concurrency
389
- const executorInstance = realExecutor;
390
- executorInstance.performJobExecution = vi
391
- .fn()
392
- .mockImplementation(() => {
393
- return new Promise((resolve) => setTimeout(() => resolve({ metadata: {} }), 200));
394
- });
395
- const jobs = [
396
- createTestJob({ id: "job-1" }),
397
- createTestJob({ id: "job-2" }),
398
- createTestJob({ id: "job-3" }),
399
- ];
400
- // Enqueue all jobs
401
- for (const job of jobs) {
402
- await realQueue.enqueue(job);
403
- }
404
- // Give some time for processing to start
405
- await new Promise((resolve) => setTimeout(resolve, 50));
406
- const status = await realExecutor.getStatus();
407
- expect(status.activeJobs).toBe(3);
408
- await realExecutor.stop();
409
- });
410
- });
411
- describe("retry logic", () => {
412
- let realEventBus;
413
- let realQueue;
414
- let realExecutor;
415
- beforeEach(async () => {
416
- // Use real event bus and queue for retry logic tests
417
- realEventBus = new EventBus();
418
- realQueue = new InMemoryQueue(realEventBus);
419
- realExecutor = new InMemoryJobExecutor(realEventBus, realQueue);
420
- await realExecutor.start({ retryBaseDelay: 10, retryMaxDelay: 100 });
421
- });
422
- afterEach(async () => {
423
- await realExecutor.stop();
424
- });
425
- it("should retry failed jobs", async () => {
426
- const job = createTestJob({ maxRetries: 2 });
427
- let callCount = 0;
428
- const executorInstance = realExecutor;
429
- executorInstance.performJobExecution = vi
430
- .fn()
431
- .mockImplementation(() => {
432
- callCount++;
433
- if (callCount <= 2) {
434
- throw new Error("Simulated failure");
435
- }
436
- return Promise.resolve({ metadata: {} });
437
- });
438
- await realQueue.enqueue(job);
439
- // Give time for retries
440
- await new Promise((resolve) => setTimeout(resolve, 500));
441
- expect(callCount).toBe(3); // Initial attempt + 2 retries
442
- });
443
- it("should respect maxRetries limit", async () => {
444
- const job = createTestJob({ maxRetries: 1 });
445
- let callCount = 0;
446
- const executorInstance = realExecutor;
447
- executorInstance.performJobExecution = vi
448
- .fn()
449
- .mockImplementation(() => {
450
- callCount++;
451
- throw new Error("Always fails");
452
- });
453
- await realQueue.enqueue(job);
454
- // Give time for retries
455
- await new Promise((resolve) => setTimeout(resolve, 300));
456
- expect(callCount).toBe(2); // Initial attempt + 1 retry
457
- });
458
- it("should use exponential backoff for retries", async () => {
459
- const job = createTestJob({ maxRetries: 3 });
460
- const retryTimes = [];
461
- let callCount = 0;
462
- const executorInstance = realExecutor;
463
- executorInstance.performJobExecution = vi
464
- .fn()
465
- .mockImplementation(() => {
466
- callCount++;
467
- retryTimes.push(Date.now());
468
- throw new Error("Always fails");
469
- });
470
- await realQueue.enqueue(job);
471
- // Give time for retries
472
- await new Promise((resolve) => setTimeout(resolve, 1000));
473
- expect(retryTimes.length).toBeGreaterThan(1);
474
- // Check that delays are increasing (exponential backoff)
475
- for (let i = 1; i < retryTimes.length - 1; i++) {
476
- const delay1 = retryTimes[i] - retryTimes[i - 1];
477
- const delay2 = retryTimes[i + 1] - retryTimes[i];
478
- expect(delay2).toBeGreaterThanOrEqual(delay1 * 0.9); // Allow for some jitter
479
- }
480
- });
481
- });
482
- describe("job timeout", () => {
483
- beforeEach(async () => {
484
- await executor.start({ jobTimeout: 100 });
485
- });
486
- afterEach(async () => {
487
- await executor.stop();
488
- });
489
- it("should timeout long-running jobs", async () => {
490
- const job = createTestJob();
491
- const executorInstance = executor;
492
- executorInstance.performJobExecution = vi
493
- .fn()
494
- .mockImplementation(() => {
495
- return new Promise((resolve) => setTimeout(resolve, 200)); // Longer than timeout
496
- });
497
- const result = await executor.executeJob(job);
498
- expect(result.success).toBe(false);
499
- expect(result.error).toContain("timed out");
500
- });
501
- it("should complete jobs within timeout", async () => {
502
- const job = createTestJob();
503
- const executorInstance = executor;
504
- executorInstance.performJobExecution = vi
505
- .fn()
506
- .mockImplementation(() => {
507
- return new Promise((resolve) => setTimeout(() => resolve({ metadata: {} }), 50)); // Within timeout
508
- });
509
- const result = await executor.executeJob(job);
510
- expect(result.success).toBe(true);
511
- });
512
- });
513
- describe("job abortion", () => {
514
- beforeEach(async () => {
515
- await executor.start();
516
- });
517
- afterEach(async () => {
518
- await executor.stop();
519
- });
520
- it("should abort jobs when stopping non-gracefully", async () => {
521
- const job = createTestJob();
522
- const executorInstance = executor;
523
- executorInstance.performJobExecution = vi
524
- .fn()
525
- .mockImplementation((job, signal) => {
526
- return new Promise((resolve, reject) => {
527
- const timeout = setTimeout(() => resolve({ metadata: {} }), 1000);
528
- signal.addEventListener("abort", () => {
529
- clearTimeout(timeout);
530
- reject(new Error("Job was aborted"));
531
- });
532
- });
533
- });
534
- // Start job execution
535
- const jobPromise = executor.executeJob(job);
536
- // Stop executor non-gracefully after a short delay
537
- setTimeout(() => executor.stop(false), 50);
538
- const result = await jobPromise;
539
- expect(result.success).toBe(false);
540
- expect(result.error).toContain("aborted");
541
- });
542
- });
543
- describe("edge cases", () => {
544
- it("should handle empty queue gracefully", async () => {
545
- await executor.start();
546
- // Give some time for processing
547
- await new Promise((resolve) => setTimeout(resolve, 100));
548
- const status = await executor.getStatus();
549
- expect(status.activeJobs).toBe(0);
550
- await executor.stop();
551
- });
552
- it("should handle rapid start/stop cycles", async () => {
553
- for (let i = 0; i < 5; i++) {
554
- await executor.start();
555
- await executor.stop();
556
- }
557
- const status = await executor.getStatus();
558
- expect(status.isRunning).toBe(false);
559
- });
560
- it("should handle jobs with missing optional properties", async () => {
561
- await executor.start();
562
- const job = {
563
- id: "minimal-job",
564
- documentId: "doc-1",
565
- scope: "global",
566
- branch: "main",
567
- operation: createTestOperation(),
568
- createdAt: new Date().toISOString(),
569
- // retryCount and maxRetries are optional
570
- };
571
- const result = await executor.executeJob(job);
572
- expect(result).toBeDefined();
573
- await executor.stop();
574
- });
575
- it("should handle event bus errors gracefully", async () => {
576
- mockEventBusEmit.mockRejectedValueOnce(new Error("Event bus error"));
577
- await expect(executor.start()).rejects.toThrow("Event bus error");
578
- });
579
- });
580
- });
581
- //# sourceMappingURL=job-executor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job-executor.test.js","sourceRoot":"","sources":["../../test/job-executor.test.ts"],"names":[],"mappings":"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"}