bullmq 2.4.0 → 3.0.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.
- package/dist/cjs/classes/backoffs.d.ts +3 -6
- package/dist/cjs/classes/backoffs.js +8 -8
- package/dist/cjs/classes/backoffs.js.map +1 -1
- package/dist/cjs/classes/flow-producer.js +2 -1
- package/dist/cjs/classes/flow-producer.js.map +1 -1
- package/dist/cjs/classes/job.d.ts +3 -3
- package/dist/cjs/classes/job.js +1 -1
- package/dist/cjs/classes/job.js.map +1 -1
- package/dist/cjs/classes/queue-base.js +1 -1
- package/dist/cjs/classes/queue-base.js.map +1 -1
- package/dist/cjs/classes/queue.d.ts +8 -6
- package/dist/cjs/classes/queue.js +10 -9
- package/dist/cjs/classes/queue.js.map +1 -1
- package/dist/cjs/classes/repeat.d.ts +0 -1
- package/dist/cjs/classes/repeat.js +4 -5
- package/dist/cjs/classes/repeat.js.map +1 -1
- package/dist/cjs/classes/scripts.d.ts +4 -4
- package/dist/cjs/classes/scripts.js +9 -16
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/classes/worker.d.ts +12 -3
- package/dist/cjs/classes/worker.js +50 -34
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/commands/includes/getRateLimitTTL.lua +13 -0
- package/dist/cjs/commands/includes/moveJobFromWaitToActive.lua +15 -34
- package/dist/cjs/commands/includes/promoteDelayedJobs.lua +0 -6
- package/dist/cjs/commands/moveToActive-9.lua +11 -2
- package/dist/cjs/commands/moveToFinished-12.lua +8 -1
- package/dist/cjs/interfaces/advanced-options.d.ts +4 -4
- package/dist/cjs/interfaces/base-job-options.d.ts +0 -6
- package/dist/cjs/interfaces/queue-options.d.ts +0 -10
- package/dist/cjs/interfaces/rate-limiter-options.d.ts +0 -18
- package/dist/cjs/interfaces/repeat-options.d.ts +1 -6
- package/dist/cjs/scripts/moveToActive-9.js +35 -36
- package/dist/cjs/scripts/moveToActive-9.js.map +1 -1
- package/dist/cjs/scripts/moveToFinished-12.js +33 -36
- package/dist/cjs/scripts/moveToFinished-12.js.map +1 -1
- package/dist/cjs/types/backoff-strategy.d.ts +2 -0
- package/dist/cjs/types/backoff-strategy.js +3 -0
- package/dist/cjs/types/backoff-strategy.js.map +1 -0
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/types/index.js +2 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/utils.d.ts +1 -3
- package/dist/cjs/utils.js +1 -13
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/classes/backoffs.d.ts +3 -6
- package/dist/esm/classes/backoffs.js +8 -8
- package/dist/esm/classes/backoffs.js.map +1 -1
- package/dist/esm/classes/flow-producer.js +3 -2
- package/dist/esm/classes/flow-producer.js.map +1 -1
- package/dist/esm/classes/job.d.ts +3 -3
- package/dist/esm/classes/job.js +1 -1
- package/dist/esm/classes/job.js.map +1 -1
- package/dist/esm/classes/queue-base.js +1 -1
- package/dist/esm/classes/queue-base.js.map +1 -1
- package/dist/esm/classes/queue.d.ts +8 -6
- package/dist/esm/classes/queue.js +11 -10
- package/dist/esm/classes/queue.js.map +1 -1
- package/dist/esm/classes/repeat.d.ts +0 -1
- package/dist/esm/classes/repeat.js +4 -5
- package/dist/esm/classes/repeat.js.map +1 -1
- package/dist/esm/classes/scripts.d.ts +4 -4
- package/dist/esm/classes/scripts.js +7 -14
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/classes/worker.d.ts +12 -3
- package/dist/esm/classes/worker.js +50 -34
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/commands/includes/getRateLimitTTL.lua +13 -0
- package/dist/esm/commands/includes/moveJobFromWaitToActive.lua +15 -34
- package/dist/esm/commands/includes/promoteDelayedJobs.lua +0 -6
- package/dist/esm/commands/moveToActive-9.lua +11 -2
- package/dist/esm/commands/moveToFinished-12.lua +8 -1
- package/dist/esm/interfaces/advanced-options.d.ts +4 -4
- package/dist/esm/interfaces/base-job-options.d.ts +0 -6
- package/dist/esm/interfaces/queue-options.d.ts +0 -10
- package/dist/esm/interfaces/rate-limiter-options.d.ts +0 -18
- package/dist/esm/interfaces/repeat-options.d.ts +1 -6
- package/dist/esm/scripts/moveToActive-9.js +35 -36
- package/dist/esm/scripts/moveToActive-9.js.map +1 -1
- package/dist/esm/scripts/moveToFinished-12.js +33 -36
- package/dist/esm/scripts/moveToFinished-12.js.map +1 -1
- package/dist/esm/types/backoff-strategy.d.ts +2 -0
- package/dist/esm/types/backoff-strategy.js +2 -0
- package/dist/esm/types/backoff-strategy.js.map +1 -0
- package/dist/esm/types/index.d.ts +2 -1
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils.d.ts +1 -3
- package/dist/esm/utils.js +0 -11
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
@@ -131,41 +131,25 @@ end
|
|
131
131
|
local function moveJobFromWaitToActive(keys, keyPrefix, jobId, processedOn, opts)
|
132
132
|
-- Check if we need to perform rate limiting.
|
133
133
|
local maxJobs = tonumber(opts['limiter'] and opts['limiter']['max'])
|
134
|
+
local expireTime
|
134
135
|
if(maxJobs) then
|
135
136
|
local rateLimiterKey = keys[6];
|
136
|
-
local
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
if groupKey ~= jobId then
|
141
|
-
rateLimiterKey = rateLimiterKey .. ":" .. groupKey
|
142
|
-
end
|
143
|
-
end
|
144
|
-
local jobCounter
|
145
|
-
if groupKey ~= nil then
|
146
|
-
if rateLimiterKey ~= keys[6] then
|
147
|
-
jobCounter = tonumber(rcall("INCR", rateLimiterKey))
|
148
|
-
end
|
149
|
-
else
|
150
|
-
jobCounter = tonumber(rcall("INCR", rateLimiterKey))
|
137
|
+
local jobCounter = tonumber(rcall("INCR", rateLimiterKey))
|
138
|
+
if jobCounter == 1 then
|
139
|
+
local limiterDuration = opts['limiter'] and opts['limiter']['duration']
|
140
|
+
rcall("PEXPIRE", rateLimiterKey, limiterDuration)
|
151
141
|
end
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
local expireTime = tonumber(rcall("PTTL", rateLimiterKey))
|
157
|
-
local delay = expireTime + ((exceedingJobs - 1) * limiterDuration) / maxJobs;
|
158
|
-
local timestamp = delay + tonumber(processedOn)
|
159
|
-
-- put job into delayed queue
|
160
|
-
rcall("ZADD", keys[7], timestamp * 0x1000 + bit.band(jobCounter, 0xfff), jobId);
|
161
|
-
rcall("XADD", keys[4], "*", "event", "delayed", "jobId", jobId, "delay", timestamp);
|
162
|
-
-- remove from active queue
|
142
|
+
-- check if we passed rate limit, we need to remove the job and return expireTime
|
143
|
+
if jobCounter > maxJobs then
|
144
|
+
expireTime = rcall("PTTL", rateLimiterKey)
|
145
|
+
-- remove from active queue and add back to the wait list
|
163
146
|
rcall("LREM", keys[2], 1, jobId)
|
147
|
+
rcall("RPUSH", keys[1], jobId)
|
164
148
|
-- Return when we can process more jobs
|
165
|
-
return expireTime
|
149
|
+
return {0, 0, expireTime}
|
166
150
|
else
|
167
|
-
if jobCounter ==
|
168
|
-
rcall("
|
151
|
+
if jobCounter == maxJobs then
|
152
|
+
expireTime = rcall("PTTL", rateLimiterKey)
|
169
153
|
end
|
170
154
|
end
|
171
155
|
end
|
@@ -179,7 +163,7 @@ local function moveJobFromWaitToActive(keys, keyPrefix, jobId, processedOn, opts
|
|
179
163
|
rcall("XADD", keys[4], "*", "event", "active", "jobId", jobId, "prev", "waiting")
|
180
164
|
rcall("HSET", jobKey, "processedOn", processedOn)
|
181
165
|
rcall("HINCRBY", jobKey, "attemptsMade", 1)
|
182
|
-
return {rcall("HGETALL", jobKey), jobId} -- get job data
|
166
|
+
return {rcall("HGETALL", jobKey), jobId, expireTime} -- get job data
|
183
167
|
end
|
184
168
|
--[[
|
185
169
|
Function to recursively move from waitingChildren to failed.
|
@@ -263,11 +247,6 @@ local function promoteDelayedJobs(delayedKey, waitKey, priorityKey, pausedKey,
|
|
263
247
|
rcall("HSET", prefix .. jobId, "delay", 0)
|
264
248
|
end
|
265
249
|
end
|
266
|
-
local nextTimestamp = rcall("ZRANGE", delayedKey, 0, 0, "WITHSCORES")[2]
|
267
|
-
if (nextTimestamp ~= nil) then
|
268
|
-
nextTimestamp = nextTimestamp / 0x1000
|
269
|
-
end
|
270
|
-
return nextTimestamp
|
271
250
|
end
|
272
251
|
--[[
|
273
252
|
Functions to remove jobs by max age.
|
@@ -418,6 +397,19 @@ local function updateParentDepsIfNeeded(parentKey, parentQueueKey, parentDepende
|
|
418
397
|
rcall("XADD", parentQueueKey .. ":events", "*", "event", "waiting", "jobId", parentId, "prev", "waiting-children")
|
419
398
|
end
|
420
399
|
end
|
400
|
+
local function getRateLimitTTL(opts, limiterKey)
|
401
|
+
local maxJobs = tonumber(opts['limiter'] and opts['limiter']['max'])
|
402
|
+
if maxJobs then
|
403
|
+
local jobCounter = tonumber(rcall("GET", limiterKey))
|
404
|
+
if jobCounter ~= nil and jobCounter >= maxJobs then
|
405
|
+
local pttl = rcall("PTTL", KEYS[6])
|
406
|
+
if pttl > 0 then
|
407
|
+
return pttl
|
408
|
+
end
|
409
|
+
end
|
410
|
+
end
|
411
|
+
return 0
|
412
|
+
end
|
421
413
|
local jobIdKey = KEYS[10]
|
422
414
|
if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
423
415
|
local opts = cmsgpack.unpack(ARGV[9])
|
@@ -504,6 +496,11 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
504
496
|
if (ARGV[7] == "1") then
|
505
497
|
-- Check if there are delayed jobs that can be promoted
|
506
498
|
promoteDelayedJobs(KEYS[7], KEYS[1], KEYS[3], KEYS[8], KEYS[11], KEYS[4], ARGV[8], timestamp)
|
499
|
+
-- Check if we are rate limited first.
|
500
|
+
local pttl = getRateLimitTTL(opts, KEYS[6])
|
501
|
+
if pttl > 0 then
|
502
|
+
return { 0, 0, pttl }
|
503
|
+
end
|
507
504
|
jobId = rcall("RPOPLPUSH", KEYS[1], KEYS[2])
|
508
505
|
if jobId == "0" then
|
509
506
|
rcall("LREM", KEYS[2], 1, 0)
|
@@ -515,7 +512,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
515
512
|
if (nextTimestamp ~= nil) then
|
516
513
|
-- The result is guaranteed to be positive, since the
|
517
514
|
-- ZRANGEBYSCORE command would have return a job otherwise.
|
518
|
-
return nextTimestamp - timestamp
|
515
|
+
return {0, 0, 0, nextTimestamp - timestamp}
|
519
516
|
end
|
520
517
|
end
|
521
518
|
local waitLen = rcall("LLEN", KEYS[1])
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"moveToFinished-12.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-12.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG
|
1
|
+
{"version":3,"file":"moveToFinished-12.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-12.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAghBf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"backoff-strategy.js","sourceRoot":"","sources":["../../../src/types/backoff-strategy.ts"],"names":[],"mappings":""}
|
package/dist/esm/types/index.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
export * from './
|
1
|
+
export * from './backoff-strategy';
|
2
2
|
export * from './finished-status';
|
3
3
|
export * from './job-json-sandbox';
|
4
4
|
export * from './job-options';
|
5
5
|
export * from './job-type';
|
6
|
+
export * from './repeat-strategy';
|
6
7
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC"}
|
package/dist/esm/utils.d.ts
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
/// <reference types="node" />
|
2
2
|
/// <reference types="node" />
|
3
3
|
import { Cluster, Redis } from 'ioredis';
|
4
|
-
import { ChildMessage, ParentMessage,
|
5
|
-
import { JobsOptions } from './types';
|
4
|
+
import { ChildMessage, ParentMessage, RedisClient } from './interfaces';
|
6
5
|
import { ChildProcess } from 'child_process';
|
7
6
|
export declare const errorObject: {
|
8
7
|
[index: string]: any;
|
@@ -24,7 +23,6 @@ export declare function getParentKey(opts: {
|
|
24
23
|
id: string;
|
25
24
|
queue: string;
|
26
25
|
}): string;
|
27
|
-
export declare function jobIdForGroup(jobOpts: JobsOptions, data: any, queueOpts: QueueOptions): string;
|
28
26
|
export declare const clientCommandMessageReg: RegExp;
|
29
27
|
export declare const DELAY_TIME_5 = 5000;
|
30
28
|
export declare const DELAY_TIME_1 = 100;
|
package/dist/esm/utils.js
CHANGED
@@ -2,8 +2,6 @@ import { Cluster } from 'ioredis';
|
|
2
2
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
3
3
|
// @ts-ignore
|
4
4
|
import { CONNECTION_CLOSED_ERROR_MSG } from 'ioredis/built/utils';
|
5
|
-
import { v4 } from 'uuid';
|
6
|
-
import { get } from 'lodash';
|
7
5
|
import * as semver from 'semver';
|
8
6
|
export const errorObject = { value: null };
|
9
7
|
export function tryCatch(fn, ctx, args) {
|
@@ -84,15 +82,6 @@ export function getParentKey(opts) {
|
|
84
82
|
return `${opts.queue}:${opts.id}`;
|
85
83
|
}
|
86
84
|
}
|
87
|
-
export function jobIdForGroup(jobOpts, data, queueOpts) {
|
88
|
-
const jobId = jobOpts === null || jobOpts === void 0 ? void 0 : jobOpts.jobId;
|
89
|
-
const groupKeyPath = get(queueOpts, 'limiter.groupKey');
|
90
|
-
const groupKey = get(data, groupKeyPath);
|
91
|
-
if (groupKeyPath && !(typeof groupKey === 'undefined')) {
|
92
|
-
return `${jobId || v4()}:${groupKey}`;
|
93
|
-
}
|
94
|
-
return jobId;
|
95
|
-
}
|
96
85
|
export const clientCommandMessageReg = /ERR unknown command ['`]\s*client\s*['`]/;
|
97
86
|
export const DELAY_TIME_5 = 5000;
|
98
87
|
export const DELAY_TIME_1 = 100;
|
package/dist/esm/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,SAAS,CAAC;AACzC,6DAA6D;AAC7D,aAAa;AACb,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|