@xyo-network/module-events 2.110.19 → 2.111.1

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.
@@ -41,7 +41,7 @@ var Events = class _Events extends import_object.Base {
41
41
  static eventsMap = /* @__PURE__ */ new WeakMap();
42
42
  static canEmitMetaEvents = false;
43
43
  static isGlobalDebugEnabled = false;
44
- //this is here to be able to query the type, not use
44
+ // this is here to be able to query the type, not use
45
45
  eventData = {};
46
46
  constructor(params = {}) {
47
47
  const mutatedParams = {
@@ -151,7 +151,7 @@ var Events = class _Events extends import_object.Base {
151
151
  await this.safeCallAnyListener(eventName, eventArgs, listener);
152
152
  }
153
153
  }
154
- //TODO: Make test for this
154
+ // TODO: Make test for this
155
155
  listenerCount(eventNames) {
156
156
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
157
157
  eventNames
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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
+ {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,mBAA4B;AAC5B,oBAAuB;AACvB,oBAAiC;AAkBjC,IAAMA,8BAA8B;AAWpC,IAAMC,kBAAkBC,QAAQC,QAAO;AAavC,IAAMC,cAAc,wBAACC,cAAyBA,cAAc,mBAAmBA,cAAc,mBAAzE;AAIb,IAAMC,SAAN,MAAMA,gBAAyDC,mBAAAA;EAjDtE,OAiDsEA;;;EACpE,OAAiBC,SAAS,oBAAIC,QAAAA;EAC9B,OAAiBC,YAAY,oBAAID,QAAAA;EAEjC,OAAeE,oBAAoB;EACnC,OAAeC,uBAAuB;;EAGtCC,YAAY,CAAC;EAEbC,YAAYC,SAAuB,CAAC,GAAG;AACrC,UAAMC,gBAAgB;MAAE,GAAGD;IAAO;AAClC,QAAIC,cAAcC,OAAO;AACvBD,oBAAcC,MAAMC,SAChBF,cAAcC,MAAMC,WAClB,CAACC,MAAcC,WAAmBf,WAAuBQ,cAAAA;AAC3D,YAAIQ;AACJ,YAAI;AACFA,4BAAkBC,KAAKC,UAAUV,SAAAA;QACnC,QAAQ;AACNQ,4BAAkB,uDAAuDG,OAAOC,KAAKZ,aAAa,CAAC,CAAA,EAAGa,KAAK,GAAA,CAAA;QAC7G;AAEA,cAAMC,kBAAkB,OAAOtB,cAAc,YAAY,OAAOA,cAAc,WAAWA,UAAUuB,SAAQ,IAAKvB;AAEhH,cAAMwB,cAAc,oBAAIC,KAAAA;AACxB,cAAMC,UAAU,GAAGF,YAAYG,SAAQ,CAAA,IAAMH,YAAYI,WAAU,CAAA,IAAMJ,YAAYK,WAAU,CAAA,IAAML,YAAYM,gBAAe,CAAA;AAChI,aAAKjB,QAAQkB,IAAI,IAAIL,OAAAA,YAAmBZ,IAAAA,KAASC,SAAAA,iBAA0BO,eAAAA;SAA4BN,eAAAA,EAAiB;MAC1H;IACJ;AACA,UAAML,aAAAA;AACNV,YAAOE,OAAO6B,IAAI,MAAM,oBAAIC,IAAAA,CAAAA;AAC5BhC,YAAOI,UAAU2B,IAAI,MAAM,oBAAIE,IAAAA,CAAAA;EACjC;EAEA,WAAWC,iBAAiB;AAI1B,QAAI,OAAOC,WAAWC,SAASC,QAAQ,UAAU;AAC/C,aAAOrC,QAAOM;IAChB;AAEA,UAAM,EAAE+B,IAAG,IAAKF,WAAWC,WAAW;MAAEC,KAAK,CAAC;IAAE;AAChD,WAAOA,IAAIC,UAAU,YAAYD,IAAIC,UAAU,OAAOtC,QAAOM;EAC/D;EAEA,WAAW4B,eAAeK,UAAU;AAClCvC,YAAOM,uBAAuBiC;EAChC;EAEA,IAAI5B,QAAQ;AACV,WAAO,KAAKF,OAAOE;EACrB;EAEA6B,eAAeC,YAAqD;AAClE,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAElE,eAAW1C,aAAa2C,iBAAiB;AACvC,WAAKG,kBAAkB,SAAS9C,SAAAA;AAEhC,UAAI,OAAOA,cAAc,YAAY,OAAOA,cAAc,YAAY,OAAOA,cAAc,UAAU;AACnG,cAAMgC,MAAM,KAAKe,aAAa/C,SAAAA;AAC9B,YAAIgC,KAAK;AACPA,cAAIgB,MAAK;QACX;MACF,OAAO;AACL/C,gBAAOE,OAAO8C,IAAI,IAAI,GAAGD,MAAAA;AAEzB,mBAAW,CAAChD,YAAWkD,SAAAA,SAAcC,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA,EAAGG,QAAO,GAAI;AACnFF,oBAAUF,MAAK;AACf/C,kBAAOI,UAAU4C,IAAI,IAAI,GAAGI,OAAOrD,UAAAA;QACrC;MACF;IACF;EACF;EAEA,MAAMsD,KAA0CtD,WAAuBuD,WAAmC;AACxG,UAAM,KAAKC,aAAaxD,WAAWuD,SAAAA;EACrC;EAEA,MAAME,cAAkEzD,WAAuBuD,WAAkD;AAC/I,QAAIxD,YAAYC,SAAAA,GAAY;AAC1B,UAAI;AACFC,gBAAOK,oBAAoB;AAC3B,cAAM,KAAKoD,sBAAsB1D,WAAWuD,SAAAA;MAC9C,UAAA;AACEtD,gBAAOK,oBAAoB;MAC7B;IACF;EACF;EAEA,MAAMqD,WAAgD3D,WAAuBuD,WAAmC;AAC9G,QAAIxD,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAUjE,2BAAAA;IACtB;AAEA,UAAMkE,cAAc,wBAACC,MAA8BC,WAAAA;AACjD,UAAIA,QAAQ;AACV,gBAAQ,OAAOA,QAAAA;UACb,KAAK,UAAU;AAEb,mBAAO5C,OAAOiC,QAAQU,IAAAA,EAAME,OAAO,CAACC,MAAM,CAACC,KAAKC,KAAAA,MAAaJ,OAAwCG,GAAAA,MAASC,QAAQ,OAAOF,MAAO,KAAA;UACtI;UACA,SAAS;AACP,mBAAOH,SAASC;UAClB;QACF;MACF;AACA,aAAO;IACT,GAboB;AAepB,SAAKjB,kBAAkB,cAAc9C,WAAWuD,SAAAA;AAEhD,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAC3CN,OAAOI,CAAAA,UAAUA,MAAMJ,SAASF,YAAYN,WAAWY,MAAMJ,MAAM,IAA8B,IAAA,EACjGO,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC5B,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB;SAAIF;;AAE/B,UAAM7E;AAEN,eAAW4E,YAAYE,iBAAiB;AACtC,YAAM,KAAKE,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;IACpD;AAEA,eAAWA,YAAYG,oBAAoB;AACzC,YAAM,KAAKE,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;IACvD;EACF;;EAGAM,cAAcpC,YAAsD;AAClE,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,QAAIqC,QAAQ;AAEZ,eAAW/E,aAAa2C,iBAAiB;AACvC,UAAI,OAAO3C,cAAc,UAAU;AACjC+E,qBAAS5B,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA,EAAG+B,QAAQ,KAAKjC,aAAa/C,SAAAA,GAAYgF,QAAQ;AAEzF;MACF;AAEAD,mBAAS5B,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA,EAAG+B;AAE3C,iBAAWb,aAAShB,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA,EAAGoB,OAAM,GAAI;AACjEU,iBAASZ,MAAMa;MACjB;IACF;AAEA,WAAOD;EACT;EAEAjC,kBAAgDhC,MAAcd,WAAwBuD,WAAuB;AAC3G,QAAItD,QAAOkC,kBAAkB,KAAKvB,OAAOqE,SAAS;AAChD,WAAKrE,OAAOC,SAASC,MAAM,KAAKF,MAAMsE,MAAMlF,WAAWuD,SAAAA;IACzD;EACF;EAEA4B,IACEzC,YACA8B,UACA;AACA,UAAM7B,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAW1C,aAAa2C,iBAAiB;AACvC,YAAMX,MAAM,KAAKe,aAAa/C,SAAAA;AAC9B,UAAIgC,KAAK;AACPA,YAAIqB,OAAOmB,QAAAA;AACX,YAAIxC,IAAIgD,SAAS,GAAG;AAClB,gBAAMI,SAASnF,QAAOI,UAAU4C,IAAI,IAAI;AACxCmC,kBAAQ/B,OAAOrD,SAAAA;QACjB;MACF;AAEA,WAAK8C,kBAAkB,eAAe9C,SAAAA;AAEtC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BqF,kCAAO,KAAK5B,cAAc,mBAAmB;UAAEzD;UAAWwE;QAAoC,CAAA,CAAA;MAChG;IACF;EACF;EAEAc,OAAOd,UAA4B;AACjC,SAAK1B,kBAAkB,gBAAA;AAEvB,UAAMyC,WAAWtF,QAAOE,OAAO8C,IAAI,IAAI;AACvCsC,cAAUlC,OAAOmB,QAAAA;AACjBa,8BAAO,KAAK5B,cAAc,mBAAmB;MAAEe;IAAuC,CAAA,CAAA;EACxF;EAEAgB,GACE9C,YACA8B,UACAT,QACA;AACA,UAAMpB,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAW1C,aAAa2C,iBAAiB;AACvC,UAAIX,MAAM,KAAKe,aAAa/C,SAAAA;AAC5B,UAAI,CAACgC,KAAK;AACRA,cAAM,oBAAIC,IAAAA;AACV,cAAMmD,SAASnF,QAAOI,UAAU4C,IAAI,IAAI;AACxCmC,gBAAQpD,IAAIhC,WAAWgC,GAAAA;MACzB;AAEAA,UAAIyD,IAAI;QAAE1B;QAAQS;MAAoC,CAAA;AAEtD,WAAK1B,kBAAkB,aAAa9C,SAAAA;AAEpC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BqF,kCAAO,KAAK5B,cAAc,iBAAiB;UAAEzD;UAAWwE;QAAoC,CAAA,CAAA;MAC9F;IACF;AAEA,WAAO,KAAKW,IAAIO,KAAK,MAAMhD,YAAY8B,QAAAA;EACzC;EAEAmB,MAAMnB,UAA4B;AAChC,SAAK1B,kBAAkB,cAAA;AAEvB7C,YAAOE,OAAO8C,IAAI,IAAI,GAAGwC,IAAIjB,QAAAA;AAC7Ba,8BAAO,KAAK5B,cAAc,iBAAiB;MAAEe;IAAuC,CAAA,CAAA;AACpF,WAAO,KAAKc,OAAOI,KAAK,MAAMlB,QAAAA;EAChC;EAEAoB,KAA0C5F,WAAuBwE,UAAiD;AAChH,UAAMqB,cAAc,8BAAO/B,SAAAA;AACzB,WAAKqB,IAAInF,WAAW6F,WAAAA;AACpB,YAAM,KAAKjB,iBAAiB5E,WAAW8D,MAAMU,QAAAA;IAC/C,GAHoB;AAIpB,SAAKgB,GAAGxF,WAAW6F,WAAAA;AACnB,WAAO,KAAKV,IAAIO,KAAK,MAAM1F,WAAW6F,WAAAA;EACxC;EAEA,MAAcrC,aACZxD,WACAuD,WACAQ,QACA;AACA,QAAIhE,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAUjE,2BAAAA;IACtB;AAEA,SAAKmD,kBAAkB,QAAQ9C,WAAWuD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAAIN,OAAOI,CAAAA,UAAUJ,SAASI,MAAMK,WAAW,IAAA,EAAOF,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC7H,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB5E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIyE;;AAE7D,UAAM7E;AACN,UAAMC,QAAQiG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEA,MAAcd,sBACZ1D,WACAuD,WACA;AACA,QAAIxD,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAU,uEAAA;IACtB;AAEA,SAAKd,kBAAkB,QAAQ9C,WAAWuD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAAIC,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC3E,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB5E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIyE;;AAE7D,UAAM7E;AACN,UAAMC,QAAQiG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEQzB,aAAkD/C,WAAuB;AAC/E,UAAMoF,aAASjC,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA;AACjD,QAAI,CAACmC,OAAOW,IAAI/F,SAAAA,GAAY;AAC1B;IACF;AAEA,WAAOoF,OAAOnC,IAAIjD,SAAAA;EACpB;EAEA,MAAc6E,oBACZ7E,WACAuD,WACAiB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASxE,WAAWuD,SAAAA;IACnC,SAASyC,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AACf,aAAKrF,QAAQqF,MAAM,YAAYC,OAAOnG,SAAAA,CAAAA,eAAyBkG,MAAME,OAAO,EAAE;MAChF,CAAA;IACF;EACF;EAEA,MAAcxB,iBACZ5E,WACAuD,WACAiB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASjB,SAAAA;IACxB,SAASyC,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AACf,aAAKrF,QAAQqF,MAAM,YAAYC,OAAOnG,SAAAA,CAAAA,eAAyBkG,MAAME,OAAO,EAAE;MAChF,CAAA;IACF;EACF;AACF;","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"]}
@@ -17,7 +17,7 @@ var Events = class _Events extends Base {
17
17
  static eventsMap = /* @__PURE__ */ new WeakMap();
18
18
  static canEmitMetaEvents = false;
19
19
  static isGlobalDebugEnabled = false;
20
- //this is here to be able to query the type, not use
20
+ // this is here to be able to query the type, not use
21
21
  eventData = {};
22
22
  constructor(params = {}) {
23
23
  const mutatedParams = {
@@ -127,7 +127,7 @@ var Events = class _Events extends Base {
127
127
  await this.safeCallAnyListener(eventName, eventArgs, listener);
128
128
  }
129
129
  }
130
- //TODO: Make test for this
130
+ // TODO: Make test for this
131
131
  listenerCount(eventNames) {
132
132
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
133
133
  eventNames
@@ -306,4 +306,4 @@ var Events = class _Events extends Base {
306
306
  export {
307
307
  Events
308
308
  };
309
- //# sourceMappingURL=index.js.map
309
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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.ts'\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"]}
@@ -41,7 +41,7 @@ var Events = class _Events extends import_object.Base {
41
41
  static eventsMap = /* @__PURE__ */ new WeakMap();
42
42
  static canEmitMetaEvents = false;
43
43
  static isGlobalDebugEnabled = false;
44
- //this is here to be able to query the type, not use
44
+ // this is here to be able to query the type, not use
45
45
  eventData = {};
46
46
  constructor(params = {}) {
47
47
  const mutatedParams = {
@@ -151,7 +151,7 @@ var Events = class _Events extends import_object.Base {
151
151
  await this.safeCallAnyListener(eventName, eventArgs, listener);
152
152
  }
153
153
  }
154
- //TODO: Make test for this
154
+ // TODO: Make test for this
155
155
  listenerCount(eventNames) {
156
156
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
157
157
  eventNames
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,mBAA4B;AAC5B,oBAAuB;AACvB,oBAAiC;AAkBjC,IAAMA,8BAA8B;AAWpC,IAAMC,kBAAkBC,QAAQC,QAAO;AAavC,IAAMC,cAAc,wBAACC,cAAyBA,cAAc,mBAAmBA,cAAc,mBAAzE;AAIb,IAAMC,SAAN,MAAMA,gBAAyDC,mBAAAA;EAjDtE,OAiDsEA;;;EACpE,OAAiBC,SAAS,oBAAIC,QAAAA;EAC9B,OAAiBC,YAAY,oBAAID,QAAAA;EAEjC,OAAeE,oBAAoB;EACnC,OAAeC,uBAAuB;;EAGtCC,YAAY,CAAC;EAEbC,YAAYC,SAAuB,CAAC,GAAG;AACrC,UAAMC,gBAAgB;MAAE,GAAGD;IAAO;AAClC,QAAIC,cAAcC,OAAO;AACvBD,oBAAcC,MAAMC,SAClBF,cAAcC,MAAMC,WACnB,CAACC,MAAcC,WAAmBf,WAAuBQ,cAAAA;AACxD,YAAIQ;AACJ,YAAI;AACFA,4BAAkBC,KAAKC,UAAUV,SAAAA;QACnC,QAAQ;AACNQ,4BAAkB,uDAAuDG,OAAOC,KAAKZ,aAAa,CAAC,CAAA,EAAGa,KAAK,GAAA,CAAA;QAC7G;AAEA,cAAMC,kBAAkB,OAAOtB,cAAc,YAAY,OAAOA,cAAc,WAAWA,UAAUuB,SAAQ,IAAKvB;AAEhH,cAAMwB,cAAc,oBAAIC,KAAAA;AACxB,cAAMC,UAAU,GAAGF,YAAYG,SAAQ,CAAA,IAAMH,YAAYI,WAAU,CAAA,IAAMJ,YAAYK,WAAU,CAAA,IAAML,YAAYM,gBAAe,CAAA;AAChI,aAAKjB,QAAQkB,IAAI,IAAIL,OAAAA,YAAmBZ,IAAAA,KAASC,SAAAA,iBAA0BO,eAAAA;SAA4BN,eAAAA,EAAiB;MAC1H;IACJ;AACA,UAAML,aAAAA;AACNV,YAAOE,OAAO6B,IAAI,MAAM,oBAAIC,IAAAA,CAAAA;AAC5BhC,YAAOI,UAAU2B,IAAI,MAAM,oBAAIE,IAAAA,CAAAA;EACjC;EAEA,WAAWC,iBAAiB;AAI1B,QAAI,OAAOC,WAAWC,SAASC,QAAQ,UAAU;AAC/C,aAAOrC,QAAOM;IAChB;AAEA,UAAM,EAAE+B,IAAG,IAAKF,WAAWC,WAAW;MAAEC,KAAK,CAAC;IAAE;AAChD,WAAOA,IAAIC,UAAU,YAAYD,IAAIC,UAAU,OAAOtC,QAAOM;EAC/D;EAEA,WAAW4B,eAAeK,UAAU;AAClCvC,YAAOM,uBAAuBiC;EAChC;EAEA,IAAI5B,QAAQ;AACV,WAAO,KAAKF,OAAOE;EACrB;EAEA6B,eAAeC,YAAqD;AAClE,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAElE,eAAW1C,aAAa2C,iBAAiB;AACvC,WAAKG,kBAAkB,SAAS9C,SAAAA;AAEhC,UAAI,OAAOA,cAAc,YAAY,OAAOA,cAAc,YAAY,OAAOA,cAAc,UAAU;AACnG,cAAMgC,MAAM,KAAKe,aAAa/C,SAAAA;AAC9B,YAAIgC,KAAK;AACPA,cAAIgB,MAAK;QACX;MACF,OAAO;AACL/C,gBAAOE,OAAO8C,IAAI,IAAI,GAAGD,MAAAA;AAEzB,mBAAW,CAAChD,YAAWkD,SAAAA,SAAcC,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA,EAAGG,QAAO,GAAI;AACnFF,oBAAUF,MAAK;AACf/C,kBAAOI,UAAU4C,IAAI,IAAI,GAAGI,OAAOrD,UAAAA;QACrC;MACF;IACF;EACF;EAEA,MAAMsD,KAA0CtD,WAAuBuD,WAAmC;AACxG,UAAM,KAAKC,aAAaxD,WAAWuD,SAAAA;EACrC;EAEA,MAAME,cAAkEzD,WAAuBuD,WAAkD;AAC/I,QAAIxD,YAAYC,SAAAA,GAAY;AAC1B,UAAI;AACFC,gBAAOK,oBAAoB;AAC3B,cAAM,KAAKoD,sBAAsB1D,WAAWuD,SAAAA;MAC9C,UAAA;AACEtD,gBAAOK,oBAAoB;MAC7B;IACF;EACF;EAEA,MAAMqD,WAAgD3D,WAAuBuD,WAAmC;AAC9G,QAAIxD,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAUjE,2BAAAA;IACtB;AAEA,UAAMkE,cAAc,wBAACC,MAA8BC,WAAAA;AACjD,UAAIA,QAAQ;AACV,gBAAQ,OAAOA,QAAAA;UACb,KAAK,UAAU;AAEb,mBAAO5C,OAAOiC,QAAQU,IAAAA,EAAME,OAAO,CAACC,MAAM,CAACC,KAAKC,KAAAA,MAAaJ,OAAwCG,GAAAA,MAASC,QAAQ,OAAOF,MAAO,KAAA;UACtI;UACA,SAAS;AACP,mBAAOH,SAASC;UAClB;QACF;MACF;AACA,aAAO;IACT,GAboB;AAepB,SAAKjB,kBAAkB,cAAc9C,WAAWuD,SAAAA;AAEhD,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAC3CN,OAAO,CAACI,UAAWA,MAAMJ,SAASF,YAAYN,WAAWY,MAAMJ,MAAM,IAA8B,IAAA,EACnGO,IAAI,CAACC,SAASA,KAAKC,QAAQ;AAC9B,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB;SAAIF;;AAE/B,UAAM7E;AAEN,eAAW4E,YAAYE,iBAAiB;AACtC,YAAM,KAAKE,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;IACpD;AAEA,eAAWA,YAAYG,oBAAoB;AACzC,YAAM,KAAKE,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;IACvD;EACF;;EAGAM,cAAcpC,YAAsD;AAClE,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,QAAIqC,QAAQ;AAEZ,eAAW/E,aAAa2C,iBAAiB;AACvC,UAAI,OAAO3C,cAAc,UAAU;AACjC+E,qBAAS5B,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA,EAAG+B,QAAQ,KAAKjC,aAAa/C,SAAAA,GAAYgF,QAAQ;AAEzF;MACF;AAEAD,mBAAS5B,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA,EAAG+B;AAE3C,iBAAWb,aAAShB,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA,EAAGoB,OAAM,GAAI;AACjEU,iBAASZ,MAAMa;MACjB;IACF;AAEA,WAAOD;EACT;EAEAjC,kBAAgDhC,MAAcd,WAAwBuD,WAAuB;AAC3G,QAAItD,QAAOkC,kBAAkB,KAAKvB,OAAOqE,SAAS;AAChD,WAAKrE,OAAOC,SAASC,MAAM,KAAKF,MAAMsE,MAAMlF,WAAWuD,SAAAA;IACzD;EACF;EAEA4B,IACEzC,YACA8B,UACA;AACA,UAAM7B,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAW1C,aAAa2C,iBAAiB;AACvC,YAAMX,MAAM,KAAKe,aAAa/C,SAAAA;AAC9B,UAAIgC,KAAK;AACPA,YAAIqB,OAAOmB,QAAAA;AACX,YAAIxC,IAAIgD,SAAS,GAAG;AAClB,gBAAMI,SAASnF,QAAOI,UAAU4C,IAAI,IAAI;AACxCmC,kBAAQ/B,OAAOrD,SAAAA;QACjB;MACF;AAEA,WAAK8C,kBAAkB,eAAe9C,SAAAA;AAEtC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BqF,kCAAO,KAAK5B,cAAc,mBAAmB;UAAEzD;UAAWwE;QAAoC,CAAA,CAAA;MAChG;IACF;EACF;EAEAc,OAAOd,UAA4B;AACjC,SAAK1B,kBAAkB,gBAAA;AAEvB,UAAMyC,WAAWtF,QAAOE,OAAO8C,IAAI,IAAI;AACvCsC,cAAUlC,OAAOmB,QAAAA;AACjBa,8BAAO,KAAK5B,cAAc,mBAAmB;MAAEe;IAAuC,CAAA,CAAA;EACxF;EAEAgB,GACE9C,YACA8B,UACAT,QACA;AACA,UAAMpB,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAW1C,aAAa2C,iBAAiB;AACvC,UAAIX,MAAM,KAAKe,aAAa/C,SAAAA;AAC5B,UAAI,CAACgC,KAAK;AACRA,cAAM,oBAAIC,IAAAA;AACV,cAAMmD,SAASnF,QAAOI,UAAU4C,IAAI,IAAI;AACxCmC,gBAAQpD,IAAIhC,WAAWgC,GAAAA;MACzB;AAEAA,UAAIyD,IAAI;QAAE1B;QAAQS;MAAoC,CAAA;AAEtD,WAAK1B,kBAAkB,aAAa9C,SAAAA;AAEpC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BqF,kCAAO,KAAK5B,cAAc,iBAAiB;UAAEzD;UAAWwE;QAAoC,CAAA,CAAA;MAC9F;IACF;AAEA,WAAO,KAAKW,IAAIO,KAAK,MAAMhD,YAAY8B,QAAAA;EACzC;EAEAmB,MAAMnB,UAA4B;AAChC,SAAK1B,kBAAkB,cAAA;AAEvB7C,YAAOE,OAAO8C,IAAI,IAAI,GAAGwC,IAAIjB,QAAAA;AAC7Ba,8BAAO,KAAK5B,cAAc,iBAAiB;MAAEe;IAAuC,CAAA,CAAA;AACpF,WAAO,KAAKc,OAAOI,KAAK,MAAMlB,QAAAA;EAChC;EAEAoB,KAA0C5F,WAAuBwE,UAAiD;AAChH,UAAMqB,cAAc,8BAAO/B,SAAAA;AACzB,WAAKqB,IAAInF,WAAW6F,WAAAA;AACpB,YAAM,KAAKjB,iBAAiB5E,WAAW8D,MAAMU,QAAAA;IAC/C,GAHoB;AAIpB,SAAKgB,GAAGxF,WAAW6F,WAAAA;AACnB,WAAO,KAAKV,IAAIO,KAAK,MAAM1F,WAAW6F,WAAAA;EACxC;EAEA,MAAcrC,aACZxD,WACAuD,WACAQ,QACA;AACA,QAAIhE,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAUjE,2BAAAA;IACtB;AAEA,SAAKmD,kBAAkB,QAAQ9C,WAAWuD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAAIN,OAAO,CAACI,UAAWJ,SAASI,MAAMK,WAAW,IAAA,EAAOF,IAAI,CAACC,SAASA,KAAKC,QAAQ;AACjI,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB5E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIyE;;AAE7D,UAAM7E;AACN,UAAMC,QAAQiG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEA,MAAcd,sBACZ1D,WACAuD,WACA;AACA,QAAIxD,YAAYC,SAAAA,KAAc,CAACC,QAAOK,mBAAmB;AACvD,YAAM,IAAIsD,UAAU,uEAAA;IACtB;AAEA,SAAKd,kBAAkB,QAAQ9C,WAAWuD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa/C,SAAAA,KAAc,oBAAIiC,IAAAA;AACtD,UAAMmC,oBAAoB;SAAIlB,UAAUmB,OAAM;MAAIC,IAAI,CAACC,SAASA,KAAKC,QAAQ;AAC7E,UAAMC,mBAAetB,wBAASlD,QAAOE,OAAO8C,IAAI,IAAI,CAAA;AACpD,UAAMyB,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB5E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIyE;;AAE7D,UAAM7E;AACN,UAAMC,QAAQiG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB5E,WAAWuD,WAAWiB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB7E,WAAWuD,WAAWiB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEQzB,aAAkD/C,WAAuB;AAC/E,UAAMoF,aAASjC,wBAASlD,QAAOI,UAAU4C,IAAI,IAAI,CAAA;AACjD,QAAI,CAACmC,OAAOW,IAAI/F,SAAAA,GAAY;AAC1B;IACF;AAEA,WAAOoF,OAAOnC,IAAIjD,SAAAA;EACpB;EAEA,MAAc6E,oBACZ7E,WACAuD,WACAiB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASxE,WAAWuD,SAAAA;IACnC,SAASyC,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AACf,aAAKrF,QAAQqF,MAAM,YAAYC,OAAOnG,SAAAA,CAAAA,eAAyBkG,MAAME,OAAO,EAAE;MAChF,CAAA;IACF;EACF;EAEA,MAAcxB,iBACZ5E,WACAuD,WACAiB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASjB,SAAAA;IACxB,SAASyC,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AACf,aAAKrF,QAAQqF,MAAM,YAAYC,OAAOnG,SAAAA,CAAAA,eAAyBkG,MAAME,OAAO,EAAE;MAChF,CAAA;IACF;EACF;AACF;","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
+ {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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"]}
@@ -17,7 +17,7 @@ var Events = class _Events extends Base {
17
17
  static eventsMap = /* @__PURE__ */ new WeakMap();
18
18
  static canEmitMetaEvents = false;
19
19
  static isGlobalDebugEnabled = false;
20
- //this is here to be able to query the type, not use
20
+ // this is here to be able to query the type, not use
21
21
  eventData = {};
22
22
  constructor(params = {}) {
23
23
  const mutatedParams = {
@@ -127,7 +127,7 @@ var Events = class _Events extends Base {
127
127
  await this.safeCallAnyListener(eventName, eventArgs, listener);
128
128
  }
129
129
  }
130
- //TODO: Make test for this
130
+ // TODO: Make test for this
131
131
  listenerCount(eventNames) {
132
132
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
133
133
  eventNames
@@ -306,4 +306,4 @@ var Events = class _Events extends Base {
306
306
  export {
307
307
  Events
308
308
  };
309
- //# sourceMappingURL=index.js.map
309
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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.ts'\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"]}
@@ -36,7 +36,7 @@ var NO_META_EVENT_ERROR_MESSAGE = "`eventName` cannot be meta event `listenerAdd
36
36
  var resolvedPromise = Promise.resolve();
37
37
  var isMetaEvent = /* @__PURE__ */ __name((eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved", "isMetaEvent");
38
38
  var _Events = class _Events extends import_object.Base {
39
- //this is here to be able to query the type, not use
39
+ // this is here to be able to query the type, not use
40
40
  eventData = {};
41
41
  constructor(params = {}) {
42
42
  const mutatedParams = {
@@ -149,7 +149,7 @@ var _Events = class _Events extends import_object.Base {
149
149
  await this.safeCallAnyListener(eventName, eventArgs, listener);
150
150
  }
151
151
  }
152
- //TODO: Make test for this
152
+ // TODO: Make test for this
153
153
  listenerCount(eventNames) {
154
154
  var _a;
155
155
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","anyMap","set","Set","eventsMap","Map","isDebugEnabled","globalThis","process","env","isGlobalDebugEnabled","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","canEmitMetaEvents","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","WeakMap"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Events/Events.ts"],"sourcesContent":["export * from './Events/index.ts'\nexport * from './model/index.ts'\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.ts'\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":";;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,mBAA4B;AAC5B,oBAAuB;AACvB,oBAAiC;AAkBjC,IAAMA,8BAA8B;AAWpC,IAAMC,kBAAkBC,QAAQC,QAAO;AAavC,IAAMC,cAAc,wBAACC,cAAyBA,cAAc,mBAAmBA,cAAc,mBAAzE;AAIb,IAAMC,UAAN,MAAMA,gBAAyDC,mBAAAA;;EAQpEC,YAAY,CAAC;EAEbC,YAAYC,SAAuB,CAAC,GAAG;AACrC,UAAMC,gBAAgB;MAAE,GAAGD;IAAO;AAClC,QAAIC,cAAcC,OAAO;AACvBD,oBAAcC,MAAMC,SAChBF,cAAcC,MAAMC,WAClB,CAACC,MAAcC,WAAmBV,WAAuBG,cAAAA;AAhErE;AAiEU,YAAIQ;AACJ,YAAI;AACFA,4BAAkBC,KAAKC,UAAUV,SAAAA;QACnC,QAAQ;AACNQ,4BAAkB,uDAAuDG,OAAOC,KAAKZ,aAAa,CAAC,CAAA,EAAGa,KAAK,GAAA,CAAA;QAC7G;AAEA,cAAMC,kBAAkB,OAAOjB,cAAc,YAAY,OAAOA,cAAc,WAAWA,UAAUkB,SAAQ,IAAKlB;AAEhH,cAAMmB,cAAc,oBAAIC,KAAAA;AACxB,cAAMC,UAAU,GAAGF,YAAYG,SAAQ,CAAA,IAAMH,YAAYI,WAAU,CAAA,IAAMJ,YAAYK,WAAU,CAAA,IAAML,YAAYM,gBAAe,CAAA;AAChI,mBAAKjB,WAAL,mBAAakB,IAAI,IAAIL,OAAAA,YAAmBZ,IAAAA,KAASC,SAAAA,iBAA0BO,eAAAA;SAA4BN,eAAAA;MACzG;IACJ;AACA,UAAML,aAAAA;AACNL,YAAO0B,OAAOC,IAAI,MAAM,oBAAIC,IAAAA,CAAAA;AAC5B5B,YAAO6B,UAAUF,IAAI,MAAM,oBAAIG,IAAAA,CAAAA;EACjC;EAEA,WAAWC,iBAAiB;AApF9B;AAwFI,QAAI,SAAOC,gBAAWC,YAAXD,mBAAoBE,SAAQ,UAAU;AAC/C,aAAOlC,QAAOmC;IAChB;AAEA,UAAM,EAAED,IAAG,IAAKF,WAAWC,WAAW;MAAEC,KAAK,CAAC;IAAE;AAChD,WAAOA,IAAIE,UAAU,YAAYF,IAAIE,UAAU,OAAOpC,QAAOmC;EAC/D;EAEA,WAAWJ,eAAeM,UAAU;AAClCrC,YAAOmC,uBAAuBE;EAChC;EAEA,IAAI/B,QAAQ;AACV,WAAO,KAAKF,OAAOE;EACrB;EAEAgC,eAAeC,YAAqD;AAxGtE;AAyGI,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAElE,eAAWxC,aAAayC,iBAAiB;AACvC,WAAKG,kBAAkB,SAAS5C,SAAAA;AAEhC,UAAI,OAAOA,cAAc,YAAY,OAAOA,cAAc,YAAY,OAAOA,cAAc,UAAU;AACnG,cAAM4B,MAAM,KAAKiB,aAAa7C,SAAAA;AAC9B,YAAI4B,KAAK;AACPA,cAAIkB,MAAK;QACX;MACF,OAAO;AACL7C,sBAAO0B,OAAOoB,IAAI,IAAI,MAAtB9C,mBAAyB6C;AAEzB,mBAAW,CAAC9C,YAAWgD,SAAAA,SAAcC,wBAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA,EAAGG,QAAO,GAAI;AACnFF,oBAAUF,MAAK;AACf7C,wBAAO6B,UAAUiB,IAAI,IAAI,MAAzB9C,mBAA4BkD,OAAOnD;QACrC;MACF;IACF;EACF;EAEA,MAAMoD,KAA0CpD,WAAuBqD,WAAmC;AACxG,UAAM,KAAKC,aAAatD,WAAWqD,SAAAA;EACrC;EAEA,MAAME,cAAkEvD,WAAuBqD,WAAkD;AAC/I,QAAItD,YAAYC,SAAAA,GAAY;AAC1B,UAAI;AACFC,gBAAOuD,oBAAoB;AAC3B,cAAM,KAAKC,sBAAsBzD,WAAWqD,SAAAA;MAC9C,UAAA;AACEpD,gBAAOuD,oBAAoB;MAC7B;IACF;EACF;EAEA,MAAME,WAAgD1D,WAAuBqD,WAAmC;AAC9G,QAAItD,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAUhE,2BAAAA;IACtB;AAEA,UAAMiE,cAAc,wBAACC,MAA8BC,WAAAA;AACjD,UAAIA,QAAQ;AACV,gBAAQ,OAAOA,QAAAA;UACb,KAAK,UAAU;AAEb,mBAAOhD,OAAOoC,QAAQW,IAAAA,EAAME,OAAO,CAACC,MAAM,CAACC,KAAKC,KAAAA,MAAaJ,OAAwCG,GAAAA,MAASC,QAAQ,OAAOF,MAAO,KAAA;UACtI;UACA,SAAS;AACP,mBAAOH,SAASC;UAClB;QACF;MACF;AACA,aAAO;IACT,GAboB;AAepB,SAAKlB,kBAAkB,cAAc5C,WAAWqD,SAAAA;AAEhD,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAC3CN,OAAOI,CAAAA,UAAUA,MAAMJ,SAASF,YAAYP,WAAWa,MAAMJ,MAAM,IAA8B,IAAA,EACjGO,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC5B,UAAMC,mBAAevB,wBAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB;SAAIF;;AAE/B,UAAM5E;AAEN,eAAW2E,YAAYE,iBAAiB;AACtC,YAAM,KAAKE,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;IACpD;AAEA,eAAWA,YAAYG,oBAAoB;AACzC,YAAM,KAAKE,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;IACvD;EACF;;EAGAM,cAAcrC,YAAsD;AAvLtE;AAwLI,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,QAAIsC,QAAQ;AAEZ,eAAW9E,aAAayC,iBAAiB;AACvC,UAAI,OAAOzC,cAAc,UAAU;AACjC8E,qBAAS7B,wBAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA,EAAGgC,UAAQ,UAAKlC,aAAa7C,SAAAA,MAAlB,mBAA8B+E,SAAQ;AAEzF;MACF;AAEAD,mBAAS7B,wBAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA,EAAGgC;AAE3C,iBAAWb,aAASjB,wBAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA,EAAGqB,OAAM,GAAI;AACjEU,iBAASZ,MAAMa;MACjB;IACF;AAEA,WAAOD;EACT;EAEAlC,kBAAgDnC,MAAcT,WAAwBqD,WAAuB;AA5M/G;AA6MI,QAAIpD,QAAO+B,oBAAkB,UAAKzB,UAAL,mBAAYyE,UAAS;AAChD,uBAAKzE,UAAL,mBAAYC,WAAZ,4BAAqBC,MAAM,KAAKF,MAAM0E,MAAMjF,WAAWqD;IACzD;EACF;EAEA6B,IACE1C,YACA+B,UACA;AACA,UAAM9B,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAWxC,aAAayC,iBAAiB;AACvC,YAAMb,MAAM,KAAKiB,aAAa7C,SAAAA;AAC9B,UAAI4B,KAAK;AACPA,YAAIuB,OAAOoB,QAAAA;AACX,YAAI3C,IAAImD,SAAS,GAAG;AAClB,gBAAMI,SAASlF,QAAO6B,UAAUiB,IAAI,IAAI;AACxCoC,2CAAQhC,OAAOnD;QACjB;MACF;AAEA,WAAK4C,kBAAkB,eAAe5C,SAAAA;AAEtC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BoF,kCAAO,KAAK7B,cAAc,mBAAmB;UAAEvD;UAAWuE;QAAoC,CAAA,CAAA;MAChG;IACF;EACF;EAEAc,OAAOd,UAA4B;AACjC,SAAK3B,kBAAkB,gBAAA;AAEvB,UAAM0C,WAAWrF,QAAO0B,OAAOoB,IAAI,IAAI;AACvCuC,yCAAUnC,OAAOoB;AACjBa,8BAAO,KAAK7B,cAAc,mBAAmB;MAAEgB;IAAuC,CAAA,CAAA;EACxF;EAEAgB,GACE/C,YACA+B,UACAT,QACA;AACA,UAAMrB,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAWxC,aAAayC,iBAAiB;AACvC,UAAIb,MAAM,KAAKiB,aAAa7C,SAAAA;AAC5B,UAAI,CAAC4B,KAAK;AACRA,cAAM,oBAAIC,IAAAA;AACV,cAAMsD,SAASlF,QAAO6B,UAAUiB,IAAI,IAAI;AACxCoC,yCAAQvD,IAAI5B,WAAW4B;MACzB;AAEAA,UAAI4D,IAAI;QAAE1B;QAAQS;MAAoC,CAAA;AAEtD,WAAK3B,kBAAkB,aAAa5C,SAAAA;AAEpC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BoF,kCAAO,KAAK7B,cAAc,iBAAiB;UAAEvD;UAAWuE;QAAoC,CAAA,CAAA;MAC9F;IACF;AAEA,WAAO,KAAKW,IAAIO,KAAK,MAAMjD,YAAY+B,QAAAA;EACzC;EAEAmB,MAAMnB,UAA4B;AA3QpC;AA4QI,SAAK3B,kBAAkB,cAAA;AAEvB3C,kBAAO0B,OAAOoB,IAAI,IAAI,MAAtB9C,mBAAyBuF,IAAIjB;AAC7Ba,8BAAO,KAAK7B,cAAc,iBAAiB;MAAEgB;IAAuC,CAAA,CAAA;AACpF,WAAO,KAAKc,OAAOI,KAAK,MAAMlB,QAAAA;EAChC;EAEAoB,KAA0C3F,WAAuBuE,UAAiD;AAChH,UAAMqB,cAAc,8BAAO/B,SAAAA;AACzB,WAAKqB,IAAIlF,WAAW4F,WAAAA;AACpB,YAAM,KAAKjB,iBAAiB3E,WAAW6D,MAAMU,QAAAA;IAC/C,GAHoB;AAIpB,SAAKgB,GAAGvF,WAAW4F,WAAAA;AACnB,WAAO,KAAKV,IAAIO,KAAK,MAAMzF,WAAW4F,WAAAA;EACxC;EAEA,MAActC,aACZtD,WACAqD,WACAS,QACA;AACA,QAAI/D,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAUhE,2BAAAA;IACtB;AAEA,SAAKiD,kBAAkB,QAAQ5C,WAAWqD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAAIN,OAAOI,CAAAA,UAAUJ,SAASI,MAAMK,WAAW,IAAA,EAAOF,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC7H,UAAMC,mBAAevB,wBAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB3E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIwE;;AAE7D,UAAM5E;AACN,UAAMC,QAAQgG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEA,MAAcd,sBACZzD,WACAqD,WACA;AACA,QAAItD,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAU,uEAAA;IACtB;AAEA,SAAKf,kBAAkB,QAAQ5C,WAAWqD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAAIC,IAAIC,CAAAA,SAAQA,KAAKC,QAAQ;AAC3E,UAAMC,mBAAevB,wBAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB3E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIwE;;AAE7D,UAAM5E;AACN,UAAMC,QAAQgG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEQ1B,aAAkD7C,WAAuB;AAC/E,UAAMmF,aAASlC,wBAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA;AACjD,QAAI,CAACoC,OAAOW,IAAI9F,SAAAA,GAAY;AAC1B;IACF;AAEA,WAAOmF,OAAOpC,IAAI/C,SAAAA;EACpB;EAEA,MAAc4E,oBACZ5E,WACAqD,WACAkB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASvE,WAAWqD,SAAAA;IACnC,SAAS0C,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AAxWvB;AAyWQ,mBAAKzF,WAAL,mBAAayF,MAAM,YAAYC,OAAOlG,SAAAA,CAAAA,eAAyBiG,MAAME,OAAO;MAC9E,CAAA;IACF;EACF;EAEA,MAAcxB,iBACZ3E,WACAqD,WACAkB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASlB,SAAAA;IACxB,SAAS0C,IAAI;AACXC,oCAAYD,IAAI,CAACE,UAAAA;AAtXvB;AAuXQ,mBAAKzF,WAAL,mBAAayF,MAAM,YAAYC,OAAOlG,SAAAA,CAAAA,eAAyBiG,MAAME,OAAO;MAC9E,CAAA;IACF;EACF;AACF;AA1UsEjG;AACpE,cADWD,SACM0B,UAAS,oBAAIyE,QAAAA;AAC9B,cAFWnG,SAEM6B,aAAY,oBAAIsE,QAAAA;AAEjC,cAJWnG,SAIIuD,qBAAoB;AACnC,cALWvD,SAKImC,wBAAuB;AALjC,IAAMnC,SAAN;","names":["NO_META_EVENT_ERROR_MESSAGE","resolvedPromise","Promise","resolve","isMetaEvent","eventName","Events","Base","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","anyMap","set","Set","eventsMap","Map","isDebugEnabled","globalThis","process","env","isGlobalDebugEnabled","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","canEmitMetaEvents","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","WeakMap"]}
@@ -12,7 +12,7 @@ var NO_META_EVENT_ERROR_MESSAGE = "`eventName` cannot be meta event `listenerAdd
12
12
  var resolvedPromise = Promise.resolve();
13
13
  var isMetaEvent = /* @__PURE__ */ __name((eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved", "isMetaEvent");
14
14
  var _Events = class _Events extends Base {
15
- //this is here to be able to query the type, not use
15
+ // this is here to be able to query the type, not use
16
16
  eventData = {};
17
17
  constructor(params = {}) {
18
18
  const mutatedParams = {
@@ -125,7 +125,7 @@ var _Events = class _Events extends Base {
125
125
  await this.safeCallAnyListener(eventName, eventArgs, listener);
126
126
  }
127
127
  }
128
- //TODO: Make test for this
128
+ // TODO: Make test for this
129
129
  listenerCount(eventNames) {
130
130
  var _a;
131
131
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [
@@ -315,4 +315,4 @@ var Events = _Events;
315
315
  export {
316
316
  Events
317
317
  };
318
- //# sourceMappingURL=index.js.map
318
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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.ts'\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","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","anyMap","set","Set","eventsMap","Map","isDebugEnabled","globalThis","process","env","isGlobalDebugEnabled","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","canEmitMetaEvents","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","WeakMap"]}
package/package.json CHANGED
@@ -10,17 +10,17 @@
10
10
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/assert": "^3.6.6",
14
- "@xylabs/error": "^3.6.6",
15
- "@xylabs/forget": "^3.6.6",
16
- "@xylabs/object": "^3.6.6",
17
- "@xylabs/promise": "^3.6.6"
13
+ "@xylabs/assert": "^3.6.8",
14
+ "@xylabs/error": "^3.6.8",
15
+ "@xylabs/forget": "^3.6.8",
16
+ "@xylabs/object": "^3.6.8",
17
+ "@xylabs/promise": "^3.6.8"
18
18
  },
19
19
  "devDependencies": {
20
- "@xylabs/delay": "^3.6.6",
21
- "@xylabs/ts-scripts-yarn3": "^3.14.1",
22
- "@xylabs/tsconfig": "^3.14.1",
23
- "@xylabs/tsconfig-jest": "^3.14.1",
20
+ "@xylabs/delay": "^3.6.8",
21
+ "@xylabs/ts-scripts-yarn3": "^3.15.8",
22
+ "@xylabs/tsconfig": "^3.15.8",
23
+ "@xylabs/tsconfig-jest": "^3.15.8",
24
24
  "typescript": "^5.5.4"
25
25
  },
26
26
  "description": "Primary SDK for using XYO Protocol 2.0",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "import": {
36
36
  "types": "./dist/browser/index.d.mts",
37
- "default": "./dist/browser/index.js"
37
+ "default": "./dist/browser/index.mjs"
38
38
  }
39
39
  },
40
40
  "node": {
@@ -44,14 +44,14 @@
44
44
  },
45
45
  "import": {
46
46
  "types": "./dist/node/index.d.mts",
47
- "default": "./dist/node/index.js"
47
+ "default": "./dist/node/index.mjs"
48
48
  }
49
49
  }
50
50
  },
51
51
  "./package.json": "./package.json"
52
52
  },
53
53
  "main": "dist/node/index.cjs",
54
- "module": "dist/node/index.js",
54
+ "module": "dist/node/index.mjs",
55
55
  "homepage": "https://xyo.network",
56
56
  "license": "LGPL-3.0-only",
57
57
  "publishConfig": {
@@ -62,6 +62,6 @@
62
62
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
63
63
  },
64
64
  "sideEffects": false,
65
- "version": "2.110.19",
65
+ "version": "2.111.1",
66
66
  "type": "module"
67
67
  }
@@ -54,15 +54,15 @@ export class Events<TEventData extends EventData = EventData> extends Base<Event
54
54
  private static canEmitMetaEvents = false
55
55
  private static isGlobalDebugEnabled = false
56
56
 
57
- //this is here to be able to query the type, not use
57
+ // this is here to be able to query the type, not use
58
58
  eventData = {} as TEventData
59
59
 
60
60
  constructor(params: EventsParams = {}) {
61
61
  const mutatedParams = { ...params }
62
62
  if (mutatedParams.debug) {
63
- mutatedParams.debug.logger =
64
- mutatedParams.debug.logger ??
65
- ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {
63
+ mutatedParams.debug.logger
64
+ = mutatedParams.debug.logger
65
+ ?? ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {
66
66
  let eventDataString: string
67
67
  try {
68
68
  eventDataString = JSON.stringify(eventData)
@@ -163,8 +163,8 @@ export class Events<TEventData extends EventData = EventData> extends Base<Event
163
163
 
164
164
  const listeners = this.getListeners(eventName) ?? new Set()
165
165
  const filteredListeners = [...listeners.values()]
166
- .filter((value) => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))
167
- .map((info) => info.listener)
166
+ .filter(value => (value.filter ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))
167
+ .map(info => info.listener)
168
168
  const anyListeners = assertEx(Events.anyMap.get(this))
169
169
  const staticListeners = [...filteredListeners]
170
170
  const staticAnyListeners = [...anyListeners]
@@ -180,7 +180,7 @@ export class Events<TEventData extends EventData = EventData> extends Base<Event
180
180
  }
181
181
  }
182
182
 
183
- //TODO: Make test for this
183
+ // TODO: Make test for this
184
184
  listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {
185
185
  const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]
186
186
  let count = 0
@@ -294,7 +294,7 @@ export class Events<TEventData extends EventData = EventData> extends Base<Event
294
294
  this.logIfDebugEnabled('emit', eventName, eventArgs)
295
295
 
296
296
  const listeners = this.getListeners(eventName) ?? new Set()
297
- const filteredListeners = [...listeners.values()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)
297
+ const filteredListeners = [...listeners.values()].filter(value => (filter ? value.listener : true)).map(info => info.listener)
298
298
  const anyListeners = assertEx(Events.anyMap.get(this))
299
299
  const staticListeners = [...filteredListeners]
300
300
  const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]
@@ -323,7 +323,7 @@ export class Events<TEventData extends EventData = EventData> extends Base<Event
323
323
  this.logIfDebugEnabled('emit', eventName, eventArgs)
324
324
 
325
325
  const listeners = this.getListeners(eventName) ?? new Set()
326
- const filteredListeners = [...listeners.values()].map((info) => info.listener)
326
+ const filteredListeners = [...listeners.values()].map(info => info.listener)
327
327
  const anyListeners = assertEx(Events.anyMap.get(this))
328
328
  const staticListeners = [...filteredListeners]
329
329
  const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]
@@ -1 +0,0 @@
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.ts'\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"]}
@@ -1 +0,0 @@
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.ts'\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"]}
@@ -1 +0,0 @@
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.ts'\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":";;;;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,cAAc;AACvB,SAASC,YAAwB;AAkBjC,IAAMC,8BAA8B;AAWpC,IAAMC,kBAAkBC,QAAQC,QAAO;AAavC,IAAMC,cAAc,wBAACC,cAAyBA,cAAc,mBAAmBA,cAAc,mBAAzE;AAIb,IAAMC,UAAN,MAAMA,gBAAyDC,KAAAA;;EAQpEC,YAAY,CAAC;EAEbC,YAAYC,SAAuB,CAAC,GAAG;AACrC,UAAMC,gBAAgB;MAAE,GAAGD;IAAO;AAClC,QAAIC,cAAcC,OAAO;AACvBD,oBAAcC,MAAMC,SAClBF,cAAcC,MAAMC,WACnB,CAACC,MAAcC,WAAmBV,WAAuBG,cAAAA;AAhElE;AAiEU,YAAIQ;AACJ,YAAI;AACFA,4BAAkBC,KAAKC,UAAUV,SAAAA;QACnC,QAAQ;AACNQ,4BAAkB,uDAAuDG,OAAOC,KAAKZ,aAAa,CAAC,CAAA,EAAGa,KAAK,GAAA,CAAA;QAC7G;AAEA,cAAMC,kBAAkB,OAAOjB,cAAc,YAAY,OAAOA,cAAc,WAAWA,UAAUkB,SAAQ,IAAKlB;AAEhH,cAAMmB,cAAc,oBAAIC,KAAAA;AACxB,cAAMC,UAAU,GAAGF,YAAYG,SAAQ,CAAA,IAAMH,YAAYI,WAAU,CAAA,IAAMJ,YAAYK,WAAU,CAAA,IAAML,YAAYM,gBAAe,CAAA;AAChI,mBAAKjB,WAAL,mBAAakB,IAAI,IAAIL,OAAAA,YAAmBZ,IAAAA,KAASC,SAAAA,iBAA0BO,eAAAA;SAA4BN,eAAAA;MACzG;IACJ;AACA,UAAML,aAAAA;AACNL,YAAO0B,OAAOC,IAAI,MAAM,oBAAIC,IAAAA,CAAAA;AAC5B5B,YAAO6B,UAAUF,IAAI,MAAM,oBAAIG,IAAAA,CAAAA;EACjC;EAEA,WAAWC,iBAAiB;AApF9B;AAwFI,QAAI,SAAOC,gBAAWC,YAAXD,mBAAoBE,SAAQ,UAAU;AAC/C,aAAOlC,QAAOmC;IAChB;AAEA,UAAM,EAAED,IAAG,IAAKF,WAAWC,WAAW;MAAEC,KAAK,CAAC;IAAE;AAChD,WAAOA,IAAIE,UAAU,YAAYF,IAAIE,UAAU,OAAOpC,QAAOmC;EAC/D;EAEA,WAAWJ,eAAeM,UAAU;AAClCrC,YAAOmC,uBAAuBE;EAChC;EAEA,IAAI/B,QAAQ;AACV,WAAO,KAAKF,OAAOE;EACrB;EAEAgC,eAAeC,YAAqD;AAxGtE;AAyGI,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAElE,eAAWxC,aAAayC,iBAAiB;AACvC,WAAKG,kBAAkB,SAAS5C,SAAAA;AAEhC,UAAI,OAAOA,cAAc,YAAY,OAAOA,cAAc,YAAY,OAAOA,cAAc,UAAU;AACnG,cAAM4B,MAAM,KAAKiB,aAAa7C,SAAAA;AAC9B,YAAI4B,KAAK;AACPA,cAAIkB,MAAK;QACX;MACF,OAAO;AACL7C,sBAAO0B,OAAOoB,IAAI,IAAI,MAAtB9C,mBAAyB6C;AAEzB,mBAAW,CAAC9C,YAAWgD,SAAAA,KAAcC,SAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA,EAAGG,QAAO,GAAI;AACnFF,oBAAUF,MAAK;AACf7C,wBAAO6B,UAAUiB,IAAI,IAAI,MAAzB9C,mBAA4BkD,OAAOnD;QACrC;MACF;IACF;EACF;EAEA,MAAMoD,KAA0CpD,WAAuBqD,WAAmC;AACxG,UAAM,KAAKC,aAAatD,WAAWqD,SAAAA;EACrC;EAEA,MAAME,cAAkEvD,WAAuBqD,WAAkD;AAC/I,QAAItD,YAAYC,SAAAA,GAAY;AAC1B,UAAI;AACFC,gBAAOuD,oBAAoB;AAC3B,cAAM,KAAKC,sBAAsBzD,WAAWqD,SAAAA;MAC9C,UAAA;AACEpD,gBAAOuD,oBAAoB;MAC7B;IACF;EACF;EAEA,MAAME,WAAgD1D,WAAuBqD,WAAmC;AAC9G,QAAItD,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAUhE,2BAAAA;IACtB;AAEA,UAAMiE,cAAc,wBAACC,MAA8BC,WAAAA;AACjD,UAAIA,QAAQ;AACV,gBAAQ,OAAOA,QAAAA;UACb,KAAK,UAAU;AAEb,mBAAOhD,OAAOoC,QAAQW,IAAAA,EAAME,OAAO,CAACC,MAAM,CAACC,KAAKC,KAAAA,MAAaJ,OAAwCG,GAAAA,MAASC,QAAQ,OAAOF,MAAO,KAAA;UACtI;UACA,SAAS;AACP,mBAAOH,SAASC;UAClB;QACF;MACF;AACA,aAAO;IACT,GAboB;AAepB,SAAKlB,kBAAkB,cAAc5C,WAAWqD,SAAAA;AAEhD,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAC3CN,OAAO,CAACI,UAAWA,MAAMJ,SAASF,YAAYP,WAAWa,MAAMJ,MAAM,IAA8B,IAAA,EACnGO,IAAI,CAACC,SAASA,KAAKC,QAAQ;AAC9B,UAAMC,eAAevB,SAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB;SAAIF;;AAE/B,UAAM5E;AAEN,eAAW2E,YAAYE,iBAAiB;AACtC,YAAM,KAAKE,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;IACpD;AAEA,eAAWA,YAAYG,oBAAoB;AACzC,YAAM,KAAKE,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;IACvD;EACF;;EAGAM,cAAcrC,YAAsD;AAvLtE;AAwLI,UAAMC,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,QAAIsC,QAAQ;AAEZ,eAAW9E,aAAayC,iBAAiB;AACvC,UAAI,OAAOzC,cAAc,UAAU;AACjC8E,iBAAS7B,SAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA,EAAGgC,UAAQ,UAAKlC,aAAa7C,SAAAA,MAAlB,mBAA8B+E,SAAQ;AAEzF;MACF;AAEAD,eAAS7B,SAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA,EAAGgC;AAE3C,iBAAWb,SAASjB,SAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA,EAAGqB,OAAM,GAAI;AACjEU,iBAASZ,MAAMa;MACjB;IACF;AAEA,WAAOD;EACT;EAEAlC,kBAAgDnC,MAAcT,WAAwBqD,WAAuB;AA5M/G;AA6MI,QAAIpD,QAAO+B,oBAAkB,UAAKzB,UAAL,mBAAYyE,UAAS;AAChD,uBAAKzE,UAAL,mBAAYC,WAAZ,4BAAqBC,MAAM,KAAKF,MAAM0E,MAAMjF,WAAWqD;IACzD;EACF;EAEA6B,IACE1C,YACA+B,UACA;AACA,UAAM9B,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAWxC,aAAayC,iBAAiB;AACvC,YAAMb,MAAM,KAAKiB,aAAa7C,SAAAA;AAC9B,UAAI4B,KAAK;AACPA,YAAIuB,OAAOoB,QAAAA;AACX,YAAI3C,IAAImD,SAAS,GAAG;AAClB,gBAAMI,SAASlF,QAAO6B,UAAUiB,IAAI,IAAI;AACxCoC,2CAAQhC,OAAOnD;QACjB;MACF;AAEA,WAAK4C,kBAAkB,eAAe5C,SAAAA;AAEtC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BoF,eAAO,KAAK7B,cAAc,mBAAmB;UAAEvD;UAAWuE;QAAoC,CAAA,CAAA;MAChG;IACF;EACF;EAEAc,OAAOd,UAA4B;AACjC,SAAK3B,kBAAkB,gBAAA;AAEvB,UAAM0C,WAAWrF,QAAO0B,OAAOoB,IAAI,IAAI;AACvCuC,yCAAUnC,OAAOoB;AACjBa,WAAO,KAAK7B,cAAc,mBAAmB;MAAEgB;IAAuC,CAAA,CAAA;EACxF;EAEAgB,GACE/C,YACA+B,UACAT,QACA;AACA,UAAMrB,kBAAkBC,MAAMC,QAAQH,UAAAA,IAAcA,aAAa;MAACA;;AAClE,eAAWxC,aAAayC,iBAAiB;AACvC,UAAIb,MAAM,KAAKiB,aAAa7C,SAAAA;AAC5B,UAAI,CAAC4B,KAAK;AACRA,cAAM,oBAAIC,IAAAA;AACV,cAAMsD,SAASlF,QAAO6B,UAAUiB,IAAI,IAAI;AACxCoC,yCAAQvD,IAAI5B,WAAW4B;MACzB;AAEAA,UAAI4D,IAAI;QAAE1B;QAAQS;MAAoC,CAAA;AAEtD,WAAK3B,kBAAkB,aAAa5C,SAAAA;AAEpC,UAAI,CAACD,YAAYC,SAAAA,GAAY;AAC3BoF,eAAO,KAAK7B,cAAc,iBAAiB;UAAEvD;UAAWuE;QAAoC,CAAA,CAAA;MAC9F;IACF;AAEA,WAAO,KAAKW,IAAIO,KAAK,MAAMjD,YAAY+B,QAAAA;EACzC;EAEAmB,MAAMnB,UAA4B;AA3QpC;AA4QI,SAAK3B,kBAAkB,cAAA;AAEvB3C,kBAAO0B,OAAOoB,IAAI,IAAI,MAAtB9C,mBAAyBuF,IAAIjB;AAC7Ba,WAAO,KAAK7B,cAAc,iBAAiB;MAAEgB;IAAuC,CAAA,CAAA;AACpF,WAAO,KAAKc,OAAOI,KAAK,MAAMlB,QAAAA;EAChC;EAEAoB,KAA0C3F,WAAuBuE,UAAiD;AAChH,UAAMqB,cAAc,8BAAO/B,SAAAA;AACzB,WAAKqB,IAAIlF,WAAW4F,WAAAA;AACpB,YAAM,KAAKjB,iBAAiB3E,WAAW6D,MAAMU,QAAAA;IAC/C,GAHoB;AAIpB,SAAKgB,GAAGvF,WAAW4F,WAAAA;AACnB,WAAO,KAAKV,IAAIO,KAAK,MAAMzF,WAAW4F,WAAAA;EACxC;EAEA,MAActC,aACZtD,WACAqD,WACAS,QACA;AACA,QAAI/D,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAUhE,2BAAAA;IACtB;AAEA,SAAKiD,kBAAkB,QAAQ5C,WAAWqD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAAIN,OAAO,CAACI,UAAWJ,SAASI,MAAMK,WAAW,IAAA,EAAOF,IAAI,CAACC,SAASA,KAAKC,QAAQ;AACjI,UAAMC,eAAevB,SAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB3E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIwE;;AAE7D,UAAM5E;AACN,UAAMC,QAAQgG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEA,MAAcd,sBACZzD,WACAqD,WACA;AACA,QAAItD,YAAYC,SAAAA,KAAc,CAACC,QAAOuD,mBAAmB;AACvD,YAAM,IAAIG,UAAU,uEAAA;IACtB;AAEA,SAAKf,kBAAkB,QAAQ5C,WAAWqD,SAAAA;AAE1C,UAAML,YAAY,KAAKH,aAAa7C,SAAAA,KAAc,oBAAI6B,IAAAA;AACtD,UAAMsC,oBAAoB;SAAInB,UAAUoB,OAAM;MAAIC,IAAI,CAACC,SAASA,KAAKC,QAAQ;AAC7E,UAAMC,eAAevB,SAAShD,QAAO0B,OAAOoB,IAAI,IAAI,CAAA;AACpD,UAAM0B,kBAAkB;SAAIN;;AAC5B,UAAMO,qBAAqB3E,YAAYC,SAAAA,IAAa,CAAA,IAAK;SAAIwE;;AAE7D,UAAM5E;AACN,UAAMC,QAAQgG,IAAI;SACbpB,gBAAgBJ,IAAI,OAAOE,aAAAA;AAC5B,cAAM,KAAKI,iBAAiB3E,WAAWqD,WAAWkB,QAAAA;MACpD,CAAA;SACGG,mBAAmBL,IAAI,OAAOE,aAAAA;AAC/B,YAAIC,aAAasB,IAAIvB,QAAAA,GAAW;AAC9B,gBAAM,KAAKK,oBAAoB5E,WAAWqD,WAAWkB,QAAAA;QACvD;MACF,CAAA;KACD;EACH;EAEQ1B,aAAkD7C,WAAuB;AAC/E,UAAMmF,SAASlC,SAAShD,QAAO6B,UAAUiB,IAAI,IAAI,CAAA;AACjD,QAAI,CAACoC,OAAOW,IAAI9F,SAAAA,GAAY;AAC1B;IACF;AAEA,WAAOmF,OAAOpC,IAAI/C,SAAAA;EACpB;EAEA,MAAc4E,oBACZ5E,WACAqD,WACAkB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASvE,WAAWqD,SAAAA;IACnC,SAAS0C,IAAI;AACXC,kBAAYD,IAAI,CAACE,UAAAA;AAxWvB;AAyWQ,mBAAKzF,WAAL,mBAAayF,MAAM,YAAYC,OAAOlG,SAAAA,CAAAA,eAAyBiG,MAAME,OAAO;MAC9E,CAAA;IACF;EACF;EAEA,MAAcxB,iBACZ3E,WACAqD,WACAkB,UACA;AACA,QAAI;AACF,aAAO,MAAMA,SAASlB,SAAAA;IACxB,SAAS0C,IAAI;AACXC,kBAAYD,IAAI,CAACE,UAAAA;AAtXvB;AAuXQ,mBAAKzF,WAAL,mBAAayF,MAAM,YAAYC,OAAOlG,SAAAA,CAAAA,eAAyBiG,MAAME,OAAO;MAC9E,CAAA;IACF;EACF;AACF;AA1UsEjG;AACpE,cADWD,SACM0B,UAAS,oBAAIyE,QAAAA;AAC9B,cAFWnG,SAEM6B,aAAY,oBAAIsE,QAAAA;AAEjC,cAJWnG,SAIIuD,qBAAoB;AACnC,cALWvD,SAKImC,wBAAuB;AALjC,IAAMnC,SAAN;","names":["assertEx","handleError","forget","Base","NO_META_EVENT_ERROR_MESSAGE","resolvedPromise","Promise","resolve","isMetaEvent","eventName","Events","Base","eventData","constructor","params","mutatedParams","debug","logger","type","debugName","eventDataString","JSON","stringify","Object","keys","join","eventNameString","toString","currentTime","Date","logTime","getHours","getMinutes","getSeconds","getMilliseconds","log","anyMap","set","Set","eventsMap","Map","isDebugEnabled","globalThis","process","env","isGlobalDebugEnabled","DEBUG","newValue","clearListeners","eventNames","eventNamesArray","Array","isArray","logIfDebugEnabled","getListeners","clear","get","listeners","assertEx","entries","delete","emit","eventArgs","emitInternal","emitMetaEvent","canEmitMetaEvents","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","WeakMap"]}