@robotlegsjs/eventemitter3
Version:
RobotlegsJS integration with EventEmitter3
190 lines • 7.77 kB
JavaScript
"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