bunqueue 2.3.1 → 2.4.1

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 (83) hide show
  1. package/dist/application/queueManager.d.ts.map +1 -1
  2. package/dist/application/queueManager.js +1 -37
  3. package/dist/application/queueManager.js.map +1 -1
  4. package/dist/application/statsManager.d.ts +10 -0
  5. package/dist/application/statsManager.d.ts.map +1 -1
  6. package/dist/application/statsManager.js +42 -0
  7. package/dist/application/statsManager.js.map +1 -1
  8. package/dist/client/jobConversion.d.ts +3 -76
  9. package/dist/client/jobConversion.d.ts.map +1 -1
  10. package/dist/client/jobConversion.js +2 -100
  11. package/dist/client/jobConversion.js.map +1 -1
  12. package/dist/client/jobConversionHelpers.d.ts +13 -0
  13. package/dist/client/jobConversionHelpers.d.ts.map +1 -0
  14. package/dist/client/jobConversionHelpers.js +105 -0
  15. package/dist/client/jobConversionHelpers.js.map +1 -0
  16. package/dist/client/jobConversionTypes.d.ts +81 -0
  17. package/dist/client/jobConversionTypes.d.ts.map +1 -0
  18. package/dist/client/jobConversionTypes.js +6 -0
  19. package/dist/client/jobConversionTypes.js.map +1 -0
  20. package/dist/client/queue/addBatcher.d.ts +60 -0
  21. package/dist/client/queue/addBatcher.d.ts.map +1 -0
  22. package/dist/client/queue/addBatcher.js +137 -0
  23. package/dist/client/queue/addBatcher.js.map +1 -0
  24. package/dist/client/queue/queue.d.ts +1 -0
  25. package/dist/client/queue/queue.d.ts.map +1 -1
  26. package/dist/client/queue/queue.js +25 -2
  27. package/dist/client/queue/queue.js.map +1 -1
  28. package/dist/client/types.d.ts +16 -0
  29. package/dist/client/types.d.ts.map +1 -1
  30. package/dist/client/types.js.map +1 -1
  31. package/dist/client/worker/worker.d.ts +4 -95
  32. package/dist/client/worker/worker.d.ts.map +1 -1
  33. package/dist/client/worker/worker.js +50 -282
  34. package/dist/client/worker/worker.js.map +1 -1
  35. package/dist/client/worker/workerHeartbeat.d.ts +16 -0
  36. package/dist/client/worker/workerHeartbeat.d.ts.map +1 -0
  37. package/dist/client/worker/workerHeartbeat.js +44 -0
  38. package/dist/client/worker/workerHeartbeat.js.map +1 -0
  39. package/dist/client/worker/workerPull.d.ts +21 -0
  40. package/dist/client/worker/workerPull.d.ts.map +1 -0
  41. package/dist/client/worker/workerPull.js +60 -0
  42. package/dist/client/worker/workerPull.js.map +1 -0
  43. package/dist/client/worker/workerRateLimiter.d.ts +37 -0
  44. package/dist/client/worker/workerRateLimiter.d.ts.map +1 -0
  45. package/dist/client/worker/workerRateLimiter.js +84 -0
  46. package/dist/client/worker/workerRateLimiter.js.map +1 -0
  47. package/dist/domain/queue/shard.d.ts +8 -23
  48. package/dist/domain/queue/shard.d.ts.map +1 -1
  49. package/dist/domain/queue/shard.js +30 -90
  50. package/dist/domain/queue/shard.js.map +1 -1
  51. package/dist/domain/queue/shardCounters.d.ts +36 -0
  52. package/dist/domain/queue/shardCounters.d.ts.map +1 -0
  53. package/dist/domain/queue/shardCounters.js +68 -0
  54. package/dist/domain/queue/shardCounters.js.map +1 -0
  55. package/dist/domain/queue/waiterManager.d.ts +19 -0
  56. package/dist/domain/queue/waiterManager.d.ts.map +1 -0
  57. package/dist/domain/queue/waiterManager.js +64 -0
  58. package/dist/domain/queue/waiterManager.js.map +1 -0
  59. package/dist/shared/boundedMap.d.ts +31 -0
  60. package/dist/shared/boundedMap.d.ts.map +1 -0
  61. package/dist/shared/boundedMap.js +78 -0
  62. package/dist/shared/boundedMap.js.map +1 -0
  63. package/dist/shared/boundedSet.d.ts +27 -0
  64. package/dist/shared/boundedSet.d.ts.map +1 -0
  65. package/dist/shared/boundedSet.js +64 -0
  66. package/dist/shared/boundedSet.js.map +1 -0
  67. package/dist/shared/lru.d.ts +5 -197
  68. package/dist/shared/lru.d.ts.map +1 -1
  69. package/dist/shared/lru.js +5 -538
  70. package/dist/shared/lru.js.map +1 -1
  71. package/dist/shared/lruMap.d.ts +43 -0
  72. package/dist/shared/lruMap.d.ts.map +1 -0
  73. package/dist/shared/lruMap.js +142 -0
  74. package/dist/shared/lruMap.js.map +1 -0
  75. package/dist/shared/lruSet.d.ts +37 -0
  76. package/dist/shared/lruSet.d.ts.map +1 -0
  77. package/dist/shared/lruSet.js +106 -0
  78. package/dist/shared/lruSet.js.map +1 -0
  79. package/dist/shared/ttlMap.d.ts +82 -0
  80. package/dist/shared/ttlMap.d.ts.map +1 -0
  81. package/dist/shared/ttlMap.js +169 -0
  82. package/dist/shared/ttlMap.js.map +1 -0
  83. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ /**
2
+ * LRU Map - Map with automatic least-recently-used eviction
3
+ */
4
+ /**
5
+ * LRU Map - automatically evicts least recently used entries
6
+ * Optimized with doubly-linked list for O(1) move-to-front
7
+ * without delete+re-insert overhead
8
+ */
9
+ export class LRUMap {
10
+ cache = new Map();
11
+ maxSize;
12
+ onEvict;
13
+ // Doubly-linked list head (most recent) and tail (least recent)
14
+ head = null;
15
+ tail = null;
16
+ constructor(maxSize, onEvict) {
17
+ this.maxSize = maxSize;
18
+ this.onEvict = onEvict;
19
+ }
20
+ /** Move node to front (most recently used) - O(1) */
21
+ moveToFront(node) {
22
+ if (node === this.head)
23
+ return; // Already at front
24
+ // Detach from current position
25
+ if (node.prev)
26
+ node.prev.next = node.next;
27
+ if (node.next)
28
+ node.next.prev = node.prev;
29
+ if (node === this.tail)
30
+ this.tail = node.prev;
31
+ // Move to front
32
+ node.prev = null;
33
+ node.next = this.head;
34
+ if (this.head)
35
+ this.head.prev = node;
36
+ this.head = node;
37
+ this.tail ??= node;
38
+ }
39
+ /** Remove node from list - O(1) */
40
+ removeNode(node) {
41
+ if (node.prev)
42
+ node.prev.next = node.next;
43
+ if (node.next)
44
+ node.next.prev = node.prev;
45
+ if (node === this.head)
46
+ this.head = node.next;
47
+ if (node === this.tail)
48
+ this.tail = node.prev;
49
+ }
50
+ /** Add node to front - O(1) */
51
+ addToFront(node) {
52
+ node.prev = null;
53
+ node.next = this.head;
54
+ if (this.head)
55
+ this.head.prev = node;
56
+ this.head = node;
57
+ this.tail ??= node;
58
+ }
59
+ get(key) {
60
+ const node = this.cache.get(key);
61
+ if (!node)
62
+ return undefined;
63
+ // Move to front - O(1) without delete+re-insert
64
+ this.moveToFront(node);
65
+ return node.value;
66
+ }
67
+ set(key, value) {
68
+ const existing = this.cache.get(key);
69
+ if (existing) {
70
+ // Update value and move to front
71
+ existing.value = value;
72
+ this.moveToFront(existing);
73
+ }
74
+ else {
75
+ // Evict if at capacity
76
+ if (this.cache.size >= this.maxSize && this.tail) {
77
+ const evicted = this.tail;
78
+ this.cache.delete(evicted.key);
79
+ this.removeNode(evicted);
80
+ this.onEvict?.(evicted.key, evicted.value);
81
+ }
82
+ // Add new node
83
+ const node = { key, value, prev: null, next: null };
84
+ this.cache.set(key, node);
85
+ this.addToFront(node);
86
+ }
87
+ }
88
+ has(key) {
89
+ return this.cache.has(key);
90
+ }
91
+ delete(key) {
92
+ const node = this.cache.get(key);
93
+ if (!node)
94
+ return false;
95
+ this.removeNode(node);
96
+ return this.cache.delete(key);
97
+ }
98
+ clear() {
99
+ this.cache.clear();
100
+ this.head = null;
101
+ this.tail = null;
102
+ }
103
+ get size() {
104
+ return this.cache.size;
105
+ }
106
+ *keys() {
107
+ // Iterate from tail (oldest) to head (newest) to match original Map behavior
108
+ let current = this.tail;
109
+ while (current) {
110
+ yield current.key;
111
+ current = current.prev;
112
+ }
113
+ }
114
+ *values() {
115
+ // Iterate from tail (oldest) to head (newest) to match original Map behavior
116
+ let current = this.tail;
117
+ while (current) {
118
+ yield current.value;
119
+ current = current.prev;
120
+ }
121
+ }
122
+ *entries() {
123
+ // Iterate from tail (oldest) to head (newest) to match original Map behavior
124
+ let current = this.tail;
125
+ while (current) {
126
+ yield [current.key, current.value];
127
+ current = current.prev;
128
+ }
129
+ }
130
+ forEach(callback) {
131
+ // Iterate from tail (oldest) to head (newest) to match original Map behavior
132
+ let current = this.tail;
133
+ while (current) {
134
+ callback(current.value, current.key);
135
+ current = current.prev;
136
+ }
137
+ }
138
+ [Symbol.iterator]() {
139
+ return this.entries();
140
+ }
141
+ }
142
+ //# sourceMappingURL=lruMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lruMap.js","sourceRoot":"","sources":["../../src/shared/lruMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * LRU Set - Set with automatic least-recently-used eviction
3
+ */
4
+ /** Set-like interface for LRU compatibility */
5
+ export interface SetLike<T> {
6
+ add(value: T): void;
7
+ has(value: T): boolean;
8
+ delete(value: T): boolean;
9
+ clear(): void;
10
+ readonly size: number;
11
+ }
12
+ /**
13
+ * LRU Set - automatically evicts least recently used entries
14
+ * Optimized with doubly-linked list for O(1) move-to-front
15
+ */
16
+ export declare class LRUSet<T> implements SetLike<T> {
17
+ private readonly cache;
18
+ private readonly maxSize;
19
+ private readonly onEvict?;
20
+ private head;
21
+ private tail;
22
+ constructor(maxSize: number, onEvict?: (value: T) => void);
23
+ /** Move node to front - O(1) */
24
+ private moveToFront;
25
+ /** Remove node from list - O(1) */
26
+ private removeNode;
27
+ /** Add node to front - O(1) */
28
+ private addToFront;
29
+ add(value: T): void;
30
+ has(value: T): boolean;
31
+ delete(value: T): boolean;
32
+ clear(): void;
33
+ get size(): number;
34
+ values(): IterableIterator<T>;
35
+ [Symbol.iterator](): IterableIterator<T>;
36
+ }
37
+ //# sourceMappingURL=lruSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lruSet.d.ts","sourceRoot":"","sources":["../../src/shared/lruSet.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACvB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AASD;;;GAGG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqB;IAG9C,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,IAAI,CAA8B;gBAE9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI;IAKzD,gCAAgC;IAChC,OAAO,CAAC,WAAW;IAcnB,mCAAmC;IACnC,OAAO,CAAC,UAAU;IAOlB,+BAA+B;IAC/B,OAAO,CAAC,UAAU;IAQlB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAsBnB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAItB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO;IAQzB,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEA,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAS9B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC;CAGzC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * LRU Set - Set with automatic least-recently-used eviction
3
+ */
4
+ /**
5
+ * LRU Set - automatically evicts least recently used entries
6
+ * Optimized with doubly-linked list for O(1) move-to-front
7
+ */
8
+ export class LRUSet {
9
+ cache = new Map();
10
+ maxSize;
11
+ onEvict;
12
+ // Doubly-linked list head (most recent) and tail (least recent)
13
+ head = null;
14
+ tail = null;
15
+ constructor(maxSize, onEvict) {
16
+ this.maxSize = maxSize;
17
+ this.onEvict = onEvict;
18
+ }
19
+ /** Move node to front - O(1) */
20
+ moveToFront(node) {
21
+ if (node === this.head)
22
+ return;
23
+ if (node.prev)
24
+ node.prev.next = node.next;
25
+ if (node.next)
26
+ node.next.prev = node.prev;
27
+ if (node === this.tail)
28
+ this.tail = node.prev;
29
+ node.prev = null;
30
+ node.next = this.head;
31
+ if (this.head)
32
+ this.head.prev = node;
33
+ this.head = node;
34
+ this.tail ??= node;
35
+ }
36
+ /** Remove node from list - O(1) */
37
+ removeNode(node) {
38
+ if (node.prev)
39
+ node.prev.next = node.next;
40
+ if (node.next)
41
+ node.next.prev = node.prev;
42
+ if (node === this.head)
43
+ this.head = node.next;
44
+ if (node === this.tail)
45
+ this.tail = node.prev;
46
+ }
47
+ /** Add node to front - O(1) */
48
+ addToFront(node) {
49
+ node.prev = null;
50
+ node.next = this.head;
51
+ if (this.head)
52
+ this.head.prev = node;
53
+ this.head = node;
54
+ this.tail ??= node;
55
+ }
56
+ add(value) {
57
+ const existing = this.cache.get(value);
58
+ if (existing) {
59
+ // Move to front
60
+ this.moveToFront(existing);
61
+ }
62
+ else {
63
+ // Evict if at capacity
64
+ if (this.cache.size >= this.maxSize && this.tail) {
65
+ const evicted = this.tail;
66
+ this.cache.delete(evicted.value);
67
+ this.removeNode(evicted);
68
+ this.onEvict?.(evicted.value);
69
+ }
70
+ // Add new node
71
+ const node = { value, prev: null, next: null };
72
+ this.cache.set(value, node);
73
+ this.addToFront(node);
74
+ }
75
+ }
76
+ has(value) {
77
+ return this.cache.has(value);
78
+ }
79
+ delete(value) {
80
+ const node = this.cache.get(value);
81
+ if (!node)
82
+ return false;
83
+ this.removeNode(node);
84
+ return this.cache.delete(value);
85
+ }
86
+ clear() {
87
+ this.cache.clear();
88
+ this.head = null;
89
+ this.tail = null;
90
+ }
91
+ get size() {
92
+ return this.cache.size;
93
+ }
94
+ *values() {
95
+ // Iterate from tail (oldest) to head (newest) to match original Set behavior
96
+ let current = this.tail;
97
+ while (current) {
98
+ yield current.value;
99
+ current = current.prev;
100
+ }
101
+ }
102
+ [Symbol.iterator]() {
103
+ return this.values();
104
+ }
105
+ }
106
+ //# sourceMappingURL=lruSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lruSet.js","sourceRoot":"","sources":["../../src/shared/lruSet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * TTL Map - entries expire after timeout
3
+ * Optimized with MinHeap for O(log n) insert and O(k) cleanup
4
+ */
5
+ /**
6
+ * TTL Map - entries expire after timeout
7
+ * Optimized with MinHeap for O(log n) insert and O(k) cleanup
8
+ *
9
+ * IMPORTANT: You MUST call stop() when done with this instance to prevent memory leaks.
10
+ * The cleanup interval will keep running until stop() is called, preventing the instance
11
+ * from being garbage collected.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const map = new TTLMap<string, number>(60_000); // 60s TTL
16
+ * try {
17
+ * map.set('key', 123);
18
+ * // use map...
19
+ * } finally {
20
+ * map.stop(); // REQUIRED: stops cleanup interval
21
+ * }
22
+ * ```
23
+ *
24
+ * Memory leak prevention:
25
+ * - Each heap entry stores (expiresAt, key)
26
+ * - During cleanup, we verify the key still exists in cache AND has matching expiresAt
27
+ * - Stale entries (deleted keys or updated TTLs) are skipped and removed from heap
28
+ * - Periodic compaction rebuilds heap when stale ratio exceeds threshold
29
+ */
30
+ export declare class TTLMap<K, V> {
31
+ private readonly cache;
32
+ private readonly ttlMs;
33
+ private cleanupInterval;
34
+ /**
35
+ * Expiry heap: MinHeap of (expiresAt, key) for efficient cleanup
36
+ * O(log n) insert instead of O(n) with array splice
37
+ */
38
+ private readonly expiryHeap;
39
+ /** Count of stale entries in heap (deleted or updated keys) */
40
+ private staleCount;
41
+ /** Rebuild heap when stale entries exceed this ratio of heap size */
42
+ private static readonly COMPACTION_THRESHOLD;
43
+ /** Minimum heap size before considering compaction (avoid frequent rebuilds for small heaps) */
44
+ private static readonly MIN_COMPACTION_SIZE;
45
+ /**
46
+ * Create a new TTLMap instance.
47
+ *
48
+ * @param ttlMs - Default time-to-live for entries in milliseconds
49
+ * @param cleanupIntervalMs - Interval between cleanup runs (default: 60000ms / 1 minute).
50
+ * Lower values = more frequent cleanup but higher CPU usage.
51
+ * Set based on expected entry volume and TTL duration.
52
+ */
53
+ constructor(ttlMs: number, cleanupIntervalMs?: number);
54
+ private startCleanup;
55
+ /** O(k log n) cleanup where k = expired entries */
56
+ private cleanup;
57
+ /**
58
+ * Rebuild heap if stale entry ratio exceeds threshold
59
+ * This prevents unbounded heap growth from delete() and set() updates
60
+ */
61
+ private maybeCompact;
62
+ /** Rebuild heap with only valid entries - O(n log n) */
63
+ private rebuildHeap;
64
+ get(key: K): V | undefined;
65
+ /** O(log n) insert with MinHeap instead of O(n) with array splice */
66
+ set(key: K, value: V, ttlMs?: number): void;
67
+ has(key: K): boolean;
68
+ delete(key: K): boolean;
69
+ clear(): void;
70
+ /**
71
+ * Stop the cleanup interval. MUST be called when done with this instance
72
+ * to prevent memory leaks. The interval keeps a reference to the instance,
73
+ * preventing garbage collection until stop() is called.
74
+ */
75
+ stop(): void;
76
+ get size(): number;
77
+ /** Get heap size (for debugging/monitoring) */
78
+ get heapSize(): number;
79
+ /** Get count of stale heap entries (for debugging/monitoring) */
80
+ get staleEntryCount(): number;
81
+ }
82
+ //# sourceMappingURL=ttlMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttlMap.d.ts","sourceRoot":"","sources":["../../src/shared/ttlMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiD;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,eAAe,CAA+C;IAEtE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAEF,+DAA+D;IAC/D,OAAO,CAAC,UAAU,CAAK;IAEvB,qEAAqE;IACrE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAO;IAEnD,gGAAgG;IAChG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD;;;;;;;OAOG;gBACS,KAAK,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAe;IAK7D,OAAO,CAAC,YAAY;IAMpB,mDAAmD;IACnD,OAAO,CAAC,OAAO;IA0Bf;;;OAGG;IACH,OAAO,CAAC,YAAY;IAUpB,wDAAwD;IACxD,OAAO,CAAC,WAAW;IAUnB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAW1B,qEAAqE;IACrE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAc3C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IASvB,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAOZ,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+CAA+C;IAC/C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,iEAAiE;IACjE,IAAI,eAAe,IAAI,MAAM,CAE5B;CACF"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * TTL Map - entries expire after timeout
3
+ * Optimized with MinHeap for O(log n) insert and O(k) cleanup
4
+ */
5
+ import { MinHeap } from './minHeap';
6
+ /**
7
+ * TTL Map - entries expire after timeout
8
+ * Optimized with MinHeap for O(log n) insert and O(k) cleanup
9
+ *
10
+ * IMPORTANT: You MUST call stop() when done with this instance to prevent memory leaks.
11
+ * The cleanup interval will keep running until stop() is called, preventing the instance
12
+ * from being garbage collected.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const map = new TTLMap<string, number>(60_000); // 60s TTL
17
+ * try {
18
+ * map.set('key', 123);
19
+ * // use map...
20
+ * } finally {
21
+ * map.stop(); // REQUIRED: stops cleanup interval
22
+ * }
23
+ * ```
24
+ *
25
+ * Memory leak prevention:
26
+ * - Each heap entry stores (expiresAt, key)
27
+ * - During cleanup, we verify the key still exists in cache AND has matching expiresAt
28
+ * - Stale entries (deleted keys or updated TTLs) are skipped and removed from heap
29
+ * - Periodic compaction rebuilds heap when stale ratio exceeds threshold
30
+ */
31
+ export class TTLMap {
32
+ cache = new Map();
33
+ ttlMs;
34
+ cleanupInterval = null;
35
+ /**
36
+ * Expiry heap: MinHeap of (expiresAt, key) for efficient cleanup
37
+ * O(log n) insert instead of O(n) with array splice
38
+ */
39
+ expiryHeap = new MinHeap((a, b) => a.expiresAt - b.expiresAt);
40
+ /** Count of stale entries in heap (deleted or updated keys) */
41
+ staleCount = 0;
42
+ /** Rebuild heap when stale entries exceed this ratio of heap size */
43
+ static COMPACTION_THRESHOLD = 0.5;
44
+ /** Minimum heap size before considering compaction (avoid frequent rebuilds for small heaps) */
45
+ static MIN_COMPACTION_SIZE = 100;
46
+ /**
47
+ * Create a new TTLMap instance.
48
+ *
49
+ * @param ttlMs - Default time-to-live for entries in milliseconds
50
+ * @param cleanupIntervalMs - Interval between cleanup runs (default: 60000ms / 1 minute).
51
+ * Lower values = more frequent cleanup but higher CPU usage.
52
+ * Set based on expected entry volume and TTL duration.
53
+ */
54
+ constructor(ttlMs, cleanupIntervalMs = 60_000) {
55
+ this.ttlMs = ttlMs;
56
+ this.startCleanup(cleanupIntervalMs);
57
+ }
58
+ startCleanup(intervalMs) {
59
+ this.cleanupInterval = setInterval(() => {
60
+ this.cleanup();
61
+ }, intervalMs);
62
+ }
63
+ /** O(k log n) cleanup where k = expired entries */
64
+ cleanup() {
65
+ const now = Date.now();
66
+ // Remove expired entries from heap - O(k log n)
67
+ while (!this.expiryHeap.isEmpty) {
68
+ const top = this.expiryHeap.peek();
69
+ if (!top || top.expiresAt > now)
70
+ break;
71
+ this.expiryHeap.pop();
72
+ const { key, expiresAt } = top;
73
+ // Verify entry still exists and has same expiry (might have been updated or deleted)
74
+ const entry = this.cache.get(key);
75
+ if (entry?.expiresAt === expiresAt) {
76
+ // Valid expired entry - delete from cache
77
+ this.cache.delete(key);
78
+ }
79
+ else {
80
+ // Stale heap entry (key deleted or TTL updated) - already removed, decrement counter
81
+ if (this.staleCount > 0)
82
+ this.staleCount--;
83
+ }
84
+ }
85
+ // Compact heap if too many stale entries accumulated
86
+ this.maybeCompact();
87
+ }
88
+ /**
89
+ * Rebuild heap if stale entry ratio exceeds threshold
90
+ * This prevents unbounded heap growth from delete() and set() updates
91
+ */
92
+ maybeCompact() {
93
+ const heapSize = this.expiryHeap.size;
94
+ if (heapSize >= TTLMap.MIN_COMPACTION_SIZE &&
95
+ this.staleCount / heapSize > TTLMap.COMPACTION_THRESHOLD) {
96
+ this.rebuildHeap();
97
+ }
98
+ }
99
+ /** Rebuild heap with only valid entries - O(n log n) */
100
+ rebuildHeap() {
101
+ this.expiryHeap.clear();
102
+ this.staleCount = 0;
103
+ // Re-add all valid cache entries to heap
104
+ for (const [key, entry] of this.cache) {
105
+ this.expiryHeap.push({ expiresAt: entry.expiresAt, key });
106
+ }
107
+ }
108
+ get(key) {
109
+ const entry = this.cache.get(key);
110
+ if (!entry)
111
+ return undefined;
112
+ if (entry.expiresAt <= Date.now()) {
113
+ this.cache.delete(key);
114
+ this.staleCount++; // Heap entry is now stale
115
+ return undefined;
116
+ }
117
+ return entry.value;
118
+ }
119
+ /** O(log n) insert with MinHeap instead of O(n) with array splice */
120
+ set(key, value, ttlMs) {
121
+ const expiresAt = Date.now() + (ttlMs ?? this.ttlMs);
122
+ // Check if key already exists - old heap entry becomes stale
123
+ if (this.cache.has(key)) {
124
+ this.staleCount++;
125
+ }
126
+ this.cache.set(key, { value, expiresAt });
127
+ // Add to expiry heap - O(log n) with MinHeap
128
+ this.expiryHeap.push({ expiresAt, key });
129
+ }
130
+ has(key) {
131
+ return this.get(key) !== undefined;
132
+ }
133
+ delete(key) {
134
+ const existed = this.cache.delete(key);
135
+ if (existed) {
136
+ // Heap entry is now stale - will be cleaned up lazily or during compaction
137
+ this.staleCount++;
138
+ }
139
+ return existed;
140
+ }
141
+ clear() {
142
+ this.cache.clear();
143
+ this.expiryHeap.clear();
144
+ this.staleCount = 0;
145
+ }
146
+ /**
147
+ * Stop the cleanup interval. MUST be called when done with this instance
148
+ * to prevent memory leaks. The interval keeps a reference to the instance,
149
+ * preventing garbage collection until stop() is called.
150
+ */
151
+ stop() {
152
+ if (this.cleanupInterval) {
153
+ clearInterval(this.cleanupInterval);
154
+ this.cleanupInterval = null;
155
+ }
156
+ }
157
+ get size() {
158
+ return this.cache.size;
159
+ }
160
+ /** Get heap size (for debugging/monitoring) */
161
+ get heapSize() {
162
+ return this.expiryHeap.size;
163
+ }
164
+ /** Get count of stale heap entries (for debugging/monitoring) */
165
+ get staleEntryCount() {
166
+ return this.staleCount;
167
+ }
168
+ }
169
+ //# sourceMappingURL=ttlMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttlMap.js","sourceRoot":"","sources":["../../src/shared/ttlMap.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunqueue",
3
- "version": "2.3.1",
3
+ "version": "2.4.1",
4
4
  "description": "High-performance job queue server written in TypeScript. SQLite persistence, cron scheduling, priorities, retries, DLQ, webhooks. Minimal dependencies.",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",