bunqueue 1.9.1 → 1.9.3
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/application/operations/queueControl.d.ts.map +1 -1
- package/dist/application/operations/queueControl.js +6 -1
- package/dist/application/operations/queueControl.js.map +1 -1
- package/dist/application/queueManager.d.ts +115 -9
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +535 -26
- package/dist/application/queueManager.js.map +1 -1
- package/dist/cli/client.d.ts +6 -0
- package/dist/cli/client.d.ts.map +1 -1
- package/dist/cli/client.js +60 -48
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/server.d.ts.map +1 -1
- package/dist/cli/commands/server.js +30 -14
- package/dist/cli/commands/server.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +10 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +15 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/client/queue/dlqOps.d.ts +24 -0
- package/dist/client/queue/dlqOps.d.ts.map +1 -0
- package/dist/client/queue/dlqOps.js +73 -0
- package/dist/client/queue/dlqOps.js.map +1 -0
- package/dist/client/queue/helpers.d.ts +20 -0
- package/dist/client/queue/helpers.d.ts.map +1 -0
- package/dist/client/queue/helpers.js +34 -0
- package/dist/client/queue/helpers.js.map +1 -0
- package/dist/client/queue/index.d.ts +8 -0
- package/dist/client/queue/index.d.ts.map +1 -0
- package/dist/client/queue/index.js +8 -0
- package/dist/client/queue/index.js.map +1 -0
- package/dist/client/queue/queue.d.ts +60 -0
- package/dist/client/queue/queue.d.ts.map +1 -0
- package/dist/client/queue/queue.js +322 -0
- package/dist/client/queue/queue.js.map +1 -0
- package/dist/client/queue.d.ts +3 -78
- package/dist/client/queue.d.ts.map +1 -1
- package/dist/client/queue.js +3 -463
- package/dist/client/queue.js.map +1 -1
- package/dist/client/sandboxed/index.d.ts +8 -0
- package/dist/client/sandboxed/index.d.ts.map +1 -0
- package/dist/client/sandboxed/index.js +7 -0
- package/dist/client/sandboxed/index.js.map +1 -0
- package/dist/client/sandboxed/types.d.ts +62 -0
- package/dist/client/sandboxed/types.d.ts.map +1 -0
- package/dist/client/sandboxed/types.js +6 -0
- package/dist/client/sandboxed/types.js.map +1 -0
- package/dist/client/sandboxed/worker.d.ts +38 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -0
- package/dist/client/sandboxed/worker.js +176 -0
- package/dist/client/sandboxed/worker.js.map +1 -0
- package/dist/client/sandboxed/wrapper.d.ts +13 -0
- package/dist/client/sandboxed/wrapper.d.ts.map +1 -0
- package/dist/client/sandboxed/wrapper.js +65 -0
- package/dist/client/sandboxed/wrapper.js.map +1 -0
- package/dist/client/sandboxedWorker.d.ts +4 -87
- package/dist/client/sandboxedWorker.d.ts.map +1 -1
- package/dist/client/sandboxedWorker.js +3 -296
- package/dist/client/sandboxedWorker.js.map +1 -1
- package/dist/client/tcp/client.d.ts +40 -0
- package/dist/client/tcp/client.d.ts.map +1 -0
- package/dist/client/tcp/client.js +289 -0
- package/dist/client/tcp/client.js.map +1 -0
- package/dist/client/tcp/connection.d.ts +57 -0
- package/dist/client/tcp/connection.d.ts.map +1 -0
- package/dist/client/tcp/connection.js +162 -0
- package/dist/client/tcp/connection.js.map +1 -0
- package/dist/client/tcp/health.d.ts +47 -0
- package/dist/client/tcp/health.d.ts.map +1 -0
- package/dist/client/tcp/health.js +95 -0
- package/dist/client/tcp/health.js.map +1 -0
- package/dist/client/tcp/index.d.ts +13 -0
- package/dist/client/tcp/index.d.ts.map +1 -0
- package/dist/client/tcp/index.js +12 -0
- package/dist/client/tcp/index.js.map +1 -0
- package/dist/client/tcp/lineBuffer.d.ts +17 -0
- package/dist/client/tcp/lineBuffer.d.ts.map +1 -0
- package/dist/client/tcp/lineBuffer.js +32 -0
- package/dist/client/tcp/lineBuffer.js.map +1 -0
- package/dist/client/tcp/reconnect.d.ts +38 -0
- package/dist/client/tcp/reconnect.d.ts.map +1 -0
- package/dist/client/tcp/reconnect.js +70 -0
- package/dist/client/tcp/reconnect.js.map +1 -0
- package/dist/client/tcp/shared.d.ts +11 -0
- package/dist/client/tcp/shared.d.ts.map +1 -0
- package/dist/client/tcp/shared.js +20 -0
- package/dist/client/tcp/shared.js.map +1 -0
- package/dist/client/tcp/types.d.ts +76 -0
- package/dist/client/tcp/types.d.ts.map +1 -0
- package/dist/client/tcp/types.js +20 -0
- package/dist/client/tcp/types.js.map +1 -0
- package/dist/client/tcpClient.d.ts +4 -110
- package/dist/client/tcpClient.d.ts.map +1 -1
- package/dist/client/tcpClient.js +3 -523
- package/dist/client/tcpClient.js.map +1 -1
- package/dist/client/tcpPool.d.ts +3 -0
- package/dist/client/tcpPool.d.ts.map +1 -1
- package/dist/client/tcpPool.js +21 -2
- package/dist/client/tcpPool.js.map +1 -1
- package/dist/client/types.d.ts +11 -2
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/client/worker/ackBatcher.d.ts +40 -0
- package/dist/client/worker/ackBatcher.d.ts.map +1 -0
- package/dist/client/worker/ackBatcher.js +137 -0
- package/dist/client/worker/ackBatcher.js.map +1 -0
- package/dist/client/worker/index.d.ts +11 -0
- package/dist/client/worker/index.d.ts.map +1 -0
- package/dist/client/worker/index.js +10 -0
- package/dist/client/worker/index.js.map +1 -0
- package/dist/client/worker/jobParser.d.ts +10 -0
- package/dist/client/worker/jobParser.d.ts.map +1 -0
- package/dist/client/worker/jobParser.js +43 -0
- package/dist/client/worker/jobParser.js.map +1 -0
- package/dist/client/worker/processor.d.ts +24 -0
- package/dist/client/worker/processor.d.ts.map +1 -0
- package/dist/client/worker/processor.js +86 -0
- package/dist/client/worker/processor.js.map +1 -0
- package/dist/client/worker/types.d.ts +38 -0
- package/dist/client/worker/types.d.ts.map +1 -0
- package/dist/client/worker/types.js +14 -0
- package/dist/client/worker/types.js.map +1 -0
- package/dist/client/worker/worker.d.ts +53 -0
- package/dist/client/worker/worker.d.ts.map +1 -0
- package/dist/client/worker/worker.js +367 -0
- package/dist/client/worker/worker.js.map +1 -0
- package/dist/client/worker.d.ts +3 -69
- package/dist/client/worker.d.ts.map +1 -1
- package/dist/client/worker.js +3 -472
- package/dist/client/worker.js.map +1 -1
- package/dist/domain/queue/shard.d.ts +19 -2
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +36 -4
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/domain/types/command.d.ts +9 -0
- package/dist/domain/types/command.d.ts.map +1 -1
- package/dist/domain/types/job.d.ts +27 -0
- package/dist/domain/types/job.d.ts.map +1 -1
- package/dist/domain/types/job.js +34 -0
- package/dist/domain/types/job.js.map +1 -1
- package/dist/domain/types/response.d.ts +15 -1
- package/dist/domain/types/response.d.ts.map +1 -1
- package/dist/domain/types/response.js +16 -0
- package/dist/domain/types/response.js.map +1 -1
- package/dist/infrastructure/server/handlers/core.d.ts +1 -1
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/core.js +74 -15
- package/dist/infrastructure/server/handlers/core.js.map +1 -1
- package/dist/infrastructure/server/handlers/monitoring.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/monitoring.js +6 -4
- package/dist/infrastructure/server/handlers/monitoring.js.map +1 -1
- package/dist/infrastructure/server/http.d.ts +10 -3
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +244 -163
- package/dist/infrastructure/server/http.js.map +1 -1
- package/dist/infrastructure/server/tcp.d.ts +8 -3
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +77 -57
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/infrastructure/server/types.d.ts +2 -0
- package/dist/infrastructure/server/types.d.ts.map +1 -1
- package/dist/main.js +24 -4
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker
|
|
3
|
+
* BullMQ-style worker for job processing
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { getSharedManager } from '../manager';
|
|
7
|
+
import { TcpConnectionPool } from '../tcpPool';
|
|
8
|
+
import { FORCE_EMBEDDED, WORKER_CONSTANTS } from './types';
|
|
9
|
+
import { AckBatcher } from './ackBatcher';
|
|
10
|
+
import { parseJobFromResponse } from './jobParser';
|
|
11
|
+
import { processJob } from './processor';
|
|
12
|
+
/**
|
|
13
|
+
* Worker class for processing jobs
|
|
14
|
+
*/
|
|
15
|
+
export class Worker extends EventEmitter {
|
|
16
|
+
name;
|
|
17
|
+
opts;
|
|
18
|
+
processor;
|
|
19
|
+
embedded;
|
|
20
|
+
tcp;
|
|
21
|
+
tcpPool;
|
|
22
|
+
ackBatcher;
|
|
23
|
+
running = false;
|
|
24
|
+
closing = false;
|
|
25
|
+
activeJobs = 0;
|
|
26
|
+
pollTimer = null;
|
|
27
|
+
consecutiveErrors = 0;
|
|
28
|
+
// Heartbeat tracking with lock tokens (BullMQ-style ownership)
|
|
29
|
+
// Track ALL pulled jobs (both active and buffered) for heartbeat
|
|
30
|
+
activeJobIds = new Set();
|
|
31
|
+
pulledJobIds = new Set(); // All pulled jobs (for heartbeat)
|
|
32
|
+
jobTokens = new Map(); // jobId -> lockToken
|
|
33
|
+
heartbeatTimer = null;
|
|
34
|
+
// Unique worker ID for lock ownership
|
|
35
|
+
workerId;
|
|
36
|
+
// Job buffer for batch pulls (with tokens)
|
|
37
|
+
pendingJobs = [];
|
|
38
|
+
pendingJobsHead = 0;
|
|
39
|
+
processingScheduled = false; // Prevent multiple setImmediate calls
|
|
40
|
+
constructor(name, processor, opts = {}) {
|
|
41
|
+
super();
|
|
42
|
+
this.name = name;
|
|
43
|
+
this.processor = processor;
|
|
44
|
+
this.embedded = opts.embedded ?? FORCE_EMBEDDED;
|
|
45
|
+
// Generate unique worker ID for lock ownership
|
|
46
|
+
this.workerId = `worker-${name}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
47
|
+
const concurrency = opts.concurrency ?? 1;
|
|
48
|
+
this.opts = {
|
|
49
|
+
concurrency,
|
|
50
|
+
autorun: opts.autorun ?? true,
|
|
51
|
+
heartbeatInterval: opts.heartbeatInterval ?? 10000,
|
|
52
|
+
batchSize: Math.min(opts.batchSize ?? 10, 1000),
|
|
53
|
+
pollTimeout: Math.min(opts.pollTimeout ?? 0, WORKER_CONSTANTS.MAX_POLL_TIMEOUT),
|
|
54
|
+
embedded: this.embedded,
|
|
55
|
+
// Lock-based ownership: disable for high-throughput scenarios where stall detection is sufficient
|
|
56
|
+
useLocks: opts.useLocks ?? true,
|
|
57
|
+
};
|
|
58
|
+
this.ackBatcher = new AckBatcher({
|
|
59
|
+
batchSize: opts.batchSize ?? 10,
|
|
60
|
+
interval: WORKER_CONSTANTS.DEFAULT_ACK_INTERVAL,
|
|
61
|
+
embedded: this.embedded,
|
|
62
|
+
});
|
|
63
|
+
if (this.embedded) {
|
|
64
|
+
this.tcp = null;
|
|
65
|
+
this.tcpPool = null;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const connOpts = opts.connection ?? {};
|
|
69
|
+
const poolSize = connOpts.poolSize ?? Math.min(concurrency, 8);
|
|
70
|
+
this.tcpPool = new TcpConnectionPool({
|
|
71
|
+
host: connOpts.host ?? 'localhost',
|
|
72
|
+
port: connOpts.port ?? 6789,
|
|
73
|
+
token: connOpts.token,
|
|
74
|
+
poolSize,
|
|
75
|
+
});
|
|
76
|
+
this.tcp = this.tcpPool;
|
|
77
|
+
this.ackBatcher.setTcp(this.tcp);
|
|
78
|
+
}
|
|
79
|
+
if (this.opts.autorun)
|
|
80
|
+
this.run();
|
|
81
|
+
}
|
|
82
|
+
/** Start processing */
|
|
83
|
+
run() {
|
|
84
|
+
if (this.running)
|
|
85
|
+
return;
|
|
86
|
+
this.running = true;
|
|
87
|
+
this.closing = false;
|
|
88
|
+
this.emit('ready');
|
|
89
|
+
if (!this.embedded && this.opts.heartbeatInterval > 0) {
|
|
90
|
+
this.startHeartbeat();
|
|
91
|
+
}
|
|
92
|
+
this.poll();
|
|
93
|
+
}
|
|
94
|
+
/** Pause processing */
|
|
95
|
+
pause() {
|
|
96
|
+
this.running = false;
|
|
97
|
+
if (this.pollTimer) {
|
|
98
|
+
clearTimeout(this.pollTimer);
|
|
99
|
+
this.pollTimer = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Resume processing */
|
|
103
|
+
resume() {
|
|
104
|
+
this.run();
|
|
105
|
+
}
|
|
106
|
+
/** Close worker gracefully */
|
|
107
|
+
async close(force = false) {
|
|
108
|
+
this.closing = true;
|
|
109
|
+
this.running = false;
|
|
110
|
+
if (this.pollTimer) {
|
|
111
|
+
clearTimeout(this.pollTimer);
|
|
112
|
+
this.pollTimer = null;
|
|
113
|
+
}
|
|
114
|
+
if (this.heartbeatTimer) {
|
|
115
|
+
clearInterval(this.heartbeatTimer);
|
|
116
|
+
this.heartbeatTimer = null;
|
|
117
|
+
}
|
|
118
|
+
if (!force) {
|
|
119
|
+
// Wait for buffered jobs to be processed and all active jobs to finish
|
|
120
|
+
const bufferSize = () => this.pendingJobs.length - this.pendingJobsHead;
|
|
121
|
+
while (this.activeJobs > 0 || bufferSize() > 0) {
|
|
122
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Flush any remaining pending acks
|
|
126
|
+
await this.ackBatcher.flush();
|
|
127
|
+
// Wait for ALL in-flight flushes to complete (critical!)
|
|
128
|
+
await this.ackBatcher.waitForInFlight();
|
|
129
|
+
this.ackBatcher.stop();
|
|
130
|
+
// Small delay to ensure TCP responses are processed
|
|
131
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
132
|
+
// Clear tracking sets
|
|
133
|
+
this.activeJobIds.clear();
|
|
134
|
+
this.pulledJobIds.clear();
|
|
135
|
+
this.jobTokens.clear();
|
|
136
|
+
this.pendingJobs = [];
|
|
137
|
+
this.pendingJobsHead = 0;
|
|
138
|
+
if (this.tcpPool)
|
|
139
|
+
this.tcpPool.close();
|
|
140
|
+
this.emit('closed');
|
|
141
|
+
}
|
|
142
|
+
startHeartbeat() {
|
|
143
|
+
this.heartbeatTimer = setInterval(() => void this.sendHeartbeat(), this.opts.heartbeatInterval);
|
|
144
|
+
}
|
|
145
|
+
async sendHeartbeat() {
|
|
146
|
+
// Send heartbeat for ALL pulled jobs (including buffered ones)
|
|
147
|
+
// This is critical: when locks are enabled, we need to renew them
|
|
148
|
+
// even for jobs sitting in the buffer waiting to be processed
|
|
149
|
+
if (this.pulledJobIds.size === 0 || !this.tcp)
|
|
150
|
+
return;
|
|
151
|
+
try {
|
|
152
|
+
// Always take a fresh snapshot - avoids race with job start/complete
|
|
153
|
+
const ids = Array.from(this.pulledJobIds);
|
|
154
|
+
if (ids.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
if (this.opts.useLocks) {
|
|
157
|
+
// With locks: include tokens for lock renewal
|
|
158
|
+
const tokens = ids.map((id) => this.jobTokens.get(id) ?? '');
|
|
159
|
+
if (ids.length === 1) {
|
|
160
|
+
await this.tcp.send({ cmd: 'JobHeartbeat', id: ids[0], token: tokens[0] || undefined });
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
await this.tcp.send({ cmd: 'JobHeartbeatB', ids, tokens });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Without locks: simple heartbeat for stall detection only
|
|
168
|
+
if (ids.length === 1) {
|
|
169
|
+
await this.tcp.send({ cmd: 'JobHeartbeat', id: ids[0] });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
await this.tcp.send({ cmd: 'JobHeartbeatB', ids });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
178
|
+
this.emit('error', Object.assign(error, { context: 'heartbeat' }));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
poll() {
|
|
182
|
+
if (!this.running || this.closing)
|
|
183
|
+
return;
|
|
184
|
+
if (this.activeJobs >= this.opts.concurrency) {
|
|
185
|
+
this.pollTimer = setTimeout(() => {
|
|
186
|
+
this.poll();
|
|
187
|
+
}, 10);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
void this.tryProcess();
|
|
191
|
+
}
|
|
192
|
+
async tryProcess() {
|
|
193
|
+
if (!this.running || this.closing)
|
|
194
|
+
return;
|
|
195
|
+
try {
|
|
196
|
+
let item = this.getBufferedJob();
|
|
197
|
+
if (!item) {
|
|
198
|
+
const items = await this.pullBatch();
|
|
199
|
+
// Re-check closing after async operation (can be modified during await)
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
201
|
+
if (this.closing)
|
|
202
|
+
return;
|
|
203
|
+
if (items.length > 0) {
|
|
204
|
+
// Register ALL pulled jobs for heartbeat tracking immediately
|
|
205
|
+
this.registerPulledJobs(items);
|
|
206
|
+
item = items[0];
|
|
207
|
+
this.pendingJobs = items;
|
|
208
|
+
this.pendingJobsHead = 1;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (item) {
|
|
212
|
+
this.consecutiveErrors = 0;
|
|
213
|
+
this.startJob(item.job, item.token);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const waitTime = this.opts.pollTimeout > 0 ? 10 : 50;
|
|
217
|
+
this.pollTimer = setTimeout(() => {
|
|
218
|
+
this.poll();
|
|
219
|
+
}, waitTime);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
// Re-check running state - could have changed during async pullBatch()
|
|
224
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
225
|
+
if (!this.running)
|
|
226
|
+
return;
|
|
227
|
+
this.handlePullError(err);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** Register pulled jobs for heartbeat tracking */
|
|
231
|
+
registerPulledJobs(items) {
|
|
232
|
+
// When locks are enabled: jobs need heartbeats to renew locks
|
|
233
|
+
// Without locks: still track for stall detection heartbeats
|
|
234
|
+
for (const pulledItem of items) {
|
|
235
|
+
const jobIdStr = String(pulledItem.job.id);
|
|
236
|
+
this.pulledJobIds.add(jobIdStr);
|
|
237
|
+
if (this.opts.useLocks && pulledItem.token) {
|
|
238
|
+
this.jobTokens.set(jobIdStr, pulledItem.token);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
getBufferedJob() {
|
|
243
|
+
if (this.pendingJobsHead >= this.pendingJobs.length)
|
|
244
|
+
return null;
|
|
245
|
+
const item = this.pendingJobs[this.pendingJobsHead++];
|
|
246
|
+
if (this.pendingJobsHead > 500 && this.pendingJobsHead >= this.pendingJobs.length / 2) {
|
|
247
|
+
this.pendingJobs = this.pendingJobs.slice(this.pendingJobsHead);
|
|
248
|
+
this.pendingJobsHead = 0;
|
|
249
|
+
}
|
|
250
|
+
return item;
|
|
251
|
+
}
|
|
252
|
+
async pullBatch() {
|
|
253
|
+
const slots = this.opts.concurrency - this.activeJobs;
|
|
254
|
+
const batchSize = Math.min(this.opts.batchSize, slots, 1000);
|
|
255
|
+
if (batchSize <= 0)
|
|
256
|
+
return [];
|
|
257
|
+
return this.embedded ? this.pullEmbedded(batchSize) : this.pullTcp(batchSize);
|
|
258
|
+
}
|
|
259
|
+
async pullEmbedded(count) {
|
|
260
|
+
const manager = getSharedManager();
|
|
261
|
+
// Use lock-based pull only when useLocks is enabled
|
|
262
|
+
if (this.opts.useLocks) {
|
|
263
|
+
if (count === 1) {
|
|
264
|
+
const { job, token } = await manager.pullWithLock(this.name, this.workerId, 0);
|
|
265
|
+
return job ? [{ job, token }] : [];
|
|
266
|
+
}
|
|
267
|
+
const { jobs, tokens } = await manager.pullBatchWithLock(this.name, count, this.workerId, 0);
|
|
268
|
+
return jobs.map((job, i) => ({ job, token: tokens[i] || null }));
|
|
269
|
+
}
|
|
270
|
+
// No locks - use regular pull
|
|
271
|
+
if (count === 1) {
|
|
272
|
+
const job = await manager.pull(this.name, 0);
|
|
273
|
+
return job ? [{ job, token: null }] : [];
|
|
274
|
+
}
|
|
275
|
+
const jobs = await manager.pullBatch(this.name, count, 0);
|
|
276
|
+
return jobs.map((job) => ({ job, token: null }));
|
|
277
|
+
}
|
|
278
|
+
async pullTcp(count) {
|
|
279
|
+
if (!this.tcp || this.closing)
|
|
280
|
+
return [];
|
|
281
|
+
// Build pull command - only request locks if useLocks is enabled
|
|
282
|
+
const cmd = {
|
|
283
|
+
cmd: count === 1 ? 'PULL' : 'PULLB',
|
|
284
|
+
queue: this.name,
|
|
285
|
+
timeout: this.opts.pollTimeout,
|
|
286
|
+
count,
|
|
287
|
+
};
|
|
288
|
+
// Only request lock ownership when useLocks is enabled
|
|
289
|
+
if (this.opts.useLocks) {
|
|
290
|
+
cmd.owner = this.workerId;
|
|
291
|
+
}
|
|
292
|
+
const response = await this.tcp.send(cmd);
|
|
293
|
+
if (!response.ok)
|
|
294
|
+
return [];
|
|
295
|
+
if (count === 1) {
|
|
296
|
+
const job = response.job;
|
|
297
|
+
// Only expect token if locks are enabled
|
|
298
|
+
const token = this.opts.useLocks
|
|
299
|
+
? (response.token ?? null)
|
|
300
|
+
: null;
|
|
301
|
+
if (job) {
|
|
302
|
+
return [{ job: parseJobFromResponse(job, this.name), token }];
|
|
303
|
+
}
|
|
304
|
+
return [];
|
|
305
|
+
}
|
|
306
|
+
const jobs = response.jobs;
|
|
307
|
+
// Only expect tokens if locks are enabled
|
|
308
|
+
const tokens = this.opts.useLocks ? (response.tokens ?? []) : [];
|
|
309
|
+
return (jobs?.map((j, i) => ({
|
|
310
|
+
job: parseJobFromResponse(j, this.name),
|
|
311
|
+
token: tokens[i] || null,
|
|
312
|
+
})) ?? []);
|
|
313
|
+
}
|
|
314
|
+
startJob(job, token) {
|
|
315
|
+
this.activeJobs++;
|
|
316
|
+
const jobIdStr = String(job.id);
|
|
317
|
+
this.activeJobIds.add(jobIdStr);
|
|
318
|
+
// Token management only when locks are enabled
|
|
319
|
+
if (this.opts.useLocks && token && !this.jobTokens.has(jobIdStr)) {
|
|
320
|
+
this.jobTokens.set(jobIdStr, token);
|
|
321
|
+
}
|
|
322
|
+
// Ensure job is in pulledJobIds for heartbeat (should already be there from pullBatch)
|
|
323
|
+
this.pulledJobIds.add(jobIdStr);
|
|
324
|
+
// Only pass token if locks are enabled
|
|
325
|
+
const tokenForProcess = this.opts.useLocks ? token : undefined;
|
|
326
|
+
void processJob(job, {
|
|
327
|
+
name: this.name,
|
|
328
|
+
processor: this.processor,
|
|
329
|
+
embedded: this.embedded,
|
|
330
|
+
tcp: this.tcp,
|
|
331
|
+
ackBatcher: this.ackBatcher,
|
|
332
|
+
emitter: this,
|
|
333
|
+
token: tokenForProcess, // Pass token for ACK/FAIL verification (only when locks enabled)
|
|
334
|
+
}).finally(() => {
|
|
335
|
+
this.activeJobs--;
|
|
336
|
+
this.activeJobIds.delete(jobIdStr);
|
|
337
|
+
this.pulledJobIds.delete(jobIdStr); // Remove from heartbeat tracking
|
|
338
|
+
if (this.opts.useLocks) {
|
|
339
|
+
this.jobTokens.delete(jobIdStr); // Clean up token
|
|
340
|
+
}
|
|
341
|
+
if (this.running && !this.closing)
|
|
342
|
+
this.poll();
|
|
343
|
+
});
|
|
344
|
+
// Prevent multiple setImmediate calls (event loop starvation)
|
|
345
|
+
if (this.activeJobs < this.opts.concurrency && !this.closing && !this.processingScheduled) {
|
|
346
|
+
this.processingScheduled = true;
|
|
347
|
+
setImmediate(() => {
|
|
348
|
+
this.processingScheduled = false;
|
|
349
|
+
void this.tryProcess();
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
handlePullError(err) {
|
|
354
|
+
this.consecutiveErrors++;
|
|
355
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
356
|
+
this.emit('error', Object.assign(error, {
|
|
357
|
+
queue: this.name,
|
|
358
|
+
consecutiveErrors: this.consecutiveErrors,
|
|
359
|
+
context: 'pull',
|
|
360
|
+
}));
|
|
361
|
+
const backoffMs = Math.min(WORKER_CONSTANTS.BASE_BACKOFF_MS * Math.pow(2, this.consecutiveErrors - 1), WORKER_CONSTANTS.MAX_BACKOFF_MS);
|
|
362
|
+
this.pollTimer = setTimeout(() => {
|
|
363
|
+
this.poll();
|
|
364
|
+
}, backoffMs);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/client/worker/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/client/worker.d.ts
CHANGED
|
@@ -1,72 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Worker -
|
|
3
|
-
*
|
|
4
|
-
* Optional: embedded mode with { embedded: true }
|
|
5
|
-
*
|
|
6
|
-
* Performance optimizations:
|
|
7
|
-
* - Batch pull: fetches multiple jobs per round-trip (batchSize option)
|
|
8
|
-
* - Batch ACK with results: acknowledges multiple jobs per round-trip
|
|
9
|
-
* - Connection pooling: optional pool for high-concurrency scenarios
|
|
10
|
-
* - Long polling: reduces round-trips when queue is empty
|
|
11
|
-
* - TCP heartbeats: keeps jobs alive for stall detection
|
|
2
|
+
* Worker - Re-exports from worker module
|
|
3
|
+
* @deprecated Import from './worker' instead
|
|
12
4
|
*/
|
|
13
|
-
|
|
14
|
-
import type { WorkerOptions, Processor } from './types';
|
|
15
|
-
/**
|
|
16
|
-
* Worker class for processing jobs
|
|
17
|
-
* Default: connects to bunqueue server via TCP
|
|
18
|
-
* Use { embedded: true } for in-process mode
|
|
19
|
-
* Set BUNQUEUE_EMBEDDED=1 env var to force embedded mode
|
|
20
|
-
*/
|
|
21
|
-
export declare class Worker<T = unknown, R = unknown> extends EventEmitter {
|
|
22
|
-
readonly name: string;
|
|
23
|
-
private readonly opts;
|
|
24
|
-
private readonly processor;
|
|
25
|
-
private readonly embedded;
|
|
26
|
-
private readonly tcp;
|
|
27
|
-
private readonly tcpPool;
|
|
28
|
-
private running;
|
|
29
|
-
private activeJobs;
|
|
30
|
-
private pollTimer;
|
|
31
|
-
private readonly activeJobIds;
|
|
32
|
-
private cachedActiveJobIds;
|
|
33
|
-
private activeJobIdsDirty;
|
|
34
|
-
private heartbeatTimer;
|
|
35
|
-
private consecutiveErrors;
|
|
36
|
-
private pendingJobs;
|
|
37
|
-
private pendingJobsHead;
|
|
38
|
-
private readonly pendingAcks;
|
|
39
|
-
private ackTimer;
|
|
40
|
-
private readonly ackBatchSize;
|
|
41
|
-
private readonly ackInterval;
|
|
42
|
-
private static readonly MAX_BACKOFF_MS;
|
|
43
|
-
private static readonly BASE_BACKOFF_MS;
|
|
44
|
-
private static readonly MAX_POLL_TIMEOUT;
|
|
45
|
-
constructor(name: string, processor: Processor<T, R>, opts?: WorkerOptions);
|
|
46
|
-
/** Start processing */
|
|
47
|
-
run(): void;
|
|
48
|
-
/** Pause processing */
|
|
49
|
-
pause(): void;
|
|
50
|
-
/** Resume processing */
|
|
51
|
-
resume(): void;
|
|
52
|
-
/** Close worker gracefully */
|
|
53
|
-
close(force?: boolean): Promise<void>;
|
|
54
|
-
/** Start global heartbeat timer for all active jobs (TCP mode) */
|
|
55
|
-
private startGlobalHeartbeat;
|
|
56
|
-
/** Send batch heartbeat for all active jobs */
|
|
57
|
-
private sendBatchHeartbeat;
|
|
58
|
-
private poll;
|
|
59
|
-
private tryProcess;
|
|
60
|
-
/** Pull batch (embedded) */
|
|
61
|
-
private pullBatchEmbedded;
|
|
62
|
-
/** Pull batch of jobs via TCP with optional long polling */
|
|
63
|
-
private pullBatchTcp;
|
|
64
|
-
/** Parse job from TCP response */
|
|
65
|
-
private parseJob;
|
|
66
|
-
/** Queue ACK for batch processing with result */
|
|
67
|
-
private queueAck;
|
|
68
|
-
/** Flush pending ACKs in batch with results */
|
|
69
|
-
private flushAcks;
|
|
70
|
-
private processJob;
|
|
71
|
-
}
|
|
5
|
+
export { Worker } from './worker/worker';
|
|
72
6
|
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/client/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC"}
|