flocore-node/lib/eventbus.js
2015-04-09 17:05:29 -03:00

72 lines
1.7 KiB
JavaScript

'use strict';
var bitcore = require('bitcore');
var Promise = require('bluebird');
var $ = bitcore.util.preconditions;
var _ = bitcore.deps._;
var EventEmitter = require('eventemitter2').EventEmitter2;
var util = require('util');
function EventBus() {
this.handlers = {};
}
util.inherits(EventBus, EventEmitter);
EventBus.prototype.process = function(e) {
$.checkArgument(_.isObject(e));
var self = this;
var done = [];
var processEvent = function(event) {
done = done.concat(event);
var handlers = self.handlers[event.constructor.name] || [];
var whenHandlersResolve = Promise.all(handlers.map(function(handler) {
return handler(event);
}));
return whenHandlersResolve.each(function(events) {
if (_.isUndefined(events)) {
events = [];
}
if (!_.isArray(events)) {
events = [events];
}
return Promise.all(
events.map(processEvent)
);
});
};
var whenPreviousFinishes = Promise.resolve();
if (this.previous && !this.previous.isFulfilled()) {
//console.log('setting new task with other running, lets queue');
whenPreviousFinishes = this.previous;
}
var current = whenPreviousFinishes
.then(function() {
//console.log('ok, lets go with the new block');
return processEvent(e);
})
.then(function() {
done.forEach(function(event) {
self.emit(event.name || event.constructor.name, event);
});
});
this.previous = current;
return current;
};
EventBus.prototype.register = function(clazz, handler) {
$.checkArgument(_.isFunction(handler));
var name = clazz.name;
this.handlers[name] = this.handlers[name] || [];
this.handlers[name].push(handler);
};
module.exports = EventBus;