fastevent 2.4.1 → 2.5.1

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/index.d.ts CHANGED
@@ -806,6 +806,24 @@ type MutableMessage<Events extends Record<string, any>, Meta extends Record<stri
806
806
  } & FastEventMessageExtends;
807
807
  }[KeyOf<Events>];
808
808
 
809
+ /**
810
+ * 返回最匹配的事件元组
811
+ *
812
+ * [事件名称,事件负载]
813
+ *
814
+ * type Events = {
815
+ * "users/* /login": string;
816
+ "users/* /logout": number;
817
+ "users/* /*": { name: string };
818
+ };
819
+
820
+ type Result =GetClosestEventTuple<Events,"users/fisher/login">
821
+ type Result = ["users/* /login", string]
822
+
823
+ *
824
+ */
825
+ type GetClosestMessage<Events extends Record<string, any>, T extends string, Meta extends Record<string, any> = never> = FastEventMessage<ContainsWildcard<T> extends true ? ReplaceWildcard<Exclude<ExpandRecord<GetClosestEvents<Events, T>>[0], number | symbol>> : T, ExpandRecord<GetClosestEvents<Events, T>>[1], Meta>;
826
+
809
827
  /**
810
828
  * 事件消息相关
811
829
  */
@@ -998,7 +1016,7 @@ type FastEventSubscriber = {
998
1016
  _close?: () => void;
999
1017
  };
1000
1018
 
