UNPKG

cu-events

Version:

Camelot Unchained Client Library - Events

132 lines (114 loc) 12.5 kB
/** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "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; }; })(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var internalId = 0; var Listener = function Listener(topic, once, callback) { _classCallCheck(this, Listener); this.topic = topic; this.once = once; this.callback = callback; this.id = ++internalId; }; var EventEmitter = (function () { function EventEmitter() { _classCallCheck(this, EventEmitter); this.events = {}; } /** * addListener() is called to register a listener for a topic. * * @param topic {string} Topic name * @param once {boolean} Fire event only once (auto-unregister) [optional] * @param callback {function} Handler to call when topic is fired */ _createClass(EventEmitter, [{ key: "addListener", value: function addListener(topic, once, callback) { if (once === undefined) once = false; var listeners = this.events[topic] = this.events[topic] || []; var listener = new Listener(topic, once, callback); var i = listeners.indexOf(null); if (i === -1) { listeners.push(listener); } else { listeners[i] = listener; } return listener; } /** * on() is called to register a listener for a topic. * * @param topic {string} Topic name * @param callback {function} Handler to call when topic is fired */ }, { key: "on", value: function on(topic, callback) { return this.addListener(topic, false, callback); } /** * listenOnce() is called to register a listener for a topic that will * fire only once before being auto-removed. * * @param topic {string} Topic name * @param callback {function} Handler to call when topic is fired */ }, { key: "listenOnce", value: function listenOnce(topic, callback) { return this.addListener(topic, true, callback); } /** * removeListener() is called to deregister an existing listener * * @param listener {any} Handle returned by previous call to addListener() */ }, { key: "removeListener", value: function removeListener(listener) { var listeners = this.events[listener.topic]; if (listeners && listeners.length) { for (var i = 0; i < listeners.length; i++) { if (listeners[i] && listeners[i].id === listener.id) { listeners[i] = null; return; } } } } /** * emit() is called to pass the supplied data to the registered handlers for the topic * * @param topic {string} Topic name * @param data {any} The data being passed (depends on topic) */ }, { key: "emit", value: function emit(topic, data) { var listeners = this.events[topic]; if (listeners && listeners.length) { for (var i = 0; i < listeners.length; i++) { if (listeners[i]) { var listener = listeners[i]; if (listener.once) { listeners[i] = null; } listener.callback(data); } } } } }]); return EventEmitter; })(); exports["default"] = EventEmitter; module.exports = exports["default"]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRzL2NsYXNzZXMvRXZlbnRFbWl0dGVyLnRzIl0sIm5hbWVzIjpbIkxpc3RlbmVyIiwiTGlzdGVuZXIuY29uc3RydWN0b3IiLCJFdmVudEVtaXR0ZXIiLCJFdmVudEVtaXR0ZXIuY29uc3RydWN0b3IiLCJFdmVudEVtaXR0ZXIuYWRkTGlzdGVuZXIiLCJFdmVudEVtaXR0ZXIub24iLCJFdmVudEVtaXR0ZXIubGlzdGVuT25jZSIsIkV2ZW50RW1pdHRlci5yZW1vdmVMaXN0ZW5lciIsIkV2ZW50RW1pdHRlci5lbWl0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFNQSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7O0lBRW5CLFFBQUEsR0FLRUEsU0FMRixRQUFBLENBS2NBLEtBQWFBLEVBQUVBLElBQWFBLEVBQUVBLFFBQTZCQSxFQUFBQTswQkFMekUsUUFBQTs7QUFNSUMsUUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0EsQ0FBQ0E7QUFDbkJBLFFBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBO0FBQ2pCQSxRQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxRQUFRQSxDQUFDQTtBQUN6QkEsUUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsVUFBVUEsQ0FBQ0E7Q0FDeEJBOztJQUdILFlBQUE7QUFFRUMsYUFGRixZQUFBLEdBRUVBOzhCQUZGLFlBQUE7O0FBR0lDLFlBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEVBQUVBLENBQUNBO0tBQ2xCQTs7Ozs7Ozs7OztpQkFKSCxZQUFBOztlQWFhRCxxQkFBQ0EsS0FBYUEsRUFBRUEsSUFBSUEsRUFBbUJBLFFBQTZCQSxFQUFBQTtnQkFBcERBLElBQUlBLGdCQUFKQSxJQUFJQSxHQUFZQSxLQUFLQTs7QUFDOUNFLGdCQUFNQSxTQUFTQSxHQUFlQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQTtBQUM1RUEsZ0JBQU1BLFFBQVFBLEdBQWFBLElBQUlBLFFBQVFBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO0FBQy9EQSxnQkFBSUEsQ0FBQ0EsR0FBV0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7QUFDeENBLGdCQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxFQUFFQTtBQUNaQSx5QkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7YUFDMUJBLE1BQU1BO0FBQ0xBLHlCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQTthQUN6QkE7QUFDREEsbUJBQU9BLFFBQVFBLENBQUNBO1NBQ2pCQTs7Ozs7Ozs7OztlQVFDRixZQUFDQSxLQUFhQSxFQUFFQSxRQUE2QkEsRUFBQUE7QUFDN0NHLG1CQUFPQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUNqREE7Ozs7Ozs7Ozs7O2VBVVNILG9CQUFDQSxLQUFhQSxFQUFFQSxRQUE2QkEsRUFBQUE7QUFDckRJLG1CQUFPQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUNoREE7Ozs7Ozs7OztlQU9hSix3QkFBQ0EsUUFBYUEsRUFBQUE7QUFDMUJLLGdCQUFNQSxTQUFTQSxHQUFlQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtBQUMxREEsZ0JBQUlBLFNBQVNBLElBQUlBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBO0FBQ2pDQSxxQkFBS0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUE7QUFDekNBLHdCQUFJQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxLQUFLQSxRQUFRQSxDQUFDQSxFQUFFQSxFQUFFQTtBQUNuREEsaUNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0FBQ3BCQSwrQkFBT0E7cUJBQ1JBO2lCQUNGQTthQUNGQTtTQUNGQTs7Ozs7Ozs7OztlQVFHTCxjQUFDQSxLQUFhQSxFQUFFQSxJQUFTQSxFQUFBQTtBQUMzQk0sZ0JBQU1BLFNBQVNBLEdBQWVBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0FBQ2pEQSxnQkFBSUEsU0FBU0EsSUFBSUEsU0FBU0EsQ0FBQ0EsTUFBTUEsRUFBRUE7QUFDakNBLHFCQUFLQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQTtBQUN6Q0Esd0JBQUlBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBO0FBQ2hCQSw0QkFBTUEsUUFBUUEsR0FBYUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7QUFDeENBLDRCQUFJQSxRQUFRQSxDQUFDQSxJQUFJQSxFQUFFQTtBQUNqQkEscUNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO3lCQUNyQkE7QUFDREEsZ0NBQVFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUN6QkE7aUJBQ0ZBO2FBQ0ZBO1NBQ0ZBOzs7V0FuRkgsWUFBQTs7O3FCQUFBLFlBQUEiLCJmaWxlIjoidHMvY2xhc3Nlcy9FdmVudEVtaXR0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxubGV0IGludGVybmFsSWQgPSAwO1xuXG5jbGFzcyBMaXN0ZW5lciB7XG4gIGlkOiBudW1iZXI7XG4gIHRvcGljOiBzdHJpbmc7XG4gIG9uY2U6IGJvb2xlYW47XG4gIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkO1xuICBjb25zdHJ1Y3Rvcih0b3BpYzogc3RyaW5nLCBvbmNlOiBib29sZWFuLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCkge1xuICAgIHRoaXMudG9waWMgPSB0b3BpYztcbiAgICB0aGlzLm9uY2UgPSBvbmNlO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmlkID0gKytpbnRlcm5hbElkO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50RW1pdHRlciB7XG4gIGV2ZW50czogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50cyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZExpc3RlbmVyKCkgaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGEgdG9waWMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3BpYyB7c3RyaW5nfSAgICAgICAgIFRvcGljIG5hbWVcbiAgICogQHBhcmFtIG9uY2Uge2Jvb2xlYW59ICAgICAgICAgRmlyZSBldmVudCBvbmx5IG9uY2UgKGF1dG8tdW5yZWdpc3RlcikgW29wdGlvbmFsXVxuICAgKiBAcGFyYW0gY2FsbGJhY2sge2Z1bmN0aW9ufSAgICBIYW5kbGVyIHRvIGNhbGwgd2hlbiB0b3BpYyBpcyBmaXJlZFxuICAgKi9cbiAgYWRkTGlzdGVuZXIodG9waWM6IHN0cmluZywgb25jZTogYm9vbGVhbiA9IGZhbHNlLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IGFueSB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcltdID0gdGhpcy5ldmVudHNbdG9waWNdID0gdGhpcy5ldmVudHNbdG9waWNdIHx8IFtdO1xuICAgIGNvbnN0IGxpc3RlbmVyOiBMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcih0b3BpYywgb25jZSwgY2FsbGJhY2spO1xuICAgIGxldCBpOiBudW1iZXIgPSBsaXN0ZW5lcnMuaW5kZXhPZihudWxsKTtcbiAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdGVuZXJzW2ldID0gbGlzdGVuZXI7XG4gICAgfVxuICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBvbigpIGlzIGNhbGxlZCB0byByZWdpc3RlciBhIGxpc3RlbmVyIGZvciBhIHRvcGljLlxuICAgKlxuICAgKiBAcGFyYW0gdG9waWMge3N0cmluZ30gICAgICAgICBUb3BpYyBuYW1lXG4gICAqIEBwYXJhbSBjYWxsYmFjayB7ZnVuY3Rpb259ICAgIEhhbmRsZXIgdG8gY2FsbCB3aGVuIHRvcGljIGlzIGZpcmVkXG4gICAqL1xuICBvbih0b3BpYzogc3RyaW5nLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIodG9waWMsIGZhbHNlLCBjYWxsYmFjayk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBsaXN0ZW5PbmNlKCkgaXMgY2FsbGVkIHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGEgdG9waWMgdGhhdCB3aWxsXG4gICAqIGZpcmUgb25seSBvbmNlIGJlZm9yZSBiZWluZyBhdXRvLXJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0b3BpYyB7c3RyaW5nfSAgICAgICAgIFRvcGljIG5hbWVcbiAgICogQHBhcmFtIGNhbGxiYWNrIHtmdW5jdGlvbn0gICAgSGFuZGxlciB0byBjYWxsIHdoZW4gdG9waWMgaXMgZmlyZWRcbiAgICovXG4gIGxpc3Rlbk9uY2UodG9waWM6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmFkZExpc3RlbmVyKHRvcGljLCB0cnVlLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlTGlzdGVuZXIoKSBpcyBjYWxsZWQgdG8gZGVyZWdpc3RlciBhbiBleGlzdGluZyBsaXN0ZW5lclxuICAgKlxuICAgKiBAcGFyYW0gbGlzdGVuZXIge2FueX0gICBIYW5kbGUgcmV0dXJuZWQgYnkgcHJldmlvdXMgY2FsbCB0byBhZGRMaXN0ZW5lcigpXG4gICAqL1xuICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcltdID0gdGhpcy5ldmVudHNbbGlzdGVuZXIudG9waWNdO1xuICAgIGlmIChsaXN0ZW5lcnMgJiYgbGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSAmJiBsaXN0ZW5lcnNbaV0uaWQgPT09IGxpc3RlbmVyLmlkKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW2ldID0gbnVsbDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZW1pdCgpIGlzIGNhbGxlZCB0byBwYXNzIHRoZSBzdXBwbGllZCBkYXRhIHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIGZvciB0aGUgdG9waWNcbiAgICpcbiAgICogQHBhcmFtIHRvcGljIHtzdHJpbmd9ICAgICAgICAgVG9waWMgbmFtZVxuICAgKiBAcGFyYW0gZGF0YSB7YW55fSAgVGhlIGRhdGEgYmVpbmcgcGFzc2VkIChkZXBlbmRzIG9uIHRvcGljKVxuICAgKi9cbiAgZW1pdCh0b3BpYzogc3RyaW5nLCBkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyW10gPSB0aGlzLmV2ZW50c1t0b3BpY107XG4gICAgaWYgKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgY29uc3QgbGlzdGVuZXI6IExpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgIGlmIChsaXN0ZW5lci5vbmNlKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjayhkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIuLi8ifQ==