72 lines
1.7 KiB
JavaScript
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;
|