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