UNPKG

ocm_mercurius_messenger

Version:

Exchange Messages using Sub-Pub-Pattern

107 lines (89 loc) 4.06 kB
"use strict"; 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;