UNPKG

@lexamica-modules/job-queue

Version:

The package for the Lexamica Job Queue SDK powered by Redis and BullMQ

160 lines (144 loc) 4.97 kB
import { DefaultJobOptions, Job, Queue } from "bullmq"; import { encryptPayload } from "../util/encryption"; /** * Management Class for the Jobs entity */ class Jobs { /** * Returns a report of how many jobs are currently in the possible job states for a given queue * @param {Queue<unknown, unknown, string>} queue the queue instance * @returns {Promise<object>} */ getJobCounts = async ( queue: Queue<unknown, unknown, string>, ): Promise<object> => { const counts = await queue.getJobCounts(); return counts; }; /** * Add a job to a queue * @param {Queue} queue the queue instance * @param {string} job_name the individual job name to use * @param {Record<string, unknown>} job_data the data payload to attach to the job * @param {DefaultJobOptions} job_options options to config the job * @returns {Promise<Job>} */ addJob = async ( queue: Queue, job_name: string, job_data: Record<string, unknown>, job_options: DefaultJobOptions, ): Promise<Job> => { // encrypt the job data const encryptedData = encryptPayload(job_data); // create the job using the given props and encrypted payload const job = await queue.add(job_name, encryptedData, job_options); return job; }; /** * Change the data payload on a given job * @param {Job} job the Job instance * @param {Record<string, unknown>} data the data payload to replace the old payload with * @returns {Promise<boolean>} Boolean indicating success. */ updateJobData = async ( job: Job, data: Record<string, unknown>, ): Promise<boolean> => { // encrypt the data const encryptedData = encryptPayload(data); await job.updateData(encryptedData); return true; }; /** * Add a job to be processed after a given interval * @param {Queue} queue the queue instance * @param {string} job_name the name to assign the job * @param {Record<string, unknown>} job_data the data payload to give the job * @param {number} delay the amount of time in milliseconds to delay the job * @param {DefaultJobOptions} job_options and additional job options to config the job with * @returns {Promise<Job>} */ addDelayedJob = async ( queue: Queue, job_name: string, job_data: Record<string, unknown>, delay: number, job_options: DefaultJobOptions, ): Promise<Job> => { // encrypt the job data const encryptedData = encryptPayload(job_data); // create the job using the given props and encrypted payload const job = await queue.add(job_name, encryptedData, { ...job_options, delay, }); return job; }; /** * Change the delay on a previously created delayed job * @param {Job} job the job instance * @param {number} delay the number of milliseconds from when the job was created to delay it * @returns {Promise<boolean>} Boolean indicator if update was successful. */ changeDelayedJob = async (job: Job, delay: number): Promise<boolean> => { await job.changeDelay(delay); return true; }; /** * Add a job that is processed continually based on a schedule * @param {Queue} queue The queue instance to add the job to * @param {string} job_name The individual name to give the job * @param {Record<string, unknown>} job_data The data payload to give the job * @param {DefaultJobOptions} job_options Any additional config options to assign to the job * @param {string} cron schedule the job based on a cron * @param {number} interval repeat this job every x milliseconds * @param {number} iterations optional max number of times to repeat this job * @returns {Promise<Job>} */ addRecurringJob = async ( queue: Queue, job_name: string, job_data: Record<string, unknown>, job_options: DefaultJobOptions, cron?: string, interval?: number, iterations?: number, ): Promise<Job> => { let repetition_config = {}; // encrypt the job data const encryptedData = encryptPayload(job_data); // configure the repetition if (cron) { repetition_config = { pattern: cron }; } else if (interval) { repetition_config = { every: interval }; } else { throw new Error( "A Recurring Job must have either the cron prop or the interval prop", ); } if (iterations) { repetition_config = { ...repetition_config, limit: iterations, }; } // create the job using the given props and encrypted payload const job = await queue.add(job_name, encryptedData, { ...job_options, repeat: repetition_config, }); return job; }; /** * Cancel a job that has not been executed yet. * @param {Job} job the job instance to cancel * @returns {Promise<boolean>} */ cancelJob = async (job: Job): Promise<boolean> => { await job.remove({ removeChildren: true }); return true; }; } export default Jobs;