bullmq 5.58.7 → 5.58.9

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 (79) hide show
  1. package/dist/cjs/classes/job-scheduler.js +22 -24
  2. package/dist/cjs/classes/job-scheduler.js.map +1 -1
  3. package/dist/cjs/classes/job.js +6 -2
  4. package/dist/cjs/classes/job.js.map +1 -1
  5. package/dist/cjs/classes/queue-getters.js +6 -19
  6. package/dist/cjs/classes/queue-getters.js.map +1 -1
  7. package/dist/cjs/classes/queue.js +1 -1
  8. package/dist/cjs/classes/queue.js.map +1 -1
  9. package/dist/cjs/classes/scripts.js +47 -11
  10. package/dist/cjs/classes/scripts.js.map +1 -1
  11. package/dist/cjs/classes/worker.js +53 -18
  12. package/dist/cjs/classes/worker.js.map +1 -1
  13. package/dist/cjs/commands/addJobScheduler-11.lua +81 -25
  14. package/dist/cjs/commands/addRepeatableJob-2.lua +1 -1
  15. package/dist/cjs/commands/getMetrics-2.lua +19 -0
  16. package/dist/cjs/commands/includes/addJobFromScheduler.lua +5 -3
  17. package/dist/cjs/commands/includes/getJobSchedulerEveryNextMillis.lua +28 -0
  18. package/dist/cjs/commands/includes/storeJobScheduler.lua +15 -1
  19. package/dist/cjs/commands/moveStalledJobsToWait-8.lua +14 -1
  20. package/dist/cjs/commands/updateJobScheduler-12.lua +50 -14
  21. package/dist/cjs/enums/error-code.js +2 -0
  22. package/dist/cjs/enums/error-code.js.map +1 -1
  23. package/dist/cjs/scripts/addJobScheduler-11.js +108 -25
  24. package/dist/cjs/scripts/addJobScheduler-11.js.map +1 -1
  25. package/dist/cjs/scripts/addRepeatableJob-2.js +1 -1
  26. package/dist/cjs/scripts/getMetrics-2.js +25 -0
  27. package/dist/cjs/scripts/getMetrics-2.js.map +1 -0
  28. package/dist/cjs/scripts/index.js +1 -0
  29. package/dist/cjs/scripts/index.js.map +1 -1
  30. package/dist/cjs/scripts/moveStalledJobsToWait-8.js +11 -1
  31. package/dist/cjs/scripts/moveStalledJobsToWait-8.js.map +1 -1
  32. package/dist/cjs/scripts/updateJobScheduler-12.js +66 -17
  33. package/dist/cjs/scripts/updateJobScheduler-12.js.map +1 -1
  34. package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
  35. package/dist/cjs/version.js +1 -1
  36. package/dist/esm/classes/job-scheduler.js +22 -24
  37. package/dist/esm/classes/job-scheduler.js.map +1 -1
  38. package/dist/esm/classes/job.js +6 -2
  39. package/dist/esm/classes/job.js.map +1 -1
  40. package/dist/esm/classes/queue-getters.js +6 -19
  41. package/dist/esm/classes/queue-getters.js.map +1 -1
  42. package/dist/esm/classes/queue.d.ts +1 -1
  43. package/dist/esm/classes/queue.js +1 -1
  44. package/dist/esm/classes/queue.js.map +1 -1
  45. package/dist/esm/classes/scripts.d.ts +2 -1
  46. package/dist/esm/classes/scripts.js +47 -11
  47. package/dist/esm/classes/scripts.js.map +1 -1
  48. package/dist/esm/classes/worker.js +53 -18
  49. package/dist/esm/classes/worker.js.map +1 -1
  50. package/dist/esm/commands/addJobScheduler-11.lua +81 -25
  51. package/dist/esm/commands/addRepeatableJob-2.lua +1 -1
  52. package/dist/esm/commands/getMetrics-2.lua +19 -0
  53. package/dist/esm/commands/includes/addJobFromScheduler.lua +5 -3
  54. package/dist/esm/commands/includes/getJobSchedulerEveryNextMillis.lua +28 -0
  55. package/dist/esm/commands/includes/storeJobScheduler.lua +15 -1
  56. package/dist/esm/commands/moveStalledJobsToWait-8.lua +14 -1
  57. package/dist/esm/commands/updateJobScheduler-12.lua +50 -14
  58. package/dist/esm/enums/error-code.d.ts +3 -1
  59. package/dist/esm/enums/error-code.js +2 -0
  60. package/dist/esm/enums/error-code.js.map +1 -1
  61. package/dist/esm/interfaces/job-scheduler-json.d.ts +1 -0
  62. package/dist/esm/interfaces/repeatable-options.d.ts +1 -0
  63. package/dist/esm/scripts/addJobScheduler-11.js +108 -25
  64. package/dist/esm/scripts/addJobScheduler-11.js.map +1 -1
  65. package/dist/esm/scripts/addRepeatableJob-2.js +1 -1
  66. package/dist/esm/scripts/getMetrics-2.d.ts +5 -0
  67. package/dist/esm/scripts/getMetrics-2.js +22 -0
  68. package/dist/esm/scripts/getMetrics-2.js.map +1 -0
  69. package/dist/esm/scripts/index.d.ts +1 -0
  70. package/dist/esm/scripts/index.js +1 -0
  71. package/dist/esm/scripts/index.js.map +1 -1
  72. package/dist/esm/scripts/moveStalledJobsToWait-8.js +11 -1
  73. package/dist/esm/scripts/moveStalledJobsToWait-8.js.map +1 -1
  74. package/dist/esm/scripts/updateJobScheduler-12.js +66 -17
  75. package/dist/esm/scripts/updateJobScheduler-12.js.map +1 -1
  76. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  77. package/dist/esm/version.d.ts +1 -1
  78. package/dist/esm/version.js +1 -1
  79. package/package.json +5 -5
