bunqueue 1.9.9 → 2.0.1
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 +10 -0
- package/dist/application/backgroundTasks.d.ts.map +1 -1
- package/dist/application/backgroundTasks.js +67 -6
- package/dist/application/backgroundTasks.js.map +1 -1
- package/dist/application/cleanupTasks.js +1 -1
- package/dist/application/cleanupTasks.js.map +1 -1
- package/dist/application/clientTracking.d.ts.map +1 -1
- package/dist/application/clientTracking.js +23 -10
- package/dist/application/clientTracking.js.map +1 -1
- package/dist/application/dependencyProcessor.d.ts.map +1 -1
- package/dist/application/dependencyProcessor.js +14 -13
- package/dist/application/dependencyProcessor.js.map +1 -1
- package/dist/application/eventsManager.d.ts.map +1 -1
- package/dist/application/eventsManager.js +16 -4
- package/dist/application/eventsManager.js.map +1 -1
- package/dist/application/jobLogsManager.d.ts +2 -2
- package/dist/application/jobLogsManager.d.ts.map +1 -1
- package/dist/application/jobLogsManager.js +13 -3
- package/dist/application/jobLogsManager.js.map +1 -1
- package/dist/application/lockManager.js +1 -1
- package/dist/application/lockManager.js.map +1 -1
- package/dist/application/operations/ack.d.ts +2 -1
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js +12 -0
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/jobManagement.d.ts +1 -1
- package/dist/application/operations/jobManagement.d.ts.map +1 -1
- package/dist/application/operations/jobManagement.js +23 -3
- package/dist/application/operations/jobManagement.js.map +1 -1
- package/dist/application/operations/push.d.ts +1 -1
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +13 -5
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/operations/queryOperations.d.ts +3 -0
- package/dist/application/operations/queryOperations.d.ts.map +1 -1
- package/dist/application/operations/queryOperations.js +29 -0
- package/dist/application/operations/queryOperations.js.map +1 -1
- package/dist/application/queueManager.d.ts +15 -1
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +69 -2
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/stallDetection.js +25 -20
- package/dist/application/stallDetection.js.map +1 -1
- package/dist/application/webhookManager.d.ts.map +1 -1
- package/dist/application/webhookManager.js +18 -2
- package/dist/application/webhookManager.js.map +1 -1
- package/dist/application/workerManager.d.ts.map +1 -1
- package/dist/application/workerManager.js +4 -2
- package/dist/application/workerManager.js.map +1 -1
- package/dist/client/events.d.ts +29 -0
- package/dist/client/events.d.ts.map +1 -1
- package/dist/client/events.js +92 -21
- package/dist/client/events.js.map +1 -1
- package/dist/client/flow.d.ts +122 -3
- package/dist/client/flow.d.ts.map +1 -1
- package/dist/client/flow.js +374 -2
- package/dist/client/flow.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/queue/queue.d.ts +260 -1
- package/dist/client/queue/queue.d.ts.map +1 -1
- package/dist/client/queue/queue.js +1343 -16
- package/dist/client/queue/queue.js.map +1 -1
- package/dist/client/tcpPool.d.ts.map +1 -1
- package/dist/client/tcpPool.js +19 -8
- package/dist/client/tcpPool.js.map +1 -1
- package/dist/client/types.d.ts +430 -13
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +346 -5
- package/dist/client/types.js.map +1 -1
- package/dist/client/worker/ackBatcher.d.ts +1 -0
- package/dist/client/worker/ackBatcher.d.ts.map +1 -1
- package/dist/client/worker/ackBatcher.js +9 -0
- package/dist/client/worker/ackBatcher.js.map +1 -1
- package/dist/client/worker/processor.js +6 -1
- package/dist/client/worker/processor.js.map +1 -1
- package/dist/client/worker/worker.d.ts +117 -0
- package/dist/client/worker/worker.d.ts.map +1 -1
- package/dist/client/worker/worker.js +375 -3
- package/dist/client/worker/worker.js.map +1 -1
- package/dist/domain/queue/priorityQueue.d.ts.map +1 -1
- package/dist/domain/queue/priorityQueue.js +24 -18
- package/dist/domain/queue/priorityQueue.js.map +1 -1
- package/dist/domain/queue/shard.d.ts +4 -0
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +21 -7
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/types/job.d.ts +89 -2
- package/dist/domain/types/job.d.ts.map +1 -1
- package/dist/domain/types/job.js +94 -26
- package/dist/domain/types/job.js.map +1 -1
- package/dist/domain/types/queue.d.ts +11 -1
- package/dist/domain/types/queue.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqliteBatch.d.ts +9 -4
- package/dist/infrastructure/persistence/sqliteBatch.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqliteBatch.js +34 -17
- package/dist/infrastructure/persistence/sqliteBatch.js.map +1 -1
- package/dist/infrastructure/persistence/sqliteSerializer.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqliteSerializer.js +14 -0
- package/dist/infrastructure/persistence/sqliteSerializer.js.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.js +29 -15
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
- package/dist/infrastructure/server/handlers/query.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/query.js +1 -16
- package/dist/infrastructure/server/handlers/query.js.map +1 -1
- package/dist/infrastructure/server/rateLimiter.d.ts.map +1 -1
- package/dist/infrastructure/server/rateLimiter.js +5 -3
- package/dist/infrastructure/server/rateLimiter.js.map +1 -1
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +36 -4
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/main.js +5 -2
- package/dist/main.js.map +1 -1
- package/dist/shared/lock.d.ts +1 -1
- package/dist/shared/lock.d.ts.map +1 -1
- package/dist/shared/lock.js +6 -4
- package/dist/shared/lock.js.map +1 -1
- package/dist/shared/lru.d.ts +28 -0
- package/dist/shared/lru.d.ts.map +1 -1
- package/dist/shared/lru.js +28 -0
- package/dist/shared/lru.js.map +1 -1
- package/package.json +1 -1
|
@@ -16,7 +16,7 @@ export function checkStalledJobs(ctx) {
|
|
|
16
16
|
const confirmedStalled = [];
|
|
17
17
|
// Phase 1: Check jobs that were candidates from previous cycle
|
|
18
18
|
for (const jobId of ctx.stalledCandidates) {
|
|
19
|
-
const procIdx = processingShardIndex(
|
|
19
|
+
const procIdx = processingShardIndex(jobId);
|
|
20
20
|
const job = ctx.processingShards[procIdx].get(jobId);
|
|
21
21
|
if (!job) {
|
|
22
22
|
ctx.stalledCandidates.delete(jobId);
|
|
@@ -62,25 +62,16 @@ export function checkStalledJobs(ctx) {
|
|
|
62
62
|
*/
|
|
63
63
|
async function handleStalledJob(job, action, ctx) {
|
|
64
64
|
const idx = shardIndex(job.queue);
|
|
65
|
-
const procIdx = processingShardIndex(
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
data: { stallCount: job.stallCount + 1, action },
|
|
76
|
-
});
|
|
77
|
-
// Acquire processing lock first, then shard lock
|
|
78
|
-
await withWriteLock(ctx.processingLocks[procIdx], async () => {
|
|
79
|
-
// Verify job is still in processing (might have been handled already)
|
|
80
|
-
if (!ctx.processingShards[procIdx].has(job.id)) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
65
|
+
const procIdx = processingShardIndex(job.id);
|
|
66
|
+
// Lock order: shardLocks BEFORE processingLocks (per lock hierarchy in CLAUDE.md)
|
|
67
|
+
// Broadcast events AFTER verifying job is still stalled to avoid false positives
|
|
68
|
+
let handled = false;
|
|
69
|
+
await withWriteLock(ctx.shardLocks[idx], async () => {
|
|
70
|
+
await withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
71
|
+
// Verify job is still in processing (might have been handled already)
|
|
72
|
+
if (!ctx.processingShards[procIdx].has(job.id)) {
|
|
73
|
+
return; // Job already completed, don't broadcast stalled event
|
|
74
|
+
}
|
|
84
75
|
const shard = ctx.shards[idx];
|
|
85
76
|
if (action === "move_to_dlq" /* StallAction.MoveToDlq */) {
|
|
86
77
|
moveStalliedJobToDlq(job, ctx, shard, procIdx, idx);
|
|
@@ -88,8 +79,22 @@ async function handleStalledJob(job, action, ctx) {
|
|
|
88
79
|
else {
|
|
89
80
|
retryStalliedJob(job, ctx, shard, procIdx, idx);
|
|
90
81
|
}
|
|
82
|
+
handled = true;
|
|
91
83
|
});
|
|
92
84
|
});
|
|
85
|
+
// Broadcast events AFTER confirming job is actually stalled and handled
|
|
86
|
+
if (handled) {
|
|
87
|
+
ctx.eventsManager.broadcast({
|
|
88
|
+
eventType: "stalled" /* EventType.Stalled */,
|
|
89
|
+
queue: job.queue,
|
|
90
|
+
jobId: job.id,
|
|
91
|
+
timestamp: Date.now(),
|
|
92
|
+
data: { stallCount: job.stallCount + 1, action },
|
|
93
|
+
});
|
|
94
|
+
void ctx.webhookManager.trigger('stalled', String(job.id), job.queue, {
|
|
95
|
+
data: { stallCount: job.stallCount + 1, action },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
93
98
|
}
|
|
94
99
|
/** Move stalled job to DLQ */
|
|
95
100
|
function moveStalliedJobToDlq(job, ctx, shard, procIdx, _idx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stallDetection.js","sourceRoot":"","sources":["../../src/application/stallDetection.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;AAG/C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAsB;IACrD,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,
|
|
1
|
+
{"version":3,"file":"stallDetection.js","sourceRoot":"","sources":["../../src/application/stallDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhookManager.d.ts","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhookManager.d.ts","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EAGlB,MAAM,yBAAyB,CAAC;AA4CjC;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IAErD,4EAA4E;IAC5E,OAAO,CAAC,YAAY,CAAK;IAEzB,oBAAoB;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU5E,uBAAuB;IACvB,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAgB9B,wBAAwB;IACxB,GAAG,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAIvC,qEAAqE;IACrE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO;IAWpD,wBAAwB;IACxB,IAAI,IAAI,OAAO,EAAE;IAIjB,oCAAoC;IAC9B,OAAO,CACX,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,IAAI,CAAC;IAqBhB,gCAAgC;YAClB,WAAW;IA4CzB,qDAAqD;IACrD,kBAAkB,IAAI,OAAO;IAI7B,6CAA6C;IAC7C,QAAQ;;;;CAMT"}
|
|
@@ -6,6 +6,12 @@ import { createWebhook, } from '../domain/types/webhook';
|
|
|
6
6
|
import { webhookLog } from '../shared/logger';
|
|
7
7
|
/** Singleton TextEncoder for HMAC operations */
|
|
8
8
|
const textEncoder = new TextEncoder();
|
|
9
|
+
/** Maximum webhook delivery retries (configurable via WEBHOOK_MAX_RETRIES env var) */
|
|
10
|
+
const WEBHOOK_MAX_RETRIES = parseInt(process.env.WEBHOOK_MAX_RETRIES ?? '3', 10);
|
|
11
|
+
/** Delay between webhook retries in ms (configurable via WEBHOOK_RETRY_DELAY_MS env var) */
|
|
12
|
+
const WEBHOOK_RETRY_DELAY_MS = parseInt(process.env.WEBHOOK_RETRY_DELAY_MS ?? '1000', 10);
|
|
13
|
+
/** Maximum number of cached crypto keys to prevent unbounded growth */
|
|
14
|
+
const MAX_KEY_CACHE_SIZE = 100;
|
|
9
15
|
/** Cache for imported crypto keys - avoids expensive importKey per request */
|
|
10
16
|
const keyCache = new Map();
|
|
11
17
|
/** HMAC-SHA256 signature with key caching */
|
|
@@ -13,6 +19,12 @@ async function signPayload(payload, secret) {
|
|
|
13
19
|
// Get cached key or import new one
|
|
14
20
|
let key = keyCache.get(secret);
|
|
15
21
|
if (!key) {
|
|
22
|
+
// Evict oldest entry if cache is full (LRU-style using Map insertion order)
|
|
23
|
+
if (keyCache.size >= MAX_KEY_CACHE_SIZE) {
|
|
24
|
+
const firstKey = keyCache.keys().next().value;
|
|
25
|
+
if (firstKey)
|
|
26
|
+
keyCache.delete(firstKey);
|
|
27
|
+
}
|
|
16
28
|
key = await crypto.subtle.importKey('raw', textEncoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
17
29
|
keyCache.set(secret, key);
|
|
18
30
|
}
|
|
@@ -26,8 +38,8 @@ async function signPayload(payload, secret) {
|
|
|
26
38
|
*/
|
|
27
39
|
export class WebhookManager {
|
|
28
40
|
webhooks = new Map();
|
|
29
|
-
maxRetries =
|
|
30
|
-
retryDelay =
|
|
41
|
+
maxRetries = WEBHOOK_MAX_RETRIES;
|
|
42
|
+
retryDelay = WEBHOOK_RETRY_DELAY_MS;
|
|
31
43
|
/** Running counter for enabled webhooks - avoids O(n) filter in getStats */
|
|
32
44
|
enabledCount = 0;
|
|
33
45
|
/** Add a webhook */
|
|
@@ -46,6 +58,10 @@ export class WebhookManager {
|
|
|
46
58
|
if (webhook?.enabled) {
|
|
47
59
|
this.enabledCount--;
|
|
48
60
|
}
|
|
61
|
+
// Clean up cached crypto key for this webhook's secret
|
|
62
|
+
if (webhook?.secret) {
|
|
63
|
+
keyCache.delete(webhook.secret);
|
|
64
|
+
}
|
|
49
65
|
const removed = this.webhooks.delete(id);
|
|
50
66
|
if (removed) {
|
|
51
67
|
webhookLog.info('Removed webhook', { webhookId: id });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhookManager.js","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,gDAAgD;AAChD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C,6CAA6C;AAC7C,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc;IACxD,mCAAmC;IACnC,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACjC,KAAK,EACL,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzC,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"webhookManager.js","sourceRoot":"","sources":["../../src/application/webhookManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,gDAAgD;AAChD,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,sFAAsF;AACtF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAEjF,4FAA4F;AAC5F,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1F,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C,6CAA6C;AAC7C,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc;IACxD,mCAAmC;IACnC,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,4EAA4E;QAC5E,IAAI,QAAQ,CAAC,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,QAAQ;gBAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACjC,KAAK,EACL,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzC,UAAU,GAAG,mBAAmB,CAAC;IACjC,UAAU,GAAG,sBAAsB,CAAC;IAErD,4EAA4E;IACpE,YAAY,GAAG,CAAC,CAAC;IAEzB,oBAAoB;IACpB,GAAG,CAAC,GAAW,EAAE,MAAgB,EAAE,KAAc,EAAE,MAAe;QAChE,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,EAAa;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,uDAAuD;QACvD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,EAAa;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,qEAAqE;IACrE,UAAU,CAAC,EAAa,EAAE,OAAgB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,OAAO,CACX,KAAmB,EACnB,KAAa,EACb,KAAa,EACb,KAA6D;QAE7D,MAAM,OAAO,GAAmB;YAC9B,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK;YACL,KAAK;YACL,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAChE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAC7F,CAAC;QAEF,gCAAgC;QAChC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACxD,UAAU,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gCAAgC;IACxB,KAAK,CAAC,WAAW,CAAC,OAAgB,EAAE,OAAuB;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,iBAAiB,EAAE,OAAO,CAAC,KAAK;YAChC,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SACjD,CAAC;QAEF,iCAAiC;QACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;oBACxC,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI;oBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;iBACnC,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACnC,OAAO,CAAC,YAAY,EAAE,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,oBAAoB;YACpB,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC5E,CAAC;IAED,qDAAqD;IACrD,kBAAkB;QAChB,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,6CAA6C;IAC7C,QAAQ;QACN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACzB,OAAO,EAAE,IAAI,CAAC,YAAY;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAgB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"workerManager.d.ts","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAgB,MAAM,wBAAwB,CAAC;AAWlF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,eAAe,CAA+C;IAEtE,sEAAsE;IACtE,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,sBAAsB,CAAK;;IAMnC,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAOhD,0BAA0B;IAC1B,UAAU,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAajC,uBAAuB;IACvB,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;IAIrC,mCAAmC;IACnC,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAOhC,kCAAkC;IAClC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IASnC,oDAAoD;IACpD,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAahC,iDAAiD;IACjD,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAa7B,uBAAuB;IACvB,IAAI,IAAI,MAAM,EAAE;IAIhB,0CAA0C;IAC1C,UAAU,IAAI,MAAM,EAAE;IAKtB,uCAAuC;IACvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAIpC,6BAA6B;IAC7B,OAAO,CAAC,YAAY;IAMpB,2BAA2B;IAC3B,OAAO,CAAC,YAAY;IAcpB,mBAAmB;IACnB,IAAI,IAAI,IAAI;IAOZ,qEAAqE;IACrE,QAAQ;;;;;;;CAmBT"}
|
|
@@ -6,7 +6,9 @@ import { createWorker } from '../domain/types/worker';
|
|
|
6
6
|
import { createLogger } from '../shared/logger';
|
|
7
7
|
const workerLog = createLogger('Worker');
|
|
8
8
|
/** Worker timeout - consider dead after this many ms without heartbeat */
|
|
9
|
-
const WORKER_TIMEOUT_MS =
|
|
9
|
+
const WORKER_TIMEOUT_MS = parseInt(process.env.WORKER_TIMEOUT_MS ?? '30000', 10);
|
|
10
|
+
/** Cleanup interval for stale workers */
|
|
11
|
+
const WORKER_CLEANUP_INTERVAL_MS = parseInt(process.env.WORKER_CLEANUP_INTERVAL_MS ?? '60000', 10);
|
|
10
12
|
/**
|
|
11
13
|
* Worker Manager
|
|
12
14
|
*/
|
|
@@ -104,7 +106,7 @@ export class WorkerManager {
|
|
|
104
106
|
startCleanup() {
|
|
105
107
|
this.cleanupInterval = setInterval(() => {
|
|
106
108
|
this.cleanupStale();
|
|
107
|
-
},
|
|
109
|
+
}, WORKER_CLEANUP_INTERVAL_MS);
|
|
108
110
|
}
|
|
109
111
|
/** Remove stale workers */
|
|
110
112
|
cleanupStale() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerManager.js","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA8B,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"workerManager.js","sourceRoot":"","sources":["../../src/application/workerManager.ts"],"names":[],"mappings":"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"}
|
package/dist/client/events.d.ts
CHANGED
|
@@ -5,13 +5,42 @@ import { EventEmitter } from 'events';
|
|
|
5
5
|
/**
|
|
6
6
|
* QueueEvents class for listening to queue events
|
|
7
7
|
* Provides a way to listen to events without processing jobs
|
|
8
|
+
*
|
|
9
|
+
* BullMQ v5 compatible events:
|
|
10
|
+
* - waiting: job added to queue
|
|
11
|
+
* - active: job started processing
|
|
12
|
+
* - completed: job completed successfully
|
|
13
|
+
* - failed: job failed
|
|
14
|
+
* - progress: job progress updated
|
|
15
|
+
* - stalled: job stalled (no heartbeat)
|
|
16
|
+
* - removed: job removed from queue
|
|
17
|
+
* - delayed: job moved to delayed state
|
|
18
|
+
* - duplicated: duplicate job detected
|
|
19
|
+
* - retried: job retried
|
|
20
|
+
* - waiting-children: job waiting for children to complete
|
|
21
|
+
* - drained: queue has no more waiting jobs
|
|
22
|
+
* - error: error occurred
|
|
8
23
|
*/
|
|
9
24
|
export declare class QueueEvents extends EventEmitter {
|
|
10
25
|
readonly name: string;
|
|
11
26
|
private running;
|
|
12
27
|
private unsubscribe;
|
|
28
|
+
private ready;
|
|
13
29
|
constructor(name: string);
|
|
14
30
|
private start;
|
|
31
|
+
/** Emit an error event (can be called externally) */
|
|
32
|
+
emitError(error: Error): void;
|
|
33
|
+
/**
|
|
34
|
+
* Wait until the QueueEvents is ready to receive events.
|
|
35
|
+
* In embedded mode, this resolves immediately.
|
|
36
|
+
* BullMQ v5 compatible.
|
|
37
|
+
*/
|
|
38
|
+
waitUntilReady(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Disconnect from the event stream.
|
|
41
|
+
* Alias for close() for BullMQ v5 compatibility.
|
|
42
|
+
*/
|
|
43
|
+
disconnect(): Promise<void>;
|
|
15
44
|
/** Close the event listener */
|
|
16
45
|
close(): void;
|
|
17
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/client/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/client/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,EAAE,MAAM;IAMxB,OAAO,CAAC,KAAK;IAgEb,qDAAqD;IACrD,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI7B;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,+BAA+B;IAC/B,KAAK,IAAI,IAAI;CAUd"}
|
package/dist/client/events.js
CHANGED
|
@@ -6,11 +6,27 @@ import { getSharedManager } from './manager';
|
|
|
6
6
|
/**
|
|
7
7
|
* QueueEvents class for listening to queue events
|
|
8
8
|
* Provides a way to listen to events without processing jobs
|
|
9
|
+
*
|
|
10
|
+
* BullMQ v5 compatible events:
|
|
11
|
+
* - waiting: job added to queue
|
|
12
|
+
* - active: job started processing
|
|
13
|
+
* - completed: job completed successfully
|
|
14
|
+
* - failed: job failed
|
|
15
|
+
* - progress: job progress updated
|
|
16
|
+
* - stalled: job stalled (no heartbeat)
|
|
17
|
+
* - removed: job removed from queue
|
|
18
|
+
* - delayed: job moved to delayed state
|
|
19
|
+
* - duplicated: duplicate job detected
|
|
20
|
+
* - retried: job retried
|
|
21
|
+
* - waiting-children: job waiting for children to complete
|
|
22
|
+
* - drained: queue has no more waiting jobs
|
|
23
|
+
* - error: error occurred
|
|
9
24
|
*/
|
|
10
25
|
export class QueueEvents extends EventEmitter {
|
|
11
26
|
name;
|
|
12
27
|
running = false;
|
|
13
28
|
unsubscribe = null;
|
|
29
|
+
ready = false;
|
|
14
30
|
constructor(name) {
|
|
15
31
|
super();
|
|
16
32
|
this.name = name;
|
|
@@ -24,34 +40,89 @@ export class QueueEvents extends EventEmitter {
|
|
|
24
40
|
// Subscribe to events from QueueManager
|
|
25
41
|
const manager = getSharedManager();
|
|
26
42
|
const handler = (event) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
try {
|
|
44
|
+
if (event.queue !== this.name)
|
|
45
|
+
return;
|
|
46
|
+
switch (event.eventType) {
|
|
47
|
+
case "pushed" /* EventType.Pushed */:
|
|
48
|
+
this.emit('waiting', { jobId: event.jobId });
|
|
49
|
+
break;
|
|
50
|
+
case "pulled" /* EventType.Pulled */:
|
|
51
|
+
this.emit('active', { jobId: event.jobId });
|
|
52
|
+
break;
|
|
53
|
+
case "completed" /* EventType.Completed */:
|
|
54
|
+
this.emit('completed', { jobId: event.jobId, returnvalue: event.data });
|
|
55
|
+
break;
|
|
56
|
+
case "failed" /* EventType.Failed */:
|
|
57
|
+
this.emit('failed', { jobId: event.jobId, failedReason: event.data });
|
|
58
|
+
// Also emit error event for failed jobs (BullMQ compatibility)
|
|
59
|
+
if (event.error) {
|
|
60
|
+
this.emit('error', new Error(event.error));
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case "progress" /* EventType.Progress */:
|
|
64
|
+
this.emit('progress', { jobId: event.jobId, data: event.data });
|
|
65
|
+
break;
|
|
66
|
+
case "stalled" /* EventType.Stalled */:
|
|
67
|
+
this.emit('stalled', { jobId: event.jobId });
|
|
68
|
+
break;
|
|
69
|
+
// BullMQ v5 additional events
|
|
70
|
+
case "removed" /* EventType.Removed */:
|
|
71
|
+
this.emit('removed', { jobId: event.jobId, prev: event.prev ?? 'unknown' });
|
|
72
|
+
break;
|
|
73
|
+
case "delayed" /* EventType.Delayed */:
|
|
74
|
+
this.emit('delayed', { jobId: event.jobId, delay: event.delay ?? 0 });
|
|
75
|
+
break;
|
|
76
|
+
case "duplicated" /* EventType.Duplicated */:
|
|
77
|
+
this.emit('duplicated', { jobId: event.jobId });
|
|
78
|
+
break;
|
|
79
|
+
case "retried" /* EventType.Retried */:
|
|
80
|
+
this.emit('retried', { jobId: event.jobId, prev: event.prev ?? 'failed' });
|
|
81
|
+
break;
|
|
82
|
+
case "waiting-children" /* EventType.WaitingChildren */:
|
|
83
|
+
this.emit('waiting-children', { jobId: event.jobId });
|
|
84
|
+
break;
|
|
85
|
+
case "drained" /* EventType.Drained */:
|
|
86
|
+
this.emit('drained', { id: event.jobId });
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// Emit error event for any handler errors
|
|
92
|
+
this.emit('error', err instanceof Error ? err : new Error(String(err)));
|
|
48
93
|
}
|
|
49
94
|
};
|
|
50
95
|
this.unsubscribe = manager.subscribe(handler);
|
|
96
|
+
this.ready = true;
|
|
97
|
+
}
|
|
98
|
+
/** Emit an error event (can be called externally) */
|
|
99
|
+
emitError(error) {
|
|
100
|
+
this.emit('error', error);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Wait until the QueueEvents is ready to receive events.
|
|
104
|
+
* In embedded mode, this resolves immediately.
|
|
105
|
+
* BullMQ v5 compatible.
|
|
106
|
+
*/
|
|
107
|
+
async waitUntilReady() {
|
|
108
|
+
// In embedded mode, we're always ready after construction
|
|
109
|
+
if (this.ready)
|
|
110
|
+
return;
|
|
111
|
+
// Wait a tick for the subscription to complete
|
|
112
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Disconnect from the event stream.
|
|
116
|
+
* Alias for close() for BullMQ v5 compatibility.
|
|
117
|
+
*/
|
|
118
|
+
disconnect() {
|
|
119
|
+
this.close();
|
|
120
|
+
return Promise.resolve();
|
|
51
121
|
}
|
|
52
122
|
/** Close the event listener */
|
|
53
123
|
close() {
|
|
54
124
|
this.running = false;
|
|
125
|
+
this.ready = false;
|
|
55
126
|
if (this.unsubscribe) {
|
|
56
127
|
this.unsubscribe();
|
|
57
128
|
this.unsubscribe = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/client/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/client/events.ts"],"names":[],"mappings":"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"}
|
package/dist/client/flow.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FlowProducer - Job chaining and pipelines
|
|
3
|
+
* BullMQ v5 compatible
|
|
3
4
|
*/
|
|
4
|
-
import type { JobOptions, ConnectionOptions } from './types';
|
|
5
|
+
import type { JobOptions, ConnectionOptions, Job } from './types';
|
|
5
6
|
/** FlowProducer options */
|
|
6
7
|
export interface FlowProducerOptions {
|
|
7
8
|
/** Use embedded mode (no server) */
|
|
@@ -9,7 +10,7 @@ export interface FlowProducerOptions {
|
|
|
9
10
|
/** TCP connection options */
|
|
10
11
|
connection?: ConnectionOptions;
|
|
11
12
|
}
|
|
12
|
-
/** Step definition in a flow */
|
|
13
|
+
/** Step definition in a flow (legacy bunqueue API) */
|
|
13
14
|
export interface FlowStep<T = unknown> {
|
|
14
15
|
/** Job name */
|
|
15
16
|
name: string;
|
|
@@ -22,11 +23,50 @@ export interface FlowStep<T = unknown> {
|
|
|
22
23
|
/** Child steps (for tree structures) */
|
|
23
24
|
children?: FlowStep[];
|
|
24
25
|
}
|
|
25
|
-
/** Result of adding a flow */
|
|
26
|
+
/** Result of adding a flow (legacy bunqueue API) */
|
|
26
27
|
export interface FlowResult {
|
|
27
28
|
/** Job IDs in order */
|
|
28
29
|
jobIds: string[];
|
|
29
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* FlowJob - BullMQ v5 compatible flow job definition.
|
|
33
|
+
* Children are processed BEFORE the parent.
|
|
34
|
+
*/
|
|
35
|
+
export interface FlowJob<T = unknown> {
|
|
36
|
+
/** Job name */
|
|
37
|
+
name: string;
|
|
38
|
+
/** Queue name */
|
|
39
|
+
queueName: string;
|
|
40
|
+
/** Job data */
|
|
41
|
+
data?: T;
|
|
42
|
+
/** Job options */
|
|
43
|
+
opts?: JobOptions;
|
|
44
|
+
/** Child jobs (processed BEFORE this job) */
|
|
45
|
+
children?: FlowJob[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* JobNode - BullMQ v5 compatible result from adding a flow.
|
|
49
|
+
* Contains the job and its children nodes.
|
|
50
|
+
*/
|
|
51
|
+
export interface JobNode<T = unknown> {
|
|
52
|
+
/** The job instance */
|
|
53
|
+
job: Job<T>;
|
|
54
|
+
/** Child nodes (if any) */
|
|
55
|
+
children?: JobNode[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Options for getFlow method (BullMQ v5 compatible).
|
|
59
|
+
*/
|
|
60
|
+
export interface GetFlowOpts {
|
|
61
|
+
/** Job ID to get the flow for */
|
|
62
|
+
id: string;
|
|
63
|
+
/** Queue name where the job is located */
|
|
64
|
+
queueName: string;
|
|
65
|
+
/** Maximum depth to traverse (default: unlimited) */
|
|
66
|
+
depth?: number;
|
|
67
|
+
/** Maximum number of children to fetch per level (default: unlimited) */
|
|
68
|
+
maxChildren?: number;
|
|
69
|
+
}
|
|
30
70
|
/**
|
|
31
71
|
* FlowProducer creates job flows with automatic dependencies.
|
|
32
72
|
*
|
|
@@ -58,6 +98,85 @@ export declare class FlowProducer {
|
|
|
58
98
|
constructor(opts?: FlowProducerOptions);
|
|
59
99
|
/** Close the connection pool (only if using dedicated pool) */
|
|
60
100
|
close(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Disconnect from the server (BullMQ v5 compatible).
|
|
103
|
+
* Alias for close().
|
|
104
|
+
*/
|
|
105
|
+
disconnect(): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Wait until the FlowProducer is ready (BullMQ v5 compatible).
|
|
108
|
+
* In embedded mode, resolves immediately. In TCP mode, ensures connection.
|
|
109
|
+
*/
|
|
110
|
+
waitUntilReady(): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Add a flow (BullMQ v5 compatible).
|
|
113
|
+
*
|
|
114
|
+
* Children are processed BEFORE their parent. When all children complete,
|
|
115
|
+
* the parent becomes processable and can access children results via
|
|
116
|
+
* `job.getChildrenValues()`.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const flow = new FlowProducer();
|
|
121
|
+
*
|
|
122
|
+
* // Children execute first, then parent
|
|
123
|
+
* const { job, children } = await flow.add({
|
|
124
|
+
* name: 'parent',
|
|
125
|
+
* queueName: 'main',
|
|
126
|
+
* data: { type: 'aggregate' },
|
|
127
|
+
* children: [
|
|
128
|
+
* { name: 'child1', queueName: 'main', data: { id: 1 } },
|
|
129
|
+
* { name: 'child2', queueName: 'main', data: { id: 2 } },
|
|
130
|
+
* ],
|
|
131
|
+
* });
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
add<T = unknown>(flow: FlowJob<T>): Promise<JobNode<T>>;
|
|
135
|
+
/**
|
|
136
|
+
* Add multiple flows (BullMQ v5 compatible).
|
|
137
|
+
*/
|
|
138
|
+
addBulk<T = unknown>(flows: FlowJob<T>[]): Promise<JobNode<T>[]>;
|
|
139
|
+
/**
|
|
140
|
+
* Get a flow tree starting from a job (BullMQ v5 compatible).
|
|
141
|
+
*
|
|
142
|
+
* Retrieves the job and all its children recursively, building a JobNode tree.
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const flow = new FlowProducer();
|
|
147
|
+
*
|
|
148
|
+
* // Get a previously created flow
|
|
149
|
+
* const node = await flow.getFlow({
|
|
150
|
+
* id: 'job-id',
|
|
151
|
+
* queueName: 'my-queue',
|
|
152
|
+
* });
|
|
153
|
+
*
|
|
154
|
+
* if (node) {
|
|
155
|
+
* console.log('Parent:', node.job.name);
|
|
156
|
+
* console.log('Children:', node.children?.length ?? 0);
|
|
157
|
+
* }
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
getFlow<T = unknown>(opts: GetFlowOpts): Promise<JobNode<T> | null>;
|
|
161
|
+
/** Get flow in embedded mode */
|
|
162
|
+
private getFlowEmbedded;
|
|
163
|
+
/** Get flow in TCP mode */
|
|
164
|
+
private getFlowTcp;
|
|
165
|
+
/** Build JobNode recursively from internal job */
|
|
166
|
+
private buildJobNode;
|
|
167
|
+
/** Build JobNode from TCP response */
|
|
168
|
+
private buildJobNodeFromTcp;
|
|
169
|
+
/** Extract user data (remove internal fields) */
|
|
170
|
+
private extractUserDataFromInternal;
|
|
171
|
+
/**
|
|
172
|
+
* Internal: Recursively add a flow node and its children.
|
|
173
|
+
* Children are created first with parent reference, then parent is created.
|
|
174
|
+
*/
|
|
175
|
+
private addFlowNode;
|
|
176
|
+
/** Push a job with parent/children tracking */
|
|
177
|
+
private pushJobWithParent;
|
|
178
|
+
/** Create a simple Job object */
|
|
179
|
+
private createJobObject;
|
|
61
180
|
/** Push a job via embedded manager or TCP */
|
|
62
181
|
private pushJob;
|
|
63
182
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/client/flow.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/client/flow.ts"],"names":[],"mappings":"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"}
|