bunqueue 2.6.39 → 2.6.41

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.
Files changed (51) hide show
  1. package/dist/infrastructure/cloud/buffer.d.ts +18 -0
  2. package/dist/infrastructure/cloud/buffer.d.ts.map +1 -0
  3. package/dist/infrastructure/cloud/buffer.js +30 -0
  4. package/dist/infrastructure/cloud/buffer.js.map +1 -0
  5. package/dist/infrastructure/cloud/circuitBreaker.d.ts +20 -0
  6. package/dist/infrastructure/cloud/circuitBreaker.d.ts.map +1 -0
  7. package/dist/infrastructure/cloud/circuitBreaker.js +47 -0
  8. package/dist/infrastructure/cloud/circuitBreaker.js.map +1 -0
  9. package/dist/infrastructure/cloud/cloudAgent.d.ts +43 -0
  10. package/dist/infrastructure/cloud/cloudAgent.d.ts.map +1 -0
  11. package/dist/infrastructure/cloud/cloudAgent.js +175 -0
  12. package/dist/infrastructure/cloud/cloudAgent.js.map +1 -0
  13. package/dist/infrastructure/cloud/commandHandler.d.ts +34 -0
  14. package/dist/infrastructure/cloud/commandHandler.d.ts.map +1 -0
  15. package/dist/infrastructure/cloud/commandHandler.js +109 -0
  16. package/dist/infrastructure/cloud/commandHandler.js.map +1 -0
  17. package/dist/infrastructure/cloud/config.d.ts +8 -0
  18. package/dist/infrastructure/cloud/config.d.ts.map +1 -0
  19. package/dist/infrastructure/cloud/config.js +31 -0
  20. package/dist/infrastructure/cloud/config.js.map +1 -0
  21. package/dist/infrastructure/cloud/httpSender.d.ts +23 -0
  22. package/dist/infrastructure/cloud/httpSender.d.ts.map +1 -0
  23. package/dist/infrastructure/cloud/httpSender.js +108 -0
  24. package/dist/infrastructure/cloud/httpSender.js.map +1 -0
  25. package/dist/infrastructure/cloud/index.d.ts +11 -0
  26. package/dist/infrastructure/cloud/index.d.ts.map +1 -0
  27. package/dist/infrastructure/cloud/index.js +10 -0
  28. package/dist/infrastructure/cloud/index.js.map +1 -0
  29. package/dist/infrastructure/cloud/instanceId.d.ts +7 -0
  30. package/dist/infrastructure/cloud/instanceId.d.ts.map +1 -0
  31. package/dist/infrastructure/cloud/instanceId.js +34 -0
  32. package/dist/infrastructure/cloud/instanceId.js.map +1 -0
  33. package/dist/infrastructure/cloud/logger.d.ts +5 -0
  34. package/dist/infrastructure/cloud/logger.d.ts.map +1 -0
  35. package/dist/infrastructure/cloud/logger.js +6 -0
  36. package/dist/infrastructure/cloud/logger.js.map +1 -0
  37. package/dist/infrastructure/cloud/snapshotCollector.d.ts +32 -0
  38. package/dist/infrastructure/cloud/snapshotCollector.d.ts.map +1 -0
  39. package/dist/infrastructure/cloud/snapshotCollector.js +285 -0
  40. package/dist/infrastructure/cloud/snapshotCollector.js.map +1 -0
  41. package/dist/infrastructure/cloud/types.d.ts +250 -0
  42. package/dist/infrastructure/cloud/types.d.ts.map +1 -0
  43. package/dist/infrastructure/cloud/types.js +6 -0
  44. package/dist/infrastructure/cloud/types.js.map +1 -0
  45. package/dist/infrastructure/cloud/wsSender.d.ts +31 -0
  46. package/dist/infrastructure/cloud/wsSender.d.ts.map +1 -0
  47. package/dist/infrastructure/cloud/wsSender.js +121 -0
  48. package/dist/infrastructure/cloud/wsSender.js.map +1 -0
  49. package/dist/main.js +16 -0
  50. package/dist/main.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1,108 @@
