@checkstack/queue-memory-backend 0.2.1 → 0.2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @checkstack/queue-memory-backend
2
2
 
3
+ ## 0.2.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [83557c7]
8
+ - Updated dependencies [83557c7]
9
+ - @checkstack/backend-api@0.4.0
10
+ - @checkstack/common@0.4.0
11
+ - @checkstack/queue-api@0.1.2
12
+ - @checkstack/queue-memory-common@0.1.2
13
+
14
+ ## 0.2.2
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [d94121b]
19
+ - @checkstack/backend-api@0.3.3
20
+ - @checkstack/queue-api@0.1.1
21
+
3
22
  ## 0.2.1
4
23
 
5
24
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checkstack/queue-memory-backend",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "scripts": {
@@ -1,4 +1,4 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "bun:test";
1
+ import { describe, it, expect, beforeEach, afterEach, jest } from "bun:test";
2
2
  import { InMemoryQueue } from "./memory-queue";
3
3
  import type { QueueJob } from "@checkstack/queue-api";
4
4
  import type { Logger } from "@checkstack/backend-api";
@@ -345,12 +345,14 @@ describe("InMemoryQueue Consumer Groups", () => {
345
345
 
346
346
  describe("Delayed Jobs", () => {
347
347
  it("should not process job until delay expires", async () => {
348
- const processedTimes: number[] = [];
349
- const enqueueTime = Date.now();
348
+ // Use fake timers for deterministic behavior
349
+ jest.useFakeTimers();
350
+
351
+ let processed = false;
350
352
 
351
353
  await queue.consume(
352
- async (job) => {
353
- processedTimes.push(Date.now());
354
+ async () => {
355
+ processed = true;
354
356
  },
355
357
  { consumerGroup: "delay-group", maxRetries: 0 }
356
358
  );
@@ -358,21 +360,23 @@ describe("InMemoryQueue Consumer Groups", () => {
358
360
  // Enqueue with 2-second delay (becomes 20ms with delayMultiplier=0.01)
359
361
  await queue.enqueue("delayed-job", { startDelay: 2 });
360
362
 
361
- // Check immediately - should not be processed yet
362
- await new Promise((resolve) => setTimeout(resolve, 10));
363
- expect(processedTimes.length).toBe(0);
363
+ // Advance time but NOT past the delay (20ms)
364
+ jest.advanceTimersByTime(15);
365
+ await Promise.resolve();
366
+ expect(processed).toBe(false);
364
367
 
365
- // Wait for delay to expire (20ms + generous buffer for CI)
366
- await new Promise((resolve) => setTimeout(resolve, 150));
367
- expect(processedTimes.length).toBe(1);
368
+ // Advance past the delay
369
+ jest.advanceTimersByTime(10);
370
+ await Promise.resolve();
371
+ expect(processed).toBe(true);
368
372
 
369
- // Verify it was processed after the delay
370
- const actualDelay = processedTimes[0] - enqueueTime;
371
- expect(actualDelay).toBeGreaterThanOrEqual(15); // Allow tolerance
372
- expect(actualDelay).toBeLessThanOrEqual(200); // Allow more tolerance for CI
373
+ jest.useRealTimers();
373
374
  });
374
375
 
375
376
  it("should process non-delayed jobs immediately while delayed jobs wait", async () => {
377
+ // Use fake timers to make this test completely deterministic
378
+ jest.useFakeTimers();
379
+
376
380
  const processed: string[] = [];
377
381
 
378
382
  await queue.consume(
@@ -382,23 +386,33 @@ describe("InMemoryQueue Consumer Groups", () => {
382
386
  { consumerGroup: "mixed-delay-group", maxRetries: 0 }
383
387
  );
384
388
 
385
- // Enqueue delayed job first (10s delay = 100ms with multiplier)
389
+ // Enqueue delayed job first (10s delay = 100ms with 0.01 multiplier)
386
390
  await queue.enqueue("delayed", { startDelay: 10 });
387
391
 
388
392
  // Enqueue immediate job
389
393
  await queue.enqueue("immediate");
390
394
 
391
- // Wait for immediate job to be processed (should be done quickly)
392
- // The delayed job should NOT be processed yet (100ms delay)
393
- await new Promise((resolve) => setTimeout(resolve, 50));
395
+ // Advance timers just enough for immediate job to process, but NOT the delayed job
396
+ jest.advanceTimersByTime(10);
397
+ // Flush the promise queue to let the async handler complete
398
+ await Promise.resolve();
399
+
394
400
  expect(processed).toEqual(["immediate"]);
395
401
 
396
- // Wait for delayed job (100ms + generous buffer for CI)
397
- await new Promise((resolve) => setTimeout(resolve, 300));
402
+ // Advance past the delay (100ms total needed)
403
+ jest.advanceTimersByTime(100);
404
+ await Promise.resolve();
405
+
398
406
  expect(processed).toEqual(["immediate", "delayed"]);
407
+
408
+ // Restore real timers
409
+ jest.useRealTimers();
399
410
  });
400
411
 
401
412
  it("should respect priority with delayed jobs", async () => {
413
+ // Use fake timers for deterministic behavior
414
+ jest.useFakeTimers();
415
+
402
416
  const processed: string[] = [];
403
417
 
404
418
  await queue.consume(
@@ -423,8 +437,9 @@ describe("InMemoryQueue Consumer Groups", () => {
423
437
  priority: 5,
424
438
  });
425
439
 
426
- // Wait for delay to expire (10ms + buffer)
427
- await new Promise((resolve) => setTimeout(resolve, 50));
440
+ // Advance past the delay (10ms)
441
+ jest.advanceTimersByTime(15);
442
+ await Promise.resolve();
428
443
 
429
444
  // Should process in priority order (highest first)
430
445
  expect(processed).toEqual([
@@ -432,6 +447,8 @@ describe("InMemoryQueue Consumer Groups", () => {
432
447
  "medium-priority",
433
448
  "low-priority",
434
449
  ]);
450
+
451
+ jest.useRealTimers();
435
452
  });
436
453
  });
437
454