eventemitter3.umd.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  3. typeof define === 'function' && define.amd ? define(factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventEmitter3 = factory());
  5. })(this, (function () { 'use strict';
  6. function getDefaultExportFromCjs (x) {
  7. return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
  8. }
  9. var eventemitter3 = {exports: {}};
  10. var hasRequiredEventemitter3;
  11. function requireEventemitter3 () {
  12. if (hasRequiredEventemitter3) return eventemitter3.exports;
  13. hasRequiredEventemitter3 = 1;
  14. (function (module) {
  15. var has = Object.prototype.hasOwnProperty
  16. , prefix = '~';
  17. /**
  18. * Constructor to create a storage for our `EE` objects.
  19. * An `Events` instance is a plain object whose properties are event names.
  20. *
  21. * @constructor
  22. * @private
  23. */
  24. function Events() {}
  25. //
  26. // We try to not inherit from `Object.prototype`. In some engines creating an
  27. // instance in this way is faster than calling `Object.create(null)` directly.
  28. // If `Object.create(null)` is not supported we prefix the event names with a
  29. // character to make sure that the built-in object properties are not
  30. // overridden or used as an attack vector.
  31. //
  32. if (Object.create) {
  33. Events.prototype = Object.create(null);
  34. //
  35. // This hack is needed because the `__proto__` property is still inherited in
  36. // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
  37. //
  38. if (!new Events().__proto__) prefix = false;
  39. }
  40. /**
  41. * Representation of a single event listener.
  42. *
  43. * @param {Function} fn The listener function.
  44. * @param {*} context The context to invoke the listener with.
  45. * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
  46. * @constructor
  47. * @private
  48. */
  49. function EE(fn, context, once) {
  50. this.fn = fn;
  51. this.context = context;
  52. this.once = once || false;
  53. }
  54. /**
  55. * Add a listener for a given event.
  56. *
  57. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  58. * @param {(String|Symbol)} event The event name.
  59. * @param {Function} fn The listener function.
  60. * @param {*} context The context to invoke the listener with.
  61. * @param {Boolean} once Specify if the listener is a one-time listener.
  62. * @returns {EventEmitter}
  63. * @private
  64. */
  65. function addListener(emitter, event, fn, context, once) {
  66. if (typeof fn !== 'function') {
  67. throw new TypeError('The listener must be a function');
  68. }
  69. var listener = new EE(fn, context || emitter, once)
  70. , evt = prefix ? prefix + event : event;
  71. if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
  72. else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
  73. else emitter._events[evt] = [emitter._events[evt], listener];
  74. return emitter;
  75. }
  76. /**
  77. * Clear event by name.
  78. *
  79. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  80. * @param {(String|Symbol)} evt The Event name.
  81. * @private
  82. */
  83. function clearEvent(emitter, evt) {
  84. if (--emitter._eventsCount === 0) emitter._events = new Events();
  85. else delete emitter._events[evt];
  86. }
  87. /**
  88. * Minimal `EventEmitter` interface that is molded against the Node.js
  89. * `EventEmitter` interface.
  90. *
  91. * @constructor
  92. * @public
  93. */
  94. function EventEmitter() {
  95. this._events = new Events();
  96. this._eventsCount = 0;
  97. }
  98. /**
  99. * Return an array listing the events for which the emitter has registered
  100. * listeners.
  101. *
  102. * @returns {Array}
  103. * @public
  104. */
  105. EventEmitter.prototype.eventNames = function eventNames() {
  106. var names = []
  107. , events
  108. , name;
  109. if (this._eventsCount === 0) return names;
  110. for (name in (events = this._events)) {
  111. if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
  112. }
  113. if (Object.getOwnPropertySymbols) {
  114. return names.concat(Object.getOwnPropertySymbols(events));
  115. }
  116. return names;
  117. };
  118. /**
  119. * Return the listeners registered for a given event.
  120. *
  121. * @param {(String|Symbol)} event The event name.
  122. * @returns {Array} The registered listeners.
  123. * @public
  124. */
  125. EventEmitter.prototype.listeners = function listeners(event) {
  126. var evt = prefix ? prefix + event : event
  127. , handlers = this._events[evt];
  128. if (!handlers) return [];
  129. if (handlers.fn) return [handlers.fn];
  130. for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
  131. ee[i] = handlers[i].fn;
  132. }
  133. return ee;
  134. };
  135. /**
  136. * Return the number of listeners listening to a given event.
  137. *
  138. * @param {(String|Symbol)} event The event name.
  139. * @returns {Number} The number of listeners.
  140. * @public
  141. */
  142. EventEmitter.prototype.listenerCount = function listenerCount(event) {
  143. var evt = prefix ? prefix + event : event
  144. , listeners = this._events[evt];
  145. if (!listeners) return 0;
  146. if (listeners.fn) return 1;
  147. return listeners.length;
  148. };
  149. /**
  150. * Calls each of the listeners registered for a given event.
  151. *
  152. * @param {(String|Symbol)} event The event name.
  153. * @returns {Boolean} `true` if the event had listeners, else `false`.
  154. * @public
  155. */
  156. EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
  157. var evt = prefix ? prefix + event : event;
  158. if (!this._events[evt]) return false;
  159. var listeners = this._events[evt]
  160. , len = arguments.length
  161. , args
  162. , i;
  163. if (listeners.fn) {
  164. if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
  165. switch (len) {
  166. case 1: return listeners.fn.call(listeners.context), true;
  167. case 2: return listeners.fn.call(listeners.context, a1), true;
  168. case 3: return listeners.fn.call(listeners.context, a1, a2), true;
  169. case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
  170. case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
  171. case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
  172. }
  173. for (i = 1, args = new Array(len -1); i < len; i++) {
  174. args[i - 1] = arguments[i];
  175. }
  176. listeners.fn.apply(listeners.context, args);
  177. } else {
  178. var length = listeners.length
  179. , j;
  180. for (i = 0; i < length; i++) {
  181. if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
  182. switch (len) {
  183. case 1: listeners[i].fn.call(listeners[i].context); break;
  184. case 2: listeners[i].fn.call(listeners[i].context, a1); break;
  185. case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
  186. case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
  187. default:
  188. if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
  189. args[j - 1] = arguments[j];
  190. }
  191. listeners[i].fn.apply(listeners[i].context, args);
  192. }
  193. }
  194. }
  195. return true;
  196. };
  197. /**
  198. * Add a listener for a given event.
  199. *
  200. * @param {(String|Symbol)} event The event name.
  201. * @param {Function} fn The listener function.
  202. * @param {*} [context=this] The context to invoke the listener with.
  203. * @returns {EventEmitter} `this`.
  204. * @public
  205. */
  206. EventEmitter.prototype.on = function on(event, fn, context) {
  207. return addListener(this, event, fn, context, false);
  208. };
  209. /**
  210. * Add a one-time listener for a given event.
  211. *
  212. * @param {(String|Symbol)} event The event name.
  213. * @param {Function} fn The listener function.
  214. * @param {*} [context=this] The context to invoke the listener with.
  215. * @returns {EventEmitter} `this`.
  216. * @public
  217. */
  218. EventEmitter.prototype.once = function once(event, fn, context) {
  219. return addListener(this, event, fn, context, true);
  220. };
  221. /**
  222. * Remove the listeners of a given event.
  223. *
  224. * @param {(String|Symbol)} event The event name.
  225. * @param {Function} fn Only remove the listeners that match this function.
  226. * @param {*} context Only remove the listeners that have this context.
  227. * @param {Boolean} once Only remove one-time listeners.
  228. * @returns {EventEmitter} `this`.
  229. * @public
  230. */
  231. EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
  232. var evt = prefix ? prefix + event : event;
  233. if (!this._events[evt]) return this;
  234. if (!fn) {
  235. clearEvent(this, evt);
  236. return this;
  237. }
  238. var listeners = this._events[evt];
  239. if (listeners.fn) {
  240. if (
  241. listeners.fn === fn &&
  242. (!once || listeners.once) &&
  243. (!context || listeners.context === context)
  244. ) {
  245. clearEvent(this, evt);
  246. }
  247. } else {
  248. for (var i = 0, events = [], length = listeners.length; i < length; i++) {
  249. if (
  250. listeners[i].fn !== fn ||
  251. (once && !listeners[i].once) ||
  252. (context && listeners[i].context !== context)
  253. ) {
  254. events.push(listeners[i]);
  255. }
  256. }
  257. //
  258. // Reset the array, or remove it completely if we have no more listeners.
  259. //
  260. if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
  261. else clearEvent(this, evt);
  262. }
  263. return this;
  264. };
  265. /**
  266. * Remove all listeners, or those of the specified event.
  267. *
  268. * @param {(String|Symbol)} [event] The event name.
  269. * @returns {EventEmitter} `this`.
  270. * @public
  271. */
  272. EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
  273. var evt;
  274. if (event) {
  275. evt = prefix ? prefix + event : event;
  276. if (this._events[evt]) clearEvent(this, evt);
  277. } else {
  278. this._events = new Events();
  279. this._eventsCount = 0;
  280. }
  281. return this;
  282. };
  283. //
  284. // Alias methods names because people roll like that.
  285. //
  286. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  287. EventEmitter.prototype.addListener = EventEmitter.prototype.on;
  288. //
  289. // Expose the prefix.
  290. //
  291. EventEmitter.prefixed = prefix;
  292. //
  293. // Allow `EventEmitter` to be imported as module namespace.
  294. //
  295. EventEmitter.EventEmitter = EventEmitter;
  296. //
  297. // Expose the module.
  298. //
  299. {
  300. module.exports = EventEmitter;
  301. }
  302. } (eventemitter3));
  303. return eventemitter3.exports;
  304. }
  305. var eventemitter3Exports = requireEventemitter3();
  306. var index = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
  307. return index;
  308. }));