bunqueue 1.9.7 → 1.9.9

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 (245) hide show
  1. package/dist/application/backgroundTasks.d.ts +3 -6
  2. package/dist/application/backgroundTasks.d.ts.map +1 -1
  3. package/dist/application/backgroundTasks.js +10 -179
  4. package/dist/application/backgroundTasks.js.map +1 -1
  5. package/dist/application/cleanupTasks.d.ts +1 -1
  6. package/dist/application/cleanupTasks.d.ts.map +1 -1
  7. package/dist/application/cleanupTasks.js +61 -22
  8. package/dist/application/cleanupTasks.js.map +1 -1
  9. package/dist/application/clientTracking.d.ts +22 -0
  10. package/dist/application/clientTracking.d.ts.map +1 -0
  11. package/dist/application/clientTracking.js +118 -0
  12. package/dist/application/clientTracking.js.map +1 -0
  13. package/dist/application/contextFactory.d.ts +97 -0
  14. package/dist/application/contextFactory.d.ts.map +1 -0
  15. package/dist/application/contextFactory.js +170 -0
  16. package/dist/application/contextFactory.js.map +1 -0
  17. package/dist/application/dependencyProcessor.d.ts +11 -0
  18. package/dist/application/dependencyProcessor.d.ts.map +1 -0
  19. package/dist/application/dependencyProcessor.js +69 -0
  20. package/dist/application/dependencyProcessor.js.map +1 -0
  21. package/dist/application/dlqManager.d.ts +12 -0
  22. package/dist/application/dlqManager.d.ts.map +1 -1
  23. package/dist/application/dlqManager.js +36 -0
  24. package/dist/application/dlqManager.js.map +1 -1
  25. package/dist/application/lockManager.d.ts +3 -49
  26. package/dist/application/lockManager.d.ts.map +1 -1
  27. package/dist/application/lockManager.js +101 -272
  28. package/dist/application/lockManager.js.map +1 -1
  29. package/dist/application/lockOperations.d.ts +39 -0
  30. package/dist/application/lockOperations.d.ts.map +1 -0
  31. package/dist/application/lockOperations.js +101 -0
  32. package/dist/application/lockOperations.js.map +1 -0
  33. package/dist/application/operations/ack.d.ts +1 -5
  34. package/dist/application/operations/ack.d.ts.map +1 -1
  35. package/dist/application/operations/ack.js +43 -259
  36. package/dist/application/operations/ack.js.map +1 -1
  37. package/dist/application/operations/ackHelpers.d.ts +79 -0
  38. package/dist/application/operations/ackHelpers.d.ts.map +1 -0
  39. package/dist/application/operations/ackHelpers.js +173 -0
  40. package/dist/application/operations/ackHelpers.js.map +1 -0
  41. package/dist/application/operations/jobManagement.d.ts +2 -0
  42. package/dist/application/operations/jobManagement.d.ts.map +1 -1
  43. package/dist/application/operations/jobManagement.js +8 -0
  44. package/dist/application/operations/jobManagement.js.map +1 -1
  45. package/dist/application/operations/push.d.ts.map +1 -1
  46. package/dist/application/operations/push.js +20 -6
  47. package/dist/application/operations/push.js.map +1 -1
  48. package/dist/application/operations/queryOperations.d.ts +11 -0
  49. package/dist/application/operations/queryOperations.d.ts.map +1 -1
  50. package/dist/application/operations/queryOperations.js +32 -0
  51. package/dist/application/operations/queryOperations.js.map +1 -1
  52. package/dist/application/queueManager.d.ts +3 -11
  53. package/dist/application/queueManager.d.ts.map +1 -1
  54. package/dist/application/queueManager.js +98 -244
  55. package/dist/application/queueManager.js.map +1 -1
  56. package/dist/application/stallDetection.d.ts +11 -0
  57. package/dist/application/stallDetection.d.ts.map +1 -0
  58. package/dist/application/stallDetection.js +128 -0
  59. package/dist/application/stallDetection.js.map +1 -0
  60. package/dist/application/types.js +1 -1
  61. package/dist/application/types.js.map +1 -1
  62. package/dist/cli/client.d.ts +3 -5
  63. package/dist/cli/client.d.ts.map +1 -1
  64. package/dist/cli/client.js +31 -27
  65. package/dist/cli/client.js.map +1 -1
  66. package/dist/cli/commands/core.js +3 -3
  67. package/dist/cli/commands/core.js.map +1 -1
  68. package/dist/cli/commands/job.js +14 -14
  69. package/dist/cli/commands/job.js.map +1 -1
  70. package/dist/cli/commands/server.d.ts.map +1 -1
  71. package/dist/cli/commands/server.js +5 -29
  72. package/dist/cli/commands/server.js.map +1 -1
  73. package/dist/cli/index.d.ts.map +1 -1
  74. package/dist/cli/index.js +1 -9
  75. package/dist/cli/index.js.map +1 -1
  76. package/dist/client/events.d.ts +0 -1
  77. package/dist/client/events.d.ts.map +1 -1
  78. package/dist/client/events.js +4 -7
  79. package/dist/client/events.js.map +1 -1
  80. package/dist/client/flow.d.ts +23 -1
  81. package/dist/client/flow.d.ts.map +1 -1
  82. package/dist/client/flow.js +166 -68
  83. package/dist/client/flow.js.map +1 -1
  84. package/dist/client/queue/queue.d.ts.map +1 -1
  85. package/dist/client/queue/queue.js +3 -1
  86. package/dist/client/queue/queue.js.map +1 -1
  87. package/dist/client/sandboxed/types.d.ts +1 -0
  88. package/dist/client/sandboxed/types.d.ts.map +1 -1
  89. package/dist/client/sandboxed/worker.d.ts +1 -0
  90. package/dist/client/sandboxed/worker.d.ts.map +1 -1
  91. package/dist/client/sandboxed/worker.js +31 -8
  92. package/dist/client/sandboxed/worker.js.map +1 -1
  93. package/dist/client/sandboxed/wrapper.d.ts.map +1 -1
  94. package/dist/client/sandboxed/wrapper.js +10 -1
  95. package/dist/client/sandboxed/wrapper.js.map +1 -1
  96. package/dist/client/tcp/client.d.ts +4 -1
  97. package/dist/client/tcp/client.d.ts.map +1 -1
  98. package/dist/client/tcp/client.js +26 -8
  99. package/dist/client/tcp/client.js.map +1 -1
  100. package/dist/client/tcp/connection.d.ts +6 -8
  101. package/dist/client/tcp/connection.d.ts.map +1 -1
  102. package/dist/client/tcp/connection.js +24 -22
  103. package/dist/client/tcp/connection.js.map +1 -1
  104. package/dist/client/tcp/index.d.ts +0 -1
  105. package/dist/client/tcp/index.d.ts.map +1 -1
  106. package/dist/client/tcp/index.js +0 -1
  107. package/dist/client/tcp/index.js.map +1 -1
  108. package/dist/client/tcp/types.d.ts +8 -13
  109. package/dist/client/tcp/types.d.ts.map +1 -1
  110. package/dist/client/tcp/types.js +0 -1
  111. package/dist/client/tcp/types.js.map +1 -1
  112. package/dist/client/tcpPool.d.ts.map +1 -1
  113. package/dist/client/tcpPool.js +0 -6
  114. package/dist/client/tcpPool.js.map +1 -1
  115. package/dist/client/worker/ackBatcher.d.ts +1 -1
  116. package/dist/client/worker/ackBatcher.d.ts.map +1 -1
  117. package/dist/client/worker/ackBatcher.js +20 -18
  118. package/dist/client/worker/ackBatcher.js.map +1 -1
  119. package/dist/client/worker/jobParser.d.ts.map +1 -1
  120. package/dist/client/worker/jobParser.js +8 -7
  121. package/dist/client/worker/jobParser.js.map +1 -1
  122. package/dist/client/worker/processor.d.ts.map +1 -1
  123. package/dist/client/worker/processor.js +10 -6
  124. package/dist/client/worker/processor.js.map +1 -1
  125. package/dist/domain/queue/dependencyTracker.d.ts +74 -0
  126. package/dist/domain/queue/dependencyTracker.d.ts.map +1 -0
  127. package/dist/domain/queue/dependencyTracker.js +126 -0
  128. package/dist/domain/queue/dependencyTracker.js.map +1 -0
  129. package/dist/domain/queue/dlqShard.d.ts +61 -0
  130. package/dist/domain/queue/dlqShard.d.ts.map +1 -0
  131. package/dist/domain/queue/dlqShard.js +175 -0
  132. package/dist/domain/queue/dlqShard.js.map +1 -0
  133. package/dist/domain/queue/limiterManager.d.ts +44 -0
  134. package/dist/domain/queue/limiterManager.d.ts.map +1 -0
  135. package/dist/domain/queue/limiterManager.js +99 -0
  136. package/dist/domain/queue/limiterManager.js.map +1 -0
  137. package/dist/domain/queue/shard.d.ts +33 -124
  138. package/dist/domain/queue/shard.d.ts.map +1 -1
  139. package/dist/domain/queue/shard.js +157 -427
  140. package/dist/domain/queue/shard.js.map +1 -1
  141. package/dist/domain/queue/temporalManager.d.ts +82 -0
  142. package/dist/domain/queue/temporalManager.d.ts.map +1 -0
  143. package/dist/domain/queue/temporalManager.js +150 -0
  144. package/dist/domain/queue/temporalManager.js.map +1 -0
  145. package/dist/domain/queue/uniqueKeyManager.d.ts +32 -0
  146. package/dist/domain/queue/uniqueKeyManager.d.ts.map +1 -0
  147. package/dist/domain/queue/uniqueKeyManager.js +87 -0
  148. package/dist/domain/queue/uniqueKeyManager.js.map +1 -0
  149. package/dist/domain/types/command.d.ts +6 -0
  150. package/dist/domain/types/command.d.ts.map +1 -1
  151. package/dist/infrastructure/backup/s3Backup.d.ts +3 -40
  152. package/dist/infrastructure/backup/s3Backup.d.ts.map +1 -1
  153. package/dist/infrastructure/backup/s3Backup.js +10 -182
  154. package/dist/infrastructure/backup/s3Backup.js.map +1 -1
  155. package/dist/infrastructure/backup/s3BackupConfig.d.ts +67 -0
  156. package/dist/infrastructure/backup/s3BackupConfig.d.ts.map +1 -0
  157. package/dist/infrastructure/backup/s3BackupConfig.js +48 -0
  158. package/dist/infrastructure/backup/s3BackupConfig.js.map +1 -0
  159. package/dist/infrastructure/backup/s3BackupOperations.d.ts +23 -0
  160. package/dist/infrastructure/backup/s3BackupOperations.d.ts.map +1 -0
  161. package/dist/infrastructure/backup/s3BackupOperations.js +170 -0
  162. package/dist/infrastructure/backup/s3BackupOperations.js.map +1 -0
  163. package/dist/infrastructure/persistence/sqlite.d.ts +6 -13
  164. package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
  165. package/dist/infrastructure/persistence/sqlite.js +28 -179
  166. package/dist/infrastructure/persistence/sqlite.js.map +1 -1
  167. package/dist/infrastructure/persistence/sqliteBatch.d.ts +38 -0
  168. package/dist/infrastructure/persistence/sqliteBatch.d.ts.map +1 -0
  169. package/dist/infrastructure/persistence/sqliteBatch.js +124 -0
  170. package/dist/infrastructure/persistence/sqliteBatch.js.map +1 -0
  171. package/dist/infrastructure/persistence/sqliteSerializer.d.ts +17 -0
  172. package/dist/infrastructure/persistence/sqliteSerializer.d.ts.map +1 -0
  173. package/dist/infrastructure/persistence/sqliteSerializer.js +81 -0
  174. package/dist/infrastructure/persistence/sqliteSerializer.js.map +1 -0
  175. package/dist/infrastructure/persistence/statements.d.ts +1 -1
  176. package/dist/infrastructure/persistence/statements.d.ts.map +1 -1
  177. package/dist/infrastructure/persistence/statements.js +3 -2
  178. package/dist/infrastructure/persistence/statements.js.map +1 -1
  179. package/dist/infrastructure/scheduler/cronScheduler.d.ts +7 -0
  180. package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
  181. package/dist/infrastructure/scheduler/cronScheduler.js +23 -3
  182. package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
  183. package/dist/infrastructure/server/handler.d.ts.map +1 -1
  184. package/dist/infrastructure/server/handler.js +1 -186
  185. package/dist/infrastructure/server/handler.js.map +1 -1
  186. package/dist/infrastructure/server/handlerRoutes.d.ts +23 -0
  187. package/dist/infrastructure/server/handlerRoutes.d.ts.map +1 -0
  188. package/dist/infrastructure/server/handlerRoutes.js +190 -0
  189. package/dist/infrastructure/server/handlerRoutes.js.map +1 -0
  190. package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
  191. package/dist/infrastructure/server/handlers/core.js +26 -19
  192. package/dist/infrastructure/server/handlers/core.js.map +1 -1
  193. package/dist/infrastructure/server/http.d.ts +4 -25
  194. package/dist/infrastructure/server/http.d.ts.map +1 -1
  195. package/dist/infrastructure/server/http.js +68 -285
  196. package/dist/infrastructure/server/http.js.map +1 -1
  197. package/dist/infrastructure/server/httpEndpoints.d.ts +19 -0
  198. package/dist/infrastructure/server/httpEndpoints.d.ts.map +1 -0
  199. package/dist/infrastructure/server/httpEndpoints.js +151 -0
  200. package/dist/infrastructure/server/httpEndpoints.js.map +1 -0
  201. package/dist/infrastructure/server/protocol.d.ts +15 -1
  202. package/dist/infrastructure/server/protocol.d.ts.map +1 -1
  203. package/dist/infrastructure/server/protocol.js +37 -3
  204. package/dist/infrastructure/server/protocol.js.map +1 -1
  205. package/dist/infrastructure/server/sseHandler.d.ts +27 -0
  206. package/dist/infrastructure/server/sseHandler.d.ts.map +1 -0
  207. package/dist/infrastructure/server/sseHandler.js +77 -0
  208. package/dist/infrastructure/server/sseHandler.js.map +1 -0
  209. package/dist/infrastructure/server/tcp.d.ts +8 -10
  210. package/dist/infrastructure/server/tcp.d.ts.map +1 -1
  211. package/dist/infrastructure/server/tcp.js +51 -42
  212. package/dist/infrastructure/server/tcp.js.map +1 -1
  213. package/dist/infrastructure/server/wsHandler.d.ts +31 -0
  214. package/dist/infrastructure/server/wsHandler.d.ts.map +1 -0
  215. package/dist/infrastructure/server/wsHandler.js +63 -0
  216. package/dist/infrastructure/server/wsHandler.js.map +1 -0
  217. package/dist/main.js +2 -4
  218. package/dist/main.js.map +1 -1
  219. package/dist/mcp/index.js +3 -465
  220. package/dist/mcp/index.js.map +1 -1
  221. package/dist/mcp/mcpHandlers.d.ts +129 -0
  222. package/dist/mcp/mcpHandlers.d.ts.map +1 -0
  223. package/dist/mcp/mcpHandlers.js +204 -0
  224. package/dist/mcp/mcpHandlers.js.map +1 -0
  225. package/dist/mcp/mcpTools.d.ts +15 -0
  226. package/dist/mcp/mcpTools.d.ts.map +1 -0
  227. package/dist/mcp/mcpTools.js +277 -0
  228. package/dist/mcp/mcpTools.js.map +1 -0
  229. package/dist/shared/lru.d.ts +23 -0
  230. package/dist/shared/lru.d.ts.map +1 -1
  231. package/dist/shared/lru.js +61 -3
  232. package/dist/shared/lru.js.map +1 -1
  233. package/dist/shared/skipList.d.ts +10 -2
  234. package/dist/shared/skipList.d.ts.map +1 -1
  235. package/dist/shared/skipList.js +22 -1
  236. package/dist/shared/skipList.js.map +1 -1
  237. package/package.json +2 -2
  238. package/dist/cli/dashboard.d.ts +0 -32
  239. package/dist/cli/dashboard.d.ts.map +0 -1
  240. package/dist/cli/dashboard.js +0 -183
  241. package/dist/cli/dashboard.js.map +0 -1
  242. package/dist/client/tcp/lineBuffer.d.ts +0 -17
  243. package/dist/client/tcp/lineBuffer.d.ts.map +0 -1
  244. package/dist/client/tcp/lineBuffer.js +0 -32
  245. package/dist/client/tcp/lineBuffer.js.map +0 -1
