@xylabs/events 5.0.82 → 5.0.84
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.
- package/README.md +192 -0
- package/dist/neutral/BaseEmitter.d.ts +52 -0
- package/dist/neutral/BaseEmitter.d.ts.map +1 -1
- package/dist/neutral/Events/Events.d.ts +67 -0
- package/dist/neutral/Events/Events.d.ts.map +1 -1
- package/dist/neutral/index.mjs +106 -0
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/model/Event.d.ts +13 -0
- package/dist/neutral/model/Event.d.ts.map +1 -1
- package/dist/neutral/model/EventEmitter.d.ts +11 -0
- package/dist/neutral/model/EventEmitter.d.ts.map +1 -1
- package/package.json +12 -12
|
@@ -2,21 +2,73 @@ import type { BaseParams } from '@xylabs/base';
|
|
|
2
2
|
import { Base } from '@xylabs/base';
|
|
3
3
|
import type { EmptyObject } from '@xylabs/object';
|
|
4
4
|
import type { EventAnyListener, EventData, EventEmitter, EventListener } from './model/index.ts';
|
|
5
|
+
/** Fields specific to BaseEmitter configuration parameters. */
|
|
5
6
|
export interface BaseEmitterParamsFields {
|
|
6
7
|
}
|
|
8
|
+
/** Parameters type for configuring a BaseEmitter instance. */
|
|
7
9
|
export type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>;
|
|
10
|
+
/**
|
|
11
|
+
* Base class that combines the Base utility class with typed event emission capabilities.
|
|
12
|
+
* Delegates all event operations to an internal Events instance.
|
|
13
|
+
*/
|
|
8
14
|
export declare class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData> extends Base<TParams> implements EventEmitter<TEventData> {
|
|
9
15
|
eventData: TEventData;
|
|
10
16
|
private events;
|
|
11
17
|
constructor(params: BaseParams<TParams>);
|
|
18
|
+
/**
|
|
19
|
+
* Removes all listeners for the specified event name(s).
|
|
20
|
+
* @param eventNames - One or more event names to clear listeners for.
|
|
21
|
+
* @returns This instance for chaining.
|
|
22
|
+
*/
|
|
12
23
|
clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]): this;
|
|
24
|
+
/**
|
|
25
|
+
* Emits an event, invoking all registered listeners concurrently.
|
|
26
|
+
* @param eventName - The event to emit.
|
|
27
|
+
* @param eventArgs - The data to pass to listeners.
|
|
28
|
+
*/
|
|
13
29
|
emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(eventName: TEventName, eventArgs: TEventArgs): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Emits an event, invoking all registered listeners sequentially in order.
|
|
32
|
+
* @param eventName - The event to emit.
|
|
33
|
+
* @param eventArgs - The data to pass to listeners.
|
|
34
|
+
*/
|
|
14
35
|
emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(eventName: TEventName, eventArgs: TEventArgs): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Returns the total number of listeners registered for the specified event name(s).
|
|
38
|
+
* @param eventNames - One or more event names to count listeners for.
|
|
39
|
+
* @returns The total listener count.
|
|
40
|
+
*/
|
|
15
41
|
listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]): number;
|
|
42
|
+
/**
|
|
43
|
+
* Removes a specific listener from the specified event name(s).
|
|
44
|
+
* @param eventNames - One or more event names to unsubscribe from.
|
|
45
|
+
* @param listener - The listener to remove.
|
|
46
|
+
*/
|
|
16
47
|
off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Removes a wildcard listener that was receiving all events.
|
|
50
|
+
* @param listener - The wildcard listener to remove.
|
|
51
|
+
*/
|
|
17
52
|
offAny(listener: EventAnyListener): void;
|
|
53
|
+
/**
|
|
54
|
+
* Subscribes a listener to the specified event name(s).
|
|
55
|
+
* @param eventNames - One or more event names to listen for.
|
|
56
|
+
* @param listener - The callback to invoke when the event fires.
|
|
57
|
+
* @returns An unsubscribe function.
|
|
58
|
+
*/
|
|
18
59
|
on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>): () => void;
|
|
60
|
+
/**
|
|
61
|
+
* Subscribes a wildcard listener that receives all events.
|
|
62
|
+
* @param listener - The callback to invoke for any event.
|
|
63
|
+
* @returns An unsubscribe function.
|
|
64
|
+
*/
|
|
19
65
|
onAny(listener: EventAnyListener): () => void;
|
|
66
|
+
/**
|
|
67
|
+
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
68
|
+
* @param eventName - The event to listen for.
|
|
69
|
+
* @param listener - The callback to invoke once.
|
|
70
|
+
* @returns An unsubscribe function.
|
|
71
|
+
*/
|
|
20
72
|
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>): () => void;
|
|
21
73
|
}
|
|
22
74
|
//# sourceMappingURL=BaseEmitter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseEmitter.d.ts","sourceRoot":"","sources":["../../src/BaseEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAGjD,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,YAAY,EACzC,aAAa,EACd,MAAM,kBAAkB,CAAA;AAEzB,MAAM,WAAW,uBAAuB;CAAG;AAE3C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,UAAU,CAAC,CAAC,GAAG,uBAAuB,GAAG,CAAC,CAAC,CAAA;AAEhH,qBAAa,WAAW,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,UAAU,SAAS,SAAS,GAAG,SAAS,CACxG,SAAQ,IAAI,CAAC,OAAO,CAAE,YAAW,YAAY,CAAC,UAAU,CAAC;IAEzD,SAAS,EAAS,UAAU,CAAA;IAE5B,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;IAKvC,cAAc,CAAC,UAAU,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE;IAKlE,IAAI,CAAC,UAAU,SAAS,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,UAAU,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,EAC7H,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU;IAKvB,UAAU,CAAC,UAAU,SAAS,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,UAAU,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,EACnI,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU;IAKvB,aAAa,CAAC,UAAU,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE;IAIjE,GAAG,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAI/H,MAAM,CAAC,QAAQ,EAAE,gBAAgB;IAIjC,EAAE,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAI9H,KAAK,CAAC,QAAQ,EAAE,gBAAgB;IAIhC,IAAI,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;CAGjH"}
|
|
1
|
+
{"version":3,"file":"BaseEmitter.d.ts","sourceRoot":"","sources":["../../src/BaseEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAGjD,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,YAAY,EACzC,aAAa,EACd,MAAM,kBAAkB,CAAA;AAEzB,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;CAAG;AAE3C,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,UAAU,CAAC,CAAC,GAAG,uBAAuB,GAAG,CAAC,CAAC,CAAA;AAEhH;;;GAGG;AACH,qBAAa,WAAW,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,EAAE,UAAU,SAAS,SAAS,GAAG,SAAS,CACxG,SAAQ,IAAI,CAAC,OAAO,CAAE,YAAW,YAAY,CAAC,UAAU,CAAC;IAEzD,SAAS,EAAS,UAAU,CAAA;IAE5B,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;IAKvC;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE;IAKlE;;;;OAIG;IACH,IAAI,CAAC,UAAU,SAAS,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,UAAU,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,EAC7H,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU;IAKvB;;;;OAIG;IACH,UAAU,CAAC,UAAU,SAAS,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,UAAU,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,EACnI,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU;IAKvB;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE;IAIjE;;;;OAIG;IACH,GAAG,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAI/H;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,gBAAgB;IAIjC;;;;;OAKG;IACH,EAAE,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAI9H;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,gBAAgB;IAIhC;;;;;OAKG;IACH,IAAI,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;CAGjH"}
|
|
@@ -10,6 +10,7 @@ on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for deb
|
|
|
10
10
|
See API for more information on how debugging works.
|
|
11
11
|
*/
|
|
12
12
|
export type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void;
|
|
13
|
+
/** Information about a registered event listener, including an optional filter for selective invocation. */
|
|
13
14
|
export type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {
|
|
14
15
|
filter?: TEventArgs;
|
|
15
16
|
listener: EventListener<TEventArgs>;
|
|
@@ -22,6 +23,7 @@ export type DebugOptions = {
|
|
|
22
23
|
logger?: DebugLogger;
|
|
23
24
|
readonly name: string;
|
|
24
25
|
};
|
|
26
|
+
/** Data shape for internal meta events that fire when listeners are added or removed. */
|
|
25
27
|
export type MetaEventData<TEventData extends EventData> = {
|
|
26
28
|
listenerAdded: {
|
|
27
29
|
eventName?: keyof TEventData;
|
|
@@ -32,9 +34,14 @@ export type MetaEventData<TEventData extends EventData> = {
|
|
|
32
34
|
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>;
|
|
33
35
|
};
|
|
34
36
|
};
|
|
37
|
+
/** Parameters for constructing an Events instance, with optional debug configuration. */
|
|
35
38
|
export type EventsParams = BaseParams<{
|
|
36
39
|
readonly debug?: DebugOptions;
|
|
37
40
|
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Core typed event emitter implementation supporting named events, wildcard listeners,
|
|
43
|
+
* serial and concurrent emission, listener filtering, and debug logging.
|
|
44
|
+
*/
|
|
38
45
|
export declare class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<TEventData> {
|
|
39
46
|
protected static anyMap: WeakMap<object, Set<EventAnyListener>>;
|
|
40
47
|
protected static eventsMap: WeakMap<object, Map<PropertyKey, Set<EventListenerInfo<EventArgs>>>>;
|
|
@@ -42,19 +49,79 @@ export declare class Events<TEventData extends EventData = EventData> extends Ba
|
|
|
42
49
|
eventData: TEventData;
|
|
43
50
|
private _canEmitMetaEvents;
|
|
44
51
|
constructor(params?: EventsParams);
|
|
52
|
+
/** Whether debug mode is enabled globally or via the DEBUG environment variable. */
|
|
45
53
|
static get isDebugEnabled(): boolean;
|
|
46
54
|
static set isDebugEnabled(newValue: boolean);
|
|
55
|
+
/** The debug configuration for this instance, if provided. */
|
|
47
56
|
get debug(): DebugOptions | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Removes all listeners for the specified event name(s).
|
|
59
|
+
* @param eventNames - One or more event names to clear listeners for.
|
|
60
|
+
*/
|
|
48
61
|
clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]): void;
|
|
62
|
+
/**
|
|
63
|
+
* Emits an event, invoking all registered listeners concurrently.
|
|
64
|
+
* @param eventName - The event to emit.
|
|
65
|
+
* @param eventArgs - The data to pass to listeners.
|
|
66
|
+
*/
|
|
49
67
|
emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Emits an internal meta event (listenerAdded or listenerRemoved).
|
|
70
|
+
* @param eventName - The meta event name.
|
|
71
|
+
* @param eventArgs - The meta event data containing listener and event information.
|
|
72
|
+
* @returns True if the meta event was emitted successfully.
|
|
73
|
+
*/
|
|
50
74
|
emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]): Promise<boolean | undefined>;
|
|
75
|
+
/**
|
|
76
|
+
* Emits an event, invoking all registered listeners sequentially in order.
|
|
77
|
+
* @param eventName - The event to emit.
|
|
78
|
+
* @param eventArgs - The data to pass to listeners.
|
|
79
|
+
*/
|
|
51
80
|
emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Returns the total number of listeners registered for the specified event name(s).
|
|
83
|
+
* @param eventNames - One or more event names to count listeners for.
|
|
84
|
+
* @returns The total listener count.
|
|
85
|
+
*/
|
|
52
86
|
listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]): number;
|
|
87
|
+
/**
|
|
88
|
+
* Logs debug information if debug mode is enabled.
|
|
89
|
+
* @param type - The type of operation being logged.
|
|
90
|
+
* @param eventName - The event name, if applicable.
|
|
91
|
+
* @param eventArgs - The event data, if applicable.
|
|
92
|
+
*/
|
|
53
93
|
logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs): void;
|
|
94
|
+
/**
|
|
95
|
+
* Removes a specific listener from the specified event name(s).
|
|
96
|
+
* @param eventNames - One or more event names to unsubscribe from.
|
|
97
|
+
* @param listener - The listener to remove.
|
|
98
|
+
*/
|
|
54
99
|
off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(eventNames: TEventName | TEventName[], listener: TEventListener): void;
|
|
100
|
+
/**
|
|
101
|
+
* Removes a wildcard listener that was receiving all events.
|
|
102
|
+
* @param listener - The wildcard listener to remove.
|
|
103
|
+
*/
|
|
55
104
|
offAny(listener: EventAnyListener): void;
|
|
105
|
+
/**
|
|
106
|
+
* Subscribes a listener to the specified event name(s).
|
|
107
|
+
* @param eventNames - One or more event names to listen for.
|
|
108
|
+
* @param listener - The callback to invoke when the event fires.
|
|
109
|
+
* @param filter - Optional filter to selectively invoke the listener based on event data.
|
|
110
|
+
* @returns An unsubscribe function.
|
|
111
|
+
*/
|
|
56
112
|
on<TEventName extends keyof TEventData = keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>, filter?: TEventData[TEventName]): () => void;
|
|
113
|
+
/**
|
|
114
|
+
* Subscribes a wildcard listener that receives all events.
|
|
115
|
+
* @param listener - The callback to invoke for any event.
|
|
116
|
+
* @returns An unsubscribe function.
|
|
117
|
+
*/
|
|
57
118
|
onAny(listener: EventAnyListener): () => void;
|
|
119
|
+
/**
|
|
120
|
+
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
121
|
+
* @param eventName - The event to listen for.
|
|
122
|
+
* @param listener - The callback to invoke once.
|
|
123
|
+
* @returns An unsubscribe function.
|
|
124
|
+
*/
|
|
58
125
|
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>): () => void;
|
|
59
126
|
private emitInternal;
|
|
60
127
|
private emitMetaEventInternal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKnC,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAC/E,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;EAOE;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;AAEjH,MAAM,MAAM,iBAAiB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI;IACxE,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CACpC,CAAA;AAID;;EAEE;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAID,MAAM,MAAM,aAAa,CAAC,UAAU,SAAS,SAAS,IAAI;IACxD,aAAa,EAAE;QACb,SAAS,CAAC,EAAE,MAAM,UAAU,CAAA;QAC5B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,CAAA;KACvG,CAAA;IACD,eAAe,EAAE;QACf,SAAS,CAAC,EAAE,MAAM,UAAU,CAAA;QAC5B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,CAAA;KACvG,CAAA;CACF,CAAA;AAID,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAAA;AAExE,qBAAa,MAAM,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,IAAI,CAAC,YAAY,CAAE,YAAW,YAAY,CAAC,UAAU,CAAC;IAC1H,SAAS,CAAC,MAAM,CAAC,MAAM,yCAA+C;IACtE,SAAS,CAAC,MAAM,CAAC,SAAS,uEAAgE;IAE1F,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAQ;IAG3C,SAAS,EAAS,UAAU,CAAA;IAE5B,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,MAAM,GAAE,YAAiB;IAyBrC,MAAM,KAAK,cAAc,YAUxB;IAED,MAAM,KAAK,cAAc,CAAC,QAAQ,SAAA,EAEjC;IAED,IAAI,KAAK,6BAER;IAED,cAAc,CAAC,UAAU,EAAE,MAAM,UAAU,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"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"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -38,6 +38,7 @@ var Events = class _Events extends Base {
|
|
|
38
38
|
_Events.anyMap.set(this, /* @__PURE__ */ new Set());
|
|
39
39
|
_Events.eventsMap.set(this, /* @__PURE__ */ new Map());
|
|
40
40
|
}
|
|
41
|
+
/** Whether debug mode is enabled globally or via the DEBUG environment variable. */
|
|
41
42
|
static get isDebugEnabled() {
|
|
42
43
|
if (typeof globalThis.process?.env !== "object") {
|
|
43
44
|
return _Events.isGlobalDebugEnabled;
|
|
@@ -48,9 +49,14 @@ var Events = class _Events extends Base {
|
|
|
48
49
|
static set isDebugEnabled(newValue) {
|
|
49
50
|
this.isGlobalDebugEnabled = newValue;
|
|
50
51
|
}
|
|
52
|
+
/** The debug configuration for this instance, if provided. */
|
|
51
53
|
get debug() {
|
|
52
54
|
return this.params.debug;
|
|
53
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Removes all listeners for the specified event name(s).
|
|
58
|
+
* @param eventNames - One or more event names to clear listeners for.
|
|
59
|
+
*/
|
|
54
60
|
clearListeners(eventNames) {
|
|
55
61
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
56
62
|
for (const eventName of eventNamesArray) {
|
|
@@ -69,9 +75,20 @@ var Events = class _Events extends Base {
|
|
|
69
75
|
}
|
|
70
76
|
}
|
|
71
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Emits an event, invoking all registered listeners concurrently.
|
|
80
|
+
* @param eventName - The event to emit.
|
|
81
|
+
* @param eventArgs - The data to pass to listeners.
|
|
82
|
+
*/
|
|
72
83
|
async emit(eventName, eventArgs) {
|
|
73
84
|
return await this.emitInternal(eventName, eventArgs);
|
|
74
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Emits an internal meta event (listenerAdded or listenerRemoved).
|
|
88
|
+
* @param eventName - The meta event name.
|
|
89
|
+
* @param eventArgs - The meta event data containing listener and event information.
|
|
90
|
+
* @returns True if the meta event was emitted successfully.
|
|
91
|
+
*/
|
|
75
92
|
async emitMetaEvent(eventName, eventArgs) {
|
|
76
93
|
if (isMetaEvent(eventName)) {
|
|
77
94
|
try {
|
|
@@ -84,6 +101,11 @@ var Events = class _Events extends Base {
|
|
|
84
101
|
}
|
|
85
102
|
}
|
|
86
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Emits an event, invoking all registered listeners sequentially in order.
|
|
106
|
+
* @param eventName - The event to emit.
|
|
107
|
+
* @param eventArgs - The data to pass to listeners.
|
|
108
|
+
*/
|
|
87
109
|
async emitSerial(eventName, eventArgs) {
|
|
88
110
|
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
89
111
|
throw new TypeError(NO_META_EVENT_ERROR_MESSAGE);
|
|
@@ -112,6 +134,11 @@ var Events = class _Events extends Base {
|
|
|
112
134
|
await this.safeCallAnyListener(eventName, eventArgs, listener);
|
|
113
135
|
}
|
|
114
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns the total number of listeners registered for the specified event name(s).
|
|
139
|
+
* @param eventNames - One or more event names to count listeners for.
|
|
140
|
+
* @returns The total listener count.
|
|
141
|
+
*/
|
|
115
142
|
// TODO: Make test for this
|
|
116
143
|
listenerCount(eventNames) {
|
|
117
144
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
@@ -128,11 +155,22 @@ var Events = class _Events extends Base {
|
|
|
128
155
|
}
|
|
129
156
|
return count;
|
|
130
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Logs debug information if debug mode is enabled.
|
|
160
|
+
* @param type - The type of operation being logged.
|
|
161
|
+
* @param eventName - The event name, if applicable.
|
|
162
|
+
* @param eventArgs - The event data, if applicable.
|
|
163
|
+
*/
|
|
131
164
|
logIfDebugEnabled(type, eventName, eventArgs) {
|
|
132
165
|
if (_Events.isDebugEnabled || this.debug?.enabled) {
|
|
133
166
|
this.debug?.logger?.(type, this.debug.name, eventName, eventArgs);
|
|
134
167
|
}
|
|
135
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Removes a specific listener from the specified event name(s).
|
|
171
|
+
* @param eventNames - One or more event names to unsubscribe from.
|
|
172
|
+
* @param listener - The listener to remove.
|
|
173
|
+
*/
|
|
136
174
|
off(eventNames, listener) {
|
|
137
175
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
138
176
|
for (const eventName of eventNamesArray) {
|
|
@@ -150,12 +188,23 @@ var Events = class _Events extends Base {
|
|
|
150
188
|
}
|
|
151
189
|
}
|
|
152
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Removes a wildcard listener that was receiving all events.
|
|
193
|
+
* @param listener - The wildcard listener to remove.
|
|
194
|
+
*/
|
|
153
195
|
offAny(listener) {
|
|
154
196
|
this.logIfDebugEnabled("unsubscribeAny");
|
|
155
197
|
const typedMap = _Events.anyMap.get(this);
|
|
156
198
|
typedMap?.delete(listener);
|
|
157
199
|
forget(this.emitMetaEvent("listenerRemoved", { listener }));
|
|
158
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Subscribes a listener to the specified event name(s).
|
|
203
|
+
* @param eventNames - One or more event names to listen for.
|
|
204
|
+
* @param listener - The callback to invoke when the event fires.
|
|
205
|
+
* @param filter - Optional filter to selectively invoke the listener based on event data.
|
|
206
|
+
* @returns An unsubscribe function.
|
|
207
|
+
*/
|
|
159
208
|
on(eventNames, listener, filter) {
|
|
160
209
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
161
210
|
for (const eventName of eventNamesArray) {
|
|
@@ -173,12 +222,23 @@ var Events = class _Events extends Base {
|
|
|
173
222
|
}
|
|
174
223
|
return this.off.bind(this, eventNames, listener);
|
|
175
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Subscribes a wildcard listener that receives all events.
|
|
227
|
+
* @param listener - The callback to invoke for any event.
|
|
228
|
+
* @returns An unsubscribe function.
|
|
229
|
+
*/
|
|
176
230
|
onAny(listener) {
|
|
177
231
|
this.logIfDebugEnabled("subscribeAny");
|
|
178
232
|
_Events.anyMap.get(this)?.add(listener);
|
|
179
233
|
forget(this.emitMetaEvent("listenerAdded", { listener }));
|
|
180
234
|
return this.offAny.bind(this, listener);
|
|
181
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
238
|
+
* @param eventName - The event to listen for.
|
|
239
|
+
* @param listener - The callback to invoke once.
|
|
240
|
+
* @returns An unsubscribe function.
|
|
241
|
+
*/
|
|
182
242
|
once(eventName, listener) {
|
|
183
243
|
const subListener = async (args) => {
|
|
184
244
|
this.off(eventName, subListener);
|
|
@@ -270,31 +330,77 @@ var BaseEmitter = class extends Base2 {
|
|
|
270
330
|
super(params);
|
|
271
331
|
this.events = new Events();
|
|
272
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* Removes all listeners for the specified event name(s).
|
|
335
|
+
* @param eventNames - One or more event names to clear listeners for.
|
|
336
|
+
* @returns This instance for chaining.
|
|
337
|
+
*/
|
|
273
338
|
clearListeners(eventNames) {
|
|
274
339
|
this.events.clearListeners(eventNames);
|
|
275
340
|
return this;
|
|
276
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* Emits an event, invoking all registered listeners concurrently.
|
|
344
|
+
* @param eventName - The event to emit.
|
|
345
|
+
* @param eventArgs - The data to pass to listeners.
|
|
346
|
+
*/
|
|
277
347
|
emit(eventName, eventArgs) {
|
|
278
348
|
return this.events.emit(eventName, eventArgs);
|
|
279
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* Emits an event, invoking all registered listeners sequentially in order.
|
|
352
|
+
* @param eventName - The event to emit.
|
|
353
|
+
* @param eventArgs - The data to pass to listeners.
|
|
354
|
+
*/
|
|
280
355
|
emitSerial(eventName, eventArgs) {
|
|
281
356
|
return this.events.emitSerial(eventName, eventArgs);
|
|
282
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Returns the total number of listeners registered for the specified event name(s).
|
|
360
|
+
* @param eventNames - One or more event names to count listeners for.
|
|
361
|
+
* @returns The total listener count.
|
|
362
|
+
*/
|
|
283
363
|
listenerCount(eventNames) {
|
|
284
364
|
return this.events.listenerCount(eventNames);
|
|
285
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* Removes a specific listener from the specified event name(s).
|
|
368
|
+
* @param eventNames - One or more event names to unsubscribe from.
|
|
369
|
+
* @param listener - The listener to remove.
|
|
370
|
+
*/
|
|
286
371
|
off(eventNames, listener) {
|
|
287
372
|
return this.events.off(eventNames, listener);
|
|
288
373
|
}
|
|
374
|
+
/**
|
|
375
|
+
* Removes a wildcard listener that was receiving all events.
|
|
376
|
+
* @param listener - The wildcard listener to remove.
|
|
377
|
+
*/
|
|
289
378
|
offAny(listener) {
|
|
290
379
|
return this.events.offAny(listener);
|
|
291
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Subscribes a listener to the specified event name(s).
|
|
383
|
+
* @param eventNames - One or more event names to listen for.
|
|
384
|
+
* @param listener - The callback to invoke when the event fires.
|
|
385
|
+
* @returns An unsubscribe function.
|
|
386
|
+
*/
|
|
292
387
|
on(eventNames, listener) {
|
|
293
388
|
return this.events.on(eventNames, listener);
|
|
294
389
|
}
|
|
390
|
+
/**
|
|
391
|
+
* Subscribes a wildcard listener that receives all events.
|
|
392
|
+
* @param listener - The callback to invoke for any event.
|
|
393
|
+
* @returns An unsubscribe function.
|
|
394
|
+
*/
|
|
295
395
|
onAny(listener) {
|
|
296
396
|
return this.events.onAny(listener);
|
|
297
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
400
|
+
* @param eventName - The event to listen for.
|
|
401
|
+
* @param listener - The callback to invoke once.
|
|
402
|
+
* @returns An unsubscribe function.
|
|
403
|
+
*/
|
|
298
404
|
once(eventName, listener) {
|
|
299
405
|
return this.events.once(eventName, listener);
|
|
300
406
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BaseEmitter.ts","../../src/Events/Events.ts"],"sourcesContent":["import type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport type { EmptyObject } from '@xylabs/object'\n\nimport { Events } from './Events/index.ts'\nimport type {\n EventAnyListener, EventData, EventEmitter,\n EventListener,\n} from './model/index.ts'\n\nexport interface BaseEmitterParamsFields {}\n\nexport type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>\n\nexport class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData>\n extends Base<TParams> implements EventEmitter<TEventData> {\n // just here to query types\n eventData = {} as TEventData\n\n private events: Events<TEventData>\n\n constructor(params: BaseParams<TParams>) {\n super(params)\n this.events = new Events<TEventData>()\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n this.events.clearListeners(eventNames)\n return this\n }\n\n emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emit(eventName, eventArgs)\n }\n\n emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emitSerial(eventName, eventArgs)\n }\n\n listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]) {\n return this.events.listenerCount(eventNames)\n }\n\n off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.off(eventNames, listener)\n }\n\n offAny(listener: EventAnyListener) {\n return this.events.offAny(listener)\n }\n\n on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.on(eventNames, listener)\n }\n\n onAny(listener: EventAnyListener) {\n return this.events.onAny(listener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n return this.events.once(eventName, listener)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { isDefined } from '@xylabs/typeof'\n\nimport type {\n EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName,\n} 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\non 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*/\n/* v8 ignore next 5 */\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 EventEmitter<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 isGlobalDebugEnabled = false\n\n // this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n private _canEmitMetaEvents = false\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\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n this.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 return 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 this._canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n return true\n } finally {\n this._canEmitMetaEvents = false\n return false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\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\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter(value => (isDefined(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> | undefined\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 /* v8 ignore next 3 -- meta events don't reach this path via public API */\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) && !this._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 /* v8 ignore start -- filter parameter is reserved for future use; anyListeners.has is a race condition guard */\n const filteredListeners = [...listeners.values()].filter(value => (isDefined(filter) ? isDefined(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 /* v8 ignore stop */\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !this._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 /* v8 ignore start -- race condition guard */\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n /* v8 ignore stop */\n ])\n return true\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":["Base","eventName","Base"]}
|
|
1
|
+
{"version":3,"sources":["../../src/BaseEmitter.ts","../../src/Events/Events.ts"],"sourcesContent":["import type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport type { EmptyObject } from '@xylabs/object'\n\nimport { Events } from './Events/index.ts'\nimport type {\n EventAnyListener, EventData, EventEmitter,\n EventListener,\n} from './model/index.ts'\n\n/** Fields specific to BaseEmitter configuration parameters. */\nexport interface BaseEmitterParamsFields {}\n\n/** Parameters type for configuring a BaseEmitter instance. */\nexport type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>\n\n/**\n * Base class that combines the Base utility class with typed event emission capabilities.\n * Delegates all event operations to an internal Events instance.\n */\nexport class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData>\n extends Base<TParams> implements EventEmitter<TEventData> {\n // just here to query types\n eventData = {} as TEventData\n\n private events: Events<TEventData>\n\n constructor(params: BaseParams<TParams>) {\n super(params)\n this.events = new Events<TEventData>()\n }\n\n /**\n * Removes all listeners for the specified event name(s).\n * @param eventNames - One or more event names to clear listeners for.\n * @returns This instance for chaining.\n */\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n this.events.clearListeners(eventNames)\n return this\n }\n\n /**\n * Emits an event, invoking all registered listeners concurrently.\n * @param eventName - The event to emit.\n * @param eventArgs - The data to pass to listeners.\n */\n emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emit(eventName, eventArgs)\n }\n\n /**\n * Emits an event, invoking all registered listeners sequentially in order.\n * @param eventName - The event to emit.\n * @param eventArgs - The data to pass to listeners.\n */\n emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emitSerial(eventName, eventArgs)\n }\n\n /**\n * Returns the total number of listeners registered for the specified event name(s).\n * @param eventNames - One or more event names to count listeners for.\n * @returns The total listener count.\n */\n listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]) {\n return this.events.listenerCount(eventNames)\n }\n\n /**\n * Removes a specific listener from the specified event name(s).\n * @param eventNames - One or more event names to unsubscribe from.\n * @param listener - The listener to remove.\n */\n off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.off(eventNames, listener)\n }\n\n /**\n * Removes a wildcard listener that was receiving all events.\n * @param listener - The wildcard listener to remove.\n */\n offAny(listener: EventAnyListener) {\n return this.events.offAny(listener)\n }\n\n /**\n * Subscribes a listener to the specified event name(s).\n * @param eventNames - One or more event names to listen for.\n * @param listener - The callback to invoke when the event fires.\n * @returns An unsubscribe function.\n */\n on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.on(eventNames, listener)\n }\n\n /**\n * Subscribes a wildcard listener that receives all events.\n * @param listener - The callback to invoke for any event.\n * @returns An unsubscribe function.\n */\n onAny(listener: EventAnyListener) {\n return this.events.onAny(listener)\n }\n\n /**\n * Subscribes a listener that will be invoked only once for the specified event, then automatically removed.\n * @param eventName - The event to listen for.\n * @param listener - The callback to invoke once.\n * @returns An unsubscribe function.\n */\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n return this.events.once(eventName, listener)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { isDefined } from '@xylabs/typeof'\n\nimport type {\n EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName,\n} 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\non 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\n/** Information about a registered event listener, including an optional filter for selective invocation. */\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*/\n/* v8 ignore next 5 */\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\n/** Data shape for internal meta events that fire when listeners are added or removed. */\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\n/** Parameters for constructing an Events instance, with optional debug configuration. */\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\n/**\n * Core typed event emitter implementation supporting named events, wildcard listeners,\n * serial and concurrent emission, listener filtering, and debug logging.\n */\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<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 isGlobalDebugEnabled = false\n\n // this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n private _canEmitMetaEvents = false\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 /** Whether debug mode is enabled globally or via the DEBUG environment variable. */\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\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n this.isGlobalDebugEnabled = newValue\n }\n\n /** The debug configuration for this instance, if provided. */\n get debug() {\n return this.params.debug\n }\n\n /**\n * Removes all listeners for the specified event name(s).\n * @param eventNames - One or more event names to clear listeners for.\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 /**\n * Emits an event, invoking all registered listeners concurrently.\n * @param eventName - The event to emit.\n * @param eventArgs - The data to pass to listeners.\n */\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n return await this.emitInternal(eventName, eventArgs)\n }\n\n /**\n * Emits an internal meta event (listenerAdded or listenerRemoved).\n * @param eventName - The meta event name.\n * @param eventArgs - The meta event data containing listener and event information.\n * @returns True if the meta event was emitted successfully.\n */\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n this._canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n return true\n } finally {\n this._canEmitMetaEvents = false\n return false\n }\n }\n }\n\n /**\n * Emits an event, invoking all registered listeners sequentially in order.\n * @param eventName - The event to emit.\n * @param eventArgs - The data to pass to listeners.\n */\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\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\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter(value => (isDefined(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 /**\n * Returns the total number of listeners registered for the specified event name(s).\n * @param eventNames - One or more event names to count listeners for.\n * @returns The total listener count.\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 /**\n * Logs debug information if debug mode is enabled.\n * @param type - The type of operation being logged.\n * @param eventName - The event name, if applicable.\n * @param eventArgs - The event data, if applicable.\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 /**\n * Removes a specific listener from the specified event name(s).\n * @param eventNames - One or more event names to unsubscribe from.\n * @param listener - The listener to remove.\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> | undefined\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 /* v8 ignore next 3 -- meta events don't reach this path via public API */\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n /**\n * Removes a wildcard listener that was receiving all events.\n * @param listener - The wildcard listener to remove.\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 /**\n * Subscribes a listener to the specified event name(s).\n * @param eventNames - One or more event names to listen for.\n * @param listener - The callback to invoke when the event fires.\n * @param filter - Optional filter to selectively invoke the listener based on event data.\n * @returns An unsubscribe function.\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 /**\n * Subscribes a wildcard listener that receives all events.\n * @param listener - The callback to invoke for any event.\n * @returns An unsubscribe function.\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 /**\n * Subscribes a listener that will be invoked only once for the specified event, then automatically removed.\n * @param eventName - The event to listen for.\n * @param listener - The callback to invoke once.\n * @returns An unsubscribe function.\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) && !this._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 /* v8 ignore start -- filter parameter is reserved for future use; anyListeners.has is a race condition guard */\n const filteredListeners = [...listeners.values()].filter(value => (isDefined(filter) ? isDefined(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 /* v8 ignore stop */\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !this._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 /* v8 ignore start -- race condition guard */\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n /* v8 ignore stop */\n ])\n return true\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":";AACA,SAAS,QAAAA,aAAY;;;ACDrB,SAAS,gBAAgB;AAEzB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAsB1B,IAAM,8BAA8B;AAYpC,IAAM,kBAAkB,QAAQ,QAAQ;AAcxC,IAAM,cAAc,CAAC,cAAyB,cAAc,mBAAmB,cAAc;AAStF,IAAM,SAAN,MAAM,gBAAyD,KAAuD;AAAA,EAC3H,OAAiB,SAAS,oBAAI,QAAuC;AAAA,EACrE,OAAiB,YAAY,oBAAI,QAAwD;AAAA,EAEzF,OAAe,uBAAuB;AAAA;AAAA,EAGtC,YAAY,CAAC;AAAA,EAEL,qBAAqB;AAAA,EAE7B,YAAY,SAAuB,CAAC,GAAG;AACrC,UAAM,gBAAgB,EAAE,GAAG,OAAO;AAClC,QAAI,cAAc,OAAO;AACvB,oBAAc,MAAM,SAChB,cAAc,MAAM,WAChB,CAAC,MAAc,WAAmB,WAAuB,cAA0B;AACrF,YAAI;AACJ,YAAI;AACF,4BAAkB,KAAK,UAAU,SAAS;AAAA,QAC5C,QAAQ;AACN,4BAAkB,uDAAuD,OAAO,KAAK,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,QACjH;AAEA,cAAM,kBAAkB,OAAO,cAAc,YAAY,OAAO,cAAc,WAAW,UAAU,SAAS,IAAI;AAEhH,cAAM,cAAc,oBAAI,KAAK;AAC7B,cAAM,UAAU,GAAG,YAAY,SAAS,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,YAAY,gBAAgB,CAAC;AAClI,aAAK,QAAQ,IAAI,IAAI,OAAO,YAAY,IAAI,KAAK,SAAS,iBAAiB,eAAe;AAAA,SAAa,eAAe,EAAE;AAAA,MAC1H;AAAA,IACN;AACA,UAAM,aAAa;AACnB,YAAO,OAAO,IAAI,MAAM,oBAAI,IAAsB,CAAC;AACnD,YAAO,UAAU,IAAI,MAAM,oBAAI,IAA8C,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,WAAW,iBAAiB;AAI1B,QAAI,OAAO,WAAW,SAAS,QAAQ,UAAU;AAC/C,aAAO,QAAO;AAAA,IAChB;AAEA,UAAM,EAAE,IAAI,IAAI,WAAW;AAC3B,WAAO,IAAI,UAAU,YAAY,IAAI,UAAU,OAAO,QAAO;AAAA,EAC/D;AAAA,EAEA,WAAW,eAAe,UAAU;AAClC,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA,EAGA,IAAI,QAAQ;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,YAAqD;AAClE,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAE5E,eAAW,aAAa,iBAAiB;AACvC,WAAK,kBAAkB,SAAS,SAAS;AAEzC,UAAI,OAAO,cAAc,YAAY,OAAO,cAAc,YAAY,OAAO,cAAc,UAAU;AACnG,cAAM,MAAM,KAAK,aAAa,SAAS;AACvC,YAAI,KAAK;AACP,cAAI,MAAM;AAAA,QACZ;AAAA,MACF,OAAO;AACL,gBAAO,OAAO,IAAI,IAAI,GAAG,MAAM;AAE/B,mBAAW,CAACC,YAAW,SAAS,KAAK,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC,EAAE,QAAQ,GAAG;AACnF,oBAAU,MAAM;AAChB,kBAAO,UAAU,IAAI,IAAI,GAAG,OAAOA,UAAS;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAA0C,WAAuB,WAAmC;AACxG,WAAO,MAAM,KAAK,aAAa,WAAW,SAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAkE,WAAuB,WAAkD;AAC/I,QAAI,YAAY,SAAS,GAAG;AAC1B,UAAI;AACF,aAAK,qBAAqB;AAC1B,cAAM,KAAK,sBAAsB,WAAW,SAAS;AACrD,eAAO;AAAA,MACT,UAAE;AACA,aAAK,qBAAqB;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAgD,WAAuB,WAAmC;AAC9G,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,2BAA2B;AAAA,IACjD;AAEA,UAAM,cAAc,CAAC,MAA8B,WAAmC;AACpF,cAAQ,OAAO,QAAQ;AAAA,QACrB,KAAK,UAAU;AAEb,iBAAO,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,MAAQ,OAAwC,GAAG,MAAM,QAAQ,OAAO,MAAO,KAAK;AAAA,QAC3I;AAAA,QACA,SAAS;AACP,iBAAO,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,cAAc,WAAW,SAAS;AAEzD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAC1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAC7C,OAAO,WAAU,UAAU,MAAM,MAAM,IAAI,YAAY,WAAW,MAAM,MAAgC,IAAI,IAAK,EACjH,IAAI,UAAQ,KAAK,QAAQ;AAC5B,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,CAAC,GAAG,YAAY;AAE3C,UAAM;AAEN,eAAW,YAAY,iBAAiB;AACtC,YAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,IAC5D;AAEA,eAAW,YAAY,oBAAoB;AACzC,YAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,YAAsD;AAClE,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,QAAI,QAAQ;AAEZ,eAAW,aAAa,iBAAiB;AACvC,UAAI,OAAO,cAAc,UAAU;AACjC,iBAAS,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,KAAK,aAAa,SAAS,GAAG,QAAQ;AAEzF;AAAA,MACF;AAEA,eAAS,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC,EAAE;AAE3C,iBAAW,SAAS,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC,EAAE,OAAO,GAAG;AACjE,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAgD,MAAc,WAAwB,WAAuB;AAC3G,QAAI,QAAO,kBAAkB,KAAK,OAAO,SAAS;AAChD,WAAK,OAAO,SAAS,MAAM,KAAK,MAAM,MAAM,WAAW,SAAS;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IACE,YACA,UACA;AACA,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,eAAW,aAAa,iBAAiB;AACvC,YAAM,MAAM,KAAK,aAAa,SAAS;AACvC,UAAI,KAAK;AACP,YAAI,OAAO,QAAQ;AACnB,YAAI,IAAI,SAAS,GAAG;AAClB,gBAAM,SAAS,QAAO,UAAU,IAAI,IAAI;AACxC,kBAAQ,OAAO,SAAS;AAAA,QAC1B;AAAA,MACF;AAEA,WAAK,kBAAkB,eAAe,SAAS;AAG/C,UAAI,CAAC,YAAY,SAAS,GAAG;AAC3B,eAAO,KAAK,cAAc,mBAAmB,EAAE,WAAW,SAAoC,CAAC,CAAC;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAA4B;AACjC,SAAK,kBAAkB,gBAAgB;AAEvC,UAAM,WAAW,QAAO,OAAO,IAAI,IAAI;AACvC,cAAU,OAAO,QAAQ;AACzB,WAAO,KAAK,cAAc,mBAAmB,EAAE,SAAuC,CAAC,CAAC;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GACE,YACA,UACA,QACA;AACA,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,eAAW,aAAa,iBAAiB;AACvC,UAAI,MAAM,KAAK,aAAa,SAAS;AACrC,UAAI,CAAC,KAAK;AACR,cAAM,oBAAI,IAAI;AACd,cAAM,SAAS,QAAO,UAAU,IAAI,IAAI;AACxC,gBAAQ,IAAI,WAAW,GAAG;AAAA,MAC5B;AAEA,UAAI,IAAI,EAAE,QAAQ,SAAoC,CAAC;AAEvD,WAAK,kBAAkB,aAAa,SAAS;AAE7C,UAAI,CAAC,YAAY,SAAS,GAAG;AAC3B,eAAO,KAAK,cAAc,iBAAiB,EAAE,WAAW,SAAoC,CAAC,CAAC;AAAA,MAChG;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,KAAK,MAAM,YAAY,QAAyB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA4B;AAChC,SAAK,kBAAkB,cAAc;AAErC,YAAO,OAAO,IAAI,IAAI,GAAG,IAAI,QAA4B;AACzD,WAAO,KAAK,cAAc,iBAAiB,EAAE,SAAuC,CAAC,CAAC;AACtF,WAAO,KAAK,OAAO,KAAK,MAAM,QAA4B;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAA0C,WAAuB,UAAiD;AAChH,UAAM,cAAc,OAAO,SAAiC;AAC1D,WAAK,IAAI,WAAW,WAAW;AAC/B,YAAM,KAAK,iBAAiB,WAAW,MAAM,QAAQ;AAAA,IACvD;AACA,SAAK,GAAG,WAAW,WAAW;AAC9B,WAAO,KAAK,IAAI,KAAK,MAAM,WAAW,WAA4B;AAAA,EACpE;AAAA,EAEA,MAAc,aACZ,WACA,WACA,QACA;AACA,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,2BAA2B;AAAA,IACjD;AAEA,SAAK,kBAAkB,QAAQ,WAAW,SAAS;AAEnD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAE1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,OAAO,WAAU,UAAU,MAAM,IAAI,UAAU,MAAM,QAAQ,IAAI,IAAK,EAAE,IAAI,UAAQ,KAAK,QAAQ;AACnJ,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,YAAY,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY;AAEzE,UAAM;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,GAAG,gBAAgB,IAAI,OAAO,aAAa;AACzC,cAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,MAC5D,CAAC;AAAA,MACD,GAAG,mBAAmB,IAAI,OAAO,aAAa;AAC5C,YAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,gBAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EAEH;AAAA,EAEA,MAAc,sBACZ,WACA,WACA;AACA,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,uEAAuE;AAAA,IAC7F;AAEA,SAAK,kBAAkB,QAAQ,WAAW,SAAS;AAEnD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAC1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,IAAI,UAAQ,KAAK,QAAQ;AAC3E,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,YAAY,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY;AAEzE,UAAM;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,GAAG,gBAAgB,IAAI,OAAO,aAAa;AACzC,cAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,MAC5D,CAAC;AAAA;AAAA,MAED,GAAG,mBAAmB,IAAI,OAAO,aAAa;AAC5C,YAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,gBAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA;AAAA,IAEH,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,aAAkD,WAAuB;AAC/E,UAAM,SAAS,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC;AAClD,QAAI,CAAC,OAAO,IAAI,SAAS,GAAG;AAC1B;AAAA,IACF;AAEA,WAAO,OAAO,IAAI,SAAS;AAAA,EAC7B;AAAA,EAEA,MAAc,oBACZ,WACA,WACA,UACA;AACA,QAAI;AACF,aAAO,MAAM,SAAS,WAAW,SAAS;AAAA,IAC5C,SAAS,IAAI;AACX,kBAAY,IAAI,CAAC,UAAU;AACzB,aAAK,QAAQ,MAAM,YAAY,OAAO,SAAS,CAAC,eAAe,MAAM,OAAO,EAAE;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,WACA,WACA,UACA;AACA,QAAI;AACF,aAAO,MAAM,SAAS,SAAS;AAAA,IACjC,SAAS,IAAI;AACX,kBAAY,IAAI,CAAC,UAAU;AACzB,aAAK,QAAQ,MAAM,YAAY,OAAO,SAAS,CAAC,eAAe,MAAM,OAAO,EAAE;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ADtbO,IAAM,cAAN,cACGC,MAAkD;AAAA;AAAA,EAE1D,YAAY,CAAC;AAAA,EAEL;AAAA,EAER,YAAY,QAA6B;AACvC,UAAM,MAAM;AACZ,SAAK,SAAS,IAAI,OAAmB;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,YAAqD;AAClE,SAAK,OAAO,eAAe,UAAU;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KACE,WACA,WACA;AACA,WAAO,KAAK,OAAO,KAAK,WAAW,SAAS;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WACE,WACA,WACA;AACA,WAAO,KAAK,OAAO,WAAW,WAAW,SAAS;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,YAAqD;AACjE,WAAO,KAAK,OAAO,cAAc,UAAU;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAyC,YAAuC,UAAiD;AAC/H,WAAO,KAAK,OAAO,IAAI,YAAY,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAA4B;AACjC,WAAO,KAAK,OAAO,OAAO,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAwC,YAAuC,UAAiD;AAC9H,WAAO,KAAK,OAAO,GAAG,YAAY,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA4B;AAChC,WAAO,KAAK,OAAO,MAAM,QAAQ;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAA0C,WAAuB,UAAiD;AAChH,WAAO,KAAK,OAAO,KAAK,WAAW,QAAQ;AAAA,EAC7C;AACF;","names":["Base","eventName","Base"]}
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import type { Promisable } from '@xylabs/promise';
|
|
2
|
+
/** A valid event name, which can be any property key (string, number, or symbol). */
|
|
2
3
|
export type EventName = PropertyKey;
|
|
4
|
+
/** The allowed types for event argument payloads. */
|
|
3
5
|
export type EventArgs = string | number | object;
|
|
6
|
+
/** A mapping of event names to their corresponding event argument types. */
|
|
4
7
|
export type EventData = {
|
|
5
8
|
[key: EventName]: EventArgs;
|
|
6
9
|
};
|
|
10
|
+
/** A function returned by event subscription methods that unsubscribes the listener when called. */
|
|
7
11
|
export type EventUnsubscribeFunction = () => void;
|
|
12
|
+
/**
|
|
13
|
+
* A listener that receives all events regardless of name.
|
|
14
|
+
* @param eventName - The name of the emitted event.
|
|
15
|
+
* @param eventData - The data associated with the event.
|
|
16
|
+
*/
|
|
8
17
|
export type EventAnyListener<TEventArgs extends EventArgs = EventArgs> = (eventName: EventName, eventData: TEventArgs) => Promisable<void>;
|
|
18
|
+
/**
|
|
19
|
+
* A listener for a specific event type.
|
|
20
|
+
* @param eventData - The data associated with the event.
|
|
21
|
+
*/
|
|
9
22
|
export type EventListener<TEventArgs extends EventArgs = EventArgs> = (eventData: TEventArgs) => Promisable<void>;
|
|
10
23
|
//# sourceMappingURL=Event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../src/model/Event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,SAAS,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../src/model/Event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,qFAAqF;AACrF,MAAM,MAAM,SAAS,GAAG,WAAW,CAAA;AAEnC,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEhD,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAA;AAEvD,oGAAoG;AACpG,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA;AAE1I;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import type { EventAnyListener, EventData, EventListener, EventUnsubscribeFunction } from './Event.ts';
|
|
2
|
+
/** Interface for a typed event emitter that supports subscribing, unsubscribing, and emitting events. */
|
|
2
3
|
export interface EventEmitter<T extends EventData> {
|
|
4
|
+
/** Type-level reference to the event data shape for external type queries. */
|
|
3
5
|
eventData: T;
|
|
6
|
+
/** Removes all listeners for the specified event name(s). */
|
|
4
7
|
clearListeners(eventNames: keyof T | (keyof T)[]): void;
|
|
8
|
+
/** Emits an event, invoking all registered listeners concurrently. */
|
|
5
9
|
emit<TEventName extends keyof T>(eventName: TEventName, eventArgs: T[TEventName]): Promise<void>;
|
|
10
|
+
/** Emits an event, invoking all registered listeners sequentially in order. */
|
|
6
11
|
emitSerial<TEventName extends keyof T>(eventName: TEventName, eventArgs: T[TEventName]): Promise<void>;
|
|
12
|
+
/** Returns the total number of listeners registered for the specified event name(s). */
|
|
7
13
|
listenerCount(eventNames: keyof T | (keyof T)[]): number;
|
|
14
|
+
/** Removes a specific listener from the specified event name(s). */
|
|
8
15
|
off<TEventName extends keyof T>(eventNames: TEventName | TEventName[], listener: EventListener<T[TEventName]>): void;
|
|
16
|
+
/** Removes a wildcard listener that was receiving all events. */
|
|
9
17
|
offAny(listener: EventAnyListener | Promise<void>): void;
|
|
18
|
+
/** Subscribes a listener to the specified event name(s) and returns an unsubscribe function. */
|
|
10
19
|
on<TEventName extends keyof T>(eventNames: TEventName | TEventName[], listener: EventListener<T[TEventName]>): EventUnsubscribeFunction;
|
|
20
|
+
/** Subscribes a wildcard listener that receives all events and returns an unsubscribe function. */
|
|
11
21
|
onAny(listener: EventAnyListener): EventUnsubscribeFunction;
|
|
22
|
+
/** Subscribes a listener that will be invoked only once for the specified event, then automatically removed. */
|
|
12
23
|
once<TEventName extends keyof T>(eventName: TEventName, listener: EventListener<T[TEventName]>): EventUnsubscribeFunction;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=EventEmitter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../../src/model/EventEmitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,wBAAwB,EACrE,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS;IAC/C,SAAS,EAAE,CAAC,CAAA;IACZ,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAAA;IACvD,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,UAAU,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAA;IACxD,GAAG,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;IACpH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,EAAE,CAAC,UAAU,SAAS,MAAM,CAAC,EAC3B,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EACrC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GACrC,wBAAwB,CAAA;IAC3B,KAAK,CAAC,QAAQ,EAAE,gBAAgB,GAAG,wBAAwB,CAAA;IAC3D,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,wBAAwB,CAAA;CAC1H"}
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../../src/model/EventEmitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,wBAAwB,EACrE,MAAM,YAAY,CAAA;AAEnB,yGAAyG;AACzG,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS;IAC/C,8EAA8E;IAC9E,SAAS,EAAE,CAAC,CAAA;IACZ,6DAA6D;IAC7D,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAAA;IACvD,sEAAsE;IACtE,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,+EAA+E;IAC/E,UAAU,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtG,wFAAwF;IACxF,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAA;IACxD,oEAAoE;IACpE,GAAG,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;IACpH,iEAAiE;IACjE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,gGAAgG;IAChG,EAAE,CAAC,UAAU,SAAS,MAAM,CAAC,EAC3B,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EACrC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GACrC,wBAAwB,CAAA;IAC3B,mGAAmG;IACnG,KAAK,CAAC,QAAQ,EAAE,gBAAgB,GAAG,wBAAwB,CAAA;IAC3D,gHAAgH;IAChH,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,wBAAwB,CAAA;CAC1H"}
|