UNPKG

awv3

Version:
367 lines (295 loc) 10.6 kB
var Events = /*#__PURE__*/ function () { function Events() { this._callbacks = undefined; this._inspectors = undefined; } var _proto = Events.prototype; _proto.subscribe = function subscribe(arg1, arg2, options) { return this.on(arg1, arg2, options).removeListener.bind(this, arg1, arg2); }; _proto.once = function once(type, callback) { this.on(type, callback, { remove: true }); }; _proto.onFirst = function onFirst(type, callback) { this.on(type, callback, { priority: 1 }); }; _proto.onLast = function onLast(type, callback) { this.on(type, callback, { priority: -1 }); }; _proto.on = function on(arg1, arg2, options) { if (arg1 === void 0) { arg1 = {}; } if (arg2 === void 0) { arg2 = undefined; } if (options === void 0) { options = {}; } if (Array.isArray(arg1)) { // (Array of types) & callback for (var _iterator = arg1, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var _type = _ref; this.on(_type, arg2, options); } } else if (typeof arg1 === 'object') { // Object with 'Type: Callback' pairs if (typeof arg2 === 'object') options = arg2; var _arr = Object.entries(arg1); for (var _i2 = 0; _i2 < _arr.length; _i2++) { var _ref2 = _arr[_i2]; var key = _ref2[0]; var callback = _ref2[1]; if (typeof callback === 'function') this.on(key, callback, options); } } else if (typeof arg1 === 'string' && typeof arg2 === 'function') { // Type & Callback var _type2 = arg1, _callback = arg2; var _options = options, _options$remove = _options.remove, remove = _options$remove === void 0 ? false : _options$remove, _options$priority = _options.priority, priority = _options$priority === void 0 ? 0 : _options$priority, _options$sync = _options.sync, sync = _options$sync === void 0 ? false : _options$sync; if (!this._callbacks) this._callbacks = {}; var listeners = this._callbacks[_type2]; if (!listeners) listeners = this._callbacks[_type2] = []; // note: do not add duplicate callbacks if (listeners.indexOf(_callback) < 0) { _callback.remove = remove; _callback.sync = sync; _callback.priority = priority; listeners.push(_callback); listeners.sort(function (a, b) { return b.priority - a.priority; }); if (this._inspectors) { for (var _iterator2 = this._inspectors, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref3; if (_isArray2) { if (_i3 >= _iterator2.length) break; _ref3 = _iterator2[_i3++]; } else { _i3 = _iterator2.next(); if (_i3.done) break; _ref3 = _i3.value; } var _inspector = _ref3; _inspector({ action: 'Add', type: _type2, callback: _callback }); } } } } return this; }; _proto.inspect = function inspect(callback) { if (!this._inspectors) this._inspectors = []; this._inspectors.push(callback); }; _proto.removeListener = function removeListener(types, callback) { if (!Array.isArray(types) && typeof types === 'object' && callback === undefined) { // Object of 'Type: Callback' var _arr2 = Object.entries(types); for (var _i4 = 0; _i4 < _arr2.length; _i4++) { var _ref4 = _arr2[_i4]; var type = _ref4[0]; var _callback2 = _ref4[1]; this.removeListener(type, _callback2); } return this; } if (!this._callbacks) this._callbacks = {}; types = Array.isArray(types) ? types : [types]; for (var _iterator3 = types, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref5; if (_isArray3) { if (_i5 >= _iterator3.length) break; _ref5 = _iterator3[_i5++]; } else { _i5 = _iterator3.next(); if (_i5.done) break; _ref5 = _i5.value; } var _type4 = _ref5; var listeners = this._callbacks[_type4]; if (!listeners) continue; if (!callback) { delete this._callbacks[_type4]; if (this._inspectors) { for (var _iterator4 = this._inspectors, _isArray4 = Array.isArray(_iterator4), _i6 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; if (_isArray4) { if (_i6 >= _iterator4.length) break; _ref6 = _iterator4[_i6++]; } else { _i6 = _iterator4.next(); if (_i6.done) break; _ref6 = _i6.value; } var _inspector2 = _ref6; _inspector2({ action: 'Remove', type: _type4, callback: undefined }); } } } else { var index = listeners.indexOf(callback); index > -1 && listeners.splice(index, 1); if (this._inspectors) { for (var _iterator5 = this._inspectors, _isArray5 = Array.isArray(_iterator5), _i7 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref7; if (_isArray5) { if (_i7 >= _iterator5.length) break; _ref7 = _iterator5[_i7++]; } else { _i7 = _iterator5.next(); if (_i7.done) break; _ref7 = _i7.value; } var _inspector4 = _ref7; _inspector4({ action: 'Remove', type: _type4, callback: callback }); } } } } return this; }; _proto.removeListeners = function removeListeners() { this._callbacks = undefined; }; _proto.removeInspectors = function removeInspectors() { this._inspectors = undefined; }; _proto.emit = function emit(type) { var _this = this; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (!this._callbacks) this._callbacks = {}; var listeners = this._callbacks[type]; //clone listeners array to ensure safe callbacks removal listeners = listeners ? listeners.concat() : []; //call all synchronous events first; for (var _iterator6 = listeners, _isArray6 = Array.isArray(_iterator6), _i8 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref8; if (_isArray6) { if (_i8 >= _iterator6.length) break; _ref8 = _iterator6[_i8++]; } else { _i8 = _iterator6.next(); if (_i8.done) break; _ref8 = _i8.value; } var _listener2 = _ref8; if (_listener2.sync) { if (_listener2.remove) this.removeListener(type, _listener2); _listener2.call.apply(_listener2, [this].concat(args)); } } //call all asynchronous events in promise chain var sequence = Promise.resolve(); var _loop = function _loop(_listener) { if (!_listener.sync) { sequence = sequence.then(function () { if (_listener.remove) _this.removeListener(type, _listener); return _listener.call.apply(_listener, [_this].concat(args)); }); } }; for (var _iterator7 = listeners, _isArray7 = Array.isArray(_iterator7), _i9 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref9; if (_isArray7) { if (_i9 >= _iterator7.length) break; _ref9 = _iterator7[_i9++]; } else { _i9 = _iterator7.next(); if (_i9.done) break; _ref9 = _i9.value; } var _listener = _ref9; _loop(_listener); } return sequence; }; //TODO: does it work properly? //what about case when listeners = [] _proto.bubble = function bubble(type) { if (!this._callbacks) this._callbacks = {}; var listeners = this._callbacks[type]; for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (listeners) { return this.emit.apply(this, [type].concat(args)); } else if (this.parent) { var _parent; // No listener found, just bubble up ... return (_parent = this.parent).bubble.apply(_parent, [type].concat(args)); } return Promise.resolve(); }; _proto.findListener = function findListener(type) { if (!this._callbacks) this._callbacks = {}; var listeners = this._callbacks[type]; if (listeners) { return this; } else if (this.parent) { // No listener found, just bubble up ... return this.parent.find(type); } return undefined; }; _proto.hasListener = function hasListener(type, callback) { if (callback === void 0) { callback = undefined; } if (!this._callbacks) this._callbacks = {}; var listener = this._callbacks[type]; return !!listener && (!callback || callback === listener); }; Events.mixin = function mixin(object, handlers) { if (handlers === void 0) { handlers = null; } object.hasListener = Events.prototype.hasListener; object.subscribe = Events.prototype.subscribe; object.on = Events.prototype.on; object.once = Events.prototype.once; object.onFirst = Events.prototype.onFirst; object.onLast = Events.prototype.onLast; object.inspect = Events.prototype.inspect; object.removeListener = Events.prototype.removeListener; object.removeListeners = Events.prototype.removeListeners; object.removeInspectors = Events.prototype.removeInspectors; object.emit = Events.prototype.emit; object.bubble = Events.prototype.bubble; object.findListener = Events.prototype.findListener; if (handlers) object.on.bind(object)(handlers); }; return Events; }(); export { Events as default };