power-queues 2.1.2 → 2.1.3

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/index.cjs CHANGED
@@ -283,7 +283,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
283
283
  this.idemLockTimeout = 18e4;
284
284
  this.idemDoneTimeout = 6e4;
285
285
  this.logStatus = false;
286
- this.logStatusTimeout = 3e5;
286
+ this.logStatusTimeout = 6e5;
287
287
  this.approveCount = 2e3;
288
288
  this.removeOnExecuted = true;
289
289
  }
@@ -316,7 +316,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
316
316
  } catch (err) {
317
317
  }
318
318
  if (!(0, import_full_utils.isArrFilled)(tasks)) {
319
- await (0, import_full_utils.wait)(400);
319
+ await (0, import_full_utils.wait)(300);
320
320
  continue;
321
321
  }
322
322
  try {
@@ -327,7 +327,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
327
327
  await this.approve(queueName, tasks.map((task) => task[0]));
328
328
  } catch {
329
329
  }
330
- await (0, import_full_utils.wait)(400);
330
+ await (0, import_full_utils.wait)(300);
331
331
  }
332
332
  }
333
333
  }
@@ -345,7 +345,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
345
345
  const filteredTasks = filtered[key];
346
346
  const keySplit = key.split(":");
347
347
  const attempt = Number(keySplit[0]);
