@xylabs/events 7.0.2 → 7.0.4
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 +6 -4
- package/dist/neutral/index.d.ts +1 -3
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +2 -414
- package/dist/neutral/index.mjs.map +4 -4
- package/dist/neutral/model.d.ts +1 -2
- package/dist/neutral/model.d.ts.map +1 -1
- package/package.json +27 -27
- package/dist/neutral/BaseEmitter.d.ts +0 -74
- package/dist/neutral/BaseEmitter.d.ts.map +0 -1
- package/dist/neutral/Events/Events.d.ts +0 -132
- package/dist/neutral/Events/Events.d.ts.map +0 -1
- package/dist/neutral/Events/index.d.ts +0 -2
- package/dist/neutral/Events/index.d.ts.map +0 -1
- package/dist/neutral/model/Event.d.ts +0 -21
- package/dist/neutral/model/Event.d.ts.map +0 -1
- package/dist/neutral/model/EventEmitter.d.ts +0 -25
- package/dist/neutral/model/EventEmitter.d.ts.map +0 -1
- package/dist/neutral/model/index.d.ts +0 -3
- package/dist/neutral/model/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
> **Deprecated.** Use [`@ariestools/sdk`](../../ariestools-sdk/README.md) instead. This package is a backward-compatibility re-export shim.
|
|
2
|
+
|
|
1
3
|
[![logo][]](https://xylabs.com)
|
|
2
4
|
|
|
3
5
|
# @xylabs/events
|
|
@@ -12,25 +14,25 @@
|
|
|
12
14
|
Using npm:
|
|
13
15
|
|
|
14
16
|
```sh
|
|
15
|
-
npm install
|
|
17
|
+
npm install @xylabs/events
|
|
16
18
|
```
|
|
17
19
|
|
|
18
20
|
Using yarn:
|
|
19
21
|
|
|
20
22
|
```sh
|
|
21
|
-
yarn add
|
|
23
|
+
yarn add @xylabs/events
|
|
22
24
|
```
|
|
23
25
|
|
|
24
26
|
Using pnpm:
|
|
25
27
|
|
|
26
28
|
```sh
|
|
27
|
-
pnpm add
|
|
29
|
+
pnpm add @xylabs/events
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
Using bun:
|
|
31
33
|
|
|
32
34
|
```sh
|
|
33
|
-
bun add
|
|
35
|
+
bun add @xylabs/events
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -1,415 +1,3 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// src/Events/Events.ts
|
|
5
|
-
import { assertEx } from "@xylabs/assert";
|
|
6
|
-
import { Base } from "@xylabs/base";
|
|
7
|
-
import { handleError } from "@xylabs/error";
|
|
8
|
-
import { forget } from "@xylabs/forget";
|
|
9
|
-
import { isDefined } from "@xylabs/typeof";
|
|
10
|
-
var NO_META_EVENT_ERROR_MESSAGE = "`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`";
|
|
11
|
-
var processGlobal = globalThis;
|
|
12
|
-
var resolvedPromise = Promise.resolve();
|
|
13
|
-
var isMetaEvent = (eventName) => eventName === "listenerAdded" || eventName === "listenerRemoved";
|
|
14
|
-
var Events = class _Events extends Base {
|
|
15
|
-
static anyMap = /* @__PURE__ */ new WeakMap();
|
|
16
|
-
static eventsMap = /* @__PURE__ */ new WeakMap();
|
|
17
|
-
static isGlobalDebugEnabled = false;
|
|
18
|
-
// this is here to be able to query the type, not use
|
|
19
|
-
eventData = {};
|
|
20
|
-
_canEmitMetaEvents = false;
|
|
21
|
-
constructor(params = {}) {
|
|
22
|
-
const mutatedParams = { ...params };
|
|
23
|
-
if (mutatedParams.debug) {
|
|
24
|
-
mutatedParams.debug.logger ??= (type, debugName, eventName, eventData) => {
|
|
25
|
-
let eventDataString;
|
|
26
|
-
try {
|
|
27
|
-
eventDataString = JSON.stringify(eventData);
|
|
28
|
-
} catch {
|
|
29
|
-
eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(",")}`;
|
|
30
|
-
}
|
|
31
|
-
const eventNameString = typeof eventName === "symbol" || typeof eventName === "number" ? eventName.toString() : eventName;
|
|
32
|
-
const currentTime = /* @__PURE__ */ new Date();
|
|
33
|
-
const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;
|
|
34
|
-
this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}
|
|
35
|
-
data: ${eventDataString}`);
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
super(mutatedParams);
|
|
39
|
-
_Events.anyMap.set(this, /* @__PURE__ */ new Set());
|
|
40
|
-
_Events.eventsMap.set(this, /* @__PURE__ */ new Map());
|
|
41
|
-
}
|
|
42
|
-
/** Whether debug mode is enabled globally or via the DEBUG environment variable. */
|
|
43
|
-
static get isDebugEnabled() {
|
|
44
|
-
if (typeof processGlobal.process?.env !== "object") {
|
|
45
|
-
return this.isGlobalDebugEnabled;
|
|
46
|
-
}
|
|
47
|
-
const env = processGlobal.process?.env;
|
|
48
|
-
return env?.DEBUG === "events" || env?.DEBUG === "*" || this.isGlobalDebugEnabled;
|
|
49
|
-
}
|
|
50
|
-
static set isDebugEnabled(newValue) {
|
|
51
|
-
this.isGlobalDebugEnabled = newValue;
|
|
52
|
-
}
|
|
53
|
-
/** The debug configuration for this instance, if provided. */
|
|
54
|
-
get debug() {
|
|
55
|
-
return this.params.debug;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Removes all listeners for the specified event name(s).
|
|
59
|
-
* @param eventNames - One or more event names to clear listeners for.
|
|
60
|
-
*/
|
|
61
|
-
clearListeners(eventNames) {
|
|
62
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
63
|
-
for (const eventName of eventNamesArray) {
|
|
64
|
-
this.logIfDebugEnabled("clear", eventName);
|
|
65
|
-
if (typeof eventName === "string" || typeof eventName === "symbol" || typeof eventName === "number") {
|
|
66
|
-
const set = this.getListeners(eventName);
|
|
67
|
-
if (set) {
|
|
68
|
-
set.clear();
|
|
69
|
-
}
|
|
70
|
-
} else {
|
|
71
|
-
_Events.anyMap.get(this)?.clear();
|
|
72
|
-
const eventEntries = assertEx(_Events.eventsMap.get(this));
|
|
73
|
-
for (const [eventName2, listeners] of eventEntries) {
|
|
74
|
-
listeners.clear();
|
|
75
|
-
_Events.eventsMap.get(this)?.delete(eventName2);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Emits an event, invoking all registered listeners concurrently.
|
|
82
|
-
* @param eventName - The event to emit.
|
|
83
|
-
* @param eventArgs - The data to pass to listeners.
|
|
84
|
-
*/
|
|
85
|
-
async emit(eventName, eventArgs) {
|
|
86
|
-
return await this.emitInternal(eventName, eventArgs);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Emits an internal meta event (listenerAdded or listenerRemoved).
|
|
90
|
-
* @param eventName - The meta event name.
|
|
91
|
-
* @param eventArgs - The meta event data containing listener and event information.
|
|
92
|
-
* @returns True if the meta event was emitted successfully.
|
|
93
|
-
*/
|
|
94
|
-
async emitMetaEvent(eventName, eventArgs) {
|
|
95
|
-
if (isMetaEvent(eventName)) {
|
|
96
|
-
try {
|
|
97
|
-
this._canEmitMetaEvents = true;
|
|
98
|
-
await this.emitMetaEventInternal(eventName, eventArgs);
|
|
99
|
-
return true;
|
|
100
|
-
} finally {
|
|
101
|
-
this._canEmitMetaEvents = false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Emits an event, invoking all registered listeners sequentially in order.
|
|
107
|
-
* @param eventName - The event to emit.
|
|
108
|
-
* @param eventArgs - The data to pass to listeners.
|
|
109
|
-
*/
|
|
110
|
-
async emitSerial(eventName, eventArgs) {
|
|
111
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
112
|
-
throw new TypeError(NO_META_EVENT_ERROR_MESSAGE);
|
|
113
|
-
}
|
|
114
|
-
const filterMatch = (args, filter) => {
|
|
115
|
-
switch (typeof filter) {
|
|
116
|
-
case "object": {
|
|
117
|
-
if (filter === null || args === null || typeof args !== "object") return args === filter;
|
|
118
|
-
return Object.entries(args).reduce((prev, [key, value]) => filter[key] === value ? true : prev, false);
|
|
119
|
-
}
|
|
120
|
-
default: {
|
|
121
|
-
return args === filter;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
this.logIfDebugEnabled("emitSerial", eventName, eventArgs);
|
|
126
|
-
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
127
|
-
const filteredListeners = [...listeners].filter((value) => isDefined(value.filter) ? filterMatch(eventArgs, value.filter) : true).map((info) => info.listener);
|
|
128
|
-
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
129
|
-
const staticListeners = [...filteredListeners];
|
|
130
|
-
const staticAnyListeners = [...anyListeners];
|
|
131
|
-
await resolvedPromise;
|
|
132
|
-
for (const listener of staticListeners) {
|
|
133
|
-
await this.safeCallListener(eventName, eventArgs, listener);
|
|
134
|
-
}
|
|
135
|
-
for (const listener of staticAnyListeners) {
|
|
136
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Returns the total number of listeners registered for the specified event name(s).
|
|
141
|
-
* @param eventNames - One or more event names to count listeners for.
|
|
142
|
-
* @returns The total listener count.
|
|
143
|
-
*/
|
|
144
|
-
// TODO: Make test for this
|
|
145
|
-
listenerCount(eventNames) {
|
|
146
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
147
|
-
let count = 0;
|
|
148
|
-
for (const eventName of eventNamesArray) {
|
|
149
|
-
if (typeof eventName === "string") {
|
|
150
|
-
count += assertEx(_Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0);
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
count += assertEx(_Events.anyMap.get(this)).size;
|
|
154
|
-
const eventListeners = assertEx(_Events.eventsMap.get(this)).values();
|
|
155
|
-
for (const value of eventListeners) {
|
|
156
|
-
count += value.size;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return count;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Logs debug information if debug mode is enabled.
|
|
163
|
-
* @param type - The type of operation being logged.
|
|
164
|
-
* @param eventName - The event name, if applicable.
|
|
165
|
-
* @param eventArgs - The event data, if applicable.
|
|
166
|
-
*/
|
|
167
|
-
logIfDebugEnabled(type, eventName, eventArgs) {
|
|
168
|
-
if (_Events.isDebugEnabled || this.debug?.enabled === true) {
|
|
169
|
-
this.debug?.logger?.(type, this.debug.name, eventName, eventArgs);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Removes a specific listener from the specified event name(s).
|
|
174
|
-
* @param eventNames - One or more event names to unsubscribe from.
|
|
175
|
-
* @param listener - The listener to remove.
|
|
176
|
-
*/
|
|
177
|
-
off(eventNames, listener) {
|
|
178
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
179
|
-
for (const eventName of eventNamesArray) {
|
|
180
|
-
const set = this.getListeners(eventName);
|
|
181
|
-
if (set) {
|
|
182
|
-
set.delete(listener);
|
|
183
|
-
if (set.size === 0) {
|
|
184
|
-
const events = _Events.eventsMap.get(this);
|
|
185
|
-
events?.delete(eventName);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.logIfDebugEnabled("unsubscribe", eventName);
|
|
189
|
-
if (!isMetaEvent(eventName)) {
|
|
190
|
-
forget(this.emitMetaEvent("listenerRemoved", { eventName, listener }));
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Removes a wildcard listener that was receiving all events.
|
|
196
|
-
* @param listener - The wildcard listener to remove.
|
|
197
|
-
*/
|
|
198
|
-
offAny(listener) {
|
|
199
|
-
this.logIfDebugEnabled("unsubscribeAny");
|
|
200
|
-
const typedMap = _Events.anyMap.get(this);
|
|
201
|
-
typedMap?.delete(listener);
|
|
202
|
-
forget(this.emitMetaEvent("listenerRemoved", { listener }));
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Subscribes a listener to the specified event name(s).
|
|
206
|
-
* @param eventNames - One or more event names to listen for.
|
|
207
|
-
* @param listener - The callback to invoke when the event fires.
|
|
208
|
-
* @param filter - Optional filter to selectively invoke the listener based on event data.
|
|
209
|
-
* @returns An unsubscribe function.
|
|
210
|
-
*/
|
|
211
|
-
on(eventNames, listener, filter) {
|
|
212
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames];
|
|
213
|
-
for (const eventName of eventNamesArray) {
|
|
214
|
-
let set = this.getListeners(eventName);
|
|
215
|
-
if (!set) {
|
|
216
|
-
set = /* @__PURE__ */ new Set();
|
|
217
|
-
const events = _Events.eventsMap.get(this);
|
|
218
|
-
events?.set(eventName, set);
|
|
219
|
-
}
|
|
220
|
-
set.add({ filter, listener });
|
|
221
|
-
this.logIfDebugEnabled("subscribe", eventName);
|
|
222
|
-
if (!isMetaEvent(eventName)) {
|
|
223
|
-
forget(this.emitMetaEvent("listenerAdded", { eventName, listener }));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return this.off.bind(this, eventNames, listener);
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Subscribes a wildcard listener that receives all events.
|
|
230
|
-
* @param listener - The callback to invoke for any event.
|
|
231
|
-
* @returns An unsubscribe function.
|
|
232
|
-
*/
|
|
233
|
-
onAny(listener) {
|
|
234
|
-
this.logIfDebugEnabled("subscribeAny");
|
|
235
|
-
_Events.anyMap.get(this)?.add(listener);
|
|
236
|
-
forget(this.emitMetaEvent("listenerAdded", { listener }));
|
|
237
|
-
return this.offAny.bind(this, listener);
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
241
|
-
* @param eventName - The event to listen for.
|
|
242
|
-
* @param listener - The callback to invoke once.
|
|
243
|
-
* @returns An unsubscribe function.
|
|
244
|
-
*/
|
|
245
|
-
once(eventName, listener) {
|
|
246
|
-
const subListener = async (args) => {
|
|
247
|
-
this.off(eventName, subListener);
|
|
248
|
-
await this.safeCallListener(eventName, args, listener);
|
|
249
|
-
};
|
|
250
|
-
this.on(eventName, subListener);
|
|
251
|
-
return this.off.bind(this, eventName, subListener);
|
|
252
|
-
}
|
|
253
|
-
async emitInternal(eventName, eventArgs, filter) {
|
|
254
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
255
|
-
throw new TypeError(NO_META_EVENT_ERROR_MESSAGE);
|
|
256
|
-
}
|
|
257
|
-
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
258
|
-
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
259
|
-
const filteredListeners = [...listeners].filter((value) => isDefined(filter) ? isDefined(value.listener) : true).map((info) => info.listener);
|
|
260
|
-
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
261
|
-
const staticListeners = [...filteredListeners];
|
|
262
|
-
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
263
|
-
await resolvedPromise;
|
|
264
|
-
await Promise.all([
|
|
265
|
-
...staticListeners.map(async (listener) => {
|
|
266
|
-
await this.safeCallListener(eventName, eventArgs, listener);
|
|
267
|
-
}),
|
|
268
|
-
...staticAnyListeners.map(async (listener) => {
|
|
269
|
-
if (anyListeners.has(listener)) {
|
|
270
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener);
|
|
271
|
-
}
|
|
272
|
-
})
|
|
273
|
-
]);
|
|
274
|
-
}
|
|
275
|
-
async emitMetaEventInternal(eventName, eventArgs) {
|
|
276
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
277
|
-
throw new TypeError("`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`");
|
|
278
|
-
}
|
|
279
|
-
this.logIfDebugEnabled("emit", eventName, eventArgs);
|
|
280
|
-
const listeners = this.getListeners(eventName) ?? /* @__PURE__ */ new Set();
|
|
281
|
-
const filteredListeners = [...listeners].map((info) => info.listener);
|
|
282
|
-
const anyListeners = assertEx(_Events.anyMap.get(this));
|
|
283
|
-
const staticListeners = [...filteredListeners];
|
|
284
|
-
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];
|
|
285
|
-
await resolvedPromise;
|
|
286
|
-
await Promise.all([
|
|
287
|
-
...staticListeners.map(async (listener) => {
|
|
288
|
-
await this.safeCallListener(eventName, eventArgs, listener);
|
|
289
|
-
}),
|
|
290
|
-
/* v8 ignore start -- race condition guard */
|
|
291
|
-
...staticAnyListeners.map(async (listener) => {
|
|
292
|
-
if (anyListeners.has(listener)) {
|
|
293
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener);
|
|
294
|
-
}
|
|
295
|
-
})
|
|
296
|
-
/* v8 ignore stop */
|
|
297
|
-
]);
|
|
298
|
-
return true;
|
|
299
|
-
}
|
|
300
|
-
getListeners(eventName) {
|
|
301
|
-
const events = assertEx(_Events.eventsMap.get(this));
|
|
302
|
-
if (!events.has(eventName)) {
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
return events.get(eventName);
|
|
306
|
-
}
|
|
307
|
-
async safeCallAnyListener(eventName, eventArgs, listener) {
|
|
308
|
-
try {
|
|
309
|
-
return await listener(eventName, eventArgs);
|
|
310
|
-
} catch (ex) {
|
|
311
|
-
handleError(ex, (error) => {
|
|
312
|
-
this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
async safeCallListener(eventName, eventArgs, listener) {
|
|
317
|
-
try {
|
|
318
|
-
return await listener(eventArgs);
|
|
319
|
-
} catch (ex) {
|
|
320
|
-
handleError(ex, (error) => {
|
|
321
|
-
this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`);
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
// src/BaseEmitter.ts
|
|
328
|
-
var BaseEmitter = class extends Base2 {
|
|
329
|
-
// just here to query types
|
|
330
|
-
eventData = {};
|
|
331
|
-
events;
|
|
332
|
-
constructor(params) {
|
|
333
|
-
super(params);
|
|
334
|
-
this.events = new Events();
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Removes all listeners for the specified event name(s).
|
|
338
|
-
* @param eventNames - One or more event names to clear listeners for.
|
|
339
|
-
* @returns This instance for chaining.
|
|
340
|
-
*/
|
|
341
|
-
clearListeners(eventNames) {
|
|
342
|
-
this.events.clearListeners(eventNames);
|
|
343
|
-
return this;
|
|
344
|
-
}
|
|
345
|
-
/**
|
|
346
|
-
* Emits an event, invoking all registered listeners concurrently.
|
|
347
|
-
* @param eventName - The event to emit.
|
|
348
|
-
* @param eventArgs - The data to pass to listeners.
|
|
349
|
-
*/
|
|
350
|
-
emit(eventName, eventArgs) {
|
|
351
|
-
return this.events.emit(eventName, eventArgs);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Emits an event, invoking all registered listeners sequentially in order.
|
|
355
|
-
* @param eventName - The event to emit.
|
|
356
|
-
* @param eventArgs - The data to pass to listeners.
|
|
357
|
-
*/
|
|
358
|
-
emitSerial(eventName, eventArgs) {
|
|
359
|
-
return this.events.emitSerial(eventName, eventArgs);
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Returns the total number of listeners registered for the specified event name(s).
|
|
363
|
-
* @param eventNames - One or more event names to count listeners for.
|
|
364
|
-
* @returns The total listener count.
|
|
365
|
-
*/
|
|
366
|
-
listenerCount(eventNames) {
|
|
367
|
-
return this.events.listenerCount(eventNames);
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Removes a specific listener from the specified event name(s).
|
|
371
|
-
* @param eventNames - One or more event names to unsubscribe from.
|
|
372
|
-
* @param listener - The listener to remove.
|
|
373
|
-
*/
|
|
374
|
-
off(eventNames, listener) {
|
|
375
|
-
return this.events.off(eventNames, listener);
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* Removes a wildcard listener that was receiving all events.
|
|
379
|
-
* @param listener - The wildcard listener to remove.
|
|
380
|
-
*/
|
|
381
|
-
offAny(listener) {
|
|
382
|
-
return this.events.offAny(listener);
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Subscribes a listener to the specified event name(s).
|
|
386
|
-
* @param eventNames - One or more event names to listen for.
|
|
387
|
-
* @param listener - The callback to invoke when the event fires.
|
|
388
|
-
* @returns An unsubscribe function.
|
|
389
|
-
*/
|
|
390
|
-
on(eventNames, listener) {
|
|
391
|
-
return this.events.on(eventNames, listener);
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Subscribes a wildcard listener that receives all events.
|
|
395
|
-
* @param listener - The callback to invoke for any event.
|
|
396
|
-
* @returns An unsubscribe function.
|
|
397
|
-
*/
|
|
398
|
-
onAny(listener) {
|
|
399
|
-
return this.events.onAny(listener);
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Subscribes a listener that will be invoked only once for the specified event, then automatically removed.
|
|
403
|
-
* @param eventName - The event to listen for.
|
|
404
|
-
* @param listener - The callback to invoke once.
|
|
405
|
-
* @returns An unsubscribe function.
|
|
406
|
-
*/
|
|
407
|
-
once(eventName, listener) {
|
|
408
|
-
return this.events.once(eventName, listener);
|
|
409
|
-
}
|
|
410
|
-
};
|
|
411
|
-
export {
|
|
412
|
-
BaseEmitter,
|
|
413
|
-
Events
|
|
414
|
-
};
|
|
1
|
+
// src/index.ts
|
|
2
|
+
export * from "@ariestools/sdk/events";
|
|
415
3
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/
|
|
4
|
-
"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>\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 interface 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\ninterface ProcessGlobal {\n process?: {\n env?: {\n DEBUG?: string\n }\n }\n}\n\nconst processGlobal = globalThis as ProcessGlobal\n\n/**\nConfigure debug options of an instance.\n*/\n/* v8 ignore next 5 */\nexport interface 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 interface 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 ??= (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 processGlobal.process?.env !== 'object') {\n return this.isGlobalDebugEnabled\n }\n\n const env = processGlobal.process?.env\n return env?.DEBUG === 'events' || env?.DEBUG === '*' || this.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 const eventEntries = assertEx(Events.eventsMap.get(this))\n for (const [eventName, listeners] of eventEntries) {\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 }\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 if (filter === null || args === null || typeof args !== 'object') return args === filter\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args as Record<string, unknown>).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]\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 const eventListeners = assertEx(Events.eventsMap.get(this)).values()\n for (const value of eventListeners) {\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 === true) {\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 }))\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)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener }))\n return this.offAny.bind(this, 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 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].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].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(eventName: EventName) {\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<TEventArgs extends EventArgs>(\n eventName: EventName,\n eventArgs: TEventArgs,\n listener: EventAnyListener<TEventArgs>,\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<TEventArgs extends EventArgs>(\n eventName: EventName,\n eventArgs: TEventArgs,\n listener: EventListener<TEventArgs>,\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"],
|
|
5
|
-
"mappings": ";
|
|
6
|
-
"names": [
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["export * from '@ariestools/sdk/events'\n"],
|
|
5
|
+
"mappings": ";AAAA,cAAc;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/dist/neutral/model.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,mBAAmB,8BAA8B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/events",
|
|
3
|
-
"version": "7.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
3
|
+
"version": "7.0.4",
|
|
4
|
+
"description": "DEPRECATED — use @ariestools/sdk/events. Backward-compatibility re-export shim.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"xylabs",
|
|
7
|
+
"utility",
|
|
8
|
+
"typescript",
|
|
9
|
+
"esm"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://xylabs.com",
|
|
6
12
|
"bugs": {
|
|
7
|
-
"url": "git+https://github.com/
|
|
8
|
-
"email": "support@
|
|
13
|
+
"url": "git+https://github.com/xylabs/sdk-js/issues",
|
|
14
|
+
"email": "support@xylabs.com"
|
|
9
15
|
},
|
|
10
16
|
"repository": {
|
|
11
17
|
"type": "git",
|
|
12
|
-
"url": "git+https://github.com/
|
|
18
|
+
"url": "git+https://github.com/xylabs/sdk-js.git"
|
|
13
19
|
},
|
|
14
20
|
"license": "LGPL-3.0-only",
|
|
15
21
|
"author": {
|
|
16
|
-
"name": "
|
|
17
|
-
"email": "support@
|
|
18
|
-
"url": "https://
|
|
22
|
+
"name": "XY Labs Development Team",
|
|
23
|
+
"email": "support@xylabs.com",
|
|
24
|
+
"url": "https://xylabs.com"
|
|
19
25
|
},
|
|
20
26
|
"sideEffects": false,
|
|
21
27
|
"type": "module",
|
|
@@ -24,11 +30,11 @@
|
|
|
24
30
|
"types": "./dist/neutral/index.d.ts",
|
|
25
31
|
"default": "./dist/neutral/index.mjs"
|
|
26
32
|
},
|
|
33
|
+
"./package.json": "./package.json",
|
|
27
34
|
"./model": {
|
|
28
35
|
"types": "./dist/neutral/model.d.ts",
|
|
29
36
|
"default": "./dist/neutral/model.mjs"
|
|
30
|
-
}
|
|
31
|
-
"./package.json": "./package.json"
|
|
37
|
+
}
|
|
32
38
|
},
|
|
33
39
|
"files": [
|
|
34
40
|
"dist",
|
|
@@ -38,31 +44,24 @@
|
|
|
38
44
|
"README.md"
|
|
39
45
|
],
|
|
40
46
|
"dependencies": {
|
|
41
|
-
"@
|
|
42
|
-
"@xylabs/base": "~7.0.2",
|
|
43
|
-
"@xylabs/error": "~7.0.2",
|
|
44
|
-
"@xylabs/forget": "~7.0.2",
|
|
45
|
-
"@xylabs/object": "~7.0.2",
|
|
46
|
-
"@xylabs/promise": "~7.0.2",
|
|
47
|
-
"@xylabs/typeof": "~7.0.2"
|
|
47
|
+
"@ariestools/sdk": "~7.0.4"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@opentelemetry/api": "^1.9.1",
|
|
51
|
-
"@
|
|
52
|
-
"@xylabs/toolchain": "^8.5.
|
|
53
|
-
"@xylabs/tsconfig": "^8.5.
|
|
51
|
+
"@opentelemetry/sdk-trace-base": "^2.8.0",
|
|
52
|
+
"@xylabs/toolchain": "^8.5.11",
|
|
53
|
+
"@xylabs/tsconfig": "^8.5.11",
|
|
54
|
+
"async-mutex": "^0.5.0",
|
|
54
55
|
"browserslist": "4.28.4",
|
|
55
56
|
"eslint": "^10.6.0",
|
|
56
57
|
"eslint-import-resolver-typescript": "^4.4.5",
|
|
57
58
|
"typescript": "^6.0.3",
|
|
58
|
-
"
|
|
59
|
-
"vitest": "^4.1.9",
|
|
60
|
-
"zod": "^4.4.3",
|
|
61
|
-
"@xylabs/delay": "~7.0.2",
|
|
62
|
-
"@xylabs/vitest-extended": "~7.0.2"
|
|
59
|
+
"zod": "^4.4.3"
|
|
63
60
|
},
|
|
64
61
|
"peerDependencies": {
|
|
65
62
|
"@opentelemetry/api": "^1.9",
|
|
63
|
+
"@opentelemetry/sdk-trace-base": "^2.7",
|
|
64
|
+
"async-mutex": "^0.5",
|
|
66
65
|
"zod": "^4.4"
|
|
67
66
|
},
|
|
68
67
|
"engines": {
|
|
@@ -70,5 +69,6 @@
|
|
|
70
69
|
},
|
|
71
70
|
"publishConfig": {
|
|
72
71
|
"access": "public"
|
|
73
|
-
}
|
|
72
|
+
},
|
|
73
|
+
"deprecated": "Use @ariestools/sdk/events instead. @xylabs/events is a compatibility shim only and will not receive further updates."
|
|
74
74
|
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import type { BaseParams } from '@xylabs/base';
|
|
2
|
-
import { Base } from '@xylabs/base';
|
|
3
|
-
import type { EmptyObject } from '@xylabs/object';
|
|
4
|
-
import type { EventAnyListener, EventData, EventEmitter, EventListener } from './model/index.ts';
|
|
5
|
-
/** Fields specific to BaseEmitter configuration parameters. */
|
|
6
|
-
export interface BaseEmitterParamsFields {
|
|
7
|
-
}
|
|
8
|
-
/** Parameters type for configuring a BaseEmitter instance. */
|
|
9
|
-
export type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields>;
|
|
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
|
-
*/
|
|
14
|
-
export declare class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData> extends Base<TParams> implements EventEmitter<TEventData> {
|
|
15
|
-
eventData: TEventData;
|
|
16
|
-
private events;
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
72
|
-
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>): () => void;
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=BaseEmitter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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,CAAC,CAAA;AAE5G;;;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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import type { BaseParams } from '@xylabs/base';
|
|
2
|
-
import { Base } from '@xylabs/base';
|
|
3
|
-
import type { EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName } from '../model/index.ts';
|
|
4
|
-
/**
|
|
5
|
-
Emittery can collect and log debug information.
|
|
6
|
-
|
|
7
|
-
To enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true
|
|
8
|
-
on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.
|
|
9
|
-
|
|
10
|
-
See API for more information on how debugging works.
|
|
11
|
-
*/
|
|
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. */
|
|
14
|
-
export interface EventListenerInfo<TEventArgs extends EventArgs = EventArgs> {
|
|
15
|
-
filter?: TEventArgs;
|
|
16
|
-
listener: EventListener<TEventArgs>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
Configure debug options of an instance.
|
|
20
|
-
*/
|
|
21
|
-
export interface DebugOptions {
|
|
22
|
-
enabled?: boolean;
|
|
23
|
-
logger?: DebugLogger;
|
|
24
|
-
readonly name: string;
|
|
25
|
-
}
|
|
26
|
-
/** Data shape for internal meta events that fire when listeners are added or removed. */
|
|
27
|
-
export interface MetaEventData<TEventData extends EventData> {
|
|
28
|
-
listenerAdded: {
|
|
29
|
-
eventName?: keyof TEventData;
|
|
30
|
-
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>;
|
|
31
|
-
};
|
|
32
|
-
listenerRemoved: {
|
|
33
|
-
eventName?: keyof TEventData;
|
|
34
|
-
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>;
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/** Parameters for constructing an Events instance, with optional debug configuration. */
|
|
38
|
-
export type EventsParams = BaseParams<{
|
|
39
|
-
readonly debug?: DebugOptions;
|
|
40
|
-
}>;
|
|
41
|
-
/**
|
|
42
|
-
* Core typed event emitter implementation supporting named events, wildcard listeners,
|
|
43
|
-
* serial and concurrent emission, listener filtering, and debug logging.
|
|
44
|
-
*/
|
|
45
|
-
export declare class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<TEventData> {
|
|
46
|
-
protected static anyMap: WeakMap<object, Set<EventAnyListener>>;
|
|
47
|
-
protected static eventsMap: WeakMap<object, Map<PropertyKey, Set<EventListenerInfo<unknown>>>>;
|
|
48
|
-
private static isGlobalDebugEnabled;
|
|
49
|
-
eventData: TEventData;
|
|
50
|
-
private _canEmitMetaEvents;
|
|
51
|
-
constructor(params?: EventsParams);
|
|
52
|
-
/** Whether debug mode is enabled globally or via the DEBUG environment variable. */
|
|
53
|
-
static get isDebugEnabled(): boolean;
|
|
54
|
-
static set isDebugEnabled(newValue: boolean);
|
|
55
|
-
/** The debug configuration for this instance, if provided. */
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
74
|
-
emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]): Promise<true | 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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
125
|
-
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>): () => void;
|
|
126
|
-
private emitInternal;
|
|
127
|
-
private emitMetaEventInternal;
|
|
128
|
-
private getListeners;
|
|
129
|
-
private safeCallAnyListener;
|
|
130
|
-
private safeCallListener;
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=Events.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Events/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Promisable } from '@xylabs/promise';
|
|
2
|
-
/** A valid event name, which can be any property key (string, number, or symbol). */
|
|
3
|
-
export type EventName = PropertyKey;
|
|
4
|
-
/** The allowed type for event argument payloads. */
|
|
5
|
-
export type EventArgs = unknown;
|
|
6
|
-
/** A mapping of event names to their corresponding event argument types. */
|
|
7
|
-
export type EventData = object;
|
|
8
|
-
/** A function returned by event subscription methods that unsubscribes the listener when called. */
|
|
9
|
-
export type EventUnsubscribeFunction = () => void;
|
|
10
|
-
/**
|
|
11
|
-
* A listener that receives all events regardless of name.
|
|
12
|
-
* @param eventName - The name of the emitted event.
|
|
13
|
-
* @param eventData - The data associated with the event.
|
|
14
|
-
*/
|
|
15
|
-
export type EventAnyListener<TEventArgs extends EventArgs = EventArgs> = (eventName: EventName, eventData: TEventArgs) => Promisable<void>;
|
|
16
|
-
/**
|
|
17
|
-
* A listener for a specific event type.
|
|
18
|
-
* @param eventData - The data associated with the event.
|
|
19
|
-
*/
|
|
20
|
-
export type EventListener<TEventArgs extends EventArgs = EventArgs> = (eventData: TEventArgs) => Promisable<void>;
|
|
21
|
-
//# sourceMappingURL=Event.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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,oDAAoD;AACpD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAA;AAE/B,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B,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,25 +0,0 @@
|
|
|
1
|
-
import type { EventAnyListener, EventData, EventListener, EventUnsubscribeFunction } from './Event.ts';
|
|
2
|
-
/** Interface for a typed event emitter that supports subscribing, unsubscribing, and emitting events. */
|
|
3
|
-
export interface EventEmitter<T extends EventData> {
|
|
4
|
-
/** Type-level reference to the event data shape for external type queries. */
|
|
5
|
-
eventData: T;
|
|
6
|
-
/** Removes all listeners for the specified event name(s). */
|
|
7
|
-
clearListeners(eventNames: keyof T | (keyof T)[]): void;
|
|
8
|
-
/** Emits an event, invoking all registered listeners concurrently. */
|
|
9
|
-
emit<TEventName extends keyof T>(eventName: TEventName, eventArgs: T[TEventName]): Promise<void>;
|
|
10
|
-
/** Emits an event, invoking all registered listeners sequentially in order. */
|
|
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). */
|
|
13
|
-
listenerCount(eventNames: keyof T | (keyof T)[]): number;
|
|
14
|
-
/** Removes a specific listener from the specified event name(s). */
|
|
15
|
-
off<TEventName extends keyof T>(eventNames: TEventName | TEventName[], listener: EventListener<T[TEventName]>): void;
|
|
16
|
-
/** Removes a wildcard listener that was receiving all events. */
|
|
17
|
-
offAny(listener: EventAnyListener | Promise<void>): void;
|
|
18
|
-
/** Subscribes a listener to the specified event name(s) and returns an unsubscribe function. */
|
|
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. */
|
|
21
|
-
onAny(listener: EventAnyListener): EventUnsubscribeFunction;
|
|
22
|
-
/** Subscribes a listener that will be invoked only once for the specified event, then automatically removed. */
|
|
23
|
-
once<TEventName extends keyof T>(eventName: TEventName, listener: EventListener<T[TEventName]>): EventUnsubscribeFunction;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=EventEmitter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/model/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|