react / react-0.13.3 / examples / basic-commonjs / node_modules / browserify / node_modules / events / events.js
80709 views// Copyright Joyent, Inc. and other Node contributors.1//2// Permission is hereby granted, free of charge, to any person obtaining a3// copy of this software and associated documentation files (the4// "Software"), to deal in the Software without restriction, including5// without limitation the rights to use, copy, modify, merge, publish,6// distribute, sublicense, and/or sell copies of the Software, and to permit7// persons to whom the Software is furnished to do so, subject to the8// following conditions:9//10// The above copyright notice and this permission notice shall be included11// in all copies or substantial portions of the Software.12//13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS14// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF15// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN16// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,17// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR18// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE19// USE OR OTHER DEALINGS IN THE SOFTWARE.2021function EventEmitter() {22this._events = this._events || {};23this._maxListeners = this._maxListeners || undefined;24}25module.exports = EventEmitter;2627// Backwards-compat with node 0.10.x28EventEmitter.EventEmitter = EventEmitter;2930EventEmitter.prototype._events = undefined;31EventEmitter.prototype._maxListeners = undefined;3233// By default EventEmitters will print a warning if more than 10 listeners are34// added to it. This is a useful default which helps finding memory leaks.35EventEmitter.defaultMaxListeners = 10;3637// Obviously not all Emitters should be limited to 10. This function allows38// that to be increased. Set to zero for unlimited.39EventEmitter.prototype.setMaxListeners = function(n) {40if (!isNumber(n) || n < 0 || isNaN(n))41throw TypeError('n must be a positive number');42this._maxListeners = n;43return this;44};4546EventEmitter.prototype.emit = function(type) {47var er, handler, len, args, i, listeners;4849if (!this._events)50this._events = {};5152// If there is no 'error' event listener then throw.53if (type === 'error') {54if (!this._events.error ||55(isObject(this._events.error) && !this._events.error.length)) {56er = arguments[1];57if (er instanceof Error) {58throw er; // Unhandled 'error' event59}60throw TypeError('Uncaught, unspecified "error" event.');61}62}6364handler = this._events[type];6566if (isUndefined(handler))67return false;6869if (isFunction(handler)) {70switch (arguments.length) {71// fast cases72case 1:73handler.call(this);74break;75case 2:76handler.call(this, arguments[1]);77break;78case 3:79handler.call(this, arguments[1], arguments[2]);80break;81// slower82default:83len = arguments.length;84args = new Array(len - 1);85for (i = 1; i < len; i++)86args[i - 1] = arguments[i];87handler.apply(this, args);88}89} else if (isObject(handler)) {90len = arguments.length;91args = new Array(len - 1);92for (i = 1; i < len; i++)93args[i - 1] = arguments[i];9495listeners = handler.slice();96len = listeners.length;97for (i = 0; i < len; i++)98listeners[i].apply(this, args);99}100101return true;102};103104EventEmitter.prototype.addListener = function(type, listener) {105var m;106107if (!isFunction(listener))108throw TypeError('listener must be a function');109110if (!this._events)111this._events = {};112113// To avoid recursion in the case that type === "newListener"! Before114// adding it to the listeners, first emit "newListener".115if (this._events.newListener)116this.emit('newListener', type,117isFunction(listener.listener) ?118listener.listener : listener);119120if (!this._events[type])121// Optimize the case of one listener. Don't need the extra array object.122this._events[type] = listener;123else if (isObject(this._events[type]))124// If we've already got an array, just append.125this._events[type].push(listener);126else127// Adding the second element, need to change to array.128this._events[type] = [this._events[type], listener];129130// Check for listener leak131if (isObject(this._events[type]) && !this._events[type].warned) {132var m;133if (!isUndefined(this._maxListeners)) {134m = this._maxListeners;135} else {136m = EventEmitter.defaultMaxListeners;137}138139if (m && m > 0 && this._events[type].length > m) {140this._events[type].warned = true;141console.error('(node) warning: possible EventEmitter memory ' +142'leak detected. %d listeners added. ' +143'Use emitter.setMaxListeners() to increase limit.',144this._events[type].length);145if (typeof console.trace === 'function') {146// not supported in IE 10147console.trace();148}149}150}151152return this;153};154155EventEmitter.prototype.on = EventEmitter.prototype.addListener;156157EventEmitter.prototype.once = function(type, listener) {158if (!isFunction(listener))159throw TypeError('listener must be a function');160161var fired = false;162163function g() {164this.removeListener(type, g);165166if (!fired) {167fired = true;168listener.apply(this, arguments);169}170}171172g.listener = listener;173this.on(type, g);174175return this;176};177178// emits a 'removeListener' event iff the listener was removed179EventEmitter.prototype.removeListener = function(type, listener) {180var list, position, length, i;181182if (!isFunction(listener))183throw TypeError('listener must be a function');184185if (!this._events || !this._events[type])186return this;187188list = this._events[type];189length = list.length;190position = -1;191192if (list === listener ||193(isFunction(list.listener) && list.listener === listener)) {194delete this._events[type];195if (this._events.removeListener)196this.emit('removeListener', type, listener);197198} else if (isObject(list)) {199for (i = length; i-- > 0;) {200if (list[i] === listener ||201(list[i].listener && list[i].listener === listener)) {202position = i;203break;204}205}206207if (position < 0)208return this;209210if (list.length === 1) {211list.length = 0;212delete this._events[type];213} else {214list.splice(position, 1);215}216217if (this._events.removeListener)218this.emit('removeListener', type, listener);219}220221return this;222};223224EventEmitter.prototype.removeAllListeners = function(type) {225var key, listeners;226227if (!this._events)228return this;229230// not listening for removeListener, no need to emit231if (!this._events.removeListener) {232if (arguments.length === 0)233this._events = {};234else if (this._events[type])235delete this._events[type];236return this;237}238239// emit removeListener for all listeners on all events240if (arguments.length === 0) {241for (key in this._events) {242if (key === 'removeListener') continue;243this.removeAllListeners(key);244}245this.removeAllListeners('removeListener');246this._events = {};247return this;248}249250listeners = this._events[type];251252if (isFunction(listeners)) {253this.removeListener(type, listeners);254} else {255// LIFO order256while (listeners.length)257this.removeListener(type, listeners[listeners.length - 1]);258}259delete this._events[type];260261return this;262};263264EventEmitter.prototype.listeners = function(type) {265var ret;266if (!this._events || !this._events[type])267ret = [];268else if (isFunction(this._events[type]))269ret = [this._events[type]];270else271ret = this._events[type].slice();272return ret;273};274275EventEmitter.listenerCount = function(emitter, type) {276var ret;277if (!emitter._events || !emitter._events[type])278ret = 0;279else if (isFunction(emitter._events[type]))280ret = 1;281else282ret = emitter._events[type].length;283return ret;284};285286function isFunction(arg) {287return typeof arg === 'function';288}289290function isNumber(arg) {291return typeof arg === 'number';292}293294function isObject(arg) {295return typeof arg === 'object' && arg !== null;296}297298function isUndefined(arg) {299return arg === void 0;300}301302303