@xyo-network/module-events 2.110.13 → 2.110.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -31,8 +32,11 @@ var import_forget = require("@xylabs/forget");
31
32
  var import_object = require("@xylabs/object");
32
33
  var NO_META_EVENT_ERROR_MESSAGE = "`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`";
33
34
  var resolvedPromise = Promise.resolve();
34
- var isMetaEvent = (eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved";
35
+ var isMetaEvent = /* @__PURE__ */ __name((eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved", "isMetaEvent");
35
36
  var Events = class _Events extends import_object.Base {
37
+ static {
38
+ __name(this, "Events");
39
+ }
36
40
  static anyMap = /* @__PURE__ */ new WeakMap();
37
41
  static eventsMap = /* @__PURE__ */ new WeakMap();
38
42
  static canEmitMetaEvents = false;
@@ -40,7 +44,9 @@ var Events = class _Events extends import_object.Base {
40
44
  //this is here to be able to query the type, not use
41
45
  eventData = {};
42
46
  constructor(params = {}) {
43
- const mutatedParams = { ...params };
47
+ const mutatedParams = {
48
+ ...params
49
+ };
44
50
  if (mutatedParams.debug) {
45
51
  mutatedParams.debug.logger = mutatedParams.debug.logger ?? ((type, debugName, eventName, eventData) => {
46
52
  let eventDataString;
@@ -64,7 +70,9 @@ var Events = class _Events extends import_object.Base {
64
70
  if (typeof globalThis.process?.env !== "object") {
65
71
  return _Events.isGlobalDebugEnabled;
66
72
  }
67
- const { env } = globalThis.process ?? { env: {} };
73
+ const { env } = globalThis.process ?? {
74
+ env: {}
75
+ };
68
76
  return env.DEBUG === "events" || env.DEBUG === "*" || _Events.isGlobalDebugEnabled;
69
77
  }
70
78
  static set isDebugEnabled(newValue) {
@@ -74,7 +82,9 @@ var Events = class _Events extends import_object.Base {
74
82
  return this.params.debug;
75
83
  }
76
84
  clearListeners(eventNames) {
77
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
85
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
86
+ eventNames
87
+ ];
78
88
  for (const eventName of eventNamesArray) {
79
89
  this.logIfDebugEnabled("clear", eventName);
80
90
  if (typeof eventName === "string" || typeof eventName === "symbol" || typeof eventName === "number") {
@@ -108,7 +118,7 @@ var Events = class _Events extends import_object.Base {
108
118
  if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
109
119
  throw new TypeError(NO_META_EVENT_ERROR_MESSAGE);
110
120
  }
111
- const filterMatch = (args, filter) => {
121
+ const filterMatch = /* @__PURE__ */ __name((args, filter) => {
112
122
  if (filter) {
113
123
  switch (typeof filter) {
114
124
  case "object": {
@@ -120,13 +130,19 @@ var Events = class _Events extends import_object.Base {
120
130
  }
121
131
  }
122
132
  return true;
123
- };
133
+ }, "filterMatch");
124
134
  this.logIfDebugEnabled("emitSerial", eventName, eventArgs);
125
135
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
126
- const filteredListeners = [...listeners.values()].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
136
+ const filteredListeners = [
137
+ ...listeners.values()
138
+ ].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
127
139
  const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
128
- const staticListeners = [...filteredListeners];
129
- const staticAnyListeners = [...anyListeners];
140
+ const staticListeners = [
141
+ ...filteredListeners
142
+ ];
143
+ const staticAnyListeners = [
144
+ ...anyListeners
145
+ ];
130
146
  await resolvedPromise;
131
147
  for (const listener of staticListeners) {
132
148
  await this.safeCallListener(eventName, eventArgs, listener);
@@ -137,7 +153,9 @@ var Events = class _Events extends import_object.Base {
137
153
  }
138
154
  //TODO: Make test for this
139
155
  listenerCount(eventNames) {
140
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
156
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
157
+ eventNames
158
+ ];
141
159
  let count = 0;
142
160
  for (const eventName of eventNamesArray) {
143
161
  if (typeof eventName === "string") {
@@ -157,7 +175,9 @@ var Events = class _Events extends import_object.Base {
157
175
  }
158
176
  }
159
177
  off(eventNames, listener) {
160
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
178
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
179
+ eventNames
180
+ ];
161
181
  for (const eventName of eventNamesArray) {
162
182
  const set = this.getListeners(eventName);
163
183
  if (set) {
@@ -169,7 +189,10 @@ var Events = class _Events extends import_object.Base {
169
189
  }
170
190
  this.logIfDebugEnabled("unsubscribe", eventName);
171
191
  if (!isMetaEvent(eventName)) {
172
- (0, import_forget.forget)(this.emitMetaEvent("listenerRemoved", { eventName, listener }));
192
+ (0, import_forget.forget)(this.emitMetaEvent("listenerRemoved", {
193
+ eventName,
194
+ listener
195
+ }));
173
196
  }
174
197
  }
175
198
  }
@@ -177,10 +200,14 @@ var Events = class _Events extends import_object.Base {
177
200
  this.logIfDebugEnabled("unsubscribeAny");
178
201
  const typedMap = _Events.anyMap.get(this);
179
202
  typedMap?.delete(listener);
180
- (0, import_forget.forget)(this.emitMetaEvent("listenerRemoved", { listener }));
203
+ (0, import_forget.forget)(this.emitMetaEvent("listenerRemoved", {
204
+ listener
205
+ }));
181
206
  }
182
207
  on(eventNames, listener, filter) {
183
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
208
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
209
+ eventNames
210
+ ];
184
211
  for (const eventName of eventNamesArray) {
185
212
  let set = this.getListeners(eventName);
186
213
  if (!set) {
@@ -188,10 +215,16 @@ var Events = class _Events extends import_object.Base {
188
215
  const events = _Events.eventsMap.get(this);
189
216
  events?.set(eventName, set);
190
217
  }
191
- set.add({ filter, listener });
218
+ set.add({
219
+ filter,
220
+ listener
221
+ });
192
222
  this.logIfDebugEnabled("subscribe", eventName);
193
223
  if (!isMetaEvent(eventName)) {
194
- (0, import_forget.forget)(this.emitMetaEvent("listenerAdded", { eventName, listener }));
224
+ (0, import_forget.forget)(this.emitMetaEvent("listenerAdded", {
225
+ eventName,
226
+ listener
227
+ }));
195
228
  }
196
229
  }
197
230
  return this.off.bind(this, eventNames, listener);
@@ -199,14 +232,16 @@ var Events = class _Events extends import_object.Base {
199
232
  onAny(listener) {
200
233
  this.logIfDebugEnabled("subscribeAny");
201
234
  _Events.anyMap.get(this)?.add(listener);
202
- (0, import_forget.forget)(this.emitMetaEvent("listenerAdded", { listener }));
235
+ (0, import_forget.forget)(this.emitMetaEvent("listenerAdded", {
236
+ listener
237
+ }));
203
238
  return this.offAny.bind(this, listener);
204
239
  }
205
240
  once(eventName, listener) {
206
- const subListener = async (args) => {
241
+ const subListener = /* @__PURE__ */ __name(async (args) => {
207
242
  this.off(eventName, subListener);
208
243
  await this.safeCallListener(eventName, args, listener);
209
- };
244
+ }, "subListener");
210
245
  this.on(eventName, subListener);
211
246
  return this.off.bind(this, eventName, subListener);
212
247
  }
@@ -216,10 +251,16 @@ var Events = class _Events extends import_object.Base {
216
251
  }
217
252
  this.logIfDebugEnabled("emit", eventName, eventArgs);
218
253
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
219
- const filteredListeners = [...listeners.values()].filter((value) => filter ? value.listener : true).map((info) => info.listener);
254
+ const filteredListeners = [
255
+ ...listeners.values()
256
+ ].filter((value) => filter ? value.listener : true).map((info) => info.listener);
220
257
  const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
221
- const staticListeners = [...filteredListeners];
222
- const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
258
+ const staticListeners = [
259
+ ...filteredListeners
260
+ ];
261
+ const staticAnyListeners = isMetaEvent(eventName) ? [] : [
262
+ ...anyListeners
263
+ ];
223
264
  await resolvedPromise;
224
265
  await Promise.all([
225
266
  ...staticListeners.map(async (listener) => {
@@ -238,10 +279,16 @@ var Events = class _Events extends import_object.Base {
238
279
  }
239
280
  this.logIfDebugEnabled("emit", eventName, eventArgs);
240
281
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
241
- const filteredListeners = [...listeners.values()].map((info) => info.listener);
282
+ const filteredListeners = [
283
+ ...listeners.values()
284
+ ].map((info) => info.listener);
242
285
  const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
243
- const staticListeners = [...filteredListeners];
244
- const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
286
+ const staticListeners = [
287
+ ...filteredListeners
288
+ ];
289
+ const staticAnyListeners = isMetaEvent(eventName) ? [] : [
290
+ ...anyListeners
291
+ ];
245
292
  await resolvedPromise;
246
293
  await Promise.all([
247
294
  ...staticListeners.map(async (listener) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.js'\nexport * from './model/index.js'\n","import { assertEx } from '@xylabs/assert'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xylabs/object'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model/index.js'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventFunctions<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static canEmitMetaEvents = false\n private static isGlobalDebugEnabled = false\n\n //this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger =\n mutatedParams.debug.logger ??\n ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process ?? { env: {} }\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n Events.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n Events.canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n } finally {\n Events.canEmitMetaEvents = false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n return true\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter((value) => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n //TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener>\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["eventName"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.js'\nexport * from './model/index.js'\n","import { assertEx } from '@xylabs/assert'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xylabs/object'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model/index.js'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventFunctions<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static canEmitMetaEvents = false\n private static isGlobalDebugEnabled = false\n\n //this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger =\n mutatedParams.debug.logger ??\n ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process ?? { env: {} }\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n Events.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n Events.canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n } finally {\n Events.canEmitMetaEvents = false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n return true\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter((value) => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n //TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener>\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["NO_META_EVENT_ERROR_MESSAGE","resolvedPromise","Promise","resolve","isMetaEvent","eventName","Events","Base","anyMap","WeakMap","eventsMap","canEmitMetaEvents","isGlobalDebugEnabled","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","set","Set","Map","isDebugEnabled","globalThis","process","env","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","emitMetaEventInternal","emitSerial","TypeError","filterMatch","args","filter","reduce","prev","key","value","filteredListeners","values","map","info","listener","anyListeners","staticListeners","staticAnyListeners","safeCallListener","safeCallAnyListener","listenerCount","count","size","enabled","name","off","events","forget","offAny","typedMap","on","add","bind","onAny","once","subListener","all","has","ex","handleError","error","String","message"]}
@@ -1,3 +1,6 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
1
4
  // src/Events/Events.ts
2
5
  import { assertEx } from "@xylabs/assert";
3
6
  import { handleError } from "@xylabs/error";
@@ -5,8 +8,11 @@ import { forget } from "@xylabs/forget";
5
8
  import { Base } from "@xylabs/object";
6
9
  var NO_META_EVENT_ERROR_MESSAGE = "`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`";
7
10
  var resolvedPromise = Promise.resolve();
8
- var isMetaEvent = (eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved";
11
+ var isMetaEvent = /* @__PURE__ */ __name((eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved", "isMetaEvent");
9
12
  var Events = class _Events extends Base {
13
+ static {
14
+ __name(this, "Events");
15
+ }
10
16
  static anyMap = /* @__PURE__ */ new WeakMap();
11
17
  static eventsMap = /* @__PURE__ */ new WeakMap();
12
18
  static canEmitMetaEvents = false;
@@ -14,7 +20,9 @@ var Events = class _Events extends Base {
14
20
  //this is here to be able to query the type, not use
15
21
  eventData = {};
16
22
  constructor(params = {}) {
17
- const mutatedParams = { ...params };
23
+ const mutatedParams = {
24
+ ...params
25
+ };
18
26
  if (mutatedParams.debug) {
19
27
  mutatedParams.debug.logger = mutatedParams.debug.logger ?? ((type, debugName, eventName, eventData) => {
20
28
  let eventDataString;
@@ -38,7 +46,9 @@ var Events = class _Events extends Base {
38
46
  if (typeof globalThis.process?.env !== "object") {
39
47
  return _Events.isGlobalDebugEnabled;
40
48
  }
41
- const { env } = globalThis.process ?? { env: {} };
49
+ const { env } = globalThis.process ?? {
50
+ env: {}
51
+ };
42
52
  return env.DEBUG === "events" || env.DEBUG === "*" || _Events.isGlobalDebugEnabled;
43
53
  }
44
54
  static set isDebugEnabled(newValue) {
@@ -48,7 +58,9 @@ var Events = class _Events extends Base {
48
58
  return this.params.debug;
49
59
  }
50
60
  clearListeners(eventNames) {
51
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
61
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
62
+ eventNames
63
+ ];
52
64
  for (const eventName of eventNamesArray) {
53
65
  this.logIfDebugEnabled("clear", eventName);
54
66
  if (typeof eventName === "string" || typeof eventName === "symbol" || typeof eventName === "number") {
@@ -82,7 +94,7 @@ var Events = class _Events extends Base {
82
94
  if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
83
95
  throw new TypeError(NO_META_EVENT_ERROR_MESSAGE);
84
96
  }
85
- const filterMatch = (args, filter) => {
97
+ const filterMatch = /* @__PURE__ */ __name((args, filter) => {
86
98
  if (filter) {
87
99
  switch (typeof filter) {
88
100
  case "object": {
@@ -94,13 +106,19 @@ var Events = class _Events extends Base {
94
106
  }
95
107
  }
96
108
  return true;
97
- };
109
+ }, "filterMatch");
98
110
  this.logIfDebugEnabled("emitSerial", eventName, eventArgs);
99
111
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
100
- const filteredListeners = [...listeners.values()].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
112
+ const filteredListeners = [
113
+ ...listeners.values()
114
+ ].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
101
115
  const anyListeners = assertEx(_Events.anyMap.get(this));
102
- const staticListeners = [...filteredListeners];
103
- const staticAnyListeners = [...anyListeners];
116
+ const staticListeners = [
117
+ ...filteredListeners
118
+ ];
119
+ const staticAnyListeners = [
120
+ ...anyListeners
121
+ ];
104
122
  await resolvedPromise;
105
123
  for (const listener of staticListeners) {
106
124
  await this.safeCallListener(eventName, eventArgs, listener);
@@ -111,7 +129,9 @@ var Events = class _Events extends Base {
111
129
  }
112
130
  //TODO: Make test for this
113
131
  listenerCount(eventNames) {
114
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
132
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
133
+ eventNames
134
+ ];
115
135
  let count = 0;
116
136
  for (const eventName of eventNamesArray) {
117
137
  if (typeof eventName === "string") {
@@ -131,7 +151,9 @@ var Events = class _Events extends Base {
131
151
  }
132
152
  }
133
153
  off(eventNames, listener) {
134
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
154
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
155
+ eventNames
156
+ ];
135
157
  for (const eventName of eventNamesArray) {
136
158
  const set = this.getListeners(eventName);
137
159
  if (set) {
@@ -143,7 +165,10 @@ var Events = class _Events extends Base {
143
165
  }
144
166
  this.logIfDebugEnabled("unsubscribe", eventName);
145
167
  if (!isMetaEvent(eventName)) {
146
- forget(this.emitMetaEvent("listenerRemoved", { eventName, listener }));
168
+ forget(this.emitMetaEvent("listenerRemoved", {
169
+ eventName,
170
+ listener
171
+ }));
147
172
  }
148
173
  }
149
174
  }
@@ -151,10 +176,14 @@ var Events = class _Events extends Base {
151
176
  this.logIfDebugEnabled("unsubscribeAny");
152
177
  const typedMap = _Events.anyMap.get(this);
153
178
  typedMap?.delete(listener);
154
- forget(this.emitMetaEvent("listenerRemoved", { listener }));
179
+ forget(this.emitMetaEvent("listenerRemoved", {
180
+ listener
181
+ }));
155
182
  }
156
183
  on(eventNames, listener, filter) {
157
- const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
184
+ const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
185
+ eventNames
186
+ ];
158
187
  for (const eventName of eventNamesArray) {
159
188
  let set = this.getListeners(eventName);
160
189
  if (!set) {
@@ -162,10 +191,16 @@ var Events = class _Events extends Base {
162
191
  const events = _Events.eventsMap.get(this);
163
192
  events?.set(eventName, set);
164
193
  }
165
- set.add({ filter, listener });
194
+ set.add({
195
+ filter,
196
+ listener
197
+ });
166
198
  this.logIfDebugEnabled("subscribe", eventName);
167
199
  if (!isMetaEvent(eventName)) {
168
- forget(this.emitMetaEvent("listenerAdded", { eventName, listener }));
200
+ forget(this.emitMetaEvent("listenerAdded", {
201
+ eventName,
202
+ listener
203
+ }));
169
204
  }
170
205
  }
171
206
  return this.off.bind(this, eventNames, listener);
@@ -173,14 +208,16 @@ var Events = class _Events extends Base {
173
208
  onAny(listener) {
174
209
  this.logIfDebugEnabled("subscribeAny");
175
210
  _Events.anyMap.get(this)?.add(listener);
176
- forget(this.emitMetaEvent("listenerAdded", { listener }));
211
+ forget(this.emitMetaEvent("listenerAdded", {
212
+ listener
213
+ }));
177
214
  return this.offAny.bind(this, listener);
178
215
  }
179
216
  once(eventName, listener) {
180
- const subListener = async (args) => {
217
+ const subListener = /* @__PURE__ */ __name(async (args) => {
181
218
  this.off(eventName, subListener);
182
219
  await this.safeCallListener(eventName, args, listener);
183
- };
220
+ }, "subListener");
184
221
  this.on(eventName, subListener);
185
222
  return this.off.bind(this, eventName, subListener);
186
223
  }
@@ -190,10 +227,16 @@ var Events = class _Events extends Base {
190
227
  }
191
228
  this.logIfDebugEnabled("emit", eventName, eventArgs);
192
229
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
193
- const filteredListeners = [...listeners.values()].filter((value) => filter ? value.listener : true).map((info) => info.listener);
230
+ const filteredListeners = [
231
+ ...listeners.values()
232
+ ].filter((value) => filter ? value.listener : true).map((info) => info.listener);
194
233
  const anyListeners = assertEx(_Events.anyMap.get(this));
195
- const staticListeners = [...filteredListeners];
196
- const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
234
+ const staticListeners = [
235
+ ...filteredListeners
236
+ ];
237
+ const staticAnyListeners = isMetaEvent(eventName) ? [] : [
238
+ ...anyListeners
239
+ ];
197
240
  await resolvedPromise;
198
241
  await Promise.all([
199
242
  ...staticListeners.map(async (listener) => {
@@ -212,10 +255,16 @@ var Events = class _Events extends Base {
212
255
  }
213
256
  this.logIfDebugEnabled("emit", eventName, eventArgs);
214
257
  const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
215
- const filteredListeners = [...listeners.values()].map((info) => info.listener);
258
+ const filteredListeners = [
259
+ ...listeners.values()
260
+ ].map((info) => info.listener);
216
261
  const anyListeners = assertEx(_Events.anyMap.get(this));
217
- const staticListeners = [...filteredListeners];
218
- const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
262
+ const staticListeners = [
263
+ ...filteredListeners
264
+ ];
265
+ const staticAnyListeners = isMetaEvent(eventName) ? [] : [
266
+ ...anyListeners
267
+ ];
219
268
  await resolvedPromise;
220
269
  await Promise.all([
221
270
  ...staticListeners.map(async (listener) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Events/Events.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xylabs/object'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model/index.js'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventFunctions<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static canEmitMetaEvents = false\n private static isGlobalDebugEnabled = false\n\n //this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger =\n mutatedParams.debug.logger ??\n ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process ?? { env: {} }\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n Events.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n Events.canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n } finally {\n Events.canEmitMetaEvents = false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n return true\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter((value) => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n //TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener>\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["eventName"]}
1
+ {"version":3,"sources":["../../src/Events/Events.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xylabs/object'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model/index.js'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventFunctions<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static canEmitMetaEvents = false\n private static isGlobalDebugEnabled = false\n\n //this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger =\n mutatedParams.debug.logger ??\n ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process ?? { env: {} }\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n Events.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n Events.canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n } finally {\n Events.canEmitMetaEvents = false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n return true\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter((value) => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n //TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener>\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["assertEx","handleError","forget","Base","NO_META_EVENT_ERROR_MESSAGE","resolvedPromise","Promise","resolve","isMetaEvent","eventName","Events","Base","anyMap","WeakMap","eventsMap","canEmitMetaEvents","isGlobalDebugEnabled","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","set","Set","Map","isDebugEnabled","globalThis","process","env","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","emitMetaEventInternal","emitSerial","TypeError","filterMatch","args","filter","reduce","prev","key","value","filteredListeners","values","map","info","listener","anyListeners","staticListeners","staticAnyListeners","safeCallListener","safeCallAnyListener","listenerCount","count","size","enabled","name","off","events","forget","offAny","typedMap","on","add","bind","onAny","once","subListener","all","has","ex","handleError","error","String","message"]}