fastevent 1.1.3 → 2.0.0

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.
Files changed (80) hide show
  1. package/dist/devTools.js +2 -2
  2. package/dist/devTools.js.map +1 -1
  3. package/dist/devTools.mjs +2 -2
  4. package/dist/devTools.mjs.map +1 -1
  5. package/dist/index.d.mts +285 -53
  6. package/dist/index.d.ts +285 -53
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +1 -1
  10. package/dist/index.mjs.map +1 -1
  11. package/package.json +64 -50
  12. package/readme.md +517 -50
  13. package/.changeset/README.md +0 -8
  14. package/.changeset/config.json +0 -11
  15. package/.github/workflows/publish.yaml +0 -50
  16. package/.prettierrc.js +0 -20
  17. package/.vscode/launch.json +0 -20
  18. package/.vscode/settings.json +0 -18
  19. package/CHANGELOG.md +0 -60
  20. package/LICENSE +0 -21
  21. package/bench.png +0 -0
  22. package/dist/devTools.d.mts +0 -543
  23. package/dist/devTools.d.ts +0 -543
  24. package/example/README.md +0 -54
  25. package/example/eslint.config.js +0 -28
  26. package/example/index.html +0 -13
  27. package/example/package.json +0 -29
  28. package/example/pnpm-lock.yaml +0 -2047
  29. package/example/public/vite.svg +0 -1
  30. package/example/src/App.css +0 -42
  31. package/example/src/App.tsx +0 -60
  32. package/example/src/assets/react.svg +0 -1
  33. package/example/src/index.css +0 -68
  34. package/example/src/main.tsx +0 -10
  35. package/example/src/myEvent.ts +0 -32
  36. package/example/src/vite-env.d.ts +0 -1
  37. package/example/tsconfig.app.json +0 -26
  38. package/example/tsconfig.json +0 -7
  39. package/example/tsconfig.node.json +0 -24
  40. package/example/vite.config.ts +0 -7
  41. package/packages/native/index.ts +0 -1
  42. package/packages/turbo/.zig-cache/h/271c82d991949fd7788fd5451f0ca834.txt +0 -0
  43. package/packages/turbo/.zig-cache/h/timestamp +0 -0
  44. package/packages/turbo/.zig-cache/o/ebd7ddab8ffe003267120d598aecce68/dependencies.zig +0 -2
  45. package/packages/turbo/.zig-cache/z/c8114b040daa461a9e2eabd0357554a4 +0 -0
  46. package/packages/turbo/build.zig +0 -60
  47. package/packages/turbo/examples/basic.zig +0 -107
  48. package/packages/turbo/src/event.zig +0 -251
  49. package/packages/turbo/src/index.zig +0 -70
  50. package/packages/turbo/src/scope.zig +0 -104
  51. package/packages/turbo/src/types.zig +0 -88
  52. package/packages/turbo/src/utils.zig +0 -171
  53. package/readme_cn.md +0 -491
  54. package/src/__benchmarks__/index.ts +0 -3
  55. package/src/__benchmarks__/multi-level.ts +0 -40
  56. package/src/__benchmarks__/sample.ts +0 -40
  57. package/src/__benchmarks__/wildcard.ts +0 -41
  58. package/src/__tests__/emit.test.ts +0 -106
  59. package/src/__tests__/emitAsync.test.ts +0 -64
  60. package/src/__tests__/isPathMatched.test.ts +0 -205
  61. package/src/__tests__/many.test.ts +0 -22
  62. package/src/__tests__/meta.test.ts +0 -28
  63. package/src/__tests__/off.test.ts +0 -214
  64. package/src/__tests__/onany.test.ts +0 -212
  65. package/src/__tests__/once.test.ts +0 -70
  66. package/src/__tests__/retain.test.ts +0 -66
  67. package/src/__tests__/scope.test.ts +0 -110
  68. package/src/__tests__/types.test.ts +0 -145
  69. package/src/__tests__/waitFor.test.ts +0 -116
  70. package/src/__tests__/wildcard.test.ts +0 -185
  71. package/src/devTools.ts +0 -166
  72. package/src/event.ts +0 -741
  73. package/src/index.ts +0 -3
  74. package/src/scope.ts +0 -130
  75. package/src/types.ts +0 -66
  76. package/src/utils/WeakObjectMap.ts +0 -64
  77. package/src/utils/isPathMatched.ts +0 -40
  78. package/src/utils/removeItem.ts +0 -16
  79. package/tsconfig.json +0 -104
  80. package/tsup.config.ts +0 -30
package/dist/index.d.ts CHANGED
@@ -1,64 +1,188 @@
1
- interface FastEventMessage<T = string, P = any, M = unknown> {
2
- type: T;
3
- payload: P;
4
- meta: M;
1
+ type FastListenerPipe = (listener: FastEventListener) => FastEventListener;
2
+
3
+ interface FaseEventMessageExtends {
4
+ }
5
+ interface FastEventMeta {
6
+ priority?: number;
5
7
  }
6
- type FastEventListener<T = string, P = any, M = unknown, C = any> = (this: C, message: FastEventMessage<T, P, M>) => any | Promise<any>;
8
+ type FastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
9
+ [K in keyof Events]: {
10
+ type: Exclude<K, number | symbol>;
11
+ payload: Events[K];
12
+ meta: FastEventMeta & M & Record<string, any>;
13
+ };
14
+ }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
15
+ type FastEventEmitMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
16
+ [K in keyof Events]: {
17
+ type: Exclude<K, number | symbol>;
18
+ payload?: Events[K];
19
+ meta?: FastEventMeta & M & Record<string, any>;
20
+ };
21
+ }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
22
+ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: FastEventMessage<{
23
+ [K in T]: P;
24
+ }, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
25
+ type FastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: FastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
26
+ /**
27
+ * [监听器函数引用,需要执行多少次,实际执行的次数(用于负载均衡时记录)]
28
+ */
29
+ type FastListenerMeta = [FastEventListener<any, any>, number, number];
7
30
  type FastListenerNode = {
8
- __listeners: (FastEventListener<any, any, any> | [FastEventListener<any, any>, number])[];
31
+ __listeners: FastListenerMeta[];
9
32
  } & {
10
33
  [key: string]: FastListenerNode;
11
34
  };
