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 +25 -29
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +25 -29
- package/package.json +1 -1
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 =
|
|
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)(
|
|
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)(
|
|
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
|
|
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(
|
|
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.
|
|
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 {
|
|
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 (
|
|
560
|
-
const statusKey = `${queueName}:${
|
|
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,
|
|
566
|
+
await this.onRetry(err, queueName, taskP);
|
|
572
567
|
await this.addTasks(queueName, [{ ...taskP.payload }], {
|
|
573
|
-
createdAt:
|
|
574
|
-
job:
|
|
575
|
-
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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<
|
|
89
|
-
onBatchError(err: any, queueName: string, tasks: Array<[string, any
|
|
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
|
|
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
|
-
|
|
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<
|
|
89
|
-
onBatchError(err: any, queueName: string, tasks: Array<[string, any
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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.
|
|
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 {
|
|
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 (
|
|
543
|
-
const statusKey = `${queueName}:${
|
|
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,
|
|
549
|
+
await this.onRetry(err, queueName, taskP);
|
|
555
550
|
await this.addTasks(queueName, [{ ...taskP.payload }], {
|
|
556
|
-
createdAt:
|
|
557
|
-
job:
|
|
558
|
-
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,
|
|
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,
|
|
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
|
|
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.
|
|
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",
|