1001
- type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
1019
+ type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (this: FastEventListenerMeta, listener: FastEventListenerMeta, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
1002
1020
 
1003
1021
  type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;
1004
1022
 
@@ -1030,14 +1048,28 @@ interface FastEventIteratorOptions<T = FastEventMessage> {
1030
1048
  /** 信号,用于取消迭代 */
1031
1049
  signal?: AbortSignal;
1032
1050
  }
1051
+ /**
1052
+ * 方法装饰器类型定义(TypeScript 5.0+ 新标准)
1053
+ *
1054
+ * 新装饰器标准使用上下文对象和值,而不是传统的 (target, propertyKey, descriptor)
1055
+ */
1056
+ /**
1057
+ * 可作为装饰器使用的迭代器
1058
+ *
1059
+ * 关键设计:通过交叉类型实现多态
1060
+ * - 装饰器工厂:emitter.on("event", options)
1061
+ * - 方法装饰器:@emitter.on("event")
1062
+ * - 异步迭代器:for await (const msg of emitter.on("event"))
1063
+ */
1064
+ type WithListenerDecorator<T extends FastEventIterator> = T & ListenerDecorator;
1065
+ type ListenerDecorator = (value: (...args: any[]) => any, context: ClassMethodDecoratorContext) => void;
1066
+ type IListenerDecoratorBuilder = (type: string, options?: FastEventListenOptions) => ListenerDecorator;
1033
1067
  declare class FastEventIterator<T = any> implements AsyncIterableIterator<T> {
1034
1068
  private eventEmitter;
1035
1069
  private eventName;
1036
- private buffer;
1037
1070
  private resolvers;
1038
1071
  private errorResolvers;
1039
1072
  private isStopped;
1040
- private error;
1041
1073
  private options;
1042
1074
  private currentSize;
1043
1075
  private hasNewMessage;
@@ -1045,6 +1077,8 @@ declare class FastEventIterator<T = any> implements AsyncIterableIterator<T> {
1045
1077
  private _ready;
1046
1078
  private _listenOptions?;
1047
1079
  private _cleanups;
1080
+ error: Error | null;
1081
+ buffer: [T, number][];
1048
1082
  constructor(eventEmitter: FastEvent<any> | FastEventScope<any, any, any>, eventName: string, options?: FastEventIteratorOptions<T>);
1049
1083
  get listener(): FastEventListener;
1050
1084
  get ready(): boolean;
@@ -1111,13 +1145,15 @@ declare function createAsyncEventIterator<T = any>(eventEmitter: FastEvent<any>
1111
1145
 
1112
1146
  type FastEventOptions<Meta = Record<string, any>, Context = never> = {
1113
1147
  id: string;
1148
+ title: string;
1114
1149
  debug: boolean;
1115
1150
  delimiter: string;
1116
1151
  context: Context;
1117
1152
  ignoreErrors: boolean;
1118
1153
  meta: Meta;
1119
- onAddListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void;
1120
- onRemoveListener?: (type: string, listener: TypedFastEventListener) => void;
1154
+ onAddBeforeListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void;
1155
+ onAddAfterListener?: (type: string, node: FastEventListenerNode) => void;
1156
+ onRemoveListener?: (type: string, listener: TypedFastEventListener, node: FastEventListenerNode) => void;
1121
1157
  onClearListeners?: () => void;
1122
1158
  onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void;
1123
1159
  onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
@@ -1202,36 +1238,6 @@ type FastEventListenerArgs<M = Record<string, any>> = {
1202
1238
  rawEventType?: string;
1203
1239
  };
1204
1240
 
1205
- type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1206
- type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
1207
- type FastEventListeners<Events extends Record<string, any> = Record<string, any>, M = any, C = any> = {
1208
- [K in keyof Events]: TypedFastEventListener<Exclude<K, number | symbol>, Events[K], M, C>;
1209
- };
1210
- type FastEventListener<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = (message: FastEventMessage<T, P, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1211
- type FastEventCommonListener<Message = FastEventMessage, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: Message, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
1212
- /**
1213
- * [
1214
- * 监听器函数引用,
1215
- * 需要执行多少次, =0代表不限
1216
- * 实际执行的次数(用于负载均衡时记录)
1217
- * 标签 用于调试一般可以标识监听器类型或任意信息
1218
- * 标识
1219
- * ]
1220
- */
1221
- type FastEventListenerMeta = [
1222
- TypedFastEventListener<any, any>,
1223
- number,
1224
- number,
1225
- string,
1226
- number
1227
- ];
1228
- type FastEventListenerNode = {
1229
- __listeners: FastEventListenerMeta[];
1230
- } & {
1231
- [key: string]: FastEventListenerNode;
1232
- };
1233
- type FastListeners = FastEventListenerNode;
1234
-
1235
1241
  /**
1236
1242
  * 获取指定事件名称的负载类型
1237
1243
  */
@@ -1286,23 +1292,54 @@ type UnTransformedEvents<Events extends Record<string, any>> = {
1286
1292
  [K in keyof Events]: Events[K] extends FastMessagePayload<infer P> ? P : Events[K];
1287
1293
  };
1288
1294
 
1295
+ type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1296
+ type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: MutableMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
1297
+ type FastEventListeners<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = any> = {
1298
+ [K in KeyOf<Events>]: FastEventCommonListener<K extends IsTransformedEvent<Events, K> ? PickPayload<ValueOf<GetClosestEvents<Events, K>>> : K extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, K, Meta>, Meta, Context>;
1299
+ };
1300
+ type FastEventListener<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = (message: FastEventMessage<T, P, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
1301
+ type FastEventCommonListener<Message = FastEventMessage, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: Message, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
1289
1302
  /**
1290
- * 返回最匹配的事件元组
1291
- *
1292
- * [事件名称,事件负载]
1293
- *
1294
- * type Events = {
1295
- * "users/* /login": string;
1296
- "users/* /logout": number;
1297
- "users/* /*": { name: string };
1303
+ * [
1304
+ * 0: 监听器函数引用,
1305
+ * 1: 需要执行多少次, =0代表不限
1306
+ * 2: 实际执行的次数(用于负载均衡时记录)
1307
+ * 3: 标签 用于调试一般可以标识监听器类型或任意信息
1308
+ * 4: 标识,
1309
+ * 5: 监听器最后一次执行结果,仅仅在debug时启用,如果结果是对象则是一个WeakRef
1310
+ * ]
1311
+ */
1312
+ type FastEventListenerMeta = [
1313
+ TypedFastEventListener<any, any>,
1314
+ number,
1315
+ number,
1316
+ string,
1317
+ number,
1318
+ any?
1319
+ ];
1320
+ type FastEventListenerNode = {
1321
+ __listeners: FastEventListenerMeta[];
1322
+ } & {
1323
+ [key: string]: FastEventListenerNode;
1298
1324
  };
1299
-
1300
- type Result =GetClosestEventTuple<Events,"users/fisher/login">
1301
- type Result = ["users/* /login", string]
1325
+ type FastListeners = FastEventListenerNode;
1302
1326
 
1303
- *
1304
- */
1305
- type GetClosestMessage<Events extends Record<string, any>, T extends string, Meta extends Record<string, any> = never> = FastEventMessage<ContainsWildcard<T> extends true ? ReplaceWildcard<Exclude<ExpandRecord<GetClosestEvents<Events, T>>[0], number | symbol>> : T, ExpandRecord<GetClosestEvents<Events, T>>[1], Meta>;
1327
+ type AddBeforeListenerHook = (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, any>) => boolean | FastEventSubscriber | void;
1328
+ type AddAfterListenerHook = (type: string, node: FastEventListenerNode) => void;
1329
+ type RemoveListenerHook = (type: string, listener: TypedFastEventListener, node: FastEventListenerNode) => void;
1330
+ type ClearListenersHook = () => void;
1331
+ type ListenerErrorHook = (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, any>, args: FastEventListenerArgs<any> | undefined) => void;
1332
+ type BeforeExecuteListenerHook = (message: TypedFastEventMessage<any, any>, args: FastEventListenerArgs<any>) => boolean | void | any[];
1333
+ type AfterExecuteListenerHook = (message: TypedFastEventMessage<any, any>, returns: any[], listeners: FastEventListenerNode[]) => void;
1334
+ type FastEventHooks = {
1335
+ AddBeforeListener: AddBeforeListenerHook[];
1336
+ AddAfterListener: AddAfterListenerHook[];
1337
+ RemoveListener: RemoveListenerHook[];
1338
+ ClearListeners: ClearListenersHook[];
1339
+ ListenerError: ListenerErrorHook[];
1340
+ BeforeExecuteListener: BeforeExecuteListenerHook[];
1341
+ AfterExecuteListener: AfterExecuteListenerHook[];
1342
+ };
1306
1343
 
1307
1344
  type InMatchedEvent<Events extends Record<string, any>, T> = T extends KeyOf<Events> | ReplaceWildcard<KeyOf<Events>> ? true : false;
1308
1345
 
@@ -1342,6 +1379,9 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
1342
1379
  messages: MutableMessage<Events, FinalMeta>;
1343
1380
  rawEvents: Events;
1344
1381
  meta: FinalMeta;
1382
+ listeners: FastEventListeners<Events, Expand<FastEventMeta & Meta & Record<string, any>>>;
1383
+ anyListener: TypedFastEventAnyListener<Events, Expand<FastEventMeta & Meta & Record<string, any>>>;
1384
+ listener: FastEventCommonListener<FastEventMessage, Expand<FastEventMeta & Meta & Record<string, any>>>;
1345
1385
  };
1346
1386
  prefix: string;
1347
1387
  emitter: FastEvent<any>;
@@ -1473,6 +1513,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1473
1513
  private _delimiter;
1474
1514
  /** 事件监听器执行时的上下文对象 */
1475
1515
  private _context;
1516
+ private _hooks?;
1476
1517
  /** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */
1477
1518
  retainedMessages: Map<string, any>;
1478
1519
  /** 当前注册的监听器总数 */
@@ -1486,6 +1527,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1486
1527
  message: MutableMessage<AllEvents, Meta>;
1487
1528
  listeners: FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
1488
1529
  anyListener: TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
1530
+ listener: FastEventCommonListener<FastEventMessage, Expand<FastEventMeta & Meta & Record<string, any>>>;
1489
1531
  };
1490
1532
  /**
1491
1533
  * 创建FastEvent实例
@@ -1505,6 +1547,26 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1505
1547
  get meta(): Meta;
1506
1548
  /** 获取事件发射器的唯一标识符 */
1507
1549
  get id(): string;
1550
+ /** 获取事件发射器的唯一标识符 */
1551
+ get title(): string;
1552
+ get hooks(): FastEventHooks;
1553
+ private _execAfterExecuteListener;
1554
+ /**
1555
+ * 执行Hook
1556
+ *
1557
+ * AfterExecuteListener为什么需要特别处理?
1558
+ *
1559
+ * 因为AfterExecuteListener是在监听器执行完成后调用
1560
+ * 并且将监听器的结果传入,但是监听器有可能返回Promise
1561
+ * 因为需要等等Promise resolve,再调用AfterExecuteListener
1562
+ *
1563
+ *
1564
+ * @param hookName
1565
+ * @param args
1566
+ * @param onlyAsyncHook 只运行异步HOOK
1567
+ * @returns
1568
+ */
1569
+ private _executeHooks;
1508
1570
  /**
1509
1571
  * 初始化选项
1510
1572
  *
@@ -1525,7 +1587,6 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1525
1587
  * @private
1526
1588
  */
1527
1589
  private _addListener;
1528
- private _enableDevTools;
1529
1590
  /**
1530
1591
  *
1531
1592
  * 根据parts路径遍历监听器树,并在最后的节点上执行回调函数
@@ -1544,13 +1605,12 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1544
1605
  */
1545
1606
  private _removeListener;
1546
1607
  /**
1547
- * 调用onAddListener HOOK
1608
+ * 创建异步迭代监听器
1548
1609
  * @param type
1549
- * @param listener
1550
1610
  * @param options
1551
1611
  * @returns
1552
1612
  */
1553
- private _onAddListener;
1613
+ private _createAyncIteratorListener;
1554
1614
  /**
1555
1615
  * 注册事件监听器
1556
1616
  * @param type - 事件类型,支持以下格式:
@@ -1575,7 +1635,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1575
1635
  * emitter.on('event', handler, { count: 3 });
1576
1636
  * ```
1577
1637
  */
1578
- on<T extends string = KeyOf<Events> | "**">(type: T, options?: FastEventListenOptions<AllEvents, Meta>): T extends IsTransformedEvent<AllEvents, T> ? FastEventIterator<T extends "**" ? IsAllTransformed<Events> extends true ? PayloadValues<AllEvents> : any : PickPayload<ValueOf<GetClosestEvents<AllEvents, T>>>> : FastEventIterator<T extends "**" ? MutableMessage<AllEvents> : GetClosestMessage<Events, T, Meta>>;
1638
+ on<T extends string = KeyOf<Events> | "**">(type: T, options?: FastEventListenOptions<AllEvents, Meta>): T extends IsTransformedEvent<AllEvents, T> ? WithListenerDecorator<FastEventIterator<T extends "**" ? IsAllTransformed<Events> extends true ? PayloadValues<AllEvents> : any : PickPayload<ValueOf<GetClosestEvents<AllEvents, T>>>>> : WithListenerDecorator<FastEventIterator<T extends "**" ? MutableMessage<AllEvents> : GetClosestMessage<Events, T, Meta>>>;
1579
1639
  on<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, Meta>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
1580
1640
  /**
1581
1641
  * 注册一次性事件监听器
@@ -1683,7 +1743,6 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
1683
1743
  private _traverseToPath;
1684
1744
  private _traverseListeners;
1685
1745
  private _onListenerError;
1686
- private _setListenerFlags;
1687
1746
  /**
1688
1747
  * 执行单个监听器函数
1689
1748
  * @param listener - 要执行的监听器函数或包装过的监听器对象
@@ -2028,4 +2087,13 @@ declare function isClass(target: unknown): target is new (...args: any[]) => any
2028
2087
 
2029
2088
  declare function isFastEvent(target: any): target is FastEvent;
2030
2089
 
2031
- export { AbortError, type Add, type AllowCall, type ApplyWildcardEvents, type AssertFastMessage, type AssertRecord, type AssertString, type AtPayloads, CancelError, type ChangeFieldType, type Class, type ClosestMatch, type ContainsWildcard, type Decrement, type DeepPartial, type Dict, type Equal, type Expand, type ExpandRecord, type ExpandWildcard, type ExtendWildcardEvents, type Fallback, FastEvent, type FastEventCommonListener, type FastEventCommonMessage, type FastEventEmitMessage, FastEventError, FastEventIterator, type FastEventIteratorOptions, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListenerMeta, type FastEventListenerNode, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListeners, type FastMessagePayload, type FastQueueOverflows, type FirstObjectItem, type FirstOfUnion, type GetClosestEventName, type GetClosestEventNameTuple, type GetClosestEventPayload, type GetClosestEventTuple, type GetClosestEvents, type GetFixedPartCount, type GetMatchedEventNames, type GetPartCount, type GetPartCountAcc, type GetPayload, type GetWildcardCount, type GetWildcardEventList, type IFastEventScope, type IfNever, type IndexOfMax, type IndexOfMin, type IsAllTransformed, type IsAny, type IsAnyRecord, type IsFullWildcard, type IsMatchEventName, type IsMultiWildcard, type IsNever, type IsSemiWildcard, type IsTransformedEvent, type IsWildcardPart, type Join, type KeyOf, type Keys, type Max, type Merge, type MergeStrings, type MergeUnion, type Min, type MutableMessage, type MutableRecord, type NormalEvents, type NotEqual, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalKeys, type Overloads, type OverrideOptions, type PayloadValues, type PickEqualRecord, type PickInlcudeDelimiterRecord, type PickNotEqualRecord, type PickNotInlcudeDelimiterRecord, type PickPayload, type PickTransformedEvents, type PrefixNumber, type ProcessSegments, QueueOverflowError, type RemoveEmptyObject, type ReplaceWildcard, type RequiredItems, type RequiredKeys, type ScopeEvents, type Slice, type Split, type SplitPath, type StrictEqual, TimeoutError, type ToFixedCounts, type ToKeyPrioritys, type ToWildcardMessage, type TransformedEvents, type Tuple, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, type UnTransformedEvents, UnboundError, type Union, type UnionToIntersection, type Unique, type ValueOf, type WildcardEvents, type WildcardKeyToObject, type WildcardKeys, type WildcardStyle, __FastEventScope__, __FastEvent__, __expandable__, createAsyncEventIterator, expandable, isClass, type isEmpty, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };
2090
+ /**
2091
+ * 判断是否为可异步迭代对象(AsyncIterable)
2092
+ * 即具有 Symbol.asyncIterator 方法的对象
2093
+ *
2094
+ * @param value - 要检查的值
2095
+ * @returns 如果是可异步迭代对象返回 true
2096
+ */
2097
+ declare function isAsyncIterable<T = any>(value: unknown): value is AsyncIterable<T>;
2098
+
2099
+ export { AbortError, type Add, type AddAfterListenerHook, type AddBeforeListenerHook, type AfterExecuteListenerHook, type AllowCall, type ApplyWildcardEvents, type AssertFastMessage, type AssertRecord, type AssertString, type AtPayloads, type BeforeExecuteListenerHook, CancelError, type ChangeFieldType, type Class, type ClearListenersHook, type ClosestMatch, type ContainsWildcard, type Decrement, type DeepPartial, type Dict, type Equal, type Expand, type ExpandRecord, type ExpandWildcard, type ExtendWildcardEvents, type Fallback, FastEvent, type FastEventCommonListener, type FastEventCommonMessage, type FastEventEmitMessage, FastEventError, type FastEventHooks, FastEventIterator, type FastEventIteratorOptions, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListenerMeta, type FastEventListenerNode, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListeners, type FastMessagePayload, type FastQueueOverflows, type FirstObjectItem, type FirstOfUnion, type GetClosestEventName, type GetClosestEventNameTuple, type GetClosestEventPayload, type GetClosestEventTuple, type GetClosestEvents, type GetFixedPartCount, type GetMatchedEventNames, type GetPartCount, type GetPartCountAcc, type GetPayload, type GetWildcardCount, type GetWildcardEventList, type IFastEventScope, type IListenerDecoratorBuilder, type IfNever, type IndexOfMax, type IndexOfMin, type IsAllTransformed, type IsAny, type IsAnyRecord, type IsFullWildcard, type IsMatchEventName, type IsMultiWildcard, type IsNever, type IsSemiWildcard, type IsTransformedEvent, type IsWildcardPart, type Join, type KeyOf, type Keys, type ListenerDecorator, type ListenerErrorHook, type Max, type Merge, type MergeStrings, type MergeUnion, type Min, type MutableMessage, type MutableRecord, type NormalEvents, type NotEqual, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalKeys, type Overloads, type OverrideOptions, type PayloadValues, type PickEqualRecord, type PickInlcudeDelimiterRecord, type PickNotEqualRecord, type PickNotInlcudeDelimiterRecord, type PickPayload, type PickTransformedEvents, type PrefixNumber, type ProcessSegments, QueueOverflowError, type RemoveEmptyObject, type RemoveListenerHook, type ReplaceWildcard, type RequiredItems, type RequiredKeys, type ScopeEvents, type Slice, type Split, type SplitPath, type StrictEqual, TimeoutError, type ToFixedCounts, type ToKeyPrioritys, type ToWildcardMessage, type TransformedEvents, type Tuple, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, type UnTransformedEvents, UnboundError, type Union, type UnionToIntersection, type Unique, type ValueOf, type WildcardEvents, type WildcardKeyToObject, type WildcardKeys, type WildcardStyle, type WithListenerDecorator, __FastEventScope__, __FastEvent__, __expandable__, createAsyncEventIterator, expandable, isAsyncIterable, isClass, type isEmpty, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };
@@ -0,0 +1,2 @@
1
+ var FastEventSpaces=(function(exports){'use strict';var V=Object.defineProperty;var B=(n,e,t)=>e in n?V(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var l=(n,e,t)=>B(n,typeof e!="symbol"?e+"":e,t);var Q=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),E=class extends Error{constructor(e){super(e);}},O=class extends E{},x=class extends E{},y=class extends E{},d=class extends E{},w=class extends E{};var q=(e=>(e[e.Transformed=1]="Transformed",e))(q||{});function T(n,e,t,s){let r,a={},i={};return typeof n[0]=="object"?(Object.assign(i,n[0]),a=typeof n[1]=="boolean"?{retain:n[1]}:n[1]||{},r=n[0].meta):(i.type=n[0],i.payload=n[1],a=typeof n[2]=="boolean"?{retain:n[2]}:n[2]||{}),r=Object.assign({},e,t,a.meta,r),Object.keys(r).length===0?(r=void 0,delete i.meta):i.meta=r,a.executor===void 0&&(a.executor=s),[i,a]}function I(n){return n?typeof n=="object"&&"__FastEventScope__"in n:false}function b(n,e,t){let s=n[0],r=I(n[1])?n[1]:void 0,a=(r?n[2]:n[1])||{};return a.meta=Object.assign({},e,a?.meta),a.context=a.context!==void 0?a.context:t,[s,r,a]}function u(n,e){return Object.defineProperty(n,"name",{value:e||"anonymous",configurable:true}),n}function c(n){return n&&typeof n=="function"}var M=class n{constructor(e){l(this,"__FastEventScope__",true);l(this,"__events__");l(this,"__meta__");l(this,"__context__");l(this,"_options",{});l(this,"prefix","");l(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return u(function(a,i){let o=i.rawEventType||a.type;if(o.startsWith(t)){let v=((i.flags||0)&1)>0?a:Object.assign({},a,{type:o.substring(t.length)});return e.call(s.context,v,i)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new x;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[e,t]=T(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){c(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|1,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new n,r.bind(this.emitter,this.prefix+e,s),r}};function L(n,e){let t=n.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let r=0;r<s-1;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}for(let r=0;r<t;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}function C(n,e){let t=[];for(let s=n.length-1;s>=0;s--)e(n[s])&&(t.push(s),n.splice(s,1));return t.reverse()}function ye(n){return n?typeof n=="object"&&"type"in n:false}function ue(n){return n&&typeof n=="string"}var k=Symbol.for("__expandable__");function he(n){return n[k]=true,n}function D(n){return n&&n[k]}function G(n){return n&&typeof n=="object"&&"off"in n&&"listener"in n}function xe(n){return typeof n=="function"&&(n.toString().startsWith("class ")||n.prototype?.constructor===n)}function be(n){return n?typeof n=="object"&&"__FastEvent__"in n:false}function A(n){if(n===null||typeof n!="object")return false;let e=n;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}var j=()=>(n,e,t,s)=>n.map((r,a)=>s.call(n[a],r,e,t,true));function N(n){for(let e=0;e<n.length;e++){let t=n[e];Array.isArray(t)&&D(t)&&(n.splice(e,1,...t),e+=t.length-1);}return n}function W(n,e){return n.catch(t=>(e&&e(t),Promise.resolve(t)))}var P=class{constructor(e,t,s={}){this.eventEmitter=e;this.eventName=t;l(this,"resolvers",[]);l(this,"errorResolvers",[]);l(this,"isStopped",false);l(this,"options");l(this,"currentSize");l(this,"hasNewMessage",false);l(this,"_listener");l(this,"_ready",false);l(this,"_listenOptions");l(this,"_cleanups",[]);l(this,"error",null);l(this,"buffer",[]);this.options={size:s.size??20,maxExpandSize:s.maxExpandSize??100,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=()=>{this.off(!0);};this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new y);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};function R(n,e,t={}){return new P(n,e,t)}function U(n,e){return Array.isArray(e)&&e.forEach(t=>{n=u(t(n),n.name);}),n}function _(n){return n!==null&&(typeof n=="object"||typeof n=="function")?new WeakRef(n):n}function S(n){return n.map(e=>e.status==="fulfilled"?e.value:e.reason)}function z(n){if(n==null)return false;let e=typeof n;return e!=="object"&&e!=="function"?false:typeof n.then=="function"}async function K(n){try{return n instanceof Promise?await n:n}catch(e){return e instanceof Error?e:new Error(String(e))}}var H=class{constructor(e){l(this,"__FastEvent__",true);l(this,"listeners",{__listeners:[]});l(this,"_options");l(this,"_delimiter","/");l(this,"_context");l(this,"_hooks");l(this,"retainedMessages",new Map);l(this,"listenerCount",0);l(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:j()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=S(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let r=this.hooks[e];Array.isArray(r)&&r.length>0&&Promise.allSettled(r.map(a=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(a,t);else return a.apply(this,t)}));}),!s){let r=this.options[`on${e}`];if(c(r))if(e==="AfterExecuteListener")this._execAfterExecuteListener(r,t);else return r.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:r,prepend:a}=s,i=0;return [this._forEachNodes(e,p=>{let v=[t,r,0,s.tag,s.flags];a?(p.__listeners.splice(0,0,v),i=0):(p.__listeners.push(v),i=p.__listeners.length-1),this.listenerCount++;}),i]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let r=0;r<e.length;r++){let a=e[r];if(a in s||(s[a]={__listeners:[]}),r===e.length-1){let i=s[a];return t(i,s),i}else s=s[a];}}_removeListener(e,t,s){s&&C(e.__listeners,r=>{r=Array.isArray(r)?r[0]:r;let a=r===s;return a&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),a});}_createAyncIteratorListener(e,t){let s=Object.assign({overflow:"expand",size:10,maxExpandSize:100},t.iterable),r=R(this,e,s);r.create(t);let a=this._executeHooks("AddBeforeListener",[e,r.listener,t]);if(a===false)throw new d;return A(a)?a:r}on(){let e=arguments[0];if(e.length===0)throw new Error("event cannot be empty");let t=null,s,r=!c(arguments[1]);r?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let a=Object.assign({count:0,flags:0,prepend:false},s);if(r||t===null)return this._createAyncIteratorListener(e,a);let i=this._executeHooks("AddBeforeListener",[e,t,a]);if(i===false)throw new d;if(G(i))return i;let o=e.split(this._delimiter);if(a.pipes&&a.pipes.length>0&&(t=U(t,a.pipes)),c(a.filter)||c(a.off)){let g=t,h=()=>p&&this._removeListener(p,o,t);t=u(function(f,F){if(c(a.off)&&a.off.call(this,f,F)){h();return}if(c(a.filter)){if(a.filter.call(this,f,F))return g.call(this,f,F)}else return g.call(this,f,F)},t.name);}let[p,v]=this._addListener(o,t,a),m=()=>p&&this._removeListener(p,o,t);return this._executeHooks("AddAfterListener",[e,p]),this._emitRetainMessage(e,p,v),{off:m,listener:t,[Symbol.dispose](){m();}}}once(){return c(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments,t=c(e[0])?void 0:e[0],s=c(e[0])?e[0]:e[1],r=t?t.split(this._delimiter):[],a=t?t.includes("*"):false;if(t&&!a)this._traverseToPath(this.listeners,r,i=>{s?this._removeListener(i,r,s):t&&(i.__listeners=[]);});else {let i=a?[]:r;this._traverseListeners(this.listeners,i,(o,p)=>{(s!==void 0||a&&L(o,r))&&(s?this._removeListener(p,r,s):p.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(r,a)=>{s+=a.__listeners.length;try{a.__listeners.forEach(i=>{this._executeHooks("RemoveListener",[r.join(this.options.delimiter),i[0],a]);});}finally{a.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,r)=>{t+=r.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let r=[];if(e.includes("*")){let a=e.split(this._delimiter);this.retainedMessages.forEach((i,o)=>{let p=o.split(this._delimiter);L(p,a)&&r.push(i);});}else this.retainedMessages.has(e)&&r.push(this.retainedMessages.get(e));t&&r.forEach(a=>{this._executeListeners([t],a,{},i=>i[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,r=0,a){if(r>=t.length){s(e);return}let i=t[r];if(a===true){this._traverseToPath(e,t,s,r+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,r+1),"**"in e&&this._traverseToPath(e["**"],t,s,r+1,true),i in e&&this._traverseToPath(e[i],t,s,r+1);}_traverseListeners(e,t,s){let r=e;t&&t.length>0&&this._traverseToPath(e,t,i=>{r=i;});let a=(i,o,p)=>{o(p,i);for(let[v,m]of Object.entries(i))v.startsWith("__")||m&&a(m,o,[...p,v]);};a(r,s,[]);}_onListenerError(e,t,s,r){if(r instanceof Error&&(r._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[r,e,t,s]),this._options.ignoreErrors)return r;throw r}_executeListener(e,t,s,r=false){let a=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(a,t,s,new y(e[0].name));let i=((s?.flags||0)&1)>0,o=a.call(this.context,i?t.payload:t,s);return r&&o&&o instanceof Promise&&(o=W(o,p=>this._onListenerError(a,t,s,p))),this.options.debug&&(Promise.resolve(o),z(o)?K(o).then(p=>{e[5]=_(p);}):e[5]=_(o)),o}catch(i){let o=this._onListenerError(a,t,s,i);return o instanceof Error&&(e[5]=_(o)),o}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(c(t))return t}_executeListeners(e,t,s,r){if(!e||e.length===0)return [];let a=[];for(let o of e){let p=0;for(let v of o.__listeners)(!r||r(v,o))&&a.push([v,p++,o.__listeners]);}this._decListenerExecCount(a);let i=this._getListenerExecutor(s);if(i){let o=i(a.map(p=>p[0]),t,s,this._executeListener.bind(this));return Array.isArray(o)?o:[o]}else return a.map(o=>this._executeListener(o[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,a=>{t.push(a);});let r=[];return t.map(a=>{r.push(...a.__listeners);}),r}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=T(arguments,this.options.meta);c(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let r=[],a=[];this._traverseToPath(this.listeners,s,o=>{a.push(o);});let i=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(i))return i;if(i===false)throw new y(e.type);if(c(this._options.transform)){let o=this._options.transform.call(this,e);o!==e&&(e.payload=o,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}return r.push(...this._executeListeners(a,e,t)),this._options.expandEmitResults&&N(r),this._executeHooks("AfterExecuteListener",[e,r,a]),r}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return S(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,r)=>{let a,i,o=p=>{clearTimeout(a),i?.off(),s(p);};t&&t>0&&(a=setTimeout(()=>{i?.off(),r(new Error("wait for event<"+e+"> is timeout"));},t)),i=this.on(e,o);})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new M,r.bind(this,e,s),r}};exports.AbortError=y;exports.CancelError=d;exports.FastEvent=H;exports.FastEventError=E;exports.FastEventIterator=P;exports.FastEventListenerFlags=q;exports.FastEventScope=M;exports.QueueOverflowError=w;exports.TimeoutError=O;exports.UnboundError=x;exports.__FastEventScope__=J;exports.__FastEvent__=Q;exports.__expandable__=k;exports.createAsyncEventIterator=R;exports.expandable=he;exports.isAsyncIterable=A;exports.isClass=xe;exports.isExpandable=D;exports.isFastEvent=be;exports.isFastEventMessage=ye;exports.isFastEventScope=I;exports.isFunction=c;exports.isPathMatched=L;exports.isString=ue;exports.isSubsctiber=G;return exports;})({});//# sourceMappingURL=index.global.js.map
2
+ //# sourceMappingURL=index.global.js.map