From cdf8dab86c3e25e50ecc8673762faaf6852e0d13 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Fri, 20 Feb 2015 17:52:49 -0300 Subject: [PATCH] promisify event bus --- lib/eventbus.js | 42 ++++++++++++++++++++++++++---------------- test/eventbus.js | 17 +++++++++++++++++ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/lib/eventbus.js b/lib/eventbus.js index fc999435..20da9316 100644 --- a/lib/eventbus.js +++ b/lib/eventbus.js @@ -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; }; diff --git a/test/eventbus.js b/test/eventbus.js index 1e7bba65..ccd74df5 100644 --- a/test/eventbus.js +++ b/test/eventbus.js @@ -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); + }); }); });