@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
JavaScript
;
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;