eventEmitter.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. "use strict";
  2. var __defProp = Object.defineProperty;
  3. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  4. var __getOwnPropNames = Object.getOwnPropertyNames;
  5. var __hasOwnProp = Object.prototype.hasOwnProperty;
  6. var __export = (target, all) => {
  7. for (var name in all)
  8. __defProp(target, name, { get: all[name], enumerable: true });
  9. };
  10. var __copyProps = (to, from, except, desc) => {
  11. if (from && typeof from === "object" || typeof from === "function") {
  12. for (let key of __getOwnPropNames(from))
  13. if (!__hasOwnProp.call(to, key) && key !== except)
  14. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  15. }
  16. return to;
  17. };
  18. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  19. var eventEmitter_exports = {};
  20. __export(eventEmitter_exports, {
  21. EventEmitter: () => EventEmitter
  22. });
  23. module.exports = __toCommonJS(eventEmitter_exports);
  24. class EventEmitter {
  25. constructor(platform) {
  26. this._events = void 0;
  27. this._eventsCount = 0;
  28. this._maxListeners = void 0;
  29. this._pendingHandlers = /* @__PURE__ */ new Map();
  30. this._platform = platform;
  31. if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
  32. this._events = /* @__PURE__ */ Object.create(null);
  33. this._eventsCount = 0;
  34. }
  35. this._maxListeners = this._maxListeners || void 0;
  36. this.on = this.addListener;
  37. this.off = this.removeListener;
  38. }
  39. setMaxListeners(n) {
  40. if (typeof n !== "number" || n < 0 || Number.isNaN(n))
  41. throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
  42. this._maxListeners = n;
  43. return this;
  44. }
  45. getMaxListeners() {
  46. return this._maxListeners === void 0 ? this._platform.defaultMaxListeners() : this._maxListeners;
  47. }
  48. emit(type, ...args) {
  49. const events = this._events;
  50. if (events === void 0)
  51. return false;
  52. const handler = events?.[type];
  53. if (handler === void 0)
  54. return false;
  55. if (typeof handler === "function") {
  56. this._callHandler(type, handler, args);
  57. } else {
  58. const len = handler.length;
  59. const listeners = handler.slice();
  60. for (let i = 0; i < len; ++i)
  61. this._callHandler(type, listeners[i], args);
  62. }
  63. return true;
  64. }
  65. _callHandler(type, handler, args) {
  66. const promise = Reflect.apply(handler, this, args);
  67. if (!(promise instanceof Promise))
  68. return;
  69. let set = this._pendingHandlers.get(type);
  70. if (!set) {
  71. set = /* @__PURE__ */ new Set();
  72. this._pendingHandlers.set(type, set);
  73. }
  74. set.add(promise);
  75. promise.catch((e) => {
  76. if (this._rejectionHandler)
  77. this._rejectionHandler(e);
  78. else
  79. throw e;
  80. }).finally(() => set.delete(promise));
  81. }
  82. addListener(type, listener) {
  83. return this._addListener(type, listener, false);
  84. }
  85. on(type, listener) {
  86. return this._addListener(type, listener, false);
  87. }
  88. _addListener(type, listener, prepend) {
  89. checkListener(listener);
  90. let events = this._events;
  91. let existing;
  92. if (events === void 0) {
  93. events = this._events = /* @__PURE__ */ Object.create(null);
  94. this._eventsCount = 0;
  95. } else {
  96. if (events.newListener !== void 0) {
  97. this.emit("newListener", type, unwrapListener(listener));
  98. events = this._events;
  99. }
  100. existing = events[type];
  101. }
  102. if (existing === void 0) {
  103. existing = events[type] = listener;
  104. ++this._eventsCount;
  105. } else {
  106. if (typeof existing === "function") {
  107. existing = events[type] = prepend ? [listener, existing] : [existing, listener];
  108. } else if (prepend) {
  109. existing.unshift(listener);
  110. } else {
  111. existing.push(listener);
  112. }
  113. const m = this.getMaxListeners();
  114. if (m > 0 && existing.length > m && !existing.warned) {
  115. existing.warned = true;
  116. const w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
  117. w.name = "MaxListenersExceededWarning";
  118. w.emitter = this;
  119. w.type = type;
  120. w.count = existing.length;
  121. if (!this._platform.isUnderTest()) {
  122. console.warn(w);
  123. }
  124. }
  125. }
  126. return this;
  127. }
  128. prependListener(type, listener) {
  129. return this._addListener(type, listener, true);
  130. }
  131. once(type, listener) {
  132. checkListener(listener);
  133. this.on(type, new OnceWrapper(this, type, listener).wrapperFunction);
  134. return this;
  135. }
  136. prependOnceListener(type, listener) {
  137. checkListener(listener);
  138. this.prependListener(type, new OnceWrapper(this, type, listener).wrapperFunction);
  139. return this;
  140. }
  141. removeListener(type, listener) {
  142. checkListener(listener);
  143. const events = this._events;
  144. if (events === void 0)
  145. return this;
  146. const list = events[type];
  147. if (list === void 0)
  148. return this;
  149. if (list === listener || list.listener === listener) {
  150. if (--this._eventsCount === 0) {
  151. this._events = /* @__PURE__ */ Object.create(null);
  152. } else {
  153. delete events[type];
  154. if (events.removeListener)
  155. this.emit("removeListener", type, list.listener ?? listener);
  156. }
  157. } else if (typeof list !== "function") {
  158. let position = -1;
  159. let originalListener;
  160. for (let i = list.length - 1; i >= 0; i--) {
  161. if (list[i] === listener || wrappedListener(list[i]) === listener) {
  162. originalListener = wrappedListener(list[i]);
  163. position = i;
  164. break;
  165. }
  166. }
  167. if (position < 0)
  168. return this;
  169. if (position === 0)
  170. list.shift();
  171. else
  172. list.splice(position, 1);
  173. if (list.length === 1)
  174. events[type] = list[0];
  175. if (events.removeListener !== void 0)
  176. this.emit("removeListener", type, originalListener || listener);
  177. }
  178. return this;
  179. }
  180. off(type, listener) {
  181. return this.removeListener(type, listener);
  182. }
  183. removeAllListeners(type, options) {
  184. this._removeAllListeners(type);
  185. if (!options)
  186. return this;
  187. if (options.behavior === "wait") {
  188. const errors = [];
  189. this._rejectionHandler = (error) => errors.push(error);
  190. return this._waitFor(type).then(() => {
  191. if (errors.length)
  192. throw errors[0];
  193. });
  194. }
  195. if (options.behavior === "ignoreErrors")
  196. this._rejectionHandler = () => {
  197. };
  198. return Promise.resolve();
  199. }
  200. _removeAllListeners(type) {
  201. const events = this._events;
  202. if (!events)
  203. return;
  204. if (!events.removeListener) {
  205. if (type === void 0) {
  206. this._events = /* @__PURE__ */ Object.create(null);
  207. this._eventsCount = 0;
  208. } else if (events[type] !== void 0) {
  209. if (--this._eventsCount === 0)
  210. this._events = /* @__PURE__ */ Object.create(null);
  211. else
  212. delete events[type];
  213. }
  214. return;
  215. }
  216. if (type === void 0) {
  217. const keys = Object.keys(events);
  218. let key;
  219. for (let i = 0; i < keys.length; ++i) {
  220. key = keys[i];
  221. if (key === "removeListener")
  222. continue;
  223. this._removeAllListeners(key);
  224. }
  225. this._removeAllListeners("removeListener");
  226. this._events = /* @__PURE__ */ Object.create(null);
  227. this._eventsCount = 0;
  228. return;
  229. }
  230. const listeners = events[type];
  231. if (typeof listeners === "function") {
  232. this.removeListener(type, listeners);
  233. } else if (listeners !== void 0) {
  234. for (let i = listeners.length - 1; i >= 0; i--)
  235. this.removeListener(type, listeners[i]);
  236. }
  237. }
  238. listeners(type) {
  239. return this._listeners(this, type, true);
  240. }
  241. rawListeners(type) {
  242. return this._listeners(this, type, false);
  243. }
  244. listenerCount(type) {
  245. const events = this._events;
  246. if (events !== void 0) {
  247. const listener = events[type];
  248. if (typeof listener === "function")
  249. return 1;
  250. if (listener !== void 0)
  251. return listener.length;
  252. }
  253. return 0;
  254. }
  255. eventNames() {
  256. return this._eventsCount > 0 && this._events ? Reflect.ownKeys(this._events) : [];
  257. }
  258. async _waitFor(type) {
  259. let promises = [];
  260. if (type) {
  261. promises = [...this._pendingHandlers.get(type) || []];
  262. } else {
  263. promises = [];
  264. for (const [, pending] of this._pendingHandlers)
  265. promises.push(...pending);
  266. }
  267. await Promise.all(promises);
  268. }
  269. _listeners(target, type, unwrap) {
  270. const events = target._events;
  271. if (events === void 0)
  272. return [];
  273. const listener = events[type];
  274. if (listener === void 0)
  275. return [];
  276. if (typeof listener === "function")
  277. return unwrap ? [unwrapListener(listener)] : [listener];
  278. return unwrap ? unwrapListeners(listener) : listener.slice();
  279. }
  280. }
  281. function checkListener(listener) {
  282. if (typeof listener !== "function")
  283. throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  284. }
  285. class OnceWrapper {
  286. constructor(eventEmitter, eventType, listener) {
  287. this._fired = false;
  288. this._eventEmitter = eventEmitter;
  289. this._eventType = eventType;
  290. this._listener = listener;
  291. this.wrapperFunction = this._handle.bind(this);
  292. this.wrapperFunction.listener = listener;
  293. }
  294. _handle(...args) {
  295. if (this._fired)
  296. return;
  297. this._fired = true;
  298. this._eventEmitter.removeListener(this._eventType, this.wrapperFunction);
  299. return this._listener.apply(this._eventEmitter, args);
  300. }
  301. }
  302. function unwrapListener(l) {
  303. return wrappedListener(l) ?? l;
  304. }
  305. function unwrapListeners(arr) {
  306. return arr.map((l) => wrappedListener(l) ?? l);
  307. }
  308. function wrappedListener(l) {
  309. return l.listener;
  310. }
  311. // Annotate the CommonJS export names for ESM import in node:
  312. 0 && (module.exports = {
  313. EventEmitter
  314. });