fastevent 2.1.1 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,15 @@
1
- interface FaseEventMessageExtends {
2
- }
3
1
  interface FastEventMeta {
4
2
  }
5
- type FastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
3
+ interface FastEventMessageExtends {
4
+ }
5
+ type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
6
6
  [K in keyof Events]: {
7
7
  type: Exclude<K, number | symbol>;
8
8
  payload: Events[K];
9
9
  meta: FastEventMeta & M & Record<string, any>;
10
10
  };
11
- }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
12
- type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: FastEventMessage<{
11
+ }[Exclude<keyof Events, number | symbol>]) & DeepPartial<FastEventMessageExtends>;
12
+ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<{
13
13
  [K in T]: P;
14
14
  }, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
15
15
  /**
@@ -18,7 +18,7 @@ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (
18
18
  type FastListenerMeta = [FastEventListener<any, any>, number, number];
19
19
  type FastEventListenerArgs<M = Record<string, any>> = {
20
20
  retain?: boolean;
21
- meta?: Partial<M> & Record<string, any>;
21
+ meta?: DeepPartial<M> & Record<string, any>;
22
22
  abortSignal?: AbortSignal;
23
23
  /**
24
24
  *
@@ -31,10 +31,13 @@ type FastEventListenerArgs<M = Record<string, any>> = {
31
31
  /**
32
32
  * 当emit参数解析完成后的回调,用于修改emit参数
33
33
  */
34
- parseArgs?: (message: FastEventMessage, args: FastEventListenerArgs) => void;
34
+ parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;
35
+ };
36
+ type DeepPartial<T> = {
37
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
35
38
  };
36
39
 
37
- type FastListenerExecutor = (listeners: FastListenerMeta[], message: FastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
40
+ type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
38
41
  type FastListenerExecutorBuilder<T extends Record<string, any>> = (options?: T) => FastListenerExecutor;
39
42
 
40
43
  /**
@@ -120,8 +123,8 @@ type SeriesExecutorOptions = {
120
123
  * })
121
124
  */
122
125
  onReturns?: (results: any, cur: any) => any;
123
- onNext?: (index: number, previous: any, message: FastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
124
- onError?: 'skip' | 'abort' | 'error' | ((e: any, message: FastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
126
+ onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
127
+ onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
125
128
  };
126
129
  declare const series: (options?: SeriesExecutorOptions) => FastListenerExecutor;
127
130
 
@@ -1,15 +1,15 @@
1
- interface FaseEventMessageExtends {
2
- }
3
1
  interface FastEventMeta {
4
2
  }
5
- type FastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
3
+ interface FastEventMessageExtends {
4
+ }
5
+ type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
6
6
  [K in keyof Events]: {
7
7
  type: Exclude<K, number | symbol>;
8
8
  payload: Events[K];
9
9
  meta: FastEventMeta & M & Record<string, any>;
10
10
  };
11
- }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
12
- type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: FastEventMessage<{
11
+ }[Exclude<keyof Events, number | symbol>]) & DeepPartial<FastEventMessageExtends>;
12
+ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<{
13
13
  [K in T]: P;
14
14
  }, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
15
15
  /**
@@ -18,7 +18,7 @@ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (
18
18
  type FastListenerMeta = [FastEventListener<any, any>, number, number];
19
19
  type FastEventListenerArgs<M = Record<string, any>> = {
20
20
  retain?: boolean;
21
- meta?: Partial<M> & Record<string, any>;
21
+ meta?: DeepPartial<M> & Record<string, any>;
22
22
  abortSignal?: AbortSignal;
23
23
  /**
24
24
  *
@@ -31,10 +31,13 @@ type FastEventListenerArgs<M = Record<string, any>> = {
31
31
  /**
32
32
  * 当emit参数解析完成后的回调,用于修改emit参数
33
33
  */
34
- parseArgs?: (message: FastEventMessage, args: FastEventListenerArgs) => void;
34
+ parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;
35
+ };
36
+ type DeepPartial<T> = {
37
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
35
38
  };
36
39
 
