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.
- package/dist/application/backgroundTasks.d.ts +3 -6
- package/dist/application/backgroundTasks.d.ts.map +1 -1
- package/dist/application/backgroundTasks.js +10 -179
- package/dist/application/backgroundTasks.js.map +1 -1
- package/dist/application/cleanupTasks.d.ts +1 -1
- package/dist/application/cleanupTasks.d.ts.map +1 -1
- package/dist/application/cleanupTasks.js +61 -22
- package/dist/application/cleanupTasks.js.map +1 -1
- package/dist/application/clientTracking.d.ts +22 -0
- package/dist/application/clientTracking.d.ts.map +1 -0
- package/dist/application/clientTracking.js +118 -0
- package/dist/application/clientTracking.js.map +1 -0
- package/dist/application/contextFactory.d.ts +97 -0
- package/dist/application/contextFactory.d.ts.map +1 -0
- package/dist/application/contextFactory.js +170 -0
- package/dist/application/contextFactory.js.map +1 -0
- package/dist/application/dependencyProcessor.d.ts +11 -0
- package/dist/application/dependencyProcessor.d.ts.map +1 -0
- package/dist/application/dependencyProcessor.js +69 -0
- package/dist/application/dependencyProcessor.js.map +1 -0
- package/dist/application/dlqManager.d.ts +12 -0
- package/dist/application/dlqManager.d.ts.map +1 -1
- package/dist/application/dlqManager.js +36 -0
- package/dist/application/dlqManager.js.map +1 -1
- package/dist/application/lockManager.d.ts +3 -49
- package/dist/application/lockManager.d.ts.map +1 -1
- package/dist/application/lockManager.js +101 -272
- package/dist/application/lockManager.js.map +1 -1
- package/dist/application/lockOperations.d.ts +39 -0
- package/dist/application/lockOperations.d.ts.map +1 -0
- package/dist/application/lockOperations.js +101 -0
- package/dist/application/lockOperations.js.map +1 -0
- package/dist/application/operations/ack.d.ts +1 -5
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js +43 -259
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/ackHelpers.d.ts +79 -0
- package/dist/application/operations/ackHelpers.d.ts.map +1 -0
- package/dist/application/operations/ackHelpers.js +173 -0
- package/dist/application/operations/ackHelpers.js.map +1 -0
- package/dist/application/operations/jobManagement.d.ts +2 -0
- package/dist/application/operations/jobManagement.d.ts.map +1 -1
- package/dist/application/operations/jobManagement.js +8 -0
- package/dist/application/operations/jobManagement.js.map +1 -1
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +20 -6
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/operations/queryOperations.d.ts +11 -0
- package/dist/application/operations/queryOperations.d.ts.map +1 -1
- package/dist/application/operations/queryOperations.js +32 -0
- package/dist/application/operations/queryOperations.js.map +1 -1
- package/dist/application/queueManager.d.ts +3 -11
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +98 -244
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/stallDetection.d.ts +11 -0
- package/dist/application/stallDetection.d.ts.map +1 -0
- package/dist/application/stallDetection.js +128 -0
- package/dist/application/stallDetection.js.map +1 -0
- package/dist/application/types.js +1 -1
- package/dist/application/types.js.map +1 -1
- package/dist/cli/client.d.ts +3 -5
- package/dist/cli/client.d.ts.map +1 -1
- package/dist/cli/client.js +31 -27
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/core.js +3 -3
- package/dist/cli/commands/core.js.map +1 -1
- package/dist/cli/commands/job.js +14 -14
- package/dist/cli/commands/job.js.map +1 -1
- package/dist/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +5 -29
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/client/events.d.ts +0 -1
- package/dist/client/events.d.ts.map +1 -1
- package/dist/client/events.js +4 -7
- package/dist/client/events.js.map +1 -1
- package/dist/client/flow.d.ts +23 -1
- package/dist/client/flow.d.ts.map +1 -1
- package/dist/client/flow.js +166 -68
- package/dist/client/flow.js.map +1 -1
- package/dist/client/queue/queue.d.ts.map +1 -1
- package/dist/client/queue/queue.js +3 -1
- package/dist/client/queue/queue.js.map +1 -1
- package/dist/client/sandboxed/types.d.ts +1 -0
- package/dist/client/sandboxed/types.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.d.ts +1 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.js +31 -8
- package/dist/client/sandboxed/worker.js.map +1 -1
- package/dist/client/sandboxed/wrapper.d.ts.map +1 -1
- package/dist/client/sandboxed/wrapper.js +10 -1
- package/dist/client/sandboxed/wrapper.js.map +1 -1
- package/dist/client/tcp/client.d.ts +4 -1
- package/dist/client/tcp/client.d.ts.map +1 -1
- package/dist/client/tcp/client.js +26 -8
- package/dist/client/tcp/client.js.map +1 -1
- package/dist/client/tcp/connection.d.ts +6 -8
- package/dist/client/tcp/connection.d.ts.map +1 -1
- package/dist/client/tcp/connection.js +24 -22
- package/dist/client/tcp/connection.js.map +1 -1
- package/dist/client/tcp/index.d.ts +0 -1
- package/dist/client/tcp/index.d.ts.map +1 -1
- package/dist/client/tcp/index.js +0 -1
- package/dist/client/tcp/index.js.map +1 -1
- package/dist/client/tcp/types.d.ts +8 -13
- package/dist/client/tcp/types.d.ts.map +1 -1
- package/dist/client/tcp/types.js +0 -1
- package/dist/client/tcp/types.js.map +1 -1
- package/dist/client/tcpPool.d.ts.map +1 -1
- package/dist/client/tcpPool.js +0 -6
- package/dist/client/tcpPool.js.map +1 -1
- package/dist/client/worker/ackBatcher.d.ts +1 -1
- package/dist/client/worker/ackBatcher.d.ts.map +1 -1
- package/dist/client/worker/ackBatcher.js +20 -18
- package/dist/client/worker/ackBatcher.js.map +1 -1
- package/dist/client/worker/jobParser.d.ts.map +1 -1
- package/dist/client/worker/jobParser.js +8 -7
- package/dist/client/worker/jobParser.js.map +1 -1
- package/dist/client/worker/processor.d.ts.map +1 -1
- package/dist/client/worker/processor.js +10 -6
- package/dist/client/worker/processor.js.map +1 -1
- package/dist/domain/queue/dependencyTracker.d.ts +74 -0
- package/dist/domain/queue/dependencyTracker.d.ts.map +1 -0
- package/dist/domain/queue/dependencyTracker.js +126 -0
- package/dist/domain/queue/dependencyTracker.js.map +1 -0
- package/dist/domain/queue/dlqShard.d.ts +61 -0
- package/dist/domain/queue/dlqShard.d.ts.map +1 -0
- package/dist/domain/queue/dlqShard.js +175 -0
- package/dist/domain/queue/dlqShard.js.map +1 -0
- package/dist/domain/queue/limiterManager.d.ts +44 -0
- package/dist/domain/queue/limiterManager.d.ts.map +1 -0
- package/dist/domain/queue/limiterManager.js +99 -0
- package/dist/domain/queue/limiterManager.js.map +1 -0
- package/dist/domain/queue/shard.d.ts +33 -124
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +157 -427
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/queue/temporalManager.d.ts +82 -0
- package/dist/domain/queue/temporalManager.d.ts.map +1 -0
- package/dist/domain/queue/temporalManager.js +150 -0
- package/dist/domain/queue/temporalManager.js.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts +32 -0
- package/dist/domain/queue/uniqueKeyManager.d.ts.map +1 -0
- package/dist/domain/queue/uniqueKeyManager.js +87 -0
- package/dist/domain/queue/uniqueKeyManager.js.map +1 -0
- package/dist/domain/types/command.d.ts +6 -0
- package/dist/domain/types/command.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.d.ts +3 -40
- package/dist/infrastructure/backup/s3Backup.d.ts.map +1 -1
- package/dist/infrastructure/backup/s3Backup.js +10 -182
- package/dist/infrastructure/backup/s3Backup.js.map +1 -1
- package/dist/infrastructure/backup/s3BackupConfig.d.ts +67 -0
- package/dist/infrastructure/backup/s3BackupConfig.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupConfig.js +48 -0
- package/dist/infrastructure/backup/s3BackupConfig.js.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts +23 -0
- package/dist/infrastructure/backup/s3BackupOperations.d.ts.map +1 -0
- package/dist/infrastructure/backup/s3BackupOperations.js +170 -0
- package/dist/infrastructure/backup/s3BackupOperations.js.map +1 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +6 -13
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +28 -179
- package/dist/infrastructure/persistence/sqlite.js.map +1 -1
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +38 -0
- package/dist/infrastructure/persistence/sqliteBatch.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteBatch.js +124 -0
- package/dist/infrastructure/persistence/sqliteBatch.js.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts +17 -0
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js +81 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js.map +1 -0
- package/dist/infrastructure/persistence/statements.d.ts +1 -1
- package/dist/infrastructure/persistence/statements.d.ts.map +1 -1
- package/dist/infrastructure/persistence/statements.js +3 -2
- package/dist/infrastructure/persistence/statements.js.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +7 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.js +23 -3
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
- package/dist/infrastructure/server/handler.d.ts.map +1 -1
- package/dist/infrastructure/server/handler.js +1 -186
- package/dist/infrastructure/server/handler.js.map +1 -1
- package/dist/infrastructure/server/handlerRoutes.d.ts +23 -0
- package/dist/infrastructure/server/handlerRoutes.d.ts.map +1 -0
- package/dist/infrastructure/server/handlerRoutes.js +190 -0
- package/dist/infrastructure/server/handlerRoutes.js.map +1 -0
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/core.js +26 -19
- package/dist/infrastructure/server/handlers/core.js.map +1 -1
- package/dist/infrastructure/server/http.d.ts +4 -25
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +68 -285
- package/dist/infrastructure/server/http.js.map +1 -1
- package/dist/infrastructure/server/httpEndpoints.d.ts +19 -0
- package/dist/infrastructure/server/httpEndpoints.d.ts.map +1 -0
- package/dist/infrastructure/server/httpEndpoints.js +151 -0
- package/dist/infrastructure/server/httpEndpoints.js.map +1 -0
- package/dist/infrastructure/server/protocol.d.ts +15 -1
- package/dist/infrastructure/server/protocol.d.ts.map +1 -1
- package/dist/infrastructure/server/protocol.js +37 -3
- package/dist/infrastructure/server/protocol.js.map +1 -1
- package/dist/infrastructure/server/sseHandler.d.ts +27 -0
- package/dist/infrastructure/server/sseHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/sseHandler.js +77 -0
- package/dist/infrastructure/server/sseHandler.js.map +1 -0
- package/dist/infrastructure/server/tcp.d.ts +8 -10
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +51 -42
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/infrastructure/server/wsHandler.d.ts +31 -0
- package/dist/infrastructure/server/wsHandler.d.ts.map +1 -0
- package/dist/infrastructure/server/wsHandler.js +63 -0
- package/dist/infrastructure/server/wsHandler.js.map +1 -0
- package/dist/main.js +2 -4
- package/dist/main.js.map +1 -1
- package/dist/mcp/index.js +3 -465
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcpHandlers.d.ts +129 -0
- package/dist/mcp/mcpHandlers.d.ts.map +1 -0
- package/dist/mcp/mcpHandlers.js +204 -0
- package/dist/mcp/mcpHandlers.js.map +1 -0
- package/dist/mcp/mcpTools.d.ts +15 -0
- package/dist/mcp/mcpTools.d.ts.map +1 -0
- package/dist/mcp/mcpTools.js +277 -0
- package/dist/mcp/mcpTools.js.map +1 -0
- package/dist/shared/lru.d.ts +23 -0
- package/dist/shared/lru.d.ts.map +1 -1
- package/dist/shared/lru.js +61 -3
- package/dist/shared/lru.js.map +1 -1
- package/dist/shared/skipList.d.ts +10 -2
- package/dist/shared/skipList.d.ts.map +1 -1
- package/dist/shared/skipList.js +22 -1
- package/dist/shared/skipList.js.map +1 -1
- package/package.json +2 -2
- package/dist/cli/dashboard.d.ts +0 -32
- package/dist/cli/dashboard.d.ts.map +0 -1
- package/dist/cli/dashboard.js +0 -183
- package/dist/cli/dashboard.js.map +0 -1
- package/dist/client/tcp/lineBuffer.d.ts +0 -17
- package/dist/client/tcp/lineBuffer.d.ts.map +0 -1
- package/dist/client/tcp/lineBuffer.js +0 -32
- 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":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAC5B,oCAAoC;IAC3B,WAAW,GAAG,IAAI,GAAG,EAAc,CAAC;IAE7C;;;OAGG;IACM,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IAExD,mDAAmD;IAC1C,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IAEjD;;;OAGG;IACH,oBAAoB,CAAC,KAAY,EAAE,SAAkB;QACnD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,KAAY,EAAE,SAAkB;QACrD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAY;QAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAQ;QACpB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAY;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAY;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAY;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,GAAQ;QACvB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAY;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAY;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAY;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YAClC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;YAC1C,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;SAC3C,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -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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"}
|