UNPKG

@soketi/soketi

Version:

Just another simple, fast, and resilient open-source WebSockets server.

70 lines (69 loc) 2.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RedisQueueDriver = void 0; const async_1 = require("async"); const bullmq_1 = require("bullmq"); const ioredis_1 = require("ioredis"); class RedisQueueDriver { constructor(server) { this.server = server; this.queueWithWorker = new Map(); } addToQueue(queueName, data) { return new Promise(resolve => { let queueWithWorker = this.queueWithWorker.get(queueName); if (!queueWithWorker) { return resolve(); } queueWithWorker.queue.add('webhook', data).then(() => resolve()); }); } processQueue(queueName, callback) { return new Promise(resolve => { if (!this.queueWithWorker.has(queueName)) { let redisOptions = { maxRetriesPerRequest: null, enableReadyCheck: false, ...this.server.options.database.redis, ...this.server.options.queue.redis.redisOptions, keyPrefix: undefined, }; const connection = this.server.options.queue.redis.clusterMode ? new ioredis_1.Cluster(this.server.options.database.redis.clusterNodes, { scaleReads: 'slave', ...redisOptions }) : new ioredis_1.default(redisOptions); const queueSharedOptions = { prefix: this.server.options.database.redis.keyPrefix.replace(/:$/, ''), connection, }; this.queueWithWorker.set(queueName, { queue: new bullmq_1.Queue(queueName, { ...queueSharedOptions, defaultJobOptions: { attempts: 6, backoff: { type: 'exponential', delay: 1000, }, removeOnComplete: true, removeOnFail: true, }, }), worker: new bullmq_1.Worker(queueName, callback, { ...queueSharedOptions, concurrency: this.server.options.queue.redis.concurrency, }), scheduler: new bullmq_1.QueueScheduler(queueName, queueSharedOptions), }); } resolve(); }); } disconnect() { return async_1.default.each([...this.queueWithWorker], ([queueName, { queue, worker, scheduler }], callback) => { scheduler.close().then(() => { worker.close().then(() => callback()); }); }); } } exports.RedisQueueDriver = RedisQueueDriver;