eventric
Version:
Build JavaScript applications with Behaviour-driven Domain Design. Based on DDD, BDD, CQRS and EventSourcing.
109 lines (97 loc) • 3 kB
JavaScript
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;