Skip to content

Commit

Permalink
Implement EventRouter.
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Rechkunov committed Mar 26, 2014
1 parent 8da7a9b commit 75f1b01
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 6 deletions.
95 changes: 90 additions & 5 deletions lib/client/EventRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@

module.exports = EventRouter;

var util = require('util'),
moduleContextHelper = require('../helpers/moduleContextHelper');

var END_EVENT_FORMAT = '!%s',
TRACE_EVENT_RAISED = 'Raised event with name "%s"';

/**
* Creates new instance of module event router.
* @param {Logger} $logger Logger to log messages.
Expand Down Expand Up @@ -66,10 +72,89 @@ EventRouter.prototype._logger = null;

/**
* Routes event in specified parameters.
* @param {Object} parameters Object with request parameter.
* @param {string} eventName Name of event.
*/
EventRouter.prototype.route = function (eventName) {
var self = this;

var sendHandler = function () {
self._sendEvent(eventName, false, function (error) {
if (error) {
self._logger.error(error);
return;
}
self._lastEvent = eventName;
self._logger.trace(
util.format(TRACE_EVENT_RAISED, eventName));

});
};

if (this._lastEvent) {
this._sendEvent(this._lastEvent, true,
function (error) {
if (error) {
self._logger.error(error);
return;
}
if (!eventName) {
return;
}
sendHandler();
}
);
} else if (eventName) {
sendHandler();
}
};

/**
* Sends event to all required receivers.
* @param {string} eventName Name of event.
* @param {boolean} isEnded Is event already ended.
* @param {Function} callback Callback on finish.
* @private
*/
EventRouter.prototype.route = function (parameters) {
// TODO raise !lastEvent, then current event
this._logger.trace('event name: ' +
JSON.stringify(parameters.$url.hash));
EventRouter.prototype._sendEvent = function (eventName, isEnded, callback) {
var self = this,
moduleAndEvent = moduleContextHelper.splitModuleNameAndContext(eventName),
currentEventName = moduleAndEvent ?
moduleAndEvent.context :
eventName,
modules = moduleAndEvent &&
moduleAndEvent.moduleName in this._modulesByNames ?
[moduleAndEvent.moduleName] :
Object.keys(this._modulesByNames),
currentModule;

if (isEnded) {
currentEventName = util.format(END_EVENT_FORMAT, currentEventName);
}

var resultHandler = function (error) {
if (error) {
self._logger.error(error);
}
endCheck();
};

var iteration = function () {
currentModule = self._modulesByNames[modules.shift()].implementation;
try {
currentModule.handle(currentEventName, resultHandler);
} catch (e) {
self._logger.error(e);
endCheck();
}
};

var endCheck = function () {
if (modules.length === 0) {
callback();
} else {
iteration();
}
};

endCheck();
};
2 changes: 1 addition & 1 deletion lib/client/RequestRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ RequestRouter.prototype._invokeEventRoute = function () {
return;
}
this._currentHash = hash;
this._eventRouter.route(state);
this._eventRouter.route(hash ? hash.substring(1) : hash);
};

/**
Expand Down

0 comments on commit 75f1b01

Please sign in to comment.