UNPKG

wakaq

Version:

Background task queue for Node backed by Redis, a super minimal Celery

125 lines (124 loc) 4.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.purgeEtaQueue = exports.purgeQueue = exports.numWorkersConnected = exports.numPendingEtaTasksInQueue = exports.numPendingTasksInQueue = exports.pendingEtaTasksInQueue = exports.pendingTasksInQueue = exports.inspect = void 0; const ts_duration_1 = require("ts-duration"); const exceptions_js_1 = require("./exceptions.js"); const serializer_js_1 = require("./serializer.js"); const inspect = async (wakaq) => { const results = await Promise.all(wakaq.queues.map(async (q) => { return { name: q.name, priority: q.priority, broker_key: q.brokerKey, broker_eta_key: q.brokerEtaKey, pending_tasks: await (0, exports.numPendingTasksInQueue)(wakaq, q), pending_eta_tasks: await (0, exports.numPendingEtaTasksInQueue)(wakaq, q), }; })); const queues = {}; results.forEach((q) => { queues[q.name] = q; }); const workers = await (0, exports.numWorkersConnected)(wakaq); return { queues, workers, }; }; exports.inspect = inspect; const pendingTasksInQueue = async (wakaq, queue, limit = 0) => { if (typeof queue === 'string') { queue = wakaq.queuesByName.get(queue); } if (!queue) return []; const tasks = await wakaq.broker.lrange(queue.brokerKey, 0, limit - 1); return tasks.map((task) => (0, serializer_js_1.serialize)(task)); }; exports.pendingTasksInQueue = pendingTasksInQueue; const pendingEtaTasksInQueue = async (wakaq, queue, before, limit = 0, offset = 0) => { if (typeof queue === 'string') { const q = wakaq.queuesByName.get(queue); if (!q) return []; queue = q; } let params = []; let cmd; if (before) { cmd = 'ZRANGEBYSCORE'; if (before instanceof ts_duration_1.Duration) { before = (new Date().getTime() + before.milliseconds) / 1000; } else if (before instanceof Date) { before = before.getTime() / 1000; } params.push('0'); params.push(String(Math.round(before))); params.push('WITHSCORES'); if (limit) { params.push('LIMIT'); params.push(String(offset)); params.push(String(limit)); } } else { cmd = 'ZRANGE'; params.push(String(offset)); params.push(String(limit - 1)); params.push('WITHSCORES'); } const tasks = (await wakaq.broker.call(cmd, queue.brokerEtaKey, ...params)); let payloads = []; for (var i = 0; i < tasks.length; i += 2) { const payload = (0, serializer_js_1.deserialize)(tasks[i]); payload['eta'] = tasks[i + 1]; payloads.push(payload); } return payloads; }; exports.pendingEtaTasksInQueue = pendingEtaTasksInQueue; const numPendingTasksInQueue = async (wakaq, queue) => { if (typeof queue === 'string') { const q = wakaq.queuesByName.get(queue); if (!q) throw new exceptions_js_1.WakaQError(`Invalid queue: ${queue}`); queue = q; } return await wakaq.broker.llen(queue.brokerKey); }; exports.numPendingTasksInQueue = numPendingTasksInQueue; const numPendingEtaTasksInQueue = async (wakaq, queue) => { if (typeof queue === 'string') { const q = wakaq.queuesByName.get(queue); if (!q) throw new exceptions_js_1.WakaQError(`Invalid queue: ${queue}`); queue = q; } return await wakaq.broker.zcount(queue.brokerEtaKey, '-inf', '+inf'); }; exports.numPendingEtaTasksInQueue = numPendingEtaTasksInQueue; const numWorkersConnected = async (wakaq) => { return Number((await wakaq.broker.pubsub('NUMSUB', wakaq.broadcastKey))[1]); }; exports.numWorkersConnected = numWorkersConnected; const purgeQueue = async (wakaq, queue) => { if (typeof queue === 'string') { const q = wakaq.queuesByName.get(queue); if (!q) throw new exceptions_js_1.WakaQError(`Invalid queue: ${queue}`); queue = q; } return await wakaq.broker.del(queue.brokerKey); }; exports.purgeQueue = purgeQueue; const purgeEtaQueue = async (wakaq, queue) => { if (typeof queue === 'string') { const q = wakaq.queuesByName.get(queue); if (!q) throw new exceptions_js_1.WakaQError(`Invalid queue: ${queue}`); queue = q; } return await wakaq.broker.del(queue.brokerEtaKey); }; exports.purgeEtaQueue = purgeEtaQueue;