@@ -0,0 +1,126 @@
1
+ /**
2
+ * DependencyTracker - Tracks job dependencies and parent-child relationships
3
+ */
4
+ /**
5
+ * Manages job dependency tracking for a shard
6
+ * Provides O(1) lookup when dependencies complete
7
+ */
8
+ export class DependencyTracker {
9
+ /** Jobs waiting for dependencies */
10
+ waitingDeps = new Map();
11
+ /**
12
+ * Reverse index: depId -> Set of jobIds waiting for that dependency
13
+ * Enables O(1) lookup when a dependency completes instead of O(n) scan
14
+ */
15
+ dependencyIndex = new Map();
16
+ /** Parent jobs waiting for children to complete */
17
+ waitingChildren = new Map();
18
+ /**
19
+ * Register a job's dependencies in the reverse index
20
+ * Call when adding a job to waitingDeps
21
+ */
22
+ registerDependencies(jobId, dependsOn) {
23
+ for (const depId of dependsOn) {
24
+ let waiters = this.dependencyIndex.get(depId);
25
+ if (!waiters) {
26
+ waiters = new Set();
27
+ this.dependencyIndex.set(depId, waiters);
28
+ }
29
+ waiters.add(jobId);
30
+ }
31
+ }
32
+ /**
33
+ * Unregister a job's dependencies from the reverse index
34
+ * Call when removing a job from waitingDeps
35
+ */
36
+ unregisterDependencies(jobId, dependsOn) {
37
+ for (const depId of dependsOn) {
38
+ const waiters = this.dependencyIndex.get(depId);
39
+ if (waiters) {
40
+ waiters.delete(jobId);
41
+ if (waiters.size === 0) {
42
+ this.dependencyIndex.delete(depId);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Get jobs waiting for a specific dependency - O(1)
49
+ */
50
+ getJobsWaitingFor(depId) {
51
+ return this.dependencyIndex.get(depId);
52
+ }
53
+ /**
54
+ * Add a job that is waiting for dependencies
55
+ */
56
+ addWaitingJob(job) {
57
+ this.waitingDeps.set(job.id, job);
58
+ if (job.dependsOn && job.dependsOn.length > 0) {
59
+ this.registerDependencies(job.id, job.dependsOn);
60
+ }
61
+ }
62
+ /**
63
+ * Remove a job from waiting deps
64
+ */
65
+ removeWaitingJob(jobId) {
66
+ const job = this.waitingDeps.get(jobId);
67
+ if (job) {
68
+ this.waitingDeps.delete(jobId);
69
+ if (job.dependsOn && job.dependsOn.length > 0) {
70
+ this.unregisterDependencies(jobId, job.dependsOn);
71
+ }
72
+ }
73
+ return job;
74
+ }
75
+ /**
76
+ * Get a job waiting for dependencies
77
+ */
78
+ getWaitingJob(jobId) {
79
+ return this.waitingDeps.get(jobId);
80
+ }
81
+ /**
82
+ * Check if a job is waiting for dependencies
83
+ */
84
+ isWaiting(jobId) {
85
+ return this.waitingDeps.has(jobId);
86
+ }
87
+ /**
88
+ * Add a parent job waiting for children
89
+ */
90
+ addWaitingParent(job) {
91
+ this.waitingChildren.set(job.id, job);
92
+ }
93
+ /**
94
+ * Remove a parent job from waiting
95
+ */
96
+ removeWaitingParent(jobId) {
97
+ const job = this.waitingChildren.get(jobId);
98
+ if (job) {
99
+ this.waitingChildren.delete(jobId);
100
+ }
101
+ return job;
102
+ }
103
+ /**
104
+ * Get a parent job waiting for children
105
+ */
106
+ getWaitingParent(jobId) {
107
+ return this.waitingChildren.get(jobId);
108
+ }
109
+ /**
110
+ * Check if a parent is waiting for children
111
+ */
112
+ isParentWaiting(jobId) {
113
+ return this.waitingChildren.has(jobId);
114
+ }
115
+ /**
116
+ * Get counts for debugging
117
+ */
118
+ getCounts() {
119
+ return {
120
+ waitingDeps: this.waitingDeps.size,
121
+ dependencyIndex: this.dependencyIndex.size,
122
+ waitingChildren: this.waitingChildren.size,
123
+ };
124
+ }
125
+ }
126
+ //# sourceMappingURL=dependencyTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyTracker.js","sourceRoot":"","sources":["../../../src/domain/queue/dependencyTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * DlqShard - Dead Letter Queue operations for a shard
3
+ */
4
+ import type { Job, JobId } from '../types/job';
5
+ import type { DlqEntry, DlqConfig, DlqFilter } from '../types/dlq';
6
+ import { FailureReason } from '../types/dlq';
7
+ import type { StallConfig } from '../types/stall';
8
+ /** Stats callback for counter updates */
9
+ export interface DlqStatsCallback {
10
+ incrementDlq(): void;
11
+ decrementDlq(count?: number): void;
12
+ }
13
+ /**
14
+ * Manages Dead Letter Queue operations for a shard
15
+ */
16
+ export declare class DlqShard {
17
+ /** Dead letter queue by queue name */
18
+ private readonly dlq;
19
+ /** DLQ configuration per queue */
20
+ private readonly dlqConfig;
21
+ /** Stall configuration per queue */
22
+ private readonly stallConfig;
23
+ /** Stats callback for counter updates */
24
+ private readonly stats;
25
+ constructor(stats: DlqStatsCallback);
26
+ /** Get DLQ config for queue */
27
+ getConfig(queue: string): DlqConfig;
28
+ /** Set DLQ config for queue */
29
+ setConfig(queue: string, config: Partial<DlqConfig>): void;
30
+ /** Get stall config for queue */
31
+ getStallConfig(queue: string): StallConfig;
32
+ /** Set stall config for queue */
33
+ setStallConfig(queue: string, config: Partial<StallConfig>): void;
34
+ /** Add job to DLQ with full metadata */
35
+ add(job: Job, reason?: FailureReason, error?: string | null): DlqEntry;
36
+ /** Restore an existing DlqEntry (for recovery from persistence) */
37
+ restoreEntry(queue: string, entry: DlqEntry): void;
38
+ /** Get DLQ entries (raw) */
39
+ getEntries(queue: string): DlqEntry[];
40
+ /** Get DLQ jobs (for backward compatibility) */
41
+ getJobs(queue: string, count?: number): Job[];
42
+ /** Get DLQ entries with filter */
43
+ getFiltered(queue: string, filter: DlqFilter): DlqEntry[];
44
+ /** Remove entry from DLQ by job ID */
45
+ remove(queue: string, jobId: JobId): DlqEntry | null;
46
+ /** Get entries ready for auto-retry */
47
+ getAutoRetryEntries(queue: string, now?: number): DlqEntry[];
48
+ /** Get expired entries for cleanup */
49
+ getExpiredEntries(queue: string, now?: number): DlqEntry[];
50
+ /** Remove expired entries */
51
+ purgeExpired(queue: string, now?: number): number;
52
+ /** Clear DLQ for queue */
53
+ clear(queue: string): number;
54
+ /** Get DLQ count for queue */
55
+ getCount(queue: string): number;
56
+ /** Get all queue names with DLQ entries */
57
+ getQueueNames(): string[];
58
+ /** Delete queue data */
59
+ deleteQueue(queue: string): number;
60
+ }
61
+ //# sourceMappingURL=dlqShard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlqShard.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/dlqShard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAEL,aAAa,EAId,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,YAAY,IAAI,IAAI,CAAC;IACrB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IAErD,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAE1D,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAE9D,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAE7B,KAAK,EAAE,gBAAgB;IAInC,+BAA+B;IAC/B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAInC,+BAA+B;IAC/B,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAK1D,iCAAiC;IACjC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAI1C,iCAAiC;IACjC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAKjE,wCAAwC;IACxC,GAAG,CACD,GAAG,EAAE,GAAG,EACR,MAAM,GAAE,aAAqC,EAC7C,KAAK,GAAE,MAAM,GAAG,IAAW,GAC1B,QAAQ;IAqBX,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAUlD,4BAA4B;IAC5B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIrC,gDAAgD;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE;IAO7C,kCAAkC;IAClC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE;IAwBzD,sCAAsC;IACtC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI;IASpD,uCAAuC;IACvC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,QAAQ,EAAE;IAOxE,sCAAsC;IACtC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,QAAQ,EAAE;IAMtE,6BAA6B;IAC7B,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM;IAgB7D,0BAA0B;IAC1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAS5B,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI/B,2CAA2C;IAC3C,aAAa,IAAI,MAAM,EAAE;IAIzB,wBAAwB;IACxB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAQnC"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * DlqShard - Dead Letter Queue operations for a shard
3
+ */
4
+ import { DEFAULT_DLQ_CONFIG, createDlqEntry, isDlqEntryExpired, canAutoRetry, } from '../types/dlq';
5
+ import { DEFAULT_STALL_CONFIG } from '../types/stall';
6
+ /**
7
+ * Manages Dead Letter Queue operations for a shard
8
+ */
9
+ export class DlqShard {
10
+ /** Dead letter queue by queue name */
11
+ dlq = new Map();
12
+ /** DLQ configuration per queue */
13
+ dlqConfig = new Map();
14
+ /** Stall configuration per queue */
15
+ stallConfig = new Map();
16
+ /** Stats callback for counter updates */
17
+ stats;
18
+ constructor(stats) {
19
+ this.stats = stats;
20
+ }
21
+ /** Get DLQ config for queue */
22
+ getConfig(queue) {
23
+ return this.dlqConfig.get(queue) ?? DEFAULT_DLQ_CONFIG;
24
+ }
25
+ /** Set DLQ config for queue */
26
+ setConfig(queue, config) {
27
+ const current = this.getConfig(queue);
28
+ this.dlqConfig.set(queue, { ...current, ...config });
29
+ }
30
+ /** Get stall config for queue */
31
+ getStallConfig(queue) {
32
+ return this.stallConfig.get(queue) ?? DEFAULT_STALL_CONFIG;
33
+ }
34
+ /** Set stall config for queue */
35
+ setStallConfig(queue, config) {
36
+ const current = this.getStallConfig(queue);
37
+ this.stallConfig.set(queue, { ...current, ...config });
38
+ }
39
+ /** Add job to DLQ with full metadata */
40
+ add(job, reason = "unknown" /* FailureReason.Unknown */, error = null) {
41
+ let entries = this.dlq.get(job.queue);
42
+ if (!entries) {
43
+ entries = [];
44
+ this.dlq.set(job.queue, entries);
45
+ }
46
+ const config = this.getConfig(job.queue);
47
+ const entry = createDlqEntry(job, reason, error, config);
48
+ // Enforce max entries
49
+ while (entries.length >= config.maxEntries) {
50
+ entries.shift(); // Remove oldest
51
+ this.stats.decrementDlq();
52
+ }
53
+ entries.push(entry);
54
+ this.stats.incrementDlq();
55
+ return entry;
56
+ }
57
+ /** Restore an existing DlqEntry (for recovery from persistence) */
58
+ restoreEntry(queue, entry) {
59
+ let entries = this.dlq.get(queue);
60
+ if (!entries) {
61
+ entries = [];
62
+ this.dlq.set(queue, entries);
63
+ }
64
+ entries.push(entry);
65
+ this.stats.incrementDlq();
66
+ }
67
+ /** Get DLQ entries (raw) */
68
+ getEntries(queue) {
69
+ return this.dlq.get(queue) ?? [];
70
+ }
71
+ /** Get DLQ jobs (for backward compatibility) */
72
+ getJobs(queue, count) {
73
+ const entries = this.dlq.get(queue);
74
+ if (!entries)
75
+ return [];
76
+ const slice = count ? entries.slice(0, count) : entries;
77
+ return slice.map((e) => e.job);
78
+ }
79
+ /** Get DLQ entries with filter */
80
+ getFiltered(queue, filter) {
81
+ const entries = this.dlq.get(queue);
82
+ if (!entries)
83
+ return [];
84
+ const now = Date.now();
85
+ let result = entries.filter((entry) => {
86
+ if (filter.reason && entry.reason !== filter.reason)
87
+ return false;
88
+ if (filter.olderThan && entry.enteredAt > filter.olderThan)
89
+ return false;
90
+ if (filter.newerThan && entry.enteredAt < filter.newerThan)
91
+ return false;
92
+ if (filter.retriable && !canAutoRetry(entry, this.getConfig(queue), now))
93
+ return false;
94
+ if (filter.expired && !isDlqEntryExpired(entry, now))
95
+ return false;
96
+ return true;
97
+ });
98
+ if (filter.offset) {
99
+ result = result.slice(filter.offset);
100
+ }
101
+ if (filter.limit) {
102
+ result = result.slice(0, filter.limit);
103
+ }
104
+ return result;
105
+ }
106
+ /** Remove entry from DLQ by job ID */
107
+ remove(queue, jobId) {
108
+ const entries = this.dlq.get(queue);
109
+ if (!entries)
110
+ return null;
111
+ const idx = entries.findIndex((e) => e.job.id === jobId);
112
+ if (idx === -1)
113
+ return null;
114
+ this.stats.decrementDlq();
115
+ return entries.splice(idx, 1)[0];
116
+ }
117
+ /** Get entries ready for auto-retry */
118
+ getAutoRetryEntries(queue, now = Date.now()) {
119
+ const entries = this.dlq.get(queue);
120
+ if (!entries)
121
+ return [];
122
+ const config = this.getConfig(queue);
123
+ return entries.filter((entry) => canAutoRetry(entry, config, now));
124
+ }
125
+ /** Get expired entries for cleanup */
126
+ getExpiredEntries(queue, now = Date.now()) {
127
+ const entries = this.dlq.get(queue);
128
+ if (!entries)
129
+ return [];
130
+ return entries.filter((entry) => isDlqEntryExpired(entry, now));
131
+ }
132
+ /** Remove expired entries */
133
+ purgeExpired(queue, now = Date.now()) {
134
+ const entries = this.dlq.get(queue);
135
+ if (!entries)
136
+ return 0;
137
+ const before = entries.length;
138
+ const remaining = entries.filter((entry) => !isDlqEntryExpired(entry, now));
139
+ if (remaining.length < before) {
140
+ this.dlq.set(queue, remaining);
141
+ const removed = before - remaining.length;
142
+ this.stats.decrementDlq(removed);
143
+ return removed;
144
+ }
145
+ return 0;
146
+ }
147
+ /** Clear DLQ for queue */
148
+ clear(queue) {
149
+ const entries = this.dlq.get(queue);
150
+ if (!entries)
151
+ return 0;
152
+ const count = entries.length;
153
+ this.dlq.delete(queue);
154
+ this.stats.decrementDlq(count);
155
+ return count;
156
+ }
157
+ /** Get DLQ count for queue */
158
+ getCount(queue) {
159
+ return this.dlq.get(queue)?.length ?? 0;
160
+ }
161
+ /** Get all queue names with DLQ entries */
162
+ getQueueNames() {
163
+ return Array.from(this.dlq.keys());
164
+ }
165
+ /** Delete queue data */
166
+ deleteQueue(queue) {
167
+ const entries = this.dlq.get(queue);
168
+ const count = entries?.length ?? 0;
169
+ this.dlq.delete(queue);
170
+ this.dlqConfig.delete(queue);
171
+ this.stallConfig.delete(queue);
172
+ return count;
173
+ }
174
+ }
175
+ //# sourceMappingURL=dlqShard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dlqShard.js","sourceRoot":"","sources":["../../../src/domain/queue/dlqShard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * LimiterManager - Rate limiting and concurrency control
3
+ */
4
+ import { type QueueState } from '../types/queue';
5
+ /**
6
+ * Manages rate limiting and concurrency for queues
7
+ */
8
+ export declare class LimiterManager {
9
+ /** Queue state (pause, rate limit, concurrency) */
10
+ private readonly queueState;
11
+ /** Rate limiters per queue */
12
+ private readonly rateLimiters;
13
+ /** Concurrency limiters per queue */
14
+ private readonly concurrencyLimiters;
15
+ /** Get queue state */
16
+ getState(name: string): QueueState;
17
+ /** Check if queue is paused */
18
+ isPaused(name: string): boolean;
19
+ /** Pause queue */
20
+ pause(name: string): void;
21
+ /** Resume queue */
22
+ resume(name: string): void;
23
+ /** Set rate limit for queue */
24
+ setRateLimit(queue: string, limit: number): void;
25
+ /** Clear rate limit */
26
+ clearRateLimit(queue: string): void;
27
+ /** Try to acquire rate limit token */
28
+ tryAcquireRateLimit(queue: string): boolean;
29
+ /** Set concurrency limit for queue */
30
+ setConcurrency(queue: string, limit: number): void;
31
+ /** Clear concurrency limit */
32
+ clearConcurrency(queue: string): void;
33
+ /** Try to acquire concurrency slot */
34
+ tryAcquireConcurrency(queue: string): boolean;
35
+ /** Release concurrency slot */
36
+ releaseConcurrency(queue: string): void;
37
+ /** Get all queue names with state */
38
+ getQueueNames(): string[];
39
+ /** Delete queue data */
40
+ deleteQueue(queue: string): void;
41
+ /** Get the underlying state map (for backward compatibility) */
42
+ getStateMap(): Map<string, QueueState>;
43
+ }
44
+ //# sourceMappingURL=limiterManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limiterManager.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/limiterManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAqD,MAAM,gBAAgB,CAAC;AAEpG;;GAEG;AACH,qBAAa,cAAc;IACzB,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAE5D,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAE/D,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyC;IAE7E,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IASlC,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,kBAAkB;IAClB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,mBAAmB;IACnB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM1B,+BAA+B;IAC/B,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhD,uBAAuB;IACvB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnC,sCAAsC;IACtC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAO3C,sCAAsC;IACtC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlD,8BAA8B;IAC9B,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMrC,sCAAsC;IACtC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK7C,+BAA+B;IAC/B,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvC,qCAAqC;IACrC,aAAa,IAAI,MAAM,EAAE;IAIzB,wBAAwB;IACxB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,gEAAgE;IAChE,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;CAGvC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * LimiterManager - Rate limiting and concurrency control
3
+ */
4
+ import { createQueueState, RateLimiter, ConcurrencyLimiter } from '../types/queue';
5
+ /**
6
+ * Manages rate limiting and concurrency for queues
7
+ */
8
+ export class LimiterManager {
9
+ /** Queue state (pause, rate limit, concurrency) */
10
+ queueState = new Map();
11
+ /** Rate limiters per queue */
12
+ rateLimiters = new Map();
13
+ /** Concurrency limiters per queue */
14
+ concurrencyLimiters = new Map();
15
+ /** Get queue state */
16
+ getState(name) {
17
+ let state = this.queueState.get(name);
18
+ if (!state) {
19
+ state = createQueueState(name);
20
+ this.queueState.set(name, state);
21
+ }
22
+ return state;
23
+ }
24
+ /** Check if queue is paused */
25
+ isPaused(name) {
26
+ return this.queueState.get(name)?.paused ?? false;
27
+ }
28
+ /** Pause queue */
29
+ pause(name) {
30
+ this.getState(name).paused = true;
31
+ }
32
+ /** Resume queue */
33
+ resume(name) {
34
+ this.getState(name).paused = false;
35
+ }
36
+ // ============ Rate Limiting ============
37
+ /** Set rate limit for queue */
38
+ setRateLimit(queue, limit) {
39
+ this.rateLimiters.set(queue, new RateLimiter(limit));
40
+ this.getState(queue).rateLimit = limit;
41
+ }
42
+ /** Clear rate limit */
43
+ clearRateLimit(queue) {
44
+ this.rateLimiters.delete(queue);
45
+ const state = this.queueState.get(queue);
46
+ if (state)
47
+ state.rateLimit = null;
48
+ }
49
+ /** Try to acquire rate limit token */
50
+ tryAcquireRateLimit(queue) {
51
+ const limiter = this.rateLimiters.get(queue);
52
+ return !limiter || limiter.tryAcquire();
53
+ }
54
+ // ============ Concurrency Limiting ============
55
+ /** Set concurrency limit for queue */
56
+ setConcurrency(queue, limit) {
57
+ let limiter = this.concurrencyLimiters.get(queue);
58
+ if (limiter) {
59
+ limiter.setLimit(limit);
60
+ }
61
+ else {
62
+ limiter = new ConcurrencyLimiter(limit);
63
+ this.concurrencyLimiters.set(queue, limiter);
64
+ }
65
+ this.getState(queue).concurrencyLimit = limit;
66
+ }
67
+ /** Clear concurrency limit */
68
+ clearConcurrency(queue) {
69
+ this.concurrencyLimiters.delete(queue);
70
+ const state = this.queueState.get(queue);
71
+ if (state)
72
+ state.concurrencyLimit = null;
73
+ }
74
+ /** Try to acquire concurrency slot */
75
+ tryAcquireConcurrency(queue) {
76
+ const limiter = this.concurrencyLimiters.get(queue);
77
+ return !limiter || limiter.tryAcquire();
78
+ }
79
+ /** Release concurrency slot */
80
+ releaseConcurrency(queue) {
81
+ this.concurrencyLimiters.get(queue)?.release();
82
+ }
83
+ // ============ Queue Management ============
84
+ /** Get all queue names with state */
85
+ getQueueNames() {
86
+ return Array.from(this.queueState.keys());
87
+ }
88
+ /** Delete queue data */
89
+ deleteQueue(queue) {
90
+ this.queueState.delete(queue);
91
+ this.rateLimiters.delete(queue);
92
+ this.concurrencyLimiters.delete(queue);
93
+ }
94
+ /** Get the underlying state map (for backward compatibility) */
95
+ getStateMap() {
96
+ return this.queueState;
97
+ }
98
+ }
99
+ //# sourceMappingURL=limiterManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limiterManager.js","sourceRoot":"","sources":["../../../src/domain/queue/limiterManager.ts"],"names":[],"mappings":"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"}