1
+ /**
2
+ * HTTP Sender
3
+ * Posts snapshots to the remote dashboard via HTTP with retry and HMAC signing
4
+ */
5
+ import { CircuitBreaker } from './circuitBreaker';
6
+ import { SnapshotBuffer } from './buffer';
7
+ import { cloudLog } from './logger';
8
+ export class HttpSender {
9
+ config;
10
+ circuitBreaker;
11
+ buffer;
12
+ ingestUrl;
13
+ batchUrl;
14
+ hmacKey = null;
15
+ constructor(config) {
16
+ this.config = config;
17
+ this.circuitBreaker = new CircuitBreaker(config.circuitBreakerThreshold, config.circuitBreakerResetMs);
18
+ this.buffer = new SnapshotBuffer(config.bufferSize);
19
+ this.ingestUrl = `${config.url}/api/v1/ingest`;
20
+ this.batchUrl = `${config.url}/api/v1/ingest/batch`;
21
+ }
22
+ /** Send a snapshot. Buffers on failure. */
23
+ async send(snapshot) {
24
+ // Flush buffered snapshots first if any
25
+ if (!this.buffer.isEmpty) {
26
+ await this.flushBuffer();
27
+ }
28
+ if (!this.circuitBreaker.canExecute()) {
29
+ this.buffer.push(snapshot);
30
+ return;
31
+ }
32
+ try {
33
+ await this.post(this.ingestUrl, snapshot);
34
+ this.circuitBreaker.onSuccess();
35
+ }
36
+ catch (err) {
37
+ this.circuitBreaker.onFailure();
38
+ this.buffer.push(snapshot);
39
+ cloudLog.debug('Snapshot buffered', {
40
+ buffered: this.buffer.size,
41
+ circuit: this.circuitBreaker.getState(),
42
+ error: String(err),
43
+ });
44
+ }
45
+ }
46
+ /** Try to send buffered snapshots in batches */
47
+ async flushBuffer() {
48
+ if (!this.circuitBreaker.canExecute())
49
+ return;
50
+ while (!this.buffer.isEmpty) {
51
+ const batch = this.buffer.drain(50);
52
+ if (batch.length === 0)
53
+ break;
54
+ try {
55
+ await this.post(this.batchUrl, batch);
56
+ this.circuitBreaker.onSuccess();
57
+ cloudLog.debug('Buffer flushed', { sent: batch.length, remaining: this.buffer.size });
58
+ }
59
+ catch {
60
+ // Put items back (they'll be at the front, order is acceptable)
61
+ for (let i = batch.length - 1; i >= 0; i--) {
62
+ this.buffer.push(batch[i]);
63
+ }
64
+ this.circuitBreaker.onFailure();
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ /** HTTP POST with auth headers and optional HMAC */
70
+ async post(url, body) {
71
+ const json = JSON.stringify(body);
72
+ const headers = {
73
+ 'Content-Type': 'application/json',
74
+ Authorization: `Bearer ${this.config.apiKey}`,
75
+ 'X-Timestamp': String(Date.now()),
76
+ };
77
+ if (this.config.signingSecret) {
78
+ this.hmacKey ??= await crypto.subtle.importKey('raw', new TextEncoder().encode(this.config.signingSecret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
79
+ const sig = await crypto.subtle.sign('HMAC', this.hmacKey, new TextEncoder().encode(json));
80
+ headers['X-Signature'] = Buffer.from(sig).toString('hex');
81
+ }
82
+ const res = await fetch(url, {
83
+ method: 'POST',
84
+ headers,
85
+ body: json,
86
+ signal: AbortSignal.timeout(10_000),
87
+ });
88
+ if (!res.ok) {
89
+ const text = await res.text().catch(() => '');
90
+ const msg = `HTTP ${res.status}: ${text.slice(0, 200)}`;
91
+ // Auth/plan errors should be visible to the user, not silently buffered
92
+ if (res.status === 401 || res.status === 403) {
93
+ cloudLog.error('Cloud rejected connection', {
94
+ status: res.status,
95
+ response: text.slice(0, 200),
96
+ });
97
+ }
98
+ throw new Error(msg);
99
+ }
100
+ }
101
+ getBufferSize() {
102
+ return this.buffer.size;
103
+ }
104
+ getCircuitState() {
105
+ return this.circuitBreaker.getState();
106
+ }
107
+ }
108
+ //# sourceMappingURL=httpSender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpSender.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/httpSender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * bunqueue Cloud - Remote dashboard telemetry agent
3
+ *
4
+ * Sends periodic snapshots and real-time events to bunqueue Cloud (bunqueue.io).
5
+ * Enabled by setting BUNQUEUE_CLOUD_URL and BUNQUEUE_CLOUD_API_KEY env vars.
6
+ * Zero overhead when disabled.
7
+ */
8
+ export { CloudAgent } from './cloudAgent';
9
+ export { loadCloudConfig } from './config';
10
+ export type { CloudConfig, CloudSnapshot, CloudEvent } from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * bunqueue Cloud - Remote dashboard telemetry agent
3
+ *
4
+ * Sends periodic snapshots and real-time events to bunqueue Cloud (bunqueue.io).
5
+ * Enabled by setting BUNQUEUE_CLOUD_URL and BUNQUEUE_CLOUD_API_KEY env vars.
6
+ * Zero overhead when disabled.
7
+ */
8
+ export { CloudAgent } from './cloudAgent';
9
+ export { loadCloudConfig } from './config';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Instance ID Manager
3
+ * Generates and persists a unique instance ID to disk
4
+ */
5
+ /** Load or generate a persistent instance ID */
6
+ export declare function getInstanceId(dataPath: string | null): string;
7
+ //# sourceMappingURL=instanceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instanceId.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/instanceId.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAyB7D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Instance ID Manager
3
+ * Generates and persists a unique instance ID to disk
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
6
+ import { dirname, join } from 'path';
7
+ const INSTANCE_ID_FILE = 'cloud-instance-id';
8
+ /** Load or generate a persistent instance ID */
9
+ export function getInstanceId(dataPath) {
10
+ if (!dataPath)
11
+ return crypto.randomUUID();
12
+ const dir = dirname(dataPath);
13
+ const filePath = join(dir, INSTANCE_ID_FILE);
14
+ try {
15
+ if (existsSync(filePath)) {
16
+ const id = readFileSync(filePath, 'utf-8').trim();
17
+ if (id.length > 0)
18
+ return id;
19
+ }
20
+ }
21
+ catch {
22
+ // Fall through to generate new ID
23
+ }
24
+ const id = crypto.randomUUID();
25
+ try {
26
+ mkdirSync(dir, { recursive: true });
27
+ writeFileSync(filePath, id, 'utf-8');
28
+ }
29
+ catch {
30
+ // Non-fatal: use ephemeral ID if we can't persist
31
+ }
32
+ return id;
33
+ }
34
+ //# sourceMappingURL=instanceId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instanceId.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/instanceId.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,QAAuB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * bunqueue Cloud Logger
3
+ */
4
+ export declare const cloudLog: import("../../shared/logger").Logger;
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,QAAQ,sCAAwB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * bunqueue Cloud Logger
3
+ */
4
+ import { createLogger } from '../../shared/logger';
5
+ export const cloudLog = createLogger('Cloud');
6
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Snapshot Collector
3
+ * Gathers telemetry data from all bunqueue managers into a single snapshot
4
+ */
5
+ import type { QueueManager } from '../../application/queueManager';
6
+ import type { CloudSnapshot } from './types';
7
+ /** Optional server handles for connection stats + backup */
8
+ export interface ServerHandles {
9
+ getConnectionCount: () => number;
10
+ getWsClientCount: () => number;
11
+ getSseClientCount: () => number;
12
+ getBackupStatus?: () => {
13
+ enabled: boolean;
14
+ bucket: string;
15
+ endpoint: string;
16
+ intervalMs: number;
17
+ retention: number;
18
+ isRunning: boolean;
19
+ } | null;
20
+ }
21
+ /** Parameters for snapshot collection */
22
+ export interface CollectSnapshotParams {
23
+ queueManager: QueueManager;
24
+ instanceId: string;
25
+ instanceName: string;
26
+ startedAt: number;
27
+ sequenceId: number;
28
+ serverHandles?: ServerHandles;
29
+ }
30
+ /** Collect a full snapshot from all managers. O(SHARD_COUNT) total. */
31
+ export declare function collectSnapshot(params: CollectSnapshotParams): CloudSnapshot;
32
+ //# sourceMappingURL=snapshotCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotCollector.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/cloud/snapshotCollector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7C,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,aAAa,CAiJ5E"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Snapshot Collector
3
+ * Gathers telemetry data from all bunqueue managers into a single snapshot
4
+ */
5
+ import { hostname } from 'os';
6
+ import { throughputTracker } from '../../application/throughputTracker';
7
+ import { latencyTracker } from '../../application/latencyTracker';
8
+ import { getTaskErrorStats } from '../../application/backgroundTasks';
9
+ import { VERSION } from '../../shared/version';
10
+ /** Cached hostname — computed once */
11
+ const HOST = hostname();
12
+ /** Collect a full snapshot from all managers. O(SHARD_COUNT) total. */
13
+ export function collectSnapshot(params) {
14
+ const { queueManager, instanceId, instanceName, startedAt, sequenceId, serverHandles } = params;
15
+ const stats = queueManager.getStats();
16
+ const memStats = queueManager.getMemoryStats();
17
+ const workerStats = queueManager.workerManager.getStats();
18
+ const rates = throughputTracker.getRates();
19
+ const percentiles = latencyTracker.getPercentiles();
20
+ const averages = latencyTracker.getAverages();
21
+ const storage = queueManager.getStorageStatus();
22
+ const crons = queueManager.listCrons();
23
+ const mem = process.memoryUsage();
24
+ // Per-queue stats (includes DLQ counts)
25
+ const perQueue = queueManager.getPerQueueStats();
26
+ const queuesSummary = queueManager.getQueuesSummary();
27
+ const queueNames = queuesSummary.map((q) => q.name);
28
+ const queues = queuesSummary.map((q) => {
29
+ const pq = perQueue.get(q.name);
30
+ const counts = queueManager.getQueueJobCounts(q.name);
31
+ return {
32
+ name: q.name,
33
+ waiting: pq?.waiting ?? q.counts.waiting,
34
+ delayed: pq?.delayed ?? q.counts.delayed,
35
+ active: pq?.active ?? q.counts.active,
36
+ dlq: pq?.dlq ?? 0,
37
+ paused: q.paused,
38
+ totalCompleted: counts.totalCompleted,
39
+ totalFailed: counts.totalFailed,
40
+ };
41
+ });
42
+ return {
43
+ instanceId,
44
+ instanceName,
45
+ version: VERSION,
46
+ hostname: HOST,
47
+ pid: process.pid,
48
+ startedAt,
49
+ timestamp: Date.now(),
50
+ sequenceId,
51
+ stats: {
52
+ waiting: stats.waiting,
53
+ delayed: stats.delayed,
54
+ active: stats.active,
55
+ dlq: stats.dlq,
56
+ completed: stats.completed,
57
+ stalled: memStats.stalledCandidates,
58
+ paused: queuesSummary.filter((q) => q.paused).length,
59
+ totalPushed: String(stats.totalPushed),
60
+ totalPulled: String(stats.totalPulled),
61
+ totalCompleted: String(stats.totalCompleted),
62
+ totalFailed: String(stats.totalFailed),
63
+ uptime: stats.uptime,
64
+ cronJobs: stats.cronJobs,
65
+ cronPending: stats.cronPending,
66
+ },
67
+ throughput: rates,
68
+ latency: {
69
+ averages,
70
+ percentiles,
71
+ },
72
+ memory: {
73
+ heapUsed: Math.round((mem.heapUsed / 1024 / 1024) * 100) / 100,
74
+ heapTotal: Math.round((mem.heapTotal / 1024 / 1024) * 100) / 100,
75
+ rss: Math.round((mem.rss / 1024 / 1024) * 100) / 100,
76
+ external: Math.round((mem.external / 1024 / 1024) * 100) / 100,
77
+ },
78
+ collections: {
79
+ jobIndex: memStats.jobIndex,
80
+ completedJobs: memStats.completedJobs,
81
+ jobResults: memStats.jobResults,
82
+ jobLogs: memStats.jobLogs,
83
+ customIdMap: memStats.customIdMap,
84
+ jobLocks: memStats.jobLocks,
85
+ processingTotal: memStats.processingTotal,
86
+ queuedTotal: memStats.queuedTotal,
87
+ temporalIndexTotal: memStats.temporalIndexTotal,
88
+ delayedHeapTotal: memStats.delayedHeapTotal,
89
+ },
90
+ queues,
91
+ workers: workerStats,
92
+ crons: crons.map((c) => ({
93
+ name: c.name,
94
+ queue: c.queue,
95
+ schedule: c.schedule ?? null,
96
+ nextRun: c.nextRun,
97
+ executions: c.executions,
98
+ maxLimit: c.maxLimit,
99
+ })),
100
+ storage: {
101
+ diskFull: storage.diskFull,
102
+ error: storage.error,
103
+ },
104
+ taskErrors: getTaskErrorStats(),
105
+ // Recent jobs (last 50 across all queues, lightweight — no job data)
106
+ recentJobs: collectRecentJobs(queueManager, queueNames),
107
+ // DLQ entries (last 50 across all queues)
108
+ dlqEntries: collectDlqEntries(queueManager, queueNames),
109
+ // Worker details
110
+ workerDetails: queueManager.workerManager.list().map((w) => ({
111
+ id: w.id,
112
+ name: w.name,
113
+ queues: w.queues,
114
+ concurrency: w.concurrency,
115
+ hostname: w.hostname,
116
+ pid: w.pid,
117
+ lastSeen: w.lastSeen,
118
+ activeJobs: w.activeJobs,
119
+ processedJobs: w.processedJobs,
120
+ failedJobs: w.failedJobs,
121
+ currentJob: w.currentJob,
122
+ })),
123
+ // Per-queue config (includes rate limit + concurrency)
124
+ queueConfigs: collectQueueConfigs(queueManager, queueNames),
125
+ // Connection stats
126
+ connections: {
127
+ tcp: serverHandles?.getConnectionCount() ?? 0,
128
+ ws: serverHandles?.getWsClientCount() ?? 0,
129
+ sse: serverHandles?.getSseClientCount() ?? 0,
130
+ },
131
+ // Webhooks with delivery stats
132
+ webhooks: collectWebhooks(queueManager),
133
+ // Top errors from DLQ entries
134
+ topErrors: collectTopErrors(queueManager, queueNames),
135
+ // S3 backup status
136
+ s3Backup: serverHandles?.getBackupStatus?.() ?? null,
137
+ };
138
+ }
139
+ /** Collect recent jobs across queues (max 50, newest first) */
140
+ function collectRecentJobs(queueManager, queueNames) {
141
+ const jobs = [];
142
+ const perQueue = Math.max(1, Math.floor(50 / (queueNames.length || 1)));
143
+ for (const name of queueNames) {
144
+ try {
145
+ const queueJobs = queueManager.getJobs(name, {
146
+ state: ['waiting', 'active', 'delayed'],
147
+ start: 0,
148
+ end: perQueue - 1,
149
+ });
150
+ for (const j of queueJobs) {
151
+ const data = j.data;
152
+ const jobName = data?.name ?? 'default';
153
+ const state = j.completedAt
154
+ ? 'completed'
155
+ : j.startedAt
156
+ ? 'active'
157
+ : j.runAt > Date.now()
158
+ ? 'delayed'
159
+ : 'waiting';
160
+ const duration = j.completedAt && j.startedAt ? j.completedAt - j.startedAt : undefined;
161
+ jobs.push({
162
+ id: String(j.id),
163
+ name: jobName,
164
+ queue: j.queue,
165
+ state,
166
+ data,
167
+ priority: j.priority,
168
+ createdAt: j.createdAt,
169
+ startedAt: j.startedAt ?? undefined,
170
+ completedAt: j.completedAt ?? undefined,
171
+ failedReason: state === 'active' && j.attempts > 0
172
+ ? `Retry ${j.attempts}/${j.maxAttempts}`
173
+ : undefined,
174
+ attempts: j.attempts,
175
+ maxAttempts: j.maxAttempts,
176
+ duration,
177
+ progress: j.progress > 0 ? j.progress : undefined,
178
+ });
179
+ }
180
+ }
181
+ catch {
182
+ // Skip queue on error
183
+ }
184
+ }
185
+ // Sort by createdAt desc, limit 50
186
+ return jobs.sort((a, b) => b.createdAt - a.createdAt).slice(0, 50);
187
+ }
188
+ /** Collect DLQ entries across queues (max 50) */
189
+ function collectDlqEntries(queueManager, queueNames) {
190
+ const entries = [];
191
+ for (const name of queueNames) {
192
+ try {
193
+ const dlq = queueManager.getDlqEntries(name);
194
+ for (const e of dlq.slice(0, 20)) {
195
+ entries.push({
196
+ jobId: String(e.job.id),
197
+ queue: e.job.queue,
198
+ reason: e.reason,
199
+ error: e.error,
200
+ enteredAt: e.enteredAt,
201
+ retryCount: e.retryCount,
202
+ attempts: e.job.attempts,
203
+ });
204
+ }
205
+ }
206
+ catch {
207
+ // Skip queue on error
208
+ }
209
+ }
210
+ return entries.sort((a, b) => b.enteredAt - a.enteredAt).slice(0, 50);
211
+ }
212
+ /** Collect per-queue config */
213
+ function collectQueueConfigs(queueManager, queueNames) {
214
+ const configs = {};
215
+ const perQueue = queueManager.getPerQueueStats();
216
+ for (const name of queueNames) {
217
+ try {
218
+ const stall = queueManager.getStallConfig(name);
219
+ const dlq = queueManager.getDlqConfig(name);
220
+ const pq = perQueue.get(name);
221
+ configs[name] = {
222
+ paused: queueManager.isPaused(name),
223
+ rateLimit: null, // TODO: expose from QueueManager
224
+ concurrencyLimit: null, // TODO: expose from QueueManager
225
+ concurrencyActive: pq?.active ?? 0,
226
+ stallConfig: { stallInterval: stall.stallInterval, maxStalls: stall.maxStalls },
227
+ dlqConfig: { maxRetries: dlq.maxAutoRetries, maxAge: dlq.maxAge ?? 0 },
228
+ };
229
+ }
230
+ catch {
231
+ // Skip on error
232
+ }
233
+ }
234
+ return configs;
235
+ }
236
+ /** Collect webhook delivery stats */
237
+ function collectWebhooks(queueManager) {
238
+ try {
239
+ const webhooks = queueManager.webhookManager.list();
240
+ return webhooks.map((w) => ({
241
+ id: w.id,
242
+ url: w.url,
243
+ events: w.events,
244
+ queue: w.queue,
245
+ enabled: w.enabled,
246
+ successCount: w.successCount,
247
+ failureCount: w.failureCount,
248
+ lastTriggered: w.lastTriggered,
249
+ }));
250
+ }
251
+ catch {
252
+ return [];
253
+ }
254
+ }
255
+ /** Collect top errors from DLQ entries, grouped by message */
256
+ function collectTopErrors(queueManager, queueNames) {
257
+ const errorMap = new Map();
258
+ const allEntries = queueNames.flatMap((name) => {
259
+ try {
260
+ return queueManager.getDlqEntries(name);
261
+ }
262
+ catch {
263
+ return [];
264
+ }
265
+ });
266
+ for (const e of allEntries) {
267
+ const msg = e.error ?? e.reason;
268
+ const existing = errorMap.get(msg);
269
+ if (existing) {
270
+ existing.count++;
271
+ if (e.enteredAt > existing.lastSeen) {
272
+ existing.lastSeen = e.enteredAt;
273
+ existing.queue = e.job.queue;
274
+ }
275
+ }
276
+ else {
277
+ errorMap.set(msg, { count: 1, queue: e.job.queue, lastSeen: e.enteredAt });
278
+ }
279
+ }
280
+ return [...errorMap.entries()]
281
+ .map(([message, data]) => ({ message, ...data }))
282
+ .sort((a, b) => b.count - a.count)
283
+ .slice(0, 20);
284
+ }
285
+ //# sourceMappingURL=snapshotCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotCollector.js","sourceRoot":"","sources":["../../../src/infrastructure/cloud/snapshotCollector.ts"],"names":[],"mappings":"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"}