12
35
  type FastEventSubscriber = {
13
36
  off: () => void;
37
+ /**
38
+ * 为什么要有一个listener引用? 主要用于移除侦听器时使用
39
+ *
40
+ * - 正常情况下
41
+ * const subscriber = emitter.on('event', listener)
42
+ *
43
+ * subscriber.off()
44
+ * emitter.off('event', listener)
45
+ * emitter.off(listener)
46
+ *
47
+ * - 在使用scope时
48
+ * const scope = emitter.scope("xxx")
49
+ * const subscriber = scope.on('event', listener)
50
+ *
51
+ * subscriber.off() 可以正常生效
52
+ * scope.off('event', listener) // 无法生效
53
+ * scope.off(listener) // 无法生效
54
+ * 因为在scope中,为了让侦听器可以处理scope的逻辑,对listener进行了包装,
55
+ * 因此在事件注册表中登记的不是listener,而是经过包装的侦听器
56
+ * subscriber.off() 可以正常生效
57
+ * 如果要使用scope.off或emitter.off
58
+ * 需要使用subscriber.listener, subscriber.listener记录了原始的侦听器引用
59
+ * subscriber.listener===listener
60
+ *
61
+ * scope.off('event', subscriber.listener) // 生效
62
+ * scope.off(subscriber.listener) // 生效
63
+ *
64
+ */
65
+ listener: FastEventListener<any, any, any>;
14
66
  };
15
67
  type FastListeners = FastListenerNode;
