@xyo-network/module-events 2.75.0 → 2.75.2
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/dist/browser/Events/Events.d.cts +63 -0
- package/dist/browser/Events/Events.d.cts.map +1 -0
- package/dist/browser/Events/Events.js +29 -30
- package/dist/browser/Events/Events.js.map +1 -1
- package/dist/browser/Events/index.d.cts +2 -0
- package/dist/browser/Events/index.d.cts.map +1 -0
- package/dist/browser/Events/index.js +1 -261
- package/dist/browser/Events/index.js.map +1 -1
- package/dist/browser/index.d.cts +3 -0
- package/dist/browser/index.d.cts.map +1 -0
- package/dist/browser/index.js +2 -261
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/model/Event.d.cts +22 -0
- package/dist/browser/model/Event.d.cts.map +1 -0
- package/dist/browser/model/index.d.cts +2 -0
- package/dist/browser/model/index.d.cts.map +1 -0
- package/dist/browser/model/index.js +1 -0
- package/dist/browser/model/index.js.map +1 -1
- package/dist/docs.json +5785 -0
- package/dist/node/Events/Events.d.cts +63 -0
- package/dist/node/Events/Events.d.cts.map +1 -0
- package/dist/node/Events/Events.js +45 -36
- package/dist/node/Events/Events.js.map +1 -1
- package/dist/node/Events/Events.mjs +44 -36
- package/dist/node/Events/Events.mjs.map +1 -1
- package/dist/node/Events/index.d.cts +2 -0
- package/dist/node/Events/index.d.cts.map +1 -0
- package/dist/node/Events/index.js +276 -3
- package/dist/node/Events/index.js.map +1 -1
- package/dist/node/Events/index.mjs +268 -1
- package/dist/node/Events/index.mjs.map +1 -1
- package/dist/node/index.d.cts +3 -0
- package/dist/node/index.d.cts.map +1 -0
- package/dist/node/index.js +276 -5
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +268 -2
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/model/Event.d.cts +22 -0
- package/dist/node/model/Event.d.cts.map +1 -0
- package/dist/node/model/Event.js +2 -0
- package/dist/node/model/Event.js.map +1 -1
- package/dist/node/model/index.d.cts +2 -0
- package/dist/node/model/index.d.cts.map +1 -0
- package/dist/node/model/index.js +2 -6
- package/dist/node/model/index.js.map +1 -1
- package/dist/node/model/index.mjs +0 -1
- package/dist/node/model/index.mjs.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Base, BaseParams } from '@xyo-network/core';
|
|
2
|
+
import { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model';
|
|
3
|
+
/**
|
|
4
|
+
Emittery can collect and log debug information.
|
|
5
|
+
|
|
6
|
+
To 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.
|
|
7
|
+
|
|
8
|
+
See API for more information on how debugging works.
|
|
9
|
+
*/
|
|
10
|
+
export type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void;
|
|
11
|
+
export type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {
|
|
12
|
+
filter?: TEventArgs;
|
|
13
|
+
listener: EventListener<TEventArgs>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
Configure debug options of an instance.
|
|
17
|
+
*/
|
|
18
|
+
export type DebugOptions = {
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
logger?: DebugLogger;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
};
|
|
23
|
+
export type MetaEventData<TEventData extends EventData> = {
|
|
24
|
+
listenerAdded: {
|
|
25
|
+
eventName?: keyof TEventData;
|
|
26
|
+
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>;
|
|
27
|
+
};
|
|
28
|
+
listenerRemoved: {
|
|
29
|
+
eventName?: keyof TEventData;
|
|
30
|
+
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
export type EventsParams = BaseParams<{
|
|
34
|
+
readonly debug?: DebugOptions;
|
|
35
|
+
}>;
|
|
36
|
+
export declare class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventFunctions<TEventData> {
|
|
37
|
+
protected static anyMap: WeakMap<object, Set<EventAnyListener>>;
|
|
38
|
+
protected static eventsMap: WeakMap<object, Map<PropertyKey, Set<EventListenerInfo<EventArgs>>>>;
|
|
39
|
+
private static canEmitMetaEvents;
|
|
40
|
+
private static isGlobalDebugEnabled;
|
|
41
|
+
eventData: TEventData;
|
|
42
|
+
constructor(params?: EventsParams);
|
|
43
|
+
static get isDebugEnabled(): boolean;
|
|
44
|
+
static set isDebugEnabled(newValue: boolean);
|
|
45
|
+
get debug(): DebugOptions | undefined;
|
|
46
|
+
clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]): void;
|
|
47
|
+
emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]): Promise<void>;
|
|
48
|
+
emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]): Promise<void>;
|
|
49
|
+
emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]): Promise<void>;
|
|
50
|
+
listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]): number;
|
|
51
|
+
logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs): void;
|
|
52
|
+
off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(eventNames: TEventName | TEventName[], listener: TEventListener): void;
|
|
53
|
+
offAny(listener: EventAnyListener): void;
|
|
54
|
+
on<TEventName extends keyof TEventData = keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>, filter?: TEventData[TEventName]): () => void;
|
|
55
|
+
onAny(listener: EventAnyListener): () => void;
|
|
56
|
+
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>): () => void;
|
|
57
|
+
private emitInternal;
|
|
58
|
+
private emitMetaEventInternal;
|
|
59
|
+
private getListeners;
|
|
60
|
+
private safeCallAnyListener;
|
|
61
|
+
private safeCallListener;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/Events/Events.ts
|
|
19
21
|
var Events_exports = {};
|
|
20
22
|
__export(Events_exports, {
|
|
21
23
|
Events: () => Events
|
|
@@ -25,9 +27,9 @@ var import_assert = require("@xylabs/assert");
|
|
|
25
27
|
var import_forget = require("@xylabs/forget");
|
|
26
28
|
var import_core = require("@xyo-network/core");
|
|
27
29
|
var import_error = require("@xyo-network/error");
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
var resolvedPromise = Promise.resolve();
|
|
31
|
+
var isMetaEvent = (eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved";
|
|
32
|
+
var Events = class _Events extends import_core.Base {
|
|
31
33
|
static anyMap = /* @__PURE__ */ new WeakMap();
|
|
32
34
|
static eventsMap = /* @__PURE__ */ new WeakMap();
|
|
33
35
|
static canEmitMetaEvents = false;
|
|
@@ -57,23 +59,25 @@ class Events extends import_core.Base {
|
|
|
57
59
|
});
|
|
58
60
|
}
|
|
59
61
|
super(mutatedParams);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
_Events.anyMap.set(this, /* @__PURE__ */ new Set());
|
|
63
|
+
_Events.eventsMap.set(this, /* @__PURE__ */ new Map());
|
|
62
64
|
}
|
|
63
65
|
static get isDebugEnabled() {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
var _a;
|
|
67
|
+
if (typeof ((_a = globalThis.process) == null ? void 0 : _a.env) !== "object") {
|
|
68
|
+
return _Events.isGlobalDebugEnabled;
|
|
66
69
|
}
|
|
67
70
|
const { env } = globalThis.process ?? { env: {} };
|
|
68
|
-
return env.DEBUG === "events" || env.DEBUG === "*" ||
|
|
71
|
+
return env.DEBUG === "events" || env.DEBUG === "*" || _Events.isGlobalDebugEnabled;
|
|
69
72
|
}
|
|
70
73
|
static set isDebugEnabled(newValue) {
|
|
71
|
-
|
|
74
|
+
_Events.isGlobalDebugEnabled = newValue;
|
|
72
75
|
}
|
|
73
76
|
get debug() {
|
|
74
77
|
return this.params.debug;
|
|
75
78
|
}
|
|
76
79
|
clearListeners(eventNames) {
|
|
80
|
+
var _a, _b;
|
|
77
81
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
78
82
|
for (const eventName of eventNamesArray) {
|
|
79
83
|
this.logIfDebugEnabled("clear", eventName, void 0);
|
|
@@ -83,10 +87,10 @@ class Events extends import_core.Base {
|
|
|
83
87
|
set.clear();
|
|
84
88
|
}
|
|
85
89
|
} else {
|
|
86
|
-
|
|
87
|
-
for (const [eventName2, listeners] of (0, import_assert.assertEx)(
|
|
90
|
+
(_a = _Events.anyMap.get(this)) == null ? void 0 : _a.clear();
|
|
91
|
+
for (const [eventName2, listeners] of (0, import_assert.assertEx)(_Events.eventsMap.get(this)).entries()) {
|
|
88
92
|
listeners.clear();
|
|
89
|
-
|
|
93
|
+
(_b = _Events.eventsMap.get(this)) == null ? void 0 : _b.delete(eventName2);
|
|
90
94
|
}
|
|
91
95
|
}
|
|
92
96
|
}
|
|
@@ -97,15 +101,15 @@ class Events extends import_core.Base {
|
|
|
97
101
|
async emitMetaEvent(eventName, eventArgs) {
|
|
98
102
|
if (isMetaEvent(eventName)) {
|
|
99
103
|
try {
|
|
100
|
-
|
|
104
|
+
_Events.canEmitMetaEvents = true;
|
|
101
105
|
await this.emitMetaEventInternal(eventName, eventArgs);
|
|
102
106
|
} finally {
|
|
103
|
-
|
|
107
|
+
_Events.canEmitMetaEvents = false;
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
}
|
|
107
111
|
async emitSerial(eventName, eventArgs) {
|
|
108
|
-
if (isMetaEvent(eventName) && !
|
|
112
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
109
113
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
110
114
|
}
|
|
111
115
|
const filterMatch = (args, filter) => {
|
|
@@ -122,7 +126,7 @@ class Events extends import_core.Base {
|
|
|
122
126
|
this.logIfDebugEnabled("emitSerial", eventName, eventArgs);
|
|
123
127
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
124
128
|
const filteredListeners = [...listeners.values()].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
|
|
125
|
-
const anyListeners = (0, import_assert.assertEx)(
|
|
129
|
+
const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
|
|
126
130
|
const staticListeners = [...filteredListeners];
|
|
127
131
|
const staticAnyListeners = [...anyListeners];
|
|
128
132
|
await resolvedPromise;
|
|
@@ -135,23 +139,25 @@ class Events extends import_core.Base {
|
|
|
135
139
|
}
|
|
136
140
|
//TODO: Make test for this
|
|
137
141
|
listenerCount(eventNames) {
|
|
142
|
+
var _a;
|
|
138
143
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
139
144
|
let count = 0;
|
|
140
145
|
for (const eventName of eventNamesArray) {
|
|
141
146
|
if (typeof eventName === "string") {
|
|
142
|
-
count += (0, import_assert.assertEx)(
|
|
147
|
+
count += (0, import_assert.assertEx)(_Events.anyMap.get(this)).size + (((_a = this.getListeners(eventName)) == null ? void 0 : _a.size) ?? 0);
|
|
143
148
|
continue;
|
|
144
149
|
}
|
|
145
|
-
count += (0, import_assert.assertEx)(
|
|
146
|
-
for (const value of (0, import_assert.assertEx)(
|
|
150
|
+
count += (0, import_assert.assertEx)(_Events.anyMap.get(this)).size;
|
|
151
|
+
for (const value of (0, import_assert.assertEx)(_Events.eventsMap.get(this)).values()) {
|
|
147
152
|
count += value.size;
|
|
148
153
|
}
|
|
149
154
|
}
|
|
150
155
|
return count;
|
|
151
156
|
}
|
|
152
157
|
logIfDebugEnabled(type, eventName, eventArgs) {
|
|
153
|
-
|
|
154
|
-
|
|
158
|
+
var _a, _b, _c;
|
|
159
|
+
if (_Events.isDebugEnabled || ((_a = this.debug) == null ? void 0 : _a.enabled)) {
|
|
160
|
+
(_c = (_b = this.debug) == null ? void 0 : _b.logger) == null ? void 0 : _c.call(_b, type, this.debug.name, eventName, eventArgs);
|
|
155
161
|
}
|
|
156
162
|
}
|
|
157
163
|
off(eventNames, listener) {
|
|
@@ -161,8 +167,8 @@ class Events extends import_core.Base {
|
|
|
161
167
|
if (set) {
|
|
162
168
|
set.delete(listener);
|
|
163
169
|
if (set.size === 0) {
|
|
164
|
-
const events =
|
|
165
|
-
events
|
|
170
|
+
const events = _Events.eventsMap.get(this);
|
|
171
|
+
events == null ? void 0 : events.delete(eventName);
|
|
166
172
|
}
|
|
167
173
|
}
|
|
168
174
|
this.logIfDebugEnabled("unsubscribe", eventName, void 0);
|
|
@@ -173,8 +179,8 @@ class Events extends import_core.Base {
|
|
|
173
179
|
}
|
|
174
180
|
offAny(listener) {
|
|
175
181
|
this.logIfDebugEnabled("unsubscribeAny", void 0, void 0);
|
|
176
|
-
const typedMap =
|
|
177
|
-
typedMap
|
|
182
|
+
const typedMap = _Events.anyMap.get(this);
|
|
183
|
+
typedMap == null ? void 0 : typedMap.delete(listener);
|
|
178
184
|
(0, import_forget.forget)(this.emitMetaEvent("listenerRemoved", { listener }));
|
|
179
185
|
}
|
|
180
186
|
on(eventNames, listener, filter) {
|
|
@@ -183,8 +189,8 @@ class Events extends import_core.Base {
|
|
|
183
189
|
let set = this.getListeners(eventName);
|
|
184
190
|
if (!set) {
|
|
185
191
|
set = /* @__PURE__ */ new Set();
|
|
186
|
-
const events =
|
|
187
|
-
events
|
|
192
|
+
const events = _Events.eventsMap.get(this);
|
|
193
|
+
events == null ? void 0 : events.set(eventName, set);
|
|
188
194
|
}
|
|
189
195
|
set.add({ filter, listener });
|
|
190
196
|
this.logIfDebugEnabled("subscribe", eventName, void 0);
|
|
@@ -195,8 +201,9 @@ class Events extends import_core.Base {
|
|
|
195
201
|
return this.off.bind(this, eventNames, listener);
|
|
196
202
|
}
|
|
197
203
|
onAny(listener) {
|
|
204
|
+
var _a;
|
|
198
205
|
this.logIfDebugEnabled("subscribeAny", void 0, void 0);
|
|
199
|
-
|
|
206
|
+
(_a = _Events.anyMap.get(this)) == null ? void 0 : _a.add(listener);
|
|
200
207
|
(0, import_forget.forget)(this.emitMetaEvent("listenerAdded", { listener }));
|
|
201
208
|
return this.offAny.bind(this, listener);
|
|
202
209
|
}
|
|
@@ -209,13 +216,13 @@ class Events extends import_core.Base {
|
|
|
209
216
|
return this.off.bind(this, eventName, subListener);
|
|
210
217
|
}
|
|
211
218
|
async emitInternal(eventName, eventArgs, filter) {
|
|
212
|
-
if (isMetaEvent(eventName) && !
|
|
219
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
213
220
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
214
221
|
}
|
|
215
222
|
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
216
223
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
217
224
|
const filteredListeners = [...listeners.values()].filter((value) => filter ? value.listener : true).map((info) => info.listener);
|
|
218
|
-
const anyListeners = (0, import_assert.assertEx)(
|
|
225
|
+
const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
|
|
219
226
|
const staticListeners = [...filteredListeners];
|
|
220
227
|
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
221
228
|
await resolvedPromise;
|
|
@@ -231,13 +238,13 @@ class Events extends import_core.Base {
|
|
|
231
238
|
]);
|
|
232
239
|
}
|
|
233
240
|
async emitMetaEventInternal(eventName, eventArgs) {
|
|
234
|
-
if (isMetaEvent(eventName) && !
|
|
241
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
235
242
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
236
243
|
}
|
|
237
244
|
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
238
245
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
239
246
|
const filteredListeners = [...listeners.values()].map((info) => info.listener);
|
|
240
|
-
const anyListeners = (0, import_assert.assertEx)(
|
|
247
|
+
const anyListeners = (0, import_assert.assertEx)(_Events.anyMap.get(this));
|
|
241
248
|
const staticListeners = [...filteredListeners];
|
|
242
249
|
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
243
250
|
await resolvedPromise;
|
|
@@ -253,7 +260,7 @@ class Events extends import_core.Base {
|
|
|
253
260
|
]);
|
|
254
261
|
}
|
|
255
262
|
getListeners(eventName) {
|
|
256
|
-
const events = (0, import_assert.assertEx)(
|
|
263
|
+
const events = (0, import_assert.assertEx)(_Events.eventsMap.get(this));
|
|
257
264
|
if (!events.has(eventName)) {
|
|
258
265
|
return;
|
|
259
266
|
}
|
|
@@ -264,7 +271,8 @@ class Events extends import_core.Base {
|
|
|
264
271
|
return await listener(eventName, eventArgs);
|
|
265
272
|
} catch (ex) {
|
|
266
273
|
(0, import_error.handleError)(ex, (error) => {
|
|
267
|
-
|
|
274
|
+
var _a;
|
|
275
|
+
(_a = this.logger) == null ? void 0 : _a.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
268
276
|
});
|
|
269
277
|
}
|
|
270
278
|
}
|
|
@@ -273,11 +281,12 @@ class Events extends import_core.Base {
|
|
|
273
281
|
return await listener(eventArgs);
|
|
274
282
|
} catch (ex) {
|
|
275
283
|
(0, import_error.handleError)(ex, (error) => {
|
|
276
|
-
|
|
284
|
+
var _a;
|
|
285
|
+
(_a = this.logger) == null ? void 0 : _a.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
277
286
|
});
|
|
278
287
|
}
|
|
279
288
|
}
|
|
280
|
-
}
|
|
289
|
+
};
|
|
281
290
|
// Annotate the CommonJS export names for ESM import in node:
|
|
282
291
|
0 && (module.exports = {
|
|
283
292
|
Events
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/Events/Events.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xyo-network/core'\nimport { handleError } from '@xyo-network/error'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model'\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\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 let eventNameString: string | undefined\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 if (typeof eventName === 'symbol' || typeof eventName === 'number') {\n eventNameString = eventName.toString()\n } else {\n eventNameString = eventName\n }\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, undefined)\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('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object':\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n default:\n return args === filter\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, undefined)\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', undefined, undefined)\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, undefined)\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', undefined, undefined)\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('`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()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["eventName"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/Events/Events.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { Base, BaseParams } from '@xyo-network/core'\nimport { handleError } from '@xyo-network/error'\n\nimport { EventAnyListener, EventArgs, EventData, EventFunctions, EventListener, EventName } from '../model'\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\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 let eventNameString: string | undefined\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 if (typeof eventName === 'symbol' || typeof eventName === 'number') {\n eventNameString = eventName.toString()\n } else {\n eventNameString = eventName\n }\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, undefined)\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('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n if (filter) {\n switch (typeof filter) {\n case 'object':\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n default:\n return args === filter\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, undefined)\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', undefined, undefined)\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, undefined)\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', undefined, undefined)\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('`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()].filter((value) => (filter ? value.listener : true)).map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !Events.canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map((info) => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["eventName"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
// src/Events/Events.ts
|
|
1
2
|
import { assertEx } from "@xylabs/assert";
|
|
2
3
|
import { forget } from "@xylabs/forget";
|
|
3
4
|
import { Base } from "@xyo-network/core";
|
|
4
5
|
import { handleError } from "@xyo-network/error";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
var resolvedPromise = Promise.resolve();
|
|
7
|
+
var isMetaEvent = (eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved";
|
|
8
|
+
var Events = class _Events extends Base {
|
|
8
9
|
static anyMap = /* @__PURE__ */ new WeakMap();
|
|
9
10
|
static eventsMap = /* @__PURE__ */ new WeakMap();
|
|
10
11
|
static canEmitMetaEvents = false;
|
|
@@ -34,23 +35,25 @@ class Events extends Base {
|
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
super(mutatedParams);
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
_Events.anyMap.set(this, /* @__PURE__ */ new Set());
|
|
39
|
+
_Events.eventsMap.set(this, /* @__PURE__ */ new Map());
|
|
39
40
|
}
|
|
40
41
|
static get isDebugEnabled() {
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
var _a;
|
|
43
|
+
if (typeof ((_a = globalThis.process) == null ? void 0 : _a.env) !== "object") {
|
|
44
|
+
return _Events.isGlobalDebugEnabled;
|
|
43
45
|
}
|
|
44
46
|
const { env } = globalThis.process ?? { env: {} };
|
|
45
|
-
return env.DEBUG === "events" || env.DEBUG === "*" ||
|
|
47
|
+
return env.DEBUG === "events" || env.DEBUG === "*" || _Events.isGlobalDebugEnabled;
|
|
46
48
|
}
|
|
47
49
|
static set isDebugEnabled(newValue) {
|
|
48
|
-
|
|
50
|
+
_Events.isGlobalDebugEnabled = newValue;
|
|
49
51
|
}
|
|
50
52
|
get debug() {
|
|
51
53
|
return this.params.debug;
|
|
52
54
|
}
|
|
53
55
|
clearListeners(eventNames) {
|
|
56
|
+
var _a, _b;
|
|
54
57
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
55
58
|
for (const eventName of eventNamesArray) {
|
|
56
59
|
this.logIfDebugEnabled("clear", eventName, void 0);
|
|
@@ -60,10 +63,10 @@ class Events extends Base {
|
|
|
60
63
|
set.clear();
|
|
61
64
|
}
|
|
62
65
|
} else {
|
|
63
|
-
|
|
64
|
-
for (const [eventName2, listeners] of assertEx(
|
|
66
|
+
(_a = _Events.anyMap.get(this)) == null ? void 0 : _a.clear();
|
|
67
|
+
for (const [eventName2, listeners] of assertEx(_Events.eventsMap.get(this)).entries()) {
|
|
65
68
|
listeners.clear();
|
|
66
|
-
|
|
69
|
+
(_b = _Events.eventsMap.get(this)) == null ? void 0 : _b.delete(eventName2);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
72
|
}
|
|
@@ -74,15 +77,15 @@ class Events extends Base {
|
|
|
74
77
|
async emitMetaEvent(eventName, eventArgs) {
|
|
75
78
|
if (isMetaEvent(eventName)) {
|
|
76
79
|
try {
|
|
77
|
-
|
|
80
|
+
_Events.canEmitMetaEvents = true;
|
|
78
81
|
await this.emitMetaEventInternal(eventName, eventArgs);
|
|
79
82
|
} finally {
|
|
80
|
-
|
|
83
|
+
_Events.canEmitMetaEvents = false;
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
86
|
}
|
|
84
87
|
async emitSerial(eventName, eventArgs) {
|
|
85
|
-
if (isMetaEvent(eventName) && !
|
|
88
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
86
89
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
87
90
|
}
|
|
88
91
|
const filterMatch = (args, filter) => {
|
|
@@ -99,7 +102,7 @@ class Events extends Base {
|
|
|
99
102
|
this.logIfDebugEnabled("emitSerial", eventName, eventArgs);
|
|
100
103
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
101
104
|
const filteredListeners = [...listeners.values()].filter((value) => value.filter ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
|
|
102
|
-
const anyListeners = assertEx(
|
|
105
|
+
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
103
106
|
const staticListeners = [...filteredListeners];
|
|
104
107
|
const staticAnyListeners = [...anyListeners];
|
|
105
108
|
await resolvedPromise;
|
|
@@ -112,23 +115,25 @@ class Events extends Base {
|
|
|
112
115
|
}
|
|
113
116
|
//TODO: Make test for this
|
|
114
117
|
listenerCount(eventNames) {
|
|
118
|
+
var _a;
|
|
115
119
|
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
116
120
|
let count = 0;
|
|
117
121
|
for (const eventName of eventNamesArray) {
|
|
118
122
|
if (typeof eventName === "string") {
|
|
119
|
-
count += assertEx(
|
|
123
|
+
count += assertEx(_Events.anyMap.get(this)).size + (((_a = this.getListeners(eventName)) == null ? void 0 : _a.size) ?? 0);
|
|
120
124
|
continue;
|
|
121
125
|
}
|
|
122
|
-
count += assertEx(
|
|
123
|
-
for (const value of assertEx(
|
|
126
|
+
count += assertEx(_Events.anyMap.get(this)).size;
|
|
127
|
+
for (const value of assertEx(_Events.eventsMap.get(this)).values()) {
|
|
124
128
|
count += value.size;
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
131
|
return count;
|
|
128
132
|
}
|
|
129
133
|
logIfDebugEnabled(type, eventName, eventArgs) {
|
|
130
|
-
|
|
131
|
-
|
|
134
|
+
var _a, _b, _c;
|
|
135
|
+
if (_Events.isDebugEnabled || ((_a = this.debug) == null ? void 0 : _a.enabled)) {
|
|
136
|
+
(_c = (_b = this.debug) == null ? void 0 : _b.logger) == null ? void 0 : _c.call(_b, type, this.debug.name, eventName, eventArgs);
|
|
132
137
|
}
|
|
133
138
|
}
|
|
134
139
|
off(eventNames, listener) {
|
|
@@ -138,8 +143,8 @@ class Events extends Base {
|
|
|
138
143
|
if (set) {
|
|
139
144
|
set.delete(listener);
|
|
140
145
|
if (set.size === 0) {
|
|
141
|
-
const events =
|
|
142
|
-
events
|
|
146
|
+
const events = _Events.eventsMap.get(this);
|
|
147
|
+
events == null ? void 0 : events.delete(eventName);
|
|
143
148
|
}
|
|
144
149
|
}
|
|
145
150
|
this.logIfDebugEnabled("unsubscribe", eventName, void 0);
|
|
@@ -150,8 +155,8 @@ class Events extends Base {
|
|
|
150
155
|
}
|
|
151
156
|
offAny(listener) {
|
|
152
157
|
this.logIfDebugEnabled("unsubscribeAny", void 0, void 0);
|
|
153
|
-
const typedMap =
|
|
154
|
-
typedMap
|
|
158
|
+
const typedMap = _Events.anyMap.get(this);
|
|
159
|
+
typedMap == null ? void 0 : typedMap.delete(listener);
|
|
155
160
|
forget(this.emitMetaEvent("listenerRemoved", { listener }));
|
|
156
161
|
}
|
|
157
162
|
on(eventNames, listener, filter) {
|
|
@@ -160,8 +165,8 @@ class Events extends Base {
|
|
|
160
165
|
let set = this.getListeners(eventName);
|
|
161
166
|
if (!set) {
|
|
162
167
|
set = /* @__PURE__ */ new Set();
|
|
163
|
-
const events =
|
|
164
|
-
events
|
|
168
|
+
const events = _Events.eventsMap.get(this);
|
|
169
|
+
events == null ? void 0 : events.set(eventName, set);
|
|
165
170
|
}
|
|
166
171
|
set.add({ filter, listener });
|
|
167
172
|
this.logIfDebugEnabled("subscribe", eventName, void 0);
|
|
@@ -172,8 +177,9 @@ class Events extends Base {
|
|
|
172
177
|
return this.off.bind(this, eventNames, listener);
|
|
173
178
|
}
|
|
174
179
|
onAny(listener) {
|
|
180
|
+
var _a;
|
|
175
181
|
this.logIfDebugEnabled("subscribeAny", void 0, void 0);
|
|
176
|
-
|
|
182
|
+
(_a = _Events.anyMap.get(this)) == null ? void 0 : _a.add(listener);
|
|
177
183
|
forget(this.emitMetaEvent("listenerAdded", { listener }));
|
|
178
184
|
return this.offAny.bind(this, listener);
|
|
179
185
|
}
|
|
@@ -186,13 +192,13 @@ class Events extends Base {
|
|
|
186
192
|
return this.off.bind(this, eventName, subListener);
|
|
187
193
|
}
|
|
188
194
|
async emitInternal(eventName, eventArgs, filter) {
|
|
189
|
-
if (isMetaEvent(eventName) && !
|
|
195
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
190
196
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
191
197
|
}
|
|
192
198
|
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
193
199
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
194
200
|
const filteredListeners = [...listeners.values()].filter((value) => filter ? value.listener : true).map((info) => info.listener);
|
|
195
|
-
const anyListeners = assertEx(
|
|
201
|
+
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
196
202
|
const staticListeners = [...filteredListeners];
|
|
197
203
|
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
198
204
|
await resolvedPromise;
|
|
@@ -208,13 +214,13 @@ class Events extends Base {
|
|
|
208
214
|
]);
|
|
209
215
|
}
|
|
210
216
|
async emitMetaEventInternal(eventName, eventArgs) {
|
|
211
|
-
if (isMetaEvent(eventName) && !
|
|
217
|
+
if (isMetaEvent(eventName) && !_Events.canEmitMetaEvents) {
|
|
212
218
|
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
213
219
|
}
|
|
214
220
|
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
215
221
|
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
216
222
|
const filteredListeners = [...listeners.values()].map((info) => info.listener);
|
|
217
|
-
const anyListeners = assertEx(
|
|
223
|
+
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
218
224
|
const staticListeners = [...filteredListeners];
|
|
219
225
|
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
220
226
|
await resolvedPromise;
|
|
@@ -230,7 +236,7 @@ class Events extends Base {
|
|
|
230
236
|
]);
|
|
231
237
|
}
|
|
232
238
|
getListeners(eventName) {
|
|
233
|
-
const events = assertEx(
|
|
239
|
+
const events = assertEx(_Events.eventsMap.get(this));
|
|
234
240
|
if (!events.has(eventName)) {
|
|
235
241
|
return;
|
|
236
242
|
}
|
|
@@ -241,7 +247,8 @@ class Events extends Base {
|
|
|
241
247
|
return await listener(eventName, eventArgs);
|
|
242
248
|
} catch (ex) {
|
|
243
249
|
handleError(ex, (error) => {
|
|
244
|
-
|
|
250
|
+
var _a;
|
|
251
|
+
(_a = this.logger) == null ? void 0 : _a.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
245
252
|
});
|
|
246
253
|
}
|
|
247
254
|
}
|
|
@@ -250,11 +257,12 @@ class Events extends Base {
|
|
|
250
257
|
return await listener(eventArgs);
|
|
251
258
|
} catch (ex) {
|
|
252
259
|
handleError(ex, (error) => {
|
|
253
|
-
|
|
260
|
+
var _a;
|
|
261
|
+
(_a = this.logger) == null ? void 0 : _a.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
254
262
|
});
|
|
255
263
|
}
|
|
256
264
|
}
|
|
257
|
-
}
|
|
265
|
+
};
|
|
258
266
|
export {
|
|
259
267
|
Events
|
|
260
268
|
};
|