payapi-rabbus
Version:
A micro-servicebus for RabbitMQ. Forked from https://github.com/derickbailey/rabbus.git solely to make it use payapi-whistlepunk as a dependency.
96 lines (74 loc) • 2.27 kB
JavaScript
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var Actions = require("./actions");
var logger = require("../logging")("rabbus.consumer");
var MiddlewareBuilder = require("../middlewareBuilder");
var Topology = require("../topology");
// Consumer
// --------
function Consumer(rabbit, options, defaults){
EventEmitter.call(this);
this.rabbit = rabbit;
this.options = options;
this.defaults = defaults;
this.middlewareBuilder = new MiddlewareBuilder(["msg", "props", "actions"]);
}
util.inherits(Consumer, EventEmitter);
// API
// ---
Consumer.prototype.use = function(fn){
this.middlewareBuilder.use(fn);
};
Consumer.prototype.emitError = function(err){
this.emit("error", err);
};
Consumer.prototype.stop = function(){
var queueName = "";
if (this.topology){
queueName = this.topology.queue.name;
this.topology = undefined;
}
logger.info("Stopping Consumer For '" + queueName + "'");
this.removeAllListeners();
if (this.subscription) {
this.subscription.remove();
this.subscription = null;
}
};
Consumer.prototype.consume = function(cb){
this._verifyTopology((err, topology) => {
if (err) { return this.emitError(err); }
var rabbit = this.rabbit;
var queue = topology.queue.name;
var messageType = topology.messageType || topology.routingKey;
this.emit("ready");
var middleware = this.middlewareBuilder.build((msg, properties, actions, next) => {
try {
cb(msg, properties, actions, next);
} catch(err) {
next(err);
}
});
this.subscription = rabbit.handle(messageType, (message) => {
var actions = new Actions(message);
var body = message.body;
var properties = message.properties;
middleware(body, properties, actions);
});
rabbit.startSubscription(queue);
logger.info("Listening To Queue", queue);
});
};
// Helpers
// -------
Consumer.prototype._verifyTopology = function(cb){
if (this.topology) { return this.topology; }
Topology.verify(this.rabbit, this.options, this.defaults, (err, topology) => {
if (err) { return cb(err); }
this.topology = topology;
return cb(undefined, topology);
});
};
// Exports
// -------
module.exports = Consumer;