ocm_mercurius_messenger
Version:
Exchange Messages using Sub-Pub-Pattern
107 lines (89 loc) • 4.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createSubscriber2 = require("./createSubscriber");
var _createSubscriber3 = _interopRequireDefault(_createSubscriber2);
var _subscriptionTypes2 = require("./subscriptionTypes");
var _subscriptionTypes3 = _interopRequireDefault(_subscriptionTypes2);
var _createPublication2 = require("./createPublication");
var _createPublication3 = _interopRequireDefault(_createPublication2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _idCount = 0;
var _subscribers = {};
var _latestPublications = {};
var _getSubscriberPublicationTypeById = function _getSubscriberPublicationTypeById(id) {
return Object.keys(_subscribers).find(function (publicationType) {
if (_subscribers[publicationType][id]) {
return publicationType;
}
});
};
var _addSubscriberAndReturnID = function _addSubscriberAndReturnID(publicationType, subscriber) {
var id = _idCount++;
_checkAndCreatePublicationType(publicationType);
var existingSubscriberID = _checkForExistence(publicationType, subscriber);
if (existingSubscriberID) return existingSubscriberID;
_subscribers[publicationType][id] = subscriber;
return id;
};
var _checkAndCreatePublicationType = function _checkAndCreatePublicationType(publicationType) {
if (typeof _subscribers[publicationType] === "undefined") {
_subscribers[publicationType] = {};
}
};
var _checkForExistence = function _checkForExistence(publicationType, subscriber) {
var subscriberID = null;
var newSubscriber = subscriber;
var subscribersForPublicationType = _subscribers[publicationType];
for (var subscriberItem in subscribersForPublicationType) {
if (subscribersForPublicationType.hasOwnProperty(subscriberItem) && subscribersForPublicationType[subscriberItem].callback === newSubscriber.callback) {
subscriberID = subscriberItem;
}
}
return subscriberID;
};
var _publishLatest = function _publishLatest(publicationType, subscriberID) {
if (_latestPublications[publicationType] && _subscribers[publicationType][subscriberID]['options'][_subscriptionTypes3.default.REACT_TO_LATEST]) {
_subscribers[publicationType][subscriberID].handleLatestpublication(_latestPublications[publicationType]);
_removeSubscriberReactOnlyOnce(publicationType, subscriberID);
}
return true;
};
var _removeSubscriberReactOnlyOnce = function _removeSubscriberReactOnlyOnce(publicationType, itemKey) {
if (_subscribers[publicationType][itemKey]['options'][_subscriptionTypes3.default.REACT_ONLY_ONCE]) delete _subscribers[publicationType][itemKey];
};
var _removeSubscriber = function _removeSubscriber(publicationType, itemKey) {
if (publicationType && itemKey !== undefined && _subscribers[publicationType][itemKey] !== undefined) {
delete _subscribers[publicationType][itemKey];
}
};
var messenger = {
subscriptionTypes: _subscriptionTypes3.default,
subscribe: function subscribe(publicationType, callback, options) {
var subscriber = (0, _createSubscriber3.default)(callback, options);
var subscriberID = _addSubscriberAndReturnID(publicationType, subscriber);
_publishLatest(publicationType, subscriberID);
return subscriberID;
},
unsubscribe: function unsubscribe(subscriberID) {
var publicationType = _getSubscriberPublicationTypeById(subscriberID);
_removeSubscriber(publicationType, subscriberID);
return true;
},
publish: function publish(publicationType, publicationData) {
var subscribersForPublicationType = _subscribers[publicationType];
var publication = (0, _createPublication3.default)(publicationData);
for (var itemKey in subscribersForPublicationType) {
if (subscribersForPublicationType.hasOwnProperty(itemKey)) {
var singleSubscriber = subscribersForPublicationType[itemKey];
singleSubscriber.handlepublication(publication);
_removeSubscriberReactOnlyOnce(publicationType, itemKey);
}
}
// Remember publication
_latestPublications[publicationType] = publication;
return true;
}
};
exports.default = messenger;