@igniter-js/jobs 0.1.13 → 0.1.15
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/AGENTS.md +119 -243
- package/README.md +352 -158
- package/dist/{adapter-CXZxomI9.d.mts → adapter-DDyMVche.d.mts} +125 -20
- package/dist/{adapter-CXZxomI9.d.ts → adapter-DDyMVche.d.ts} +125 -20
- package/dist/adapters/bun.d.mts +101 -0
- package/dist/adapters/bun.d.ts +101 -0
- package/dist/adapters/bun.js +1048 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/bun.mjs +1046 -0
- package/dist/adapters/bun.mjs.map +1 -0
- package/dist/adapters/{memory.adapter.d.ts → mock.d.mts} +7 -3
- package/dist/adapters/{memory.adapter.d.mts → mock.d.ts} +7 -3
- package/dist/adapters/{memory.adapter.js → mock.js} +122 -25
- package/dist/adapters/mock.js.map +1 -0
- package/dist/adapters/{memory.adapter.mjs → mock.mjs} +122 -25
- package/dist/adapters/mock.mjs.map +1 -0
- package/dist/adapters/{bullmq.adapter.d.mts → node.d.mts} +8 -3
- package/dist/adapters/{bullmq.adapter.d.ts → node.d.ts} +8 -3
- package/dist/adapters/{bullmq.adapter.js → node.js} +194 -40
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/{bullmq.adapter.mjs → node.mjs} +194 -40
- package/dist/adapters/node.mjs.map +1 -0
- package/dist/index.d.mts +41 -38
- package/dist/index.d.ts +41 -38
- package/dist/index.js +145 -1856
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +146 -1854
- package/dist/index.mjs.map +1 -1
- package/package.json +29 -41
- package/CHANGELOG.md +0 -13
- package/dist/adapters/bullmq.adapter.js.map +0 -1
- package/dist/adapters/bullmq.adapter.mjs.map +0 -1
- package/dist/adapters/index.d.mts +0 -143
- package/dist/adapters/index.d.ts +0 -143
- package/dist/adapters/index.js +0 -1891
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/index.mjs +0 -1887
- package/dist/adapters/index.mjs.map +0 -1
- package/dist/adapters/memory.adapter.js.map +0 -1
- package/dist/adapters/memory.adapter.mjs.map +0 -1
|
@@ -28,6 +28,11 @@ var _IgniterJobsPrefix = class _IgniterJobsPrefix {
|
|
|
28
28
|
if (!params.scope) return base;
|
|
29
29
|
return `${base}:scope:${params.scope.type}:${params.scope.id}`;
|
|
30
30
|
}
|
|
31
|
+
static buildJobStreamChannel(params) {
|
|
32
|
+
const base = `${_IgniterJobsPrefix.BASE_PREFIX}:stream:${params.environment}:${params.service}:${params.queue}:${params.jobId}`;
|
|
33
|
+
if (!params.scope) return base;
|
|
34
|
+
return `${base}:scope:${params.scope.type}:${params.scope.id}`;
|
|
35
|
+
}
|
|
31
36
|
};
|
|
32
37
|
_IgniterJobsPrefix.BASE_PREFIX = "igniter:jobs";
|
|
33
38
|
var IgniterJobsPrefix = _IgniterJobsPrefix;
|
|
@@ -169,37 +174,68 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
169
174
|
});
|
|
170
175
|
}
|
|
171
176
|
async getJob(jobId, queue) {
|
|
172
|
-
const result = await this.core().job.get(
|
|
177
|
+
const result = await this.core().job.get(
|
|
178
|
+
jobId,
|
|
179
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
180
|
+
);
|
|
173
181
|
return result ? this.mapJob(result, queue) : null;
|
|
174
182
|
}
|
|
175
183
|
async getJobState(jobId, queue) {
|
|
176
|
-
const state = await this.core().job.getState(
|
|
184
|
+
const state = await this.core().job.getState(
|
|
185
|
+
jobId,
|
|
186
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
187
|
+
);
|
|
177
188
|
return state;
|
|
178
189
|
}
|
|
179
190
|
async getJobLogs(jobId, queue) {
|
|
180
|
-
const logs = await this.core().job.getLogs(
|
|
191
|
+
const logs = await this.core().job.getLogs(
|
|
192
|
+
jobId,
|
|
193
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
194
|
+
);
|
|
181
195
|
return logs;
|
|
182
196
|
}
|
|
183
197
|
async getJobProgress(jobId, queue) {
|
|
184
|
-
return this.core().job.getProgress(
|
|
198
|
+
return this.core().job.getProgress(
|
|
199
|
+
jobId,
|
|
200
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
201
|
+
);
|
|
185
202
|
}
|
|
186
203
|
async retryJob(jobId, queue) {
|
|
187
|
-
await this.core().job.retry(
|
|
204
|
+
await this.core().job.retry(
|
|
205
|
+
jobId,
|
|
206
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
207
|
+
);
|
|
188
208
|
}
|
|
189
209
|
async removeJob(jobId, queue) {
|
|
190
|
-
await this.core().job.remove(
|
|
210
|
+
await this.core().job.remove(
|
|
211
|
+
jobId,
|
|
212
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
213
|
+
);
|
|
191
214
|
}
|
|
192
215
|
async promoteJob(jobId, queue) {
|
|
193
|
-
await this.core().job.promote(
|
|
216
|
+
await this.core().job.promote(
|
|
217
|
+
jobId,
|
|
218
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
219
|
+
);
|
|
194
220
|
}
|
|
195
221
|
async moveJobToFailed(jobId, reason, queue) {
|
|
196
|
-
await this.core().job.moveToFailed(
|
|
222
|
+
await this.core().job.moveToFailed(
|
|
223
|
+
jobId,
|
|
224
|
+
reason,
|
|
225
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
226
|
+
);
|
|
197
227
|
}
|
|
198
228
|
async retryManyJobs(jobIds, queue) {
|
|
199
|
-
await this.core().job.retryMany(
|
|
229
|
+
await this.core().job.retryMany(
|
|
230
|
+
jobIds,
|
|
231
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
232
|
+
);
|
|
200
233
|
}
|
|
201
234
|
async removeManyJobs(jobIds, queue) {
|
|
202
|
-
await this.core().job.removeMany(
|
|
235
|
+
await this.core().job.removeMany(
|
|
236
|
+
jobIds,
|
|
237
|
+
queue ? this.toCoreQueueName(queue) : void 0
|
|
238
|
+
);
|
|
203
239
|
}
|
|
204
240
|
async getQueueInfo(queue) {
|
|
205
241
|
const info = await this.core().queues.get(this.toCoreQueueName(queue));
|
|
@@ -207,7 +243,9 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
207
243
|
return this.mapQueueInfo(info);
|
|
208
244
|
}
|
|
209
245
|
async getQueueJobCounts(queue) {
|
|
210
|
-
const counts = await this.core().queues.getJobCounts(
|
|
246
|
+
const counts = await this.core().queues.getJobCounts(
|
|
247
|
+
this.toCoreQueueName(queue)
|
|
248
|
+
);
|
|
211
249
|
return counts;
|
|
212
250
|
}
|
|
213
251
|
async listQueues() {
|
|
@@ -224,27 +262,23 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
224
262
|
return this.core().queues.drain(this.toCoreQueueName(queue));
|
|
225
263
|
}
|
|
226
264
|
async cleanQueue(queue, options) {
|
|
227
|
-
return this.core().queues.clean(
|
|
265
|
+
return this.core().queues.clean(
|
|
266
|
+
this.toCoreQueueName(queue),
|
|
267
|
+
options
|
|
268
|
+
);
|
|
228
269
|
}
|
|
229
270
|
async obliterateQueue(queue, options) {
|
|
230
271
|
await this.core().queues.obliterate(this.toCoreQueueName(queue), options);
|
|
231
272
|
}
|
|
232
273
|
async retryAllInQueue(queue) {
|
|
233
|
-
const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
async pauseJobType(queue, jobName) {
|
|
238
|
-
throw new IgniterJobsError({
|
|
239
|
-
code: "JOBS_QUEUE_OPERATION_FAILED",
|
|
240
|
-
message: "BullMQ backend does not support pausing a single job type; pause the queue or adjust worker filters."
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
async resumeJobType(queue, jobName) {
|
|
244
|
-
throw new IgniterJobsError({
|
|
245
|
-
code: "JOBS_QUEUE_OPERATION_FAILED",
|
|
246
|
-
message: "BullMQ backend does not support resuming a single job type; resume the queue or adjust worker filters."
|
|
274
|
+
const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), {
|
|
275
|
+
status: ["failed"],
|
|
276
|
+
limit: 1e3
|
|
247
277
|
});
|
|
278
|
+
await Promise.all(
|
|
279
|
+
jobs.map((j) => this.core().job.retry(j.id, this.toCoreQueueName(queue)))
|
|
280
|
+
);
|
|
281
|
+
return jobs.length;
|
|
248
282
|
}
|
|
249
283
|
async searchJobs(filter) {
|
|
250
284
|
const queue = filter?.queue;
|
|
@@ -252,13 +286,19 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
252
286
|
const limit = filter?.limit ?? 100;
|
|
253
287
|
const offset = filter?.offset ?? 0;
|
|
254
288
|
if (queue) {
|
|
255
|
-
const jobs = await this.core().queues.getJobs(
|
|
289
|
+
const jobs = await this.core().queues.getJobs(
|
|
290
|
+
this.toCoreQueueName(queue),
|
|
291
|
+
{ status, limit, offset }
|
|
292
|
+
);
|
|
256
293
|
return jobs.map((j) => this.mapJob(j, queue));
|
|
257
294
|
}
|
|
258
295
|
const queues = await this.listQueues();
|
|
259
296
|
const results = [];
|
|
260
297
|
for (const q of queues) {
|
|
261
|
-
const jobs = await this.core().queues.getJobs(
|
|
298
|
+
const jobs = await this.core().queues.getJobs(
|
|
299
|
+
this.toCoreQueueName(q.name),
|
|
300
|
+
{ status, limit, offset }
|
|
301
|
+
);
|
|
262
302
|
results.push(...jobs.map((j) => this.mapJob(j, q.name)));
|
|
263
303
|
if (results.length >= limit) break;
|
|
264
304
|
}
|
|
@@ -268,7 +308,9 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
268
308
|
const all = await this.listQueues();
|
|
269
309
|
const name = filter?.name;
|
|
270
310
|
const isPaused = filter?.isPaused;
|
|
271
|
-
return all.filter((q) => name ? q.name.includes(name) : true).filter(
|
|
311
|
+
return all.filter((q) => name ? q.name.includes(name) : true).filter(
|
|
312
|
+
(q) => typeof isPaused === "boolean" ? q.isPaused === isPaused : true
|
|
313
|
+
);
|
|
272
314
|
}
|
|
273
315
|
async searchWorkers(filter) {
|
|
274
316
|
const queue = filter?.queue;
|
|
@@ -279,11 +321,15 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
279
321
|
const coreQueue = this.toCoreQueueName(queue);
|
|
280
322
|
const queues = w.config?.queues ?? [w.queueName];
|
|
281
323
|
return Array.isArray(queues) ? queues.includes(coreQueue) : false;
|
|
282
|
-
}).filter(
|
|
324
|
+
}).filter(
|
|
325
|
+
(w) => typeof isRunning === "boolean" ? isRunning ? w.isRunning() : !w.isRunning() : true
|
|
326
|
+
).map((w) => this.mapWorker(w));
|
|
283
327
|
}
|
|
284
328
|
async createWorker(config) {
|
|
285
329
|
await this.executor();
|
|
286
|
-
const queuesSource = config.queues?.length ? config.queues : Array.from(
|
|
330
|
+
const queuesSource = config.queues?.length ? config.queues : Array.from(
|
|
331
|
+
/* @__PURE__ */ new Set([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()])
|
|
332
|
+
);
|
|
287
333
|
const queues = queuesSource.map((q) => this.toCoreQueueName(q));
|
|
288
334
|
const coreConfig = {
|
|
289
335
|
queues,
|
|
@@ -299,7 +345,8 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
299
345
|
}
|
|
300
346
|
getWorkers() {
|
|
301
347
|
const out = /* @__PURE__ */ new Map();
|
|
302
|
-
for (const [id, handle] of this.core().getWorkers())
|
|
348
|
+
for (const [id, handle] of this.core().getWorkers())
|
|
349
|
+
out.set(id, this.mapWorker(handle));
|
|
303
350
|
return out;
|
|
304
351
|
}
|
|
305
352
|
async publishEvent(channel, payload) {
|
|
@@ -323,6 +370,58 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
323
370
|
}
|
|
324
371
|
};
|
|
325
372
|
}
|
|
373
|
+
async writeJobStreamEvent(params) {
|
|
374
|
+
const id = String(
|
|
375
|
+
await this.publisher.incr(
|
|
376
|
+
this.getJobStreamSequenceKey(params.queue, params.jobId)
|
|
377
|
+
)
|
|
378
|
+
);
|
|
379
|
+
const event = {
|
|
380
|
+
...params.event,
|
|
381
|
+
id
|
|
382
|
+
};
|
|
383
|
+
if (params.persistence?.enabled) {
|
|
384
|
+
const listKey = this.getJobStreamListKey(params.queue, params.jobId);
|
|
385
|
+
await this.publisher.rpush(listKey, JSON.stringify(event));
|
|
386
|
+
const maxEvents = params.persistence.maxEvents;
|
|
387
|
+
if (typeof maxEvents === "number" && maxEvents > 0) {
|
|
388
|
+
await this.publisher.ltrim(listKey, -maxEvents, -1);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
await this.publisher.publish(
|
|
392
|
+
this.getJobStreamChannel(params.queue, params.jobId),
|
|
393
|
+
JSON.stringify(event)
|
|
394
|
+
);
|
|
395
|
+
return id;
|
|
396
|
+
}
|
|
397
|
+
async readJobStream(params) {
|
|
398
|
+
const rows = await this.publisher.lrange(
|
|
399
|
+
this.getJobStreamListKey(params.queue, params.jobId),
|
|
400
|
+
0,
|
|
401
|
+
-1
|
|
402
|
+
);
|
|
403
|
+
const after = params.after ? Number(params.after) : void 0;
|
|
404
|
+
const limit = params.limit ?? 100;
|
|
405
|
+
const parsed = rows.map((row) => this.parseJobStreamRow(row)).filter(
|
|
406
|
+
(event) => Boolean(event)
|
|
407
|
+
).filter(
|
|
408
|
+
(event) => typeof after === "number" ? Number(event.id) > after : true
|
|
409
|
+
);
|
|
410
|
+
const items = parsed.slice(0, limit);
|
|
411
|
+
return {
|
|
412
|
+
items,
|
|
413
|
+
nextCursor: items.at(-1)?.id,
|
|
414
|
+
hasMore: parsed.length > items.length
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
async subscribeJobStream(params) {
|
|
418
|
+
const channel = this.getJobStreamChannel(params.queue, params.jobId);
|
|
419
|
+
return this.subscribeEvent(channel, async (payload) => {
|
|
420
|
+
await params.handler(
|
|
421
|
+
payload
|
|
422
|
+
);
|
|
423
|
+
});
|
|
424
|
+
}
|
|
326
425
|
async shutdown() {
|
|
327
426
|
await this.subscriber.quit();
|
|
328
427
|
}
|
|
@@ -338,7 +437,10 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
338
437
|
if (!this.executorDirty && this.coreExecutor) return this.coreExecutor;
|
|
339
438
|
const routers = {};
|
|
340
439
|
const flattened = {};
|
|
341
|
-
const allQueues = /* @__PURE__ */ new Set([
|
|
440
|
+
const allQueues = /* @__PURE__ */ new Set([
|
|
441
|
+
...this.jobsByQueue.keys(),
|
|
442
|
+
...this.cronsByQueue.keys()
|
|
443
|
+
]);
|
|
342
444
|
for (const queueName of allQueues) {
|
|
343
445
|
const coreJobs = {};
|
|
344
446
|
const jobs = this.jobsByQueue.get(queueName);
|
|
@@ -346,14 +448,24 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
346
448
|
for (const [jobName, def] of jobs.entries()) {
|
|
347
449
|
const queue = def.queue ? `${queueName}.${def.queue}` : queueName;
|
|
348
450
|
const fullQueue = IgniterJobsPrefix.buildQueueName(queue);
|
|
349
|
-
coreJobs[jobName] = this.toCoreJobDefinition(
|
|
451
|
+
coreJobs[jobName] = this.toCoreJobDefinition(
|
|
452
|
+
queueName,
|
|
453
|
+
jobName,
|
|
454
|
+
def,
|
|
455
|
+
fullQueue
|
|
456
|
+
);
|
|
350
457
|
}
|
|
351
458
|
}
|
|
352
459
|
const crons = this.cronsByQueue.get(queueName);
|
|
353
460
|
if (crons) {
|
|
354
461
|
for (const [cronName, def] of crons.entries()) {
|
|
355
462
|
const fullQueue = IgniterJobsPrefix.buildQueueName(queueName);
|
|
356
|
-
coreJobs[cronName] = this.toCoreCronJobDefinition(
|
|
463
|
+
coreJobs[cronName] = this.toCoreCronJobDefinition(
|
|
464
|
+
queueName,
|
|
465
|
+
cronName,
|
|
466
|
+
def,
|
|
467
|
+
fullQueue
|
|
468
|
+
);
|
|
357
469
|
}
|
|
358
470
|
}
|
|
359
471
|
if (Object.keys(coreJobs).length === 0) continue;
|
|
@@ -373,6 +485,26 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
373
485
|
toCoreQueueName(queueName) {
|
|
374
486
|
return IgniterJobsPrefix.buildQueueName(queueName);
|
|
375
487
|
}
|
|
488
|
+
getJobStreamChannel(queue, jobId) {
|
|
489
|
+
return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:live`;
|
|
490
|
+
}
|
|
491
|
+
getJobStreamListKey(queue, jobId) {
|
|
492
|
+
return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:events`;
|
|
493
|
+
}
|
|
494
|
+
getJobStreamSequenceKey(queue, jobId) {
|
|
495
|
+
return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:seq`;
|
|
496
|
+
}
|
|
497
|
+
parseJobStreamRow(row) {
|
|
498
|
+
try {
|
|
499
|
+
const parsed = JSON.parse(row);
|
|
500
|
+
return {
|
|
501
|
+
...parsed,
|
|
502
|
+
timestamp: new Date(parsed.timestamp)
|
|
503
|
+
};
|
|
504
|
+
} catch {
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
376
508
|
mapQueueInfo(info) {
|
|
377
509
|
return {
|
|
378
510
|
name: this.fromCoreQueueName(info.name),
|
|
@@ -395,7 +527,7 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
395
527
|
input: job.payload,
|
|
396
528
|
result: job.result,
|
|
397
529
|
error: job.error,
|
|
398
|
-
progress: 0,
|
|
530
|
+
progress: typeof job.progress === "number" ? job.progress : 0,
|
|
399
531
|
attemptsMade: job.attemptsMade ?? 0,
|
|
400
532
|
priority: job.priority ?? 0,
|
|
401
533
|
createdAt: job.createdAt,
|
|
@@ -406,7 +538,9 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
406
538
|
};
|
|
407
539
|
}
|
|
408
540
|
mapWorker(handle) {
|
|
409
|
-
const queues = handle.config?.queues ?? [
|
|
541
|
+
const queues = handle.config?.queues ?? [
|
|
542
|
+
handle.queueName
|
|
543
|
+
];
|
|
410
544
|
return {
|
|
411
545
|
id: handle.id,
|
|
412
546
|
queues: queues.map((q) => this.fromCoreQueueName(q)),
|
|
@@ -421,6 +555,25 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
421
555
|
}
|
|
422
556
|
toCoreJobDefinition(queueName, jobName, def, fullQueueName) {
|
|
423
557
|
const handler = async (ctx) => {
|
|
558
|
+
const updateProgress = typeof ctx.job?.updateProgress === "function" ? async (progress, message) => {
|
|
559
|
+
await ctx.job.updateProgress(progress);
|
|
560
|
+
await def.onProgress?.({
|
|
561
|
+
input: ctx.input,
|
|
562
|
+
context: ctx.context,
|
|
563
|
+
job: {
|
|
564
|
+
id: ctx.job.id,
|
|
565
|
+
name: jobName,
|
|
566
|
+
queue: queueName,
|
|
567
|
+
attemptsMade: ctx.job.attemptsMade,
|
|
568
|
+
createdAt: ctx.job.createdAt,
|
|
569
|
+
metadata: ctx.job.metadata,
|
|
570
|
+
updateProgress
|
|
571
|
+
},
|
|
572
|
+
scope: ctx.job.metadata?.__igniter_jobs_scope,
|
|
573
|
+
progress,
|
|
574
|
+
message
|
|
575
|
+
});
|
|
576
|
+
} : void 0;
|
|
424
577
|
return def.handler({
|
|
425
578
|
input: ctx.input,
|
|
426
579
|
context: ctx.context,
|
|
@@ -430,7 +583,8 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
430
583
|
queue: queueName,
|
|
431
584
|
attemptsMade: ctx.job.attemptsMade,
|
|
432
585
|
createdAt: ctx.job.createdAt,
|
|
433
|
-
metadata: ctx.job.metadata
|
|
586
|
+
metadata: ctx.job.metadata,
|
|
587
|
+
updateProgress
|
|
434
588
|
},
|
|
435
589
|
scope: ctx.job.metadata?.__igniter_jobs_scope
|
|
436
590
|
});
|
|
@@ -494,5 +648,5 @@ var IgniterJobsBullMQAdapter = class _IgniterJobsBullMQAdapter {
|
|
|
494
648
|
};
|
|
495
649
|
|
|
496
650
|
export { IgniterJobsBullMQAdapter };
|
|
497
|
-
//# sourceMappingURL=
|
|
498
|
-
//# sourceMappingURL=
|
|
651
|
+
//# sourceMappingURL=node.mjs.map
|
|
652
|
+
//# sourceMappingURL=node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/prefix.ts","../../src/errors/jobs.error.ts","../../src/adapters/bullmq.adapter.ts"],"names":["options"],"mappings":"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","file":"node.mjs","sourcesContent":["/**\n * Helpers for building consistent key/queue prefixes.\n */\nexport class IgniterJobsPrefix {\n public static readonly BASE_PREFIX = \"igniter:jobs\";\n\n /**\n * Builds a normalized queue name using the global prefix and queue id.\n *\n * @example\n * ```typescript\n * const name = IgniterJobsPrefix.buildQueueName('email')\n * // -> igniter:jobs:email\n * ```\n */\n public static buildQueueName(queue: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:${queue}`;\n }\n\n /**\n * Builds the event channel used for pub/sub.\n *\n * Unscoped events are published to a global channel per service/environment.\n * Scoped events are also published to an additional channel for that scope.\n */\n public static buildEventsChannel(params: {\n service: string;\n environment: string;\n scope?: { type: string; id: string | number };\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:events:${params.environment}:${params.service}`;\n if (!params.scope) return base;\n return `${base}:scope:${params.scope.type}:${params.scope.id}`;\n }\n\n public static buildJobStreamChannel(params: {\n service: string;\n environment: string;\n queue: string;\n jobId: string;\n scope?: { type: string; id: string | number };\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:stream:${params.environment}:${params.service}:${params.queue}:${params.jobId}`;\n if (!params.scope) return base;\n return `${base}:scope:${params.scope.type}:${params.scope.id}`;\n }\n}\n","import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview BullMQ adapter for @igniter-js/jobs (wraps @igniter-js/adapter-bullmq)\n * @module @igniter-js/jobs/adapters/bullmq\n */\n\nimport type { Redis } from \"ioredis\";\nimport type {\n AdvancedScheduleOptions,\n IgniterJobQueueAdapter,\n JobsRouter,\n JobDefinition as CoreJobDefinition,\n JobExecutionContext as CoreJobExecutionContext,\n JobWorkerConfig,\n} from \"@igniter-js/core\";\nimport { createBullMQAdapter } from \"@igniter-js/adapter-bullmq\";\nimport type {\n IgniterJobsAdapterJobStreamReadParams,\n IgniterJobsAdapterJobStreamSubscribeParams,\n IgniterJobsAdapterJobStreamWriteParams,\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsBullMQAdapterOptions,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from \"../types\";\nimport { IgniterJobsPrefix } from \"../utils/prefix\";\nimport { IgniterJobsError } from \"../errors\";\nimport type {\n IgniterJobsJobStreamEvent,\n IgniterJobsJobStreamReadResult,\n} from \"../types/stream\";\n\ntype CoreAdapter = IgniterJobQueueAdapter<any>;\ntype CoreMergedExecutor = ReturnType<CoreAdapter[\"merge\"]>;\n\nfunction toDateArray(values?: Array<string | Date>): Date[] | undefined {\n if (!values) return undefined;\n return values.map((v) => (v instanceof Date ? v : new Date(v)));\n}\n\n/**\n * BullMQ adapter facade.\n *\n * It reuses the mature BullMQ integration from `@igniter-js/adapter-bullmq` to keep\n * feature parity (workers, queue/job management, advanced scheduling, hooks).\n */\nexport class IgniterJobsBullMQAdapter implements IgniterJobsAdapter {\n public readonly client: unknown;\n\n private readonly redis: Redis;\n private readonly publisher: Redis;\n private readonly subscriber: Redis;\n private readonly subscribers = new Map<string, Set<(payload: any) => void>>();\n\n private coreAdapter: CoreAdapter | null = null;\n private coreExecutor: CoreMergedExecutor | null = null;\n private executorDirty = true;\n\n private readonly jobsByQueue = new Map<\n string,\n Map<string, IgniterJobDefinition<any, any, any>>\n >();\n private readonly cronsByQueue = new Map<\n string,\n Map<string, IgniterCronDefinition<any, any>>\n >();\n\n public readonly queues: IgniterJobsQueueManager;\n\n private constructor(options: IgniterJobsBullMQAdapterOptions) {\n this.redis = options.redis;\n this.publisher = this.redis;\n this.subscriber = this.redis.duplicate();\n this.client = { redis: this.redis };\n\n this.subscriber.on(\"message\", (channel: string, message: string) => {\n const set = this.subscribers.get(channel);\n if (!set || set.size === 0) return;\n let payload: any = message;\n try {\n payload = JSON.parse(message);\n } catch {\n // ignore, treat as raw\n }\n for (const handler of set) handler(payload);\n });\n\n this.queues = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const full = this.toCoreQueueName(name);\n return this.core().queues.getJobs(full, filter as any) as any;\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n const full = this.toCoreQueueName(name);\n return this.core().queues.isPaused(full);\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n };\n }\n\n public static create(\n options: IgniterJobsBullMQAdapterOptions,\n ): IgniterJobsAdapter {\n return new IgniterJobsBullMQAdapter(options);\n }\n\n public registerJob(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): void {\n const map = this.jobsByQueue.get(queueName) ?? new Map();\n if (map.has(jobName)) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" is already registered in queue \"${queueName}\".`,\n });\n }\n map.set(jobName, definition);\n this.jobsByQueue.set(queueName, map);\n this.executorDirty = true;\n }\n\n public registerCron(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): void {\n const map = this.cronsByQueue.get(queueName) ?? new Map();\n if (map.has(cronName)) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" is already registered in queue \"${queueName}\".`,\n });\n }\n map.set(cronName, definition);\n this.cronsByQueue.set(queueName, map);\n this.executorDirty = true;\n }\n\n public async dispatch(\n params: IgniterJobsAdapterDispatchParams,\n ): Promise<string> {\n const executor = await this.executor();\n const namespace = (executor as any)[params.queue];\n if (!namespace) {\n throw new IgniterJobsError({\n code: \"JOBS_QUEUE_NOT_FOUND\",\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n });\n }\n return namespace.enqueue({\n task: params.jobName,\n input: params.input,\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n });\n }\n\n public async schedule(\n params: IgniterJobsAdapterScheduleParams,\n ): Promise<string> {\n const executor = await this.executor();\n const namespace = (executor as any)[params.queue];\n if (!namespace) {\n throw new IgniterJobsError({\n code: \"JOBS_QUEUE_NOT_FOUND\",\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n });\n }\n\n const schedule: AdvancedScheduleOptions = {\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n at: params.at,\n repeat:\n params.cron ||\n params.every ||\n params.maxExecutions ||\n params.skipWeekends ||\n params.onlyBusinessHours ||\n params.businessHours ||\n params.onlyWeekdays ||\n params.skipDates\n ? {\n cron: params.cron,\n every: params.every,\n times: params.maxExecutions,\n skipWeekends: params.skipWeekends,\n onlyBusinessHours: params.onlyBusinessHours,\n businessHours: params.businessHours,\n onlyWeekdays: params.onlyWeekdays,\n skipDates: toDateArray(params.skipDates),\n }\n : undefined,\n };\n\n return namespace.schedule({\n task: params.jobName,\n input: params.input,\n ...schedule,\n });\n }\n\n public async getJob(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobSearchResult | null> {\n const result = await this.core().job.get(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n return result ? this.mapJob(result, queue) : null;\n }\n\n public async getJobState(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobStatus | null> {\n const state = await this.core().job.getState(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n return state as any;\n }\n\n public async getJobLogs(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobsJobLog[]> {\n const logs = await this.core().job.getLogs(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n return logs as any;\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n return this.core().job.getProgress(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.retry(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.remove(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.promote(\n jobId,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async moveJobToFailed(\n jobId: string,\n reason: string,\n queue?: string,\n ): Promise<void> {\n await this.core().job.moveToFailed(\n jobId,\n reason,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.retryMany(\n jobIds,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.removeMany(\n jobIds,\n queue ? this.toCoreQueueName(queue) : undefined,\n );\n }\n\n public async getQueueInfo(\n queue: string,\n ): Promise<IgniterJobsQueueInfo | null> {\n const info = await this.core().queues.get(this.toCoreQueueName(queue));\n if (!info) return null;\n return this.mapQueueInfo(info);\n }\n\n public async getQueueJobCounts(queue: string): Promise<any> {\n const counts = await this.core().queues.getJobCounts(\n this.toCoreQueueName(queue),\n );\n return counts as any;\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const list = await this.core().queues.list();\n return list.map((q) => this.mapQueueInfo(q));\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n await this.core().queues.pause(this.toCoreQueueName(queue));\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n await this.core().queues.resume(this.toCoreQueueName(queue));\n }\n\n public async drainQueue(queue: string): Promise<number> {\n return this.core().queues.drain(this.toCoreQueueName(queue));\n }\n\n public async cleanQueue(\n queue: string,\n options: IgniterJobsQueueCleanOptions,\n ): Promise<number> {\n return this.core().queues.clean(\n this.toCoreQueueName(queue),\n options as any,\n );\n }\n\n public async obliterateQueue(\n queue: string,\n options?: { force?: boolean },\n ): Promise<void> {\n await this.core().queues.obliterate(this.toCoreQueueName(queue), options);\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), {\n status: [\"failed\"],\n limit: 1000,\n } as any);\n await Promise.all(\n jobs.map((j) => this.core().job.retry(j.id, this.toCoreQueueName(queue))),\n );\n return jobs.length;\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n // Minimal implementation: list jobs from a specific queue when provided, otherwise aggregate known queues.\n const queue = filter?.queue as string | undefined;\n const status = filter?.status as IgniterJobStatus[] | undefined;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n\n if (queue) {\n const jobs = await this.core().queues.getJobs(\n this.toCoreQueueName(queue),\n { status, limit, offset } as any,\n );\n return jobs.map((j) => this.mapJob(j as any, queue));\n }\n\n const queues = await this.listQueues();\n const results: IgniterJobSearchResult[] = [];\n for (const q of queues) {\n const jobs = await this.core().queues.getJobs(\n this.toCoreQueueName(q.name),\n { status, limit, offset } as any,\n );\n results.push(...jobs.map((j) => this.mapJob(j as any, q.name)));\n if (results.length >= limit) break;\n }\n return results.slice(0, limit);\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const all = await this.listQueues();\n const name = filter?.name as string | undefined;\n const isPaused = filter?.isPaused as boolean | undefined;\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) =>\n typeof isPaused === \"boolean\" ? q.isPaused === isPaused : true,\n );\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined;\n const isRunning = filter?.isRunning as boolean | undefined;\n\n const all = Array.from(this.core().getWorkers().values());\n return all\n .filter((w) => {\n if (!queue) return true;\n const coreQueue = this.toCoreQueueName(queue);\n const queues = (w as any).config?.queues ?? [(w as any).queueName];\n return Array.isArray(queues) ? queues.includes(coreQueue) : false;\n })\n .filter((w) =>\n typeof isRunning === \"boolean\"\n ? isRunning\n ? w.isRunning()\n : !w.isRunning()\n : true,\n )\n .map((w) => this.mapWorker(w));\n }\n\n public async createWorker(\n config: IgniterJobsWorkerBuilderConfig,\n ): Promise<IgniterJobsWorkerHandle> {\n // Ensure jobs/crons are registered in the underlying BullMQ adapter before starting workers.\n await this.executor();\n\n const queuesSource = config.queues?.length\n ? config.queues\n : Array.from(\n new Set([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()]),\n );\n const queues = queuesSource.map((q) => this.toCoreQueueName(q));\n const coreConfig: JobWorkerConfig = {\n queues,\n concurrency: config.concurrency ?? 1,\n limiter: config.limiter as any,\n onActive: config.handlers?.onActive as any,\n onSuccess: config.handlers?.onSuccess as any,\n onFailure: config.handlers?.onFailure as any,\n onIdle: config.handlers?.onIdle as any,\n };\n const handle = await (this.core() as any).worker(coreConfig);\n return this.mapWorker(handle);\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>();\n for (const [id, handle] of this.core().getWorkers())\n out.set(id, this.mapWorker(handle));\n return out;\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n await this.publisher.publish(channel, JSON.stringify(payload));\n }\n\n public async subscribeEvent(\n channel: string,\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const set =\n this.subscribers.get(channel) ?? new Set<(payload: any) => void>();\n const wrapped = (payload: any) => void handler(payload as any);\n set.add(wrapped);\n this.subscribers.set(channel, set);\n\n if (set.size === 1) {\n await this.subscriber.subscribe(channel);\n }\n\n return async () => {\n const current = this.subscribers.get(channel);\n if (!current) return;\n current.delete(wrapped);\n if (current.size === 0) {\n this.subscribers.delete(channel);\n await this.subscriber.unsubscribe(channel);\n }\n };\n }\n\n public async writeJobStreamEvent(\n params: IgniterJobsAdapterJobStreamWriteParams,\n ): Promise<string> {\n const id = String(\n await this.publisher.incr(\n this.getJobStreamSequenceKey(params.queue, params.jobId),\n ),\n );\n const event: IgniterJobsJobStreamEvent<string, unknown> = {\n ...params.event,\n id,\n };\n\n if (params.persistence?.enabled) {\n const listKey = this.getJobStreamListKey(params.queue, params.jobId);\n await this.publisher.rpush(listKey, JSON.stringify(event));\n const maxEvents = params.persistence.maxEvents;\n if (typeof maxEvents === \"number\" && maxEvents > 0) {\n await this.publisher.ltrim(listKey, -maxEvents, -1);\n }\n }\n\n await this.publisher.publish(\n this.getJobStreamChannel(params.queue, params.jobId),\n JSON.stringify(event),\n );\n\n return id;\n }\n\n public async readJobStream(\n params: IgniterJobsAdapterJobStreamReadParams,\n ): Promise<\n IgniterJobsJobStreamReadResult<IgniterJobsJobStreamEvent<string, unknown>>\n > {\n const rows = await this.publisher.lrange(\n this.getJobStreamListKey(params.queue, params.jobId),\n 0,\n -1,\n );\n\n const after = params.after ? Number(params.after) : undefined;\n const limit = params.limit ?? 100;\n const parsed = rows\n .map((row) => this.parseJobStreamRow(row))\n .filter((event): event is IgniterJobsJobStreamEvent<string, unknown> =>\n Boolean(event),\n )\n .filter((event) =>\n typeof after === \"number\" ? Number(event.id) > after : true,\n );\n\n const items = parsed.slice(0, limit);\n return {\n items,\n nextCursor: items.at(-1)?.id,\n hasMore: parsed.length > items.length,\n };\n }\n\n public async subscribeJobStream(\n params: IgniterJobsAdapterJobStreamSubscribeParams,\n ): Promise<() => Promise<void>> {\n const channel = this.getJobStreamChannel(params.queue, params.jobId);\n return this.subscribeEvent(channel, async (payload) => {\n await params.handler(\n payload as IgniterJobsJobStreamEvent<string, unknown>,\n );\n });\n }\n\n public async shutdown(): Promise<void> {\n await this.subscriber.quit();\n // BullMQ adapter does not expose global shutdown on the core adapter in a single method;\n // queue/worker cleanup is handled by worker close and queue obliterate.\n }\n\n private core(): CoreAdapter {\n if (!this.coreAdapter) {\n // We only need the Redis connection. The wrapped job handlers can create real context.\n this.coreAdapter = createBullMQAdapter({\n store: { client: this.redis } as any,\n }) as unknown as CoreAdapter;\n }\n return this.coreAdapter;\n }\n\n private async executor(): Promise<CoreMergedExecutor> {\n if (!this.executorDirty && this.coreExecutor) return this.coreExecutor;\n\n const routers: Record<string, JobsRouter<any>> = {};\n const flattened: Record<string, CoreJobDefinition<any, any, any>> = {};\n\n const allQueues = new Set<string>([\n ...this.jobsByQueue.keys(),\n ...this.cronsByQueue.keys(),\n ]);\n\n for (const queueName of allQueues) {\n const coreJobs: Record<string, CoreJobDefinition<any, any, any>> = {};\n\n const jobs = this.jobsByQueue.get(queueName);\n if (jobs) {\n for (const [jobName, def] of jobs.entries()) {\n const queue = def.queue ? `${queueName}.${def.queue}` : queueName;\n const fullQueue = IgniterJobsPrefix.buildQueueName(queue);\n coreJobs[jobName] = this.toCoreJobDefinition(\n queueName,\n jobName,\n def,\n fullQueue,\n );\n }\n }\n\n const crons = this.cronsByQueue.get(queueName);\n if (crons) {\n for (const [cronName, def] of crons.entries()) {\n const fullQueue = IgniterJobsPrefix.buildQueueName(queueName);\n coreJobs[cronName] = this.toCoreCronJobDefinition(\n queueName,\n cronName,\n def,\n fullQueue,\n );\n }\n }\n\n if (Object.keys(coreJobs).length === 0) continue;\n\n routers[queueName] = this.core().router({\n jobs: coreJobs as any,\n namespace: queueName,\n });\n\n for (const [jobName, def] of Object.entries(coreJobs)) {\n flattened[`${queueName}.${jobName}`] = def;\n }\n }\n\n // Register jobs in bulk so management APIs and workers can resolve handlers.\n await this.core().bulkRegister(flattened as any);\n\n this.coreExecutor = this.core().merge(routers as any) as any;\n this.executorDirty = false;\n return this.coreExecutor as CoreMergedExecutor;\n }\n\n private toCoreQueueName(queueName: string): string {\n return IgniterJobsPrefix.buildQueueName(queueName);\n }\n\n private getJobStreamChannel(queue: string, jobId: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:live`;\n }\n\n private getJobStreamListKey(queue: string, jobId: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:events`;\n }\n\n private getJobStreamSequenceKey(queue: string, jobId: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:stream:${queue}:${jobId}:seq`;\n }\n\n private parseJobStreamRow(\n row: string,\n ): IgniterJobsJobStreamEvent<string, unknown> | null {\n try {\n const parsed = JSON.parse(row) as IgniterJobsJobStreamEvent<\n string,\n unknown\n >;\n return {\n ...parsed,\n timestamp: new Date(parsed.timestamp),\n };\n } catch {\n return null;\n }\n }\n\n private mapQueueInfo(info: any): IgniterJobsQueueInfo {\n return {\n name: this.fromCoreQueueName(info.name),\n isPaused: info.isPaused,\n jobCounts: info.jobCounts,\n };\n }\n\n private fromCoreQueueName(full: string): string {\n const prefix = `${IgniterJobsPrefix.BASE_PREFIX}:`;\n return full.startsWith(prefix) ? full.slice(prefix.length) : full;\n }\n\n private mapJob(job: any, queue?: string): IgniterJobSearchResult {\n const q =\n queue ??\n this.fromCoreQueueName(job.metadata?.queue ?? job.queueName ?? \"\");\n const scope = (job.metadata as any)?.__igniter_jobs_scope;\n return {\n id: job.id,\n name: job.name,\n queue: q,\n status: job.status,\n input: job.payload,\n result: job.result,\n error: job.error,\n progress: typeof job.progress === \"number\" ? job.progress : 0,\n attemptsMade: job.attemptsMade ?? 0,\n priority: job.priority ?? 0,\n createdAt: job.createdAt,\n startedAt: job.processedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope,\n };\n }\n\n private mapWorker(handle: any): IgniterJobsWorkerHandle {\n const queues = (handle as any).config?.queues ?? [\n (handle as any).queueName,\n ];\n return {\n id: handle.id,\n queues: (queues as string[]).map((q) => this.fromCoreQueueName(q)),\n pause: () => handle.pause(),\n resume: () => handle.resume(),\n close: () => handle.close(),\n isRunning: () => handle.isRunning(),\n isPaused: () => handle.isPaused(),\n isClosed: () => handle.isClosed(),\n getMetrics: async () => handle.getMetrics() as IgniterJobsWorkerMetrics,\n };\n }\n\n private toCoreJobDefinition(\n queueName: string,\n jobName: string,\n def: IgniterJobDefinition<any, any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n const updateProgress =\n typeof (ctx.job as any)?.updateProgress === \"function\"\n ? async (progress: number, message?: string) => {\n await (ctx.job as any).updateProgress(progress);\n await def.onProgress?.({\n input: ctx.input as any,\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: jobName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n updateProgress,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n progress,\n message,\n } as any);\n }\n : undefined;\n\n return def.handler({\n input: ctx.input as any,\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: jobName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n updateProgress,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any);\n };\n\n return {\n name: jobName,\n input: def.input as any,\n handler,\n queue: { name: fullQueueName },\n attempts: def.attempts,\n priority: def.priority,\n delay: def.delay,\n removeOnComplete: def.removeOnComplete as any,\n removeOnFail: def.removeOnFail as any,\n metadata: def.metadata as any,\n limiter: def.limiter as any,\n onStart: def.onStart as any,\n onSuccess: def.onSuccess as any,\n onFailure: def.onFailure as any,\n onProgress: def.onProgress as any,\n } as any;\n }\n\n private toCoreCronJobDefinition(\n queueName: string,\n cronName: string,\n def: IgniterCronDefinition<any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: cronName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any);\n };\n\n return {\n name: cronName,\n handler,\n queue: { name: fullQueueName },\n repeat: {\n cron: def.cron,\n tz: def.tz,\n limit: def.maxExecutions,\n startDate: def.startDate,\n endDate: def.endDate,\n },\n metadata:\n def.onlyBusinessHours ||\n def.skipWeekends ||\n def.businessHours ||\n def.onlyWeekdays ||\n def.skipDates ||\n (def.startDate && def.endDate)\n ? {\n advancedScheduling: {\n onlyBusinessHours: def.onlyBusinessHours,\n skipWeekends: def.skipWeekends,\n businessHours: def.businessHours,\n skipDates: toDateArray(def.skipDates),\n onlyWeekdays: def.onlyWeekdays,\n between:\n def.startDate && def.endDate\n ? [def.startDate, def.endDate]\n : undefined,\n },\n }\n : undefined,\n } as any;\n }\n}\n"]}
|