UNPKG

@robotlegsjs/eventemitter3

Version:
190 lines 7.77 kB
"use strict"; // ------------------------------------------------------------------------------ // Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. // // NOTICE: You are permitted to use, modify, and distribute this file // in accordance with the terms of the license agreement accompanying it. // ------------------------------------------------------------------------------ Object.defineProperty(exports, "__esModule", { value: true }); exports.EventEmitterMap = void 0; var tslib_1 = require("tslib"); var core_1 = require("@robotlegsjs/core"); var EventEmitterMapConfig_1 = require("./EventEmitterMapConfig"); /** * @private */ var EventEmitterMap = /** @class */ (function (_super) { tslib_1.__extends(EventEmitterMap, _super); function EventEmitterMap() { /*============================================================================*/ /* Protected Properties */ /*============================================================================*/ var _this = _super !== null && _super.apply(this, arguments) || this; _this._eventEmitterListeners = []; _this._suspendedEventEmitterListeners = []; return _this; } Object.defineProperty(EventEmitterMap.prototype, "_currentEventEmitterListeners", { get: function () { return this._suspended ? this._suspendedEventEmitterListeners : this._eventEmitterListeners; }, enumerable: false, configurable: true }); /*============================================================================*/ /* Public Functions */ /*============================================================================*/ /** * @inheritDoc */ EventEmitterMap.prototype.on = function (emitter, event, listener, context) { this._registerEventEmitterListener(emitter, event, listener, context); }; /** * @inheritDoc */ EventEmitterMap.prototype.once = function (emitter, event, listener, context) { this._registerEventEmitterListener(emitter, event, listener, context, true); }; /** * @inheritDoc */ EventEmitterMap.prototype.off = function (emitter, event, listener, context) { this._unregisterEventEmitterListener(emitter, event, listener, context); }; /** * @inheritDoc */ EventEmitterMap.prototype.unmapEventEmitterListeners = function () { var eventConfig; while (this._currentEventEmitterListeners.length) { eventConfig = this._currentEventEmitterListeners[this._currentEventEmitterListeners.length - 1]; this._unregisterEventEmitterListener(eventConfig.emitter, eventConfig.event, eventConfig.listener, eventConfig.context); } }; /** * @inheritDoc */ EventEmitterMap.prototype.unmapAllListeners = function () { _super.prototype.unmapAllListeners.call(this); this.unmapEventEmitterListeners(); }; /** * @inheritDoc */ EventEmitterMap.prototype.suspend = function () { var _this = this; if (this._suspended) { return; } // Handle EventEmitter's var emitter; this._eventEmitterListeners.forEach(function (eventConfig) { emitter = eventConfig.emitter; if (eventConfig.once) { emitter.off(eventConfig.event, eventConfig.calback, eventConfig.context, eventConfig.once); } else { emitter.off(eventConfig.event, eventConfig.listener, eventConfig.context, eventConfig.once); } _this._suspendedEventEmitterListeners.push(eventConfig); }); this._eventEmitterListeners = []; _super.prototype.suspend.call(this); }; /** * @inheritDoc */ EventEmitterMap.prototype.resume = function () { var _this = this; if (!this._suspended) { return; } // Handle EventEmitter's var emitter; this._suspendedEventEmitterListeners.forEach(function (eventConfig) { emitter = eventConfig.emitter; if (eventConfig.once) { emitter.once(eventConfig.event, eventConfig.calback, eventConfig.context); } else { emitter.on(eventConfig.event, eventConfig.listener, eventConfig.context); } _this._eventEmitterListeners.push(eventConfig); }); this._suspendedEventEmitterListeners = []; _super.prototype.resume.call(this); }; /*============================================================================*/ /* Protected Functions */ /*============================================================================*/ EventEmitterMap.prototype._registerEventEmitterListener = function (emitter, event, listener, context, once) { var config; var i = this._currentEventEmitterListeners.length; while (i--) { config = this._currentEventEmitterListeners[i]; if (config.equalTo(emitter, event, listener, context)) { return; } } if (once) { config = new EventEmitterMapConfig_1.EventEmitterMapConfig(emitter, event, listener, context, once); config.calback = this._onceCallback(config); } else { config = new EventEmitterMapConfig_1.EventEmitterMapConfig(emitter, event, listener, context); } this._currentEventEmitterListeners.push(config); if (!this._suspended) { if (once) { emitter.once(event, config.calback, context); } else { emitter.on(event, listener, context); } } }; EventEmitterMap.prototype._onceCallback = function (eventConfig) { var _this = this; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var i = _this._currentEventEmitterListeners.length; while (i--) { var config = _this._currentEventEmitterListeners[i]; if (config.equalTo(eventConfig.emitter, eventConfig.event, eventConfig.listener, eventConfig.context)) { _this._currentEventEmitterListeners.splice(i, 1); eventConfig.listener.apply(eventConfig.context, args); return; } } }; }; EventEmitterMap.prototype._unregisterEventEmitterListener = function (emitter, event, listener, context) { var i = this._currentEventEmitterListeners.length; while (i--) { var config = this._currentEventEmitterListeners[i]; if (config.equalTo(emitter, event, listener, context)) { if (!this._suspended) { if (config.once) { emitter.off(event, config.calback, config.context, config.once); } else { emitter.off(event, config.listener, config.context, config.once); } } this._currentEventEmitterListeners.splice(i, 1); return; } } }; EventEmitterMap = tslib_1.__decorate([ core_1.injectable() ], EventEmitterMap); return EventEmitterMap; }(core_1.EventMap)); exports.EventEmitterMap = EventEmitterMap; //# sourceMappingURL=EventEmitterMap.js.map