@@ -22,19 +22,19 @@ const content = `--[[
22
22
  ARGV[7] producer id
23
23
  Output:
24
24
  next delayed job id - OK
25
- ]]
26
- local rcall = redis.call
25
+ ]] local rcall = redis.call
27
26
  local repeatKey = KEYS[1]
28
27
  local delayedKey = KEYS[2]
29
28
  local waitKey = KEYS[3]
30
29
  local pausedKey = KEYS[4]
31
30
  local metaKey = KEYS[5]
32
31
  local prioritizedKey = KEYS[6]
33
- local nextMillis = ARGV[1]
32
+ local nextMillis = tonumber(ARGV[1])
34
33
  local jobSchedulerId = ARGV[2]
35
- local timestamp = ARGV[5]
34
+ local timestamp = tonumber(ARGV[5])
36
35
  local prefixKey = ARGV[6]
37
36
  local producerId = ARGV[7]
37
+ local jobOpts = cmsgpack.unpack(ARGV[4])
38
38
  -- Includes
39
39
  --[[
40
40
  Add delay marker if needed.
@@ -194,10 +194,11 @@ local function addJobInTargetList(targetKey, markerKey, pushCmd, isPausedOrMaxed
194
194
  rcall(pushCmd, targetKey, jobId)
195
195
  addBaseMarkerIfNeeded(markerKey, isPausedOrMaxed)
196
196
  end
197
- local function addJobFromScheduler(jobKey, jobId, rawOpts, waitKey, pausedKey, activeKey, metaKey,
197
+ local function addJobFromScheduler(jobKey, jobId, opts, waitKey, pausedKey, activeKey, metaKey,
198
198
  prioritizedKey, priorityCounter, delayedKey, markerKey, eventsKey, name, maxEvents, timestamp,
199
- data, jobSchedulerId)
200
- local opts = cmsgpack.unpack(rawOpts)
199
+ data, jobSchedulerId, repeatDelay)
200
+ opts['delay'] = repeatDelay
201
+ opts['jobId'] = jobId
201
202
  local delay, priority = storeJob(eventsKey, jobKey, jobId, name, data,
202
203
  opts, timestamp, nil, nil, jobSchedulerId)
203
204
  if delay ~= 0 then
@@ -227,18 +228,61 @@ local function getOrSetMaxEvents(metaKey)
227
228
  end
228
229
  return maxEvents
229
230
  end
230
- local schedulerKey = repeatKey .. ":" .. jobSchedulerId
231
- local nextDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. nextMillis
232
- local nextDelayedJobKey = schedulerKey .. ":" .. nextMillis
233
- -- Validate that scheduler exists.
231
+ local function getJobSchedulerEveryNextMillis(prevMillis, every, now, offset, startDate)
232
+ local nextMillis
233
+ if not prevMillis then
234
+ if startDate then
235
+ -- Assuming startDate is passed as milliseconds from JavaScript
236
+ nextMillis = tonumber(startDate)
237
+ nextMillis = nextMillis > now and nextMillis or now
238
+ else
239
+ nextMillis = now
240
+ end
241
+ else
242
+ nextMillis = prevMillis + every
243
+ -- check if we may have missed some iterations
244
+ if nextMillis < now then
245
+ nextMillis = math.floor(now / every) * every + every + (offset or 0)
246
+ end
247
+ end
248
+ if not offset or offset == 0 then
249
+ local timeSlot = math.floor(nextMillis / every) * every;
250
+ offset = nextMillis - timeSlot;
251
+ end
252
+ -- Return a tuple nextMillis, offset
253
+ return math.floor(nextMillis), math.floor(offset)
254
+ end
234
255
  local prevMillis = rcall("ZSCORE", repeatKey, jobSchedulerId)
256
+ -- Validate that scheduler exists.
257
+ -- If it does not exist we should not iterate anymore.
235
258
  if prevMillis then
259
+ prevMillis = tonumber(prevMillis)
260
+ local schedulerKey = repeatKey .. ":" .. jobSchedulerId
261
+ local schedulerAttributes = rcall("HMGET", schedulerKey, "name", "data", "every", "startDate", "offset")
262
+ local every = tonumber(schedulerAttributes[3])
263
+ local now = tonumber(timestamp)
264
+ -- If every is not found in scheduler attributes, try to get it from job options
265
+ if not every and jobOpts['repeat'] and jobOpts['repeat']['every'] then
266
+ every = tonumber(jobOpts['repeat']['every'])
267
+ end
268
+ if every then
269
+ local startDate = schedulerAttributes[4]
270
+ local jobOptsOffset = jobOpts['repeat'] and jobOpts['repeat']['offset'] or 0
271
+ local offset = schedulerAttributes[5] or jobOptsOffset or 0
272
+ local newOffset
273
+ nextMillis, newOffset = getJobSchedulerEveryNextMillis(prevMillis, every, now, offset, startDate)
274
+ if not offset then
275
+ rcall("HSET", schedulerKey, "offset", newOffset)
276
+ jobOpts['repeat']['offset'] = newOffset
277
+ end
278
+ end
279
+ local nextDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. nextMillis
280
+ local nextDelayedJobKey = schedulerKey .. ":" .. nextMillis
236
281
  local currentDelayedJobId = "repeat:" .. jobSchedulerId .. ":" .. prevMillis
237
282
  if producerId == currentDelayedJobId then
238
283
  local eventsKey = KEYS[9]
239
284
  local maxEvents = getOrSetMaxEvents(metaKey)
240
285
  if rcall("EXISTS", nextDelayedJobKey) ~= 1 then
241
- local schedulerAttributes = rcall("HMGET", schedulerKey, "name", "data")
242
286
  rcall("ZADD", repeatKey, nextMillis, jobSchedulerId)
243
287
  rcall("HINCRBY", schedulerKey, "ic", 1)
244
288
  rcall("INCR", KEYS[8])
@@ -248,17 +292,22 @@ if prevMillis then
248
292
  if templateData and templateData ~= '{}' then
249
293
  rcall("HSET", schedulerKey, "data", templateData)
250
294
  end
251
- addJobFromScheduler(nextDelayedJobKey, nextDelayedJobId, ARGV[4], waitKey, pausedKey,
252
- KEYS[12], metaKey, prioritizedKey, KEYS[10], delayedKey, KEYS[7], eventsKey,
253
- schedulerAttributes[1], maxEvents, ARGV[5], templateData or '{}', jobSchedulerId)
295
+ local delay = nextMillis - now
296
+ -- Fast Clamp delay to minimum of 0
297
+ if delay < 0 then
298
+ delay = 0
299
+ end
300
+ jobOpts["delay"] = delay
301
+ addJobFromScheduler(nextDelayedJobKey, nextDelayedJobId, jobOpts, waitKey, pausedKey, KEYS[12], metaKey,
302
+ prioritizedKey, KEYS[10], delayedKey, KEYS[7], eventsKey, schedulerAttributes[1], maxEvents, ARGV[5],
303
+ templateData or '{}', jobSchedulerId, delay)
254
304
  -- TODO: remove this workaround in next breaking change
255
305
  if KEYS[11] ~= "" then
256
306
  rcall("HSET", KEYS[11], "nrjid", nextDelayedJobId)
257
307
  end
258
308
  return nextDelayedJobId .. "" -- convert to string
259
309
  else
260
- rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event",
261
- "duplicated", "jobId", nextDelayedJobId)
310
+ rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "duplicated", "jobId", nextDelayedJobId)
262
311
  end
263
312
  end
264
313
  end
@@ -1 +1 @@
1
- {"version":3,"file":"updateJobScheduler-12.js","sourceRoot":"","sources":["../../../src/scripts/updateJobScheduler-12.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwQf,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
1
+ {"version":3,"file":"updateJobScheduler-12.js","sourceRoot":"","sources":["../../../src/scripts/updateJobScheduler-12.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyTf,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,oBAAoB;IAC1B,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}