bunqueue 2.0.5 → 2.0.6
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/pull.d.ts +0 -1
- package/dist/application/operations/pull.d.ts.map +1 -1
- package/dist/application/operations/pull.js +151 -129
- package/dist/application/operations/pull.js.map +1 -1
- package/dist/application/operations/push.d.ts +2 -0
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js +204 -119
- package/dist/application/operations/push.js.map +1 -1
- package/dist/client/sandboxed/types.d.ts +2 -2
- package/dist/client/sandboxed/types.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.d.ts +2 -0
- package/dist/client/sandboxed/worker.d.ts.map +1 -1
- package/dist/client/sandboxed/worker.js +112 -62
- package/dist/client/sandboxed/worker.js.map +1 -1
- package/dist/client/sandboxed/wrapper.d.ts.map +1 -1
- package/dist/client/sandboxed/wrapper.js +3 -0
- package/dist/client/sandboxed/wrapper.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,7 +31,6 @@ export interface PullContext {
|
|
|
31
31
|
export declare function pullJob(queue: string, timeoutMs: number, ctx: PullContext): Promise<Job | null>;
|
|
32
32
|
/**
|
|
33
33
|
* Pull multiple jobs from queue
|
|
34
|
-
* Optimized: single lock acquisition for all jobs instead of O(count) locks
|
|
35
34
|
*/
|
|
36
35
|
export declare function pullJobBatch(queue: string, count: number, timeoutMs: number, ctx: PullContext): Promise<Job[]>;
|
|
37
36
|
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/application/operations/pull.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/application/operations/pull.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA0BhD,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,EAAE,CAAC,KAAK,EAAE;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,IAAI,CAAC;CACZ;AA0HD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAqBrB;AAqCD;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,GAAG,EAAE,CAAC,CA0BhB"}
|
|
@@ -5,6 +5,117 @@
|
|
|
5
5
|
import { isExpired, isReady } from '../../domain/types/job';
|
|
6
6
|
import { withWriteLock } from '../../shared/lock';
|
|
7
7
|
import { shardIndex, processingShardIndex } from '../../shared/hash';
|
|
8
|
+
const LOG_PREFIX = '[Pull]';
|
|
9
|
+
/** Structured log helper */
|
|
10
|
+
function log(level, message, data) {
|
|
11
|
+
const entry = data ? { message, ...data } : message;
|
|
12
|
+
switch (level) {
|
|
13
|
+
case 'info':
|
|
14
|
+
console.log(LOG_PREFIX, entry);
|
|
15
|
+
break;
|
|
16
|
+
case 'warn':
|
|
17
|
+
console.warn(LOG_PREFIX, entry);
|
|
18
|
+
break;
|
|
19
|
+
case 'error':
|
|
20
|
+
console.error(LOG_PREFIX, entry);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Try to dequeue next ready job from queue
|
|
26
|
+
* Handles: expired skip, ready check, group blocking, timestamps
|
|
27
|
+
*/
|
|
28
|
+
function tryDequeueNextJob(shard, queue, now, ctx) {
|
|
29
|
+
const q = shard.getQueue(queue);
|
|
30
|
+
const job = q.peek();
|
|
31
|
+
if (!job)
|
|
32
|
+
return { status: 'stop' };
|
|
33
|
+
// Skip expired jobs
|
|
34
|
+
if (isExpired(job, now)) {
|
|
35
|
+
q.pop();
|
|
36
|
+
shard.decrementQueued(job.id);
|
|
37
|
+
ctx.jobIndex.delete(job.id);
|
|
38
|
+
log('warn', 'Skipped expired job', {
|
|
39
|
+
queue,
|
|
40
|
+
jobId: String(job.id),
|
|
41
|
+
ttl: job.ttl,
|
|
42
|
+
});
|
|
43
|
+
return { status: 'skip' };
|
|
44
|
+
}
|
|
45
|
+
// Not ready yet (delayed)
|
|
46
|
+
if (!isReady(job, now))
|
|
47
|
+
return { status: 'stop' };
|
|
48
|
+
// FIFO group blocked
|
|
49
|
+
if (job.groupId && shard.isGroupActive(queue, job.groupId)) {
|
|
50
|
+
return { status: 'stop' };
|
|
51
|
+
}
|
|
52
|
+
// Dequeue and update
|
|
53
|
+
q.pop();
|
|
54
|
+
shard.decrementQueued(job.id);
|
|
55
|
+
if (job.groupId) {
|
|
56
|
+
shard.activateGroup(queue, job.groupId);
|
|
57
|
+
}
|
|
58
|
+
job.startedAt = now;
|
|
59
|
+
job.lastHeartbeat = now;
|
|
60
|
+
return { status: 'job', job };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Move job to processing shard and broadcast
|
|
64
|
+
*/
|
|
65
|
+
async function moveToProcessing(job, queue, ctx) {
|
|
66
|
+
const procIdx = processingShardIndex(job.id);
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
await withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
69
|
+
ctx.processingShards[procIdx].set(job.id, job);
|
|
70
|
+
});
|
|
71
|
+
ctx.jobIndex.set(job.id, { type: 'processing', shardIdx: procIdx });
|
|
72
|
+
ctx.storage?.markActive(job.id, job.startedAt ?? now);
|
|
73
|
+
ctx.totalPulled.value++;
|
|
74
|
+
ctx.broadcast({
|
|
75
|
+
eventType: 'pulled',
|
|
76
|
+
queue,
|
|
77
|
+
jobId: job.id,
|
|
78
|
+
timestamp: now,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Move multiple jobs to processing shards (optimized: groups by shard)
|
|
83
|
+
*/
|
|
84
|
+
async function moveToProcessingBatch(jobs, queue, ctx) {
|
|
85
|
+
// Group by processing shard for efficiency
|
|
86
|
+
const byProcShard = new Map();
|
|
87
|
+
for (const job of jobs) {
|
|
88
|
+
const procIdx = processingShardIndex(job.id);
|
|
89
|
+
const shardJobs = byProcShard.get(procIdx) ?? [];
|
|
90
|
+
if (shardJobs.length === 0)
|
|
91
|
+
byProcShard.set(procIdx, shardJobs);
|
|
92
|
+
shardJobs.push(job);
|
|
93
|
+
}
|
|
94
|
+
// Add to processing shards in parallel
|
|
95
|
+
const lockPromises = [];
|
|
96
|
+
for (const [procIdx, shardJobs] of byProcShard) {
|
|
97
|
+
lockPromises.push(withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
98
|
+
for (const job of shardJobs) {
|
|
99
|
+
ctx.processingShards[procIdx].set(job.id, job);
|
|
100
|
+
}
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
await Promise.all(lockPromises);
|
|
104
|
+
// Update indexes and broadcast
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
for (const job of jobs) {
|
|
107
|
+
const procIdx = processingShardIndex(job.id);
|
|
108
|
+
ctx.jobIndex.set(job.id, { type: 'processing', shardIdx: procIdx });
|
|
109
|
+
ctx.storage?.markActive(job.id, job.startedAt ?? now);
|
|
110
|
+
ctx.totalPulled.value++;
|
|
111
|
+
ctx.broadcast({
|
|
112
|
+
eventType: 'pulled',
|
|
113
|
+
queue,
|
|
114
|
+
jobId: job.id,
|
|
115
|
+
timestamp: now,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
8
119
|
/**
|
|
9
120
|
* Pull next job from queue
|
|
10
121
|
*/
|
|
@@ -14,30 +125,14 @@ export async function pullJob(queue, timeoutMs, ctx) {
|
|
|
14
125
|
while (true) {
|
|
15
126
|
const job = await tryPullFromShard(queue, idx, ctx);
|
|
16
127
|
if (job) {
|
|
17
|
-
|
|
18
|
-
const procIdx = processingShardIndex(job.id);
|
|
19
|
-
await withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
20
|
-
ctx.processingShards[procIdx].set(job.id, job);
|
|
21
|
-
});
|
|
22
|
-
ctx.jobIndex.set(job.id, { type: 'processing', shardIdx: procIdx });
|
|
23
|
-
// Persist state change
|
|
24
|
-
const startedAt = job.startedAt ?? Date.now();
|
|
25
|
-
ctx.storage?.markActive(job.id, startedAt);
|
|
26
|
-
// Update metrics
|
|
27
|
-
ctx.totalPulled.value++;
|
|
28
|
-
ctx.broadcast({
|
|
29
|
-
eventType: 'pulled',
|
|
30
|
-
queue,
|
|
31
|
-
jobId: job.id,
|
|
32
|
-
timestamp: Date.now(),
|
|
33
|
-
});
|
|
128
|
+
await moveToProcessing(job, queue, ctx);
|
|
34
129
|
return job;
|
|
35
130
|
}
|
|
36
131
|
// No job available, check timeout
|
|
37
132
|
if (deadline === 0 || Date.now() >= deadline) {
|
|
38
133
|
return null;
|
|
39
134
|
}
|
|
40
|
-
// Wait for notification or timeout
|
|
135
|
+
// Wait for notification or timeout
|
|
41
136
|
const remaining = deadline - Date.now();
|
|
42
137
|
await ctx.shards[idx].waitForJob(remaining);
|
|
43
138
|
}
|
|
@@ -49,101 +144,44 @@ async function tryPullFromShard(queue, idx, ctx) {
|
|
|
49
144
|
return await withWriteLock(ctx.shardLocks[idx], () => {
|
|
50
145
|
const shard = ctx.shards[idx];
|
|
51
146
|
const state = shard.getState(queue);
|
|
52
|
-
|
|
53
|
-
|
|
147
|
+
if (state.paused) {
|
|
148
|
+
log('info', 'Queue is paused, skipping pull', { queue });
|
|
54
149
|
return null;
|
|
55
|
-
|
|
56
|
-
if (!shard.tryAcquireRateLimit(queue))
|
|
150
|
+
}
|
|
151
|
+
if (!shard.tryAcquireRateLimit(queue)) {
|
|
152
|
+
log('info', 'Rate limit reached', { queue });
|
|
57
153
|
return null;
|
|
58
|
-
|
|
59
|
-
if (!shard.tryAcquireConcurrency(queue))
|
|
154
|
+
}
|
|
155
|
+
if (!shard.tryAcquireConcurrency(queue)) {
|
|
156
|
+
log('info', 'Concurrency limit reached', { queue });
|
|
60
157
|
return null;
|
|
61
|
-
|
|
158
|
+
}
|
|
62
159
|
const now = Date.now();
|
|
63
|
-
// Find ready job
|
|
64
160
|
while (true) {
|
|
65
|
-
const
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// Update running counters for O(1) stats
|
|
72
|
-
shard.decrementQueued(job.id);
|
|
73
|
-
ctx.jobIndex.delete(job.id);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
// Check if ready
|
|
77
|
-
if (!isReady(job, now))
|
|
78
|
-
break;
|
|
79
|
-
// Check FIFO group
|
|
80
|
-
if (job.groupId && shard.isGroupActive(queue, job.groupId)) {
|
|
81
|
-
// Skip, will retry
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
// Dequeue
|
|
85
|
-
q.pop();
|
|
86
|
-
// Update running counters for O(1) stats
|
|
87
|
-
shard.decrementQueued(job.id);
|
|
88
|
-
// Mark group active
|
|
89
|
-
if (job.groupId) {
|
|
90
|
-
shard.activateGroup(queue, job.groupId);
|
|
91
|
-
}
|
|
92
|
-
// Update job
|
|
93
|
-
job.startedAt = now;
|
|
94
|
-
job.lastHeartbeat = now;
|
|
95
|
-
return job;
|
|
161
|
+
const result = tryDequeueNextJob(shard, queue, now, ctx);
|
|
162
|
+
if (result.status === 'job')
|
|
163
|
+
return result.job;
|
|
164
|
+
if (result.status === 'stop')
|
|
165
|
+
return null;
|
|
166
|
+
// status === 'skip': continue loop
|
|
96
167
|
}
|
|
97
|
-
return null;
|
|
98
168
|
});
|
|
99
169
|
}
|
|
100
170
|
/**
|
|
101
171
|
* Pull multiple jobs from queue
|
|
102
|
-
* Optimized: single lock acquisition for all jobs instead of O(count) locks
|
|
103
172
|
*/
|
|
104
173
|
export async function pullJobBatch(queue, count, timeoutMs, ctx) {
|
|
105
174
|
const deadline = timeoutMs > 0 ? Date.now() + timeoutMs : 0;
|
|
106
175
|
const idx = shardIndex(queue);
|
|
107
176
|
while (true) {
|
|
108
|
-
// Try to pull multiple jobs with single lock
|
|
109
177
|
const jobs = await tryPullBatchFromShard(queue, idx, count, ctx);
|
|
110
178
|
if (jobs.length > 0) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
shardJobs = [];
|
|
118
|
-
byProcShard.set(procIdx, shardJobs);
|
|
119
|
-
}
|
|
120
|
-
shardJobs.push(job);
|
|
121
|
-
}
|
|
122
|
-
// Add to processing shards in parallel - avoid Array.from allocation
|
|
123
|
-
const now = Date.now();
|
|
124
|
-
const lockPromises = [];
|
|
125
|
-
for (const [procIdx, shardJobs] of byProcShard) {
|
|
126
|
-
lockPromises.push(withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
127
|
-
for (const job of shardJobs) {
|
|
128
|
-
ctx.processingShards[procIdx].set(job.id, job);
|
|
129
|
-
}
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
await Promise.all(lockPromises);
|
|
133
|
-
// Update indexes and metrics
|
|
134
|
-
for (const job of jobs) {
|
|
135
|
-
const procIdx = processingShardIndex(job.id);
|
|
136
|
-
ctx.jobIndex.set(job.id, { type: 'processing', shardIdx: procIdx });
|
|
137
|
-
const startedAt = job.startedAt ?? now;
|
|
138
|
-
ctx.storage?.markActive(job.id, startedAt);
|
|
139
|
-
ctx.totalPulled.value++;
|
|
140
|
-
ctx.broadcast({
|
|
141
|
-
eventType: 'pulled',
|
|
142
|
-
queue,
|
|
143
|
-
jobId: job.id,
|
|
144
|
-
timestamp: now,
|
|
145
|
-
});
|
|
146
|
-
}
|
|
179
|
+
await moveToProcessingBatch(jobs, queue, ctx);
|
|
180
|
+
log('info', 'Batch pull completed', {
|
|
181
|
+
queue,
|
|
182
|
+
count: jobs.length,
|
|
183
|
+
requested: count,
|
|
184
|
+
});
|
|
147
185
|
return jobs;
|
|
148
186
|
}
|
|
149
187
|
// No jobs available, check timeout
|
|
@@ -156,54 +194,38 @@ export async function pullJobBatch(queue, count, timeoutMs, ctx) {
|
|
|
156
194
|
}
|
|
157
195
|
}
|
|
158
196
|
/**
|
|
159
|
-
* Try to pull multiple jobs from a shard
|
|
197
|
+
* Try to pull multiple jobs from a shard
|
|
160
198
|
*/
|
|
161
199
|
async function tryPullBatchFromShard(queue, idx, count, ctx) {
|
|
162
200
|
return await withWriteLock(ctx.shardLocks[idx], () => {
|
|
163
201
|
const shard = ctx.shards[idx];
|
|
164
202
|
const state = shard.getState(queue);
|
|
165
203
|
const jobs = [];
|
|
166
|
-
// Check if paused
|
|
167
204
|
if (state.paused)
|
|
168
205
|
return jobs;
|
|
169
|
-
const q = shard.getQueue(queue);
|
|
170
206
|
const now = Date.now();
|
|
171
|
-
// Pull up to count jobs
|
|
172
207
|
while (jobs.length < count) {
|
|
173
|
-
// Check
|
|
174
|
-
if (!shard.tryAcquireRateLimit(queue))
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
break;
|
|
179
|
-
const job = q.peek();
|
|
180
|
-
if (!job)
|
|
208
|
+
// Check limits per job
|
|
209
|
+
if (!shard.tryAcquireRateLimit(queue)) {
|
|
210
|
+
if (jobs.length === 0) {
|
|
211
|
+
log('info', 'Rate limit reached', { queue });
|
|
212
|
+
}
|
|
181
213
|
break;
|
|
182
|
-
// Skip expired jobs
|
|
183
|
-
if (isExpired(job, now)) {
|
|
184
|
-
q.pop();
|
|
185
|
-
shard.decrementQueued(job.id);
|
|
186
|
-
ctx.jobIndex.delete(job.id);
|
|
187
|
-
continue;
|
|
188
214
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (job.groupId && shard.isGroupActive(queue, job.groupId)) {
|
|
215
|
+
if (!shard.tryAcquireConcurrency(queue)) {
|
|
216
|
+
if (jobs.length === 0) {
|
|
217
|
+
log('info', 'Concurrency limit reached', { queue });
|
|
218
|
+
}
|
|
194
219
|
break;
|
|
195
220
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
if (
|
|
201
|
-
|
|
221
|
+
const result = tryDequeueNextJob(shard, queue, now, ctx);
|
|
222
|
+
if (result.status === 'job') {
|
|
223
|
+
jobs.push(result.job);
|
|
224
|
+
}
|
|
225
|
+
else if (result.status === 'stop') {
|
|
226
|
+
break;
|
|
202
227
|
}
|
|
203
|
-
//
|
|
204
|
-
job.startedAt = now;
|
|
205
|
-
job.lastHeartbeat = now;
|
|
206
|
-
jobs.push(job);
|
|
228
|
+
// status === 'skip': continue loop
|
|
207
229
|
}
|
|
208
230
|
return jobs;
|
|
209
231
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/application/operations/pull.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,SAAS,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKlF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/application/operations/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,10 +28,12 @@ export interface PushContext {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Push a single job to queue
|
|
31
|
+
* NOTE: customId check happens OUTSIDE lock for performance (unlike batch)
|
|
31
32
|
*/
|
|
32
33
|
export declare function pushJob(queue: string, input: JobInput, ctx: PushContext): Promise<Job>;
|
|
33
34
|
/**
|
|
34
35
|
* Push multiple jobs to queue
|
|
36
|
+
* NOTE: customId check happens INSIDE lock (safer for concurrent batch inserts)
|
|
35
37
|
*/
|
|
36
38
|
export declare function pushJobBatch(queue: string, inputs: JobInput[], ctx: PushContext): Promise<JobId[]>;
|
|
37
39
|
//# sourceMappingURL=push.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,QAAQ,EAId,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,QAAQ,EAId,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,KAAK,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAwBzD,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,EAAE,CAAC,KAAK,EAAE;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,IAAI,CAAC;CACZ;AA0JD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAkE5F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,EAAE,EAClB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,KAAK,EAAE,CAAC,CAgDlB"}
|
|
@@ -5,162 +5,247 @@
|
|
|
5
5
|
import { createJob, generateJobId, jobId, } from '../../domain/types/job';
|
|
6
6
|
import { withWriteLock } from '../../shared/lock';
|
|
7
7
|
import { shardIndex } from '../../shared/hash';
|
|
8
|
+
const LOG_PREFIX = '[Push]';
|
|
9
|
+
/** Structured log helper */
|
|
10
|
+
function log(level, message, data) {
|
|
11
|
+
const entry = data ? { message, ...data } : message;
|
|
12
|
+
switch (level) {
|
|
13
|
+
case 'info':
|
|
14
|
+
console.log(LOG_PREFIX, entry);
|
|
15
|
+
break;
|
|
16
|
+
case 'warn':
|
|
17
|
+
console.warn(LOG_PREFIX, entry);
|
|
18
|
+
break;
|
|
19
|
+
case 'error':
|
|
20
|
+
console.error(LOG_PREFIX, entry);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle custom ID idempotency check
|
|
26
|
+
* Returns existing job if found, or new ID to use
|
|
27
|
+
*/
|
|
28
|
+
function handleCustomId(input, shard, ctx) {
|
|
29
|
+
if (!input.customId) {
|
|
30
|
+
return { skip: false, id: generateJobId() };
|
|
31
|
+
}
|
|
32
|
+
const id = jobId(input.customId);
|
|
33
|
+
const existing = ctx.customIdMap.get(input.customId);
|
|
34
|
+
// No existing mapping - register and proceed
|
|
35
|
+
if (!existing) {
|
|
36
|
+
ctx.customIdMap.set(input.customId, id);
|
|
37
|
+
return { skip: false, id };
|
|
38
|
+
}
|
|
39
|
+
// Check if existing job is still in queue
|
|
40
|
+
const location = ctx.jobIndex.get(existing);
|
|
41
|
+
const existingJob = location?.type === 'queue' ? shard.getQueue(location.queueName).find(existing) : null;
|
|
42
|
+
if (existingJob) {
|
|
43
|
+
log('info', 'Duplicate customId, returning existing job', {
|
|
44
|
+
customId: input.customId,
|
|
45
|
+
existingJobId: String(existing),
|
|
46
|
+
});
|
|
47
|
+
return { skip: true, existingJob };
|
|
48
|
+
}
|
|
49
|
+
// Job gone (processing/completed) - allow reuse of customId
|
|
50
|
+
ctx.customIdMap.delete(input.customId);
|
|
51
|
+
ctx.customIdMap.set(input.customId, id);
|
|
52
|
+
return { skip: false, id };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Handle unique key deduplication
|
|
56
|
+
* Returns existing job ID if duplicate found and should skip, or allows insert
|
|
57
|
+
*/
|
|
58
|
+
function handleDeduplication(job, input, queue, shard, ctx) {
|
|
59
|
+
if (!job.uniqueKey) {
|
|
60
|
+
return { skip: false };
|
|
61
|
+
}
|
|
62
|
+
const q = shard.getQueue(queue);
|
|
63
|
+
const existingEntry = shard.getUniqueKeyEntry(queue, job.uniqueKey);
|
|
64
|
+
if (!existingEntry) {
|
|
65
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
66
|
+
return { skip: false };
|
|
67
|
+
}
|
|
68
|
+
const dedupOpts = input.dedup;
|
|
69
|
+
// Replace strategy: remove old, insert new
|
|
70
|
+
if (dedupOpts?.replace) {
|
|
71
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
72
|
+
if (existingJob) {
|
|
73
|
+
q.remove(existingEntry.jobId);
|
|
74
|
+
shard.decrementQueued(existingEntry.jobId);
|
|
75
|
+
ctx.jobIndex.delete(existingEntry.jobId);
|
|
76
|
+
log('info', 'Dedup replace: removed existing job', {
|
|
77
|
+
queue,
|
|
78
|
+
uniqueKey: job.uniqueKey,
|
|
79
|
+
removedJobId: String(existingEntry.jobId),
|
|
80
|
+
newJobId: String(job.id),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
shard.releaseUniqueKey(queue, job.uniqueKey);
|
|
84
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, dedupOpts?.ttl);
|
|
85
|
+
return { skip: false };
|
|
86
|
+
}
|
|
87
|
+
// Extend strategy: reset TTL, return existing
|
|
88
|
+
if (dedupOpts?.extend && dedupOpts?.ttl) {
|
|
89
|
+
shard.extendUniqueKeyTtl(queue, job.uniqueKey, dedupOpts.ttl);
|
|
90
|
+
if (input.customId)
|
|
91
|
+
ctx.customIdMap.delete(input.customId);
|
|
92
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
93
|
+
if (existingJob) {
|
|
94
|
+
log('info', 'Dedup extend: extended TTL, returning existing job', {
|
|
95
|
+
queue,
|
|
96
|
+
uniqueKey: job.uniqueKey,
|
|
97
|
+
existingJobId: String(existingEntry.jobId),
|
|
98
|
+
ttl: dedupOpts.ttl,
|
|
99
|
+
});
|
|
100
|
+
return { skip: true, existingId: existingEntry.jobId };
|
|
101
|
+
}
|
|
102
|
+
throw new Error('Duplicate unique_key (extended TTL)');
|
|
103
|
+
}
|
|
104
|
+
// Default: return existing job (BullMQ-style)
|
|
105
|
+
if (input.customId)
|
|
106
|
+
ctx.customIdMap.delete(input.customId);
|
|
107
|
+
const existingJob = q.find(existingEntry.jobId);
|
|
108
|
+
if (existingJob) {
|
|
109
|
+
ctx.broadcast({
|
|
110
|
+
eventType: "duplicated" /* EventType.Duplicated */,
|
|
111
|
+
queue,
|
|
112
|
+
jobId: existingEntry.jobId,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
});
|
|
115
|
+
return { skip: true, existingId: existingEntry.jobId };
|
|
116
|
+
}
|
|
117
|
+
// Job not in queue (completed/failed) - allow new insert
|
|
118
|
+
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
119
|
+
return { skip: false };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Insert job into shard (queue or waitingDeps)
|
|
123
|
+
*/
|
|
124
|
+
function insertJobToShard(job, queue, shard, shardIdx, ctx) {
|
|
125
|
+
const hasDeps = job.dependsOn.length > 0;
|
|
126
|
+
const needsWaiting = hasDeps && !job.dependsOn.every((depId) => ctx.completedJobs.has(depId));
|
|
127
|
+
if (needsWaiting) {
|
|
128
|
+
shard.waitingDeps.set(job.id, job);
|
|
129
|
+
shard.registerDependencies(job.id, job.dependsOn);
|
|
130
|
+
log('info', 'Job waiting for dependencies', {
|
|
131
|
+
queue,
|
|
132
|
+
jobId: String(job.id),
|
|
133
|
+
pendingDeps: job.dependsOn.filter((d) => !ctx.completedJobs.has(d)).map(String),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
shard.getQueue(queue).push(job);
|
|
138
|
+
const isDelayed = job.runAt > Date.now();
|
|
139
|
+
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
140
|
+
}
|
|
141
|
+
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx, queueName: queue });
|
|
142
|
+
}
|
|
8
143
|
/**
|
|
9
144
|
* Push a single job to queue
|
|
145
|
+
* NOTE: customId check happens OUTSIDE lock for performance (unlike batch)
|
|
10
146
|
*/
|
|
11
147
|
export async function pushJob(queue, input, ctx) {
|
|
12
|
-
|
|
148
|
+
const idx = shardIndex(queue);
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
// Check custom ID idempotency OUTSIDE lock (original behavior)
|
|
13
151
|
const id = input.customId ? jobId(input.customId) : generateJobId();
|
|
14
|
-
// Handle custom ID idempotency (BullMQ-style: return existing job)
|
|
15
152
|
if (input.customId) {
|
|
16
153
|
const existing = ctx.customIdMap.get(input.customId);
|
|
17
154
|
if (existing) {
|
|
18
155
|
const location = ctx.jobIndex.get(existing);
|
|
19
156
|
if (location?.type === 'queue') {
|
|
20
|
-
// BullMQ-style: return existing job instead of creating a duplicate
|
|
21
157
|
const shard = ctx.shards[location.shardIdx];
|
|
22
158
|
const existingJob = shard.getQueue(location.queueName).find(existing);
|
|
23
159
|
if (existingJob) {
|
|
160
|
+
log('info', 'Duplicate customId, returning existing job', {
|
|
161
|
+
queue,
|
|
162
|
+
customId: input.customId,
|
|
163
|
+
existingJobId: String(existing),
|
|
164
|
+
});
|
|
24
165
|
return existingJob;
|
|
25
166
|
}
|
|
26
167
|
}
|
|
27
|
-
// If job is processing, completed, or not found, clean up the map entry
|
|
28
|
-
// and allow creating a new job with the same customId
|
|
29
168
|
ctx.customIdMap.delete(input.customId);
|
|
30
169
|
}
|
|
31
170
|
ctx.customIdMap.set(input.customId, id);
|
|
32
171
|
}
|
|
33
|
-
// Create job
|
|
34
|
-
const now = Date.now();
|
|
35
172
|
const job = createJob(id, queue, input, now);
|
|
36
|
-
|
|
37
|
-
// Note: The actual dependency check MUST happen inside the lock to avoid race conditions
|
|
38
|
-
const hasDependencies = job.dependsOn.length > 0;
|
|
39
|
-
// Insert into shard
|
|
40
|
-
const idx = shardIndex(queue);
|
|
41
|
-
let returnedJob;
|
|
173
|
+
let result;
|
|
42
174
|
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
43
175
|
const shard = ctx.shards[idx];
|
|
44
|
-
// Check
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// Replace strategy: remove old job, insert new
|
|
52
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
53
|
-
if (existingJob) {
|
|
54
|
-
shard.getQueue(queue).remove(existingEntry.jobId);
|
|
55
|
-
shard.decrementQueued(existingEntry.jobId);
|
|
56
|
-
ctx.jobIndex.delete(existingEntry.jobId);
|
|
57
|
-
}
|
|
58
|
-
// Release old unique key entry before registering new one to avoid stale TTL
|
|
59
|
-
shard.releaseUniqueKey(queue, job.uniqueKey);
|
|
60
|
-
// Register new key with TTL
|
|
61
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, dedupOpts?.ttl);
|
|
62
|
-
}
|
|
63
|
-
else if (dedupOpts?.extend && dedupOpts?.ttl) {
|
|
64
|
-
// Extend strategy: reset TTL, return existing job
|
|
65
|
-
shard.extendUniqueKeyTtl(queue, job.uniqueKey, dedupOpts.ttl);
|
|
66
|
-
// Rollback custom ID since we're not inserting
|
|
67
|
-
if (input.customId) {
|
|
68
|
-
ctx.customIdMap.delete(input.customId);
|
|
69
|
-
}
|
|
70
|
-
// Set returnedJob to existing job
|
|
71
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
72
|
-
if (existingJob) {
|
|
73
|
-
returnedJob = existingJob;
|
|
74
|
-
return; // Exit early from withWriteLock
|
|
75
|
-
}
|
|
76
|
-
throw new Error('Duplicate unique_key (extended TTL)');
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
// Default: return existing job (BullMQ-style idempotency)
|
|
80
|
-
if (input.customId) {
|
|
81
|
-
ctx.customIdMap.delete(input.customId);
|
|
82
|
-
}
|
|
83
|
-
const existingJob = shard.getQueue(queue).find(existingEntry.jobId);
|
|
84
|
-
if (existingJob) {
|
|
85
|
-
// Emit duplicated event (BullMQ v5)
|
|
86
|
-
ctx.broadcast({
|
|
87
|
-
eventType: "duplicated" /* EventType.Duplicated */,
|
|
88
|
-
queue,
|
|
89
|
-
jobId: existingEntry.jobId,
|
|
90
|
-
timestamp: Date.now(),
|
|
91
|
-
});
|
|
92
|
-
returnedJob = existingJob;
|
|
93
|
-
return; // Exit early, return existing job
|
|
94
|
-
}
|
|
95
|
-
// Job not in queue (maybe completed/failed) - allow new insert
|
|
96
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
97
|
-
}
|
|
176
|
+
// Check deduplication
|
|
177
|
+
const dedupResult = handleDeduplication(job, input, queue, shard, ctx);
|
|
178
|
+
if (dedupResult.skip) {
|
|
179
|
+
const existingJob = shard.getQueue(queue).find(dedupResult.existingId);
|
|
180
|
+
if (existingJob) {
|
|
181
|
+
result = { job: existingJob, persisted: false };
|
|
182
|
+
return;
|
|
98
183
|
}
|
|
99
|
-
else {
|
|
100
|
-
// No existing entry - register with TTL if specified
|
|
101
|
-
shard.registerUniqueKeyWithTtl(queue, job.uniqueKey, job.id, input.dedup?.ttl);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
// Always check dependencies inside lock if job has any
|
|
105
|
-
// This avoids a race condition where dependencies could change between pre-check and lock acquisition
|
|
106
|
-
const needsWaitingDeps = hasDependencies && !job.dependsOn.every((depId) => ctx.completedJobs.has(depId));
|
|
107
|
-
// Insert based on state
|
|
108
|
-
if (needsWaitingDeps) {
|
|
109
|
-
shard.waitingDeps.set(job.id, job);
|
|
110
|
-
// Register in dependency index for O(1) lookup when deps complete
|
|
111
|
-
shard.registerDependencies(job.id, job.dependsOn);
|
|
112
184
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
shard.incrementQueued(job.id, isDelayed, job.createdAt, queue, job.runAt);
|
|
118
|
-
shard.notify();
|
|
119
|
-
}
|
|
120
|
-
// Index job
|
|
121
|
-
ctx.jobIndex.set(job.id, { type: 'queue', shardIdx: idx, queueName: queue });
|
|
185
|
+
// Insert to shard
|
|
186
|
+
insertJobToShard(job, queue, shard, idx, ctx);
|
|
187
|
+
shard.notify();
|
|
188
|
+
result = { job, persisted: true };
|
|
122
189
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
190
|
+
if (!result) {
|
|
191
|
+
log('error', 'Push failed unexpectedly', { queue, jobId: String(id) });
|
|
192
|
+
throw new Error('Push failed');
|
|
126
193
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
194
|
+
if (result.persisted) {
|
|
195
|
+
ctx.storage?.insertJob(result.job, input.durable);
|
|
196
|
+
ctx.totalPushed.value++;
|
|
197
|
+
ctx.broadcast({
|
|
198
|
+
eventType: 'pushed',
|
|
199
|
+
queue,
|
|
200
|
+
jobId: result.job.id,
|
|
201
|
+
timestamp: now,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return result.job;
|
|
133
205
|
}
|
|
134
206
|
/**
|
|
135
207
|
* Push multiple jobs to queue
|
|
208
|
+
* NOTE: customId check happens INSIDE lock (safer for concurrent batch inserts)
|
|
136
209
|
*/
|
|
137
210
|
export async function pushJobBatch(queue, inputs, ctx) {
|
|
138
|
-
const jobs = [];
|
|
139
211
|
const now = Date.now();
|
|
140
|
-
// Generate all jobs
|
|
141
|
-
for (const input of inputs) {
|
|
142
|
-
const id = generateJobId();
|
|
143
|
-
jobs.push(createJob(id, queue, input, now));
|
|
144
|
-
}
|
|
145
|
-
// Insert into shard
|
|
146
212
|
const idx = shardIndex(queue);
|
|
213
|
+
const resultIds = [];
|
|
214
|
+
const jobsToInsert = [];
|
|
147
215
|
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
148
216
|
const shard = ctx.shards[idx];
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
217
|
+
for (const input of inputs) {
|
|
218
|
+
// Check custom ID idempotency
|
|
219
|
+
const customIdResult = handleCustomId(input, shard, ctx);
|
|
220
|
+
if (customIdResult.skip) {
|
|
221
|
+
resultIds.push(customIdResult.existingJob.id);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const job = createJob(customIdResult.id, queue, input, now);
|
|
225
|
+
// Check deduplication
|
|
226
|
+
const dedupResult = handleDeduplication(job, input, queue, shard, ctx);
|
|
227
|
+
if (dedupResult.skip) {
|
|
228
|
+
resultIds.push(dedupResult.existingId);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Insert to shard
|
|
232
|
+
insertJobToShard(job, queue, shard, idx, ctx);
|
|
233
|
+
jobsToInsert.push(job);
|
|
234
|
+
resultIds.push(job.id);
|
|
235
|
+
}
|
|
236
|
+
if (jobsToInsert.length > 0) {
|
|
237
|
+
shard.notify();
|
|
157
238
|
}
|
|
158
|
-
shard.notify();
|
|
159
239
|
});
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
240
|
+
if (jobsToInsert.length > 0) {
|
|
241
|
+
ctx.storage?.insertJobsBatch(jobsToInsert);
|
|
242
|
+
ctx.totalPushed.value += BigInt(jobsToInsert.length);
|
|
243
|
+
log('info', 'Batch push completed', {
|
|
244
|
+
queue,
|
|
245
|
+
inserted: jobsToInsert.length,
|
|
246
|
+
duplicates: inputs.length - jobsToInsert.length,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return resultIds;
|
|
165
250
|
}
|
|
166
251
|
//# sourceMappingURL=push.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,SAAS,EACT,aAAa,EACb,KAAK,GACN,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,8 +54,8 @@ export interface IPCRequest {
|
|
|
54
54
|
}
|
|
55
55
|
/** IPC message from worker to main */
|
|
56
56
|
export interface IPCResponse {
|
|
57
|
-
type: 'result' | 'error' | 'progress';
|
|
58
|
-
jobId
|
|
57
|
+
type: 'result' | 'error' | 'progress' | 'ready';
|
|
58
|
+
jobId?: string;
|
|
59
59
|
result?: unknown;
|
|
60
60
|
error?: string;
|
|
61
61
|
progress?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,6CAA6C;AAC7C,MAAM,WAAW,8BAA8B;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,sBAAsB,EAKvB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,sBAAsB,EAKvB,MAAM,SAAS,CAAC;AAyBjB;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB;IAe9D,sCAAsC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,kCAAkC;IAC5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,4BAA4B;IAC5B,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAM3E,iCAAiC;IACjC,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,WAAW;YAmDL,QAAQ;IAatB,OAAO,CAAC,QAAQ;IA0BhB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;CAwBpB"}
|
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { getSharedManager } from '../manager';
|
|
6
6
|
import { createWrapperScript, cleanupWrapperScript } from './wrapper';
|
|
7
|
+
const LOG_PREFIX = '[SandboxedWorker]';
|
|
8
|
+
/** Structured log helper */
|
|
9
|
+
function log(level, message, data) {
|
|
10
|
+
const entry = data ? { message, ...data } : message;
|
|
11
|
+
switch (level) {
|
|
12
|
+
case 'info':
|
|
13
|
+
console.log(LOG_PREFIX, entry);
|
|
14
|
+
break;
|
|
15
|
+
case 'warn':
|
|
16
|
+
console.warn(LOG_PREFIX, entry);
|
|
17
|
+
break;
|
|
18
|
+
case 'error':
|
|
19
|
+
console.error(LOG_PREFIX, entry);
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
7
23
|
/**
|
|
8
24
|
* Sandboxed Worker - runs processors in isolated Bun Worker processes
|
|
9
25
|
*/
|
|
@@ -36,9 +52,12 @@ export class SandboxedWorker {
|
|
|
36
52
|
return;
|
|
37
53
|
this.running = true;
|
|
38
54
|
this.wrapperPath = await createWrapperScript(this.queueName, this.options.processor);
|
|
55
|
+
// Spawn all workers and wait for them to be ready
|
|
56
|
+
const spawnPromises = [];
|
|
39
57
|
for (let i = 0; i < this.options.concurrency; i++) {
|
|
40
|
-
this.spawnWorker(i);
|
|
58
|
+
spawnPromises.push(this.spawnWorker(i));
|
|
41
59
|
}
|
|
60
|
+
await Promise.all(spawnPromises);
|
|
42
61
|
this.pullPromise = this.pullLoop();
|
|
43
62
|
}
|
|
44
63
|
/** Stop all workers gracefully */
|
|
@@ -60,29 +79,62 @@ export class SandboxedWorker {
|
|
|
60
79
|
const restarts = this.workers.reduce((sum, w) => sum + w.restarts, 0);
|
|
61
80
|
return { total: this.workers.length, busy, idle: this.workers.length - busy, restarts };
|
|
62
81
|
}
|
|
82
|
+
/** Reset worker state to idle */
|
|
83
|
+
resetWorkerState(wp) {
|
|
84
|
+
if (wp.timeoutId) {
|
|
85
|
+
clearTimeout(wp.timeoutId);
|
|
86
|
+
wp.timeoutId = null;
|
|
87
|
+
}
|
|
88
|
+
wp.busy = false;
|
|
89
|
+
wp.currentJob = null;
|
|
90
|
+
wp.currentToken = null;
|
|
91
|
+
}
|
|
63
92
|
spawnWorker(index) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
if (!this.wrapperPath) {
|
|
95
|
+
resolve();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const worker = new Worker(this.wrapperPath, { smol: this.options.maxMemory <= 64 });
|
|
99
|
+
const wp = {
|
|
100
|
+
worker,
|
|
101
|
+
busy: false,
|
|
102
|
+
currentJob: null,
|
|
103
|
+
currentToken: null,
|
|
104
|
+
restarts: this.workers[index]?.restarts ?? 0,
|
|
105
|
+
timeoutId: null,
|
|
106
|
+
};
|
|
107
|
+
let resolved = false;
|
|
108
|
+
const readyTimeout = setTimeout(() => {
|
|
109
|
+
if (!resolved) {
|
|
110
|
+
resolved = true;
|
|
111
|
+
log('warn', 'Worker ready timeout, continuing anyway', { workerIndex: index });
|
|
112
|
+
resolve();
|
|
113
|
+
}
|
|
114
|
+
}, 5000);
|
|
115
|
+
worker.onmessage = (event) => {
|
|
116
|
+
if (event.data.type === 'ready' && !resolved) {
|
|
117
|
+
resolved = true;
|
|
118
|
+
clearTimeout(readyTimeout);
|
|
119
|
+
resolve();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.handleMessage(wp, event.data);
|
|
123
|
+
};
|
|
124
|
+
worker.onerror = (error) => {
|
|
125
|
+
log('error', 'Worker error', { workerIndex: index, error: error.message });
|
|
126
|
+
if (!resolved) {
|
|
127
|
+
resolved = true;
|
|
128
|
+
clearTimeout(readyTimeout);
|
|
129
|
+
reject(new Error(error.message));
|
|
130
|
+
}
|
|
131
|
+
this.handleCrash(wp, index);
|
|
132
|
+
};
|
|
133
|
+
if (this.workers[index])
|
|
134
|
+
this.workers[index] = wp;
|
|
135
|
+
else
|
|
136
|
+
this.workers.push(wp);
|
|
137
|
+
});
|
|
86
138
|
}
|
|
87
139
|
async pullLoop() {
|
|
88
140
|
while (this.running) {
|
|
@@ -111,16 +163,19 @@ export class SandboxedWorker {
|
|
|
111
163
|
wp.worker.postMessage(request);
|
|
112
164
|
}
|
|
113
165
|
catch (err) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
wp
|
|
119
|
-
|
|
120
|
-
|
|
166
|
+
log('error', 'Failed to dispatch job', {
|
|
167
|
+
jobId: String(job.id),
|
|
168
|
+
error: err instanceof Error ? err.message : String(err),
|
|
169
|
+
});
|
|
170
|
+
this.resetWorkerState(wp);
|
|
171
|
+
this.manager
|
|
172
|
+
.fail(job.id, 'Dispatch failed: worker terminated', token ?? undefined)
|
|
173
|
+
.catch(() => { });
|
|
121
174
|
}
|
|
122
175
|
}
|
|
123
176
|
handleMessage(wp, msg) {
|
|
177
|
+
if (msg.type === 'ready')
|
|
178
|
+
return;
|
|
124
179
|
if (!wp.currentJob || msg.jobId !== String(wp.currentJob.id))
|
|
125
180
|
return;
|
|
126
181
|
switch (msg.type) {
|
|
@@ -138,72 +193,67 @@ export class SandboxedWorker {
|
|
|
138
193
|
}
|
|
139
194
|
}
|
|
140
195
|
complete(wp, result) {
|
|
141
|
-
if (wp.timeoutId) {
|
|
142
|
-
clearTimeout(wp.timeoutId);
|
|
143
|
-
wp.timeoutId = null;
|
|
144
|
-
}
|
|
145
196
|
if (wp.currentJob) {
|
|
146
197
|
const jobId = wp.currentJob.id;
|
|
147
198
|
const token = wp.currentToken ?? undefined;
|
|
148
199
|
this.manager.ack(jobId, result, token).catch((e) => {
|
|
149
|
-
|
|
200
|
+
log('error', 'Failed to ack job', {
|
|
201
|
+
jobId: String(jobId),
|
|
202
|
+
error: e instanceof Error ? e.message : String(e),
|
|
203
|
+
});
|
|
150
204
|
});
|
|
151
205
|
}
|
|
152
|
-
wp
|
|
153
|
-
wp.currentJob = null;
|
|
154
|
-
wp.currentToken = null;
|
|
206
|
+
this.resetWorkerState(wp);
|
|
155
207
|
}
|
|
156
208
|
fail(wp, error) {
|
|
157
|
-
if (wp.timeoutId) {
|
|
158
|
-
clearTimeout(wp.timeoutId);
|
|
159
|
-
wp.timeoutId = null;
|
|
160
|
-
}
|
|
161
209
|
if (wp.currentJob) {
|
|
162
210
|
const jobId = wp.currentJob.id;
|
|
163
211
|
const token = wp.currentToken ?? undefined;
|
|
164
212
|
this.manager.fail(jobId, error, token).catch((e) => {
|
|
165
|
-
|
|
213
|
+
log('error', 'Failed to mark job as failed', {
|
|
214
|
+
jobId: String(jobId),
|
|
215
|
+
error: e instanceof Error ? e.message : String(e),
|
|
216
|
+
});
|
|
166
217
|
});
|
|
167
218
|
}
|
|
168
|
-
wp
|
|
169
|
-
wp.currentJob = null;
|
|
170
|
-
wp.currentToken = null;
|
|
219
|
+
this.resetWorkerState(wp);
|
|
171
220
|
}
|
|
172
221
|
handleTimeout(wp, job) {
|
|
173
|
-
|
|
222
|
+
log('warn', 'Job timed out', {
|
|
223
|
+
jobId: String(job.id),
|
|
224
|
+
timeoutMs: this.options.timeout,
|
|
225
|
+
});
|
|
174
226
|
wp.worker.terminate();
|
|
175
227
|
const token = wp.currentToken ?? undefined;
|
|
176
228
|
this.manager
|
|
177
229
|
.fail(job.id, `Job timed out after ${this.options.timeout}ms`, token)
|
|
178
230
|
.catch(() => { });
|
|
179
|
-
|
|
180
|
-
wp.currentJob = null;
|
|
181
|
-
wp.currentToken = null;
|
|
182
|
-
wp.timeoutId = null;
|
|
231
|
+
this.resetWorkerState(wp);
|
|
183
232
|
const index = this.workers.indexOf(wp);
|
|
184
233
|
if (index !== -1)
|
|
185
234
|
this.handleCrash(wp, index);
|
|
186
235
|
}
|
|
187
236
|
handleCrash(wp, index) {
|
|
188
|
-
// Clear timeout if still pending (e.g., when called from onerror)
|
|
189
|
-
if (wp.timeoutId) {
|
|
190
|
-
clearTimeout(wp.timeoutId);
|
|
191
|
-
wp.timeoutId = null;
|
|
192
|
-
}
|
|
193
237
|
if (wp.currentJob) {
|
|
194
238
|
const token = wp.currentToken ?? undefined;
|
|
195
239
|
this.manager.fail(wp.currentJob.id, 'Worker crashed', token).catch(() => { });
|
|
196
240
|
}
|
|
197
|
-
wp
|
|
198
|
-
wp.currentJob = null;
|
|
199
|
-
wp.currentToken = null;
|
|
241
|
+
this.resetWorkerState(wp);
|
|
200
242
|
wp.restarts++;
|
|
201
243
|
if (this.options.autoRestart && wp.restarts < this.options.maxRestarts && this.running) {
|
|
202
|
-
|
|
203
|
-
this.spawnWorker(index)
|
|
244
|
+
log('info', 'Restarting worker', { workerIndex: index, attempt: wp.restarts });
|
|
245
|
+
this.spawnWorker(index).catch((err) => {
|
|
246
|
+
log('error', 'Failed to restart worker', {
|
|
247
|
+
workerIndex: index,
|
|
248
|
+
error: err instanceof Error ? err.message : String(err),
|
|
249
|
+
});
|
|
250
|
+
});
|
|
204
251
|
}
|
|
205
252
|
else if (wp.restarts >= this.options.maxRestarts) {
|
|
206
|
-
|
|
253
|
+
log('error', 'Worker exceeded max restarts', {
|
|
254
|
+
workerIndex: index,
|
|
255
|
+
maxRestarts: this.options.maxRestarts,
|
|
256
|
+
});
|
|
207
257
|
}
|
|
208
258
|
}
|
|
209
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AASlE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtE;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,SAAS,CAAS;IAClB,OAAO,CAAiC;IACxC,OAAO,GAAoB,EAAE,CAAC;IACvC,OAAO,GAAG,KAAK,CAAC;IAChB,WAAW,GAAyB,IAAI,CAAC;IACzC,WAAW,GAAkB,IAAI,CAAC;IACzB,OAAO,CAAgB;IACvB,QAAQ,CAAS;IAElC,YAAY,SAAiB,EAAE,OAA+B;QAC5D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACzG,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;YACrC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,GAAG;YACnC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAErF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/client/sandboxed/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/client/sandboxed/wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAmDjB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF"}
|
|
@@ -23,6 +23,9 @@ export async function createWrapperScript(queueName, processorPath) {
|
|
|
23
23
|
// Sandboxed Worker Wrapper
|
|
24
24
|
const processor = (await import('${escapedPath}')).default;
|
|
25
25
|
|
|
26
|
+
// Signal ready to parent
|
|
27
|
+
self.postMessage({ type: 'ready' });
|
|
28
|
+
|
|
26
29
|
self.onmessage = async (event) => {
|
|
27
30
|
const { type, job } = event.data;
|
|
28
31
|
if (type !== 'job') return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/client/sandboxed/wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,SAAS,wBAAwB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,aAAqB;IAErB,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5C,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;IAExC,kFAAkF;IAClF,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG;;mCAEa,WAAW
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/client/sandboxed/wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,SAAS,wBAAwB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,aAAqB;IAErB,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5C,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;IAExC,kFAAkF;IAClF,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG;;mCAEa,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B7C,CAAC;IAEA,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,mBAAmB,CAAC;IAC/D,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,OAAO,WAAW,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;IACtE,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE1C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAA0B;IACnE,IAAI,CAAC,WAAW;QAAE,OAAO;IAEzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bunqueue",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.6",
|
|
4
4
|
"description": "High-performance job queue server written in Bun. SQLite persistence, cron scheduling, priorities, retries, DLQ, webhooks. Minimal dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|