bullmq 1.76.1 → 1.76.4
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/bullmq.d.ts +2 -4
- package/dist/cjs/classes/scripts.js +27 -19
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/classes/worker.js.map +1 -1
- package/dist/cjs/commands/includes/moveJobFromWaitToActive.lua +83 -3
- package/dist/cjs/commands/moveToActive-8.lua +10 -66
- package/dist/cjs/commands/{moveToFinished-9.lua → moveToFinished-12.lua} +62 -58
- package/dist/cjs/utils.d.ts +2 -4
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/classes/scripts.js +27 -19
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/classes/worker.js.map +1 -1
- package/dist/esm/commands/includes/moveJobFromWaitToActive.lua +83 -3
- package/dist/esm/commands/moveToActive-8.lua +10 -66
- package/dist/esm/commands/{moveToFinished-9.lua → moveToFinished-12.lua} +62 -58
- package/dist/esm/tsdoc-metadata.json +1 -1
- package/dist/esm/utils.d.ts +2 -4
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
@@ -5,33 +5,42 @@
|
|
5
5
|
and the lock must be released in this script.
|
6
6
|
|
7
7
|
Input:
|
8
|
-
KEYS[1]
|
9
|
-
KEYS[2]
|
10
|
-
KEYS[3]
|
11
|
-
KEYS[4]
|
12
|
-
KEYS[5]
|
13
|
-
|
14
|
-
|
15
|
-
KEYS[
|
16
|
-
KEYS[
|
8
|
+
KEYS[1] wait key
|
9
|
+
KEYS[2] active key
|
10
|
+
KEYS[3] priority key
|
11
|
+
KEYS[4] event stream key
|
12
|
+
KEYS[5] stalled key
|
13
|
+
|
14
|
+
-- Rate limiting
|
15
|
+
KEYS[6] rate limiter key
|
16
|
+
KEYS[7] delayed key
|
17
|
+
|
18
|
+
-- Delay events
|
19
|
+
KEYS[8] delay stream key
|
20
|
+
|
21
|
+
KEYS[9] completed/failed key
|
22
|
+
KEYS[10] jobId key
|
23
|
+
KEYS[11] meta key
|
24
|
+
KEYS[12] metrics key
|
17
25
|
|
18
26
|
ARGV[1] jobId
|
19
27
|
ARGV[2] timestamp
|
20
28
|
ARGV[3] msg property
|
21
29
|
ARGV[4] return value / failed reason
|
22
30
|
ARGV[5] target (completed/failed)
|
23
|
-
ARGV[6]
|
24
|
-
ARGV[7]
|
25
|
-
ARGV[8]
|
26
|
-
ARGV[9]
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
ARGV[6] event data (? maybe just send jobid).
|
32
|
+
ARGV[7] fetch next?
|
33
|
+
ARGV[8] keys prefix
|
34
|
+
ARGV[9] opts
|
35
|
+
|
36
|
+
opts - token - lock token
|
37
|
+
opts - keepJobs
|
38
|
+
opts - lockDuration - lock duration in milliseconds
|
39
|
+
opts - parent - parent data
|
40
|
+
opts - parentKey
|
41
|
+
opts - attempts max attempts
|
42
|
+
opts - attemptsMade
|
43
|
+
opts - maxMetricsSize
|
35
44
|
|
36
45
|
Output:
|
37
46
|
0 OK
|
@@ -52,13 +61,25 @@
|
|
52
61
|
--- @include "includes/updateParentDepsIfNeeded"
|
53
62
|
--- @include "includes/collectMetrics"
|
54
63
|
|
55
|
-
local jobIdKey = KEYS[
|
64
|
+
local jobIdKey = KEYS[10]
|
56
65
|
if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
57
|
-
|
66
|
+
local opts = cmsgpack.unpack(ARGV[9])
|
67
|
+
|
68
|
+
local token = opts['token']
|
69
|
+
local parentId = opts['parent'] and opts['parent']['id'] or ""
|
70
|
+
local parentQueueKey = opts['parent'] and opts['parent']['queue'] or ""
|
71
|
+
local parentKey = opts['parentKey'] or ""
|
72
|
+
local attempts = opts['attempts']
|
73
|
+
local attemptsMade = opts['attemptsMade']
|
74
|
+
local maxMetricsSize = opts['maxMetricsSize']
|
75
|
+
local maxCount = opts['keepJobs']['count']
|
76
|
+
local maxAge = opts['keepJobs']['age']
|
77
|
+
|
78
|
+
if token ~= "0" then
|
58
79
|
local lockKey = jobIdKey .. ':lock'
|
59
|
-
if rcall("GET", lockKey) ==
|
80
|
+
if rcall("GET", lockKey) == token then
|
60
81
|
rcall("DEL", lockKey)
|
61
|
-
rcall("SREM", KEYS[
|
82
|
+
rcall("SREM", KEYS[5], ARGV[1])
|
62
83
|
else
|
63
84
|
return -2
|
64
85
|
end
|
@@ -72,12 +93,12 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
72
93
|
local timestamp = ARGV[2]
|
73
94
|
|
74
95
|
-- Remove from active list (if not active we shall return error)
|
75
|
-
local numRemovedElements = rcall("LREM", KEYS[
|
96
|
+
local numRemovedElements = rcall("LREM", KEYS[2], -1, jobId)
|
76
97
|
|
77
98
|
if (numRemovedElements < 1) then return -3 end
|
78
99
|
|
79
100
|
-- Trim events before emiting them to avoid trimming events emitted in this script
|
80
|
-
trimEvents(KEYS[
|
101
|
+
trimEvents(KEYS[11], KEYS[4])
|
81
102
|
|
82
103
|
-- If job has a parent we need to
|
83
104
|
-- 1) remove this job id from parents dependencies
|
@@ -85,11 +106,9 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
85
106
|
-- 3) push the results into parent "results" list
|
86
107
|
-- 4) if parent's dependencies is empty, then move parent to "wait/paused". Note it may be a different queue!.
|
87
108
|
-- NOTE: Priorities not supported yet for parent jobs.
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
parentId = getJobIdFromKey(ARGV[14])
|
92
|
-
parentQueueKey = getJobKeyPrefix(ARGV[14], ":" .. parentId)
|
109
|
+
if parentId == "" and parentKey ~= "" then
|
110
|
+
parentId = getJobIdFromKey(parentKey)
|
111
|
+
parentQueueKey = getJobKeyPrefix(parentKey, ":" .. parentId)
|
93
112
|
end
|
94
113
|
if parentId ~= "" and ARGV[5] == "completed" then
|
95
114
|
local parentKey = parentQueueKey .. ":" .. parentId
|
@@ -102,17 +121,14 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
102
121
|
end
|
103
122
|
|
104
123
|
-- Remove job?
|
105
|
-
local keepJobs = cmsgpack.unpack(ARGV[6])
|
106
|
-
local maxCount = keepJobs['count']
|
107
|
-
local maxAge = keepJobs['age']
|
108
124
|
if maxCount ~= 0 then
|
109
|
-
local targetSet = KEYS[
|
125
|
+
local targetSet = KEYS[9]
|
110
126
|
-- Add to complete/failed set
|
111
127
|
rcall("ZADD", targetSet, timestamp, jobId)
|
112
128
|
rcall("HMSET", jobIdKey, ARGV[3], ARGV[4], "finishedOn", timestamp) -- "returnvalue" / "failedReason" and "finishedOn"
|
113
129
|
|
114
130
|
-- Remove old jobs?
|
115
|
-
local prefix = ARGV[
|
131
|
+
local prefix = ARGV[8]
|
116
132
|
|
117
133
|
if maxAge ~= nil then
|
118
134
|
local start = timestamp - maxAge * 1000
|
@@ -135,40 +151,28 @@ if rcall("EXISTS", jobIdKey) == 1 then -- // Make sure job exists
|
|
135
151
|
rcall("DEL", jobIdKey, jobIdKey .. ':logs', jobIdKey .. ':processed')
|
136
152
|
end
|
137
153
|
|
138
|
-
rcall("XADD", KEYS[
|
154
|
+
rcall("XADD", KEYS[4], "*", "event", ARGV[5], "jobId", jobId, ARGV[3],
|
139
155
|
ARGV[4])
|
140
156
|
|
141
157
|
if ARGV[5] == "failed" then
|
142
|
-
if tonumber(
|
143
|
-
rcall("XADD", KEYS[
|
144
|
-
jobId, "attemptsMade",
|
158
|
+
if tonumber(attemptsMade) >= tonumber(attempts) then
|
159
|
+
rcall("XADD", KEYS[4], "*", "event", "retries-exhausted", "jobId",
|
160
|
+
jobId, "attemptsMade", attemptsMade)
|
145
161
|
end
|
146
162
|
end
|
147
163
|
|
148
164
|
-- Collect metrics
|
149
|
-
if
|
150
|
-
collectMetrics(KEYS[
|
165
|
+
if maxMetricsSize ~= "" then
|
166
|
+
collectMetrics(KEYS[12], KEYS[12]..':data', maxMetricsSize, timestamp)
|
151
167
|
end
|
152
168
|
|
153
169
|
-- Try to get next job to avoid an extra roundtrip if the queue is not closing,
|
154
170
|
-- and not rate limited.
|
155
|
-
if (ARGV[
|
171
|
+
if (ARGV[7] == "1") then
|
156
172
|
-- move from wait to active
|
157
|
-
local jobId = rcall("RPOPLPUSH", KEYS[
|
173
|
+
local jobId = rcall("RPOPLPUSH", KEYS[1], KEYS[2])
|
158
174
|
if jobId then
|
159
|
-
|
160
|
-
local lockKey = jobKey .. ':lock'
|
161
|
-
|
162
|
-
-- get a lock
|
163
|
-
if ARGV[10] ~= "0" then
|
164
|
-
rcall("SET", lockKey, ARGV[10], "PX", ARGV[11])
|
165
|
-
end
|
166
|
-
|
167
|
-
moveJobFromWaitToActive(KEYS[5], KEYS[6], jobKey, jobId, timestamp)
|
168
|
-
|
169
|
-
return {rcall("HGETALL", jobKey), jobId} -- get job data
|
170
|
-
else
|
171
|
-
rcall("XADD", KEYS[6], "*", "event", "drained");
|
175
|
+
return moveJobFromWaitToActive(KEYS, ARGV[8], jobId, timestamp, opts)
|
172
176
|
end
|
173
177
|
end
|
174
178
|
|
package/dist/esm/utils.d.ts
CHANGED
@@ -26,11 +26,9 @@ export declare const DELAY_TIME_5 = 5000;
|
|
26
26
|
export declare const DELAY_TIME_1 = 100;
|
27
27
|
export declare function isNotConnectionError(error: Error): boolean;
|
28
28
|
interface procSendLike {
|
29
|
-
send?(message: any,
|
30
|
-
swallowErrors?: boolean;
|
31
|
-
}, callback?: (error: Error) => void): boolean;
|
29
|
+
send?(message: any, callback?: (error: Error | null) => void): boolean;
|
32
30
|
}
|
33
|
-
export declare const asyncSend: (proc:
|
31
|
+
export declare const asyncSend: <T extends procSendLike>(proc: T, msg: any) => Promise<void>;
|
34
32
|
export declare const childSend: (proc: NodeJS.Process, msg: ChildMessage) => Promise<void>;
|
35
33
|
export declare const parentSend: (child: ChildProcess, msg: ParentMessage) => Promise<void>;
|
36
34
|
export {};
|
package/dist/esm/utils.js.map
CHANGED
@@ -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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"}
|