UNPKG

lin3s-event-bus

Version:

Simple but powerful event bus written in ES2015

171 lines (135 loc) 12 kB
'use strict'; 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;