bunqueue 1.9.7 → 1.9.8
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 +9 -172
- 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 +57 -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 +122 -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 +169 -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 +2 -49
- package/dist/application/lockManager.d.ts.map +1 -1
- package/dist/application/lockManager.js +73 -262
- 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 +0 -5
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js +30 -258
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/ackHelpers.d.ts +78 -0
- package/dist/application/operations/ackHelpers.d.ts.map +1 -0
- package/dist/application/operations/ackHelpers.js +162 -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 +8 -2
- 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 +90 -243
- 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/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 +59 -0
- package/dist/domain/queue/dlqShard.d.ts.map +1 -0
- package/dist/domain/queue/dlqShard.js +165 -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 +29 -122
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +152 -426
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/queue/temporalManager.d.ts +81 -0
- package/dist/domain/queue/temporalManager.d.ts.map +1 -0
- package/dist/domain/queue/temporalManager.js +149 -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/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 +4 -13
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +23 -178
- 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/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/http.d.ts +4 -25
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +43 -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/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/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/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/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
|
@@ -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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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shard - Container for queues within a shard
|
|
3
3
|
* Each shard manages multiple queues and their state
|
|
4
|
+
*
|
|
5
|
+
* Refactored to compose smaller modules:
|
|
6
|
+
* - UniqueKeyManager: deduplication with TTL
|
|
7
|
+
* - DlqShard: Dead Letter Queue operations
|
|
8
|
+
* - LimiterManager: rate limiting + concurrency
|
|
9
|
+
* - DependencyTracker: job dependency tracking
|
|
10
|
+
* - TemporalManager: temporal index + delayed job tracking
|
|
4
11
|
*/
|
|
5
12
|
import type { Job, JobId } from '../types/job';
|
|
6
|
-
import {
|
|
13
|
+
import type { QueueState } from '../types/queue';
|
|
7
14
|
import type { DlqEntry, DlqConfig, DlqFilter } from '../types/dlq';
|
|
8
15
|
import { FailureReason } from '../types/dlq';
|
|
9
16
|
import type { StallConfig } from '../types/stall';
|
|
@@ -29,150 +36,81 @@ export interface ShardStats {
|
|
|
29
36
|
export declare class Shard {
|
|
30
37
|
/** Priority queues by queue name */
|
|
31
38
|
readonly queues: Map<string, IndexedPriorityQueue>;
|
|
32
|
-
/**
|
|
33
|
-
readonly
|
|
34
|
-
/** DLQ
|
|
35
|
-
readonly
|
|
36
|
-
/**
|
|
37
|
-
readonly
|
|
39
|
+
/** Unique key manager for deduplication */
|
|
40
|
+
private readonly uniqueKeyManager;
|
|
41
|
+
/** DLQ manager */
|
|
42
|
+
private readonly dlqManager;
|
|
43
|
+
/** Limiter manager for rate/concurrency control */
|
|
44
|
+
private readonly limiterManager;
|
|
45
|
+
/** Dependency tracker */
|
|
46
|
+
private readonly dependencyTracker;
|
|
47
|
+
/** Temporal manager for index and delayed jobs */
|
|
48
|
+
private readonly temporalManager;
|
|
38
49
|
/** Running counters for O(1) stats - updated on every operation */
|
|
39
50
|
private readonly stats;
|
|
40
|
-
/** Set of delayed job IDs for tracking when they become ready */
|
|
41
|
-
private readonly delayedJobIds;
|
|
42
|
-
/**
|
|
43
|
-
* Min-heap of delayed jobs ordered by runAt for O(k) refresh
|
|
44
|
-
* Instead of O(n × queues) iteration
|
|
45
|
-
*/
|
|
46
|
-
private readonly delayedHeap;
|
|
47
|
-
/** Map from jobId to current runAt for stale detection in delayedHeap */
|
|
48
|
-
private readonly delayedRunAt;
|
|
49
|
-
/**
|
|
50
|
-
* Temporal index: Skip List for O(log n) insert/delete instead of O(n) splice
|
|
51
|
-
* Ordered by createdAt for efficient cleanQueue range queries
|
|
52
|
-
*/
|
|
53
|
-
private readonly temporalIndex;
|
|
54
|
-
/** Unique keys per queue for deduplication (with TTL support) */
|
|
55
|
-
readonly uniqueKeys: Map<string, Map<string, UniqueKeyEntry>>;
|
|
56
|
-
/** Jobs waiting for dependencies */
|
|
57
|
-
readonly waitingDeps: Map<JobId, Job>;
|
|
58
|
-
/**
|
|
59
|
-
* Reverse index: depId -> Set of jobIds waiting for that dependency
|
|
60
|
-
* Enables O(1) lookup when a dependency completes instead of O(n) scan
|
|
61
|
-
*/
|
|
62
|
-
readonly dependencyIndex: Map<JobId, Set<JobId>>;
|
|
63
|
-
/** Parent jobs waiting for children to complete */
|
|
64
|
-
readonly waitingChildren: Map<JobId, Job>;
|
|
65
|
-
/** Queue state (pause, rate limit, concurrency) */
|
|
66
|
-
readonly queueState: Map<string, QueueState>;
|
|
67
51
|
/** Active FIFO groups per queue */
|
|
68
52
|
readonly activeGroups: Map<string, Set<string>>;
|
|
69
|
-
/** Rate limiters per queue */
|
|
70
|
-
readonly rateLimiters: Map<string, RateLimiter>;
|
|
71
|
-
/** Concurrency limiters per queue */
|
|
72
|
-
readonly concurrencyLimiters: Map<string, ConcurrencyLimiter>;
|
|
73
53
|
/** Waiter entry with cancellation flag for O(1) cleanup */
|
|
74
54
|
private readonly waiters;
|
|
55
|
+
constructor();
|
|
75
56
|
/** Notify that jobs are available - wakes first non-cancelled waiter */
|
|
76
57
|
notify(): void;
|
|
77
58
|
/** Wait for a job to become available (with timeout) */
|
|
78
59
|
waitForJob(timeoutMs: number): Promise<void>;
|
|
79
|
-
/** Get or create queue */
|
|
80
60
|
getQueue(name: string): IndexedPriorityQueue;
|
|
81
|
-
/** Get queue state */
|
|
82
61
|
getState(name: string): QueueState;
|
|
83
|
-
/** Check if queue is paused */
|
|
84
62
|
isPaused(name: string): boolean;
|
|
85
|
-
/** Pause queue */
|
|
86
63
|
pause(name: string): void;
|
|
87
|
-
/** Resume queue */
|
|
88
64
|
resume(name: string): void;
|
|
89
|
-
/** Check if unique key is available (not registered or expired) */
|
|
90
65
|
isUniqueAvailable(queue: string, key: string): boolean;
|
|
91
|
-
/** Get unique key entry (returns null if not found or expired) */
|
|
92
66
|
getUniqueKeyEntry(queue: string, key: string): UniqueKeyEntry | null;
|
|
93
|
-
/** Register unique key (legacy method without TTL) */
|
|
94
67
|
registerUniqueKey(queue: string, key: string): void;
|
|
95
|
-
/** Register unique key with TTL support */
|
|
96
68
|
registerUniqueKeyWithTtl(queue: string, key: string, jobId: JobId | undefined, ttl?: number): void;
|
|
97
|
-
/** Extend TTL for an existing unique key */
|
|
98
69
|
extendUniqueKeyTtl(queue: string, key: string, ttl: number): boolean;
|
|
99
|
-
/** Release unique key */
|
|
100
70
|
releaseUniqueKey(queue: string, key: string): void;
|
|
101
|
-
/** Clean expired unique keys (call periodically) */
|
|
102
71
|
cleanExpiredUniqueKeys(): number;
|
|
103
|
-
|
|
72
|
+
get uniqueKeys(): Map<string, Map<string, UniqueKeyEntry>>;
|
|
104
73
|
isGroupActive(queue: string, groupId: string): boolean;
|
|
105
|
-
/** Mark FIFO group as active */
|
|
106
74
|
activateGroup(queue: string, groupId: string): void;
|
|
107
|
-
/** Release FIFO group */
|
|
108
75
|
releaseGroup(queue: string, groupId: string): void;
|
|
109
|
-
/** Set rate limit for queue */
|
|
110
76
|
setRateLimit(queue: string, limit: number): void;
|
|
111
|
-
/** Clear rate limit */
|
|
112
77
|
clearRateLimit(queue: string): void;
|
|
113
|
-
/** Try to acquire rate limit token */
|
|
114
78
|
tryAcquireRateLimit(queue: string): boolean;
|
|
115
|
-
/** Set concurrency limit for queue */
|
|
116
79
|
setConcurrency(queue: string, limit: number): void;
|
|
117
|
-
/** Clear concurrency limit */
|
|
118
80
|
clearConcurrency(queue: string): void;
|
|
119
|
-
/** Try to acquire concurrency slot */
|
|
120
81
|
tryAcquireConcurrency(queue: string): boolean;
|
|
121
|
-
/** Release concurrency slot */
|
|
122
82
|
releaseConcurrency(queue: string): void;
|
|
123
|
-
|
|
83
|
+
get queueState(): Map<string, QueueState>;
|
|
84
|
+
/** Clear limiter data for a queue (rate limits, concurrency) */
|
|
85
|
+
clearQueueLimiters(queue: string): void;
|
|
124
86
|
releaseJobResources(queue: string, uniqueKey: string | null, groupId: string | null): void;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
*/
|
|
87
|
+
get waitingDeps(): Map<JobId, Job>;
|
|
88
|
+
get dependencyIndex(): Map<JobId, Set<JobId>>;
|
|
89
|
+
get waitingChildren(): Map<JobId, Job>;
|
|
129
90
|
registerDependencies(jobId: JobId, dependsOn: JobId[]): void;
|
|
130
|
-
/**
|
|
131
|
-
* Unregister a job's dependencies from the reverse index
|
|
132
|
-
* Call when removing a job from waitingDeps
|
|
133
|
-
*/
|
|
134
91
|
unregisterDependencies(jobId: JobId, dependsOn: JobId[]): void;
|
|
135
|
-
/**
|
|
136
|
-
* Get jobs waiting for a specific dependency - O(1)
|
|
137
|
-
*/
|
|
138
92
|
getJobsWaitingFor(depId: JobId): Set<JobId> | undefined;
|
|
139
|
-
|
|
93
|
+
get dlq(): Map<string, DlqEntry[]>;
|
|
94
|
+
get dlqConfig(): Map<string, DlqConfig>;
|
|
95
|
+
get stallConfig(): Map<string, StallConfig>;
|
|
140
96
|
getDlqConfig(queue: string): DlqConfig;
|
|
141
|
-
/** Set DLQ config for queue */
|
|
142
97
|
setDlqConfig(queue: string, config: Partial<DlqConfig>): void;
|
|
143
|
-
/** Get stall config for queue */
|
|
144
98
|
getStallConfig(queue: string): StallConfig;
|
|
145
|
-
/** Set stall config for queue */
|
|
146
99
|
setStallConfig(queue: string, config: Partial<StallConfig>): void;
|
|
147
|
-
/** Add job to DLQ with full metadata */
|
|
148
100
|
addToDlq(job: Job, reason?: FailureReason, error?: string | null): DlqEntry;
|
|
149
|
-
/** Get DLQ entries (raw) */
|
|
150
101
|
getDlqEntries(queue: string): DlqEntry[];
|
|
151
|
-
/** Get DLQ jobs (for backward compatibility) */
|
|
152
102
|
getDlq(queue: string, count?: number): Job[];
|
|
153
|
-
/** Get DLQ entries with filter */
|
|
154
103
|
getDlqFiltered(queue: string, filter: DlqFilter): DlqEntry[];
|
|
155
|
-
/** Remove entry from DLQ by job ID */
|
|
156
104
|
removeFromDlq(queue: string, jobId: JobId): DlqEntry | null;
|
|
157
|
-
/** Get entries ready for auto-retry */
|
|
158
105
|
getAutoRetryEntries(queue: string, now?: number): DlqEntry[];
|
|
159
|
-
/** Get expired entries for cleanup */
|
|
160
106
|
getExpiredEntries(queue: string, now?: number): DlqEntry[];
|
|
161
|
-
/** Remove expired entries */
|
|
162
107
|
purgeExpired(queue: string, now?: number): number;
|
|
163
|
-
/** Clear DLQ for queue */
|
|
164
108
|
clearDlq(queue: string): number;
|
|
165
|
-
/** Get waiting job count for queue */
|
|
166
109
|
getWaitingCount(queue: string): number;
|
|
167
|
-
/** Get DLQ count for queue */
|
|
168
110
|
getDlqCount(queue: string): number;
|
|
169
|
-
/** Get all queue names in this shard */
|
|
170
111
|
getQueueNames(): string[];
|
|
171
|
-
/** Get job counts grouped by priority for a queue */
|
|
172
112
|
getCountsPerPriority(queue: string): Map<number, number>;
|
|
173
|
-
/** Get shard statistics - O(1) */
|
|
174
113
|
getStats(): ShardStats;
|
|
175
|
-
/** Get internal structure sizes for memory debugging */
|
|
176
114
|
getInternalSizes(): {
|
|
177
115
|
delayedJobIds: number;
|
|
178
116
|
delayedHeap: number;
|
|
@@ -180,55 +118,24 @@ export declare class Shard {
|
|
|
180
118
|
temporalIndex: number;
|
|
181
119
|
waiters: number;
|
|
182
120
|
};
|
|
183
|
-
/** Increment queued jobs counter and add to temporal index */
|
|
184
121
|
incrementQueued(jobId: JobId, isDelayed: boolean, createdAt?: number, queue?: string, runAt?: number): void;
|
|
185
|
-
/** Decrement queued jobs counter and remove from temporal index */
|
|
186
122
|
decrementQueued(jobId: JobId): void;
|
|
187
|
-
/** Increment DLQ counter */
|
|
188
123
|
incrementDlq(): void;
|
|
189
|
-
/** Decrement DLQ counter */
|
|
190
124
|
decrementDlq(count?: number): void;
|
|
191
|
-
/**
|
|
192
|
-
* Update delayed jobs that have become ready (call periodically)
|
|
193
|
-
* O(k) where k = jobs that became ready, instead of O(n × queues)
|
|
194
|
-
*/
|
|
195
125
|
refreshDelayedCount(now: number): void;
|
|
196
|
-
/** Reset all counters (used after drain/obliterate) */
|
|
197
126
|
resetQueuedCounters(): void;
|
|
198
|
-
/** Reset DLQ counter */
|
|
199
127
|
resetDlqCounter(): void;
|
|
200
|
-
/**
|
|
201
|
-
* Add job to temporal index - O(log n) with Skip List
|
|
202
|
-
* Previously O(n) with array splice
|
|
203
|
-
*/
|
|
204
|
-
private addToTemporalIndex;
|
|
205
|
-
/**
|
|
206
|
-
* Get old jobs from temporal index - O(log n + k) where k = returned jobs
|
|
207
|
-
* Returns jobs older than threshold, up to limit
|
|
208
|
-
*/
|
|
209
128
|
getOldJobs(queue: string, thresholdMs: number, limit: number): Array<{
|
|
210
129
|
jobId: JobId;
|
|
211
130
|
createdAt: number;
|
|
212
131
|
}>;
|
|
213
|
-
/**
|
|
214
|
-
* Remove job from temporal index (called after job is cleaned)
|
|
215
|
-
* O(n) in worst case but typically fast with deleteWhere
|
|
216
|
-
*/
|
|
217
132
|
removeFromTemporalIndex(jobId: JobId): void;
|
|
218
|
-
/** Clear temporal index for a queue */
|
|
219
133
|
clearTemporalIndexForQueue(queue: string): void;
|
|
220
|
-
/**
|
|
221
|
-
* Clean orphaned temporal index entries.
|
|
222
|
-
* Removes entries for jobs that no longer exist in the queue.
|
|
223
|
-
* Call periodically to prevent memory leaks.
|
|
224
|
-
*/
|
|
225
134
|
cleanOrphanedTemporalEntries(): number;
|
|
226
|
-
/** Drain all waiting jobs from queue, returns drained job IDs for cleanup */
|
|
227
135
|
drain(queue: string): {
|
|
228
136
|
count: number;
|
|
229
137
|
jobIds: JobId[];
|
|
230
138
|
};
|
|
231
|
-
/** Obliterate queue completely */
|
|
232
139
|
obliterate(queue: string): void;
|
|
233
140
|
}
|
|
234
141
|
//# sourceMappingURL=shard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/shard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/shard.ts"],"names":[],"mappings":"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"}
|