ee-proxy
Version:
Event emitter proxy for easy local listeners cleanup
123 lines (102 loc) • 6.38 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.emitterProxy = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
;
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var REMOVE_METHOD = 'stopListening';
var ADD_LISTENER_METHODS = ['on', 'once', 'addListener', 'prependListener', 'prependOnceListener', 'addEventListener', 'onceAny', 'onAny'];
var REMOVE_LISTENER_METHODS = ['off', 'removeListener', 'removeAllListeners', 'removeEventListener'];
var REMOVE_ONE_LISTENER_METHODS = ['removeListener', 'removeEventListener', 'off'];
/**
* @param {EventEmitter} emitter
* @param {Object} [options={}]
* @param {boolean} [options.stopListeningAfterFirstEvent]
* @param {string} [options.removeMethod]
* @param {string[]} [options.addListenerMethods]
* @param {string[]} [options.removeListenerMethods]
* @param {string} [options.removeOneListenerMethod]
* @param {string[]} [options.fields=[]]
*
* @return {EventEmitter} - Proxied event emitter
*/
module.exports = function (emitter) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var removeMethod = options.removeMethod || REMOVE_METHOD;
var addListenerMethods = options.addListenerMethods || ADD_LISTENER_METHODS;
var removeListenerMethods = options.removeListenerMethods || REMOVE_LISTENER_METHODS;
var polyfillFields = options.fields || [];
var stopListeningAfterFirstEvent = options.hasOwnProperty('stopListeningAfterFirstEvent') ? options.stopListeningAfterFirstEvent : false;
var removeOneListenerMethod = options.removeOneListenerMethod || REMOVE_ONE_LISTENER_METHODS.find(function (method) {
return emitter[method] instanceof Function;
});
// needed for polyfill, because it should know about all properties at creation time
var fieldsForPolyfill = [].concat(_toConsumableArray(polyfillFields), [removeMethod]);
fieldsForPolyfill.forEach(function (field) {
if (!emitter.hasOwnProperty(field)) {
emitter[field] = {};
}
});
/**
* @type {{ eventName: string, userListener: Function, realListener: Function }[]}
*/
var eventListeners = [];
var stopListening = function stopListening() {
for (var _len = arguments.length, eventsNames = Array(_len), _key = 0; _key < _len; _key++) {
eventsNames[_key] = arguments[_key];
}
eventListeners = eventListeners.filter(function (listener) {
if (!eventsNames.length || eventsNames.includes(listener.eventName)) {
emitter[removeOneListenerMethod](listener.eventName, listener.realListener);
return false;
}
return true;
});
};
return new Proxy(emitter, {
get: function get(emitter, property, proxy) {
if (property === removeMethod) {
return function () {
stopListening.apply(undefined, arguments);
return proxy;
};
}
if (addListenerMethods.includes(property) && emitter[property] instanceof Function && emitter[property].length >= 2) {
return function (eventName, userListener) {
for (var _len2 = arguments.length, rest = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
rest[_key2 - 2] = arguments[_key2];
}
var realListener = !stopListeningAfterFirstEvent ? userListener.bind(proxy) : function () {
stopListening();
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
return userListener.call.apply(userListener, [proxy].concat(args));
};
eventListeners.push({ eventName: eventName, userListener: userListener, realListener: realListener });
emitter[property].apply(emitter, [eventName, realListener].concat(rest));
return proxy;
};
}
if (removeListenerMethods.includes(property) && emitter[property] instanceof Function) {
return function (eventName, userListener) {
for (var _len4 = arguments.length, rest = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
rest[_key4 - 2] = arguments[_key4];
}
var eventListener = eventListeners.find(function (listener) {
return listener.userListener === userListener;
});
var realListener = eventListener ? eventListener.realListener : userListener;
eventListeners = eventListeners.filter(function (listener) {
return listener.eventName !== eventName || userListener && listener.userListener !== userListener;
});
emitter[property].apply(emitter, [eventName, realListener].concat(rest));
return proxy;
};
}
if (emitter[property] instanceof Function) {
return emitter[property].bind(emitter);
}
return emitter[property];
}
});
};
},{}]},{},[1])(1)
});