lin3s-event-bus
Version:
Simple but powerful event bus written in ES2015
171 lines (135 loc) • 12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
* This file is part of the EventBusJS library.
*
* Copyright (c) 2016-present LIN3S <info@lin3s.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @author Beñat Espiña <benatespina@gmail.com>
* @author Mikel Tuesta <mikeltuesta@gmail.com>
*/
var _LifeTimeEventPublisher = require('./../Core/EventPublisher/LifeTimeEventPublisher');
var _LifeTimeEventPublisher2 = _interopRequireDefault(_LifeTimeEventPublisher);
var _NodeAddedEventSubscriber = require('./../Subscribers/NodeAddedEventSubscriber');
var _NodeAddedEventSubscriber2 = _interopRequireDefault(_NodeAddedEventSubscriber);
var _NodeAddedEvent = require('./../Events/NodeAddedEvent');
var _NodeAddedEvent2 = _interopRequireDefault(_NodeAddedEvent);
var _isDomNodeDescendantOfDomNode = require('../Dom/isDomNodeDescendantOfDomNode');
var _isDomNodeDescendantOfDomNode2 = _interopRequireDefault(_isDomNodeDescendantOfDomNode);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var NodeAddedEventPublisher = function () {
function NodeAddedEventPublisher() {
_classCallCheck(this, NodeAddedEventPublisher);
this.subscribers = [];
this.subscribersMap = [];
this.isMutationObserverInitialized = false;
}
_createClass(NodeAddedEventPublisher, [{
key: 'initMutationObserver',
value: function initMutationObserver() {
var targetNode = document.body,
observerConfig = {
childList: true,
subtree: true
};
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
this.mutationObserver = new MutationObserver(this.onNodeMutated.bind(this));
this.mutationObserver.observe(targetNode, observerConfig);
this.isMutationObserverInitialized = true;
}
}, {
key: 'subscribe',
value: function subscribe() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$rootNode = _ref.rootNode,
rootNode = _ref$rootNode === undefined ? document : _ref$rootNode,
selector = _ref.selector;
var onNodeAddedCallback = arguments[1];
var priority = arguments[2];
var nodeAddedSubscriber = new _NodeAddedEventSubscriber2.default(onNodeAddedCallback, priority, selector, rootNode);
_LifeTimeEventPublisher2.default.subscribe(nodeAddedSubscriber);
this.subscribers.push(nodeAddedSubscriber);
if (!this.isMutationObserverInitialized) {
this.initMutationObserver();
}
return nodeAddedSubscriber;
}
}, {
key: 'onNodeMutated',
value: function onNodeMutated(mutations) {
var _this = this;
this.mapSubscribers();
mutations.forEach(function (mutation) {
return Array.from(mutation.addedNodes).forEach(function (node) {
return _this.getMatchedNodesAndSubscribers(node).forEach(function (subscriberAndNodes) {
return _LifeTimeEventPublisher2.default.publish(new _NodeAddedEvent2.default(subscriberAndNodes.nodes, subscriberAndNodes.subscriber.rootNode, subscriberAndNodes.subscriber.selector));
});
});
});
}
}, {
key: 'mapSubscribers',
value: function mapSubscribers() {
this.subscribersMap = this.subscribers.map(function (subscriber) {
return {
rootNode: subscriber.rootNode,
selector: subscriber.selector,
nodes: Array.from(subscriber.rootNode.querySelectorAll(subscriber.selector))
};
});
}
}, {
key: 'nodeMatchesSubscriberRequirements',
value: function nodeMatchesSubscriberRequirements(node, subscriber) {
if (node === subscriber.rootNode || !(0, _isDomNodeDescendantOfDomNode2.default)(node, subscriber.rootNode)) {
return false;
}
var mappedSubscriber = this.subscribersMap.find(function (subscriberMap) {
return subscriberMap.selector === subscriber.selector;
});
if (mappedSubscriber === undefined) {
return false;
}
return mappedSubscriber.nodes.find(function (subscriberNode) {
return subscriberNode === node;
});
}
}, {
key: 'getMatchedNodesAndSubscribers',
value: function getMatchedNodesAndSubscribers(node) {
var _this2 = this;
var matchedSubscribersAndNodes = [];
var getMatchedNodes = function getMatchedNodes(rootNode) {
_this2.subscribers.forEach(function (subscriber) {
if (_this2.nodeMatchesSubscriberRequirements(rootNode, subscriber)) {
var matchedSubscriber = matchedSubscribersAndNodes.find(function (matchedSubscribersAndNode) {
return matchedSubscribersAndNode.subscriber.selector === subscriber.selector && matchedSubscribersAndNode.subscriber.rootNode === subscriber.rootNode;
});
if (matchedSubscriber === undefined) {
matchedSubscribersAndNodes.push({
subscriber: subscriber,
nodes: [rootNode]
});
} else {
matchedSubscriber.nodes.push(rootNode);
}
}
});
Array.from(rootNode.childNodes).forEach(function (childNode) {
return getMatchedNodes(childNode);
});
};
getMatchedNodes(node);
return matchedSubscribersAndNodes;
}
}]);
return NodeAddedEventPublisher;
}();
var instance = new NodeAddedEventPublisher();
exports.default = instance;