@xylabs/events 5.0.80 → 5.0.82
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 +22 -50
- package/dist/neutral/Events/Events.d.ts.map +1 -1
- package/dist/neutral/index.mjs +3 -1
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/model/Event.d.ts.map +1 -1
- package/dist/neutral/model/EventEmitter.d.ts.map +1 -1
- package/package.json +12 -15
- package/src/BaseEmitter.ts +0 -69
- package/src/Events/Events.ts +0 -386
- package/src/Events/index.ts +0 -1
- package/src/index.ts +0 -3
- package/src/model/Event.ts +0 -8
- package/src/model/EventEmitter.ts +0 -19
- package/src/model/index.ts +0 -2
package/README.md
CHANGED
|
@@ -140,20 +140,6 @@ Base.globalInstancesCountHistory
|
|
|
140
140
|
|
|
141
141
|
***
|
|
142
142
|
|
|
143
|
-
### uniqueName
|
|
144
|
-
|
|
145
|
-
```ts
|
|
146
|
-
readonly static uniqueName: string;
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Inherited from
|
|
150
|
-
|
|
151
|
-
```ts
|
|
152
|
-
Base.uniqueName
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
***
|
|
156
|
-
|
|
157
143
|
### eventData
|
|
158
144
|
|
|
159
145
|
```ts
|
|
@@ -299,12 +285,12 @@ Base.maxHistoryDepth
|
|
|
299
285
|
### Get Signature
|
|
300
286
|
|
|
301
287
|
```ts
|
|
302
|
-
get logger():
|
|
288
|
+
get logger(): Logger | undefined;
|
|
303
289
|
```
|
|
304
290
|
|
|
305
291
|
#### Returns
|
|
306
292
|
|
|
307
|
-
`
|
|
293
|
+
`Logger` \| `undefined`
|
|
308
294
|
|
|
309
295
|
### Inherited from
|
|
310
296
|
|
|
@@ -319,12 +305,12 @@ Base.logger
|
|
|
319
305
|
### Get Signature
|
|
320
306
|
|
|
321
307
|
```ts
|
|
322
|
-
get meter():
|
|
308
|
+
get meter(): Meter | undefined;
|
|
323
309
|
```
|
|
324
310
|
|
|
325
311
|
#### Returns
|
|
326
312
|
|
|
327
|
-
`
|
|
313
|
+
`Meter` \| `undefined`
|
|
328
314
|
|
|
329
315
|
### Inherited from
|
|
330
316
|
|
|
@@ -359,12 +345,12 @@ Base.params
|
|
|
359
345
|
### Get Signature
|
|
360
346
|
|
|
361
347
|
```ts
|
|
362
|
-
get tracer():
|
|
348
|
+
get tracer(): Tracer | undefined;
|
|
363
349
|
```
|
|
364
350
|
|
|
365
351
|
#### Returns
|
|
366
352
|
|
|
367
|
-
`
|
|
353
|
+
`Tracer` \| `undefined`
|
|
368
354
|
|
|
369
355
|
### Inherited from
|
|
370
356
|
|
|
@@ -408,7 +394,7 @@ static gc(className): void;
|
|
|
408
394
|
|
|
409
395
|
##### className
|
|
410
396
|
|
|
411
|
-
`
|
|
397
|
+
`BaseClassName`
|
|
412
398
|
|
|
413
399
|
#### Returns
|
|
414
400
|
|
|
@@ -432,7 +418,7 @@ static instanceCount(className): number;
|
|
|
432
418
|
|
|
433
419
|
#### className
|
|
434
420
|
|
|
435
|
-
`
|
|
421
|
+
`BaseClassName`
|
|
436
422
|
|
|
437
423
|
### Returns
|
|
438
424
|
|
|
@@ -815,12 +801,12 @@ once<TEventName>(eventName, listener): (...args) => void;
|
|
|
815
801
|
### Constructor
|
|
816
802
|
|
|
817
803
|
```ts
|
|
818
|
-
new Events<TEventData>(params): Events<TEventData>;
|
|
804
|
+
new Events<TEventData>(params?): Events<TEventData>;
|
|
819
805
|
```
|
|
820
806
|
|
|
821
807
|
### Parameters
|
|
822
808
|
|
|
823
|
-
#### params
|
|
809
|
+
#### params?
|
|
824
810
|
|
|
825
811
|
[`EventsParams`](#../type-aliases/EventsParams) = `{}`
|
|
826
812
|
|
|
@@ -878,20 +864,6 @@ Base.globalInstancesCountHistory
|
|
|
878
864
|
|
|
879
865
|
***
|
|
880
866
|
|
|
881
|
-
### uniqueName
|
|
882
|
-
|
|
883
|
-
```ts
|
|
884
|
-
readonly static uniqueName: string;
|
|
885
|
-
```
|
|
886
|
-
|
|
887
|
-
### Inherited from
|
|
888
|
-
|
|
889
|
-
```ts
|
|
890
|
-
Base.uniqueName
|
|
891
|
-
```
|
|
892
|
-
|
|
893
|
-
***
|
|
894
|
-
|
|
895
867
|
### anyMap
|
|
896
868
|
|
|
897
869
|
```ts
|
|
@@ -1053,12 +1025,12 @@ Base.maxHistoryDepth
|
|
|
1053
1025
|
### Get Signature
|
|
1054
1026
|
|
|
1055
1027
|
```ts
|
|
1056
|
-
get logger():
|
|
1028
|
+
get logger(): Logger | undefined;
|
|
1057
1029
|
```
|
|
1058
1030
|
|
|
1059
1031
|
#### Returns
|
|
1060
1032
|
|
|
1061
|
-
`
|
|
1033
|
+
`Logger` \| `undefined`
|
|
1062
1034
|
|
|
1063
1035
|
### Inherited from
|
|
1064
1036
|
|
|
@@ -1073,12 +1045,12 @@ Base.logger
|
|
|
1073
1045
|
### Get Signature
|
|
1074
1046
|
|
|
1075
1047
|
```ts
|
|
1076
|
-
get meter():
|
|
1048
|
+
get meter(): Meter | undefined;
|
|
1077
1049
|
```
|
|
1078
1050
|
|
|
1079
1051
|
#### Returns
|
|
1080
1052
|
|
|
1081
|
-
`
|
|
1053
|
+
`Meter` \| `undefined`
|
|
1082
1054
|
|
|
1083
1055
|
### Inherited from
|
|
1084
1056
|
|
|
@@ -1113,12 +1085,12 @@ Base.params
|
|
|
1113
1085
|
### Get Signature
|
|
1114
1086
|
|
|
1115
1087
|
```ts
|
|
1116
|
-
get tracer():
|
|
1088
|
+
get tracer(): Tracer | undefined;
|
|
1117
1089
|
```
|
|
1118
1090
|
|
|
1119
1091
|
#### Returns
|
|
1120
1092
|
|
|
1121
|
-
`
|
|
1093
|
+
`Tracer` \| `undefined`
|
|
1122
1094
|
|
|
1123
1095
|
### Inherited from
|
|
1124
1096
|
|
|
@@ -1163,12 +1135,12 @@ set static isDebugEnabled(newValue): void;
|
|
|
1163
1135
|
### Get Signature
|
|
1164
1136
|
|
|
1165
1137
|
```ts
|
|
1166
|
-
get debug():
|
|
1138
|
+
get debug(): DebugOptions | undefined;
|
|
1167
1139
|
```
|
|
1168
1140
|
|
|
1169
1141
|
#### Returns
|
|
1170
1142
|
|
|
1171
|
-
|
|
1143
|
+
[`DebugOptions`](#../type-aliases/DebugOptions) \| `undefined`
|
|
1172
1144
|
|
|
1173
1145
|
## Methods
|
|
1174
1146
|
|
|
@@ -1206,7 +1178,7 @@ static gc(className): void;
|
|
|
1206
1178
|
|
|
1207
1179
|
##### className
|
|
1208
1180
|
|
|
1209
|
-
`
|
|
1181
|
+
`BaseClassName`
|
|
1210
1182
|
|
|
1211
1183
|
#### Returns
|
|
1212
1184
|
|
|
@@ -1230,7 +1202,7 @@ static instanceCount(className): number;
|
|
|
1230
1202
|
|
|
1231
1203
|
#### className
|
|
1232
1204
|
|
|
1233
|
-
`
|
|
1205
|
+
`BaseClassName`
|
|
1234
1206
|
|
|
1235
1207
|
### Returns
|
|
1236
1208
|
|
|
@@ -1355,7 +1327,7 @@ emit<TEventName>(eventName, eventArgs): Promise<void>;
|
|
|
1355
1327
|
### emitMetaEvent()
|
|
1356
1328
|
|
|
1357
1329
|
```ts
|
|
1358
|
-
emitMetaEvent<TEventName>(eventName, eventArgs): Promise<
|
|
1330
|
+
emitMetaEvent<TEventName>(eventName, eventArgs): Promise<boolean | undefined>;
|
|
1359
1331
|
```
|
|
1360
1332
|
|
|
1361
1333
|
### Type Parameters
|
|
@@ -1376,7 +1348,7 @@ emitMetaEvent<TEventName>(eventName, eventArgs): Promise<undefined | boolean>;
|
|
|
1376
1348
|
|
|
1377
1349
|
### Returns
|
|
1378
1350
|
|
|
1379
|
-
`Promise`\<`
|
|
1351
|
+
`Promise`\<`boolean` \| `undefined`\>
|
|
1380
1352
|
|
|
1381
1353
|
***
|
|
1382
1354
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAKnC,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAC/E,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;EAOE;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;AAEjH,MAAM,MAAM,iBAAiB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI;IACxE,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CACpC,CAAA;AAID;;EAEE;
|
|
1
|
+
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events/Events.ts"],"names":[],"mappings":"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"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -42,7 +42,7 @@ var Events = class _Events extends Base {
|
|
|
42
42
|
if (typeof globalThis.process?.env !== "object") {
|
|
43
43
|
return _Events.isGlobalDebugEnabled;
|
|
44
44
|
}
|
|
45
|
-
const { env } = globalThis.process
|
|
45
|
+
const { env } = globalThis.process;
|
|
46
46
|
return env.DEBUG === "events" || env.DEBUG === "*" || _Events.isGlobalDebugEnabled;
|
|
47
47
|
}
|
|
48
48
|
static set isDebugEnabled(newValue) {
|
|
@@ -224,11 +224,13 @@ var Events = class _Events extends Base {
|
|
|
224
224
|
...staticListeners.map(async (listener) => {
|
|
225
225
|
await this.safeCallListener(eventName, eventArgs, listener);
|
|
226
226
|
}),
|
|
227
|
+
/* v8 ignore start -- race condition guard */
|
|
227
228
|
...staticAnyListeners.map(async (listener) => {
|
|
228
229
|
if (anyListeners.has(listener)) {
|
|
229
230
|
await this.safeCallAnyListener(eventName, eventArgs, listener);
|
|
230
231
|
}
|
|
231
232
|
})
|
|
233
|
+
/* v8 ignore stop */
|
|
232
234
|
]);
|
|
233
235
|
return true;
|
|
234
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/BaseEmitter.ts","../../src/Events/Events.ts"],"sourcesContent":["import type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport type { EmptyObject } from '@xylabs/object'\n\nimport { Events } from './Events/index.ts'\nimport type {\n EventAnyListener, EventData, EventEmitter,\n EventListener,\n} from './model/index.ts'\n\nexport interface BaseEmitterParamsFields {}\n\nexport type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>\n\nexport class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData>\n extends Base<TParams> implements EventEmitter<TEventData> {\n // just here to query types\n eventData = {} as TEventData\n\n private events: Events<TEventData>\n\n constructor(params: BaseParams<TParams>) {\n super(params)\n this.events = new Events<TEventData>()\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n this.events.clearListeners(eventNames)\n return this\n }\n\n emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emit(eventName, eventArgs)\n }\n\n emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emitSerial(eventName, eventArgs)\n }\n\n listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]) {\n return this.events.listenerCount(eventNames)\n }\n\n off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.off(eventNames, listener)\n }\n\n offAny(listener: EventAnyListener) {\n return this.events.offAny(listener)\n }\n\n on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.on(eventNames, listener)\n }\n\n onAny(listener: EventAnyListener) {\n return this.events.onAny(listener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n return this.events.once(eventName, listener)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { isDefined } from '@xylabs/typeof'\n\nimport type {\n EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName,\n} from '../model/index.ts'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true\non the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static isGlobalDebugEnabled = false\n\n // this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n private _canEmitMetaEvents = false\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger\n = mutatedParams.debug.logger\n ?? ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process ?? { env: {} }\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n this.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n return await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n this._canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n return true\n } finally {\n this._canEmitMetaEvents = false\n return false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter(value => (isDefined(value.filter) ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n // TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener> | undefined\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].filter(value => (isDefined(filter) ? isDefined(value.listener) : true)).map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n return true\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":"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","names":["Base","eventName","Base"]}
|
|
1
|
+
{"version":3,"sources":["../../src/BaseEmitter.ts","../../src/Events/Events.ts"],"sourcesContent":["import type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport type { EmptyObject } from '@xylabs/object'\n\nimport { Events } from './Events/index.ts'\nimport type {\n EventAnyListener, EventData, EventEmitter,\n EventListener,\n} from './model/index.ts'\n\nexport interface BaseEmitterParamsFields {}\n\nexport type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>\n\nexport class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData>\n extends Base<TParams> implements EventEmitter<TEventData> {\n // just here to query types\n eventData = {} as TEventData\n\n private events: Events<TEventData>\n\n constructor(params: BaseParams<TParams>) {\n super(params)\n this.events = new Events<TEventData>()\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n this.events.clearListeners(eventNames)\n return this\n }\n\n emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emit(eventName, eventArgs)\n }\n\n emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n ) {\n return this.events.emitSerial(eventName, eventArgs)\n }\n\n listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]) {\n return this.events.listenerCount(eventNames)\n }\n\n off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.off(eventNames, listener)\n }\n\n offAny(listener: EventAnyListener) {\n return this.events.offAny(listener)\n }\n\n on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {\n return this.events.on(eventNames, listener)\n }\n\n onAny(listener: EventAnyListener) {\n return this.events.onAny(listener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n return this.events.once(eventName, listener)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { BaseParams } from '@xylabs/base'\nimport { Base } from '@xylabs/base'\nimport { handleError } from '@xylabs/error'\nimport { forget } from '@xylabs/forget'\nimport { isDefined } from '@xylabs/typeof'\n\nimport type {\n EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName,\n} from '../model/index.ts'\n\n/**\nEmittery can collect and log debug information.\n\nTo enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true\non the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.\n\nSee API for more information on how debugging works.\n*/\nexport type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void\n\nexport type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {\n filter?: TEventArgs\n listener: EventListener<TEventArgs>\n}\n\nconst NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'\n\n/**\nConfigure debug options of an instance.\n*/\n/* v8 ignore next 5 */\nexport type DebugOptions = {\n enabled?: boolean\n logger?: DebugLogger\n readonly name: string\n}\n\nconst resolvedPromise = Promise.resolve()\n\nexport type MetaEventData<TEventData extends EventData> = {\n listenerAdded: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n listenerRemoved: {\n eventName?: keyof TEventData\n listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>\n }\n}\n\nconst isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'\n\nexport type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>\n\nexport class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<TEventData> {\n protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()\n protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()\n\n private static isGlobalDebugEnabled = false\n\n // this is here to be able to query the type, not use\n eventData = {} as TEventData\n\n private _canEmitMetaEvents = false\n\n constructor(params: EventsParams = {}) {\n const mutatedParams = { ...params }\n if (mutatedParams.debug) {\n mutatedParams.debug.logger\n = mutatedParams.debug.logger\n ?? ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {\n let eventDataString: string\n try {\n eventDataString = JSON.stringify(eventData)\n } catch {\n eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`\n }\n\n const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName\n\n const currentTime = new Date()\n const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`\n this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\\n\\tdata: ${eventDataString}`)\n })\n }\n super(mutatedParams)\n Events.anyMap.set(this, new Set<EventAnyListener>())\n Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())\n }\n\n static get isDebugEnabled() {\n // In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n // so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\n if (typeof globalThis.process?.env !== 'object') {\n return Events.isGlobalDebugEnabled\n }\n\n const { env } = globalThis.process\n return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled\n }\n\n static set isDebugEnabled(newValue) {\n this.isGlobalDebugEnabled = newValue\n }\n\n get debug() {\n return this.params.debug\n }\n\n clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n\n for (const eventName of eventNamesArray) {\n this.logIfDebugEnabled('clear', eventName)\n\n if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {\n const set = this.getListeners(eventName)\n if (set) {\n set.clear()\n }\n } else {\n Events.anyMap.get(this)?.clear()\n\n for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {\n listeners.clear()\n Events.eventsMap.get(this)?.delete(eventName)\n }\n }\n }\n }\n\n async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n return await this.emitInternal(eventName, eventArgs)\n }\n\n async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {\n if (isMetaEvent(eventName)) {\n try {\n this._canEmitMetaEvents = true\n await this.emitMetaEventInternal(eventName, eventArgs)\n return true\n } finally {\n this._canEmitMetaEvents = false\n return false\n }\n }\n }\n\n async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {\n switch (typeof filter) {\n case 'object': {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)\n }\n default: {\n return args === filter\n }\n }\n }\n\n this.logIfDebugEnabled('emitSerial', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()]\n .filter(value => (isDefined(value.filter) ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))\n .map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = [...anyListeners]\n\n await resolvedPromise\n\n for (const listener of staticListeners) {\n await this.safeCallListener(eventName, eventArgs, listener)\n }\n\n for (const listener of staticAnyListeners) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }\n\n // TODO: Make test for this\n listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n let count = 0\n\n for (const eventName of eventNamesArray) {\n if (typeof eventName === 'string') {\n count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)\n\n continue\n }\n\n count += assertEx(Events.anyMap.get(this)).size\n\n for (const value of assertEx(Events.eventsMap.get(this)).values()) {\n count += value.size\n }\n }\n\n return count\n }\n\n logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {\n if (Events.isDebugEnabled || this.debug?.enabled) {\n this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)\n }\n }\n\n off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(\n eventNames: TEventName | TEventName[],\n listener: TEventListener,\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n const set = this.getListeners(eventName) as Set<TEventListener> | undefined\n if (set) {\n set.delete(listener)\n if (set.size === 0) {\n const events = Events.eventsMap.get(this)\n events?.delete(eventName)\n }\n }\n\n this.logIfDebugEnabled('unsubscribe', eventName)\n\n /* v8 ignore next 3 -- meta events don't reach this path via public API */\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))\n }\n }\n }\n\n offAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('unsubscribeAny')\n\n const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>\n typedMap?.delete(listener)\n forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))\n }\n\n on<TEventName extends keyof TEventData = keyof TEventData>(\n eventNames: TEventName | TEventName[],\n listener: EventListener<TEventData[TEventName]>,\n filter?: TEventData[TEventName],\n ) {\n const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]\n for (const eventName of eventNamesArray) {\n let set = this.getListeners(eventName)\n if (!set) {\n set = new Set()\n const events = Events.eventsMap.get(this)\n events?.set(eventName, set)\n }\n\n set.add({ filter, listener: listener as EventListener })\n\n this.logIfDebugEnabled('subscribe', eventName)\n\n if (!isMetaEvent(eventName)) {\n forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))\n }\n }\n\n return this.off.bind(this, eventNames, listener as EventListener)\n }\n\n onAny(listener: EventAnyListener) {\n this.logIfDebugEnabled('subscribeAny')\n\n Events.anyMap.get(this)?.add(listener as EventAnyListener)\n forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))\n return this.offAny.bind(this, listener as EventAnyListener)\n }\n\n once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {\n const subListener = async (args: TEventData[TEventName]) => {\n this.off(eventName, subListener)\n await this.safeCallListener(eventName, args, listener)\n }\n this.on(eventName, subListener)\n return this.off.bind(this, eventName, subListener as EventListener)\n }\n\n private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(\n eventName: TEventName,\n eventArgs: TEventArgs,\n filter?: TEventArgs,\n ) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n /* v8 ignore start -- filter parameter is reserved for future use; anyListeners.has is a race condition guard */\n const filteredListeners = [...listeners.values()].filter(value => (isDefined(filter) ? isDefined(value.listener) : true)).map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n ])\n /* v8 ignore stop */\n }\n\n private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(\n eventName: TEventName,\n eventArgs: MetaEventData<TEventData>[TEventName],\n ) {\n if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {\n throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')\n }\n\n this.logIfDebugEnabled('emit', eventName, eventArgs)\n\n const listeners = this.getListeners(eventName) ?? new Set()\n const filteredListeners = [...listeners.values()].map(info => info.listener)\n const anyListeners = assertEx(Events.anyMap.get(this))\n const staticListeners = [...filteredListeners]\n const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]\n\n await resolvedPromise\n await Promise.all([\n ...staticListeners.map(async (listener) => {\n await this.safeCallListener(eventName, eventArgs, listener)\n }),\n /* v8 ignore start -- race condition guard */\n ...staticAnyListeners.map(async (listener) => {\n if (anyListeners.has(listener)) {\n await this.safeCallAnyListener(eventName, eventArgs, listener)\n }\n }),\n /* v8 ignore stop */\n ])\n return true\n }\n\n private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {\n const events = assertEx(Events.eventsMap.get(this))\n if (!events.has(eventName)) {\n return\n }\n\n return events.get(eventName)\n }\n\n private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventAnyListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventName, eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n\n private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(\n eventName: TEventName,\n eventArgs: TEventData[TEventName],\n listener: EventListener<TEventData[TEventName]>,\n ) {\n try {\n return await listener(eventArgs)\n } catch (ex) {\n handleError(ex, (error) => {\n this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)\n })\n }\n }\n}\n"],"mappings":";AACA,SAAS,QAAAA,aAAY;;;ACDrB,SAAS,gBAAgB;AAEzB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAqB1B,IAAM,8BAA8B;AAYpC,IAAM,kBAAkB,QAAQ,QAAQ;AAaxC,IAAM,cAAc,CAAC,cAAyB,cAAc,mBAAmB,cAAc;AAItF,IAAM,SAAN,MAAM,gBAAyD,KAAuD;AAAA,EAC3H,OAAiB,SAAS,oBAAI,QAAuC;AAAA,EACrE,OAAiB,YAAY,oBAAI,QAAwD;AAAA,EAEzF,OAAe,uBAAuB;AAAA;AAAA,EAGtC,YAAY,CAAC;AAAA,EAEL,qBAAqB;AAAA,EAE7B,YAAY,SAAuB,CAAC,GAAG;AACrC,UAAM,gBAAgB,EAAE,GAAG,OAAO;AAClC,QAAI,cAAc,OAAO;AACvB,oBAAc,MAAM,SAChB,cAAc,MAAM,WAChB,CAAC,MAAc,WAAmB,WAAuB,cAA0B;AACrF,YAAI;AACJ,YAAI;AACF,4BAAkB,KAAK,UAAU,SAAS;AAAA,QAC5C,QAAQ;AACN,4BAAkB,uDAAuD,OAAO,KAAK,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,QACjH;AAEA,cAAM,kBAAkB,OAAO,cAAc,YAAY,OAAO,cAAc,WAAW,UAAU,SAAS,IAAI;AAEhH,cAAM,cAAc,oBAAI,KAAK;AAC7B,cAAM,UAAU,GAAG,YAAY,SAAS,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,YAAY,gBAAgB,CAAC;AAClI,aAAK,QAAQ,IAAI,IAAI,OAAO,YAAY,IAAI,KAAK,SAAS,iBAAiB,eAAe;AAAA,SAAa,eAAe,EAAE;AAAA,MAC1H;AAAA,IACN;AACA,UAAM,aAAa;AACnB,YAAO,OAAO,IAAI,MAAM,oBAAI,IAAsB,CAAC;AACnD,YAAO,UAAU,IAAI,MAAM,oBAAI,IAA8C,CAAC;AAAA,EAChF;AAAA,EAEA,WAAW,iBAAiB;AAI1B,QAAI,OAAO,WAAW,SAAS,QAAQ,UAAU;AAC/C,aAAO,QAAO;AAAA,IAChB;AAEA,UAAM,EAAE,IAAI,IAAI,WAAW;AAC3B,WAAO,IAAI,UAAU,YAAY,IAAI,UAAU,OAAO,QAAO;AAAA,EAC/D;AAAA,EAEA,WAAW,eAAe,UAAU;AAClC,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,eAAe,YAAqD;AAClE,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAE5E,eAAW,aAAa,iBAAiB;AACvC,WAAK,kBAAkB,SAAS,SAAS;AAEzC,UAAI,OAAO,cAAc,YAAY,OAAO,cAAc,YAAY,OAAO,cAAc,UAAU;AACnG,cAAM,MAAM,KAAK,aAAa,SAAS;AACvC,YAAI,KAAK;AACP,cAAI,MAAM;AAAA,QACZ;AAAA,MACF,OAAO;AACL,gBAAO,OAAO,IAAI,IAAI,GAAG,MAAM;AAE/B,mBAAW,CAACC,YAAW,SAAS,KAAK,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC,EAAE,QAAQ,GAAG;AACnF,oBAAU,MAAM;AAChB,kBAAO,UAAU,IAAI,IAAI,GAAG,OAAOA,UAAS;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAA0C,WAAuB,WAAmC;AACxG,WAAO,MAAM,KAAK,aAAa,WAAW,SAAS;AAAA,EACrD;AAAA,EAEA,MAAM,cAAkE,WAAuB,WAAkD;AAC/I,QAAI,YAAY,SAAS,GAAG;AAC1B,UAAI;AACF,aAAK,qBAAqB;AAC1B,cAAM,KAAK,sBAAsB,WAAW,SAAS;AACrD,eAAO;AAAA,MACT,UAAE;AACA,aAAK,qBAAqB;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAgD,WAAuB,WAAmC;AAC9G,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,2BAA2B;AAAA,IACjD;AAEA,UAAM,cAAc,CAAC,MAA8B,WAAmC;AACpF,cAAQ,OAAO,QAAQ;AAAA,QACrB,KAAK,UAAU;AAEb,iBAAO,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,MAAQ,OAAwC,GAAG,MAAM,QAAQ,OAAO,MAAO,KAAK;AAAA,QAC3I;AAAA,QACA,SAAS;AACP,iBAAO,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,kBAAkB,cAAc,WAAW,SAAS;AAEzD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAC1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAC7C,OAAO,WAAU,UAAU,MAAM,MAAM,IAAI,YAAY,WAAW,MAAM,MAAgC,IAAI,IAAK,EACjH,IAAI,UAAQ,KAAK,QAAQ;AAC5B,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,CAAC,GAAG,YAAY;AAE3C,UAAM;AAEN,eAAW,YAAY,iBAAiB;AACtC,YAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,IAC5D;AAEA,eAAW,YAAY,oBAAoB;AACzC,YAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,YAAsD;AAClE,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,QAAI,QAAQ;AAEZ,eAAW,aAAa,iBAAiB;AACvC,UAAI,OAAO,cAAc,UAAU;AACjC,iBAAS,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,KAAK,aAAa,SAAS,GAAG,QAAQ;AAEzF;AAAA,MACF;AAEA,eAAS,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC,EAAE;AAE3C,iBAAW,SAAS,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC,EAAE,OAAO,GAAG;AACjE,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAgD,MAAc,WAAwB,WAAuB;AAC3G,QAAI,QAAO,kBAAkB,KAAK,OAAO,SAAS;AAChD,WAAK,OAAO,SAAS,MAAM,KAAK,MAAM,MAAM,WAAW,SAAS;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,IACE,YACA,UACA;AACA,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,eAAW,aAAa,iBAAiB;AACvC,YAAM,MAAM,KAAK,aAAa,SAAS;AACvC,UAAI,KAAK;AACP,YAAI,OAAO,QAAQ;AACnB,YAAI,IAAI,SAAS,GAAG;AAClB,gBAAM,SAAS,QAAO,UAAU,IAAI,IAAI;AACxC,kBAAQ,OAAO,SAAS;AAAA,QAC1B;AAAA,MACF;AAEA,WAAK,kBAAkB,eAAe,SAAS;AAG/C,UAAI,CAAC,YAAY,SAAS,GAAG;AAC3B,eAAO,KAAK,cAAc,mBAAmB,EAAE,WAAW,SAAoC,CAAC,CAAC;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,UAA4B;AACjC,SAAK,kBAAkB,gBAAgB;AAEvC,UAAM,WAAW,QAAO,OAAO,IAAI,IAAI;AACvC,cAAU,OAAO,QAAQ;AACzB,WAAO,KAAK,cAAc,mBAAmB,EAAE,SAAuC,CAAC,CAAC;AAAA,EAC1F;AAAA,EAEA,GACE,YACA,UACA,QACA;AACA,UAAM,kBAAkB,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AAC5E,eAAW,aAAa,iBAAiB;AACvC,UAAI,MAAM,KAAK,aAAa,SAAS;AACrC,UAAI,CAAC,KAAK;AACR,cAAM,oBAAI,IAAI;AACd,cAAM,SAAS,QAAO,UAAU,IAAI,IAAI;AACxC,gBAAQ,IAAI,WAAW,GAAG;AAAA,MAC5B;AAEA,UAAI,IAAI,EAAE,QAAQ,SAAoC,CAAC;AAEvD,WAAK,kBAAkB,aAAa,SAAS;AAE7C,UAAI,CAAC,YAAY,SAAS,GAAG;AAC3B,eAAO,KAAK,cAAc,iBAAiB,EAAE,WAAW,SAAoC,CAAC,CAAC;AAAA,MAChG;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,KAAK,MAAM,YAAY,QAAyB;AAAA,EAClE;AAAA,EAEA,MAAM,UAA4B;AAChC,SAAK,kBAAkB,cAAc;AAErC,YAAO,OAAO,IAAI,IAAI,GAAG,IAAI,QAA4B;AACzD,WAAO,KAAK,cAAc,iBAAiB,EAAE,SAAuC,CAAC,CAAC;AACtF,WAAO,KAAK,OAAO,KAAK,MAAM,QAA4B;AAAA,EAC5D;AAAA,EAEA,KAA0C,WAAuB,UAAiD;AAChH,UAAM,cAAc,OAAO,SAAiC;AAC1D,WAAK,IAAI,WAAW,WAAW;AAC/B,YAAM,KAAK,iBAAiB,WAAW,MAAM,QAAQ;AAAA,IACvD;AACA,SAAK,GAAG,WAAW,WAAW;AAC9B,WAAO,KAAK,IAAI,KAAK,MAAM,WAAW,WAA4B;AAAA,EACpE;AAAA,EAEA,MAAc,aACZ,WACA,WACA,QACA;AACA,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,2BAA2B;AAAA,IACjD;AAEA,SAAK,kBAAkB,QAAQ,WAAW,SAAS;AAEnD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAE1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,OAAO,WAAU,UAAU,MAAM,IAAI,UAAU,MAAM,QAAQ,IAAI,IAAK,EAAE,IAAI,UAAQ,KAAK,QAAQ;AACnJ,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,YAAY,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY;AAEzE,UAAM;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,GAAG,gBAAgB,IAAI,OAAO,aAAa;AACzC,cAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,MAC5D,CAAC;AAAA,MACD,GAAG,mBAAmB,IAAI,OAAO,aAAa;AAC5C,YAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,gBAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EAEH;AAAA,EAEA,MAAc,sBACZ,WACA,WACA;AACA,QAAI,YAAY,SAAS,KAAK,CAAC,KAAK,oBAAoB;AACtD,YAAM,IAAI,UAAU,uEAAuE;AAAA,IAC7F;AAEA,SAAK,kBAAkB,QAAQ,WAAW,SAAS;AAEnD,UAAM,YAAY,KAAK,aAAa,SAAS,KAAK,oBAAI,IAAI;AAC1D,UAAM,oBAAoB,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,IAAI,UAAQ,KAAK,QAAQ;AAC3E,UAAM,eAAe,SAAS,QAAO,OAAO,IAAI,IAAI,CAAC;AACrD,UAAM,kBAAkB,CAAC,GAAG,iBAAiB;AAC7C,UAAM,qBAAqB,YAAY,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY;AAEzE,UAAM;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,GAAG,gBAAgB,IAAI,OAAO,aAAa;AACzC,cAAM,KAAK,iBAAiB,WAAW,WAAW,QAAQ;AAAA,MAC5D,CAAC;AAAA;AAAA,MAED,GAAG,mBAAmB,IAAI,OAAO,aAAa;AAC5C,YAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,gBAAM,KAAK,oBAAoB,WAAW,WAAW,QAAQ;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA;AAAA,IAEH,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,aAAkD,WAAuB;AAC/E,UAAM,SAAS,SAAS,QAAO,UAAU,IAAI,IAAI,CAAC;AAClD,QAAI,CAAC,OAAO,IAAI,SAAS,GAAG;AAC1B;AAAA,IACF;AAEA,WAAO,OAAO,IAAI,SAAS;AAAA,EAC7B;AAAA,EAEA,MAAc,oBACZ,WACA,WACA,UACA;AACA,QAAI;AACF,aAAO,MAAM,SAAS,WAAW,SAAS;AAAA,IAC5C,SAAS,IAAI;AACX,kBAAY,IAAI,CAAC,UAAU;AACzB,aAAK,QAAQ,MAAM,YAAY,OAAO,SAAS,CAAC,eAAe,MAAM,OAAO,EAAE;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,WACA,WACA,UACA;AACA,QAAI;AACF,aAAO,MAAM,SAAS,SAAS;AAAA,IACjC,SAAS,IAAI;AACX,kBAAY,IAAI,CAAC,UAAU;AACzB,aAAK,QAAQ,MAAM,YAAY,OAAO,SAAS,CAAC,eAAe,MAAM,OAAO,EAAE;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ADzXO,IAAM,cAAN,cACGC,MAAkD;AAAA;AAAA,EAE1D,YAAY,CAAC;AAAA,EAEL;AAAA,EAER,YAAY,QAA6B;AACvC,UAAM,MAAM;AACZ,SAAK,SAAS,IAAI,OAAmB;AAAA,EACvC;AAAA,EAEA,eAAe,YAAqD;AAClE,SAAK,OAAO,eAAe,UAAU;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,KACE,WACA,WACA;AACA,WAAO,KAAK,OAAO,KAAK,WAAW,SAAS;AAAA,EAC9C;AAAA,EAEA,WACE,WACA,WACA;AACA,WAAO,KAAK,OAAO,WAAW,WAAW,SAAS;AAAA,EACpD;AAAA,EAEA,cAAc,YAAqD;AACjE,WAAO,KAAK,OAAO,cAAc,UAAU;AAAA,EAC7C;AAAA,EAEA,IAAyC,YAAuC,UAAiD;AAC/H,WAAO,KAAK,OAAO,IAAI,YAAY,QAAQ;AAAA,EAC7C;AAAA,EAEA,OAAO,UAA4B;AACjC,WAAO,KAAK,OAAO,OAAO,QAAQ;AAAA,EACpC;AAAA,EAEA,GAAwC,YAAuC,UAAiD;AAC9H,WAAO,KAAK,OAAO,GAAG,YAAY,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,UAA4B;AAChC,WAAO,KAAK,OAAO,MAAM,QAAQ;AAAA,EACnC;AAAA,EAEA,KAA0C,WAAuB,UAAiD;AAChH,WAAO,KAAK,OAAO,KAAK,WAAW,QAAQ;AAAA,EAC7C;AACF;","names":["Base","eventName","Base"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../src/model/Event.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../src/model/Event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,SAAS,GAAG,WAAW,CAAA;AACnC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAChD,MAAM,MAAM,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAA;AACvD,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAA;AACjD,MAAM,MAAM,gBAAgB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA;AAC1I,MAAM,MAAM,aAAa,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,SAAS,EAAE,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../../src/model/EventEmitter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../../src/model/EventEmitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,wBAAwB,EACrE,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS;IAC/C,SAAS,EAAE,CAAC,CAAA;IACZ,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,CAAA;IACvD,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG,UAAU,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAA;IACxD,GAAG,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;IACpH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,EAAE,CAAC,UAAU,SAAS,MAAM,CAAC,EAC3B,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,EACrC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GACrC,wBAAwB,CAAA;IAC3B,KAAK,CAAC,QAAQ,EAAE,gBAAgB,GAAG,wBAAwB,CAAA;IAC3D,IAAI,CAAC,UAAU,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,wBAAwB,CAAA;CAC1H"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/events",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.82",
|
|
4
4
|
"description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -22,35 +22,32 @@
|
|
|
22
22
|
"exports": {
|
|
23
23
|
".": {
|
|
24
24
|
"types": "./dist/neutral/index.d.ts",
|
|
25
|
-
"source": "./src/index.ts",
|
|
26
25
|
"default": "./dist/neutral/index.mjs"
|
|
27
26
|
},
|
|
28
27
|
"./package.json": "./package.json"
|
|
29
28
|
},
|
|
30
29
|
"module": "./dist/neutral/index.mjs",
|
|
31
|
-
"source": "./src/index.ts",
|
|
32
30
|
"types": "./dist/neutral/index.d.ts",
|
|
33
31
|
"files": [
|
|
34
32
|
"dist",
|
|
35
|
-
"src",
|
|
36
33
|
"!**/*.bench.*",
|
|
37
34
|
"!**/*.spec.*",
|
|
38
35
|
"!**/*.test.*"
|
|
39
36
|
],
|
|
40
37
|
"dependencies": {
|
|
41
|
-
"@xylabs/assert": "~5.0.
|
|
42
|
-
"@xylabs/base": "~5.0.
|
|
43
|
-
"@xylabs/error": "~5.0.
|
|
44
|
-
"@xylabs/forget": "~5.0.
|
|
45
|
-
"@xylabs/object": "~5.0.
|
|
46
|
-
"@xylabs/promise": "~5.0.
|
|
47
|
-
"@xylabs/typeof": "~5.0.
|
|
38
|
+
"@xylabs/assert": "~5.0.82",
|
|
39
|
+
"@xylabs/base": "~5.0.82",
|
|
40
|
+
"@xylabs/error": "~5.0.82",
|
|
41
|
+
"@xylabs/forget": "~5.0.82",
|
|
42
|
+
"@xylabs/object": "~5.0.82",
|
|
43
|
+
"@xylabs/promise": "~5.0.82",
|
|
44
|
+
"@xylabs/typeof": "~5.0.82",
|
|
45
|
+
"@xylabs/vitest-extended": "~5.0.82"
|
|
48
46
|
},
|
|
49
47
|
"devDependencies": {
|
|
50
|
-
"@xylabs/delay": "~5.0.
|
|
51
|
-
"@xylabs/ts-scripts-yarn3": "~7.
|
|
52
|
-
"@xylabs/tsconfig": "~7.
|
|
53
|
-
"@xylabs/vitest-extended": "~5.0.80",
|
|
48
|
+
"@xylabs/delay": "~5.0.82",
|
|
49
|
+
"@xylabs/ts-scripts-yarn3": "~7.4.11",
|
|
50
|
+
"@xylabs/tsconfig": "~7.4.11",
|
|
54
51
|
"typescript": "~5.9.3",
|
|
55
52
|
"vitest": "~4.0.18"
|
|
56
53
|
},
|
package/src/BaseEmitter.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { BaseParams } from '@xylabs/base'
|
|
2
|
-
import { Base } from '@xylabs/base'
|
|
3
|
-
import type { EmptyObject } from '@xylabs/object'
|
|
4
|
-
|
|
5
|
-
import { Events } from './Events/index.ts'
|
|
6
|
-
import type {
|
|
7
|
-
EventAnyListener, EventData, EventEmitter,
|
|
8
|
-
EventListener,
|
|
9
|
-
} from './model/index.ts'
|
|
10
|
-
|
|
11
|
-
export interface BaseEmitterParamsFields {}
|
|
12
|
-
|
|
13
|
-
export type BaseEmitterParams<T extends EmptyObject = EmptyObject> = BaseParams<T & BaseEmitterParamsFields & T>
|
|
14
|
-
|
|
15
|
-
export class BaseEmitter<TParams extends BaseParams = BaseParams, TEventData extends EventData = EventData>
|
|
16
|
-
extends Base<TParams> implements EventEmitter<TEventData> {
|
|
17
|
-
// just here to query types
|
|
18
|
-
eventData = {} as TEventData
|
|
19
|
-
|
|
20
|
-
private events: Events<TEventData>
|
|
21
|
-
|
|
22
|
-
constructor(params: BaseParams<TParams>) {
|
|
23
|
-
super(params)
|
|
24
|
-
this.events = new Events<TEventData>()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {
|
|
28
|
-
this.events.clearListeners(eventNames)
|
|
29
|
-
return this
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
emit<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(
|
|
33
|
-
eventName: TEventName,
|
|
34
|
-
eventArgs: TEventArgs,
|
|
35
|
-
) {
|
|
36
|
-
return this.events.emit(eventName, eventArgs)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
emitSerial<TEventName extends keyof TEventData = keyof TEventData, TEventArgs extends TEventData[TEventName] = TEventData[TEventName]>(
|
|
40
|
-
eventName: TEventName,
|
|
41
|
-
eventArgs: TEventArgs,
|
|
42
|
-
) {
|
|
43
|
-
return this.events.emitSerial(eventName, eventArgs)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
listenerCount(eventNames: keyof TEventData | (keyof TEventData)[]) {
|
|
47
|
-
return this.events.listenerCount(eventNames)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
off<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {
|
|
51
|
-
return this.events.off(eventNames, listener)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
offAny(listener: EventAnyListener) {
|
|
55
|
-
return this.events.offAny(listener)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
on<TEventName extends keyof TEventData>(eventNames: TEventName | TEventName[], listener: EventListener<TEventData[TEventName]>) {
|
|
59
|
-
return this.events.on(eventNames, listener)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
onAny(listener: EventAnyListener) {
|
|
63
|
-
return this.events.onAny(listener)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {
|
|
67
|
-
return this.events.once(eventName, listener)
|
|
68
|
-
}
|
|
69
|
-
}
|
package/src/Events/Events.ts
DELETED
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
import { assertEx } from '@xylabs/assert'
|
|
2
|
-
import type { BaseParams } from '@xylabs/base'
|
|
3
|
-
import { Base } from '@xylabs/base'
|
|
4
|
-
import { handleError } from '@xylabs/error'
|
|
5
|
-
import { forget } from '@xylabs/forget'
|
|
6
|
-
import { isDefined } from '@xylabs/typeof'
|
|
7
|
-
|
|
8
|
-
import type {
|
|
9
|
-
EventAnyListener, EventArgs, EventData, EventEmitter, EventListener, EventName,
|
|
10
|
-
} from '../model/index.ts'
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
Emittery can collect and log debug information.
|
|
14
|
-
|
|
15
|
-
To enable this feature set the `DEBUG` environment variable to `emittery` or `*`. Additionally, you can set the static `isDebugEnabled` variable to true
|
|
16
|
-
on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance.
|
|
17
|
-
|
|
18
|
-
See API for more information on how debugging works.
|
|
19
|
-
*/
|
|
20
|
-
export type DebugLogger = (type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => void
|
|
21
|
-
|
|
22
|
-
export type EventListenerInfo<TEventArgs extends EventArgs = EventArgs> = {
|
|
23
|
-
filter?: TEventArgs
|
|
24
|
-
listener: EventListener<TEventArgs>
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const NO_META_EVENT_ERROR_MESSAGE = '`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`'
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
Configure debug options of an instance.
|
|
31
|
-
*/
|
|
32
|
-
export type DebugOptions = {
|
|
33
|
-
enabled?: boolean
|
|
34
|
-
logger?: DebugLogger
|
|
35
|
-
readonly name: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const resolvedPromise = Promise.resolve()
|
|
39
|
-
|
|
40
|
-
export type MetaEventData<TEventData extends EventData> = {
|
|
41
|
-
listenerAdded: {
|
|
42
|
-
eventName?: keyof TEventData
|
|
43
|
-
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>
|
|
44
|
-
}
|
|
45
|
-
listenerRemoved: {
|
|
46
|
-
eventName?: keyof TEventData
|
|
47
|
-
listener: EventListener<TEventData[keyof TEventData]> | EventAnyListener<TEventData[keyof TEventData]>
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const isMetaEvent = (eventName: EventName) => eventName === 'listenerAdded' || eventName === 'listenerRemoved'
|
|
52
|
-
|
|
53
|
-
export type EventsParams = BaseParams<{ readonly debug?: DebugOptions }>
|
|
54
|
-
|
|
55
|
-
export class Events<TEventData extends EventData = EventData> extends Base<EventsParams> implements EventEmitter<TEventData> {
|
|
56
|
-
protected static anyMap = new WeakMap<object, Set<EventAnyListener>>()
|
|
57
|
-
protected static eventsMap = new WeakMap<object, Map<EventName, Set<EventListenerInfo>>>()
|
|
58
|
-
|
|
59
|
-
private static isGlobalDebugEnabled = false
|
|
60
|
-
|
|
61
|
-
// this is here to be able to query the type, not use
|
|
62
|
-
eventData = {} as TEventData
|
|
63
|
-
|
|
64
|
-
private _canEmitMetaEvents = false
|
|
65
|
-
|
|
66
|
-
constructor(params: EventsParams = {}) {
|
|
67
|
-
const mutatedParams = { ...params }
|
|
68
|
-
if (mutatedParams.debug) {
|
|
69
|
-
mutatedParams.debug.logger
|
|
70
|
-
= mutatedParams.debug.logger
|
|
71
|
-
?? ((type: string, debugName: string, eventName?: EventName, eventData?: EventArgs) => {
|
|
72
|
-
let eventDataString: string
|
|
73
|
-
try {
|
|
74
|
-
eventDataString = JSON.stringify(eventData)
|
|
75
|
-
} catch {
|
|
76
|
-
eventDataString = `Object with the following keys failed to stringify: ${Object.keys(eventData ?? {}).join(',')}`
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const eventNameString = typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName.toString() : eventName
|
|
80
|
-
|
|
81
|
-
const currentTime = new Date()
|
|
82
|
-
const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`
|
|
83
|
-
this.logger?.log(`[${logTime}][events:${type}][${debugName}] Event Name: ${eventNameString}\n\tdata: ${eventDataString}`)
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
super(mutatedParams)
|
|
87
|
-
Events.anyMap.set(this, new Set<EventAnyListener>())
|
|
88
|
-
Events.eventsMap.set(this, new Map<keyof TEventData, Set<EventListenerInfo>>())
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
static get isDebugEnabled() {
|
|
92
|
-
// In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,
|
|
93
|
-
// so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.
|
|
94
|
-
|
|
95
|
-
if (typeof globalThis.process?.env !== 'object') {
|
|
96
|
-
return Events.isGlobalDebugEnabled
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const { env } = globalThis.process ?? { env: {} }
|
|
100
|
-
return env.DEBUG === 'events' || env.DEBUG === '*' || Events.isGlobalDebugEnabled
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
static set isDebugEnabled(newValue) {
|
|
104
|
-
this.isGlobalDebugEnabled = newValue
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
get debug() {
|
|
108
|
-
return this.params.debug
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
clearListeners(eventNames: keyof TEventData | (keyof TEventData)[]) {
|
|
112
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]
|
|
113
|
-
|
|
114
|
-
for (const eventName of eventNamesArray) {
|
|
115
|
-
this.logIfDebugEnabled('clear', eventName)
|
|
116
|
-
|
|
117
|
-
if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {
|
|
118
|
-
const set = this.getListeners(eventName)
|
|
119
|
-
if (set) {
|
|
120
|
-
set.clear()
|
|
121
|
-
}
|
|
122
|
-
} else {
|
|
123
|
-
Events.anyMap.get(this)?.clear()
|
|
124
|
-
|
|
125
|
-
for (const [eventName, listeners] of assertEx(Events.eventsMap.get(this)).entries()) {
|
|
126
|
-
listeners.clear()
|
|
127
|
-
Events.eventsMap.get(this)?.delete(eventName)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async emit<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {
|
|
134
|
-
return await this.emitInternal(eventName, eventArgs)
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async emitMetaEvent<TEventName extends keyof MetaEventData<TEventData>>(eventName: TEventName, eventArgs: MetaEventData<TEventData>[TEventName]) {
|
|
138
|
-
if (isMetaEvent(eventName)) {
|
|
139
|
-
try {
|
|
140
|
-
this._canEmitMetaEvents = true
|
|
141
|
-
await this.emitMetaEventInternal(eventName, eventArgs)
|
|
142
|
-
return true
|
|
143
|
-
} finally {
|
|
144
|
-
this._canEmitMetaEvents = false
|
|
145
|
-
return false
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async emitSerial<TEventName extends keyof TEventData>(eventName: TEventName, eventArgs: TEventData[TEventName]) {
|
|
151
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
152
|
-
throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const filterMatch = (args: TEventData[TEventName], filter: TEventData[TEventName]) => {
|
|
156
|
-
switch (typeof filter) {
|
|
157
|
-
case 'object': {
|
|
158
|
-
// eslint-disable-next-line unicorn/no-array-reduce
|
|
159
|
-
return Object.entries(args).reduce((prev, [key, value]) => ((filter as Record<PropertyKey, unknown>)[key] === value ? true : prev), false)
|
|
160
|
-
}
|
|
161
|
-
default: {
|
|
162
|
-
return args === filter
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
this.logIfDebugEnabled('emitSerial', eventName, eventArgs)
|
|
168
|
-
|
|
169
|
-
const listeners = this.getListeners(eventName) ?? new Set()
|
|
170
|
-
const filteredListeners = [...listeners.values()]
|
|
171
|
-
.filter(value => (isDefined(value.filter) ? filterMatch(eventArgs, value.filter as TEventData[TEventName]) : true))
|
|
172
|
-
.map(info => info.listener)
|
|
173
|
-
const anyListeners = assertEx(Events.anyMap.get(this))
|
|
174
|
-
const staticListeners = [...filteredListeners]
|
|
175
|
-
const staticAnyListeners = [...anyListeners]
|
|
176
|
-
|
|
177
|
-
await resolvedPromise
|
|
178
|
-
|
|
179
|
-
for (const listener of staticListeners) {
|
|
180
|
-
await this.safeCallListener(eventName, eventArgs, listener)
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
for (const listener of staticAnyListeners) {
|
|
184
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// TODO: Make test for this
|
|
189
|
-
listenerCount(eventNames?: keyof TEventData | (keyof TEventData)[]) {
|
|
190
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]
|
|
191
|
-
let count = 0
|
|
192
|
-
|
|
193
|
-
for (const eventName of eventNamesArray) {
|
|
194
|
-
if (typeof eventName === 'string') {
|
|
195
|
-
count += assertEx(Events.anyMap.get(this)).size + (this.getListeners(eventName)?.size ?? 0)
|
|
196
|
-
|
|
197
|
-
continue
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
count += assertEx(Events.anyMap.get(this)).size
|
|
201
|
-
|
|
202
|
-
for (const value of assertEx(Events.eventsMap.get(this)).values()) {
|
|
203
|
-
count += value.size
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return count
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
logIfDebugEnabled<TEventName extends EventName>(type: string, eventName?: TEventName, eventArgs?: EventArgs) {
|
|
211
|
-
if (Events.isDebugEnabled || this.debug?.enabled) {
|
|
212
|
-
this.debug?.logger?.(type, this.debug.name, eventName, eventArgs)
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
off<TEventName extends keyof TEventData, TEventListener = EventListener<TEventData[TEventName]>>(
|
|
217
|
-
eventNames: TEventName | TEventName[],
|
|
218
|
-
listener: TEventListener,
|
|
219
|
-
) {
|
|
220
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]
|
|
221
|
-
for (const eventName of eventNamesArray) {
|
|
222
|
-
const set = this.getListeners(eventName) as Set<TEventListener> | undefined
|
|
223
|
-
if (set) {
|
|
224
|
-
set.delete(listener)
|
|
225
|
-
if (set.size === 0) {
|
|
226
|
-
const events = Events.eventsMap.get(this)
|
|
227
|
-
events?.delete(eventName)
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
this.logIfDebugEnabled('unsubscribe', eventName)
|
|
232
|
-
|
|
233
|
-
if (!isMetaEvent(eventName)) {
|
|
234
|
-
forget(this.emitMetaEvent('listenerRemoved', { eventName, listener: listener as EventListener }))
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
offAny(listener: EventAnyListener) {
|
|
240
|
-
this.logIfDebugEnabled('unsubscribeAny')
|
|
241
|
-
|
|
242
|
-
const typedMap = Events.anyMap.get(this) as Set<EventAnyListener<TEventData[keyof TEventData]>>
|
|
243
|
-
typedMap?.delete(listener)
|
|
244
|
-
forget(this.emitMetaEvent('listenerRemoved', { listener: listener as EventAnyListener }))
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
on<TEventName extends keyof TEventData = keyof TEventData>(
|
|
248
|
-
eventNames: TEventName | TEventName[],
|
|
249
|
-
listener: EventListener<TEventData[TEventName]>,
|
|
250
|
-
filter?: TEventData[TEventName],
|
|
251
|
-
) {
|
|
252
|
-
const eventNamesArray = Array.isArray(eventNames) ? eventNames : [eventNames]
|
|
253
|
-
for (const eventName of eventNamesArray) {
|
|
254
|
-
let set = this.getListeners(eventName)
|
|
255
|
-
if (!set) {
|
|
256
|
-
set = new Set()
|
|
257
|
-
const events = Events.eventsMap.get(this)
|
|
258
|
-
events?.set(eventName, set)
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
set.add({ filter, listener: listener as EventListener })
|
|
262
|
-
|
|
263
|
-
this.logIfDebugEnabled('subscribe', eventName)
|
|
264
|
-
|
|
265
|
-
if (!isMetaEvent(eventName)) {
|
|
266
|
-
forget(this.emitMetaEvent('listenerAdded', { eventName, listener: listener as EventListener }))
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return this.off.bind(this, eventNames, listener as EventListener)
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
onAny(listener: EventAnyListener) {
|
|
274
|
-
this.logIfDebugEnabled('subscribeAny')
|
|
275
|
-
|
|
276
|
-
Events.anyMap.get(this)?.add(listener as EventAnyListener)
|
|
277
|
-
forget(this.emitMetaEvent('listenerAdded', { listener: listener as EventAnyListener }))
|
|
278
|
-
return this.offAny.bind(this, listener as EventAnyListener)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
once<TEventName extends keyof TEventData>(eventName: TEventName, listener: EventListener<TEventData[TEventName]>) {
|
|
282
|
-
const subListener = async (args: TEventData[TEventName]) => {
|
|
283
|
-
this.off(eventName, subListener)
|
|
284
|
-
await this.safeCallListener(eventName, args, listener)
|
|
285
|
-
}
|
|
286
|
-
this.on(eventName, subListener)
|
|
287
|
-
return this.off.bind(this, eventName, subListener as EventListener)
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
private async emitInternal<TEventName extends keyof TEventData, TEventArgs extends TEventData[TEventName]>(
|
|
291
|
-
eventName: TEventName,
|
|
292
|
-
eventArgs: TEventArgs,
|
|
293
|
-
filter?: TEventArgs,
|
|
294
|
-
) {
|
|
295
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
296
|
-
throw new TypeError(NO_META_EVENT_ERROR_MESSAGE)
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
this.logIfDebugEnabled('emit', eventName, eventArgs)
|
|
300
|
-
|
|
301
|
-
const listeners = this.getListeners(eventName) ?? new Set()
|
|
302
|
-
const filteredListeners = [...listeners.values()].filter(value => (isDefined(filter) ? isDefined(value.listener) : true)).map(info => info.listener)
|
|
303
|
-
const anyListeners = assertEx(Events.anyMap.get(this))
|
|
304
|
-
const staticListeners = [...filteredListeners]
|
|
305
|
-
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]
|
|
306
|
-
|
|
307
|
-
await resolvedPromise
|
|
308
|
-
await Promise.all([
|
|
309
|
-
...staticListeners.map(async (listener) => {
|
|
310
|
-
await this.safeCallListener(eventName, eventArgs, listener)
|
|
311
|
-
}),
|
|
312
|
-
...staticAnyListeners.map(async (listener) => {
|
|
313
|
-
if (anyListeners.has(listener)) {
|
|
314
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener)
|
|
315
|
-
}
|
|
316
|
-
}),
|
|
317
|
-
])
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
private async emitMetaEventInternal<TEventName extends keyof MetaEventData<TEventData>>(
|
|
321
|
-
eventName: TEventName,
|
|
322
|
-
eventArgs: MetaEventData<TEventData>[TEventName],
|
|
323
|
-
) {
|
|
324
|
-
if (isMetaEvent(eventName) && !this._canEmitMetaEvents) {
|
|
325
|
-
throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`')
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
this.logIfDebugEnabled('emit', eventName, eventArgs)
|
|
329
|
-
|
|
330
|
-
const listeners = this.getListeners(eventName) ?? new Set()
|
|
331
|
-
const filteredListeners = [...listeners.values()].map(info => info.listener)
|
|
332
|
-
const anyListeners = assertEx(Events.anyMap.get(this))
|
|
333
|
-
const staticListeners = [...filteredListeners]
|
|
334
|
-
const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners]
|
|
335
|
-
|
|
336
|
-
await resolvedPromise
|
|
337
|
-
await Promise.all([
|
|
338
|
-
...staticListeners.map(async (listener) => {
|
|
339
|
-
await this.safeCallListener(eventName, eventArgs, listener)
|
|
340
|
-
}),
|
|
341
|
-
...staticAnyListeners.map(async (listener) => {
|
|
342
|
-
if (anyListeners.has(listener)) {
|
|
343
|
-
await this.safeCallAnyListener(eventName, eventArgs, listener)
|
|
344
|
-
}
|
|
345
|
-
}),
|
|
346
|
-
])
|
|
347
|
-
return true
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
private getListeners<TEventName extends keyof TEventData>(eventName: TEventName) {
|
|
351
|
-
const events = assertEx(Events.eventsMap.get(this))
|
|
352
|
-
if (!events.has(eventName)) {
|
|
353
|
-
return
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
return events.get(eventName)
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private async safeCallAnyListener<TEventData extends EventData, TEventName extends keyof EventData>(
|
|
360
|
-
eventName: TEventName,
|
|
361
|
-
eventArgs: TEventData[TEventName],
|
|
362
|
-
listener: EventAnyListener<TEventData[TEventName]>,
|
|
363
|
-
) {
|
|
364
|
-
try {
|
|
365
|
-
return await listener(eventName, eventArgs)
|
|
366
|
-
} catch (ex) {
|
|
367
|
-
handleError(ex, (error) => {
|
|
368
|
-
this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)
|
|
369
|
-
})
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
private async safeCallListener<TEventData extends EventData, TEventName extends keyof EventData>(
|
|
374
|
-
eventName: TEventName,
|
|
375
|
-
eventArgs: TEventData[TEventName],
|
|
376
|
-
listener: EventListener<TEventData[TEventName]>,
|
|
377
|
-
) {
|
|
378
|
-
try {
|
|
379
|
-
return await listener(eventArgs)
|
|
380
|
-
} catch (ex) {
|
|
381
|
-
handleError(ex, (error) => {
|
|
382
|
-
this.logger?.error(`Listener[${String(eventName)}] Excepted: ${error.message}`)
|
|
383
|
-
})
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
package/src/Events/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './Events.ts'
|
package/src/index.ts
DELETED
package/src/model/Event.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Promisable } from '@xylabs/promise'
|
|
2
|
-
|
|
3
|
-
export type EventName = PropertyKey
|
|
4
|
-
export type EventArgs = string | number | object
|
|
5
|
-
export type EventData = { [key: EventName]: EventArgs }
|
|
6
|
-
export type EventUnsubscribeFunction = () => void
|
|
7
|
-
export type EventAnyListener<TEventArgs extends EventArgs = EventArgs> = (eventName: EventName, eventData: TEventArgs) => Promisable<void>
|
|
8
|
-
export type EventListener<TEventArgs extends EventArgs = EventArgs> = (eventData: TEventArgs) => Promisable<void>
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
EventAnyListener, EventData, EventListener, EventUnsubscribeFunction,
|
|
3
|
-
} from './Event.ts'
|
|
4
|
-
|
|
5
|
-
export interface EventEmitter<T extends EventData> {
|
|
6
|
-
eventData: T
|
|
7
|
-
clearListeners(eventNames: keyof T | (keyof T)[]): void
|
|
8
|
-
emit<TEventName extends keyof T>(eventName: TEventName, eventArgs: T[TEventName]): Promise<void>
|
|
9
|
-
emitSerial<TEventName extends keyof T>(eventName: TEventName, eventArgs: T[TEventName]): Promise<void>
|
|
10
|
-
listenerCount(eventNames: keyof T | (keyof T)[]): number
|
|
11
|
-
off<TEventName extends keyof T>(eventNames: TEventName | TEventName[], listener: EventListener<T[TEventName]>): void
|
|
12
|
-
offAny(listener: EventAnyListener | Promise<void>): void
|
|
13
|
-
on<TEventName extends keyof T>(
|
|
14
|
-
eventNames: TEventName | TEventName[],
|
|
15
|
-
listener: EventListener<T[TEventName]>,
|
|
16
|
-
): EventUnsubscribeFunction
|
|
17
|
-
onAny(listener: EventAnyListener): EventUnsubscribeFunction
|
|
18
|
-
once<TEventName extends keyof T>(eventName: TEventName, listener: EventListener<T[TEventName]>): EventUnsubscribeFunction
|
|
19
|
-
}
|
package/src/model/index.ts
DELETED