bunqueue 1.9.6 → 1.9.7

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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Background Tasks - Periodic maintenance operations
3
+ * Stall detection, cleanup, recovery, DLQ maintenance
4
+ */
5
+ import type { BackgroundContext } from './types';
6
+ import type { CronScheduler } from '../infrastructure/scheduler/cronScheduler';
7
+ /** Background task handles for cleanup */
8
+ export interface BackgroundTaskHandles {
9
+ cleanupInterval: ReturnType<typeof setInterval>;
10
+ timeoutInterval: ReturnType<typeof setInterval>;
11
+ depCheckInterval: ReturnType<typeof setInterval>;
12
+ stallCheckInterval: ReturnType<typeof setInterval>;
13
+ dlqMaintenanceInterval: ReturnType<typeof setInterval>;
14
+ lockCheckInterval: ReturnType<typeof setInterval>;
15
+ cronScheduler: CronScheduler;
16
+ }
17
+ /**
18
+ * Start all background tasks
19
+ * Returns handles that can be used to stop tasks later
20
+ */
21
+ export declare function startBackgroundTasks(ctx: BackgroundContext, cronScheduler: CronScheduler): BackgroundTaskHandles;
22
+ /**
23
+ * Stop all background tasks
24
+ */
25
+ export declare function stopBackgroundTasks(handles: BackgroundTaskHandles): void;
26
+ export declare function recover(ctx: BackgroundContext): void;
27
+ /**
28
+ * Process pending dependency checks
29
+ * Uses reverse index for O(m) where m = jobs waiting on completed deps
30
+ */
31
+ export declare function processPendingDependencies(ctx: BackgroundContext): Promise<void>;
32
+ //# sourceMappingURL=backgroundTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTasks.d.ts","sourceRoot":"","sources":["../../src/application/backgroundTasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAChD,eAAe,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAChD,gBAAgB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACjD,kBAAkB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACnD,sBAAsB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACvD,iBAAiB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAClD,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,aAAa,EAAE,aAAa,GAC3B,qBAAqB,CAyCvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAQxE;AAwMD,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAmCpD;AAID;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDtF"}
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Background Tasks - Periodic maintenance operations
3
+ * Stall detection, cleanup, recovery, DLQ maintenance
4
+ */
5
+ import { calculateBackoff } from '../domain/types/job';
6
+ import { getStallAction, incrementStallCount } from '../domain/types/stall';
7
+ import { queueLog } from '../shared/logger';
8
+ import { shardIndex, processingShardIndex, SHARD_COUNT } from '../shared/hash';
9
+ import { withWriteLock } from '../shared/lock';
10
+ import * as dlqOps from './dlqManager';
11
+ import { checkExpiredLocks } from './lockManager';
12
+ import { cleanup } from './cleanupTasks';
13
+ /**
14
+ * Start all background tasks
15
+ * Returns handles that can be used to stop tasks later
16
+ */
17
+ export function startBackgroundTasks(ctx, cronScheduler) {
18
+ const cleanupInterval = setInterval(() => {
19
+ cleanup(ctx);
20
+ }, ctx.config.cleanupIntervalMs);
21
+ const timeoutInterval = setInterval(() => {
22
+ checkJobTimeouts(ctx);
23
+ }, ctx.config.jobTimeoutCheckMs);
24
+ const depCheckInterval = setInterval(() => {
25
+ processPendingDependencies(ctx).catch((err) => {
26
+ queueLog.error('Dependency check failed', { error: String(err) });
27
+ });
28
+ }, ctx.config.dependencyCheckMs);
29
+ const stallCheckInterval = setInterval(() => {
30
+ checkStalledJobs(ctx);
31
+ }, ctx.config.stallCheckMs);
32
+ const dlqMaintenanceInterval = setInterval(() => {
33
+ performDlqMaintenance(ctx);
34
+ }, ctx.config.dlqMaintenanceMs);
35
+ // Lock expiration check runs at same interval as stall check
36
+ const lockCheckInterval = setInterval(() => {
37
+ checkExpiredLocks(getLockContext(ctx)).catch((err) => {
38
+ queueLog.error('Lock expiration check failed', { error: String(err) });
39
+ });
40
+ }, ctx.config.stallCheckMs);
41
+ cronScheduler.start();
42
+ return {
43
+ cleanupInterval,
44
+ timeoutInterval,
45
+ depCheckInterval,
46
+ stallCheckInterval,
47
+ dlqMaintenanceInterval,
48
+ lockCheckInterval,
49
+ cronScheduler,
50
+ };
51
+ }
52
+ /**
53
+ * Stop all background tasks
54
+ */
55
+ export function stopBackgroundTasks(handles) {
56
+ clearInterval(handles.cleanupInterval);
57
+ clearInterval(handles.timeoutInterval);
58
+ clearInterval(handles.depCheckInterval);
59
+ clearInterval(handles.stallCheckInterval);
60
+ clearInterval(handles.dlqMaintenanceInterval);
61
+ clearInterval(handles.lockCheckInterval);
62
+ handles.cronScheduler.stop();
63
+ }
64
+ /** Extract lock context from background context */
65
+ function getLockContext(ctx) {
66
+ return {
67
+ jobIndex: ctx.jobIndex,
68
+ jobLocks: ctx.jobLocks,
69
+ clientJobs: ctx.clientJobs,
70
+ processingShards: ctx.processingShards,
71
+ processingLocks: ctx.processingLocks,
72
+ shards: ctx.shards,
73
+ shardLocks: ctx.shardLocks,
74
+ eventsManager: ctx.eventsManager,
75
+ };
76
+ }
77
+ // ============ Job Timeouts ============
78
+ function checkJobTimeouts(ctx) {
79
+ const now = Date.now();
80
+ for (const procShard of ctx.processingShards) {
81
+ for (const [jobId, job] of procShard) {
82
+ if (job.timeout && job.startedAt && now - job.startedAt > job.timeout) {
83
+ ctx.fail(jobId, 'Job timeout exceeded').catch((err) => {
84
+ queueLog.error('Failed to mark timed out job as failed', {
85
+ jobId: String(jobId),
86
+ error: String(err),
87
+ });
88
+ });
89
+ }
90
+ }
91
+ }
92
+ }
93
+ // ============ Stall Detection ============
94
+ /**
95
+ * Check for stalled jobs and handle them
96
+ * Uses two-phase detection (like BullMQ) to prevent false positives
97
+ */
98
+ function checkStalledJobs(ctx) {
99
+ const now = Date.now();
100
+ const confirmedStalled = [];
101
+ // Phase 1: Check jobs that were candidates from previous cycle
102
+ for (const jobId of ctx.stalledCandidates) {
103
+ const procIdx = processingShardIndex(String(jobId));
104
+ const job = ctx.processingShards[procIdx].get(jobId);
105
+ if (!job) {
106
+ ctx.stalledCandidates.delete(jobId);
107
+ continue;
108
+ }
109
+ const stallConfig = ctx.shards[shardIndex(job.queue)].getStallConfig(job.queue);
110
+ if (!stallConfig.enabled) {
111
+ ctx.stalledCandidates.delete(jobId);
112
+ continue;
113
+ }
114
+ const action = getStallAction(job, stallConfig, now);
115
+ if (action !== "keep" /* StallAction.Keep */) {
116
+ confirmedStalled.push({ job, action });
117
+ }
118
+ ctx.stalledCandidates.delete(jobId);
119
+ }
120
+ // Phase 2: Mark current processing jobs as candidates for NEXT check
121
+ for (let i = 0; i < SHARD_COUNT; i++) {
122
+ const procShard = ctx.processingShards[i];
123
+ for (const [jobId, job] of procShard) {
124
+ const stallConfig = ctx.shards[shardIndex(job.queue)].getStallConfig(job.queue);
125
+ if (!stallConfig.enabled)
126
+ continue;
127
+ const action = getStallAction(job, stallConfig, now);
128
+ if (action !== "keep" /* StallAction.Keep */) {
129
+ ctx.stalledCandidates.add(jobId);
130
+ }
131
+ }
132
+ }
133
+ // Process confirmed stalled jobs
134
+ for (const { job, action } of confirmedStalled) {
135
+ handleStalledJob(job, action, ctx).catch((err) => {
136
+ queueLog.error('Failed to handle stalled job', {
137
+ jobId: String(job.id),
138
+ error: String(err),
139
+ });
140
+ });
141
+ }
142
+ }
143
+ /**
144
+ * Handle a stalled job based on the action
145
+ * Uses proper locking to prevent race conditions
146
+ */
147
+ async function handleStalledJob(job, action, ctx) {
148
+ const idx = shardIndex(job.queue);
149
+ const procIdx = processingShardIndex(String(job.id));
150
+ // Broadcast events before acquiring locks (non-blocking)
151
+ ctx.eventsManager.broadcast({
152
+ eventType: "stalled" /* EventType.Stalled */,
153
+ queue: job.queue,
154
+ jobId: job.id,
155
+ timestamp: Date.now(),
156
+ data: { stallCount: job.stallCount + 1, action },
157
+ });
158
+ void ctx.webhookManager.trigger('stalled', String(job.id), job.queue, {
159
+ data: { stallCount: job.stallCount + 1, action },
160
+ });
161
+ // Acquire processing lock first, then shard lock
162
+ await withWriteLock(ctx.processingLocks[procIdx], async () => {
163
+ // Verify job is still in processing (might have been handled already)
164
+ if (!ctx.processingShards[procIdx].has(job.id)) {
165
+ return;
166
+ }
167
+ await withWriteLock(ctx.shardLocks[idx], () => {
168
+ const shard = ctx.shards[idx];
169
+ if (action === "move_to_dlq" /* StallAction.MoveToDlq */) {
170
+ queueLog.warn('Job exceeded max stalls, moving to DLQ', {
171
+ jobId: String(job.id),
172
+ queue: job.queue,
173
+ stallCount: job.stallCount,
174
+ });
175
+ ctx.processingShards[procIdx].delete(job.id);
176
+ shard.releaseConcurrency(job.queue);
177
+ const entry = shard.addToDlq(job, "stalled" /* FailureReason.Stalled */, `Job stalled ${job.stallCount + 1} times`);
178
+ ctx.jobIndex.set(job.id, { type: 'dlq', queueName: job.queue });
179
+ ctx.storage?.saveDlqEntry(entry);
180
+ }
181
+ else {
182
+ incrementStallCount(job);
183
+ job.attempts++;
184
+ job.startedAt = null;
185
+ job.runAt = Date.now() + calculateBackoff(job);
186
+ job.lastHeartbeat = Date.now();
187
+ queueLog.warn('Job stalled, retrying', {
188
+ jobId: String(job.id),
189
+ queue: job.queue,
190
+ stallCount: job.stallCount,
191
+ attempt: job.attempts,
192
+ });
193
+ ctx.processingShards[procIdx].delete(job.id);
194
+ shard.releaseConcurrency(job.queue);
195
+ shard.getQueue(job.queue).push(job);
196
+ const isDelayed = job.runAt > Date.now();
197
+ shard.incrementQueued(job.id, isDelayed, job.createdAt, job.queue, job.runAt);
198
+ ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: job.queue });
199
+ ctx.storage?.updateForRetry(job);
200
+ }
201
+ });
202
+ });
203
+ }
204
+ // ============ DLQ Maintenance ============
205
+ function performDlqMaintenance(ctx) {
206
+ const dlqCtx = {
207
+ shards: ctx.shards,
208
+ jobIndex: ctx.jobIndex,
209
+ storage: ctx.storage,
210
+ };
211
+ for (const queueName of ctx.queueNamesCache) {
212
+ try {
213
+ const retried = dlqOps.processAutoRetry(queueName, dlqCtx);
214
+ if (retried > 0) {
215
+ queueLog.info('DLQ auto-retry completed', { queue: queueName, retried });
216
+ }
217
+ const purged = dlqOps.purgeExpiredDlq(queueName, dlqCtx);
218
+ if (purged > 0) {
219
+ queueLog.info('DLQ purge completed', { queue: queueName, purged });
220
+ }
221
+ }
222
+ catch (err) {
223
+ queueLog.error('DLQ maintenance failed', { queue: queueName, error: String(err) });
224
+ }
225
+ }
226
+ }
227
+ // ============ Recovery ============
228
+ export function recover(ctx) {
229
+ if (!ctx.storage)
230
+ return;
231
+ const now = Date.now();
232
+ for (const job of ctx.storage.loadPendingJobs()) {
233
+ const idx = shardIndex(job.queue);
234
+ const shard = ctx.shards[idx];
235
+ shard.getQueue(job.queue).push(job);
236
+ ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: job.queue });
237
+ const isDelayed = job.runAt > now;
238
+ shard.incrementQueued(job.id, isDelayed, job.createdAt, job.queue, job.runAt);
239
+ ctx.registerQueueName(job.queue);
240
+ }
241
+ // Load DLQ entries
242
+ const dlqEntries = ctx.storage.loadDlq();
243
+ let dlqCount = 0;
244
+ for (const [queue, entries] of dlqEntries) {
245
+ const idx = shardIndex(queue);
246
+ const shard = ctx.shards[idx];
247
+ for (const entry of entries) {
248
+ let dlq = shard.dlq.get(queue);
249
+ if (!dlq) {
250
+ dlq = [];
251
+ shard.dlq.set(queue, dlq);
252
+ }
253
+ dlq.push(entry);
254
+ shard.incrementDlq();
255
+ dlqCount++;
256
+ }
257
+ ctx.registerQueueName(queue);
258
+ }
259
+ if (dlqCount > 0) {
260
+ queueLog.info('Loaded DLQ entries', { count: dlqCount });
261
+ }
262
+ }
263
+ // ============ Dependency Processing ============
264
+ /**
265
+ * Process pending dependency checks
266
+ * Uses reverse index for O(m) where m = jobs waiting on completed deps
267
+ */
268
+ export async function processPendingDependencies(ctx) {
269
+ if (ctx.pendingDepChecks.size === 0)
270
+ return;
271
+ const completedIds = Array.from(ctx.pendingDepChecks);
272
+ ctx.pendingDepChecks.clear();
273
+ const jobsToCheckByShard = new Map();
274
+ for (const completedId of completedIds) {
275
+ for (let i = 0; i < SHARD_COUNT; i++) {
276
+ const waitingJobIds = ctx.shards[i].getJobsWaitingFor(completedId);
277
+ if (waitingJobIds && waitingJobIds.size > 0) {
278
+ let shardJobs = jobsToCheckByShard.get(i);
279
+ if (!shardJobs) {
280
+ shardJobs = new Set();
281
+ jobsToCheckByShard.set(i, shardJobs);
282
+ }
283
+ for (const jobId of waitingJobIds) {
284
+ shardJobs.add(jobId);
285
+ }
286
+ }
287
+ }
288
+ }
289
+ await Promise.all(Array.from(jobsToCheckByShard.entries()).map(async ([i, jobIdsToCheck]) => {
290
+ const shard = ctx.shards[i];
291
+ const jobsToPromote = [];
292
+ for (const jobId of jobIdsToCheck) {
293
+ const job = shard.waitingDeps.get(jobId);
294
+ if (job?.dependsOn.every((dep) => ctx.completedJobs.has(dep))) {
295
+ jobsToPromote.push(job);
296
+ }
297
+ }
298
+ if (jobsToPromote.length > 0) {
299
+ await withWriteLock(ctx.shardLocks[i], () => {
300
+ const now = Date.now();
301
+ for (const job of jobsToPromote) {
302
+ if (shard.waitingDeps.has(job.id)) {
303
+ shard.waitingDeps.delete(job.id);
304
+ shard.unregisterDependencies(job.id, job.dependsOn);
305
+ shard.getQueue(job.queue).push(job);
306
+ const isDelayed = job.runAt > now;
307
+ shard.incrementQueued(job.id, isDelayed, job.createdAt, job.queue, job.runAt);
308
+ ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: i, queueName: job.queue });
309
+ }
310
+ }
311
+ if (jobsToPromote.length > 0) {
312
+ shard.notify();
313
+ }
314
+ });
315
+ }
316
+ }));
317
+ }
318
+ //# sourceMappingURL=backgroundTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTasks.js","sourceRoot":"","sources":["../../src/application/backgroundTasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cleanup Tasks - Periodic maintenance and garbage collection
3
+ * Handles orphaned entries, stale data, and memory management
4
+ */
5
+ import type { BackgroundContext } from './types';
6
+ /**
7
+ * Main cleanup function - called periodically to maintain system health
8
+ * Cleans orphaned entries, stale data, and manages memory
9
+ */
10
+ export declare function cleanup(ctx: BackgroundContext): void;
11
+ //# sourceMappingURL=cleanupTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupTasks.d.ts","sourceRoot":"","sources":["../../src/application/cleanupTasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAyBpD"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Cleanup Tasks - Periodic maintenance and garbage collection
3
+ * Handles orphaned entries, stale data, and memory management
4
+ */
5
+ import { queueLog } from '../shared/logger';
6
+ import { processingShardIndex, SHARD_COUNT } from '../shared/hash';
7
+ /**
8
+ * Main cleanup function - called periodically to maintain system health
9
+ * Cleans orphaned entries, stale data, and manages memory
10
+ */
11
+ export function cleanup(ctx) {
12
+ const now = Date.now();
13
+ const stallTimeout = 30 * 60 * 1000; // 30 minutes max for processing
14
+ // Refresh delayed counters
15
+ for (let i = 0; i < SHARD_COUNT; i++) {
16
+ ctx.shards[i].refreshDelayedCount(now);
17
+ }
18
+ // Compact priority queues if stale ratio > 20%
19
+ for (let i = 0; i < SHARD_COUNT; i++) {
20
+ for (const q of ctx.shards[i].queues.values()) {
21
+ if (q.needsCompaction(0.2)) {
22
+ q.compact();
23
+ }
24
+ }
25
+ }
26
+ cleanOrphanedProcessingEntries(ctx, now, stallTimeout);
27
+ cleanStaleWaitingDependencies(ctx, now);
28
+ cleanUniqueKeysAndGroups(ctx);
29
+ cleanStalledCandidates(ctx);
30
+ cleanOrphanedJobIndex(ctx);
31
+ cleanOrphanedJobLocks(ctx);
32
+ cleanEmptyQueues(ctx);
33
+ }
34
+ function cleanOrphanedProcessingEntries(ctx, now, stallTimeout) {
35
+ for (let i = 0; i < SHARD_COUNT; i++) {
36
+ const orphaned = [];
37
+ for (const [jobId, job] of ctx.processingShards[i]) {
38
+ if (job.startedAt && now - job.startedAt > stallTimeout) {
39
+ orphaned.push(jobId);
40
+ }
41
+ }
42
+ for (const jobId of orphaned) {
43
+ const job = ctx.processingShards[i].get(jobId);
44
+ if (job) {
45
+ ctx.processingShards[i].delete(jobId);
46
+ ctx.jobIndex.delete(jobId);
47
+ queueLog.warn('Cleaned orphaned processing job', { jobId: String(jobId) });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ function cleanStaleWaitingDependencies(ctx, now) {
53
+ const depTimeout = 60 * 60 * 1000; // 1 hour
54
+ for (let i = 0; i < SHARD_COUNT; i++) {
55
+ const shard = ctx.shards[i];
56
+ const stale = [];
57
+ for (const [_id, job] of shard.waitingDeps) {
58
+ if (now - job.createdAt > depTimeout) {
59
+ stale.push(job);
60
+ }
61
+ }
62
+ for (const job of stale) {
63
+ shard.waitingDeps.delete(job.id);
64
+ shard.unregisterDependencies(job.id, job.dependsOn);
65
+ ctx.jobIndex.delete(job.id);
66
+ queueLog.warn('Cleaned stale waiting dependency', { jobId: String(job.id) });
67
+ }
68
+ }
69
+ }
70
+ function cleanUniqueKeysAndGroups(ctx) {
71
+ for (let i = 0; i < SHARD_COUNT; i++) {
72
+ const shard = ctx.shards[i];
73
+ // Clean expired unique keys
74
+ const expiredCleaned = shard.cleanExpiredUniqueKeys();
75
+ if (expiredCleaned > 0) {
76
+ queueLog.info('Cleaned expired unique keys', { shard: i, removed: expiredCleaned });
77
+ }
78
+ // Trim if too many keys remain
79
+ for (const [queueName, keys] of shard.uniqueKeys) {
80
+ if (keys.size > 1000) {
81
+ const toRemove = Math.floor(keys.size / 2);
82
+ const iter = keys.keys();
83
+ for (let j = 0; j < toRemove; j++) {
84
+ const { value, done } = iter.next();
85
+ if (done)
86
+ break;
87
+ keys.delete(value);
88
+ }
89
+ queueLog.info('Trimmed unique keys', { queue: queueName, removed: toRemove });
90
+ }
91
+ }
92
+ // Clean orphaned active groups
93
+ for (const [queueName, groups] of shard.activeGroups) {
94
+ if (groups.size > 1000) {
95
+ const toRemove = Math.floor(groups.size / 2);
96
+ const iter = groups.values();
97
+ for (let j = 0; j < toRemove; j++) {
98
+ const { value, done } = iter.next();
99
+ if (done)
100
+ break;
101
+ groups.delete(value);
102
+ }
103
+ queueLog.info('Trimmed active groups', { queue: queueName, removed: toRemove });
104
+ }
105
+ }
106
+ }
107
+ }
108
+ function cleanStalledCandidates(ctx) {
109
+ for (const jobId of ctx.stalledCandidates) {
110
+ const loc = ctx.jobIndex.get(jobId);
111
+ if (loc?.type !== 'processing') {
112
+ ctx.stalledCandidates.delete(jobId);
113
+ }
114
+ }
115
+ }
116
+ function cleanOrphanedJobIndex(ctx) {
117
+ // Expensive operation - only run when index is large
118
+ if (ctx.jobIndex.size <= 100_000)
119
+ return;
120
+ let orphanedCount = 0;
121
+ for (const [jobId, loc] of ctx.jobIndex) {
122
+ if (loc.type === 'processing') {
123
+ const procIdx = processingShardIndex(String(jobId));
124
+ if (!ctx.processingShards[procIdx].has(jobId)) {
125
+ ctx.jobIndex.delete(jobId);
126
+ orphanedCount++;
127
+ }
128
+ }
129
+ else if (loc.type === 'queue') {
130
+ const shard = ctx.shards[loc.shardIdx];
131
+ if (!shard.getQueue(loc.queueName).has(jobId)) {
132
+ ctx.jobIndex.delete(jobId);
133
+ orphanedCount++;
134
+ }
135
+ }
136
+ }
137
+ if (orphanedCount > 0) {
138
+ queueLog.info('Cleaned orphaned jobIndex entries', { count: orphanedCount });
139
+ }
140
+ }
141
+ function cleanOrphanedJobLocks(ctx) {
142
+ for (const jobId of ctx.jobLocks.keys()) {
143
+ const loc = ctx.jobIndex.get(jobId);
144
+ if (loc?.type !== 'processing') {
145
+ ctx.jobLocks.delete(jobId);
146
+ }
147
+ }
148
+ }
149
+ function cleanEmptyQueues(ctx) {
150
+ for (let i = 0; i < SHARD_COUNT; i++) {
151
+ const shard = ctx.shards[i];
152
+ const emptyQueues = [];
153
+ for (const [queueName, queue] of shard.queues) {
154
+ const dlqEntries = shard.dlq.get(queueName);
155
+ if (queue.size === 0 && (!dlqEntries || dlqEntries.length === 0)) {
156
+ emptyQueues.push(queueName);
157
+ }
158
+ }
159
+ for (const queueName of emptyQueues) {
160
+ shard.queues.delete(queueName);
161
+ shard.dlq.delete(queueName);
162
+ shard.uniqueKeys.delete(queueName);
163
+ shard.queueState.delete(queueName);
164
+ shard.activeGroups.delete(queueName);
165
+ shard.rateLimiters.delete(queueName);
166
+ shard.concurrencyLimiters.delete(queueName);
167
+ shard.stallConfig.delete(queueName);
168
+ shard.dlqConfig.delete(queueName);
169
+ ctx.unregisterQueueName(queueName);
170
+ }
171
+ if (emptyQueues.length > 0) {
172
+ queueLog.info('Removed empty queues', { shard: i, count: emptyQueues.length });
173
+ }
174
+ // Clean orphaned temporal index entries
175
+ const cleanedTemporal = shard.cleanOrphanedTemporalEntries();
176
+ if (cleanedTemporal > 0) {
177
+ queueLog.info('Cleaned orphaned temporal entries', { shard: i, count: cleanedTemporal });
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=cleanupTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanupTasks.js","sourceRoot":"","sources":["../../src/application/cleanupTasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Lock Manager - Job lock and client tracking
3
+ * Handles BullMQ-style lock-based job ownership
4
+ */
5
+ import type { JobId, JobLock, LockToken } from '../domain/types/job';
6
+ import type { LockContext } from './types';
7
+ /**
8
+ * Create a lock for a job when it's pulled for processing.
9
+ * @returns The lock token, or null if job not in processing
10
+ */
11
+ export declare function createLock(jobId: JobId, owner: string, ctx: LockContext, ttl?: number): LockToken | null;
12
+ /**
13
+ * Verify that a token is valid for a job.
14
+ * @returns true if token matches the active lock
15
+ */
16
+ export declare function verifyLock(jobId: JobId, token: string, ctx: LockContext): boolean;
17
+ /**
18
+ * Renew a lock with the given token.
19
+ * @returns true if renewal succeeded, false if token invalid or lock expired
20
+ */
21
+ export declare function renewJobLock(jobId: JobId, token: string, ctx: LockContext, newTtl?: number): boolean;
22
+ /**
23
+ * Renew locks for multiple jobs (batch operation).
24
+ * @returns Array of jobIds that were successfully renewed
25
+ */
26
+ export declare function renewJobLockBatch(items: Array<{
27
+ id: JobId;
28
+ token: string;
29
+ ttl?: number;
30
+ }>, ctx: LockContext): string[];
31
+ /**
32
+ * Release a lock when job is completed or failed.
33
+ * Should be called by ACK/FAIL operations.
34
+ */
35
+ export declare function releaseLock(jobId: JobId, ctx: LockContext, token?: string): boolean;
36
+ /**
37
+ * Get lock info for a job (for debugging/monitoring).
38
+ */
39
+ export declare function getLockInfo(jobId: JobId, ctx: LockContext): JobLock | null;
40
+ /**
41
+ * Register a job as owned by a client (called on PULL).
42
+ */
43
+ export declare function registerClientJob(clientId: string, jobId: JobId, ctx: LockContext): void;
44
+ /**
45
+ * Unregister a job from a client (called on ACK/FAIL).
46
+ */
47
+ export declare function unregisterClientJob(clientId: string | undefined, jobId: JobId, ctx: LockContext): void;
48
+ /**
49
+ * Release all jobs owned by a client back to queue (called on TCP disconnect).
50
+ * Returns the number of jobs released.
51
+ *
52
+ * Uses proper locking to prevent race conditions.
53
+ */
54
+ export declare function releaseClientJobs(clientId: string, ctx: LockContext): Promise<number>;
55
+ /**
56
+ * Check and handle expired locks.
57
+ * Jobs with expired locks are requeued for retry.
58
+ *
59
+ * Uses proper locking to prevent race conditions.
60
+ */
61
+ export declare function checkExpiredLocks(ctx: LockContext): Promise<void>;
62
+ //# sourceMappingURL=lockManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockManager.d.ts","sourceRoot":"","sources":["../../src/application/lockManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,GAAG,GAAE,MAAyB,GAC7B,SAAS,GAAG,IAAI,CAalB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAMjF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAoBT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACxD,GAAG,EAAE,WAAW,GACf,MAAM,EAAE,CAQV;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAE1E;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAOxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,WAAW,GACf,IAAI,CASN;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiG3F;AAID;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGvE"}