type DeepPartial = { [P in keyof T]?: T[P] extends object ? DeepPartial : T[P]; }; /** * 检查类型是否为多级通配符(包含 **) * @description 判断字符串类型是否包含多级通配符 "**" * @example * type Result1 = IsMultiWildcard<"user/**">; * // Result1 = true * type Result2 = IsMultiWildcard<"user/*">; * // Result2 = false * type Result3 = IsMultiWildcard<**">; * // Result3 = true */ type IsMultiWildcard = T extends `${string}/**` | "**" ? true : false; type Join = T extends [ infer First extends string, ...infer Rest extends string[] ] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join}` : ""; type Split = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split] : [S]; type ProcessSegment = S extends "*" ? `${string}` : S; type ProcessSegments = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment, ...ProcessSegments] : []; type ReplaceWildcard = T extends string ? IsMultiWildcard extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard}/${string}` : T : Join>> : T; /** * 事件消息相关 */ interface FastEventMeta { } interface FastEventMessageExtends { } type FastEventMessage = Record> = { type: T; payload: P; meta?: FastEventMeta & M & Record; } & FastEventMessageExtends; type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`; type TypedFastEventMessage = Record, M = any> = ({ [K in keyof Events as K extends WildcardStyle ? ReplaceWildcard : never]: { type: ReplaceWildcard; payload: Events[K]; meta?: Partial & Record; }; } & { [K in keyof Events as K extends WildcardStyle ? never : K]: { type: Exclude; payload: Events[K]; meta?: Partial & M & Record; }; })[Exclude] & FastEventMessageExtends; /** * 事件相关 */ declare enum FastEventListenerFlags { Transformed = 1 } type FastEventListenerArgs> = { retain?: boolean; meta?: DeepPartial & Record; abortSignal?: AbortSignal; /** * * allSettled: 使用Promise.allSettled()执行所有监听器 * race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略 * balance: 尽可能平均执行各个监听器 * sequence: 按照监听器添加顺序依次执行 */ executor?: FastListenerExecutor; /** * 当emit参数解析完成后的回调,用于修改emit参数 */ parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void; /** * 额外的标识 * * - 1: transformed 当消息是经过transform转换后的消息时的标识 * */ flags?: FastEventListenerFlags; /** * 如果消息经过转换前的原主题 */ rawEventType?: string; /** * 发布端前缀广播(当前仅 FastLiteEvent 实现运行时支持) * * 开启后,本次 emit 除命中自身路径外,同时唤醒 emit 终点节点 * 子树(不含终点自身)内所有已订阅监听器——含通配符订阅 * (`*` / `**`)与具体后代路径,每个后代收到改写为自身订阅 * 路径的事件消息。方向仅向下。 * * - `true`:默认改写,自动把后代监听器的 message.type 替换为 * 该后代完整路径,其余字段原样透传。 * - 函数:逐个后代调用(后代按 DFS 先序),返回 * `[message, args]` 覆盖原消息与参数;返回 `null`/falsy 跳过该后代。 * * 注:正常匹配(emit 路径直接命中)不经 broadcast 改写。 */ broadcast?: true | ((type: string, message: FastEventMessage, args: FastEventListenerArgs) => [FastEventMessage, FastEventListenerArgs] | FastEventMessage | null); }; type TypedFastEventListener = (this: C, message: TypedFastEventMessage, M>, args: FastEventListenerArgs) => any | Promise; /** * [ * 0: 监听器函数引用, * 1: 需要执行多少次, =0代表不限 * 2: 实际执行的次数(用于负载均衡时记录) * 3: 标签 用于调试一般可以标识监听器类型或任意信息 * 4: 标识, * 5: 监听器最后一次执行结果,仅仅在debug时启用,如果结果是对象则是一个WeakRef * ] */ type FastEventListenerMeta = [ TypedFastEventListener, number, number, string, number, any? ]; type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (this: FastEventListenerMeta, listener: FastEventListenerMeta, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise | any) => Promise | any[]; type FastListenerExecutorBuilder> = (options?: T) => FastListenerExecutor; /** * 执行第一个监听器的执行器函数 * * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组 * @param message - 要传递给监听器的消息对象 * @param args - 要传递给监听器的额外参数 * @param execute - 执行监听器的函数 * @returns 返回一个数组,包含第一个监听器的执行结果 */ declare const first: () => FastListenerExecutor; /** * 执行监听器列表中的最后一个监听器 * @param listeners - 监听器数组 * @param message - 事件消息 * @param args - 事件参数 * @param execute - 执行器函数 * @returns 返回包含最后一个监听器执行结果的数组 */ declare const last: () => FastListenerExecutor; /** * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果 * * @param listeners - 监听器元数据列表 * @param message - 要处理的消息 * @param args - 执行参数 * @param execute - 执行函数 * @returns 包含最快完成监听器结果的数组 * * @description * - 只有第一个完成的监听器结果会被返回 * - 其他未完成的监听器会被中止 * - 如果没有提供中止信号,会自动创建一个 * - 胜出的监听器计数会被恢复 */ declare const race: () => FastListenerExecutor; /** * 随机执行器 - 从监听器列表中随机选择一个监听器执行 * * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组 * @param message - 要处理的消息对象 * @param args - 传递给监听器的额外参数 * @param execute - 执行监听器的函数 * @returns 返回包含执行结果的数组 * * @remarks * - 随机选择一个监听器执行 * - 所有监听器的执行次数计数减1 * - 被选中执行的监听器执行次数加1 */ declare const random: () => FastListenerExecutor; /** * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用 * @param listeners 监听器列表 * @param message 消息对象 * @param args 参数列表 * @param execute 执行函数 * @returns 返回包含单个执行结果的数组 * * 执行策略: * 1. 遍历所有监听器,找出执行次数最少的监听器 * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1 * 3. 只执行选中的监听器,其他监听器不执行 */ declare const balance: () => FastListenerExecutor; type SeriesExecutorOptions = { reverse?: boolean; /** * 控制监听器如何返回结果 * * 提供一个reduce函数对所有监听器返回结果进行reduce操作 * series({ * onReturns: (result, cur)=>{ * if(!result) result = [] * return result.push(cur) * } * }) */ onReturns?: (results: any, cur: any) => any; onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean; onError?: "skip" | "abort" | "error" | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | "skip" | "abort" | "error"); }; declare const series: (options?: SeriesExecutorOptions) => FastListenerExecutor; type WaterfallExecutorOptions = Omit; /** * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器 * 如果出错就不再执行后续的监听器 * * @param options - 执行器配置选项 * @returns 返回一个 FastListener 执行器实例 * * @remarks * - 当任一监听器执行出错时,会中断后续监听器的执行 * - 每个监听器的执行结果会作为下一个监听器的 payload 参数 */ declare const waterfall: (options?: WaterfallExecutorOptions) => FastListenerExecutor; /** * */ declare const parallel: () => FastListenerExecutor; export { type FastListenerExecutor, type FastListenerExecutorBuilder, type SeriesExecutorOptions, type WaterfallExecutorOptions, balance, first, last, parallel, race, random, series, waterfall };