UNPKG

@tsed/bullmq

Version:
58 lines (57 loc) 1.91 kB
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);