wakaq
Version:
Background task queue for Node backed by Redis, a super minimal Celery
125 lines (124 loc) • 4.54 kB
JavaScript
;
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;