37
- type FastListenerExecutor = (listeners: FastListenerMeta[], message: FastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
40
+ type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
38
41
  type FastListenerExecutorBuilder<T extends Record<string, any>> = (options?: T) => FastListenerExecutor;
39
42
 
40
43
  /**
@@ -120,8 +123,8 @@ type SeriesExecutorOptions = {
120
123
  * })
121
124
  */
122
125
  onReturns?: (results: any, cur: any) => any;
123
- onNext?: (index: number, previous: any, message: FastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
124
- onError?: 'skip' | 'abort' | 'error' | ((e: any, message: FastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
126
+ onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
127
+ onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
125
128
  };
126
129
  declare const series: (options?: SeriesExecutorOptions) => FastListenerExecutor;
127
130
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: FastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: FastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as FastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { FastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: FastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
1
+ {"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as FastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { TypedFastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"iFAWaA,IAAAA,CAAAA,CAAQC,CAAA,CAAA,IACV,CAACC,CAAAA,CAAWC,CAASC,CAAAA,CAAAA,CAAMC,CAC9BH,IAAAA,CAAAA,CAAUI,OAAQC,CAAAA,CAAAA,EAAYA,CAAS,CAAA,CAAA,GAAE,CACzCL,CAAAA,CAAAA,CAAU,CAAA,CAAA,CAAG,CAAA,CAAA,EAAA,CACN,CACHG,CAAAA,CAAQH,CAAU,CAAA,CAAA,CAAG,CAAA,CAAA,CAAIC,CAAAA,CAAAA,CAASC,CAAAA,CALzB,CAAA,CAAA,CAAA,OAAA,ECDRI,IAAAA,CAAAA,CAAOP,CAAA,CAAA,IACT,CAACC,CAAAA,CAAWC,CAASC,CAAAA,CAAAA,CAAMC,CAC9BH,IAAAA,CAAAA,CAAUI,OAAQC,CAAAA,CAAAA,EAAYA,EAAS,CAAA,CAAA,EAAE,CACzCL,CAAAA,CAAAA,CAAUA,CAAUO,CAAAA,MAAAA,CAAS,CAAA,CAAA,CAAG,CAAA,CAAA,EAAA,CACzB,CACHJ,CAAAA,CAAQH,CAAUA,CAAAA,CAAAA,CAAUO,OAAS,CAAA,CAAA,CAAG,CAAA,CAAA,CAAIN,CAASC,CAAAA,CAAAA,CAL7C,CAAA,CAAA,CAAA,MAAA,ECQPM,IAAAA,CAAAA,CAAOT,CAAA,CAAA,IACT,CAACC,CAAAA,CAAWC,EAASC,CAAMC,CAAAA,CAAAA,GAAAA,CAC9B,IAAIM,CACAC,CAAAA,CAAAA,CACJ,OAAI,CAAA,CAACR,CAASA,EAAAA,CAAAA,EAAQ,CAACA,CAAAA,CAAKS,WACxBD,IAAAA,CAAAA,CAAkB,IAAIE,eACjBV,CAAAA,CAAAA,GAAMA,CAAO,CAAA,EAClBA,CAAAA,CAAAA,CAAAA,CAAKS,WAAcD,CAAAA,CAAAA,CAAgBG,MAahC,CAAA,CAAA,CAXQC,OAAQN,CAAAA,IAAAA,CAAKR,CAAUe,CAAAA,GAAAA,CAAIV,IACtCA,CAAS,CAAA,CAAA,CACFS,EAAAA,CAAAA,OAAAA,CAAQE,OAAQb,CAAAA,CAAAA,CAAQE,CAAS,CAAA,CAAA,CAAIJ,CAAAA,CAAAA,CAASC,CAAAA,CAAAA,CAAOe,CAAAA,IAAAA,CAAMC,IACzDT,CACDA,GAAAA,CAAAA,CAASJ,CACTA,CAAAA,CAAAA,CAAS,CAAA,CAAA,EAAA,CAAA,CAEbK,CAAiBS,EAAAA,KAAAA,EACVD,CAAAA,CAAAA,CACX,CACJ,CAAA,CAAA,CAIJ,CAAA,CAAA,CAvBgB,QCFPE,IAAAA,CAAAA,CAASrB,CAAA,CAAA,IACX,CAACC,CAAAA,CAAWC,CAASC,CAAAA,CAAAA,CAAMC,CAAAA,GAAAA,CAC9B,IAAMkB,CAAAA,CAAQC,IAAKC,CAAAA,KAAAA,CAAMD,KAAKF,MAAM,EAAA,CAAKpB,CAAUO,CAAAA,MAAM,CACzDP,CAAAA,OAAAA,CAAUI,CAAAA,OAAAA,CAAQC,CAAYA,EAAAA,CAAAA,CAAS,CAAA,CAAA,EAAE,CACzCL,CAAAA,CAAAA,CAAUqB,CAAAA,CAAO,CAAA,CAAA,CACV,EAAA,CAAA,CACHlB,CAAQH,CAAAA,CAAAA,CAAUqB,CAAAA,CAAAA,CAAO,CAAA,CAAA,CAAIpB,CAASC,CAAAA,CAAAA,CAE9C,CAAA,CAAA,CARkB,UCDTsB,IAAAA,CAAAA,CAAUzB,CAAA,CAAA,IACZ,CAACC,CAAAA,CAAWC,CAASC,CAAAA,CAAAA,CAAMC,CAAAA,GAAAA,CAE9B,IAAIsB,CAAAA,CACAJ,CAAgB,CAAA,CAAA,CACpBrB,OAAAA,CAAUI,CAAAA,OAAAA,CAAQ,CAACC,CAAAA,CAAUqB,CAAAA,GAAAA,CAGzBrB,CAAS,CAAA,CAAA,CACLoB,EAAAA,CAAAA,CAAAA,CAAAA,GAAUE,MAAaF,EAAAA,CAAAA,CAAQpB,CAAS,CAAA,CAAA,KACxCoB,CAAQpB,CAAAA,CAAAA,CAAS,CAAA,CAAA,CACjBgB,CAAQK,CAAAA,CAAAA,EAEhB,CAAA,CAAA,CACA1B,CAAUqB,CAAAA,CAAAA,CAAO,CAAA,CAAA,CACV,EAAA,CAAA,CAAClB,CAAQH,CAAAA,CAAAA,CAAUqB,CAAAA,CAAAA,CAAO,CAAA,CAAA,CAAIpB,CAASC,CAAAA,CAAAA,CAClD,CAAA,CAAA,CAhBmB,SCfhB,EAAA,SAAS0B,CAAWC,CAAAA,CAAAA,CAAO,CAC9B,OAAOA,GAAM,OAAQA,CAAAA,EAAO,UAChC,CAFgBD,CAAAA,CAAAA,CAAAA,CAAAA,YCAT,CAAA,CAAA,SAASE,CAASC,CAAAA,CAAAA,CAAQ,CAC7B,OAAOA,CAAO,EAAA,OAAQA,GAAS,QACnC,CAFgBD,CAAAA,CAAAA,CAAAA,CAAAA,UC0CT,CAAA,CCfA,IAAME,CAASjC,CAAAA,CAAAA,CAACkC,GAAAA,CACnB,GAAM,CAAEC,OAAAA,CAAAA,CAASC,CAAAA,MAAAA,CAAAA,CAAQC,CAAAA,SAAAA,CAAAA,CAAWC,CAAAA,OAAAA,CAAAA,CAAO,CAAA,CAAKC,MAAOC,CAAAA,MAAAA,CAAO,CAC1DL,OAAS,CAAA,KAAA,CACTG,OAAStC,CAAAA,CAAAA,CAAA,IAAA,EAAA,CAAA,SAAA,CAAA,CACToC,MAAQpC,CAAAA,CAAAA,CAAA,IAAM,IAAA,CAAN,QACRqC,CAAAA,CAAAA,SAAAA,CAAWrC,EAAA,CAACyC,CAAAA,CAAQC,CAAaA,GAAAA,CAAAA,CAAtB,WACf,CAAA,CAAA,CAAGR,CAAAA,CAAAA,CACH,OAAO,MAAOjC,CAAWC,CAAAA,CAAAA,CAASC,CAAMC,CAAAA,CAAAA,GAAAA,CACpC,IAAIuC,CAAAA,CACAC,CACAtB,CAAAA,CAAAA,CAAgB,CAEpBrB,CAAAA,CAAAA,CAAUI,OAAQC,CAAAA,CAAAA,EAAYA,CAAS,CAAA,CAAA,CAAE,EAAA,CAAA,CACzC,IAASqB,IAAAA,CAAAA,CAAI,EAAGA,CAAI1B,CAAAA,CAAAA,CAAUO,MAAQmB,CAAAA,CAAAA,EAAAA,CAAK,CACvC,IAAMkB,CAAO5C,CAAAA,CAAAA,CAAUkC,CAAUlC,CAAAA,CAAAA,CAAUO,MAAS,CAAA,CAAA,CAAImB,CAAIA,CAAAA,CAAAA,CACtDrB,CAAAA,CAAAA,CAAWuC,CAAK,CAAA,CAAA,CACtB,CAAA,GAAI,CACA,GAAIhB,CAAWO,CAAAA,CAAAA,CAAWA,EAAAA,CAAAA,CAAO,EAAEd,CAAAA,CAAOsB,CAAY1C,CAAAA,CAAAA,CAASC,EAAMwC,CAAAA,CAAAA,GAAa,CAC9E,CAAA,CAAA,MAEJC,CAAa,CAAA,MAAMxC,CAAQE,CAAAA,CAAAA,CAAUJ,CAASC,CAAAA,CAAAA,CAAM,CAAA,CAAA,CAAA,CAChD0B,CAAWQ,CAAAA,CAAAA,EACXM,CAAUN,CAAAA,CAAAA,CAAUM,CAASC,CAAAA,CAAAA,CAE7BD,CAAAA,CAAAA,CAAUC,CAGdC,CAAAA,CAAAA,CAAK,CAAA,CAAA,GACT,CAASC,MAAAA,CAAAA,CAAQ,CACb,GAAI,CACA,IAAMC,CAAAA,CAAWhB,CAASO,CAAAA,CAAAA,CAAWA,CAAAA,CAAAA,CAAUT,CAAWS,CAAAA,CAAAA,CAAYA,EAAAA,CAAAA,CAASQ,CAAG5C,CAAAA,CAAAA,CAASC,CAAAA,CAAAA,CAC3F,GAAI4C,CAAa,GAAA,MAAA,CACb,SACG,GAAIA,CAAa,GAAA,OAAA,CAAS,CAC7BJ,CAAAA,CAAUG,CACV,CAAA,KACJ,CAAWC,KAAAA,GAAAA,CAAAA,GAAa,OACpB,CAAA,KAER,MAAQ,EACZ,CACJ,CACA,OAAOJ,CACX,CAEJ,CAAA,CA7CsB,QCTf,EAAA,IAAMK,EAAYhD,CAAAA,CAAAA,CAACkC,CACfD,EAAAA,CAAAA,CAAOM,OAAOC,MAAO,CAAA,EAAIN,CAAAA,CAAAA,CAAS,CAErCI,OAAAA,CAAS,OAETF,CAAAA,MAAAA,CAAQpC,CAAA,CAAA,CAACsB,CAAe2B,CAAAA,CAAAA,CAAe/C,CAAAA,GAAAA,CACnCA,EAAQgD,OAAUD,CAAAA,EACtB,CAFQ,CAAA,QAAA,CAGZ,CAAA,CAAA,CARqB,CAAA,WAAA,ECbZE,IAAAA,EAAAA,CAAWnD,CAAA,CAAA,IACb,CAACC,CAAAA,CAAWC,CAASC,CAAAA,CAAAA,CAAMC,CACvBH,GAAAA,CAAAA,CAAUe,GAAIV,CAAAA,CAAAA,EAAYF,CAAQE,CAAAA,CAAAA,CAAS,CAAA,CAAA,CAAIJ,CAASC,CAAAA,CAAAA,CAAM,IAAA,CAAA,CAFrD,CAAA,UAAA","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: FastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: FastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as FastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { FastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: FastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
1
+ {"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as FastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { TypedFastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
package/dist/index.d.mts CHANGED
@@ -1,27 +1,39 @@
1
1
  type FastListenerPipe = (listener: FastEventListener) => FastEventListener;
2
2
 
3
- interface FaseEventMessageExtends {
4
- }
5
3
  interface FastEventMeta {
6
4
  }
7
- type FastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
5
+ interface FastEventMessageExtends {
6
+ }
7
+ type FastEventMessage = {
8
+ type: string;
9
+ payload: any;
10
+ meta?: Record<string, any>;
11
+ };
12
+ type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
8
13
  [K in keyof Events]: {
9
14
  type: Exclude<K, number | symbol>;
10
15
  payload: Events[K];
11
16
  meta: FastEventMeta & M & Record<string, any>;
12
17
  };
13
- }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
18
+ }[Exclude<keyof Events, number | symbol>]) & DeepPartial<FastEventMessageExtends>;
19
+ type TypedFastEventMessageOptional<Events extends Record<string, any> = Record<string, any>, M = any> = ({
20
+ [K in keyof Events]: {
21
+ type: Exclude<K, number | symbol>;
22
+ payload: Events[K];
23
+ meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
24
+ };
25
+ }[Exclude<keyof Events, number | symbol>]) & DeepPartial<FastEventMessageExtends>;
14
26
  type FastEventEmitMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
15
27
  [K in keyof Events]: {
16
28
  type: Exclude<K, number | symbol>;
17
29
  payload?: Events[K];
18
- meta?: Partial<FastEventMeta> & M & Record<string, any>;
30
+ meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
19
31
  };
20
- }[Exclude<keyof Events, number | symbol>]) & FaseEventMessageExtends;
21
- type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: FastEventMessage<{
32
+ }[Exclude<keyof Events, number | symbol>]) & DeepPartial<FastEventMessageExtends>;
33
+ type FastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<{
22
34
  [K in T]: P;
23
35
  }, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
24
- 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>;
36
+ type FastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
25
37
  /**
26
38
  * [监听器函数引用,需要执行多少次,实际执行的次数(用于负载均衡时记录)]
27
39
  */
@@ -64,7 +76,7 @@ type FastEventSubscriber = {
64
76
  listener: FastEventListener<any, any, any>;
65
77
  };
66
78
  type FastListeners = FastListenerNode;
67
- type FastEventOptions<Meta = Record<string, any>, Context = any> = {
79
+ type FastEventOptions<Meta = Record<string, any>, Context = never> = {
68
80
  id: string;
69
81
  debug: boolean;
70
82
  delimiter: string;
@@ -74,9 +86,9 @@ type FastEventOptions<Meta = Record<string, any>, Context = any> = {
74
86
  onAddListener?: (type: string, listener: FastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void;
75
87
  onRemoveListener?: (type: string, listener: FastEventListener) => void;
76
88
  onClearListeners?: () => void;
77
- onListenerError?: ((error: Error, listener: FastEventListener, message: FastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void);
78
- onBeforeExecuteListener?: (message: FastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
79
- onAfterExecuteListener?: (message: FastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
89
+ onListenerError?: ((error: Error, listener: FastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void);
90
+ onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
91
+ onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
80
92
  /**
81
93
  * 全局执行器
82
94
  */
@@ -93,13 +105,13 @@ type ScopeEvents<T extends Record<string, any>, Prefix extends string> = PickSco
93
105
  type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = {
94
106
  count?: number;
95
107
  prepend?: boolean;
96
- filter?: (message: FastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
97
- off?: (message: FastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
108
+ filter?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
109
+ off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
98
110
  pipes?: FastListenerPipe[];
99
111
  };
100
112
  type FastEventListenerArgs<M = Record<string, any>> = {
101
113
  retain?: boolean;
102
- meta?: Partial<M> & Record<string, any>;
114
+ meta?: DeepPartial<M> & Record<string, any>;
103
115
  abortSignal?: AbortSignal;
104
116
  /**
105
117
  *
@@ -112,7 +124,7 @@ type FastEventListenerArgs<M = Record<string, any>> = {
112
124
  /**
113
125
  * 当emit参数解析完成后的回调,用于修改emit参数
114
126
  */
115
- parseArgs?: (message: FastEventMessage, args: FastEventListenerArgs) => void;
127
+ parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;
116
128
  };
117
129
  type Merge<T extends object, U extends object> = {
118
130
  [K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
@@ -244,9 +256,9 @@ type Overloads<T> = Unique<T extends {
244
256
  ]>;
245
257
  type Dict<V = any> = Record<Exclude<string, number | symbol>, V>;
246
258
 
247
- type FastListenerExecutor = (listeners: FastListenerMeta[], message: FastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
259
+ type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: FastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
248
260
 
249
- type FastEventScopeOptions<Meta = Record<string, any>, Context = any> = {
261
+ type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {
250
262
  meta: FastEventScopeMeta & FastEventMeta & Meta;
251
263
  context: Context;
252
264
  executor?: FastListenerExecutor;
@@ -262,6 +274,7 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
262
274
  events: Events;
263
275
  meta: FinalMeta;
264
276
  context: Fallback<Context, typeof this>;
277
+ message: TypedFastEventMessageOptional<Events, FinalMeta>;
265
278
  };
266
279
  prefix: string;
267
280
  emitter: FastEvent<Events>;
@@ -269,6 +282,15 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
269
282
  get context(): Fallback<Context, typeof this>;
270
283
  get options(): FastEventScopeOptions<FinalMeta, Context>;
271
284
  bind(emitter: FastEvent<any>, prefix: string, options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>): void;
285
+ /**
286
+ * 初始化选项
287
+ *
288
+ * 本方法主要供子类重载
289
+ *
290
+ * @param initial - 可选的初始字典对象
291
+ * @returns 返回传入的初始字典对象
292
+ */
293
+ _initOptions(initial: Dict | undefined): Dict | undefined;
272
294
  /**
273
295
  * 获取作用域监听器
274
296
  * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑
@@ -310,14 +332,14 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
310
332
  }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
311
333
  emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
312
334
  emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
313
- emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
314
- waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{
335
+ emitAsync<R = any>(message: TypedFastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
336
+ waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
315
337
  [key in T]: Events[T];
316
338
  }, FinalMeta>>;
317
- waitFor(type: string, timeout?: number): Promise<FastEventMessage<{
339
+ waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<{
318
340
  [key: string]: any;
319
341
  }, FinalMeta>>;
320
- waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{
342
+ waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
321
343
  [key: string]: P;
322
344
  }, FinalMeta>>;
323
345
  /**
@@ -358,7 +380,7 @@ declare class FastEventScope<Events extends Record<string, any> = Record<string,
358
380
  * 当on/once/onAny未指定监听器时,此为默认监听器
359
381
  * @param message
360
382
  */
361
- onMessage(message: FastEventMessage<Events, FinalMeta>, args: FastEventListenerArgs<FinalMeta>): void;
383
+ onMessage(message: TypedFastEventMessage<Events, FinalMeta>, args: FastEventListenerArgs<FinalMeta>): void;
362
384
  }
363
385
 
364
386
  /**
@@ -386,6 +408,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
386
408
  events: AllEvents;
387
409
  meta: Expand<FastEventMeta & Meta & Record<string, any>>;
388
410
  context: Expand<Fallback<Context, typeof this>>;
411
+ message: TypedFastEventMessageOptional<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
389
412
  };
390
413
  /**
391
414
  * 创建FastEvent实例
@@ -405,6 +428,15 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
405
428
  get meta(): Meta;
406
429
  /** 获取事件发射器的唯一标识符 */
407
430
  get id(): string;
431
+ /**
432
+ * 初始化选项
433
+ *
434
+ * 本方法主要供子类重载
435
+ *
436
+ * @param initial - 可选的初始字典对象
437
+ * @returns 返回传入的初始字典对象
438
+ */
439
+ _initOptions(initial?: Partial<FastEventOptions<Meta, Context>>): Partial<FastEventOptions<Meta, Context>> | undefined;
408
440
  /**
409
441
  * 添加事件监听器到事件树中
410
442
  * @param parts - 事件路径数组
@@ -513,7 +545,7 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
513
545
  * 此方法供子类继承
514
546
  *
515
547
  */
516
- onMessage(message: FastEventMessage<AllEvents, Meta>, args: FastEventListenerArgs<Meta>): void;
548
+ onMessage(message: TypedFastEventMessage<AllEvents, Meta>, args: FastEventListenerArgs<Meta>): void;
517
549
  off(listener: FastEventListener<any, any, any>): void;
518
550
  off(type: string, listener: FastEventListener<any, any, any>): void;
519
551
  off(type: Types, listener: FastEventListener<any, any, any>): void;
@@ -758,11 +790,11 @@ declare class FastEvent<Events extends Record<string, any> = Record<string, any>
758
790
  * console.log('服务器就绪');
759
791
  * ```
760
792
  */
761
- waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{
793
+ waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
762
794
  [key in T]: AllEvents[T];
763
795
  }, Meta>>;
764
- waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>;
765
- waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{
796
+ waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<AllEvents, Meta>>;
797
+ waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
766
798
  [key: string]: P;
767
799
  }, Meta>>;
768
800
  /**
@@ -828,4 +860,4 @@ declare const FastEventDirectives: {
828
860
  clearRetain: symbol;
829
861
  };
830
862
 
831
- export { AbortError, CancelError, type ChangeFieldType, type DeepPartial, type Dict, type Expand, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, FastEventDirectives, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerMeta, type FastListenerNode, type FastListeners, type Merge, type ObjectKeys, type OptionalItems, type Overloads, type OverrideOptions, type PickScopeEvents, QueueOverflowError, type RequiredItems, type ScopeEvents, TimeoutError, UnboundError, type Unique, __FastEventScope__, __FastEvent__ };
863
+ export { AbortError, CancelError, type ChangeFieldType, type DeepPartial, type Dict, type Expand, type Fallback, FastEvent, type FastEventAnyListener, FastEventDirectives, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerMeta, type FastListenerNode, type FastListeners, type Merge, type ObjectKeys, type OptionalItems, type Overloads, type OverrideOptions, type PickScopeEvents, QueueOverflowError, type RequiredItems, type ScopeEvents, TimeoutError, type TypedFastEventMessage, type TypedFastEventMessageOptional, UnboundError, type Unique, __FastEventScope__, __FastEvent__ };