bunqueue 1.6.8 → 1.8.0

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 (58) hide show
  1. package/dist/application/queueManager.d.ts +4 -0
  2. package/dist/application/queueManager.d.ts.map +1 -1
  3. package/dist/application/queueManager.js +24 -2
  4. package/dist/application/queueManager.js.map +1 -1
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +1 -3
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/client/index.d.ts +3 -1
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +2 -0
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/queue.d.ts +25 -5
  13. package/dist/client/queue.d.ts.map +1 -1
  14. package/dist/client/queue.js +285 -41
  15. package/dist/client/queue.js.map +1 -1
  16. package/dist/client/tcpClient.d.ts +72 -0
  17. package/dist/client/tcpClient.d.ts.map +1 -0
  18. package/dist/client/tcpClient.js +371 -0
  19. package/dist/client/tcpClient.js.map +1 -0
  20. package/dist/client/tcpPool.d.ts +41 -0
  21. package/dist/client/tcpPool.d.ts.map +1 -0
  22. package/dist/client/tcpPool.js +110 -0
  23. package/dist/client/tcpPool.js.map +1 -0
  24. package/dist/client/types.d.ts +24 -1
  25. package/dist/client/types.d.ts.map +1 -1
  26. package/dist/client/types.js.map +1 -1
  27. package/dist/client/worker.d.ts +37 -5
  28. package/dist/client/worker.d.ts.map +1 -1
  29. package/dist/client/worker.js +320 -45
  30. package/dist/client/worker.js.map +1 -1
  31. package/dist/domain/types/command.d.ts +16 -1
  32. package/dist/domain/types/command.d.ts.map +1 -1
  33. package/dist/infrastructure/backup/s3Backup.d.ts.map +1 -1
  34. package/dist/infrastructure/backup/s3Backup.js +2 -1
  35. package/dist/infrastructure/backup/s3Backup.js.map +1 -1
  36. package/dist/infrastructure/server/handler.d.ts.map +1 -1
  37. package/dist/infrastructure/server/handler.js +7 -1
  38. package/dist/infrastructure/server/handler.js.map +1 -1
  39. package/dist/infrastructure/server/handlers/core.d.ts +1 -1
  40. package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
  41. package/dist/infrastructure/server/handlers/core.js +12 -3
  42. package/dist/infrastructure/server/handlers/core.js.map +1 -1
  43. package/dist/infrastructure/server/handlers/monitoring.d.ts +4 -1
  44. package/dist/infrastructure/server/handlers/monitoring.d.ts.map +1 -1
  45. package/dist/infrastructure/server/handlers/monitoring.js +18 -0
  46. package/dist/infrastructure/server/handlers/monitoring.js.map +1 -1
  47. package/dist/infrastructure/server/http.d.ts.map +1 -1
  48. package/dist/infrastructure/server/http.js +2 -1
  49. package/dist/infrastructure/server/http.js.map +1 -1
  50. package/dist/infrastructure/server/rateLimiter.js +1 -1
  51. package/dist/infrastructure/server/rateLimiter.js.map +1 -1
  52. package/dist/mcp/index.js +2 -1
  53. package/dist/mcp/index.js.map +1 -1
  54. package/dist/shared/version.d.ts +1 -1
  55. package/dist/shared/version.d.ts.map +1 -1
  56. package/dist/shared/version.js +3 -27
  57. package/dist/shared/version.js.map +1 -1
  58. package/package.json +2 -2
@@ -1,22 +1,44 @@
1
1
  /**
2
2
  * Worker - BullMQ-style API
3
+ * Default: TCP connection to localhost:6789
4
+ * Optional: embedded mode with { embedded: true }
5
+ *
6
+ * Performance optimizations:
7
+ * - Batch pull: fetches multiple jobs per round-trip (batchSize option)
8
+ * - Batch ACK with results: acknowledges multiple jobs per round-trip
9
+ * - Connection pooling: optional pool for high-concurrency scenarios
10
+ * - Long polling: reduces round-trips when queue is empty
11
+ * - TCP heartbeats: keeps jobs alive for stall detection
3
12
  */
