bullmq 4.10.0 → 4.11.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.
@@ -62,8 +62,7 @@ export class ChildProcessor {
62
62
  this.status = ChildStatus.Started;
63
63
  this.currentJobPromise = (async () => {
64
64
  try {
65
- const job = wrapJob(jobJson, this.send);
66
- //console.log('el token', token, job.id)
65
+ const job = this.wrapJob(jobJson, this.send);
67
66
  const result = (await this.processor(job, token)) || {};
68
67
  await this.send({
69
68
  cmd: ParentCommand.Completed,
@@ -92,59 +91,59 @@ export class ChildProcessor {
92
91
  process.exit(process.exitCode || 0);
93
92
  }
94
93
  }
95
- }
96
- /**
97
- * Enhance the given job argument with some functions
98
- * that can be called from the sandboxed job processor.
99
- *
100
- * Note, the `job` argument is a JSON deserialized message
101
- * from the main node process to this forked child process,
102
- * the functions on the original job object are not in tact.
103
- * The wrapped job adds back some of those original functions.
104
- */
105
- function wrapJob(job, send) {
106
- let progressValue = job.progress;
107
- const updateProgress = async (progress) => {
108
- // Locally store reference to new progress value
109
- // so that we can return it from this process synchronously.
110
- progressValue = progress;
111
- // Send message to update job progress.
112
- await send({
113
- cmd: ParentCommand.Progress,
114
- value: progress,
115
- });
116
- };
117
- return Object.assign(Object.assign({}, job), { data: JSON.parse(job.data || '{}'), opts: job.opts, returnValue: JSON.parse(job.returnvalue || '{}'),
118
- /*
119
- * Emulate the real job `updateProgress` function, should works as `progress` function.
120
- */
121
- updateProgress,
122
- /*
123
- * Emulate the real job `log` function.
124
- */
125
- log: async (row) => {
126
- send({
127
- cmd: ParentCommand.Log,
128
- value: row,
129
- });
130
- },
131
- /*
132
- * Emulate the real job `moveToDelayed` function.
133
- */
134
- moveToDelayed: async (timestamp, token) => {
135
- send({
136
- cmd: ParentCommand.MoveToDelayed,
137
- value: { timestamp, token },
94
+ /**
95
+ * Enhance the given job argument with some functions
96
+ * that can be called from the sandboxed job processor.
97
+ *
98
+ * Note, the `job` argument is a JSON deserialized message
99
+ * from the main node process to this forked child process,
100
+ * the functions on the original job object are not in tact.
101
+ * The wrapped job adds back some of those original functions.
102
+ */
103
+ wrapJob(job, send) {
104
+ let progressValue = job.progress;
105
+ const updateProgress = async (progress) => {
106
+ // Locally store reference to new progress value
107
+ // so that we can return it from this process synchronously.
108
+ progressValue = progress;
109
+ // Send message to update job progress.
110
+ await send({
111
+ cmd: ParentCommand.Progress,
112
+ value: progress,
138
113
  });
139
- },
140
- /*
141
- * Emulate the real job `updateData` function.
142
- */
143
- updateData: async (data) => {
144
- send({
145
- cmd: ParentCommand.Update,
146
- value: data,
147
- });
148
- } });
114
+ };
115
+ return Object.assign(Object.assign({}, job), { data: JSON.parse(job.data || '{}'), opts: job.opts, returnValue: JSON.parse(job.returnvalue || '{}'),
116
+ /*
117
+ * Emulate the real job `updateProgress` function, should works as `progress` function.
118
+ */
119
+ updateProgress,
120
+ /*
121
+ * Emulate the real job `log` function.
122
+ */
123
+ log: async (row) => {
124
+ send({
125
+ cmd: ParentCommand.Log,
126
+ value: row,
127
+ });
128
+ },
129
+ /*
130
+ * Emulate the real job `moveToDelayed` function.
131
+ */
132
+ moveToDelayed: async (timestamp, token) => {
133
+ send({
134
+ cmd: ParentCommand.MoveToDelayed,
135
+ value: { timestamp, token },
136
+ });
137
+ },
138
+ /*
139
+ * Emulate the real job `updateData` function.
140
+ */
141
+ updateData: async (data) => {
142
+ send({
143
+ cmd: ParentCommand.Update,
144
+ value: data,
145
+ });
146
+ } });
147
+ }
149
148
  }
150
149
  //# sourceMappingURL=child-processor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"child-processor.js","sourceRoot":"","sources":["../../../src/classes/child-processor.ts"],"names":[],"mappings":"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"}
@@ -34,13 +34,19 @@ local result
34
34
  if ARGV[4] == "active" then
35
35
  result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], false)
36
36
  elseif ARGV[4] == "delayed" then
37
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"processedOn", "timestamp"})
37
+ rangeEnd = "+inf"
38
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
39
+ {"processedOn", "timestamp"}, false)
38
40
  elseif ARGV[4] == "prioritized" then
39
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"timestamp"})
41
+ rangeEnd = "+inf"
42
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
43
+ {"timestamp"}, false)
40
44
  elseif ARGV[4] == "wait" or ARGV[4] == "paused" then
