bullmq 2.4.0 → 3.0.1

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 (122) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/classes/backoffs.d.ts +3 -6
  3. package/dist/cjs/classes/backoffs.js +8 -8
  4. package/dist/cjs/classes/backoffs.js.map +1 -1
  5. package/dist/cjs/classes/flow-producer.js +2 -1
  6. package/dist/cjs/classes/flow-producer.js.map +1 -1
  7. package/dist/cjs/classes/job.d.ts +3 -3
  8. package/dist/cjs/classes/job.js +1 -1
  9. package/dist/cjs/classes/job.js.map +1 -1
  10. package/dist/cjs/classes/queue-base.js +1 -1
  11. package/dist/cjs/classes/queue-base.js.map +1 -1
  12. package/dist/cjs/classes/queue.d.ts +8 -6
  13. package/dist/cjs/classes/queue.js +10 -9
  14. package/dist/cjs/classes/queue.js.map +1 -1
  15. package/dist/cjs/classes/repeat.d.ts +0 -1
  16. package/dist/cjs/classes/repeat.js +4 -5
  17. package/dist/cjs/classes/repeat.js.map +1 -1
  18. package/dist/cjs/classes/scripts.d.ts +6 -6
  19. package/dist/cjs/classes/scripts.js +43 -22
  20. package/dist/cjs/classes/scripts.js.map +1 -1
  21. package/dist/cjs/classes/worker.d.ts +12 -3
  22. package/dist/cjs/classes/worker.js +50 -34
  23. package/dist/cjs/classes/worker.js.map +1 -1
  24. package/dist/cjs/commands/includes/getRateLimitTTL.lua +13 -0
  25. package/dist/cjs/commands/includes/moveJobFromWaitToActive.lua +15 -34
  26. package/dist/cjs/commands/includes/promoteDelayedJobs.lua +0 -6
  27. package/dist/cjs/commands/moveToActive-9.lua +11 -2
  28. package/dist/cjs/commands/moveToDelayed-8.lua +63 -0
  29. package/dist/cjs/commands/moveToFinished-12.lua +8 -1
  30. package/dist/{esm/commands/retryJob-6.lua → cjs/commands/retryJob-8.lua} +15 -8
  31. package/dist/cjs/interfaces/advanced-options.d.ts +4 -4
  32. package/dist/cjs/interfaces/base-job-options.d.ts +0 -6
  33. package/dist/cjs/interfaces/queue-options.d.ts +0 -10
  34. package/dist/cjs/interfaces/rate-limiter-options.d.ts +0 -18
  35. package/dist/cjs/interfaces/repeat-options.d.ts +1 -6
  36. package/dist/cjs/scripts/index.d.ts +2 -2
  37. package/dist/cjs/scripts/index.js +2 -2
  38. package/dist/cjs/scripts/moveToActive-9.js +35 -36
  39. package/dist/cjs/scripts/moveToActive-9.js.map +1 -1
  40. package/dist/cjs/scripts/{moveToDelayed-5.d.ts → moveToDelayed-8.d.ts} +0 -0
  41. package/dist/cjs/scripts/moveToDelayed-8.js +116 -0
  42. package/dist/cjs/scripts/moveToDelayed-8.js.map +1 -0
  43. package/dist/cjs/scripts/moveToFinished-12.js +33 -36
  44. package/dist/cjs/scripts/moveToFinished-12.js.map +1 -1
  45. package/dist/cjs/scripts/{retryJob-6.d.ts → retryJob-8.d.ts} +0 -0
  46. package/dist/cjs/scripts/retryJob-8.js +112 -0
  47. package/dist/cjs/scripts/retryJob-8.js.map +1 -0
  48. package/dist/cjs/types/backoff-strategy.d.ts +2 -0
  49. package/dist/cjs/types/backoff-strategy.js +3 -0
  50. package/dist/cjs/types/backoff-strategy.js.map +1 -0
  51. package/dist/cjs/types/index.d.ts +2 -1
  52. package/dist/cjs/types/index.js +2 -1
  53. package/dist/cjs/types/index.js.map +1 -1
  54. package/dist/cjs/utils.d.ts +1 -3
  55. package/dist/cjs/utils.js +1 -13
  56. package/dist/cjs/utils.js.map +1 -1
  57. package/dist/esm/classes/backoffs.d.ts +3 -6
  58. package/dist/esm/classes/backoffs.js +8 -8
  59. package/dist/esm/classes/backoffs.js.map +1 -1
  60. package/dist/esm/classes/flow-producer.js +3 -2
  61. package/dist/esm/classes/flow-producer.js.map +1 -1
  62. package/dist/esm/classes/job.d.ts +3 -3
  63. package/dist/esm/classes/job.js +1 -1
  64. package/dist/esm/classes/job.js.map +1 -1
  65. package/dist/esm/classes/queue-base.js +1 -1
  66. package/dist/esm/classes/queue-base.js.map +1 -1
  67. package/dist/esm/classes/queue.d.ts +8 -6
  68. package/dist/esm/classes/queue.js +11 -10
  69. package/dist/esm/classes/queue.js.map +1 -1
  70. package/dist/esm/classes/repeat.d.ts +0 -1
  71. package/dist/esm/classes/repeat.js +4 -5
  72. package/dist/esm/classes/repeat.js.map +1 -1
  73. package/dist/esm/classes/scripts.d.ts +6 -6
  74. package/dist/esm/classes/scripts.js +41 -20
  75. package/dist/esm/classes/scripts.js.map +1 -1
  76. package/dist/esm/classes/worker.d.ts +12 -3
  77. package/dist/esm/classes/worker.js +50 -34
  78. package/dist/esm/classes/worker.js.map +1 -1
  79. package/dist/esm/commands/includes/getRateLimitTTL.lua +13 -0
  80. package/dist/esm/commands/includes/moveJobFromWaitToActive.lua +15 -34
  81. package/dist/esm/commands/includes/promoteDelayedJobs.lua +0 -6
  82. package/dist/esm/commands/moveToActive-9.lua +11 -2
  83. package/dist/esm/commands/moveToDelayed-8.lua +63 -0
  84. package/dist/esm/commands/moveToFinished-12.lua +8 -1
  85. package/dist/{cjs/commands/retryJob-6.lua → esm/commands/retryJob-8.lua} +15 -8
  86. package/dist/esm/interfaces/advanced-options.d.ts +4 -4
  87. package/dist/esm/interfaces/base-job-options.d.ts +0 -6
  88. package/dist/esm/interfaces/queue-options.d.ts +0 -10
  89. package/dist/esm/interfaces/rate-limiter-options.d.ts +0 -18
  90. package/dist/esm/interfaces/repeat-options.d.ts +1 -6
  91. package/dist/esm/scripts/index.d.ts +2 -2
  92. package/dist/esm/scripts/index.js +2 -2
  93. package/dist/esm/scripts/moveToActive-9.js +35 -36
  94. package/dist/esm/scripts/moveToActive-9.js.map +1 -1
  95. package/dist/esm/scripts/{moveToDelayed-5.d.ts → moveToDelayed-8.d.ts} +0 -0
  96. package/dist/esm/scripts/moveToDelayed-8.js +113 -0
  97. package/dist/esm/scripts/moveToDelayed-8.js.map +1 -0
  98. package/dist/esm/scripts/moveToFinished-12.js +33 -36
  99. package/dist/esm/scripts/moveToFinished-12.js.map +1 -1
  100. package/dist/esm/scripts/{retryJob-6.d.ts → retryJob-8.d.ts} +0 -0
  101. package/dist/esm/scripts/retryJob-8.js +109 -0
  102. package/dist/esm/scripts/retryJob-8.js.map +1 -0
  103. package/dist/esm/types/backoff-strategy.d.ts +2 -0
  104. package/dist/esm/types/backoff-strategy.js +2 -0
  105. package/dist/esm/types/backoff-strategy.js.map +1 -0
  106. package/dist/esm/types/index.d.ts +2 -1
  107. package/dist/esm/types/index.js +2 -1
  108. package/dist/esm/types/index.js.map +1 -1
  109. package/dist/esm/utils.d.ts +1 -3
  110. package/dist/esm/utils.js +0 -11
  111. package/dist/esm/utils.js.map +1 -1
  112. package/package.json +1 -1
  113. package/dist/cjs/commands/moveToDelayed-5.lua +0 -54
  114. package/dist/cjs/scripts/moveToDelayed-5.js +0 -52
  115. package/dist/cjs/scripts/moveToDelayed-5.js.map +0 -1
  116. package/dist/cjs/scripts/retryJob-6.js +0 -60
  117. package/dist/cjs/scripts/retryJob-6.js.map +0 -1
  118. package/dist/esm/commands/moveToDelayed-5.lua +0 -54
  119. package/dist/esm/scripts/moveToDelayed-5.js +0 -49
  120. package/dist/esm/scripts/moveToDelayed-5.js.map +0 -1
  121. package/dist/esm/scripts/retryJob-6.js +0 -57
  122. package/dist/esm/scripts/retryJob-6.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ const content = `--[[
2
+ Moves job from active to delayed set.
3
+ Input:
4
+ KEYS[1] wait key
5
+ KEYS[2] active key
6
+ KEYS[3] priority key
7
+ KEYS[4] delayed key
8
+ KEYS[5] job key
9
+ KEYS[6] events stream
10
+ KEYS[7] paused key
11
+ KEYS[8] meta key
12
+ ARGV[1] key prefix
13
+ ARGV[2] timestamp
14
+ ARGV[3] delayedTimestamp
15
+ ARGV[4] the id of the job
16
+ ARGV[5] queue token
17
+ Output:
18
+ 0 - OK
19
+ -1 - Missing job.
20
+ -3 - Job not in active set.
21
+ Events:
22
+ - delayed key.
23
+ ]]
24
+ local rcall = redis.call
25
+ -- Includes
26
+ --[[
27
+ Updates the delay set, by moving delayed jobs that should
28
+ be processed now to "wait".
29
+ Events:
30
+ 'waiting'
31
+ ]]
32
+ local rcall = redis.call
33
+ -- Includes
34
+ --[[
35
+ Function to add job considering priority.
36
+ ]]
37
+ local function addJobWithPriority(priorityKey, priority, targetKey, jobId)
38
+ rcall("ZADD", priorityKey, priority, jobId)
39
+ local count = rcall("ZCOUNT", priorityKey, 0, priority)
40
+ local len = rcall("LLEN", targetKey)
41
+ local id = rcall("LINDEX", targetKey, len - (count - 1))
42
+ if id then
43
+ rcall("LINSERT", targetKey, "BEFORE", id, jobId)
44
+ else
45
+ rcall("RPUSH", targetKey, jobId)
46
+ end
47
+ end
48
+ --[[
49
+ Function to check for the meta.paused key to decide if we are paused or not
50
+ (since an empty list and !EXISTS are not really the same).
51
+ ]]
52
+ local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
53
+ if rcall("HEXISTS", queueMetaKey, "paused") ~= 1 then
54
+ return waitKey
55
+ else
56
+ return pausedKey
57
+ end
58
+ end
59
+ -- Try to get as much as 1000 jobs at once, and returns the nextTimestamp if
60
+ -- there are more delayed jobs to process.
61
+ local function promoteDelayedJobs(delayedKey, waitKey, priorityKey, pausedKey,
62
+ metaKey, eventStreamKey, prefix, timestamp)
63
+ local jobs = rcall("ZRANGEBYSCORE", delayedKey, 0, (timestamp + 1) * 0x1000, "LIMIT", 0, 1000)
64
+ if (#jobs > 0) then
65
+ rcall("ZREM", delayedKey, unpack(jobs))
66
+ -- check if we need to use push in paused instead of waiting
67
+ local target = getTargetQueueList(metaKey, waitKey, pausedKey)
68
+ for _, jobId in ipairs(jobs) do
69
+ local priority =
70
+ tonumber(rcall("HGET", prefix .. jobId, "priority")) or 0
71
+ if priority == 0 then
72
+ -- LIFO or FIFO
73
+ rcall("LPUSH", target, jobId)
74
+ else
75
+ addJobWithPriority(priorityKey, priority, target, jobId)
76
+ end
77
+ -- Emit waiting event
78
+ rcall("XADD", eventStreamKey, "*", "event", "waiting", "jobId",
79
+ jobId, "prev", "delayed")
80
+ rcall("HSET", prefix .. jobId, "delay", 0)
81
+ end
82
+ end
83
+ end
84
+ promoteDelayedJobs(KEYS[4], KEYS[1], KEYS[3], KEYS[7], KEYS[8], KEYS[6], ARGV[1], ARGV[2])
85
+ if rcall("EXISTS", KEYS[5]) == 1 then
86
+ if ARGV[5] ~= "0" then
87
+ local lockKey = KEYS[5] .. ':lock'
88
+ if rcall("GET", lockKey) == ARGV[5] then
89
+ rcall("DEL", lockKey)
90
+ else
91
+ return -2
92
+ end
93
+ end
94
+ local jobId = ARGV[4]
95
+ local score = tonumber(ARGV[3])
96
+ local delayedTimestamp = (score / 0x1000)
97
+ local numRemovedElements = rcall("LREM", KEYS[2], -1, jobId)
98
+ if(numRemovedElements < 1) then
99
+ return -3
100
+ end
101
+ rcall("ZADD", KEYS[4], score, jobId)
102
+ rcall("XADD", KEYS[6], "*", "event", "delayed", "jobId", jobId, "delay", delayedTimestamp);
103
+ return 0
104
+ else
105
+ return -1
106
+ end
107
+ `;
108
+ export const moveToDelayed = {
109
+ name: 'moveToDelayed',
110
+ content,
111
+ keys: 8,
112
+ };
113
+ //# sourceMappingURL=moveToDelayed-8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moveToDelayed-8.js","sourceRoot":"","sources":["../../../src/scripts/moveToDelayed-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Gf,CAAC;AACF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -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 groupKey
137
- local groupKeyOpt = opts['limiter'] and opts['limiter']['groupKey'] or ""
138
- if groupKeyOpt ~= "" then
139
- groupKey = string.match(jobId, "[^:]+$")
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
- local limiterDuration = opts['limiter'] and opts['limiter']['duration']
153
- -- check if rate limit hit
154
- if jobCounter ~= nil and jobCounter > maxJobs then
155
- local exceedingJobs = jobCounter - maxJobs
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 == 1 then
168
- rcall("PEXPIRE", rateLimiterKey, limiterDuration)
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmhBf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
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,109 @@
1
+ const content = `--[[
2
+ Retries a failed job by moving it back to the wait queue.
3
+ Input:
4
+ KEYS[1] 'active',
5
+ KEYS[2] 'wait'
6
+ KEYS[3] 'paused'
7
+ KEYS[4] job key
8
+ KEYS[5] 'meta'
9
+ KEYS[6] events stream
10
+ KEYS[7] delayed key
11
+ KEYS[8] priority key
12
+ ARGV[1] key prefix
13
+ ARGV[2] timestamp
14
+ ARGV[3] pushCmd
15
+ ARGV[4] jobId
16
+ ARGV[5] token
17
+ Events:
18
+ 'waiting'
19
+ Output:
20
+ 0 - OK
21
+ -1 - Missing key
22
+ -2 - Missing lock
23
+ ]]
24
+ local rcall = redis.call
25
+ -- Includes
26
+ --[[
27
+ Function to check for the meta.paused key to decide if we are paused or not
28
+ (since an empty list and !EXISTS are not really the same).
29
+ ]]
30
+ local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
31
+ if rcall("HEXISTS", queueMetaKey, "paused") ~= 1 then
32
+ return waitKey
33
+ else
34
+ return pausedKey
35
+ end
36
+ end
37
+ --[[
38
+ Updates the delay set, by moving delayed jobs that should
39
+ be processed now to "wait".
40
+ Events:
41
+ 'waiting'
42
+ ]]
43
+ local rcall = redis.call
44
+ -- Includes
45
+ --[[
46
+ Function to add job considering priority.
47
+ ]]
48
+ local function addJobWithPriority(priorityKey, priority, targetKey, jobId)
49
+ rcall("ZADD", priorityKey, priority, jobId)
50
+ local count = rcall("ZCOUNT", priorityKey, 0, priority)
51
+ local len = rcall("LLEN", targetKey)
52
+ local id = rcall("LINDEX", targetKey, len - (count - 1))
53
+ if id then
54
+ rcall("LINSERT", targetKey, "BEFORE", id, jobId)
55
+ else
56
+ rcall("RPUSH", targetKey, jobId)
57
+ end
58
+ end
59
+ -- Try to get as much as 1000 jobs at once, and returns the nextTimestamp if
60
+ -- there are more delayed jobs to process.
61
+ local function promoteDelayedJobs(delayedKey, waitKey, priorityKey, pausedKey,
62
+ metaKey, eventStreamKey, prefix, timestamp)
63
+ local jobs = rcall("ZRANGEBYSCORE", delayedKey, 0, (timestamp + 1) * 0x1000, "LIMIT", 0, 1000)
64
+ if (#jobs > 0) then
65
+ rcall("ZREM", delayedKey, unpack(jobs))
66
+ -- check if we need to use push in paused instead of waiting
67
+ local target = getTargetQueueList(metaKey, waitKey, pausedKey)
68
+ for _, jobId in ipairs(jobs) do
69
+ local priority =
70
+ tonumber(rcall("HGET", prefix .. jobId, "priority")) or 0
71
+ if priority == 0 then
72
+ -- LIFO or FIFO
73
+ rcall("LPUSH", target, jobId)
74
+ else
75
+ addJobWithPriority(priorityKey, priority, target, jobId)
76
+ end
77
+ -- Emit waiting event
78
+ rcall("XADD", eventStreamKey, "*", "event", "waiting", "jobId",
79
+ jobId, "prev", "delayed")
80
+ rcall("HSET", prefix .. jobId, "delay", 0)
81
+ end
82
+ end
83
+ end
84
+ promoteDelayedJobs(KEYS[7], KEYS[2], KEYS[8], KEYS[3], KEYS[5], KEYS[6], ARGV[1], ARGV[2])
85
+ if rcall("EXISTS", KEYS[4]) == 1 then
86
+ if ARGV[5] ~= "0" then
87
+ local lockKey = KEYS[4] .. ':lock'
88
+ if rcall("GET", lockKey) == ARGV[5] then
89
+ rcall("DEL", lockKey)
90
+ else
91
+ return -2
92
+ end
93
+ end
94
+ local target = getTargetQueueList(KEYS[5], KEYS[2], KEYS[3])
95
+ rcall("LREM", KEYS[1], 0, ARGV[4])
96
+ rcall(ARGV[3], target, ARGV[4])
97
+ -- Emit waiting event
98
+ rcall("XADD", KEYS[6], "*", "event", "waiting", "jobId", ARGV[4], "prev", "failed");
99
+ return 0
100
+ else
101
+ return -1
102
+ end
103
+ `;
104
+ export const retryJob = {
105
+ name: 'retryJob',
106
+ content,
107
+ keys: 8,
108
+ };
109
+ //# sourceMappingURL=retryJob-8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retryJob-8.js","sourceRoot":"","sources":["../../../src/scripts/retryJob-8.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsGf,CAAC;AACF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,UAAU;IAChB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Job } from '../classes/job';
2
+ export declare type BackoffStrategy = (attemptsMade?: number, type?: string, err?: Error, job?: Job) => Promise<number> | number;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backoff-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff-strategy.js","sourceRoot":"","sources":["../../../src/types/backoff-strategy.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
- export * from './repeat-strategy';
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';
@@ -1,6 +1,7 @@
1
- export * from './repeat-strategy';
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,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,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"}
@@ -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, QueueOptions, RedisClient } from './interfaces';
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;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bullmq",
3
- "version": "2.4.0",
3
+ "version": "3.0.1",
4
4
  "description": "Queue for messages and jobs based on Redis",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -1,54 +0,0 @@