348
- await this.addTasks(queueName + (attempt + 1 >= this.retryCount ? ":dlq" : ""), filteredTasks.map((task) => ({ ...task[1] })), {
348
+ await this.addTasks(queueName + (attempt >= this.retryCount - 1 ? ":dlq" : ""), filteredTasks.map((task) => ({ ...task[1] })), {
349
349
  createdAt: Number(keySplit[1]),
350
350
  job: keySplit[2],
351
351
  attempt: attempt + 1
@@ -452,14 +452,14 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
452
452
  let contended = 0, promises = [];
453
453
  for (const [id, payload, createdAt, job, idemKey, attempt] of tasks) {
454
454
  if (!this.executeSync) {
455
- promises.push((async () => {
455
+ promises.push(async () => {
456
456
  const r = await this.executeProcess(queueName, { id, payload, createdAt, job, idemKey, attempt });
457
457
  if (r.id) {
458
458
  result.push(r);
459
459
  } else if (r.contended) {
460
460
  contended++;
461
461
  }
462
- })());
462
+ });
463
463
  } else {
464
464
  const r = await this.executeProcess(queueName, { id, payload, createdAt, job, idemKey, attempt });
465
465
  if (r.id) {
@@ -470,9 +470,9 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
470
470
  }
471
471
  }
472
472
  if (!this.executeSync && promises.length > 0) {
473
- await Promise.all(promises);
473
+ await Promise.all(promises.map((item) => item));
474
474
  }
475
- await this.onBatchSuccess(queueName, result);
475
+ await this.onBatchReady(queueName, result);
476
476
  if (!(0, import_full_utils.isArrFilled)(result) && contended > tasks.length >> 1) {
477
477
  await this.waitAbortable(15 + Math.floor(Math.random() * 35) + Math.min(250, 15 * contended + Math.floor(Math.random() * 40)));
478
478
  }
@@ -482,7 +482,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
482
482
  const keys = this.idempotencyKeys(queueName, String(task.idemKey));
483
483
  const allow = await this.idempotencyAllow(keys);
484
484
  if (allow === 1) {
485
- return { id: task.id };
485
+ return { contended: true };
486
486
  } else if (allow === 0) {
487
487
  let ttl = -2;
488
488
  try {
@@ -503,13 +503,8 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
503
503
  return await this.success(queueName, processed);
504
504
  } catch (err) {
505
505
  try {
506
- task.attempt = task.attempt + 1;
507
- await this.error(err, queueName, task);
508
- if (task.attempt >= this.retryCount) {
509
- await this.idempotencyFree(keys);
510
- return task;
511
- }
512
506
  await this.idempotencyFree(keys);
507
+ return await this.error(err, queueName, task);
513
508
  } catch (err2) {
514
509
  }
515
510
  } finally {
@@ -556,26 +551,26 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
556
551
  async error(err, queueName, task) {
557
552
  const dlqKey = queueName + ":dlq";
558
553
  const taskP = { ...task };
559
- if (task.attempt >= this.retryCount) {
560
- const statusKey = `${queueName}:${task.job}:`;
561
- await this.addTasks(dlqKey, [{ ...taskP.payload }], {
562
- createdAt: task.createdAt,
563
- job: task.job,
564
- attempt: task.attempt
565
- });
554
+ if (taskP.attempt >= this.retryCount - 1) {
555
+ const statusKey = `${queueName}:${taskP.job}:`;
566
556
  if (this.logStatus) {
567
557
  await this.incr(statusKey + "err", this.logStatusTimeout);
568
558
  await this.incr(statusKey + "ready", this.logStatusTimeout);
569
559
  }
560
+ await this.addTasks(dlqKey, [{ ...taskP.payload }], {
561
+ createdAt: taskP.createdAt,
562
+ job: taskP.job,
563
+ attempt: taskP.attempt
564
+ });
570
565
  } else {
571
- await this.onRetry(err, queueName, task);
566
+ await this.onRetry(err, queueName, taskP);
572
567
  await this.addTasks(queueName, [{ ...taskP.payload }], {
573
- createdAt: task.createdAt,
574
- job: task.job,
575
- attempt: task.attempt
568
+ createdAt: taskP.createdAt,
569
+ job: taskP.job,
570
+ attempt: (taskP.attempt || 0) + 1
576
571
  });
577
572
  }
578
- await this.onError(err, queueName, task);
573
+ return await this.onError(err, queueName, { ...taskP, attempt: (taskP.attempt || 0) + 1 });
579
574
  }
580
575
  async waitAbortable(ttl) {
581
576
  return new Promise((resolve) => {
@@ -585,7 +580,7 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
585
580
  }
586
581
  let delay;
587
582
  if (ttl > 0) {
588
- const base = Math.max(25, Math.min(ttl, 5e3));
583
+ const base = Math.max(25, Math.min(ttl, 4e3));
589
584
  const jitter = Math.floor(Math.min(base, 200) * Math.random());
590
585
  delay = base + jitter;
591
586
  } else {
@@ -837,12 +832,13 @@ var PowerQueues = class extends import_power_redis.PowerRedis {
837
832
  async onExecute(queueName, task) {
838
833
  return task;
839
834
  }
840
- async onBatchSuccess(queueName, tasks) {
835
+ async onBatchReady(queueName, tasks) {
841
836
  }
842
837
  async onSuccess(queueName, task) {
843
838
  return task;
844
839
  }
845
840
  async onError(err, queueName, task) {
841
+ return task;
846
842
  }
847
843
  async onBatchError(err, queueName, tasks) {
848
844
  }
package/dist/index.d.cts CHANGED
@@ -81,12 +81,12 @@ declare class PowerQueues extends PowerRedis {
81
81
  private buildBatches;
82
82
  private keysLength;
83
83
  private payloadBatch;
84
- beforeExecute(queueName: string, tasks: Array<[string, any[], number, string, string, number]>): Promise<[string, any[], number, string, string, number][]>;
84
+ beforeExecute(queueName: string, tasks: Array<[string, any, number, string, string, number]>): Promise<[string, any, number, string, string, number][]>;
85
85
  onExecute(queueName: string, task: Task): Promise<Task>;
86
- onBatchSuccess(queueName: string, tasks: Array<Task>): Promise<void>;
86
+ onBatchReady(queueName: string, tasks: Array<Task>): Promise<void>;
87
87
  onSuccess(queueName: string, task: Task): Promise<Task>;
88
- onError(err: any, queueName: string, task: Task): Promise<void>;
89
- onBatchError(err: any, queueName: string, tasks: Array<[string, any[], number, string, string, number]>): Promise<void>;
88
+ onError(err: any, queueName: string, task: Task): Promise<Task>;
89
+ onBatchError(err: any, queueName: string, tasks: Array<[string, any, number, string, string, number]>): Promise<void>;
90
90
  onRetry(err: any, queueName: string, task: Task): Promise<void>;
91
91
  }
92
92
 
package/dist/index.d.ts CHANGED
@@ -81,12 +81,12 @@ declare class PowerQueues extends PowerRedis {
81
81
  private buildBatches;
82
82
  private keysLength;
83
83
  private payloadBatch;
84
- beforeExecute(queueName: string, tasks: Array<[string, any[], number, string, string, number]>): Promise<[string, any[], number, string, string, number][]>;
84
+ beforeExecute(queueName: string, tasks: Array<[string, any, number, string, string, number]>): Promise<[string, any, number, string, string, number][]>;
85
85
  onExecute(queueName: string, task: Task): Promise<Task>;
86
- onBatchSuccess(queueName: string, tasks: Array<Task>): Promise<void>;
86
+ onBatchReady(queueName: string, tasks: Array<Task>): Promise<void>;
87
87
  onSuccess(queueName: string, task: Task): Promise<Task>;
88
- onError(err: any, queueName: string, task: Task): Promise<void>;
89
- onBatchError(err: any, queueName: string, tasks: Array<[string, any[], number, string, string, number]>): Promise<void>;
88
+ onError(err: any, queueName: string, task: Task): Promise<Task>;
89
+ onBatchError(err: any, queueName: string, tasks: Array<[string, any, number, string, string, number]>): Promise<void>;
90
90
  onRetry(err: any, queueName: string, task: Task): Promise<void>;
91
91
  }
92
92
 
package/dist/index.js CHANGED
@@ -266,7 +266,7 @@ var PowerQueues = class extends PowerRedis {
266
266
  this.idemLockTimeout = 18e4;
267
267
  this.idemDoneTimeout = 6e4;
268
268
  this.logStatus = false;
269
- this.logStatusTimeout = 3e5;
269
+ this.logStatusTimeout = 6e5;
270
270
  this.approveCount = 2e3;
271
271
  this.removeOnExecuted = true;
272
272
  }
@@ -299,7 +299,7 @@ var PowerQueues = class extends PowerRedis {
299
299
  } catch (err) {
300
300
  }
301
301
  if (!isArrFilled(tasks)) {
302
- await wait(400);
302
+ await wait(300);
303
303
  continue;
304
304
  }
305
305
  try {
@@ -310,7 +310,7 @@ var PowerQueues = class extends PowerRedis {
310
310
  await this.approve(queueName, tasks.map((task) => task[0]));
311
311
  } catch {
312
312
  }
313
- await wait(400);
313
+ await wait(300);
314
314
  }
315
315
  }
316
316
  }
@@ -328,7 +328,7 @@ var PowerQueues = class extends PowerRedis {
328
328
  const filteredTasks = filtered[key];
329
329
  const keySplit = key.split(":");
330
330
  const attempt = Number(keySplit[0]);
331
- await this.addTasks(queueName + (attempt + 1 >= this.retryCount ? ":dlq" : ""), filteredTasks.map((task) => ({ ...task[1] })), {
331
+ await this.addTasks(queueName + (attempt >= this.retryCount - 1 ? ":dlq" : ""), filteredTasks.map((task) => ({ ...task[1] })), {
332
332
  createdAt: Number(keySplit[1]),
333
333
  job: keySplit[2],
334
334
  attempt: attempt + 1
@@ -435,14 +435,14 @@ var PowerQueues = class extends PowerRedis {
435
435
  let contended = 0, promises = [];
436
436
  for (const [id, payload, createdAt, job, idemKey, attempt] of tasks) {
437
437
  if (!this.executeSync) {
438
- promises.push((async () => {
438
+ promises.push(async () => {
439
439
  const r = await this.executeProcess(queueName, { id, payload, createdAt, job, idemKey, attempt });
440
440
  if (r.id) {
441
441
  result.push(r);
442
442
  } else if (r.contended) {
443
443
  contended++;
444
444
  }
445
- })());
445
+ });
446
446
  } else {
447
447
  const r = await this.executeProcess(queueName, { id, payload, createdAt, job, idemKey, attempt });
448
448
  if (r.id) {
@@ -453,9 +453,9 @@ var PowerQueues = class extends PowerRedis {
453
453
  }
454
454
  }
455
455
  if (!this.executeSync && promises.length > 0) {
456
- await Promise.all(promises);
456
+ await Promise.all(promises.map((item) => item));
457
457
  }
458
- await this.onBatchSuccess(queueName, result);
458
+ await this.onBatchReady(queueName, result);
459
459
  if (!isArrFilled(result) && contended > tasks.length >> 1) {
460
460
  await this.waitAbortable(15 + Math.floor(Math.random() * 35) + Math.min(250, 15 * contended + Math.floor(Math.random() * 40)));
461
461
  }
@@ -465,7 +465,7 @@ var PowerQueues = class extends PowerRedis {
465
465
  const keys = this.idempotencyKeys(queueName, String(task.idemKey));
466
466
  const allow = await this.idempotencyAllow(keys);
467
467
  if (allow === 1) {
468
- return { id: task.id };
468
+ return { contended: true };
469
469
  } else if (allow === 0) {
470
470
  let ttl = -2;
471
471
  try {
@@ -486,13 +486,8 @@ var PowerQueues = class extends PowerRedis {
486
486
  return await this.success(queueName, processed);
487
487
  } catch (err) {
488
488
  try {
489
- task.attempt = task.attempt + 1;
490
- await this.error(err, queueName, task);
491
- if (task.attempt >= this.retryCount) {
492
- await this.idempotencyFree(keys);
493
- return task;
494
- }
495
489
  await this.idempotencyFree(keys);
490
+ return await this.error(err, queueName, task);
496
491
  } catch (err2) {
497
492
  }
498
493
  } finally {
@@ -539,26 +534,26 @@ var PowerQueues = class extends PowerRedis {
539
534
  async error(err, queueName, task) {
540
535
  const dlqKey = queueName + ":dlq";
541
536
  const taskP = { ...task };
542
- if (task.attempt >= this.retryCount) {
543
- const statusKey = `${queueName}:${task.job}:`;
544
- await this.addTasks(dlqKey, [{ ...taskP.payload }], {
545
- createdAt: task.createdAt,
546
- job: task.job,
547
- attempt: task.attempt
548
- });
537
+ if (taskP.attempt >= this.retryCount - 1) {
538
+ const statusKey = `${queueName}:${taskP.job}:`;
549
539
  if (this.logStatus) {
550
540
  await this.incr(statusKey + "err", this.logStatusTimeout);
551
541
  await this.incr(statusKey + "ready", this.logStatusTimeout);
552
542
  }
543
+ await this.addTasks(dlqKey, [{ ...taskP.payload }], {
544
+ createdAt: taskP.createdAt,
545
+ job: taskP.job,
546
+ attempt: taskP.attempt
547
+ });
553
548
  } else {
554
- await this.onRetry(err, queueName, task);
549
+ await this.onRetry(err, queueName, taskP);
555
550
  await this.addTasks(queueName, [{ ...taskP.payload }], {
556
- createdAt: task.createdAt,
557
- job: task.job,
558
- attempt: task.attempt
551
+ createdAt: taskP.createdAt,
552
+ job: taskP.job,
553
+ attempt: (taskP.attempt || 0) + 1
559
554
  });
560
555
  }
561
- await this.onError(err, queueName, task);
556
+ return await this.onError(err, queueName, { ...taskP, attempt: (taskP.attempt || 0) + 1 });
562
557
  }
563
558
  async waitAbortable(ttl) {
564
559
  return new Promise((resolve) => {
@@ -568,7 +563,7 @@ var PowerQueues = class extends PowerRedis {
568
563
  }
569
564
  let delay;
570
565
  if (ttl > 0) {
571
- const base = Math.max(25, Math.min(ttl, 5e3));
566
+ const base = Math.max(25, Math.min(ttl, 4e3));
572
567
  const jitter = Math.floor(Math.min(base, 200) * Math.random());
573
568
  delay = base + jitter;
574
569
  } else {
@@ -820,12 +815,13 @@ var PowerQueues = class extends PowerRedis {
820
815
  async onExecute(queueName, task) {
821
816
  return task;
822
817
  }
823
- async onBatchSuccess(queueName, tasks) {
818
+ async onBatchReady(queueName, tasks) {
824
819
  }
825
820
  async onSuccess(queueName, task) {
826
821
  return task;
827
822
  }
828
823
  async onError(err, queueName, task) {
824
+ return task;
829
825
  }
830
826
  async onBatchError(err, queueName, tasks) {
831
827
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "power-queues",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "description": "High-performance Redis Streams queue for Node.js with Lua-powered bulk XADD, idempotent workers, heartbeat locks, stuck-task recovery, retries, DLQ, and distributed processing.",
5
5
  "author": "ihor-bielchenko",
6
6
  "license": "MIT",