bunqueue 1.6.1 → 1.6.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/eventsManager.d.ts +2 -1
- package/dist/application/eventsManager.d.ts.map +1 -1
- package/dist/application/eventsManager.js +27 -27
- package/dist/application/eventsManager.js.map +1 -1
- package/dist/application/operations/pull.d.ts.map +1 -1
- package/dist/application/operations/pull.js +7 -5
- package/dist/application/operations/pull.js.map +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/manager.d.ts +2 -0
- package/dist/client/manager.d.ts.map +1 -1
- package/dist/client/manager.js.map +1 -1
- package/dist/client/sandboxedWorker.d.ts +90 -0
- package/dist/client/sandboxedWorker.d.ts.map +1 -0
- package/dist/client/sandboxedWorker.js +299 -0
- package/dist/client/sandboxedWorker.js.map +1 -0
- package/dist/domain/queue/priorityQueue.d.ts +7 -2
- package/dist/domain/queue/priorityQueue.d.ts.map +1 -1
- package/dist/domain/queue/priorityQueue.js +29 -16
- package/dist/domain/queue/priorityQueue.js.map +1 -1
- package/dist/domain/queue/shard.d.ts +2 -2
- package/dist/domain/queue/shard.d.ts.map +1 -1
- package/dist/domain/queue/shard.js +14 -15
- package/dist/domain/queue/shard.js.map +1 -1
- package/dist/infrastructure/persistence/sqlite.d.ts +3 -0
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +24 -9
- package/dist/infrastructure/persistence/sqlite.js.map +1 -1
- package/dist/infrastructure/server/tcp.d.ts.map +1 -1
- package/dist/infrastructure/server/tcp.js +20 -7
- package/dist/infrastructure/server/tcp.js.map +1 -1
- package/dist/shared/hash.d.ts +2 -1
- package/dist/shared/hash.d.ts.map +1 -1
- package/dist/shared/hash.js +3 -18
- package/dist/shared/hash.js.map +1 -1
- package/dist/shared/minHeap.d.ts +11 -2
- package/dist/shared/minHeap.d.ts.map +1 -1
- package/dist/shared/minHeap.js +29 -12
- package/dist/shared/minHeap.js.map +1 -1
- package/package.json +10 -7
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandboxed Worker
|
|
3
|
+
* Runs job processors in isolated Bun Worker processes
|
|
4
|
+
*/
|
|
5
|
+
import { getSharedManager } from './manager';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { writeFileSync, unlinkSync, existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
/**
|
|
10
|
+
* Sandboxed Worker - runs processors in isolated Bun Worker processes
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { Queue, SandboxedWorker } from 'bunqueue/client';
|
|
15
|
+
*
|
|
16
|
+
* const queue = new Queue('cpu-intensive');
|
|
17
|
+
*
|
|
18
|
+
* // Create processor file: processor.ts
|
|
19
|
+
* // export default async (job) => {
|
|
20
|
+
* // const result = heavyComputation(job.data);
|
|
21
|
+
* // return result;
|
|
22
|
+
* // };
|
|
23
|
+
*
|
|
24
|
+
* const worker = new SandboxedWorker('cpu-intensive', {
|
|
25
|
+
* processor: './processor.ts',
|
|
26
|
+
* concurrency: 4,
|
|
27
|
+
* timeout: 60000,
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* await worker.start();
|
|
31
|
+
* // Workers process jobs in isolated processes
|
|
32
|
+
* // If one crashes, others continue working
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class SandboxedWorker {
|
|
36
|
+
queueName;
|
|
37
|
+
options;
|
|
38
|
+
workers = [];
|
|
39
|
+
running = false;
|
|
40
|
+
pullPromise = null;
|
|
41
|
+
wrapperPath = null;
|
|
42
|
+
manager;
|
|
43
|
+
constructor(queueName, options) {
|
|
44
|
+
this.queueName = queueName;
|
|
45
|
+
this.manager = options.manager ?? getSharedManager();
|
|
46
|
+
this.options = {
|
|
47
|
+
processor: options.processor,
|
|
48
|
+
concurrency: options.concurrency ?? 1,
|
|
49
|
+
maxMemory: options.maxMemory ?? 256,
|
|
50
|
+
timeout: options.timeout ?? 30000,
|
|
51
|
+
autoRestart: options.autoRestart ?? true,
|
|
52
|
+
maxRestarts: options.maxRestarts ?? 10,
|
|
53
|
+
pollInterval: options.pollInterval ?? 10,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Start the sandboxed worker pool */
|
|
57
|
+
start() {
|
|
58
|
+
if (this.running)
|
|
59
|
+
return;
|
|
60
|
+
this.running = true;
|
|
61
|
+
// Create wrapper script for workers
|
|
62
|
+
this.wrapperPath = this.createWrapperScript();
|
|
63
|
+
// Spawn worker processes
|
|
64
|
+
for (let i = 0; i < this.options.concurrency; i++) {
|
|
65
|
+
this.spawnWorker(i);
|
|
66
|
+
}
|
|
67
|
+
// Start pulling jobs
|
|
68
|
+
this.pullPromise = this.pullLoop();
|
|
69
|
+
}
|
|
70
|
+
/** Stop all workers gracefully */
|
|
71
|
+
async stop() {
|
|
72
|
+
this.running = false;
|
|
73
|
+
// Clear all timeouts
|
|
74
|
+
for (const wp of this.workers) {
|
|
75
|
+
if (wp.timeoutId) {
|
|
76
|
+
clearTimeout(wp.timeoutId);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Terminate all workers
|
|
80
|
+
for (const wp of this.workers) {
|
|
81
|
+
wp.worker.terminate();
|
|
82
|
+
}
|
|
83
|
+
this.workers.length = 0;
|
|
84
|
+
// Wait for pull loop to finish
|
|
85
|
+
if (this.pullPromise) {
|
|
86
|
+
await this.pullPromise;
|
|
87
|
+
}
|
|
88
|
+
// Cleanup wrapper script
|
|
89
|
+
if (this.wrapperPath && existsSync(this.wrapperPath)) {
|
|
90
|
+
try {
|
|
91
|
+
unlinkSync(this.wrapperPath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore cleanup errors
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Get worker pool stats */
|
|
99
|
+
getStats() {
|
|
100
|
+
const busy = this.workers.filter((w) => w.busy).length;
|
|
101
|
+
const restarts = this.workers.reduce((sum, w) => sum + w.restarts, 0);
|
|
102
|
+
return {
|
|
103
|
+
total: this.workers.length,
|
|
104
|
+
busy,
|
|
105
|
+
idle: this.workers.length - busy,
|
|
106
|
+
restarts,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Create wrapper script file that loads the processor */
|
|
110
|
+
createWrapperScript() {
|
|
111
|
+
const processorPath = this.options.processor.startsWith('/')
|
|
112
|
+
? this.options.processor
|
|
113
|
+
: join(process.cwd(), this.options.processor);
|
|
114
|
+
const wrapperCode = `
|
|
115
|
+
// Sandboxed Worker Wrapper
|
|
116
|
+
const processor = (await import('${processorPath}')).default;
|
|
117
|
+
|
|
118
|
+
self.onmessage = async (event) => {
|
|
119
|
+
const { type, job } = event.data;
|
|
120
|
+
if (type !== 'job') return;
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
const result = await processor({
|
|
124
|
+
id: job.id,
|
|
125
|
+
data: job.data,
|
|
126
|
+
queue: job.queue,
|
|
127
|
+
attempts: job.attempts,
|
|
128
|
+
progress: (value) => {
|
|
129
|
+
self.postMessage({ type: 'progress', jobId: job.id, progress: value });
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
self.postMessage({ type: 'result', jobId: job.id, result });
|
|
134
|
+
} catch (err) {
|
|
135
|
+
self.postMessage({
|
|
136
|
+
type: 'error',
|
|
137
|
+
jobId: job.id,
|
|
138
|
+
error: err instanceof Error ? err.message : String(err),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
`;
|
|
143
|
+
// Write to temp file
|
|
144
|
+
const tempDir = join(tmpdir(), 'bunqueue-workers');
|
|
145
|
+
if (!existsSync(tempDir)) {
|
|
146
|
+
mkdirSync(tempDir, { recursive: true });
|
|
147
|
+
}
|
|
148
|
+
const wrapperPath = join(tempDir, `worker-${this.queueName}-${Date.now()}.ts`);
|
|
149
|
+
writeFileSync(wrapperPath, wrapperCode);
|
|
150
|
+
return wrapperPath;
|
|
151
|
+
}
|
|
152
|
+
/** Spawn a single worker process */
|
|
153
|
+
spawnWorker(index) {
|
|
154
|
+
if (!this.wrapperPath)
|
|
155
|
+
return;
|
|
156
|
+
const worker = new Worker(this.wrapperPath, {
|
|
157
|
+
smol: this.options.maxMemory <= 64,
|
|
158
|
+
});
|
|
159
|
+
const wp = {
|
|
160
|
+
worker,
|
|
161
|
+
busy: false,
|
|
162
|
+
currentJob: null,
|
|
163
|
+
restarts: this.workers[index]?.restarts ?? 0,
|
|
164
|
+
timeoutId: null,
|
|
165
|
+
};
|
|
166
|
+
// Handle messages from worker
|
|
167
|
+
worker.onmessage = (event) => {
|
|
168
|
+
this.handleWorkerMessage(wp, event.data);
|
|
169
|
+
};
|
|
170
|
+
// Handle worker errors/crashes
|
|
171
|
+
worker.onerror = (error) => {
|
|
172
|
+
console.error(`[SandboxedWorker] Worker ${index} error:`, error.message);
|
|
173
|
+
this.handleWorkerCrash(wp, index);
|
|
174
|
+
};
|
|
175
|
+
if (this.workers[index]) {
|
|
176
|
+
this.workers[index] = wp;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.workers.push(wp);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Main loop - pull jobs and dispatch to workers */
|
|
183
|
+
async pullLoop() {
|
|
184
|
+
while (this.running) {
|
|
185
|
+
// Find idle worker
|
|
186
|
+
const idleWorker = this.workers.find((w) => !w.busy);
|
|
187
|
+
if (!idleWorker) {
|
|
188
|
+
await Bun.sleep(this.options.pollInterval);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// Pull job from queue using manager
|
|
192
|
+
const job = await this.manager.pull(this.queueName, 1000);
|
|
193
|
+
if (!job)
|
|
194
|
+
continue;
|
|
195
|
+
// Dispatch to worker
|
|
196
|
+
this.dispatchJob(idleWorker, job);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** Dispatch job to a worker process */
|
|
200
|
+
dispatchJob(wp, job) {
|
|
201
|
+
wp.busy = true;
|
|
202
|
+
wp.currentJob = job;
|
|
203
|
+
// Set timeout
|
|
204
|
+
wp.timeoutId = setTimeout(() => {
|
|
205
|
+
this.handleJobTimeout(wp, job);
|
|
206
|
+
}, this.options.timeout);
|
|
207
|
+
// Send job to worker
|
|
208
|
+
const request = {
|
|
209
|
+
type: 'job',
|
|
210
|
+
job: {
|
|
211
|
+
id: String(job.id),
|
|
212
|
+
data: job.data,
|
|
213
|
+
queue: job.queue,
|
|
214
|
+
attempts: job.attempts,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
wp.worker.postMessage(request);
|
|
218
|
+
}
|
|
219
|
+
/** Handle message from worker */
|
|
220
|
+
handleWorkerMessage(wp, msg) {
|
|
221
|
+
if (!wp.currentJob || msg.jobId !== String(wp.currentJob.id))
|
|
222
|
+
return;
|
|
223
|
+
switch (msg.type) {
|
|
224
|
+
case 'result':
|
|
225
|
+
this.completeJob(wp, msg.result);
|
|
226
|
+
break;
|
|
227
|
+
case 'error':
|
|
228
|
+
this.failJob(wp, msg.error ?? 'Unknown error');
|
|
229
|
+
break;
|
|
230
|
+
case 'progress':
|
|
231
|
+
if (msg.progress !== undefined) {
|
|
232
|
+
this.manager.updateProgress(wp.currentJob.id, msg.progress).catch(() => { });
|
|
233
|
+
}
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Complete a job successfully */
|
|
238
|
+
completeJob(wp, result) {
|
|
239
|
+
if (wp.timeoutId) {
|
|
240
|
+
clearTimeout(wp.timeoutId);
|
|
241
|
+
wp.timeoutId = null;
|
|
242
|
+
}
|
|
243
|
+
if (wp.currentJob) {
|
|
244
|
+
const jobId = wp.currentJob.id;
|
|
245
|
+
this.manager.ack(jobId, result).catch((err) => {
|
|
246
|
+
console.error(`[SandboxedWorker] Failed to ack job ${jobId}:`, err);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
wp.busy = false;
|
|
250
|
+
wp.currentJob = null;
|
|
251
|
+
}
|
|
252
|
+
/** Fail a job */
|
|
253
|
+
failJob(wp, error) {
|
|
254
|
+
if (wp.timeoutId) {
|
|
255
|
+
clearTimeout(wp.timeoutId);
|
|
256
|
+
wp.timeoutId = null;
|
|
257
|
+
}
|
|
258
|
+
if (wp.currentJob) {
|
|
259
|
+
const jobId = wp.currentJob.id;
|
|
260
|
+
this.manager.fail(jobId, error).catch((err) => {
|
|
261
|
+
console.error(`[SandboxedWorker] Failed to fail job ${jobId}:`, err);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
wp.busy = false;
|
|
265
|
+
wp.currentJob = null;
|
|
266
|
+
}
|
|
267
|
+
/** Handle job timeout */
|
|
268
|
+
handleJobTimeout(wp, job) {
|
|
269
|
+
console.error(`[SandboxedWorker] Job ${job.id} timed out after ${this.options.timeout}ms`);
|
|
270
|
+
// Terminate the stuck worker
|
|
271
|
+
wp.worker.terminate();
|
|
272
|
+
// Fail the job
|
|
273
|
+
this.manager.fail(job.id, `Job timed out after ${this.options.timeout}ms`).catch(() => { });
|
|
274
|
+
// Restart worker if allowed
|
|
275
|
+
const index = this.workers.indexOf(wp);
|
|
276
|
+
if (index !== -1) {
|
|
277
|
+
this.handleWorkerCrash(wp, index);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** Handle worker crash and potentially restart */
|
|
281
|
+
handleWorkerCrash(wp, index) {
|
|
282
|
+
// Fail current job if any
|
|
283
|
+
if (wp.currentJob) {
|
|
284
|
+
this.manager.fail(wp.currentJob.id, 'Worker crashed').catch(() => { });
|
|
285
|
+
}
|
|
286
|
+
wp.busy = false;
|
|
287
|
+
wp.currentJob = null;
|
|
288
|
+
wp.restarts++;
|
|
289
|
+
// Check if we should restart
|
|
290
|
+
if (this.options.autoRestart && wp.restarts < this.options.maxRestarts && this.running) {
|
|
291
|
+
console.log(`[SandboxedWorker] Restarting worker ${index} (attempt ${wp.restarts})`);
|
|
292
|
+
this.spawnWorker(index);
|
|
293
|
+
}
|
|
294
|
+
else if (wp.restarts >= this.options.maxRestarts) {
|
|
295
|
+
console.error(`[SandboxedWorker] Worker ${index} exceeded max restarts (${this.options.maxRestarts})`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=sandboxedWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxedWorker.js","sourceRoot":"","sources":["../../src/client/sandboxedWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Job, JobId } from '../types/job';
|
|
7
7
|
/**
|
|
8
|
-
* Indexed Priority Queue implementation
|
|
9
|
-
*
|
|
8
|
+
* Indexed Priority Queue implementation with 4-ary heap
|
|
9
|
+
* 4-ary provides better cache locality than binary heap
|
|
10
|
+
* O(log₄ n) push, pop, update
|
|
10
11
|
* O(1) find, has
|
|
11
12
|
*/
|
|
12
13
|
export declare class IndexedPriorityQueue {
|
|
14
|
+
/** Branching factor - 4 provides optimal cache performance */
|
|
15
|
+
private static readonly D;
|
|
13
16
|
private heap;
|
|
14
17
|
private readonly index;
|
|
15
18
|
private generation;
|
|
@@ -53,7 +56,9 @@ export declare class IndexedPriorityQueue {
|
|
|
53
56
|
/** Check if compaction is needed (stale ratio > threshold) */
|
|
54
57
|
needsCompaction(threshold?: number): boolean;
|
|
55
58
|
private removeTop;
|
|
59
|
+
/** 4-ary bubbleUp: parent at floor((idx-1)/D) */
|
|
56
60
|
private bubbleUp;
|
|
61
|
+
/** 4-ary bubbleDown: children at D*idx+1 through D*idx+D */
|
|
57
62
|
private bubbleDown;
|
|
58
63
|
private swap;
|
|
59
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"priorityQueue.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAgD/C
|
|
1
|
+
{"version":3,"file":"priorityQueue.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAgD/C;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAK;IAC9B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;IAEjF,OAAO,CAAC,UAAU,CAAK;IAEvB,uBAAuB;IACvB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,qBAAqB;IACrB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,gCAAgC;IAChC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAkBpB,mCAAmC;IACnC,GAAG,IAAI,GAAG,GAAG,IAAI;IAmBjB,wDAAwD;IACxD,IAAI,IAAI,GAAG,GAAG,IAAI;IAgBlB,8BAA8B;IAC9B,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAI9B,iCAAiC;IACjC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI1B,8DAA8D;IAC9D,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAShC,qCAAqC;IACrC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAyB1D,sDAAsD;IACtD,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAyBpD,mCAAmC;IACnC,MAAM,IAAI,GAAG,EAAE;IAIf,sBAAsB;IACtB,KAAK,IAAI,IAAI;IAMb;;;OAGG;IACH,aAAa,IAAI,MAAM;IAKvB;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAiBf,wDAAwD;IACxD,OAAO,CAAC,OAAO;IASf,8DAA8D;IAC9D,eAAe,CAAC,SAAS,GAAE,MAAY,GAAG,OAAO;IAMjD,OAAO,CAAC,SAAS;IASjB,iDAAiD;IACjD,OAAO,CAAC,QAAQ;IAYhB,4DAA4D;IAC5D,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,IAAI;CAKb"}
|
|
@@ -41,14 +41,18 @@ function compareEntries(a, b) {
|
|
|
41
41
|
return 0;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
* Indexed Priority Queue implementation
|
|
45
|
-
*
|
|
44
|
+
* Indexed Priority Queue implementation with 4-ary heap
|
|
45
|
+
* 4-ary provides better cache locality than binary heap
|
|
46
|
+
* O(log₄ n) push, pop, update
|
|
46
47
|
* O(1) find, has
|
|
47
48
|
*/
|
|
48
49
|
export class IndexedPriorityQueue {
|
|
50
|
+
/** Branching factor - 4 provides optimal cache performance */
|
|
51
|
+
static D = 4;
|
|
49
52
|
heap = [];
|
|
50
53
|
index = new Map();
|
|
51
|
-
|
|
54
|
+
// Use Number instead of BigInt - 2^53 operations is enough for 285 years at 1M ops/sec
|
|
55
|
+
generation = 0;
|
|
52
56
|
/** Get current size */
|
|
53
57
|
get size() {
|
|
54
58
|
return this.index.size;
|
|
@@ -59,7 +63,7 @@ export class IndexedPriorityQueue {
|
|
|
59
63
|
}
|
|
60
64
|
/** Push a job into the queue */
|
|
61
65
|
push(job) {
|
|
62
|
-
const gen =
|
|
66
|
+
const gen = this.generation++;
|
|
63
67
|
// Store in index
|
|
64
68
|
this.index.set(job.id, { job, generation: gen });
|
|
65
69
|
// Add to heap
|
|
@@ -130,7 +134,7 @@ export class IndexedPriorityQueue {
|
|
|
130
134
|
const job = indexed.job;
|
|
131
135
|
job.priority = newPriority;
|
|
132
136
|
// Create new heap entry with new generation
|
|
133
|
-
const gen =
|
|
137
|
+
const gen = this.generation++;
|
|
134
138
|
indexed.generation = gen;
|
|
135
139
|
const entry = {
|
|
136
140
|
jobId: job.id,
|
|
@@ -152,7 +156,7 @@ export class IndexedPriorityQueue {
|
|
|
152
156
|
const job = indexed.job;
|
|
153
157
|
job.runAt = newRunAt;
|
|
154
158
|
// Create new heap entry
|
|
155
|
-
const gen =
|
|
159
|
+
const gen = this.generation++;
|
|
156
160
|
indexed.generation = gen;
|
|
157
161
|
const entry = {
|
|
158
162
|
jobId: job.id,
|
|
@@ -173,7 +177,7 @@ export class IndexedPriorityQueue {
|
|
|
173
177
|
clear() {
|
|
174
178
|
this.heap = [];
|
|
175
179
|
this.index.clear();
|
|
176
|
-
this.generation =
|
|
180
|
+
this.generation = 0;
|
|
177
181
|
}
|
|
178
182
|
/**
|
|
179
183
|
* Get the ratio of stale entries in the heap
|
|
@@ -206,8 +210,10 @@ export class IndexedPriorityQueue {
|
|
|
206
210
|
}
|
|
207
211
|
/** Rebuild heap property from arbitrary array - O(n) */
|
|
208
212
|
heapify() {
|
|
213
|
+
const D = IndexedPriorityQueue.D;
|
|
209
214
|
// Start from last non-leaf node and bubble down
|
|
210
|
-
|
|
215
|
+
// In D-ary heap, last non-leaf is at floor((n-2)/D)
|
|
216
|
+
for (let i = Math.floor((this.heap.length - 2) / D); i >= 0; i--) {
|
|
211
217
|
this.bubbleDown(i);
|
|
212
218
|
}
|
|
213
219
|
}
|
|
@@ -224,9 +230,11 @@ export class IndexedPriorityQueue {
|
|
|
224
230
|
this.heap[0] = this.heap.pop();
|
|
225
231
|
this.bubbleDown(0);
|
|
226
232
|
}
|
|
233
|
+
/** 4-ary bubbleUp: parent at floor((idx-1)/D) */
|
|
227
234
|
bubbleUp(idx) {
|
|
235
|
+
const D = IndexedPriorityQueue.D;
|
|
228
236
|
while (idx > 0) {
|
|
229
|
-
const parentIdx = Math.floor((idx - 1) /
|
|
237
|
+
const parentIdx = Math.floor((idx - 1) / D);
|
|
230
238
|
if (compareEntries(this.heap[idx], this.heap[parentIdx]) >= 0) {
|
|
231
239
|
break;
|
|
232
240
|
}
|
|
@@ -234,17 +242,22 @@ export class IndexedPriorityQueue {
|
|
|
234
242
|
idx = parentIdx;
|
|
235
243
|
}
|
|
236
244
|
}
|
|
245
|
+
/** 4-ary bubbleDown: children at D*idx+1 through D*idx+D */
|
|
237
246
|
bubbleDown(idx) {
|
|
247
|
+
const D = IndexedPriorityQueue.D;
|
|
238
248
|
const length = this.heap.length;
|
|
249
|
+
const heap = this.heap;
|
|
239
250
|
while (true) {
|
|
240
|
-
const
|
|
241
|
-
|
|
251
|
+
const firstChild = D * idx + 1;
|
|
252
|
+
if (firstChild >= length)
|
|
253
|
+
break;
|
|
254
|
+
// Find minimum among up to D children (cache-friendly sequential access)
|
|
242
255
|
let smallest = idx;
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
256
|
+
const lastChild = Math.min(firstChild + D, length);
|
|
257
|
+
for (let c = firstChild; c < lastChild; c++) {
|
|
258
|
+
if (compareEntries(heap[c], heap[smallest]) < 0) {
|
|
259
|
+
smallest = c;
|
|
260
|
+
}
|
|
248
261
|
}
|
|
249
262
|
if (smallest === idx)
|
|
250
263
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"priorityQueue.js","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;;;;;;;GAQG;AACH,SAAS,cAAc,CAAC,CAAY,EAAE,CAAY;IAChD,wBAAwB;IACxB,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,wDAAwD;IACxD,yEAAyE;IACzE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACrB,uEAAuE;QACvE,gFAAgF;QAChF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,uCAAuC;IACvC,8DAA8D;IAC9D,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"priorityQueue.js","sourceRoot":"","sources":["../../../src/domain/queue/priorityQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,9 +69,9 @@ export declare class Shard {
|
|
|
69
69
|
readonly rateLimiters: Map<string, RateLimiter>;
|
|
70
70
|
/** Concurrency limiters per queue */
|
|
71
71
|
readonly concurrencyLimiters: Map<string, ConcurrencyLimiter>;
|
|
72
|
-
/**
|
|
72
|
+
/** Waiter entry with cancellation flag for O(1) cleanup */
|
|
73
73
|
private readonly waiters;
|
|
74
|
-
/** Notify that jobs are available - wakes
|
|
74
|
+
/** Notify that jobs are available - wakes first non-cancelled waiter */
|
|
75
75
|
notify(): void;
|
|
76
76
|
/** Wait for a job to become available (with timeout) */
|
|
77
77
|
waitForJob(timeoutMs: number): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/shard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAoB,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAEL,aAAa,EAId,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAIvD,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,KAAK;IAChB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,oCAA2C;IAE1D,+DAA+D;IAC/D,QAAQ,CAAC,GAAG,0BAAiC;IAE7C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,yBAAgC;IAElD,oCAAoC;IACpC,QAAQ,CAAC,WAAW,2BAAkC;IAEtD,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAIpB;IAEF,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAElD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAE1B;IAEF,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IAEzD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IAEF,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,2BAAkC;IAErD,oCAAoC;IACpC,QAAQ,CAAC,WAAW,kBAAyB;IAE7C;;;OAGG;IACH,QAAQ,CAAC,eAAe,yBAAgC;IAExD,mDAAmD;IACnD,QAAQ,CAAC,eAAe,kBAAyB;IAEjD,mDAAmD;IACnD,QAAQ,CAAC,UAAU,0BAAiC;IAEpD,mCAAmC;IACnC,QAAQ,CAAC,YAAY,2BAAkC;IAEvD,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,2BAAkC;IAEvD,qCAAqC;IACrC,QAAQ,CAAC,mBAAmB,kCAAyC;IAErE,
|
|
1
|
+
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../src/domain/queue/shard.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,13 +64,17 @@ export class Shard {
|
|
|
64
64
|
rateLimiters = new Map();
|
|
65
65
|
/** Concurrency limiters per queue */
|
|
66
66
|
concurrencyLimiters = new Map();
|
|
67
|
-
/**
|
|
67
|
+
/** Waiter entry with cancellation flag for O(1) cleanup */
|
|
68
68
|
waiters = [];
|
|
69
|
-
/** Notify that jobs are available - wakes
|
|
69
|
+
/** Notify that jobs are available - wakes first non-cancelled waiter */
|
|
70
70
|
notify() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
waiter();
|
|
71
|
+
// Skip cancelled entries at head - O(k) where k = cancelled
|
|
72
|
+
while (this.waiters.length > 0) {
|
|
73
|
+
const waiter = this.waiters.shift();
|
|
74
|
+
if (!waiter.cancelled) {
|
|
75
|
+
waiter.resolve();
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
/** Wait for a job to become available (with timeout) */
|
|
@@ -79,21 +83,16 @@ export class Shard {
|
|
|
79
83
|
return Promise.resolve();
|
|
80
84
|
}
|
|
81
85
|
return new Promise((resolve) => {
|
|
82
|
-
|
|
86
|
+
const waiter = { resolve, cancelled: false };
|
|
83
87
|
const cleanup = () => {
|
|
84
|
-
if (
|
|
88
|
+
if (waiter.cancelled)
|
|
85
89
|
return;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (idx !== -1)
|
|
89
|
-
this.waiters.splice(idx, 1);
|
|
90
|
+
// O(1) cancellation - just mark, don't search/splice
|
|
91
|
+
waiter.cancelled = true;
|
|
90
92
|
resolve();
|
|
91
93
|
};
|
|
92
|
-
const waiterFn = () => {
|
|
93
|
-
cleanup();
|
|
94
|
-
};
|
|
95
94
|
// Add to waiters
|
|
96
|
-
this.waiters.push(
|
|
95
|
+
this.waiters.push(waiter);
|
|
97
96
|
// Timeout fallback
|
|
98
97
|
setTimeout(cleanup, Math.min(timeoutMs, 100)); // Max 100ms wait to allow checking other conditions
|
|
99
98
|
});
|