promisify event bus

This commit is contained in:
Manuel Araoz 2015-02-20 17:52:49 -03:00
parent abf30895b9
commit cdf8dab86c
2 changed files with 43 additions and 16 deletions

View File

@ -2,6 +2,7 @@
var bitcore = require('bitcore');
var Promise = require('bluebird');
var $ = bitcore.util.preconditions;
var _ = bitcore.deps._;
var EventEmitter = require('events').EventEmitter;
@ -16,24 +17,33 @@ EventBus.prototype.process = function(e) {
$.checkArgument(_.isObject(e));
var self = this;
var queue = [];
var done = [];
queue.push(e);
while (queue.length !== 0) {
var event = queue.shift();
var handlers = this.handlers[event.constructor.name] || [];
handlers.forEach(function(handler) {
var responses = handler(event);
if (responses && responses.length > 0) {
queue = queue.concat(responses);
}
});
done.push(event);
}
done.forEach(function(event) {
self.emit(event.name || event.constructor.name, event);
});
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 eventsEmitted = processEvent(e)
.then(function() {
done.forEach(function(event) {
self.emit(event.name || event.constructor.name, event);
});
});
return eventsEmitted;
};

View File

@ -5,6 +5,7 @@ var should = chai.should();
var sinon = require('sinon');
var EventBus = require('../lib/eventbus');
require('bluebird').longStackTraces();
describe('EventBus', function() {
@ -15,6 +16,7 @@ describe('EventBus', function() {
describe('process', function() {
function FooEvent() {}
function BarEvent() {}
var foo = new FooEvent();
var bar = new BarEvent();
@ -65,6 +67,21 @@ describe('EventBus', function() {
bus.process(foo);
spy.callCount.should.equal(2);
});
it('foo returns two bars and emits external events', function(cb) {
var bus = new EventBus();
var b1 = new BarEvent();
var b2 = new BarEvent();
var spy = sinon.spy(bus, 'emit');
bus.register(FooEvent, function() {
return [b1, b2];
});
bus.process(foo)
.then(function() {
spy.calledWith('BarEvent', b1).should.equal(true);
spy.calledWith('BarEvent', b2).should.equal(true);
})
.then(cb);
});
});
});