4
13
  import { EventEmitter } from 'events';
5
14
  import type { WorkerOptions, Processor } from './types';
6
15
  /**
7
16
  * Worker class for processing jobs
17
+ * Default: connects to bunqueue server via TCP
18
+ * Use { embedded: true } for in-process mode
19
+ * Set BUNQUEUE_EMBEDDED=1 env var to force embedded mode
8
20
  */
9
21
  export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
10
22
  readonly name: string;
11
23
  private readonly opts;
12
24
  private readonly processor;
25
+ private readonly embedded;
26
+ private readonly tcp;
27
+ private readonly tcpPool;
13
28
  private running;
14
29
  private activeJobs;
15
30
  private pollTimer;
16
- private readonly heartbeatTimers;
31
+ private readonly activeJobIds;
32
+ private heartbeatTimer;
17
33
  private consecutiveErrors;
34
+ private readonly pendingJobs;
35
+ private readonly pendingAcks;
36
+ private ackTimer;
37
+ private readonly ackBatchSize;
38
+ private readonly ackInterval;
18
39
  private static readonly MAX_BACKOFF_MS;
19
40
  private static readonly BASE_BACKOFF_MS;
41
+ private static readonly MAX_POLL_TIMEOUT;
20
42
  constructor(name: string, processor: Processor<T, R>, opts?: WorkerOptions);
21
43
  /** Start processing */
22
44
  run(): void;
@@ -26,12 +48,22 @@ export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
26
48
  resume(): void;
27
49
  /** Close worker gracefully */
28
50
  close(force?: boolean): Promise<void>;
51
+ /** Start global heartbeat timer for all active jobs (TCP mode) */
52
+ private startGlobalHeartbeat;
53
+ /** Send batch heartbeat for all active jobs */
54
+ private sendBatchHeartbeat;
29
55
  private poll;
30
56
  private tryProcess;
57
+ /** Pull batch (embedded) */
58
+ private pullBatchEmbedded;
59
+ /** Pull batch of jobs via TCP with optional long polling */
60
+ private pullBatchTcp;
61
+ /** Parse job from TCP response */
62
+ private parseJob;
63
+ /** Queue ACK for batch processing with result */
64
+ private queueAck;
65
+ /** Flush pending ACKs in batch with results */
66
+ private flushAcks;
31
67
  private processJob;
32
- /** Start heartbeat timer for a job */
33
- private startHeartbeat;
34
- /** Stop heartbeat timer for a job */
35
- private stopHeartbeat;
36
68
  }
37
69
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAUxD;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,YAAY;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0D;IAC1F,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAU;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAO;gBAElC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAE,aAAkB;IAe9E,uBAAuB;IACvB,GAAG,IAAI,IAAI;IAOX,uBAAuB;IACvB,KAAK,IAAI,IAAI;IAQb,wBAAwB;IACxB,MAAM,IAAI,IAAI;IAId,8BAA8B;IACxB,KAAK,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBzC,OAAO,CAAC,IAAI;YAaE,UAAU;YAmDV,UAAU;IAiDxB,sCAAsC;IACtC,OAAO,CAAC,cAAc;IAWtB,qCAAqC;IACrC,OAAO,CAAC,aAAa;CAOtB"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAqB,MAAM,SAAS,CAAC;AA2B3E;;;;;GAKG;AACH,qBAAa,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,YAAY;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAGjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAU;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAO;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAEtC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAE,aAAkB;IA0C9E,uBAAuB;IACvB,GAAG,IAAI,IAAI;IAaX,uBAAuB;IACvB,KAAK,IAAI,IAAI;IAQb,wBAAwB;IACxB,MAAM,IAAI,IAAI;IAId,8BAA8B;IACxB,KAAK,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCzC,kEAAkE;IAClE,OAAO,CAAC,oBAAoB;IAM5B,+CAA+C;YACjC,kBAAkB;IAiBhC,OAAO,CAAC,IAAI;YAaE,UAAU;IAkFxB,4BAA4B;YACd,iBAAiB;IAS/B,4DAA4D;YAC9C,YAAY;IAuB1B,kCAAkC;IAClC,OAAO,CAAC,QAAQ;IAiDhB,iDAAiD;IACjD,OAAO,CAAC,QAAQ;IAoBhB,+CAA+C;YACjC,SAAS;YA2CT,UAAU;CA6EzB"}
@@ -1,33 +1,85 @@
1
1
  /**
2
2
  * Worker - BullMQ-style API
3
+ * Default: TCP connection to localhost:6789
4
+ * Optional: embedded mode with { embedded: true }
5
+ *
6
+ * Performance optimizations:
7
+ * - Batch pull: fetches multiple jobs per round-trip (batchSize option)
8
+ * - Batch ACK with results: acknowledges multiple jobs per round-trip
9
+ * - Connection pooling: optional pool for high-concurrency scenarios
10
+ * - Long polling: reduces round-trips when queue is empty
11
+ * - TCP heartbeats: keeps jobs alive for stall detection
3
12
  */
