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.
- package/dist/application/backgroundTasks.d.ts +32 -0
- package/dist/application/backgroundTasks.d.ts.map +1 -0
- package/dist/application/backgroundTasks.js +318 -0
- package/dist/application/backgroundTasks.js.map +1 -0
- package/dist/application/cleanupTasks.d.ts +11 -0
- package/dist/application/cleanupTasks.d.ts.map +1 -0
- package/dist/application/cleanupTasks.js +181 -0
- package/dist/application/cleanupTasks.js.map +1 -0
- package/dist/application/lockManager.d.ts +62 -0
- package/dist/application/lockManager.d.ts.map +1 -0
- package/dist/application/lockManager.js +307 -0
- package/dist/application/lockManager.js.map +1 -0
- package/dist/application/queueManager.d.ts +14 -176
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +130 -953
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/statsManager.d.ts +56 -0
- package/dist/application/statsManager.d.ts.map +1 -0
- package/dist/application/statsManager.js +111 -0
- package/dist/application/statsManager.js.map +1 -0
- package/dist/application/types.d.ts +123 -0
- package/dist/application/types.d.ts.map +1 -0
- package/dist/application/types.js +16 -0
- package/dist/application/types.js.map +1 -0
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +14 -8
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/package.json +1 -1
|
@@ -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":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAe,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGzF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAezC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAsB,EACtB,aAA4B;IAE5B,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjC,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,0BAA0B,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACrD,QAAQ,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjC,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAE5B,MAAM,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9C,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEhC,6DAA6D;IAC7D,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,iBAAiB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAC5D,QAAQ,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAE5B,aAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,OAAO;QACL,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,kBAAkB;QAClB,sBAAsB;QACtB,iBAAiB;QACjB,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA8B;IAChE,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,aAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1C,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC9C,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,mDAAmD;AACnD,SAAS,cAAc,CAAC,GAAsB;IAC5C,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC;AAED,yCAAyC;AAEzC,SAAS,gBAAgB,CAAC,GAAsB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACrC,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;oBAC7D,QAAQ,CAAC,KAAK,CAAC,wCAAwC,EAAE;wBACvD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;wBACpB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;qBACnB,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,4CAA4C;AAE5C;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAsB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,gBAAgB,GAA6C,EAAE,CAAC;IAEtE,+DAA+D;IAC/D,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAErD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,MAAM,kCAAqB,EAAE,CAAC;YAChC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,qEAAqE;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAE1C,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,OAAO;gBAAE,SAAS;YAEnC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,MAAM,kCAAqB,EAAE,CAAC;gBAChC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,KAAK,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAC/C,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxD,QAAQ,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC7C,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,GAAQ,EACR,MAAmB,EACnB,GAAsB;IAEtB,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAErD,yDAAyD;IACzD,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC;QAC1B,SAAS,mCAAmB;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE;KACjD,CAAC,CAAC;IACH,KAAK,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,SAAyB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE;QACpF,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE;KACjD,CAAC,CAAC;IAEH,iDAAiD;IACjD,MAAM,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE;QAC3D,sEAAsE;QACtE,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,MAAM,8CAA0B,EAAE,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,EAAE;oBACtD,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAC;gBAEH,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7C,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAC1B,GAAG,yCAEH,eAAe,GAAG,CAAC,UAAU,GAAG,CAAC,QAAQ,CAC1C,CAAC;gBACF,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBAChE,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACzB,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACf,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACrB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAC/C,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE/B,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE;oBACrC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,OAAO,EAAE,GAAG,CAAC,QAAQ;iBACtB,CAAC,CAAC;gBAEH,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7C,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEpC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9E,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjF,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4CAA4C;AAE5C,SAAS,qBAAqB,CAAC,GAAsB;IACnD,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;AACH,CAAC;AAED,qCAAqC;AAErC,MAAM,UAAU,OAAO,CAAC,GAAsB;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9E,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,EAAE,CAAC;gBACT,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,kDAAkD;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,GAAsB;IACrE,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAE5C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtD,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAE7B,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEzD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACnE,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;oBACtB,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACvC,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;oBAClC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,EAAE;QACxE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9D,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE;gBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;oBAChC,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAClC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACjC,KAAK,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;wBACpD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACpC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC;wBAClC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;wBAC9E,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|