@denimlabs/amqp-delay-fsa
Version:
76 lines (67 loc) • 3.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
// setup connection and start consuming
// host: URL string for AMQP instance
// queueName: name of queue to consume from
// queueOptions: channel qassert queue config object follows amqplib format see http://www.squaremobius.net/amqp.node/channel_api.html
var makeConsumeQueueTasks = function makeConsumeQueueTasks(_ref) {
var amqp = _ref.amqp,
host = _ref.host,
queueName = _ref.queueName,
queueOptions = _ref.queueOptions;
return function (messageQueueReducer) {
return amqp.connect(host).then(function (connection) {
return connection.createChannel();
}).then(function (channel) {
Promise.all([channel.assertQueue(queueName, queueOptions), channel.consume(queueName, function (message) {
return messageQueueReducer(message, channel);
})]);
});
};
};
// pass in array of reducers or single reducer function.
// if passing in array will automatically combine them.
// reducers are just objects with methods.
var makeRootMessageQueueReducer = function makeRootMessageQueueReducer(reducers) {
var rootReducer = void 0;
var processedCount = 0;
if (Array.isArray(reducers)) {
rootReducer = combineReducerArray(reducers);
} else if ((typeof reducers === 'undefined' ? 'undefined' : _typeof(reducers)) === 'object') {
rootReducer = reducers;
}
return function (message, channel) {
var decodedMessagePayload = decode(message.content);
var messageType = decodedMessagePayload.type;
if (!rootReducer[messageType]) {
console.warn('Unknown message type: ' + messageType);
} else if (typeof rootReducer[messageType] !== 'function') {
console.warn('Message reducer type not a valid function: ' + messageType);
} else {
rootReducer[messageType](decodedMessagePayload);
}
console.log('\n\nProcessed Task: #' + processedCount + ' ' + messageType + ' at ' + new Date().getMinutes() + ':' + new Date().getSeconds() + '\n\n');
processedCount++;
// because we are using dead-letter-exchange we have to ack even bad messages else we will
// create a loop of consume -> reject -> deadletter -> consume.....
channel.ack(message);
};
};
// combines multiple reducer objects into single reducer
var combineReducerArray = function combineReducerArray(reducers) {
return reducers.reduce(function (reducer, currentReducer) {
return Object.assign(currentReducer, reducer);
}, {});
};
// decodes Buffer into JSON
var decode = function decode(payload) {
return JSON.parse(payload.toString('utf8'));
};
exports.default = {
makeConsumeQueueTasks: makeConsumeQueueTasks,
makeRootMessageQueueReducer: makeRootMessageQueueReducer
};
//# sourceMappingURL=amqp-worker-service.js.map