1
- --[[
2
- Moves job from active to delayed set.
3
-
4
- Input:
5
- KEYS[1] active key
6
- KEYS[2] delayed key
7
- KEYS[3] job key
8
- KEYS[4] events stream
9
- KEYS[5] delayed stream
10
-
11
- ARGV[1] delayedTimestamp
12
- ARGV[2] the id of the job
13
- ARGV[3] queue token
14
-
15
- Output:
16
- 0 - OK
17
- -1 - Missing job.
18
- -3 - Job not in active set.
19
-
20
- Events:
21
- - delayed key.
22
- ]]
23
- local rcall = redis.call
24
-
25
- if rcall("EXISTS", KEYS[3]) == 1 then
26
-
27
- if ARGV[3] ~= "0" then
28
- local lockKey = KEYS[3] .. ':lock'
29
- if rcall("GET", lockKey) == ARGV[3] then
30
- rcall("DEL", lockKey)
31
- else
32
- return -2
33
- end
34
- end
35
-
36
- local jobId = ARGV[2]
37
- local score = tonumber(ARGV[1])
38
- local delayedTimestamp = (score / 0x1000)
39
-
40
- local numRemovedElements = rcall("LREM", KEYS[1], -1, jobId)
41
-
42
- if(numRemovedElements < 1) then
43
- return -3
44
- end
45
-
46
- rcall("ZADD", KEYS[2], score, jobId)
47
-
48
- rcall("XADD", KEYS[4], "*", "event", "delayed", "jobId", jobId, "delay", delayedTimestamp);
49
- rcall("XADD", KEYS[5], "*", "nextTimestamp", delayedTimestamp);
50
-
51
- return 0
52
- else
53
- return -1
54
- end
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.moveToDelayed = void 0;
4
- const content = `--[[
5
- Moves job from active to delayed set.
6
- Input:
7
- KEYS[1] active key
8
- KEYS[2] delayed key
9
- KEYS[3] job key
10
- KEYS[4] events stream
11
- KEYS[5] delayed stream
12
- ARGV[1] delayedTimestamp
13
- ARGV[2] the id of the job
14
- ARGV[3] queue token
15
- Output:
16
- 0 - OK
17
- -1 - Missing job.
18
- -3 - Job not in active set.
19
- Events:
20
- - delayed key.
21
- ]]
22
- local rcall = redis.call
23
- if rcall("EXISTS", KEYS[3]) == 1 then
24
- if ARGV[3] ~= "0" then
25
- local lockKey = KEYS[3] .. ':lock'
26
- if rcall("GET", lockKey) == ARGV[3] then
27
- rcall("DEL", lockKey)
28
- else
29
- return -2
30
- end
31
- end
32
- local jobId = ARGV[2]
33
- local score = tonumber(ARGV[1])
34
- local delayedTimestamp = (score / 0x1000)
35
- local numRemovedElements = rcall("LREM", KEYS[1], -1, jobId)
36
- if(numRemovedElements < 1) then
37
- return -3
38
- end
39
- rcall("ZADD", KEYS[2], score, jobId)
40
- rcall("XADD", KEYS[4], "*", "event", "delayed", "jobId", jobId, "delay", delayedTimestamp);
41
- rcall("XADD", KEYS[5], "*", "nextTimestamp", delayedTimestamp);
42
- return 0
43
- else
44
- return -1
45
- end
46
- `;
47
- exports.moveToDelayed = {
48
- name: 'moveToDelayed',
49
- content,
50
- keys: 5,
51
- };
52
- //# sourceMappingURL=moveToDelayed-5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"moveToDelayed-5.js","sourceRoot":"","sources":["../../../src/scripts/moveToDelayed-5.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Cf,CAAC;AACW,QAAA,aAAa,GAAG;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -1,60 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.retryJob = void 0;
4
- const content = `--[[
5
- Retries a failed job by moving it back to the wait queue.
6
- Input:
7
- KEYS[1] 'active',
8
- KEYS[2] 'wait'
9
- KEYS[3] 'paused'
10
- KEYS[4] job key
11
- KEYS[5] 'meta'
12
- KEYS[6] events stream
13
- ARGV[1] pushCmd
14
- ARGV[2] jobId
15
- ARGV[3] token
16
- Events:
17
- 'waiting'
18
- Output:
19
- 0 - OK
20
- -1 - Missing key
21
- -2 - Missing lock
22
- ]]
23
- local rcall = redis.call
24
- -- Includes
25
- --[[
26
- Function to check for the meta.paused key to decide if we are paused or not
27
- (since an empty list and !EXISTS are not really the same).
28
- ]]
29
- local function getTargetQueueList(queueMetaKey, waitKey, pausedKey)
30
- if rcall("HEXISTS", queueMetaKey, "paused") ~= 1 then
31
- return waitKey
32
- else
33
- return pausedKey
34
- end
35
- end
36
- if rcall("EXISTS", KEYS[4]) == 1 then
37
- if ARGV[3] ~= "0" then
38
- local lockKey = KEYS[4] .. ':lock'
39
- if rcall("GET", lockKey) == ARGV[3] then
40
- rcall("DEL", lockKey)
41
- else
42
- return -2
43
- end
44
- end
45
- local target = getTargetQueueList(KEYS[5], KEYS[2], KEYS[3])
46
- rcall("LREM", KEYS[1], 0, ARGV[2])
47
- rcall(ARGV[1], target, ARGV[2])
48
- -- Emit waiting event
49
- rcall("XADD", KEYS[6], "*", "event", "waiting", "jobId", ARGV[2], "prev", "failed");
50
- return 0
51
- else
52
- return -1
53
- end
54
- `;
55
- exports.retryJob = {
56
- name: 'retryJob',
57
- content,
58
- keys: 6,
59
- };
60
- //# sourceMappingURL=retryJob-6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retryJob-6.js","sourceRoot":"","sources":["../../../src/scripts/retryJob-6.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDf,CAAC;AACW,QAAA,QAAQ,GAAG;IACtB,IAAI,EAAE,UAAU;IAChB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}