redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
79 lines • 3.85 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ScheduleWorker = void 0;
const redis_keys_1 = require("../common/redis-keys/redis-keys");
const message_1 = require("../lib/message/message");
const redis_smq_common_1 = require("redis-smq-common");
const redis_client_1 = require("../common/redis-client/redis-client");
const types_1 = require("../../types");
class ScheduleWorker extends redis_smq_common_1.Worker {
constructor(redisClient, managed) {
super(managed);
this.fetchMessageIds = (cb) => {
const { keyScheduledMessageWeight } = redis_keys_1.redisKeys.getMainKeys();
this.redisClient.zrangebyscore(keyScheduledMessageWeight, 0, Date.now(), 0, 100, cb);
};
this.fetchMessages = (ids, cb) => {
if (ids.length) {
const { keyScheduledMessages } = redis_keys_1.redisKeys.getMainKeys();
this.redisClient.hmget(keyScheduledMessages, ids, (err, reply) => {
if (err)
cb(err);
else {
const messages = [];
redis_smq_common_1.async.each(reply !== null && reply !== void 0 ? reply : [], (item, _, done) => {
if (!item)
done(new redis_smq_common_1.errors.EmptyCallbackReplyError());
else {
messages.push(message_1.Message.createFromMessage(item));
done();
}
}, (err) => {
if (err)
cb(err);
else
cb(null, messages);
});
}
});
}
else
cb(null, []);
};
this.enqueueMessages = (messages, cb) => {
if (messages.length) {
redis_smq_common_1.async.each(messages, (msg, _, done) => {
var _a;
const message = message_1.Message.createFromMessage(msg);
const queue = message.getDestinationQueue();
const { keyQueueSettings, keyQueuePending, keyQueuePendingPriorityMessages, keyQueuePendingPriorityMessageWeight, keyScheduledMessageWeight, keyScheduledMessages, } = redis_keys_1.redisKeys.getQueueKeys(queue);
const nextScheduleTimestamp = message.getNextScheduledTimestamp();
message.getRequiredMessageState().setPublishedAt(Date.now());
this.redisClient.runScript(redis_client_1.ELuaScriptName.ENQUEUE_SCHEDULED_MESSAGE, [
keyQueueSettings,
types_1.EQueueSettingType.QUEUE_TYPE,
keyQueuePendingPriorityMessages,
keyQueuePendingPriorityMessageWeight,
keyQueuePending,
keyScheduledMessageWeight,
keyScheduledMessages,
], [
message.getRequiredId(),
JSON.stringify(message),
(_a = message.getPriority()) !== null && _a !== void 0 ? _a : '',
`${nextScheduleTimestamp}`,
], (err) => done(err));
}, cb);
}
else
cb();
};
this.work = (cb) => {
redis_smq_common_1.async.waterfall([this.fetchMessageIds, this.fetchMessages, this.enqueueMessages], cb);
};
this.redisClient = redisClient;
}
}
exports.ScheduleWorker = ScheduleWorker;
exports.default = ScheduleWorker;
//# sourceMappingURL=schedule.worker.js.map
;