UNPKG

eventric

Version:

Build JavaScript applications with Behaviour-driven Domain Design. Based on DDD, BDD, CQRS and EventSourcing.

109 lines (97 loc) 3 kB
var PubSub, __slice = [].slice; PubSub = (function() { function PubSub() { this._subscribers = []; this._subscriberId = 0; this._nextTick = function() { var args; args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; return setTimeout.apply(null, args); }; } PubSub.prototype.subscribe = function(eventName, subscriberFn) { var subscriber; subscriber = { eventName: eventName, subscriberFn: subscriberFn, subscriberId: this._getNextSubscriberId() }; this._subscribers.push(subscriber); return subscriber.subscriberId; }; PubSub.prototype.subscribeAsync = function(eventName, subscriberFn) { var subscriber; subscriber = { eventName: eventName, subscriberFn: subscriberFn, subscriberId: this._getNextSubscriberId(), isAsync: true }; this._subscribers.push(subscriber); return subscriber.subscriberId; }; PubSub.prototype.publish = function(eventName, payload, callback) { var executeNextHandler, subscribers; if (callback == null) { callback = function() {}; } subscribers = this._getRelevantSubscribers(eventName); executeNextHandler = (function(_this) { return function() { if (subscribers.length === 0) { return callback(); } else { subscribers.shift().subscriberFn(payload, function() {}); return _this._nextTick(executeNextHandler, 0); } }; })(this); return this._nextTick(executeNextHandler, 0); }; PubSub.prototype.publishAsync = function(eventName, payload, callback) { var executeNextHandler, subscribers; if (callback == null) { callback = function() {}; } subscribers = this._getRelevantSubscribers(eventName); executeNextHandler = (function(_this) { return function() { var subscriber; if (subscribers.length === 0) { return callback(); } else { subscriber = subscribers.shift(); if (subscriber.isAsync) { return subscriber.subscriberFn(payload, function() { return setTimeout(executeNextHandler, 0); }); } else { subscriber.subscriberFn(payload); return _this._nextTick(executeNextHandler, 0); } } }; })(this); return this._nextTick(executeNextHandler, 0); }; PubSub.prototype._getRelevantSubscribers = function(eventName) { if (eventName) { return this._subscribers.filter(function(x) { return x.eventName === eventName; }); } else { return this._subscribers; } }; PubSub.prototype.unsubscribe = function(subscriberId) { return this._subscribers = this._subscribers.filter(function(x) { return x.subscriberId !== subscriberId; }); }; PubSub.prototype._getNextSubscriberId = function() { return this._subscriberId++; }; return PubSub; })(); module.exports = PubSub;