41
45
  result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], true)
42
46
  else
43
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"finishedOn"} )
47
+ rangeEnd = ARGV[2]
48
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
49
+ {"finishedOn"}, true)
44
50
  end
45
51
 
46
52
  rcall("XADD", KEYS[2], "*", "event", "cleaned", "count", result[2])
@@ -30,7 +30,7 @@ local function cleanList(listKey, jobKeyPrefix, rangeStart, rangeEnd,
30
30
  -- Fetch all three of these (in that order) and use the first one that is set so that we'll leave jobs
31
31
  -- that have been active within the grace period:
32
32
  jobTS = getTimestamp(jobKey, {"finishedOn", "processedOn", "timestamp"})
33
- if (not jobTS or jobTS < timestamp) then
33
+ if (not jobTS or jobTS <= timestamp) then
34
34
  -- replace the entry with a deletion marker; the actual deletion will
35
35
  -- occur at the end of the script
36
36
  rcall("LSET", listKey, rangeEnd - jobIdsLen + i, deletionMarker)
@@ -9,8 +9,8 @@
9
9
  --- @include "getTimestamp"
10
10
  --- @include "removeJob"
11
11
 
12
- local function cleanSet(setKey, jobKeyPrefix, rangeStart, rangeEnd, timestamp, limit, attributes)
13
- local jobs = getJobsInZset(setKey, rangeStart, rangeEnd, timestamp, limit)
12
+ local function cleanSet(setKey, jobKeyPrefix, rangeEnd, timestamp, limit, attributes, isFinished)
13
+ local jobs = getJobsInZset(setKey, rangeEnd, limit)
14
14
  local deleted = {}
15
15
  local deletedCount = 0
16
16
  local jobTS
@@ -20,12 +20,18 @@ local function cleanSet(setKey, jobKeyPrefix, rangeStart, rangeEnd, timestamp, l
20
20
  end
21
21
 
22
22
  local jobKey = jobKeyPrefix .. job
23
- -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
24
- jobTS = getTimestamp(jobKey, attributes)
25
- if (not jobTS or jobTS < timestamp) then
23
+ if isFinished then
26
24
  removeJob(job, true, jobKeyPrefix)
27
25
  deletedCount = deletedCount + 1
28
26
  table.insert(deleted, job)
27
+ else
28
+ -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
29
+ jobTS = getTimestamp(jobKey, attributes)
30
+ if (not jobTS or jobTS <= timestamp) then
31
+ removeJob(job, true, jobKeyPrefix)
32
+ deletedCount = deletedCount + 1
33
+ table.insert(deleted, job)
34
+ end
29
35
  end
30
36
  end
31
37
 
@@ -2,11 +2,10 @@
2
2
  -- of items in a sorted set only run a single iteration. If we simply used
3
3
  -- ZRANGE, we may take a long time traversing through jobs that are within the
4
4
  -- grace period.
5
- local function getJobsInZset(zsetKey, rangeStart, rangeEnd, maxTimestamp, limit)
5
+ local function getJobsInZset(zsetKey, rangeEnd, limit)
6
6
  if limit > 0 then
7
- return rcall("ZRANGEBYSCORE", zsetKey, 0, maxTimestamp, "LIMIT", 0, limit)
7
+ return rcall("ZRANGEBYSCORE", zsetKey, 0, rangeEnd, "LIMIT", 0, limit)
8
8
  else
9
- return rcall("ZRANGE", zsetKey, rangeStart, rangeEnd)
9
+ return rcall("ZRANGEBYSCORE", zsetKey, 0, rangeEnd)
10
10
  end
11
11
  end
12
-
@@ -163,7 +163,7 @@ local function cleanList(listKey, jobKeyPrefix, rangeStart, rangeEnd,
163
163
  -- Fetch all three of these (in that order) and use the first one that is set so that we'll leave jobs
164
164
  -- that have been active within the grace period:
165
165
  jobTS = getTimestamp(jobKey, {"finishedOn", "processedOn", "timestamp"})
166
- if (not jobTS or jobTS < timestamp) then
166
+ if (not jobTS or jobTS <= timestamp) then
167
167
  -- replace the entry with a deletion marker; the actual deletion will
168
168
  -- occur at the end of the script
169
169
  rcall("LSET", listKey, rangeEnd - jobIdsLen + i, deletionMarker)
@@ -201,15 +201,15 @@ end
201
201
  -- of items in a sorted set only run a single iteration. If we simply used
202
202
  -- ZRANGE, we may take a long time traversing through jobs that are within the
203
203
  -- grace period.
204
- local function getJobsInZset(zsetKey, rangeStart, rangeEnd, maxTimestamp, limit)
204
+ local function getJobsInZset(zsetKey, rangeEnd, limit)
205
205
  if limit > 0 then
206
- return rcall("ZRANGEBYSCORE", zsetKey, 0, maxTimestamp, "LIMIT", 0, limit)
206
+ return rcall("ZRANGEBYSCORE", zsetKey, 0, rangeEnd, "LIMIT", 0, limit)
207
207
  else
208
- return rcall("ZRANGE", zsetKey, rangeStart, rangeEnd)
208
+ return rcall("ZRANGEBYSCORE", zsetKey, 0, rangeEnd)
209
209
  end
210
210
  end
211
- local function cleanSet(setKey, jobKeyPrefix, rangeStart, rangeEnd, timestamp, limit, attributes)
212
- local jobs = getJobsInZset(setKey, rangeStart, rangeEnd, timestamp, limit)
211
+ local function cleanSet(setKey, jobKeyPrefix, rangeEnd, timestamp, limit, attributes, isFinished)
212
+ local jobs = getJobsInZset(setKey, rangeEnd, limit)
213
213
  local deleted = {}
214
214
  local deletedCount = 0
215
215
  local jobTS
@@ -218,12 +218,18 @@ local function cleanSet(setKey, jobKeyPrefix, rangeStart, rangeEnd, timestamp, l
218
218
  break
219
219
  end
220
220
  local jobKey = jobKeyPrefix .. job
221
- -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
222
- jobTS = getTimestamp(jobKey, attributes)
223
- if (not jobTS or jobTS < timestamp) then
221
+ if isFinished then
224
222
  removeJob(job, true, jobKeyPrefix)
225
223
  deletedCount = deletedCount + 1
226
224
  table.insert(deleted, job)
225
+ else
226
+ -- * finishedOn says when the job was completed, but it isn't set unless the job has actually completed
227
+ jobTS = getTimestamp(jobKey, attributes)
228
+ if (not jobTS or jobTS <= timestamp) then
229
+ removeJob(job, true, jobKeyPrefix)
230
+ deletedCount = deletedCount + 1
231
+ table.insert(deleted, job)
232
+ end
227
233
  end
228
234
  end
229
235
  if(#deleted > 0) then
@@ -237,13 +243,19 @@ local result
237
243
  if ARGV[4] == "active" then
238
244
  result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], false)
239
245
  elseif ARGV[4] == "delayed" then
240
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"processedOn", "timestamp"})
246
+ rangeEnd = "+inf"
247
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
248
+ {"processedOn", "timestamp"}, false)
241
249
  elseif ARGV[4] == "prioritized" then
242
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"timestamp"})
250
+ rangeEnd = "+inf"
251
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
252
+ {"timestamp"}, false)
243
253
  elseif ARGV[4] == "wait" or ARGV[4] == "paused" then
244
254
  result = cleanList(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], true)
245
255
  else
246
- result = cleanSet(KEYS[1], ARGV[1], rangeStart, rangeEnd, ARGV[2], limit, {"finishedOn"} )
256
+ rangeEnd = ARGV[2]
257
+ result = cleanSet(KEYS[1], ARGV[1], rangeEnd, ARGV[2], limit,
258
+ {"finishedOn"}, true)
247
259
  end
248
260
  rcall("XADD", KEYS[2], "*", "event", "cleaned", "count", result[2])
249
261
  return result[1]
@@ -1 +1 @@
1
- {"version":3,"file":"cleanJobsInSet-2.js","sourceRoot":"","sources":["../../../src/scripts/cleanJobsInSet-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyPf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"cleanJobsInSet-2.js","sourceRoot":"","sources":["../../../src/scripts/cleanJobsInSet-2.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqQf,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}