durabull
Version:
A durable workflow engine built on top of BullMQ and Redis
67 lines (66 loc) • 2.36 kB
JavaScript
;
/**
* BullMQ queue management
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.closeQueues = exports.getQueues = exports.initQueues = void 0;
const bullmq_1 = require("bullmq");
const ioredis_1 = require("ioredis");
const global_1 = require("./config/global");
let queues = null;
/**
* Initialize queues with explicit configuration
*/
function initQueues(redisUrl, workflowQueue, activityQueue) {
if (queues) {
// If already initialized, check if config matches.
// If it does, return existing. If not, throw error to prevent leaks/confusion.
// Note: We can't easily check redisUrl equality due to potential formatting differences,
// but we can check queue names.
if (queues.workflow.name === workflowQueue && queues.activity.name === activityQueue) {
return queues;
}
throw new Error('Queues already initialized with different configuration. Call closeQueues() first.');
}
const connection = new ioredis_1.Redis(redisUrl, {
maxRetriesPerRequest: null,
});
queues = {
workflow: new bullmq_1.Queue(workflowQueue, { connection }),
activity: new bullmq_1.Queue(activityQueue, { connection }),
workflowEvents: new bullmq_1.QueueEvents(workflowQueue, { connection }),
activityEvents: new bullmq_1.QueueEvents(activityQueue, { connection }),
connection,
};
return queues;
}
exports.initQueues = initQueues;
/**
* Get queue instances (must call initQueues first in durable mode)
*/
function getQueues() {
if (!queues) {
const instance = global_1.Durabull.getActive();
if (instance) {
const config = instance.getConfig();
return initQueues(config.redisUrl, config.queues.workflow, config.queues.activity);
}
throw new Error('Durabull instance not initialized. Call new Durabull(config) first.');
}
return queues;
}
exports.getQueues = getQueues;
/**
* Close all queue connections
*/
async function closeQueues() {
if (queues) {
await queues.workflow.close();
await queues.activity.close();
await queues.workflowEvents.close();
await queues.activityEvents.close();
await queues.connection.quit();
queues = null;
}
}
exports.closeQueues = closeQueues;