4
13
  import { EventEmitter } from 'events';
5
14
  import { getSharedManager } from './manager';
15
+ // TCP connection pool is always used in TCP mode
16
+ import { TcpConnectionPool } from './tcpPool';
6
17
  import { createPublicJob } from './types';
7
18
  import { jobId } from '../domain/types/job';
19
+ /** Check if embedded mode should be forced (for tests) */
20
+ const FORCE_EMBEDDED = process.env.BUNQUEUE_EMBEDDED === '1';
8
21
  /**
9
22
  * Worker class for processing jobs
23
+ * Default: connects to bunqueue server via TCP
24
+ * Use { embedded: true } for in-process mode
25
+ * Set BUNQUEUE_EMBEDDED=1 env var to force embedded mode
10
26
  */
11
27
  export class Worker extends EventEmitter {
12
28
  name;
13
29
  opts;
14
30
  processor;
31
+ embedded;
32
+ tcp;
33
+ tcpPool;
15
34
  running = false;
16
35
  activeJobs = 0;
17
36
  pollTimer = null;
18
- heartbeatTimers = new Map();
37
+ activeJobIds = new Set(); // Track active job IDs for heartbeat
38
+ heartbeatTimer = null;
19
39
  consecutiveErrors = 0;
40
+ pendingJobs = []; // Buffer for batch-pulled jobs
41
+ // Batch ACK state
42
+ pendingAcks = [];
43
+ ackTimer = null;
44
+ ackBatchSize;
45
+ ackInterval;
20
46
  static MAX_BACKOFF_MS = 30_000;
21
47
  static BASE_BACKOFF_MS = 100;
48
+ static MAX_POLL_TIMEOUT = 30_000;
22
49
  constructor(name, processor, opts = {}) {
23
50
  super();
24
51
  this.name = name;
25
52
  this.processor = processor;
53
+ this.embedded = opts.embedded ?? FORCE_EMBEDDED;
54
+ const concurrency = opts.concurrency ?? 1;
26
55
  this.opts = {
27
- concurrency: opts.concurrency ?? 1,
56
+ concurrency,
28
57
  autorun: opts.autorun ?? true,
29
58
  heartbeatInterval: opts.heartbeatInterval ?? 10000,
59
+ batchSize: Math.min(opts.batchSize ?? 10, 1000), // Default 10, max 1000
60
+ pollTimeout: Math.min(opts.pollTimeout ?? 0, Worker.MAX_POLL_TIMEOUT), // Default 0, max 30s
61
+ embedded: this.embedded,
30
62
  };
63
+ // Batch ACK settings
64
+ this.ackBatchSize = opts.batchSize ?? 10; // ACK when this many complete
65
+ this.ackInterval = 50; // Or after 50ms, whichever comes first
66
+ if (this.embedded) {
67
+ this.tcp = null;
68
+ this.tcpPool = null;
69
+ }
70
+ else {
71
+ const connOpts = opts.connection ?? {};
72
+ // Always use pool - default poolSize = min(concurrency, 8), user can override
73
+ const poolSize = connOpts.poolSize ?? Math.min(concurrency, 8);
74
+ // Use connection pool (always enabled for TCP mode)
75
+ this.tcpPool = new TcpConnectionPool({
76
+ host: connOpts.host ?? 'localhost',
77
+ port: connOpts.port ?? 6789,
78
+ token: connOpts.token,
79
+ poolSize,
80
+ });
81
+ this.tcp = this.tcpPool;
82
+ }
31
83
  if (this.opts.autorun) {
32
84
  this.run();
33
85
  }
@@ -38,6 +90,10 @@ export class Worker extends EventEmitter {
38
90
  return;
39
91
  this.running = true;
40
92
  this.emit('ready');
93
+ // Start global heartbeat timer for TCP mode
94
+ if (!this.embedded && this.opts.heartbeatInterval > 0) {
95
+ this.startGlobalHeartbeat();
96
+ }
41
97
  this.poll();
42
98
  }
43
99
  /** Pause processing */
@@ -59,18 +115,54 @@ export class Worker extends EventEmitter {
59
115
  clearTimeout(this.pollTimer);
60
116
  this.pollTimer = null;
61
117
  }
62
- // Stop all heartbeat timers
63
- for (const timer of this.heartbeatTimers.values()) {
64
- clearInterval(timer);
118
+ // Stop global heartbeat timer
119
+ if (this.heartbeatTimer) {
120
+ clearInterval(this.heartbeatTimer);
121
+ this.heartbeatTimer = null;
122
+ }
123
+ // Flush pending ACKs
124
+ await this.flushAcks();
125
+ // Stop ACK timer
126
+ if (this.ackTimer) {
127
+ clearTimeout(this.ackTimer);
128
+ this.ackTimer = null;
65
129
  }
66
- this.heartbeatTimers.clear();
67
130
  if (!force) {
68
131
  while (this.activeJobs > 0) {
69
132
  await new Promise((r) => setTimeout(r, 50));
70
133
  }
71
134
  }
135
+ // Close pool if using pooled connections (not shared)
136
+ if (this.tcpPool) {
137
+ this.tcpPool.close();
138
+ }
72
139
  this.emit('closed');
73
140
  }
141
+ /** Start global heartbeat timer for all active jobs (TCP mode) */
142
+ startGlobalHeartbeat() {
143
+ this.heartbeatTimer = setInterval(() => {
144
+ void this.sendBatchHeartbeat();
145
+ }, this.opts.heartbeatInterval);
146
+ }
147
+ /** Send batch heartbeat for all active jobs */
148
+ async sendBatchHeartbeat() {
149
+ if (this.activeJobIds.size === 0 || !this.tcp)
150
+ return;
151
+ try {
152
+ const ids = Array.from(this.activeJobIds);
153
+ if (ids.length === 1) {
154
+ await this.tcp.send({ cmd: 'JobHeartbeat', id: ids[0] });
155
+ }
156
+ else {
157
+ await this.tcp.send({ cmd: 'JobHeartbeatB', ids });
158
+ }
159
+ }
160
+ catch (err) {
161
+ // Heartbeat errors are non-fatal, just emit for logging
162
+ const error = err instanceof Error ? err : new Error(String(err));
163
+ this.emit('error', Object.assign(error, { context: 'heartbeat' }));
164
+ }
165
+ }
74
166
  poll() {
75
167
  if (!this.running)
76
168
  return;
@@ -85,28 +177,57 @@ export class Worker extends EventEmitter {
85
177
  async tryProcess() {
86
178
  if (!this.running)
87
179
  return;
88
- const manager = getSharedManager();
89
180
  try {
90
- const internalJob = await manager.pull(this.name, 0);
91
- // Reset error count on successful pull
92
- this.consecutiveErrors = 0;
93
- if (internalJob) {
181
+ // Get job from pending buffer or fetch new batch
182
+ let job = this.pendingJobs.shift() ?? null;
183
+ if (!job) {
184
+ // Fetch new batch - calculate how many we can process
185
+ const availableSlots = this.opts.concurrency - this.activeJobs;
186
+ const batchSize = Math.min(this.opts.batchSize, availableSlots, 1000);
187
+ if (batchSize > 0) {
188
+ const jobs = this.embedded
189
+ ? await this.pullBatchEmbedded(batchSize)
190
+ : await this.pullBatchTcp(batchSize);
191
+ // Take first job, buffer the rest
192
+ const firstJob = jobs.shift();
193
+ if (firstJob) {
194
+ job = firstJob;
195
+ this.pendingJobs.push(...jobs);
196
+ }
197
+ }
198
+ }
199
+ if (job) {
200
+ // Reset error count only when we successfully got a job
201
+ this.consecutiveErrors = 0;
94
202
  this.activeJobs++;
95
- void this.processJob(internalJob).finally(() => {
203
+ const jobIdStr = String(job.id);
204
+ this.activeJobIds.add(jobIdStr);
205
+ void this.processJob(job).finally(() => {
96
206
  this.activeJobs--;
207
+ this.activeJobIds.delete(jobIdStr);
97
208
  if (this.running)
98
209
  this.poll();
99
210
  });
100
- if (this.activeJobs < this.opts.concurrency) {
211
+ // Process more jobs from buffer if available
212
+ if (this.activeJobs < this.opts.concurrency && this.pendingJobs.length > 0) {
213
+ setImmediate(() => {
214
+ void this.tryProcess();
215
+ });
216
+ }
217
+ else if (this.activeJobs < this.opts.concurrency) {
218
+ // No buffered jobs, schedule another fetch
101
219
  setImmediate(() => {
102
220
  void this.tryProcess();
103
221
  });
104
222
  }
105
223
  }
106
224
  else {
225
+ // No jobs available, wait before polling again
226
+ // Use longer wait if long polling is enabled and server didn't block
227
+ const waitTime = this.opts.pollTimeout > 0 ? 10 : 50;
107
228
  this.pollTimer = setTimeout(() => {
108
229
  this.poll();
109
- }, 50);
230
+ }, waitTime);
110
231
  }
111
232
  }
112
233
  catch (err) {
@@ -126,38 +247,210 @@ export class Worker extends EventEmitter {
126
247
  }, backoffMs);
127
248
  }
128
249
  }
129
- async processJob(internalJob) {
250
+ /** Pull batch (embedded) */
251
+ async pullBatchEmbedded(count) {
130
252
  const manager = getSharedManager();
253
+ if (count === 1) {
254
+ const job = await manager.pull(this.name, 0);
255
+ return job ? [job] : [];
256
+ }
257
+ return manager.pullBatch(this.name, count, 0);
258
+ }
259
+ /** Pull batch of jobs via TCP with optional long polling */
260
+ async pullBatchTcp(count) {
261
+ if (!this.tcp)
262
+ return [];
263
+ const response = await this.tcp.send({
264
+ cmd: count === 1 ? 'PULL' : 'PULLB',
265
+ queue: this.name,
266
+ timeout: this.opts.pollTimeout, // Long polling support
267
+ count, // For PULLB
268
+ });
269
+ if (!response.ok)
270
+ return [];
271
+ // Handle single job response (PULL)
272
+ if (count === 1 && response.job) {
273
+ return [this.parseJob(response.job)];
274
+ }
275
+ // Handle batch response (PULLB)
276
+ const jobs = response.jobs;
277
+ if (!jobs || jobs.length === 0)
278
+ return [];
279
+ return jobs.map((j) => this.parseJob(j));
280
+ }
281
+ /** Parse job from TCP response */
282
+ parseJob(jobData) {
283
+ const priority = jobData.priority;
284
+ const createdAt = jobData.createdAt;
285
+ const runAt = jobData.runAt;
286
+ const attempts = jobData.attempts;
287
+ const maxAttempts = jobData.maxAttempts;
288
+ const backoff = jobData.backoff;
289
+ const ttl = jobData.ttl;
290
+ const timeout = jobData.timeout;
291
+ const uniqueKey = jobData.uniqueKey;
292
+ const customId = jobData.customId;
293
+ const progress = jobData.progress;
294
+ const progressMessage = jobData.progressMessage;
295
+ const removeOnComplete = jobData.removeOnComplete;
296
+ return {
297
+ id: jobId(jobData.id),
298
+ queue: this.name,
299
+ data: jobData.data,
300
+ priority: priority ?? 0,
301
+ createdAt: createdAt ?? Date.now(),
302
+ runAt: runAt ?? Date.now(),
303
+ startedAt: Date.now(),
304
+ completedAt: null,
305
+ attempts: attempts ?? 0,
306
+ maxAttempts: maxAttempts ?? 3,
307
+ backoff: backoff ?? 1000,
308
+ ttl: ttl ?? null,
309
+ timeout: timeout ?? null,
310
+ uniqueKey: uniqueKey ?? null,
311
+ customId: customId ?? null,
312
+ progress: progress ?? 0,
313
+ progressMessage: progressMessage ?? null,
314
+ dependsOn: [],
315
+ parentId: null,
316
+ childrenIds: [],
317
+ childrenCompleted: 0,
318
+ tags: [],
319
+ groupId: null,
320
+ lifo: false,
321
+ removeOnComplete: removeOnComplete ?? false,
322
+ removeOnFail: false,
323
+ stallCount: 0,
324
+ stallTimeout: null,
325
+ lastHeartbeat: Date.now(),
326
+ repeat: null,
327
+ };
328
+ }
329
+ /** Queue ACK for batch processing with result */
330
+ queueAck(id, result) {
331
+ this.pendingAcks.push({
332
+ id,
333
+ result,
334
+ resolve: () => { },
335
+ reject: () => { },
336
+ });
337
+ // Flush if batch is full
338
+ if (this.pendingAcks.length >= this.ackBatchSize) {
339
+ void this.flushAcks();
340
+ }
341
+ else {
342
+ // Start timer for partial batch (if not already running)
343
+ this.ackTimer ??= setTimeout(() => {
344
+ this.ackTimer = null;
345
+ void this.flushAcks();
346
+ }, this.ackInterval);
347
+ }
348
+ }
349
+ /** Flush pending ACKs in batch with results */
350
+ async flushAcks() {
351
+ if (this.pendingAcks.length === 0)
352
+ return;
353
+ const batch = this.pendingAcks.splice(0, this.pendingAcks.length);
354
+ if (this.ackTimer) {
355
+ clearTimeout(this.ackTimer);
356
+ this.ackTimer = null;
357
+ }
358
+ try {
359
+ if (this.embedded) {
360
+ // Embedded: batch ack with results
361
+ const manager = getSharedManager();
362
+ const items = batch.map((a) => ({ id: jobId(a.id), result: a.result }));
363
+ await manager.ackBatchWithResults(items);
364
+ }
365
+ else if (this.tcp) {
366
+ // TCP: use ACKB command with results
367
+ const response = await this.tcp.send({
368
+ cmd: 'ACKB',
369
+ ids: batch.map((a) => a.id),
370
+ results: batch.map((a) => a.result), // Include results
371
+ });
372
+ if (!response.ok) {
373
+ const errMsg = response.error;
374
+ throw new Error(errMsg ?? 'Batch ACK failed');
375
+ }
376
+ }
377
+ // Resolve all promises
378
+ for (const ack of batch) {
379
+ ack.resolve();
380
+ }
381
+ }
382
+ catch (err) {
383
+ // Reject all promises
384
+ const error = err instanceof Error ? err : new Error(String(err));
385
+ for (const ack of batch) {
386
+ ack.reject(error);
387
+ }
388
+ }
389
+ }
390
+ async processJob(internalJob) {
131
391
  const jobData = internalJob.data;
132
392
  const name = jobData?.name ?? 'default';
133
393
  const jobIdStr = String(internalJob.id);
134
- // Start heartbeat timer for this job
135
- this.startHeartbeat(jobIdStr, internalJob);
136
394
  // Create job with progress and log methods
137
395
  const job = createPublicJob(internalJob, name, async (id, progress, message) => {
138
- await manager.updateProgress(jobId(id), progress, message);
396
+ if (this.embedded) {
397
+ const manager = getSharedManager();
398
+ await manager.updateProgress(jobId(id), progress, message);
399
+ }
400
+ else if (this.tcp) {
401
+ await this.tcp.send({
402
+ cmd: 'Progress',
403
+ id,
404
+ progress,
405
+ message,
406
+ });
407
+ }
139
408
  this.emit('progress', job, progress);
140
- }, (id, message) => {
141
- manager.addLog(jobId(id), message);
142
- return Promise.resolve();
409
+ }, async (id, message) => {
410
+ if (this.embedded) {
411
+ const manager = getSharedManager();
412
+ manager.addLog(jobId(id), message);
413
+ }
414
+ else if (this.tcp) {
415
+ await this.tcp.send({
416
+ cmd: 'AddLog',
417
+ id,
418
+ message,
419
+ });
420
+ }
143
421
  });
144
422
  this.emit('active', job);
145
423
  try {
146
424
  const result = await this.processor(job);
147
- this.stopHeartbeat(jobIdStr);
148
- await manager.ack(internalJob.id, result);
425
+ // Use batch ACK for both modes
426
+ if (this.embedded) {
427
+ const manager = getSharedManager();
428
+ await manager.ack(internalJob.id, result);
429
+ }
430
+ else {
431
+ // Queue for batch ACK with result
432
+ this.queueAck(jobIdStr, result);
433
+ }
149
434
  job.returnvalue = result;
150
435
  this.emit('completed', job, result);
151
436
  }
152
437
  catch (error) {
153
- this.stopHeartbeat(jobIdStr);
154
438
  const err = error instanceof Error ? error : new Error(String(error));
155
- // Try to fail the job, but don't throw if that fails too
439
+ // Try to fail the job (not batched - failures are less common)
156
440
  try {
157
- await manager.fail(internalJob.id, err.message);
441
+ if (this.embedded) {
442
+ const manager = getSharedManager();
443
+ await manager.fail(internalJob.id, err.message);
444
+ }
445
+ else if (this.tcp) {
446
+ await this.tcp.send({
447
+ cmd: 'FAIL',
448
+ id: internalJob.id,
449
+ error: err.message,
450
+ });
451
+ }
158
452
  }
159
453
  catch (failError) {
160
- // Emit error for fail operation failure
161
454
  const wrappedError = failError instanceof Error ? failError : new Error(String(failError));
162
455
  this.emit('error', Object.assign(wrappedError, { context: 'fail', jobId: jobIdStr }));
163
456
  }
@@ -165,23 +458,5 @@ export class Worker extends EventEmitter {
165
458
  this.emit('failed', job, err);
166
459
  }
167
460
  }
168
- /** Start heartbeat timer for a job */
169
- startHeartbeat(jobIdStr, internalJob) {
170
- if (this.opts.heartbeatInterval <= 0)
171
- return;
172
- const timer = setInterval(() => {
173
- // Update lastHeartbeat on the internal job
174
- internalJob.lastHeartbeat = Date.now();
175
- }, this.opts.heartbeatInterval);
176
- this.heartbeatTimers.set(jobIdStr, timer);
177
- }
178
- /** Stop heartbeat timer for a job */
179
- stopHeartbeat(jobIdStr) {
180
- const timer = this.heartbeatTimers.get(jobIdStr);
181
- if (timer) {
182
- clearInterval(timer);
183
- this.heartbeatTimers.delete(jobIdStr);
184
- }
185
- }
186
461
  }
187
462
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,7 @@ export interface AckCommand extends BaseCommand {
51
51
  export interface AckBatchCommand extends BaseCommand {
52
52
  readonly cmd: 'ACKB';
53
53
  readonly ids: string[];
54
+ readonly results?: unknown[];
54
55
  }
55
56
  export interface FailCommand extends BaseCommand {
56
57
  readonly cmd: 'FAIL';
@@ -223,6 +224,20 @@ export interface HeartbeatCommand extends BaseCommand {
223
224
  readonly cmd: 'Heartbeat';
224
225
  readonly id: string;
225
226
  }
227
+ /** Job-level heartbeat for stall detection */
228
+ export interface JobHeartbeatCommand extends BaseCommand {
229
+ readonly cmd: 'JobHeartbeat';
230
+ readonly id: string;
231
+ }
232
+ /** Batch job heartbeat for multiple jobs */
233
+ export interface JobHeartbeatBatchCommand extends BaseCommand {
234
+ readonly cmd: 'JobHeartbeatB';
235
+ readonly ids: string[];
236
+ }
237
+ /** Ping for connection health check */
238
+ export interface PingCommand extends BaseCommand {
239
+ readonly cmd: 'Ping';
240
+ }
226
241
  export interface RegisterWorkerCommand extends BaseCommand {
227
242
  readonly cmd: 'RegisterWorker';
228
243
  readonly name: string;
@@ -263,7 +278,7 @@ export interface AuthCommand extends BaseCommand {
263
278
  readonly token: string;
264
279
  }
265
280
  /** Union of all commands */
266
- export type Command = PushCommand | PushBatchCommand | PullCommand | PullBatchCommand | AckCommand | AckBatchCommand | FailCommand | GetJobCommand | GetStateCommand | GetResultCommand | GetJobsCommand | GetJobCountsCommand | GetJobByCustomIdCommand | CountCommand | GetProgressCommand | CancelCommand | ProgressCommand | UpdateCommand | ChangePriorityCommand | PromoteCommand | WaitJobCommand | MoveToDelayedCommand | DiscardCommand | PauseCommand | ResumeCommand | IsPausedCommand | DrainCommand | ObliterateCommand | ListQueuesCommand | CleanCommand | DlqCommand | RetryDlqCommand | PurgeDlqCommand | RateLimitCommand | SetConcurrencyCommand | RateLimitClearCommand | ClearConcurrencyCommand | CronCommand | CronDeleteCommand | CronListCommand | AddLogCommand | GetLogsCommand | HeartbeatCommand | RegisterWorkerCommand | UnregisterWorkerCommand | ListWorkersCommand | AddWebhookCommand | RemoveWebhookCommand | ListWebhooksCommand | StatsCommand | MetricsCommand | PrometheusCommand | AuthCommand;
281
+ export type Command = PushCommand | PushBatchCommand | PullCommand | PullBatchCommand | AckCommand | AckBatchCommand | FailCommand | GetJobCommand | GetStateCommand | GetResultCommand | GetJobsCommand | GetJobCountsCommand | GetJobByCustomIdCommand | CountCommand | GetProgressCommand | CancelCommand | ProgressCommand | UpdateCommand | ChangePriorityCommand | PromoteCommand | WaitJobCommand | MoveToDelayedCommand | DiscardCommand | PauseCommand | ResumeCommand | IsPausedCommand | DrainCommand | ObliterateCommand | ListQueuesCommand | CleanCommand | DlqCommand | RetryDlqCommand | PurgeDlqCommand | RateLimitCommand | SetConcurrencyCommand | RateLimitClearCommand | ClearConcurrencyCommand | CronCommand | CronDeleteCommand | CronListCommand | AddLogCommand | GetLogsCommand | HeartbeatCommand | JobHeartbeatCommand | JobHeartbeatBatchCommand | PingCommand | RegisterWorkerCommand | UnregisterWorkerCommand | ListWorkersCommand | AddWebhookCommand | RemoveWebhookCommand | ListWebhooksCommand | StatsCommand | MetricsCommand | PrometheusCommand | AuthCommand;
267
282
  /** Extract command type */
268
283
  export type CommandType = Command['cmd'];
269
284
  export {};