16
- type FastEventOptions<M = Record<string, any>> = {
68
+ type FastEventOptions<Meta = Record<string, any>, Context = any> = {
17
69
  id?: string;
18
70
  debug?: boolean;
19
71
  delimiter?: string;
20
- context?: any;
72
+ context?: Context;
21
73
  ignoreErrors?: boolean;
22
- onListenerError?: ((type: string, error: Error) => void);
23
- meta?: M;
74
+ meta?: Meta;
24
75
  onAddListener?: (type: string[], listener: FastEventListener) => void;
25
76
  onRemoveListener?: (type: string[], listener: FastEventListener) => void;
26
77
  onClearListeners?: () => void;
27
- onExecuteListener?: (message: FastEventMessage, returns: any[], listeners: (FastEventListener<any, any, any> | [FastEventListener<any, any>, number])[]) => void;
78
+ onListenerError?: ((listener: FastEventListener, error: Error, message: FastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void);
79
+ onBeforeExecuteListener?: (message: FastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void;
80
+ onAfterExecuteListener?: (message: FastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
81
+ /**
82
+ * 全局执行器
83
+ * allSettled: 使用Promise.allSettled()执行所有监听器
84
+ * race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略
85
+ * balance: 尽可能平均执行各个侦听器
86
+ * sequence: 按照侦听器添加顺序依次执行
87
+ */
88
+ executor?: FastListenerExecutorArgs;
28
89
  };
29
- type FastEvents = Record<string, any>;
30
- type ScopeEvents<T extends Record<string, any>, Prefix extends string> = {
90
+ interface FastEvents {
91
+ }
92
+ type PickScopeEvents<T extends Record<string, any>, Prefix extends string> = {
31
93
  [K in keyof T as K extends `${Prefix}/${infer Rest}` ? Rest : never]: T[K];
32
94
  };
33
- type FastEventListenOptions = {
95
+ type ScopeEvents<T extends Record<string, any>, Prefix extends string> = PickScopeEvents<T, Prefix>;
96
+ type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = {
34
97
  count?: number;
35
98
  prepend?: boolean;
99
+ filter?: (message: FastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
100
+ off?: (message: FastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
101
+ pipes?: FastListenerPipe[];
102
+ };
103
+ type FastListenerExecutorArgs = 'default' | 'allSettled' | 'race' | 'balance' | 'first' | 'last' | 'random' | IFastListenerExecutor;
104
+ type FastEventListenerArgs<M = Record<string, any>> = {
105
+ retain?: boolean;
106
+ meta?: Partial<M> & Record<string, any>;
107
+ abortSignal?: AbortSignal;
108
+ /**
109
+ *
110
+ * allSettled: 使用Promise.allSettled()执行所有监听器
111
+ * race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略
112
+ * balance: 尽可能平均执行各个侦听器
113
+ * sequence: 按照侦听器添加顺序依次执行
114
+ */
115
+ executor?: FastListenerExecutorArgs;
116
+ };
117
+ type Merge<T extends object, U extends object> = {
118
+ [K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
36
119
  };
120
+ type RequiredItems<T extends object, Items extends string[]> = Omit<T, Items[number]> & {
121
+ [K in Items[number] & keyof T]-?: Exclude<T[K], undefined>;
122
+ };
123
+ type Fallback<T, F> = [
124
+ T
125
+ ] extends [never] ? F : T extends undefined ? F : T;
126
+ type IFastListenerExecutor = (listeners: FastListenerMeta[], message: FastEventMessage, args: FastEventListenerArgs | undefined, execute: (listener: FastEventListener, message: FastEventMessage, args?: FastEventListenerArgs) => Promise<any> | any) => Promise<any[]> | any[];
37
127
 
38
- declare class FastEventScope<Events extends FastEvents = FastEvents, Meta extends Record<string, any> = Record<string, any>, Context = any, Types extends keyof Events = keyof Events> {
39
- emitter: FastEvent<Events, Meta, Types>;
128
+ type FastEventScopeOptions<Meta, Context> = {
129
+ meta?: FastEventMeta & Meta;
130
+ context?: Context;
131
+ executor?: FastListenerExecutorArgs;
132
+ };
133
+ type FastEventScopeMeta = {
134
+ scope: string;
135
+ };
136
+ declare class FastEventScope<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = any, Types extends keyof Events = keyof Events, FinalMeta extends Record<string, any> = Meta & FastEventScopeMeta> {
137
+ emitter: FastEvent<Events>;
40
138
  prefix: string;
41
- constructor(emitter: FastEvent<Events, Meta, Types>, prefix: string);
139
+ options: Required<FastEventScopeOptions<FinalMeta, Context>>;
140
+ events: Events;
141
+ constructor(emitter: FastEvent<Events>, prefix: string, options?: FastEventScopeOptions<Meta, Context>);
142
+ get context(): Context;
143
+ /**
144
+ * 获取作用域监听器
145
+ * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑
146
+ * @param listener 原始事件监听器
147
+ * @returns 包装后的作用域监听器
148
+ * @private
149
+ */
42
150
  private _getScopeListener;
43
151
  private _getScopeType;
44
152
  private _fixScopeType;
45
- on<T extends Types = Types>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
46
- on<T extends string>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
47
- on(type: '**', listener: FastEventListener<any, any, Meta, Context>): FastEventSubscriber;
48
- once<T extends string>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
49
- once<T extends Types = Types>(type: T, listener: FastEventListener<Types, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
50
- onAny<P = any>(listener: FastEventListener<Types, P, Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
51
- offAll(): void;
153
+ on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
154
+ on<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
155
+ on(type: '**', listener: FastEventAnyListener<Events, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
156
+ once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
157
+ once<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
158
+ onAny<P = any>(listener: FastEventAnyListener<{
159
+ [K: string]: P;
160
+ }, FinalMeta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
52
161
  off(listener: FastEventListener<any, any, any>): void;
53
162
  off(type: string, listener: FastEventListener<any, any, any>): void;
54
163
  off(type: Types, listener: FastEventListener<any, any, any>): void;
55
164
  off(type: string): void;
56
165
  off(type: Types): void;
166
+ offAll(): void;
57
167
  clear(): void;
58
- emit<R = any>(type: Types, payload?: Events[Types], retain?: boolean): R[];
59
- emit<R = any>(type: string, payload?: any, retain?: boolean): R[];
60
- waitFor<T extends Types, P = Events[T], M = Meta>(type: T, timeout?: number): Promise<FastEventMessage<T, P, M>>;
61
- waitFor<T extends string, P = Events[T], M = Meta>(type: string, timeout?: number): Promise<FastEventMessage<T, P, M>>;
168
+ emit<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): R[];
169
+ emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? Events[Types] : any, options?: FastEventListenerArgs<FinalMeta>): R[];
170
+ emit<R = any>(message: FastEventEmitMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
171
+ emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
172
+ [K in T]: K extends Types ? Events[K] : any;
173
+ }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
174
+ emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
175
+ emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
176
+ emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
177
+ waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{
178
+ [key in T]: Events[T];
179
+ }, FinalMeta>>;
180
+ waitFor(type: string, timeout?: number): Promise<FastEventMessage<{
181
+ [key: string]: any;
182
+ }, FinalMeta>>;
183
+ waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{
184
+ [key: string]: P;
185
+ }, FinalMeta>>;
62
186
  /**
63
187
  * 创建一个新的作用域实例
64
188
  * @param prefix - 作用域前缀
@@ -91,7 +215,7 @@ declare class FastEventScope<Events extends FastEvents = FastEvents, Meta extend
91
215
  * profileScope.emit('update', { name: 'John' });
92
216
  * ```
93
217
  */
94
- scope(prefix: string): FastEventScope<ScopeEvents<Events, string>, Record<string, any>, any, keyof ScopeEvents<Events, string>>;
218
+ scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: FastEventScopeOptions<Partial<FinalMeta> & M, C>): FastEventScope<PickScopeEvents<Events, P> & E, FinalMeta & M, C, keyof PickScopeEvents<Events, P> | keyof E, FinalMeta & M & FastEventScopeMeta>;
95
219
  }
96
220
 
97
221
  /**
@@ -101,7 +225,7 @@ declare class FastEventScope<Events extends FastEvents = FastEvents, Meta extend
101
225
  * @template Meta - 事件元数据类型,默认为任意键值对对象
102
226
  * @template Types - 事件类型的键名类型,默认为Events的键名类型
103
227
  */
104
- declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Record<string, any> = Record<string, any>, Context = any, Types extends keyof Events = keyof Events> {
228
+ declare class FastEvent<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Events & FastEvents, Types extends keyof AllEvents = Exclude<keyof (AllEvents), number | symbol>> {
105
229
  /** 事件监听器树结构,存储所有注册的事件监听器 */
106
230
  listeners: FastListeners;
107
231
  /** 事件发射器的配置选项 */
@@ -114,6 +238,7 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
114
238
  retainedMessages: Map<string, any>;
115
239
  /** 当前注册的监听器总数 */
116
240
  listenerCount: number;
241
+ events: Events;
117
242
  /**
118
243
  * 创建FastEvent实例
119
244
  * @param options - 事件发射器的配置选项
@@ -125,9 +250,10 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
125
250
  * - context: null - 监听器执行上下文
126
251
  * - ignoreErrors: true - 是否忽略监听器执行错误
127
252
  */
128
- constructor(options?: FastEventOptions<Meta>);
253
+ constructor(options?: FastEventOptions<Meta, Context>);
129
254
  /** 获取事件发射器的配置选项 */
130
- get options(): FastEventOptions;
255
+ get options(): RequiredItems<FastEventOptions<Meta, Context>, ["meta", "context"]>;
256
+ get context(): Context;
131
257
  /** 获取事件发射器的唯一标识符 */
132
258
  get id(): string;
133
259
  private _addListener;
@@ -149,6 +275,7 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
149
275
  * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器
150
276
  */
151
277
  private _removeListener;
278
+ private _pipeListener;
152
279
  /**
153
280
  * 注册事件监听器
154
281
  * @param type - 事件类型,支持以下格式:
@@ -173,9 +300,12 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
173
300
  * emitter.on('event', handler, { count: 3 });
174
301
  * ```
175
302
  */
176
- on<T extends string>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
177
- on<T extends Types = Types>(type: T, listener: FastEventListener<Types, Events[T], Meta, Context>, options?: FastEventListenOptions): FastEventSubscriber;
178
- on<P = any>(type: '**', listener: FastEventListener<Types, P, Meta, Context>): FastEventSubscriber;
303
+ on<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
304
+ on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
305
+ on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
306
+ on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
307
+ on<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
308
+ on(type: '**', listener: FastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
179
309
  /**
180
310
  * 注册一次性事件监听器
181
311
  * @param type - 事件类型,支持与on方法相同的格式:
@@ -197,8 +327,10 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
197
327
  * });
198
328
  * ```
199
329
  */
200
- once<T extends Types = Types>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>): FastEventSubscriber;
201
- once<T extends string>(type: T, listener: FastEventListener<T, Events[T], Meta, Context>): FastEventSubscriber;
330
+ once<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
331
+ once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
332
+ once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
333
+ once<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
202
334
  /**
203
335
  * 注册一个监听器,用于监听所有事件
204
336
  * @param listener 事件监听器函数,可以接收任意类型的事件数据
@@ -211,9 +343,18 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
211
343
  *
212
344
  * // 取消监听
213
345
  * subscriber.off();
214
- * ```
346
+ * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber
215
347
  */
216
- onAny<P = any>(listener: FastEventListener<string, P, Meta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
348
+ onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
349
+ onAny<P = any>(listener: FastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
350
+ /**
351
+ *
352
+ * 当调用on/once/onAny时如果没有指定监听器,则调用此方法
353
+ *
354
+ * 此方法供子类继承
355
+ *
356
+ */
357
+ onMessage(message: FastEventMessage): void;
217
358
  off(listener: FastEventListener<any, any, any>): void;
218
359
  off(type: string, listener: FastEventListener<any, any, any>): void;
219
360
  off(type: Types, listener: FastEventListener<any, any, any>): void;
@@ -227,7 +368,7 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
227
368
  * - 如果没有提供prefix,则清除所有监听器
228
369
  * - 同时会清空保留的事件(_retainedEvents)
229
370
  * - 重置监听器对象为空
230
-
371
+
231
372
  * @example
232
373
  *
233
374
  * ```ts
@@ -236,7 +377,6 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
236
377
  *
237
378
  */
238
379
  offAll(entry?: string): void;
239
- private _getListenerNode;
240
380
  /**
241
381
  * 移除保留的事件
242
382
  * @param prefix - 事件前缀。如果不提供,将清除所有保留的事件。
@@ -245,8 +385,7 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
245
385
  * @private
246
386
  */
247
387
  private _removeRetainedEvents;
248
- clear(): void;
249
- private _createMeta;
388
+ clear(prefix?: string): void;
250
389
  private _emitForLastEvent;
251
390
  /**
252
391
  * 遍历监听器节点树
@@ -264,6 +403,7 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
264
403
  */
265
404
  private _traverseToPath;
266
405
  private _traverseListeners;
406
+ private _onListenerError;
267
407
  /**
268
408
  * 执行单个监听器函数
269
409
  * @param listener - 要执行的监听器函数或包装过的监听器对象
@@ -282,6 +422,13 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
282
422
  * - 否则抛出错误
283
423
  */
284
424
  private _executeListener;
425
+ private _getListenerExecutor;
426
+ /**
427
+ * 触发事件并执行对应的监听器
428
+ * @param type - 事件类型字符串或包含事件信息的对象
429
+ * @param payload - 事件携带的数据负载
430
+ return
431
+ }
285
432
  /**
286
433
  * 执行监听器节点中的所有监听函数
287
434
  * @param node - FastListenerNode类型的监听器节点
@@ -350,10 +497,18 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
350
497
  * }, true);
351
498
  * ```
352
499
  */
353
- emit<R = any>(type: string, payload?: any, retain?: boolean, meta?: Meta): R[];
354
- emit<R = any>(type: Types, payload?: Events[Types], retain?: boolean, meta?: Meta): R[];
355
- emit<R = any>(message: FastEventMessage<Types, Events[Types], Meta>, retain?: boolean): R[];
356
- emit<R = any>(message: FastEventMessage<string, any, Meta>, retain?: boolean): R[];
500
+ emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], retain?: boolean): R[];
501
+ emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, retain?: boolean): R[];
502
+ emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
503
+ [K in T]: K extends Types ? AllEvents[K] : any;
504
+ }, Meta>, retain?: boolean): R[];
505
+ emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[];
506
+ emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], options?: FastEventListenerArgs<Meta>): R[];
507
+ emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[];
508
+ emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
509
+ [K in T]: K extends Types ? AllEvents[K] : any;
510
+ }, Meta>, options?: FastEventListenerArgs<Meta>): R[];
511
+ emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[];
357
512
  /**
358
513
  * 异步触发事件
359
514
  * @param type - 事件类型,可以是字符串或预定义的事件类型
@@ -390,8 +545,18 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
390
545
  * });
391
546
  * ```
392
547
  */
393
- emitAsync<R = any>(type: string, payload?: any, retain?: boolean, meta?: Meta): Promise<[R | Error][]>;
394
- emitAsync<R = any>(type: Types, payload?: Events[Types], retain?: boolean, meta?: Meta): Promise<[R | Error][]>;
548
+ emitAsync<R = any>(type: string, payload?: any, retain?: boolean): Promise<[R | Error][]>;
549
+ emitAsync<R = any>(type: Types, payload?: AllEvents[Types], retain?: boolean): Promise<[R | Error][]>;
550
+ emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
551
+ [K in T]: K extends Types ? AllEvents[K] : any;
552
+ }, Meta>, retain?: boolean): Promise<[R | Error][]>;
553
+ emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>;
554
+ emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
555
+ emitAsync<R = any>(type: Types, payload?: AllEvents[Types], options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
556
+ emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
557
+ [K in T]: K extends Types ? AllEvents[K] : any;
558
+ }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
559
+ emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
395
560
  /**
396
561
  * 等待指定事件发生,返回一个Promise
397
562
  * @param type - 要等待的事件类型
@@ -419,8 +584,13 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
419
584
  * console.log('服务器就绪');
420
585
  * ```
421
586
  */
422
- waitFor<T extends Types, P = Events[T], M = Meta>(type: T, timeout?: number): Promise<FastEventMessage<T, P, M>>;
423
- waitFor<T extends string, P = Events[T], M = Meta>(type: string, timeout?: number): Promise<FastEventMessage<T, P, M>>;
587
+ waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{
588
+ [key in T]: AllEvents[T];
589
+ }, Meta>>;
590
+ waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>;
591
+ waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{
592
+ [key: string]: P;
593
+ }, Meta>>;
424
594
  /**
425
595
  * 创建一个新的事件作用域
426
596
  * @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前
@@ -461,7 +631,69 @@ declare class FastEvent<Events extends FastEvents = FastEvents, Meta extends Rec
461
631
  * userEvents.offAll(); // 清理 'user' 前缀下的所有事件
462
632
  * ```
463
633
  */
464
- scope<T extends string>(prefix: T): FastEventScope<ScopeEvents<Events, T>, Record<string, any>, any, keyof ScopeEvents<Events, T>>;
634
+ scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: FastEventScopeOptions<M, C>): FastEventScope<PickScopeEvents<AllEvents, P> & E, Meta & M, C, keyof PickScopeEvents<AllEvents, P> | keyof E, Meta & M & FastEventScopeMeta>;
635
+ }
636
+
637
+ interface FastEventListenerDecorators {
638
+ queue: string;
639
+ }
640
+ type FastQueuePriority = 'none';
641
+ type FastQueueOverflows = "drop" | "expand" | 'slide' | 'throw';
642
+ type QueueListenerPipeOptions = {
643
+ size?: number;
644
+ maxExpandSize?: number;
645
+ expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
646
+ overflow?: FastQueueOverflows;
647
+ onNew?: (newMessage: FastEventMessage, messages: FastEventMessage[]) => void;
648
+ };
649
+ declare const queue: (options?: QueueListenerPipeOptions) => FastListenerPipe;
650
+ declare const dropping: (size?: number) => FastListenerPipe;
651
+ declare const sliding: (size?: number) => FastListenerPipe;
652
+ declare const expanding: (options?: Omit<QueueListenerPipeOptions, "overflow">) => FastListenerPipe;
653
+
654
+ /**
655
+ * 创建一个超时装饰器,限制监听器函数的执行时间
656
+ * @param ms 超时时间(毫秒)
657
+ * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError
658
+ * @returns 装饰器函数
659
+ */
660
+ declare const timeout: <T = any>(ms: number, defaultValue?: T) => FastListenerPipe;
661
+
662
+ interface DebounceOptions {
663
+ /**
664
+ * 当消息被丢弃时的回调函数
665
+ */
666
+ drop?: (message: FastEventMessage) => void;
667
+ }
668
+ /**
669
+ * 创建一个防抖动装饰器,限制监听器函数的执行频率
670
+ * @param ms 防抖动时间(毫秒)
671
+ * @param options 可选的配置项
672
+ * @returns 装饰器函数
673
+ */
674
+ declare const debounce: (ms: number, options?: DebounceOptions) => FastListenerPipe;
675
+
676
+ interface ThrottleOptions {
677
+ /**
678
+ * 当消息被丢弃时的回调函数
679
+ */
680
+ drop?: (message: FastEventMessage) => void;
681
+ }
682
+ /**
683
+ * 创建一个节流装饰器,限制监听器函数的执行频率
684
+ * @param interval 节流时间间隔(毫秒)
685
+ * @param options 可选的配置项
686
+ * @returns 装饰器函数
687
+ */
688
+ declare const throttle: (interval: number, options?: ThrottleOptions) => FastListenerPipe;
689
+
690
+ declare class FastEventError extends Error {
691
+ }
692
+ declare class TimeoutError extends FastEventError {
693
+ }
694
+ declare class AbortError extends FastEventError {
695
+ }
696
+ declare class QueueOverflowError extends FastEventError {
465
697
  }
466
698
 
467
- export { FastEvent, type FastEventListenOptions, type FastEventListener, type FastEventMessage, type FastEventOptions, FastEventScope, type FastEventSubscriber, type FastEvents, type FastListenerNode, type FastListeners, type ScopeEvents };
699
+ export { AbortError, type DebounceOptions, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventListenerDecorators, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerExecutorArgs, type FastListenerMeta, type FastListenerNode, type FastListenerPipe, type FastListeners, type FastQueueOverflows, type FastQueuePriority, type IFastListenerExecutor, type Merge, type PickScopeEvents, type QueueListenerPipeOptions, QueueOverflowError, type RequiredItems, type ScopeEvents, type ThrottleOptions, TimeoutError, debounce, dropping, expanding, queue, sliding, throttle, timeout };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var m=Object.defineProperty;var v=(h,e,t)=>e in h?m(h,e,{enumerable:true,configurable:true,writable:true,value:t}):h[e]=t;var l=(h,e)=>m(h,"name",{value:e,configurable:true});var u=(h,e,t)=>v(h,typeof e!="symbol"?e+"":e,t);var f=class f{constructor(e,t){u(this,"emitter");u(this,"prefix");this.emitter=e,this.prefix=t,t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;let s=l(function(i){if(i.type.startsWith(t))return e(Object.assign({},i,{type:i.type.substring(t.length)}))},"scopeListener");return e.__wrappedListener=s,e}_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(){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(e,t){let s=this.prefix+"**";return this.on(s,e,t)}offAll(){this.emitter.offAll(this.prefix);}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}clear(){this.offAll();}emit(){let e=arguments[0],t=arguments[1],s=arguments[2];return this.emitter.emit(this._getScopeType(e),t,s)}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(e){return this.emitter.scope(this._getScopeType(e))}};l(f,"FastEventScope");var c=f;function d(h,e){if(h.length!==e.length&&h.length>0&&e[e.length-1]!=="**")return false;let t=[...e];e.length>0&&e[e.length-1]==="**"&&t.splice(e.length-1,1,...Array.from({length:h.length-e.length+1}).fill("*"));for(let s=0;s<h.length;s++)if(t[s]!=="*"&&t[s]!==h[s])return false;return true}l(d,"isPathMatched");function y(h,e){let t=[];for(;;){let s=h.findIndex(i=>e(i));if(s===-1){t.push(s);break}h.splice(s,1);}return t}l(y,"removeItem");var _=class _{constructor(e){u(this,"listeners",{__listeners:[]});u(this,"_options");u(this,"_delimiter","/");u(this,"_context");u(this,"retainedMessages",new Map);u(this,"listenerCount",0);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true},e),this._delimiter=this._options.delimiter,this._context=this._options.context||this,this._enableDevTools();}get options(){return this._options}get id(){return this._options.id}_addListener(e,t,s){let{count:i,prepend:r}=s;return this._forEachNodes(e,n=>{let o=i>0?[t,i]:t;r?n.__listeners.splice(0,0,o):n.__listeners.push(o),typeof this._options.onAddListener=="function"&&(this.listenerCount++,this._options.onAddListener(e,t));})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let i=0;i<e.length;i++){let r=e[i];if(r in s||(s[r]={__listeners:[]}),i===e.length-1){let n=s[r];return t(n,s),n}else s=s[r];}}_removeListener(e,t,s){s&&y(e.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let r=i===s;return r&&typeof this._options.onRemoveListener=="function"&&(this.listenerCount--,this._options.onRemoveListener(t,s)),r});}on(){let e=arguments[0],t=arguments[1],s=Object.assign({count:0,prepend:false},arguments[2]);if(e.length===0)throw new Error("event type cannot be empty");if(e==="**")return this.onAny(t);let i=e.split(this._delimiter),r=this._addListener(i,t,s);return r&&!e.includes("*")&&this._emitForLastEvent(e),{off:l(()=>r&&this._removeListener(r,i,t),"off")}}once(){return this.on(arguments[0],arguments[1],{count:1})}onAny(e,t){let s=this.listeners.__listeners;return t&&t.prepend?s.splice(0,0,e):s.push(e),{off:l(()=>this._removeListener(this.listeners,[],e),"off")}}off(){let e=arguments,t=typeof e[0]=="function"?void 0:e[0],s=typeof e[0]=="function"?e[0]:e[1],i=t?t.split(this._delimiter):[],r=t?t.includes("*"):false;if(t&&!r)this._traverseToPath(this.listeners,i,n=>{s?this._removeListener(n,i,s):t&&(n.__listeners=[]);});else {let n=r?[]:i;this._traverseListeners(this.listeners,n,(o,a)=>{(s!==void 0||r&&d(o,i))&&(s?this._removeListener(a,i,s):a.__listeners=[]);});}}offAll(e){if(e){let t=this._getListenerNode(e.split(this._delimiter));t&&(t.__listeners=[]),this._removeRetainedEvents(e);}else this.retainedMessages.clear(),this.listeners={__listeners:[]};typeof this._options.onClearListeners=="function"&&this._options.onClearListeners.call(this);}_getListenerNode(e){let t;return this._forEachNodes(e,s=>{t=s;}),t}_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(){this.offAll();}_createMeta(e){return this._options.meta?Object.assign({},this._options.meta,e):e}_emitForLastEvent(e){if(this.retainedMessages.has(e)){let t=this.retainedMessages.get(e),s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,i=>{this._executeListeners(i,t);}),this._executeListeners(this.listeners,t);}}_traverseToPath(e,t,s,i=0,r){if(i>=t.length){s(e);return}let n=t[i];if(r===true){this._traverseToPath(e,t,s,i+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,i+1),"**"in e&&this._traverseToPath(e["**"],t,s,i+1,true),n in e&&this._traverseToPath(e[n],t,s,i+1);}_traverseListeners(e,t,s){let i=e;t&&t.length>0&&this._traverseToPath(e,t,n=>{i=n;});let r=l((n,o,a)=>{o(a,n);for(let[p,g]of Object.entries(n))p.startsWith("__")||g&&r(g,o,[...a,p]);},"traverseNodes");r(i,s,[]);}_executeListener(e,t){try{return typeof e.__wrappedListener=="function"?e.__wrappedListener.call(this._context,t):e.call(this._context,t)}catch(s){if(s._emitter=t.type,typeof this._options.onListenerError=="function"&&this._options.onListenerError.call(this,t.type,s),this._options.ignoreErrors)return s;throw s}}_executeListeners(e,t){if(!e||!e.__listeners)return [];let s=0,i=e.__listeners,r=[];for(;s<i.length;){let n=i[s];Array.isArray(n)?(r.push(this._executeListener(n[0],t)),n[1]--,n[1]===0&&(i.splice(s,1),s--)):r.push(this._executeListener(n,t)),s++;}return r}emit(){let e,t,s,i;typeof arguments[0]=="object"?(e=arguments[0].type,t=arguments[0].payload,i=this._createMeta(arguments[0].meta),s=arguments[1]):(e=arguments[0],t=arguments[1],s=arguments[2],i=this._createMeta(arguments[3]));let r={type:e,payload:t,meta:i},n=e.split(this._delimiter);s&&this.retainedMessages.set(e,r);let o=[];return o.push(...this._executeListeners(this.listeners,r)),this._traverseToPath(this.listeners,n,a=>{o.push(...this._executeListeners(a,r)),this._options.debug&&typeof this._options.onExecuteListener=="function"&&(s&&(r.meta||(r.meta={retain:true})),this._options.onExecuteListener.call(this,r,o,[...this.listeners.__listeners,...a.__listeners]));}),o}async emitAsync(){let e=arguments[0],t=arguments[1],s=arguments[2],i=this._createMeta(arguments[3]),r={type:e,payload:t,meta:i};return (await Promise.allSettled(this.emit(r,s))).map(o=>o.status==="fulfilled"?o.value:o.reason)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,i)=>{let r,n,o=l(a=>{clearTimeout(r),n.off(),s(a);},"listener");t&&t>0&&(r=setTimeout(()=>{n&&n.off(),i(new Error("wait for event<"+e+"> is timeout"));},t)),n=this.on(e,o);})}scope(e){return new c(this,e)}};l(_,"FastEvent");var L=_;exports.FastEvent=L;exports.FastEventScope=c;//# sourceMappingURL=index.js.map
1
+ 'use strict';var T=Object.defineProperty;var z=(r,t,e)=>t in r?T(r,t,{enumerable:true,configurable:true,writable:true,value:e}):r[t]=e;var l=(r,t)=>T(r,"name",{value:t,configurable:true});var D=(r,t)=>{for(var e in t)T(r,e,{get:t[e],enumerable:true});};var f=(r,t,e)=>z(r,typeof t!="symbol"?t+"":t,e);function x(r,t,e,s){let i,n,o,c={};typeof r[0]=="object"?(i=r[0].type,n=r[0].payload,c=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},o=r[0].meta):(i=r[0],n=r[1],c=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),o=Object.assign({},t,e,c.meta,o),Object.keys(o).length===0&&(o=void 0);let a={type:i,payload:n,meta:o};return c.executor===void 0&&(c.executor=s),[a,c]}l(x,"handleEmitArgs");function m(r,t){return Object.defineProperty(r,"name",{value:t||"anonymous",configurable:true}),r}l(m,"renameFn");var L=class L{constructor(t,e,s){f(this,"emitter");f(this,"prefix");f(this,"options");f(this,"events");this.emitter=t,this.prefix=e,this.options=Object.assign({},{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}get context(){return this.options.context}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;let s=this;return m(function(n,o){if(n.type.startsWith(e))return t.call(s.context||s.emitter.context,Object.assign({},n,{type:n.type.substring(e.length)}),o)},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(t,e){return this.on("**",t,e)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}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[t,e]=x(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(t,e){let s=Object.assign({},this.options.meta,e?.meta),i=e?.context!==void 0?e.context:this.context,n=Object.assign({},this.options,e,{meta:Object.keys(s).length===0?void 0:s,context:i});return new L(this.emitter,this.prefix+t,n)}};l(L,"FastEventScope");var y=L;function N(r,t){if(r.length!==t.length&&r.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:r.length-t.length+1}).fill("*"));for(let s=0;s<r.length;s++)if(e[s]!=="*"&&e[s]!==r[s])return false;return true}l(N,"isPathMatched");function W(r,t){let e=[];for(;;){let s=r.findIndex(i=>t(i));if(s===-1){e.push(s);break}r.splice(s,1);}return e}l(W,"removeItem");var w={};D(w,{allSettled:()=>I,balance:()=>V,first:()=>k,last:()=>X,race:()=>B,random:()=>$});var I=l((r,t,e,s)=>Promise.allSettled(r.map(i=>s(i[0],t,e))),"allSettled"),B=l((r,t,e,s)=>{let i,n;return (!e||e&&!e.abortSignal)&&(n=new AbortController,e||(e={}),e.abortSignal=n.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(s(c[0],t,e)).then(a=>(i||(i=c,c[2]++),n?.abort(),a)))))]},"race"),V=l((r,t,e,s)=>{let i,n=0;return r.forEach((o,c)=>{o[2]--,(i===void 0||i>o[2])&&(i=o[2],n=c);}),r[n][2]++,[s(r[n][0],t,e)]},"balance"),k=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[0][2]++,[s(r[0][0],t,e)]),"first"),X=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[r.length-1][2]++,[s(r[r.length-1][0],t,e)]),"last"),$=l((r,t,e,s)=>{let i=Math.floor(Math.random()*r.length);return r.forEach(n=>n[2]--),r[i][2]++,[s(r[i][0],t,e)]},"random");function u(r){return r&&typeof r=="function"}l(u,"isFunction");var P=class P extends Error{};l(P,"FastEventError");var d=P,S=class S extends d{};l(S,"TimeoutError");var b=S,M=class M extends d{};l(M,"AbortError");var v=M,O=class O extends d{};l(O,"QueueOverflowError");var E=O;var A=class A{constructor(t){f(this,"listeners",{__listeners:[]});f(this,"_options");f(this,"_delimiter","/");f(this,"_context");f(this,"retainedMessages",new Map);f(this,"listenerCount",0);f(this,"events");this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0},t),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this._context}get id(){return this._options.id}_addListener(t,e,s){let{count:i,prepend:n}=s;return this._forEachNodes(t,o=>{let c=[e,i,0];n?o.__listeners.splice(0,0,c):o.__listeners.push(c),this.listenerCount++,u(this._options.onAddListener)&&this._options.onAddListener(t,e);})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let i=0;i<t.length;i++){let n=t[i];if(n in s||(s[n]={__listeners:[]}),i===t.length-1){let o=s[n];return e(o,s),o}else s=s[n];}}_removeListener(t,e,s){s&&W(t.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,u(this._options.onRemoveListener)&&this._options.onRemoveListener(e,s)),n});}_pipeListener(t,e){return e.forEach(s=>{t=m(s(t),t.name);}),t}on(){let t=arguments[0],e=u(arguments[1])?arguments[1]:this.onMessage.bind(this),s=Object.assign({count:0,prepend:false},u(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");let i=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),u(s.filter)||u(s.off)){let c=e;e=m(function(a,h){if(u(s.off)&&s.off.call(this,a,h)){o();return}if(u(s.filter)){if(s.filter.call(this,a,h))return c.call(this,a,h)}else return c.call(this,a,h)},e.name);}let n=this._addListener(i,e,s),o=l(()=>n&&this._removeListener(n,i,e),"off");return n&&!t.includes("*")&&this._emitForLastEvent(t),{off:o,listener:e}}once(){return u(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[0],arguments[1])}onMessage(t){}off(){let t=arguments,e=u(t[0])?void 0:t[0],s=u(t[0])?t[0]:t[1],i=e?e.split(this._delimiter):[],n=e?e.includes("*"):false;if(e&&!n)this._traverseToPath(this.listeners,i,o=>{s?this._removeListener(o,i,s):e&&(o.__listeners=[]);});else {let o=n?[]:i;this._traverseListeners(this.listeners,o,(c,a)=>{(s!==void 0||n&&N(c,i))&&(s?this._removeListener(a,i,s):a.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(i,n)=>{s+=n.__listeners.length,n.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,i)=>{e+=i.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}u(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitForLastEvent(t){if(this.retainedMessages.has(t)){let e=this.retainedMessages.get(t),s=t.split(this._delimiter),i=[];this._traverseToPath(this.listeners,s,n=>{i.push(n);}),this._executeListeners(i,e);}}_traverseToPath(t,e,s,i=0,n){if(i>=e.length){s(t);return}let o=e[i];if(n===true){this._traverseToPath(t,e,s,i+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,i+1),"**"in t&&this._traverseToPath(t["**"],e,s,i+1,true),o in t&&this._traverseToPath(t[o],e,s,i+1);}_traverseListeners(t,e,s){let i=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{i=o;});let n=l((o,c,a)=>{c(a,o);for(let[h,_]of Object.entries(o))h.startsWith("__")||_&&n(_,c,[...a,h]);},"traverseNodes");n(i,s,[]);}_onListenerError(t,e,s,i){if(i instanceof Error&&(i._emitter=`${t.name||"anonymous"}:${e.type}`),u(this._options.onListenerError))try{this._options.onListenerError.call(this,t,i,e,s);}catch{}if(this._options.ignoreErrors)return i;throw i}_executeListener(t,e,s){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new v(t.name));let i=t.call(this._context||this,e,s);return i&&i instanceof Promise&&(i=i.catch(n=>this._onListenerError(t,e,s,n))),i}catch(i){return this._onListenerError(t,e,s,i)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(u(e))return e;if(e&&e in w)return w[e]}_executeListeners(t,e,s){if(!t||t.length===0)return [];let i=t.reduce((n,o)=>n.concat(o.__listeners.map((c,a)=>[c,a,o.__listeners])),[]);try{let n=this._getListenerExecutor(s);return n?n(i.map(o=>o[0]),e,s,this._executeListener.bind(this)):i.map(o=>this._executeListener(o[0][0],e,s))}finally{for(let n=i.length-1;n>=0;n--){let o=i[n][0];o[2]++,o[1]>0&&o[1]<=o[2]&&i[n][2].splice(n,1);}}}emit(){let[t,e]=x(arguments,this.options.meta),s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let i=[],n=[];if(this._traverseToPath(this.listeners,s,o=>{n.push(o);}),u(this._options.onBeforeExecuteListener)&&this._options.onBeforeExecuteListener.call(this,t,e)===false)throw new Error("emit "+t.type+" is aborted");return i.push(...this._executeListeners(n,t,e)),u(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,i,n),i}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,i)=>{let n,o,c=l(a=>{clearTimeout(n),o.off(),s(a);},"listener");e&&e>0&&(n=setTimeout(()=>{o&&o.off(),i(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,c);})}scope(t,e){return new y(this,t,e)}};l(A,"FastEvent");var R=A;var j=l(r=>{let{size:t,overflow:e,maxExpandSize:s,expandOverflow:i,onNew:n}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide"},r),o=[],c=t,a=false,h=l(p=>{u(n)?n(p,o):o.push(p);},"pushMessage"),_=l(p=>{switch(o.length>=s&&e==="expand"?i:e){case "drop":return false;case "expand":return c=Math.min(c+t,s),h(p),true;case "slide":return o.shift(),h(p),true;case "throw":throw new E;default:return false}},"handleOverflow");return p=>async function(g,C){if(a){o.length<c?h(g):_(g);return}a=true;try{for(await p.call(this,g,C);o.length>0;){let F=o.shift();F&&await p.call(this,F,C);}}finally{a=false;}}},"queue"),Lt=l((r=10)=>j({size:r,overflow:"drop"}),"dropping"),wt=l((r=10)=>j({size:r,overflow:"slide"}),"sliding"),bt=l(r=>j(Object.assign({},r,{overflow:"expand"})),"expanding");var Pt=l((r,t)=>e=>async function(s,i){let n,o=new Promise((a,h)=>{n=setTimeout(()=>{t!==void 0?a(t):h(new b);},r);}),c=Promise.resolve(e.call(this,s,i));try{return await Promise.race([c,o])}finally{clearTimeout(n);}},"timeout");var Ot=l((r,t)=>e=>{let s=false,i=null;return async function(n,o){if(s){t?.drop&&t.drop(n);return}try{s=!0;let c=await e.call(this,n,o);return i=setTimeout(()=>{s=!1,i=null;},r),c}catch(c){throw s=false,i&&(clearTimeout(i),i=null),c}}},"debounce");var Ct=l((r,t)=>e=>{let s=0;return async function(i,n){let o=Date.now();if(o-s<r){t?.drop&&t.drop(i);return}return s=o,await e.call(this,i,n)}},"throttle");exports.AbortError=v;exports.FastEvent=R;exports.FastEventError=d;exports.FastEventScope=y;exports.QueueOverflowError=E;exports.TimeoutError=b;exports.debounce=Ot;exports.dropping=Lt;exports.expanding=bt;exports.queue=j;exports.sliding=wt;exports.throttle=Ct;exports.timeout=Pt;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map