redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
154 lines • 6.85 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueMessagesManagerAbstract = void 0;
const redis_smq_common_1 = require("redis-smq-common");
const _delete_message_js_1 = require("../../message/_/_delete-message.js");
const _parse_queue_extended_params_js_1 = require("../../queue/_/_parse-queue-extended-params.js");
const _validate_queue_extended_params_js_1 = require("../_/_validate-queue-extended-params.js");
class QueueMessagesManagerAbstract {
constructor(redisClient, messagesStorage, message, redisKey) {
this.requireGroupId = false;
this.redisClient = redisClient;
this.messageStorage = messagesStorage;
this.message = message;
this.redisKey = redisKey;
}
getTotalPages(pageSize, totalItems) {
if (pageSize <= 0) {
return 1;
}
const totalPages = Math.ceil(totalItems / pageSize);
return totalPages > 0 ? totalPages : 1;
}
getPaginationParams(cursor, totalItems, pageSize) {
const totalPages = this.getTotalPages(pageSize, totalItems);
const currentPage = cursor < 1 || cursor > totalPages ? 1 : cursor;
const offsetStart = (currentPage - 1) * pageSize;
const offsetEnd = offsetStart + pageSize - 1;
return { offsetStart, offsetEnd, currentPage, totalPages };
}
getMessagesIds(queue, page, pageSize, cb) {
redis_smq_common_1.async.waterfall([
(next) => this.messageStorage.count(queue, this.redisKey, next),
(totalItems, next) => {
const { currentPage, offsetStart, offsetEnd, totalPages } = this.getPaginationParams(page, totalItems, pageSize);
const nextCursor = currentPage < totalPages ? currentPage + 1 : 0;
if (totalItems === 0) {
return next(null, {
cursor: nextCursor,
totalItems,
items: [],
});
}
this.messageStorage.fetchItems(queue, this.redisKey, offsetStart, offsetEnd, (err, items) => {
if (err)
return next(err);
next(null, {
cursor: nextCursor,
totalItems,
items: items !== null && items !== void 0 ? items : [],
});
});
},
], cb);
}
purge(queue, cb) {
const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue);
if (parsedParams instanceof Error)
return cb(parsedParams);
this.redisClient.getSetInstance((err, client) => {
if (err)
return cb(err);
if (!client)
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
(0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => {
if (err)
return cb(err);
this._purgeMessages(client, parsedParams, cb);
});
});
}
_purgeMessages(client, parsedParams, cb) {
const purgeBatch = (cursor = '0') => {
redis_smq_common_1.async.waterfall([
(next) => {
this.getMessagesIds(parsedParams, Number(cursor), 1000, next);
},
(page, next) => {
const { items, cursor: nextCursor } = page;
if (items.length === 0) {
return next(null, String(nextCursor));
}
(0, _delete_message_js_1._deleteMessage)(client, items, (err) => {
if (err)
return next(err);
next(null, String(nextCursor));
});
},
], (err, nextCursor) => {
if (err)
return cb(err);
if (nextCursor !== '0') {
purgeBatch(String(nextCursor));
}
else {
cb();
}
});
};
purgeBatch('0');
}
getMessages(queue, page, pageSize, cb) {
const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue);
if (parsedParams instanceof Error)
return cb(parsedParams);
this.redisClient.getSetInstance((err, client) => {
if (err)
return cb(err);
if (!client)
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
(0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => {
if (err)
return cb(err);
this.getMessagesIds(parsedParams, page, pageSize, (err, pageResult) => {
if (err)
return cb(err);
if (!pageResult)
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
if (pageResult.items.length === 0) {
return cb(null, Object.assign(Object.assign({}, pageResult), { items: [] }));
}
this.message.getMessagesByIds(pageResult.items, (err, messages) => {
if (err)
return cb(err);
cb(null, Object.assign(Object.assign({}, pageResult), { items: messages !== null && messages !== void 0 ? messages : [] }));
});
});
});
});
}
countMessages(queue, cb) {
this.redisClient.getSetInstance((err, client) => {
if (err)
return cb(err);
if (!client)
return cb(new redis_smq_common_1.CallbackEmptyReplyError());
const parsedParams = (0, _parse_queue_extended_params_js_1._parseQueueExtendedParams)(queue);
if (parsedParams instanceof Error)
return cb(parsedParams);
(0, _validate_queue_extended_params_js_1._validateQueueExtendedParams)(client, parsedParams, this.requireGroupId, (err) => {
if (err)
return cb(err);
this.messageStorage.count(parsedParams, this.redisKey, cb);
});
});
}
shutdown(cb) {
redis_smq_common_1.async.waterfall([
(next) => this.message.shutdown(next),
(next) => this.redisClient.shutdown(next),
], cb);
}
}
exports.QueueMessagesManagerAbstract = QueueMessagesManagerAbstract;
//# sourceMappingURL=queue-messages-manager-abstract.js.map
;