UNPKG

@lexamica-modules/job-queue

Version:

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

139 lines (138 loc) 4.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Queues = void 0; const bullmq_1 = require("bullmq"); const errors_1 = require("../util/errors"); const config_1 = require("../util/config"); const constants_1 = require("../util/constants"); /** * Message Queue Management Class */ class Queues { // connection to the redis cloud _connection; /** * Initialize a Queues instance with the Redis connection to use * @param {Redis} connection the Redis connection to use */ constructor(connection) { this._connection = connection; } /** * Create a new queue * @param {string} queue_name the name to give the queue instance * @param {QueueOptions} options additional options to give the queue * @returns {Queue<unknown, unknown, string> | void} */ create = (queue_name, options = {}) => { try { const queue = new bullmq_1.Queue(queue_name, { connection: this._connection, ...options, }); return queue; } catch (error) { (0, errors_1.handleErrorWithInfo)({ message: `Failed to create a new queue named: ${queue_name}`, job: "Create Queue", error: error, }); return; } }; /** * Drain a queue instance of all pending jobs * @param {Queue} queue The queue instance to drain * @returns {Promise<boolean>} */ drain = async (queue) => { if (!queue) { (0, errors_1.handleErrorWithInfo)({ message: `Queue: ${queue} has not been created and registered`, job: "Drain Queue", error: new Error("Queue does not exist"), }); return false; } if (constants_1.SHARED_QUEUES.includes(queue.name)) { throw new Error(`Cannot drain shared queues. Queue: ${queue.name} cannot be drained`); } try { await queue.drain(); return true; } catch (error) { (0, errors_1.handleErrorWithInfo)({ message: `Queue: ${queue.name} failed to be drained`, job: "Drain Queue", error: error, }); return false; } }; /** * Pause job execution on a queue. Jobs can be added but will not be processed until queue is unpaused * @param {Queue} queue The queue instance to pause * @returns {Promise<boolean>} Boolean indication if queue was paused */ pause = async (queue) => { try { await queue.pause(); return true; } catch (error) { (0, errors_1.handleErrorWithInfo)({ message: `Queue: ${queue.name} failed to be paused`, job: "Pause Queue", error: error, }); return false; } }; /** * Continue job execution on a queue that is paused. * @param queue The queue instance to unpause. * @returns {Promise<boolean>} Boolean indication if queue was unpaused */ resume = async (queue) => { try { if (await queue.isPaused()) { await queue.resume(); return true; } return false; } catch (error) { (0, errors_1.handleErrorWithInfo)({ message: `Queue: ${queue.name} failed to be resumed`, job: "Resume Queue", error: error, }); return false; } }; /** * Delete a queue from Redis. * @param queue The queue instance to delete * @returns {Promise<boolean>} */ delete = async (queue) => { if (config_1.QUEUES_INIT[queue.name]) { throw new Error(`Cannot obliterate non-custom queues from this function. Queue: ${queue.name} is a standard queue`); } try { await queue.obliterate(); return true; } catch (error) { (0, errors_1.handleErrorWithInfo)({ message: `Queue: ${queue.name} failed to be deleted`, job: "Delete Queue", error: error, }); return false; } }; } exports.Queues = Queues;