@tsed/bullmq
Version:
BullMQ integration for Ts.ED
58 lines (57 loc) • 1.91 kB
JavaScript
import { Store } from "@tsed/core";
import { inject, injectable } from "@tsed/di";
import { BULLMQ } from "../constants/constants.js";
import { getJobToken } from "../utils/getJobToken.js";
import { getQueueToken } from "../utils/getQueueToken.js";
export class JobDispatcher {
async dispatch(job, payload, options = {}) {
const { queueName, jobName, defaultJobOptions } = await this.resolveDispatchArgs(job, payload);
const queue = inject(getQueueToken(queueName));
if (!queue) {
throw new Error(`Queue(${queueName}) not defined`);
}
return queue.add(jobName, payload, {
...defaultJobOptions,
...options
});
}
async resolveDispatchArgs(job, payload) {
let queueName;
let jobName;
let defaultJobOptions;
if (typeof job === "function") {
// job is passed as a Type
const store = Store.from(job).get(BULLMQ);
queueName = store.queue;
jobName = store.name;
defaultJobOptions = await this.retrieveJobOptionsFromClassBasedJob(store, payload);
}
else if (typeof job === "object") {
// job is passed as JobDispatcherOptions
queueName = job.queue;
jobName = job.name;
}
else {
// job is passed as a string
queueName = "default";
jobName = job;
}
return {
queueName,
jobName,
defaultJobOptions
};
}
async retrieveJobOptionsFromClassBasedJob(store, payload) {
const job = inject(getJobToken(store.queue, store.name));
const jobId = await job.jobId?.(payload);
if (jobId === undefined) {
return store.opts;
}
return {
...store.opts,
jobId
};
}
}
injectable(JobDispatcher);