| import { LessThan, Subtract, UnionToTuple } from 'type-fest'; | ||
| type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S]; | ||
| type Join<T extends string[], Delimiter extends string = "/"> = T extends [ | ||
| infer First extends string, | ||
| ...infer Rest extends string[] | ||
| ] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : ""; | ||
| type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` | `**` ? true : T extends `${string}/**` ? true : false; | ||
| type IsAny<T> = 0 extends 1 & T ? true : false; | ||
| /** | ||
| * 移除空对象类型约束 | ||
| * @description 从类型中移除空的字面量类型约束,返回基础类型 | ||
| * @example | ||
| * type Result = RemoveEmptyObject<{} & string>; | ||
| * // Result = string | ||
| */ | ||
| type RemoveEmptyObject<T extends Record<string, any>> = T extends {} & (infer O) ? O : T; | ||
| /** | ||
| * 断言类型为记录类型 | ||
| * @description 如果类型 T 是 Record<string, any> 的子类型,返回 T;否则返回 Record<string, any> | ||
| * @example | ||
| * type Result1 = AssertRecord<{ a: 1 }>; | ||
| * // Result1 = { a: 1 } | ||
| * type Result2 = AssertRecord<string>; | ||
| * // Result2 = Record<string, any> | ||
| */ | ||
| type AssertRecord<T> = T extends Record<string, any> ? T : Record<string, any>; | ||
| /** | ||
| * 断言类型为字符串类型 | ||
| * @description 如果类型 T 是 string 的子类型,返回 T;否则返回 string | ||
| * @example | ||
| * type Result1 = AssertString<"hello">; | ||
| * // Result1 = "hello" | ||
| * type Result2 = AssertString<number>; | ||
| * // Result2 = string | ||
| */ | ||
| type AssertString<T> = T extends string ? T : string; | ||
| type KeyOf<T extends Record<string, any>> = Exclude<keyof T, number | symbol> extends never ? string : Exclude<keyof T, number | symbol>; | ||
| /** | ||
| * 展开类型,使交集类型合并为单一对象类型 | ||
| * @description 展开交叉类型和映射类型,使类型更容易阅读 | ||
| * @example | ||
| * type Result = Expand<{ a: 1 } & { b: 2 }>; | ||
| * // Result = { a: 1; b: 2 } | ||
| */ | ||
| type Expand<T> = T extends infer O ? { | ||
| [K in keyof O]: O[K]; | ||
| } : never; | ||
| /** | ||
| * 检查类型是否为多级通配符(包含 **) | ||
| * @description 判断字符串类型是否包含多级通配符 "**" | ||
| * @example | ||
| * type Result1 = IsMultiWildcard<"user/**">; | ||
| * // Result1 = true | ||
| * type Result2 = IsMultiWildcard<"user/*">; | ||
| * // Result2 = false | ||
| * type Result3 = IsMultiWildcard<**">; | ||
| * // Result3 = true | ||
| */ | ||
| type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false; | ||
| /** | ||
| * 在数字前面追加数字 | ||
| * @example PrefixNumber<123, 99> = 99123 | ||
| */ | ||
| type PrefixNumber<T extends number, P extends number> = `${P}${T}` extends `${infer R extends number}` ? R : never; | ||
| /** | ||
| * 将记录类型转换为键值对联合类型 | ||
| * @example ExpandRecord<{ a: 1; b: 2 }> = ["a", 1] | ["b", 2] | ||
| */ | ||
| type ExpandRecord<T extends Record<string, any>> = { | ||
| [K in keyof T]: [K, T[K]]; | ||
| }[keyof T]; | ||
| /** | ||
| * 检查类型是否为 never | ||
| * @description 判断类型是否为 TypeScript 的 never 类型 | ||
| * @example | ||
| * type Result1 = IsNever<never>; | ||
| * // Result1 = true | ||
| * type Result2 = IsNever<string>; | ||
| * // Result2 = false | ||
| */ | ||
| type IsNever<T> = [T] extends [never] ? true : false; | ||
| /** | ||
| * 如果类型为 never,返回默认值;否则返回原类型 | ||
| * @description 条件类型工具,当类型为 never 时提供默认值 | ||
| * @example | ||
| * type Result1 = IfNever<never, string>; | ||
| * // Result1 = string | ||
| * type Result2 = IfNever<number, string>; | ||
| * // Result2 = number | ||
| */ | ||
| type IfNever<T, Default> = IsNever<T> extends true ? Default : T; | ||
| /** | ||
| * 分割路径为数组(支持没有 / 的情况) | ||
| * | ||
| * 处理逻辑: | ||
| * - 如果有 /,按 / 分割成多段数组 | ||
| * - 如果没有 /,返回包含单个元素的数组 [原字符串] | ||
| * - 空字符串会返回 [""] | ||
| * | ||
| * @example | ||
| * - SplitPath<"a/b/c"> => ["a", "b", "c"] | ||
| * - SplitPath<"click"> => ["click"] | ||
| * - SplitPath<"*"> => ["*"] | ||
| * - SplitPath<""> => [""] | ||
| */ | ||
| type SplitPath<T extends string> = Split<T>; | ||
| type Min<T extends number[], M extends number = T[0]> = T extends [infer F, ...infer R] ? F extends number ? R extends number[] ? LessThan<F, M> extends true ? Min<R, F> : Min<R, M> : M : M : M; | ||
| type IndexOfMin<T extends number[], M = Min<T>, Idx extends any[] = []> = T extends [ | ||
| infer F, | ||
| ...infer R extends number[] | ||
| ] ? F extends M ? Idx["length"] : IndexOfMin<R, M, [...Idx, any]> : never; | ||
| type DeepPartial<T> = { | ||
| [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]; | ||
| }; | ||
| type ValueOf<R extends Record<string, any>> = R[keyof R]; | ||
| type OptionalKeys<T, K extends keyof T> = Expand<Omit<T, K> & { | ||
| [P in K]?: T[P]; | ||
| }>; | ||
| type StrictEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false; | ||
| type IsAnyRecord<T> = StrictEqual<T, Record<string, any>>; | ||
| type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S; | ||
| type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : []; | ||
| type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T; | ||
| /** | ||
| * 判断单个路径段是否为通配符 | ||
| * | ||
| * 示例: | ||
| * - IsWildcardSegment 星号 → true | ||
| * - IsWildcardSegment "rooms" → false | ||
| */ | ||
| type IsWildcardPart<S extends string> = S extends "*" | "**" ? true : false; | ||
| /** | ||
| * CountWildcardSegments 的辅助实现 | ||
| * 使用累加器模式计算通配符段数量 | ||
| * @param Arr - 路径段数组 | ||
| * @param Acc - 累加器(元组),长度即为当前计数 | ||
| */ | ||
| type CountWildcardSegmentsAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? IsWildcardPart<First> extends true ? CountWildcardSegmentsAcc<Rest, [...Acc, any]> : CountWildcardSegmentsAcc<Rest, Acc> : Acc["length"]; | ||
| /** | ||
| * 计算路径中通配符段的数量 | ||
| * | ||
| * 通配符段是指完全等于星号或双星号的段 | ||
| * | ||
| * @example | ||
| * | ||
| * GetWildcardCount<"*"> | ||
| * | ||
| * | ||
| */ | ||
| type GetWildcardCount<T extends string> = IsMultiWildcard<T> extends true ? 99 : CountWildcardSegmentsAcc<SplitPath<T>, []>; | ||
| /** | ||
| * 通配符优先级计算工具 | ||
| * | ||
| * 用于区分通配符模式的具体程度,解决 | ||
| * 核心规则:固定段多的优先级更高 | ||
| */ | ||
| type GetPartCountAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer _First extends string, ...infer Rest extends string[]] ? GetPartCountAcc<Rest, [...Acc, any]> : Acc["length"]; | ||
| /** | ||
| * 扩展通配符事件类型 | ||
| * @description 将包含通配符的事件键扩展为模板字面量类型 | ||
| * | ||
| * 优先级:非通配符键 > 单级通配符 > 多级通配符 | ||
| * 使用交叉类型实现,确保精确键优先匹配 | ||
| */ | ||
| type ExtendWildcardEvents<Events extends Record<string, any>> = AssertRecord<RemoveEmptyObject<{ | ||
| [K in keyof Events as K extends `${string}*${string}` | `*` ? never : K]: Events[K]; | ||
| } & { | ||
| [K in keyof Events as K extends `${string}*${string}` | `*` ? ReplaceWildcard<K & string> : never]: Events[K]; | ||
| }>>; | ||
| /** | ||
| * 计算输入的Key元组的优先级元组 | ||
| * | ||
| * 用于匹配时使用 | ||
| */ | ||
| type ToKeyPrioritys<T extends any[]> = { | ||
| [i in keyof T]: IsMultiWildcard<T[i]> extends true ? PrefixNumber<Subtract<10, GetPartCount<T[i]>>, 99> : GetWildcardCount<T[i]>; | ||
| }; | ||
| type ClosestMatch<T> = UnionToTuple<T>[IndexOfMin<ToKeyPrioritys<UnionToTuple<T>>>]; | ||
| type GetPartCount<T extends string> = GetPartCountAcc<SplitPath<T>, []>; | ||
| type MatchSegment<Input extends string, Pattern extends string> = Pattern extends "*" ? true : Pattern extends "**" ? true : Input extends Pattern ? true : false; | ||
| type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [ | ||
| infer InputHead extends string, | ||
| ...infer InputTail extends string[] | ||
| ] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? MatchPatternArray<InputArr, PatternTail> extends true ? true : InputArr extends [infer _First, ...infer Rest extends string[]] ? MatchPatternArray<Rest, PatternTail> extends true ? true : MatchPatternArray<Rest, PatternArr> extends true ? true : false : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? PatternTail extends [] ? false : MatchPatternArray<InputArr, PatternTail> : false : true; | ||
| /** | ||
| * 判断输入路径是否匹配通配符模式 | ||
| * @param Input 输入路径 | ||
| * @param Pattern 通配符模式(支持 `*` 单级匹配和 `**` 末尾多级匹配) | ||
| * @returns 匹配返回 true,否则返回 false | ||
| * | ||
| * @example true | ||
| * IsWildcardMatched<"api/v1/users", "users/**"> // false | ||
| */ | ||
| type IsWildcardMatched<Input extends string, Pattern extends string> = MatchPatternArray<Split<Input>, Split<Pattern>> extends true ? true : false; | ||
| /** | ||
| * | ||
| * 列出与T匹配的事件名称 | ||
| * | ||
| * {<通配符数量>:<事件名称>} | ||
| * | ||
| type Events = { | ||
| "users/* /login": { userId: number }; | ||
| "* /* /login": { userId: number }; | ||
| "users/* /profile": { username: string }; | ||
| }; | ||
| type S2 = GetClosestEventNames<Events, "users/123/login">; | ||
| { | ||
| 1: "users/* /login"; | ||
| 2: "* /* /login"; | ||
| } | ||
| */ | ||
| type GetMatchedEventNames<Events extends Record<string, any>, T extends string> = { | ||
| [Key in Exclude<keyof Events, number | symbol> as IsWildcardMatched<T, Key> extends true ? IsMultiWildcard<Key> extends true ? GetPartCount<Key> extends 9 ? 9 : GetPartCount<Key> extends 8 ? 8 : GetPartCount<Key> extends 7 ? 7 : GetPartCount<Key> extends 6 ? 6 : GetPartCount<Key> extends 5 ? 5 : GetPartCount<Key> extends 4 ? 4 : GetPartCount<Key> extends 3 ? 3 : GetPartCount<Key> extends 2 ? 2 : 1 : GetPartCount<Key> extends GetPartCount<T> ? GetWildcardCount<Key> extends 0 ? 0 : GetWildcardCount<Key> extends 1 ? 1 : GetWildcardCount<Key> extends 2 ? 2 : GetWildcardCount<Key> extends 3 ? 3 : GetWildcardCount<Key> extends 4 ? 4 : GetWildcardCount<Key> extends 5 ? 5 : GetWildcardCount<Key> extends 6 ? 6 : GetWildcardCount<Key> extends 7 ? 7 : GetWildcardCount<Key> extends 8 ? 8 : GetWildcardCount<Key> extends 9 ? 9 : never : never : T extends Key ? 0 : never]: Key; | ||
| }; | ||
| /** | ||
| * | ||
| * | ||
| * 返回匹配T的所有Key的元素 | ||
| * | ||
| * @example | ||
| * | ||
| * | ||
| */ | ||
| type GetClosestEventNameTuple<Events extends Record<string, any>, T extends string> = (GetMatchedEventNames<Events, T> extends { | ||
| 0: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 1: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 2: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 3: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 4: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 5: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 6: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 7: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 8: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 9: infer V; | ||
| } ? V extends never ? never : V : never); | ||
| /** | ||
| * 返回最接近的Key | ||
| */ | ||
| type GetClosestEventName<Events extends Record<string, any>, T extends string> = GetMatchedEventNames<Events, T> extends never ? never : ClosestMatch<GetClosestEventNameTuple<Events, T>>; | ||
| /** | ||
| type Events = { | ||
| "users/* /login": { userId: number }; | ||
| "* /* /login": { userId: number }; | ||
| "users/* /profile": { username: string }; | ||
| }; | ||
| type Result1 = GetClosestEvents<Events, "users/123/login">; | ||
| { | ||
| "users/* /login": { | ||
| userId: number; | ||
| }; | ||
| } | ||
| */ | ||
| type GetClosestEvents<Events extends Record<string, any>, T extends string, D = Record<string, any>> = GetClosestEventName<Events, T> extends never ? D : Record<AssertString<GetClosestEventName<Events, T>>, Events[AssertString<GetClosestEventName<Events, T>>]>; | ||
| /** | ||
| * 返回最匹配的事件元组 | ||
| * | ||
| * [事件名称,事件负载] | ||
| * | ||
| * type Events = { | ||
| * "users/* /login": string; | ||
| "users/* /logout": number; | ||
| "users/* /*": { name: string }; | ||
| }; | ||
| type Result =GetClosestEventTuple<Events,"users/fisher/login"> | ||
| type Result = ["users/* /login", string] | ||
| * | ||
| */ | ||
| type GetClosestEventTuple<Events extends Record<string, any>, T extends string> = ExpandRecord<GetClosestEvents<Events, T>>; | ||
| /** | ||
| * | ||
| * - 当K不包括通配符时,直接返回K | ||
| * - 当包括通配符时,返回K | Omit<ReplaceWildcard<K>, K> | ||
| * 这样操作的目的是为了能让IDE提供"users/* /login"并且能适配通配符 | ||
| * 如果不这样操作,IDE不会提示 | ||
| * | ||
| * | ||
| * | ||
| */ | ||
| type EnsureEventType<K extends string> = ContainsWildcard<K> extends true ? K | ReplaceWildcard<K> : K; | ||
| type MutableMessage<Events extends Record<string, any>, Meta extends Record<string, any> = Record<string, any>> = IsAnyRecord<Events> extends true ? OptionalKeys<FastEventMessage<string, any, Meta>, "meta"> & FastEventMessageExtends : { | ||
| [K in KeyOf<Events>]: Events[K] extends FastMessagePayload ? IfNever<Events[K]["type"], any> : { | ||
| type: ReplaceWildcard<K extends "*" ? string : EnsureEventType<K>>; | ||
| payload: IfNever<Events[K], any>; | ||
| meta?: Meta; | ||
| } & FastEventMessageExtends; | ||
| }[KeyOf<Events>]; | ||
| /** | ||
| * 返回最匹配的事件元组 | ||
| * | ||
| * [事件名称,事件负载] | ||
| * | ||
| * type Events = { | ||
| * "users/* /login": string; | ||
| "users/* /logout": number; | ||
| "users/* /*": { name: string }; | ||
| }; | ||
| type Result =GetClosestEventTuple<Events,"users/fisher/login"> | ||
| type Result = ["users/* /login", string] | ||
| * | ||
| */ | ||
| type GetClosestMessage<Events extends Record<string, any>, T extends string, Meta extends Record<string, any> = never> = FastEventMessage<ContainsWildcard<T> extends true ? ReplaceWildcard<Exclude<ExpandRecord<GetClosestEvents<Events, T>>[0], number | symbol>> : T, ExpandRecord<GetClosestEvents<Events, T>>[1], Meta>; | ||
| /** | ||
| * 事件消息相关 | ||
| */ | ||
| interface FastEventMeta { | ||
| } | ||
| interface FastEventMessageExtends { | ||
| } | ||
| type FastEventMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = { | ||
| type: T; | ||
| payload: P; | ||
| meta?: FastEventMeta & M & Record<string, any>; | ||
| } & FastEventMessageExtends; | ||
| /** | ||
| * 用于emit方法,允许meta可选,更加宽泛 | ||
| */ | ||
| type FastEventEmitMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = OptionalKeys<FastEventMessage<T, P, M>, "meta">; | ||
| type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`; | ||
| type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({ | ||
| [K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: { | ||
| type: ReplaceWildcard<K>; | ||
| payload: Events[K]; | ||
| meta?: Partial<FastEventMeta & M> & Record<string, any>; | ||
| }; | ||
| } & { | ||
| [K in keyof Events as K extends WildcardStyle ? never : K]: { | ||
| type: Exclude<K, number | symbol>; | ||
| payload: Events[K]; | ||
| meta?: Partial<FastEventMeta> & M & Record<string, any>; | ||
| }; | ||
| })[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends; | ||
| type FastMessagePayload<P = any> = { | ||
| type: P; | ||
| __IS_FAST_MESSAGE__: true; | ||
| }; | ||
| /** | ||
| * FastEvent 订阅者类型 | ||
| * | ||
| * @description | ||
| * 当使用 { iterable: true } 选项时,返回的订阅者对象支持异步迭代, | ||
| * 可以使用 for await...of 语法消费事件消息。 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // 普通订阅者(不启用 iterable) | ||
| * const subscriber1 = emitter.on('event', listener); | ||
| * subscriber1.off(); | ||
| * | ||
| * // 可迭代订阅者(启用 iterable) | ||
| * const subscriber2 = emitter.on('event', null, { iterable: true }); | ||
| * for await (const message of subscriber2) { | ||
| * console.log(message); | ||
| * } | ||
| * ``` | ||
| */ | ||
| type FastEventSubscriber = { | ||
| /** | ||
| * 取消订阅 | ||
| */ | ||
| off: () => void; | ||
| /** | ||
| * 同步资源释放(支持 using 语句) | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * { | ||
| * using subscriber = emitter.on('event', listener); | ||
| * // subscriber 在作用域结束时自动释放 | ||
| * } | ||
| * ``` | ||
| */ | ||
| [Symbol.dispose]: () => void; | ||
| /** | ||
| * 为什么要有一个listener引用? 主要用于移除监听器时使用 | ||
| * | ||
| * - 正常情况下 | ||
| * const subscriber = emitter.on('event', listener) | ||
| * | ||
| * subscriber.off() | ||
| * emitter.off('event', listener) | ||
| * emitter.off(listener) | ||
| * | ||
| * - 在使用scope时 | ||
| * const scope = emitter.scope("xxx") | ||
| * const subscriber = scope.on('event', listener) | ||
| * | ||
| * subscriber.off() 可以正常生效 | ||
| * scope.off('event', listener) // 无法生效 | ||
| * scope.off(listener) // 无法生效 | ||
| * 因为在scope中,为了让监听器可以处理scope的逻辑,对listener进行了包装, | ||
| * 因此在事件注册表中登记的不是listener,而是经过包装的监听器 | ||
| * subscriber.off() 可以正常生效 | ||
| * 如果要使用scope.off或emitter.off | ||
| * 需要使用subscriber.listener, subscriber.listener记录了原始的监听器引用 | ||
| * subscriber.listener===listener | ||
| * | ||
| * scope.off('event', subscriber.listener) // 生效 | ||
| * scope.off(subscriber.listener) // 生效 | ||
| * | ||
| */ | ||
| readonly listener: TypedFastEventListener<any, any, any>; | ||
| } & { | ||
| /** | ||
| * 将消息加入队列(内部方法,仅当启用 iterable 时可用) | ||
| * @internal | ||
| */ | ||
| _enqueue?: (message: TypedFastEventMessage) => void; | ||
| /** | ||
| * 关闭订阅者(内部方法,仅当启用 iterable 时可用) | ||
| * @internal | ||
| */ | ||
| _close?: () => void; | ||
| }; | ||
| type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (this: FastEventListenerMeta, listener: FastEventListenerMeta, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[]; | ||
| type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener; | ||
| type GetClosestEventPayload<Events extends Record<string, any>, T extends string> = GetClosestEventTuple<Events, T>[1]; | ||
| type IsTransformedEvent<Events extends Record<string, any>, T extends string> = T extends keyof Events ? IsAny<Events[T]> extends true ? never : Events[T] extends FastMessagePayload<any> ? T : never : IsAny<GetClosestEventPayload<Events, T>> extends true ? never : GetClosestEventPayload<Events, T> extends FastMessagePayload<any> ? T : never; | ||
| type PickPayload<M> = [M] extends [FastMessagePayload] ? M["type"] : M; | ||
| type InMatchedEvent<Events extends Record<string, any>, T> = T extends KeyOf<Events> | ReplaceWildcard<KeyOf<Events>> ? true : false; | ||
| /** | ||
| * 获取指定事件名称的负载类型 | ||
| */ | ||
| type GetPayload<Events extends Record<string, any>, T> = T extends string ? GetClosestEventTuple<Events, T>[1] : any; | ||
| /** | ||
| * FastEventIterator - 使用异步迭代器从 FastEvent 或 FastEventScope 订阅事件 | ||
| * 重构:使用 queue.ts 中的队列参数和逻辑 | ||
| */ | ||
| type FastQueueOverflows = "drop" | "expand" | "slide" | "throw"; | ||
| interface FastEventIteratorOptions<T = FastEventMessage> { | ||
| /** 缓冲区默认大小(默认:100) */ | ||
| size?: number; | ||
| /** 缓冲区扩展到多大时不再扩展(默认:1000) */ | ||
| maxExpandSize?: number; | ||
| /** 当扩展到最大大小后的溢出策略(默认:'slide') */ | ||
| expandOverflow?: Omit<FastQueueOverflows, "expand">; | ||
| /** 溢出策略(默认:'slide') */ | ||
| overflow?: FastQueueOverflows; | ||
| /** 消息生命周期(毫秒),0表示不启用(默认:0) */ | ||
| lifetime?: number; | ||
| /** 当新消息到达时触发此回调 */ | ||
| onPush?: (newMessage: T, messages: [T, number][]) => void; | ||
| /** 当消息被弹出时触发此回调,可以在此对消息队列进行排序等操作 */ | ||
| onPop?: (messages: [T, number][], hasNew: boolean) => [T, number] | undefined; | ||
| /** 当消息被丢弃时触发此回调 */ | ||
| onDrop?: (message: T) => void; | ||
| /** 错误处理函数,返回true表示继续迭代,false表示停止迭代 */ | ||
| onError?: (error: Error) => boolean | Promise<boolean>; | ||
| /** 信号,用于取消迭代 */ | ||
| signal?: AbortSignal; | ||
| } | ||
| /** | ||
| * 事件相关 | ||
| */ | ||
| type FastEventOptions<Meta = Record<string, any>, Context = never> = { | ||
| id: string; | ||
| title: string; | ||
| debug: boolean; | ||
| delimiter: string; | ||
| context: Context; | ||
| ignoreErrors: boolean; | ||
| meta: Meta; | ||
| onAddBeforeListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void; | ||
| onAddAfterListener?: (type: string, node: FastEventListenerNode) => void; | ||
| onRemoveListener?: (type: string, listener: TypedFastEventListener, node: FastEventListenerNode) => void; | ||
| onClearListeners?: () => void; | ||
| onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void; | ||
| onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[]; | ||
| onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastEventListenerNode[]) => void; | ||
| /** | ||
| * 全局执行器 | ||
| */ | ||
| executor?: FastListenerExecutor; | ||
| /** | ||
| * 是否展开emit返回值,默认为false,用于将事件转发给其他FastEvent时使用 | ||
| */ | ||
| expandEmitResults?: boolean; | ||
| /** | ||
| * 对接收到的消息进行转换,用于将消息转换成其他格式 | ||
| * | ||
| * new FastEvent({ | ||
| * transform:(message)=>{ | ||
| * message.payload | ||
| * } | ||
| * }) | ||
| */ | ||
| transform?: (message: FastEventMessage) => any; | ||
| }; | ||
| interface FastEvents { | ||
| } | ||
| type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = { | ||
| count?: number; | ||
| prepend?: boolean; | ||
| flags?: number; | ||
| filter?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean; | ||
| off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean; | ||
| pipes?: FastListenerPipe[]; | ||
| /** | ||
| * 为监听器添加一个tag,在监听器注册表中记录,用于调试使用 | ||
| * emitter.on(type,listener,{tag:"x"}) | ||
| * emitter.getListeners(tag) | ||
| */ | ||
| tag?: string; | ||
| /** | ||
| * 异步迭代器选项 | ||
| * | ||
| * 用于配置返回异步迭代器的参数 | ||
| * | ||
| * 默认值是 | ||
| { | ||
| overflow: "expand", | ||
| size: 10, | ||
| maxExpandSize: 100, | ||
| } | ||
| */ | ||
| iterable?: FastEventIteratorOptions; | ||
| }; | ||
| declare enum FastEventListenerFlags { | ||
| Transformed = 1 | ||
| } | ||
| type FastEventListenerArgs<M = Record<string, any>> = { | ||
| retain?: boolean; | ||
| meta?: DeepPartial<M> & Record<string, any>; | ||
| 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; | ||
| }; | ||
| /** | ||
| * 将对象中值是FastMessagePayload的类型提取出来 | ||
| */ | ||
| type UnTransformedEvents<Events extends Record<string, any>> = { | ||
| [K in keyof Events]: Events[K] extends FastMessagePayload<infer P> ? P : Events[K]; | ||
| }; | ||
| type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>; | ||
| type FastEventCommonListener<Message = FastEventMessage, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: Message, args: FastEventListenerArgs<Meta>) => any | Promise<any>; | ||
| /** | ||
| * [ | ||
| * 0: 监听器函数引用, | ||
| * 1: 需要执行多少次, =0代表不限 | ||
| * 2: 实际执行的次数(用于负载均衡时记录) | ||
| * 3: 标签 用于调试一般可以标识监听器类型或任意信息 | ||
| * 4: 标识, | ||
| * 5: 监听器最后一次执行结果,仅仅在debug时启用,如果结果是对象则是一个WeakRef | ||
| * ] | ||
| */ | ||
| type FastEventListenerMeta = [ | ||
| TypedFastEventListener<any, any>, | ||
| number, | ||
| number, | ||
| string, | ||
| number, | ||
| any? | ||
| ]; | ||
| type FastEventListenerNode = { | ||
| __listeners: FastEventListenerMeta[]; | ||
| } & { | ||
| [key: string]: FastEventListenerNode; | ||
| }; | ||
| type FastListeners = FastEventListenerNode; | ||
| /** | ||
| * FastLiteEvent 轻量级事件发射器 | ||
| * | ||
| * 从 FastEvent 派生的精简版本,移除了以下高级特性: | ||
| * scope / hook / meta / pipe / executor / 异步迭代 / context | ||
| * debug / abortSignal / 订阅时的 filter+off / 监听优先级 prepend | ||
| * | ||
| * 仅保留核心的事件收发能力:on / once / onAny / off / offAll / clear / | ||
| * emit / emitAsync / waitFor / getListeners / clearRetainMessages,以及通配符 | ||
| * (* / **)、retain 保留事件、count / tag / flags、ignoreErrors、transform | ||
| * 消息转换、expandEmitResults 等基础特性。 | ||
| * | ||
| * 类型与 FastEvent 同源派生(Omit / 复用),监听器、消息、订阅者与 FastEvent | ||
| * 双向兼容——同一监听器函数可同时挂到 FastEvent 与 FastLiteEvent 上。 | ||
| */ | ||
| type FastLiteMessage<T extends string = string, P = any> = Omit<FastEventMessage<T, P>, "meta">; | ||
| type FastLiteListenerArgs = Omit<FastEventListenerArgs, "meta" | "executor" | "parseArgs" | "abortSignal">; | ||
| type FastLiteListenOptions<Events extends Record<string, any> = Record<string, any>> = Omit<FastEventListenOptions<Events>, "pipes" | "iterable" | "filter" | "off" | "prepend">; | ||
| type FastLiteEventOptions = Omit<FastEventOptions, "context" | "meta" | "executor" | "debug" | "onAddBeforeListener" | "onAddAfterListener" | "onRemoveListener" | "onClearListeners" | "onListenerError" | "onBeforeExecuteListener" | "onAfterExecuteListener">; | ||
| type FastLiteSubscriber = FastEventSubscriber; | ||
| type FastLiteListener<T extends string = string, P = any> = FastEventCommonListener<FastLiteMessage<T, P>, any, any>; | ||
| /** | ||
| * FastLiteEvent 轻量级事件发射器类 | ||
| * | ||
| * @template Events - 事件类型定义,继承自 FastEvents 接口 | ||
| */ | ||
| declare class FastLiteEvent<Events extends Record<string, any> = Record<string, any>, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = KeyOf<AllEvents>, EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>> { | ||
| __FastLiteEvent__: boolean; | ||
| /** 事件监听器树结构,存储所有注册的事件监听器 */ | ||
| listeners: FastListeners; | ||
| /** 事件发射器的配置选项 */ | ||
| private _options; | ||
| /** 事件名称的分隔符,默认为 '/' */ | ||
| private _delimiter; | ||
| /** 保留的事件消息映射,Key 是事件名称,Value 是保留的事件消息 */ | ||
| retainedMessages: Map<string, any>; | ||
| /** 当前注册的监听器总数 */ | ||
| listenerCount: number; | ||
| /** | ||
| * 创建 FastLiteEvent 实例 | ||
| * @param options - 事件发射器的配置选项 | ||
| * | ||
| * 默认配置: | ||
| * - id: 随机字符串 - 实例唯一标识符 | ||
| * - delimiter: '/' - 事件名称分隔符 | ||
| * - ignoreErrors: true - 是否忽略监听器执行错误 | ||
| * - expandEmitResults: true - 是否展开 emit 返回值 | ||
| */ | ||
| constructor(options?: Partial<FastLiteEventOptions>); | ||
| /** 获取事件发射器的配置选项 */ | ||
| get options(): FastLiteEventOptions; | ||
| /** 获取事件发射器的唯一标识符 */ | ||
| get id(): string; | ||
| /** 获取事件发射器的标题 */ | ||
| get title(): string; | ||
| /** | ||
| * 初始化选项(供子类重载) | ||
| * @param initial - 可选的初始选项 | ||
| */ | ||
| _initOptions(initial?: Partial<FastLiteEventOptions>): Partial<FastLiteEventOptions> | undefined; | ||
| /** | ||
| * 添加事件监听器到事件树(仅尾插,已移除 prepend 插队) | ||
| * @param parts - 事件路径数组 | ||
| * @param listener - 事件监听器函数 | ||
| * @param options - 监听器配置(count / tag / flags) | ||
| * @returns [节点, 监听器索引] | ||
| */ | ||
| private _addListener; | ||
| /** | ||
| * 根据 parts 路径遍历监听器树,并在最后的节点上执行回调 | ||
| */ | ||
| private _forEachNodes; | ||
| /** | ||
| * 从监听器节点中移除指定的事件监听器 | ||
| */ | ||
| private _removeListener; | ||
| /** | ||
| * 注册事件监听器 | ||
| * @param type - 事件类型,支持普通字符串、通配符(user/*)、全局监听(**) | ||
| * @param listener - 事件监听器函数 | ||
| * @param options - 监听器配置(count / tag / flags) | ||
| * @returns 订阅者对象,包含 off 方法用于取消监听 | ||
| */ | ||
| on<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 注册一次性事件监听器(触发一次后自动注销) | ||
| */ | ||
| once<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 注册一个监听所有事件的监听器(等同 on('**', listener)) | ||
| */ | ||
| onAny(listener: FastEventCommonListener<MutableMessage<AllEvents, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 移除事件监听器 | ||
| */ | ||
| off(listener: Function): void; | ||
| off(type: string, listener: Function): void; | ||
| off(type: Types): void; | ||
| off(type: string): void; | ||
| /** | ||
| * 移除所有事件监听器 | ||
| * @param entry - 可选的事件前缀,提供则只移除该前缀下的监听器 | ||
| */ | ||
| offAll(entry?: string): void; | ||
| /** | ||
| * 移除保留的事件 | ||
| */ | ||
| private _removeRetainedEvents; | ||
| /** | ||
| * 清除所有事件或指定前缀的事件(含保留消息) | ||
| */ | ||
| clear(prefix?: string): void; | ||
| /** | ||
| * 发送最后一次事件的消息给对应的监听器(用于 retain) | ||
| */ | ||
| private _emitRetainMessage; | ||
| /** | ||
| * 遍历监听器节点树,支持三种匹配模式:精确 / 单层通配 * / 多层通配 ** | ||
| */ | ||
| private _traverseToPath; | ||
| private _traverseListeners; | ||
| /** | ||
| * 监听器执行出错处理(移除了 ListenerError hook) | ||
| */ | ||
| private _onListenerError; | ||
| /** | ||
| * 执行单个监听器函数(移除了 debug / abortSignal 分支,this 指向实例) | ||
| */ | ||
| private _executeListener; | ||
| /** | ||
| * 执行监听器节点列表中的所有监听器(移除了 executor,退化为同步顺序执行) | ||
| */ | ||
| private _executeListeners; | ||
| /** | ||
| * 减少侦听器的执行次数(达到 count 限制时移除) | ||
| */ | ||
| _decListenerExecCount(listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][]): void; | ||
| /** | ||
| * 获取指定类型的所有事件监听器 | ||
| */ | ||
| getListeners(type: string): FastEventListenerMeta[]; | ||
| /** | ||
| * 清除所有事件或指定事件的保留消息 | ||
| */ | ||
| clearRetainMessages(type?: EventNames | string): void; | ||
| /** | ||
| * 同步触发事件 | ||
| * | ||
| * 支持两种调用方式: | ||
| * emit(type, payload, retain?) | ||
| * emit({ type, payload }, retain?) | ||
| */ | ||
| emit<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): R[]; | ||
| emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): R[]; | ||
| emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>, retain?: boolean): R[]; | ||
| emit<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): R[]; | ||
| emit<R = any>(message: { | ||
| type: keyof AllEvents; | ||
| }, retain?: boolean): R[]; | ||
| emit<R = any>(message: FastEventMessage, retain?: boolean): R[]; | ||
| /** | ||
| * 异步触发事件(使用 Promise.allSettled,等待所有异步监听器完成) | ||
| */ | ||
| emitAsync<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any>(message: { | ||
| type: keyof AllEvents; | ||
| }, retain?: boolean): Promise<(R | Error)[]>; | ||
| } | ||
| export { FastLiteEvent, type FastLiteEventOptions, type FastLiteListenOptions, type FastLiteListener, type FastLiteListenerArgs, type FastLiteMessage, type FastLiteSubscriber }; |
| import { LessThan, Subtract, UnionToTuple } from 'type-fest'; | ||
| type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S]; | ||
| type Join<T extends string[], Delimiter extends string = "/"> = T extends [ | ||
| infer First extends string, | ||
| ...infer Rest extends string[] | ||
| ] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : ""; | ||
| type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` | `**` ? true : T extends `${string}/**` ? true : false; | ||
| type IsAny<T> = 0 extends 1 & T ? true : false; | ||
| /** | ||
| * 移除空对象类型约束 | ||
| * @description 从类型中移除空的字面量类型约束,返回基础类型 | ||
| * @example | ||
| * type Result = RemoveEmptyObject<{} & string>; | ||
| * // Result = string | ||
| */ | ||
| type RemoveEmptyObject<T extends Record<string, any>> = T extends {} & (infer O) ? O : T; | ||
| /** | ||
| * 断言类型为记录类型 | ||
| * @description 如果类型 T 是 Record<string, any> 的子类型,返回 T;否则返回 Record<string, any> | ||
| * @example | ||
| * type Result1 = AssertRecord<{ a: 1 }>; | ||
| * // Result1 = { a: 1 } | ||
| * type Result2 = AssertRecord<string>; | ||
| * // Result2 = Record<string, any> | ||
| */ | ||
| type AssertRecord<T> = T extends Record<string, any> ? T : Record<string, any>; | ||
| /** | ||
| * 断言类型为字符串类型 | ||
| * @description 如果类型 T 是 string 的子类型,返回 T;否则返回 string | ||
| * @example | ||
| * type Result1 = AssertString<"hello">; | ||
| * // Result1 = "hello" | ||
| * type Result2 = AssertString<number>; | ||
| * // Result2 = string | ||
| */ | ||
| type AssertString<T> = T extends string ? T : string; | ||
| type KeyOf<T extends Record<string, any>> = Exclude<keyof T, number | symbol> extends never ? string : Exclude<keyof T, number | symbol>; | ||
| /** | ||
| * 展开类型,使交集类型合并为单一对象类型 | ||
| * @description 展开交叉类型和映射类型,使类型更容易阅读 | ||
| * @example | ||
| * type Result = Expand<{ a: 1 } & { b: 2 }>; | ||
| * // Result = { a: 1; b: 2 } | ||
| */ | ||
| type Expand<T> = T extends infer O ? { | ||
| [K in keyof O]: O[K]; | ||
| } : never; | ||
| /** | ||
| * 检查类型是否为多级通配符(包含 **) | ||
| * @description 判断字符串类型是否包含多级通配符 "**" | ||
| * @example | ||
| * type Result1 = IsMultiWildcard<"user/**">; | ||
| * // Result1 = true | ||
| * type Result2 = IsMultiWildcard<"user/*">; | ||
| * // Result2 = false | ||
| * type Result3 = IsMultiWildcard<**">; | ||
| * // Result3 = true | ||
| */ | ||
| type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false; | ||
| /** | ||
| * 在数字前面追加数字 | ||
| * @example PrefixNumber<123, 99> = 99123 | ||
| */ | ||
| type PrefixNumber<T extends number, P extends number> = `${P}${T}` extends `${infer R extends number}` ? R : never; | ||
| /** | ||
| * 将记录类型转换为键值对联合类型 | ||
| * @example ExpandRecord<{ a: 1; b: 2 }> = ["a", 1] | ["b", 2] | ||
| */ | ||
| type ExpandRecord<T extends Record<string, any>> = { | ||
| [K in keyof T]: [K, T[K]]; | ||
| }[keyof T]; | ||
| /** | ||
| * 检查类型是否为 never | ||
| * @description 判断类型是否为 TypeScript 的 never 类型 | ||
| * @example | ||
| * type Result1 = IsNever<never>; | ||
| * // Result1 = true | ||
| * type Result2 = IsNever<string>; | ||
| * // Result2 = false | ||
| */ | ||
| type IsNever<T> = [T] extends [never] ? true : false; | ||
| /** | ||
| * 如果类型为 never,返回默认值;否则返回原类型 | ||
| * @description 条件类型工具,当类型为 never 时提供默认值 | ||
| * @example | ||
| * type Result1 = IfNever<never, string>; | ||
| * // Result1 = string | ||
| * type Result2 = IfNever<number, string>; | ||
| * // Result2 = number | ||
| */ | ||
| type IfNever<T, Default> = IsNever<T> extends true ? Default : T; | ||
| /** | ||
| * 分割路径为数组(支持没有 / 的情况) | ||
| * | ||
| * 处理逻辑: | ||
| * - 如果有 /,按 / 分割成多段数组 | ||
| * - 如果没有 /,返回包含单个元素的数组 [原字符串] | ||
| * - 空字符串会返回 [""] | ||
| * | ||
| * @example | ||
| * - SplitPath<"a/b/c"> => ["a", "b", "c"] | ||
| * - SplitPath<"click"> => ["click"] | ||
| * - SplitPath<"*"> => ["*"] | ||
| * - SplitPath<""> => [""] | ||
| */ | ||
| type SplitPath<T extends string> = Split<T>; | ||
| type Min<T extends number[], M extends number = T[0]> = T extends [infer F, ...infer R] ? F extends number ? R extends number[] ? LessThan<F, M> extends true ? Min<R, F> : Min<R, M> : M : M : M; | ||
| type IndexOfMin<T extends number[], M = Min<T>, Idx extends any[] = []> = T extends [ | ||
| infer F, | ||
| ...infer R extends number[] | ||
| ] ? F extends M ? Idx["length"] : IndexOfMin<R, M, [...Idx, any]> : never; | ||
| type DeepPartial<T> = { | ||
| [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]; | ||
| }; | ||
| type ValueOf<R extends Record<string, any>> = R[keyof R]; | ||
| type OptionalKeys<T, K extends keyof T> = Expand<Omit<T, K> & { | ||
| [P in K]?: T[P]; | ||
| }>; | ||
| type StrictEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false; | ||
| type IsAnyRecord<T> = StrictEqual<T, Record<string, any>>; | ||
| type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S; | ||
| type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : []; | ||
| type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T; | ||
| /** | ||
| * 判断单个路径段是否为通配符 | ||
| * | ||
| * 示例: | ||
| * - IsWildcardSegment 星号 → true | ||
| * - IsWildcardSegment "rooms" → false | ||
| */ | ||
| type IsWildcardPart<S extends string> = S extends "*" | "**" ? true : false; | ||
| /** | ||
| * CountWildcardSegments 的辅助实现 | ||
| * 使用累加器模式计算通配符段数量 | ||
| * @param Arr - 路径段数组 | ||
| * @param Acc - 累加器(元组),长度即为当前计数 | ||
| */ | ||
| type CountWildcardSegmentsAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? IsWildcardPart<First> extends true ? CountWildcardSegmentsAcc<Rest, [...Acc, any]> : CountWildcardSegmentsAcc<Rest, Acc> : Acc["length"]; | ||
| /** | ||
| * 计算路径中通配符段的数量 | ||
| * | ||
| * 通配符段是指完全等于星号或双星号的段 | ||
| * | ||
| * @example | ||
| * | ||
| * GetWildcardCount<"*"> | ||
| * | ||
| * | ||
| */ | ||
| type GetWildcardCount<T extends string> = IsMultiWildcard<T> extends true ? 99 : CountWildcardSegmentsAcc<SplitPath<T>, []>; | ||
| /** | ||
| * 通配符优先级计算工具 | ||
| * | ||
| * 用于区分通配符模式的具体程度,解决 | ||
| * 核心规则:固定段多的优先级更高 | ||
| */ | ||
| type GetPartCountAcc<Arr extends string[], Acc extends any[]> = Arr extends [] ? Acc["length"] : Arr extends [infer _First extends string, ...infer Rest extends string[]] ? GetPartCountAcc<Rest, [...Acc, any]> : Acc["length"]; | ||
| /** | ||
| * 扩展通配符事件类型 | ||
| * @description 将包含通配符的事件键扩展为模板字面量类型 | ||
| * | ||
| * 优先级:非通配符键 > 单级通配符 > 多级通配符 | ||
| * 使用交叉类型实现,确保精确键优先匹配 | ||
| */ | ||
| type ExtendWildcardEvents<Events extends Record<string, any>> = AssertRecord<RemoveEmptyObject<{ | ||
| [K in keyof Events as K extends `${string}*${string}` | `*` ? never : K]: Events[K]; | ||
| } & { | ||
| [K in keyof Events as K extends `${string}*${string}` | `*` ? ReplaceWildcard<K & string> : never]: Events[K]; | ||
| }>>; | ||
| /** | ||
| * 计算输入的Key元组的优先级元组 | ||
| * | ||
| * 用于匹配时使用 | ||
| */ | ||
| type ToKeyPrioritys<T extends any[]> = { | ||
| [i in keyof T]: IsMultiWildcard<T[i]> extends true ? PrefixNumber<Subtract<10, GetPartCount<T[i]>>, 99> : GetWildcardCount<T[i]>; | ||
| }; | ||
| type ClosestMatch<T> = UnionToTuple<T>[IndexOfMin<ToKeyPrioritys<UnionToTuple<T>>>]; | ||
| type GetPartCount<T extends string> = GetPartCountAcc<SplitPath<T>, []>; | ||
| type MatchSegment<Input extends string, Pattern extends string> = Pattern extends "*" ? true : Pattern extends "**" ? true : Input extends Pattern ? true : false; | ||
| type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [ | ||
| infer InputHead extends string, | ||
| ...infer InputTail extends string[] | ||
| ] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? MatchPatternArray<InputArr, PatternTail> extends true ? true : InputArr extends [infer _First, ...infer Rest extends string[]] ? MatchPatternArray<Rest, PatternTail> extends true ? true : MatchPatternArray<Rest, PatternArr> extends true ? true : false : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends "**" ? PatternTail extends [] ? false : MatchPatternArray<InputArr, PatternTail> : false : true; | ||
| /** | ||
| * 判断输入路径是否匹配通配符模式 | ||
| * @param Input 输入路径 | ||
| * @param Pattern 通配符模式(支持 `*` 单级匹配和 `**` 末尾多级匹配) | ||
| * @returns 匹配返回 true,否则返回 false | ||
| * | ||
| * @example true | ||
| * IsWildcardMatched<"api/v1/users", "users/**"> // false | ||
| */ | ||
| type IsWildcardMatched<Input extends string, Pattern extends string> = MatchPatternArray<Split<Input>, Split<Pattern>> extends true ? true : false; | ||
| /** | ||
| * | ||
| * 列出与T匹配的事件名称 | ||
| * | ||
| * {<通配符数量>:<事件名称>} | ||
| * | ||
| type Events = { | ||
| "users/* /login": { userId: number }; | ||
| "* /* /login": { userId: number }; | ||
| "users/* /profile": { username: string }; | ||
| }; | ||
| type S2 = GetClosestEventNames<Events, "users/123/login">; | ||
| { | ||
| 1: "users/* /login"; | ||
| 2: "* /* /login"; | ||
| } | ||
| */ | ||
| type GetMatchedEventNames<Events extends Record<string, any>, T extends string> = { | ||
| [Key in Exclude<keyof Events, number | symbol> as IsWildcardMatched<T, Key> extends true ? IsMultiWildcard<Key> extends true ? GetPartCount<Key> extends 9 ? 9 : GetPartCount<Key> extends 8 ? 8 : GetPartCount<Key> extends 7 ? 7 : GetPartCount<Key> extends 6 ? 6 : GetPartCount<Key> extends 5 ? 5 : GetPartCount<Key> extends 4 ? 4 : GetPartCount<Key> extends 3 ? 3 : GetPartCount<Key> extends 2 ? 2 : 1 : GetPartCount<Key> extends GetPartCount<T> ? GetWildcardCount<Key> extends 0 ? 0 : GetWildcardCount<Key> extends 1 ? 1 : GetWildcardCount<Key> extends 2 ? 2 : GetWildcardCount<Key> extends 3 ? 3 : GetWildcardCount<Key> extends 4 ? 4 : GetWildcardCount<Key> extends 5 ? 5 : GetWildcardCount<Key> extends 6 ? 6 : GetWildcardCount<Key> extends 7 ? 7 : GetWildcardCount<Key> extends 8 ? 8 : GetWildcardCount<Key> extends 9 ? 9 : never : never : T extends Key ? 0 : never]: Key; | ||
| }; | ||
| /** | ||
| * | ||
| * | ||
| * 返回匹配T的所有Key的元素 | ||
| * | ||
| * @example | ||
| * | ||
| * | ||
| */ | ||
| type GetClosestEventNameTuple<Events extends Record<string, any>, T extends string> = (GetMatchedEventNames<Events, T> extends { | ||
| 0: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 1: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 2: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 3: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 4: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 5: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 6: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 7: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 8: infer V; | ||
| } ? V extends never ? never : V : never) | (GetMatchedEventNames<Events, T> extends { | ||
| 9: infer V; | ||
| } ? V extends never ? never : V : never); | ||
| /** | ||
| * 返回最接近的Key | ||
| */ | ||
| type GetClosestEventName<Events extends Record<string, any>, T extends string> = GetMatchedEventNames<Events, T> extends never ? never : ClosestMatch<GetClosestEventNameTuple<Events, T>>; | ||
| /** | ||
| type Events = { | ||
| "users/* /login": { userId: number }; | ||
| "* /* /login": { userId: number }; | ||
| "users/* /profile": { username: string }; | ||
| }; | ||
| type Result1 = GetClosestEvents<Events, "users/123/login">; | ||
| { | ||
| "users/* /login": { | ||
| userId: number; | ||
| }; | ||
| } | ||
| */ | ||
| type GetClosestEvents<Events extends Record<string, any>, T extends string, D = Record<string, any>> = GetClosestEventName<Events, T> extends never ? D : Record<AssertString<GetClosestEventName<Events, T>>, Events[AssertString<GetClosestEventName<Events, T>>]>; | ||
| /** | ||
| * 返回最匹配的事件元组 | ||
| * | ||
| * [事件名称,事件负载] | ||
| * | ||
| * type Events = { | ||
| * "users/* /login": string; | ||
| "users/* /logout": number; | ||
| "users/* /*": { name: string }; | ||
| }; | ||
| type Result =GetClosestEventTuple<Events,"users/fisher/login"> | ||
| type Result = ["users/* /login", string] | ||
| * | ||
| */ | ||
| type GetClosestEventTuple<Events extends Record<string, any>, T extends string> = ExpandRecord<GetClosestEvents<Events, T>>; | ||
| /** | ||
| * | ||
| * - 当K不包括通配符时,直接返回K | ||
| * - 当包括通配符时,返回K | Omit<ReplaceWildcard<K>, K> | ||
| * 这样操作的目的是为了能让IDE提供"users/* /login"并且能适配通配符 | ||
| * 如果不这样操作,IDE不会提示 | ||
| * | ||
| * | ||
| * | ||
| */ | ||
| type EnsureEventType<K extends string> = ContainsWildcard<K> extends true ? K | ReplaceWildcard<K> : K; | ||
| type MutableMessage<Events extends Record<string, any>, Meta extends Record<string, any> = Record<string, any>> = IsAnyRecord<Events> extends true ? OptionalKeys<FastEventMessage<string, any, Meta>, "meta"> & FastEventMessageExtends : { | ||
| [K in KeyOf<Events>]: Events[K] extends FastMessagePayload ? IfNever<Events[K]["type"], any> : { | ||
| type: ReplaceWildcard<K extends "*" ? string : EnsureEventType<K>>; | ||
| payload: IfNever<Events[K], any>; | ||
| meta?: Meta; | ||
| } & FastEventMessageExtends; | ||
| }[KeyOf<Events>]; | ||
| /** | ||
| * 返回最匹配的事件元组 | ||
| * | ||
| * [事件名称,事件负载] | ||
| * | ||
| * type Events = { | ||
| * "users/* /login": string; | ||
| "users/* /logout": number; | ||
| "users/* /*": { name: string }; | ||
| }; | ||
| type Result =GetClosestEventTuple<Events,"users/fisher/login"> | ||
| type Result = ["users/* /login", string] | ||
| * | ||
| */ | ||
| type GetClosestMessage<Events extends Record<string, any>, T extends string, Meta extends Record<string, any> = never> = FastEventMessage<ContainsWildcard<T> extends true ? ReplaceWildcard<Exclude<ExpandRecord<GetClosestEvents<Events, T>>[0], number | symbol>> : T, ExpandRecord<GetClosestEvents<Events, T>>[1], Meta>; | ||
| /** | ||
| * 事件消息相关 | ||
| */ | ||
| interface FastEventMeta { | ||
| } | ||
| interface FastEventMessageExtends { | ||
| } | ||
| type FastEventMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = { | ||
| type: T; | ||
| payload: P; | ||
| meta?: FastEventMeta & M & Record<string, any>; | ||
| } & FastEventMessageExtends; | ||
| /** | ||
| * 用于emit方法,允许meta可选,更加宽泛 | ||
| */ | ||
| type FastEventEmitMessage<T extends string = string, P = any, M extends Record<string, any> = Record<string, any>> = OptionalKeys<FastEventMessage<T, P, M>, "meta">; | ||
| type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`; | ||
| type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({ | ||
| [K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: { | ||
| type: ReplaceWildcard<K>; | ||
| payload: Events[K]; | ||
| meta?: Partial<FastEventMeta & M> & Record<string, any>; | ||
| }; | ||
| } & { | ||
| [K in keyof Events as K extends WildcardStyle ? never : K]: { | ||
| type: Exclude<K, number | symbol>; | ||
| payload: Events[K]; | ||
| meta?: Partial<FastEventMeta> & M & Record<string, any>; | ||
| }; | ||
| })[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends; | ||
| type FastMessagePayload<P = any> = { | ||
| type: P; | ||
| __IS_FAST_MESSAGE__: true; | ||
| }; | ||
| /** | ||
| * FastEvent 订阅者类型 | ||
| * | ||
| * @description | ||
| * 当使用 { iterable: true } 选项时,返回的订阅者对象支持异步迭代, | ||
| * 可以使用 for await...of 语法消费事件消息。 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * // 普通订阅者(不启用 iterable) | ||
| * const subscriber1 = emitter.on('event', listener); | ||
| * subscriber1.off(); | ||
| * | ||
| * // 可迭代订阅者(启用 iterable) | ||
| * const subscriber2 = emitter.on('event', null, { iterable: true }); | ||
| * for await (const message of subscriber2) { | ||
| * console.log(message); | ||
| * } | ||
| * ``` | ||
| */ | ||
| type FastEventSubscriber = { | ||
| /** | ||
| * 取消订阅 | ||
| */ | ||
| off: () => void; | ||
| /** | ||
| * 同步资源释放(支持 using 语句) | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * { | ||
| * using subscriber = emitter.on('event', listener); | ||
| * // subscriber 在作用域结束时自动释放 | ||
| * } | ||
| * ``` | ||
| */ | ||
| [Symbol.dispose]: () => void; | ||
| /** | ||
| * 为什么要有一个listener引用? 主要用于移除监听器时使用 | ||
| * | ||
| * - 正常情况下 | ||
| * const subscriber = emitter.on('event', listener) | ||
| * | ||
| * subscriber.off() | ||
| * emitter.off('event', listener) | ||
| * emitter.off(listener) | ||
| * | ||
| * - 在使用scope时 | ||
| * const scope = emitter.scope("xxx") | ||
| * const subscriber = scope.on('event', listener) | ||
| * | ||
| * subscriber.off() 可以正常生效 | ||
| * scope.off('event', listener) // 无法生效 | ||
| * scope.off(listener) // 无法生效 | ||
| * 因为在scope中,为了让监听器可以处理scope的逻辑,对listener进行了包装, | ||
| * 因此在事件注册表中登记的不是listener,而是经过包装的监听器 | ||
| * subscriber.off() 可以正常生效 | ||
| * 如果要使用scope.off或emitter.off | ||
| * 需要使用subscriber.listener, subscriber.listener记录了原始的监听器引用 | ||
| * subscriber.listener===listener | ||
| * | ||
| * scope.off('event', subscriber.listener) // 生效 | ||
| * scope.off(subscriber.listener) // 生效 | ||
| * | ||
| */ | ||
| readonly listener: TypedFastEventListener<any, any, any>; | ||
| } & { | ||
| /** | ||
| * 将消息加入队列(内部方法,仅当启用 iterable 时可用) | ||
| * @internal | ||
| */ | ||
| _enqueue?: (message: TypedFastEventMessage) => void; | ||
| /** | ||
| * 关闭订阅者(内部方法,仅当启用 iterable 时可用) | ||
| * @internal | ||
| */ | ||
| _close?: () => void; | ||
| }; | ||
| type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (this: FastEventListenerMeta, listener: FastEventListenerMeta, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[]; | ||
| type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener; | ||
| type GetClosestEventPayload<Events extends Record<string, any>, T extends string> = GetClosestEventTuple<Events, T>[1]; | ||
| type IsTransformedEvent<Events extends Record<string, any>, T extends string> = T extends keyof Events ? IsAny<Events[T]> extends true ? never : Events[T] extends FastMessagePayload<any> ? T : never : IsAny<GetClosestEventPayload<Events, T>> extends true ? never : GetClosestEventPayload<Events, T> extends FastMessagePayload<any> ? T : never; | ||
| type PickPayload<M> = [M] extends [FastMessagePayload] ? M["type"] : M; | ||
| type InMatchedEvent<Events extends Record<string, any>, T> = T extends KeyOf<Events> | ReplaceWildcard<KeyOf<Events>> ? true : false; | ||
| /** | ||
| * 获取指定事件名称的负载类型 | ||
| */ | ||
| type GetPayload<Events extends Record<string, any>, T> = T extends string ? GetClosestEventTuple<Events, T>[1] : any; | ||
| /** | ||
| * FastEventIterator - 使用异步迭代器从 FastEvent 或 FastEventScope 订阅事件 | ||
| * 重构:使用 queue.ts 中的队列参数和逻辑 | ||
| */ | ||
| type FastQueueOverflows = "drop" | "expand" | "slide" | "throw"; | ||
| interface FastEventIteratorOptions<T = FastEventMessage> { | ||
| /** 缓冲区默认大小(默认:100) */ | ||
| size?: number; | ||
| /** 缓冲区扩展到多大时不再扩展(默认:1000) */ | ||
| maxExpandSize?: number; | ||
| /** 当扩展到最大大小后的溢出策略(默认:'slide') */ | ||
| expandOverflow?: Omit<FastQueueOverflows, "expand">; | ||
| /** 溢出策略(默认:'slide') */ | ||
| overflow?: FastQueueOverflows; | ||
| /** 消息生命周期(毫秒),0表示不启用(默认:0) */ | ||
| lifetime?: number; | ||
| /** 当新消息到达时触发此回调 */ | ||
| onPush?: (newMessage: T, messages: [T, number][]) => void; | ||
| /** 当消息被弹出时触发此回调,可以在此对消息队列进行排序等操作 */ | ||
| onPop?: (messages: [T, number][], hasNew: boolean) => [T, number] | undefined; | ||
| /** 当消息被丢弃时触发此回调 */ | ||
| onDrop?: (message: T) => void; | ||
| /** 错误处理函数,返回true表示继续迭代,false表示停止迭代 */ | ||
| onError?: (error: Error) => boolean | Promise<boolean>; | ||
| /** 信号,用于取消迭代 */ | ||
| signal?: AbortSignal; | ||
| } | ||
| /** | ||
| * 事件相关 | ||
| */ | ||
| type FastEventOptions<Meta = Record<string, any>, Context = never> = { | ||
| id: string; | ||
| title: string; | ||
| debug: boolean; | ||
| delimiter: string; | ||
| context: Context; | ||
| ignoreErrors: boolean; | ||
| meta: Meta; | ||
| onAddBeforeListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void; | ||
| onAddAfterListener?: (type: string, node: FastEventListenerNode) => void; | ||
| onRemoveListener?: (type: string, listener: TypedFastEventListener, node: FastEventListenerNode) => void; | ||
| onClearListeners?: () => void; | ||
| onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void; | ||
| onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[]; | ||
| onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastEventListenerNode[]) => void; | ||
| /** | ||
| * 全局执行器 | ||
| */ | ||
| executor?: FastListenerExecutor; | ||
| /** | ||
| * 是否展开emit返回值,默认为false,用于将事件转发给其他FastEvent时使用 | ||
| */ | ||
| expandEmitResults?: boolean; | ||
| /** | ||
| * 对接收到的消息进行转换,用于将消息转换成其他格式 | ||
| * | ||
| * new FastEvent({ | ||
| * transform:(message)=>{ | ||
| * message.payload | ||
| * } | ||
| * }) | ||
| */ | ||
| transform?: (message: FastEventMessage) => any; | ||
| }; | ||
| interface FastEvents { | ||
| } | ||
| type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = { | ||
| count?: number; | ||
| prepend?: boolean; | ||
| flags?: number; | ||
| filter?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean; | ||
| off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean; | ||
| pipes?: FastListenerPipe[]; | ||
| /** | ||
| * 为监听器添加一个tag,在监听器注册表中记录,用于调试使用 | ||
| * emitter.on(type,listener,{tag:"x"}) | ||
| * emitter.getListeners(tag) | ||
| */ | ||
| tag?: string; | ||
| /** | ||
| * 异步迭代器选项 | ||
| * | ||
| * 用于配置返回异步迭代器的参数 | ||
| * | ||
| * 默认值是 | ||
| { | ||
| overflow: "expand", | ||
| size: 10, | ||
| maxExpandSize: 100, | ||
| } | ||
| */ | ||
| iterable?: FastEventIteratorOptions; | ||
| }; | ||
| declare enum FastEventListenerFlags { | ||
| Transformed = 1 | ||
| } | ||
| type FastEventListenerArgs<M = Record<string, any>> = { | ||
| retain?: boolean; | ||
| meta?: DeepPartial<M> & Record<string, any>; | ||
| 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; | ||
| }; | ||
| /** | ||
| * 将对象中值是FastMessagePayload的类型提取出来 | ||
| */ | ||
| type UnTransformedEvents<Events extends Record<string, any>> = { | ||
| [K in keyof Events]: Events[K] extends FastMessagePayload<infer P> ? P : Events[K]; | ||
| }; | ||
| type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>; | ||
| type FastEventCommonListener<Message = FastEventMessage, Meta extends Record<string, any> = Record<string, any>, Context = any> = (this: Context, message: Message, args: FastEventListenerArgs<Meta>) => any | Promise<any>; | ||
| /** | ||
| * [ | ||
| * 0: 监听器函数引用, | ||
| * 1: 需要执行多少次, =0代表不限 | ||
| * 2: 实际执行的次数(用于负载均衡时记录) | ||
| * 3: 标签 用于调试一般可以标识监听器类型或任意信息 | ||
| * 4: 标识, | ||
| * 5: 监听器最后一次执行结果,仅仅在debug时启用,如果结果是对象则是一个WeakRef | ||
| * ] | ||
| */ | ||
| type FastEventListenerMeta = [ | ||
| TypedFastEventListener<any, any>, | ||
| number, | ||
| number, | ||
| string, | ||
| number, | ||
| any? | ||
| ]; | ||
| type FastEventListenerNode = { | ||
| __listeners: FastEventListenerMeta[]; | ||
| } & { | ||
| [key: string]: FastEventListenerNode; | ||
| }; | ||
| type FastListeners = FastEventListenerNode; | ||
| /** | ||
| * FastLiteEvent 轻量级事件发射器 | ||
| * | ||
| * 从 FastEvent 派生的精简版本,移除了以下高级特性: | ||
| * scope / hook / meta / pipe / executor / 异步迭代 / context | ||
| * debug / abortSignal / 订阅时的 filter+off / 监听优先级 prepend | ||
| * | ||
| * 仅保留核心的事件收发能力:on / once / onAny / off / offAll / clear / | ||
| * emit / emitAsync / waitFor / getListeners / clearRetainMessages,以及通配符 | ||
| * (* / **)、retain 保留事件、count / tag / flags、ignoreErrors、transform | ||
| * 消息转换、expandEmitResults 等基础特性。 | ||
| * | ||
| * 类型与 FastEvent 同源派生(Omit / 复用),监听器、消息、订阅者与 FastEvent | ||
| * 双向兼容——同一监听器函数可同时挂到 FastEvent 与 FastLiteEvent 上。 | ||
| */ | ||
| type FastLiteMessage<T extends string = string, P = any> = Omit<FastEventMessage<T, P>, "meta">; | ||
| type FastLiteListenerArgs = Omit<FastEventListenerArgs, "meta" | "executor" | "parseArgs" | "abortSignal">; | ||
| type FastLiteListenOptions<Events extends Record<string, any> = Record<string, any>> = Omit<FastEventListenOptions<Events>, "pipes" | "iterable" | "filter" | "off" | "prepend">; | ||
| type FastLiteEventOptions = Omit<FastEventOptions, "context" | "meta" | "executor" | "debug" | "onAddBeforeListener" | "onAddAfterListener" | "onRemoveListener" | "onClearListeners" | "onListenerError" | "onBeforeExecuteListener" | "onAfterExecuteListener">; | ||
| type FastLiteSubscriber = FastEventSubscriber; | ||
| type FastLiteListener<T extends string = string, P = any> = FastEventCommonListener<FastLiteMessage<T, P>, any, any>; | ||
| /** | ||
| * FastLiteEvent 轻量级事件发射器类 | ||
| * | ||
| * @template Events - 事件类型定义,继承自 FastEvents 接口 | ||
| */ | ||
| declare class FastLiteEvent<Events extends Record<string, any> = Record<string, any>, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = KeyOf<AllEvents>, EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>> { | ||
| __FastLiteEvent__: boolean; | ||
| /** 事件监听器树结构,存储所有注册的事件监听器 */ | ||
| listeners: FastListeners; | ||
| /** 事件发射器的配置选项 */ | ||
| private _options; | ||
| /** 事件名称的分隔符,默认为 '/' */ | ||
| private _delimiter; | ||
| /** 保留的事件消息映射,Key 是事件名称,Value 是保留的事件消息 */ | ||
| retainedMessages: Map<string, any>; | ||
| /** 当前注册的监听器总数 */ | ||
| listenerCount: number; | ||
| /** | ||
| * 创建 FastLiteEvent 实例 | ||
| * @param options - 事件发射器的配置选项 | ||
| * | ||
| * 默认配置: | ||
| * - id: 随机字符串 - 实例唯一标识符 | ||
| * - delimiter: '/' - 事件名称分隔符 | ||
| * - ignoreErrors: true - 是否忽略监听器执行错误 | ||
| * - expandEmitResults: true - 是否展开 emit 返回值 | ||
| */ | ||
| constructor(options?: Partial<FastLiteEventOptions>); | ||
| /** 获取事件发射器的配置选项 */ | ||
| get options(): FastLiteEventOptions; | ||
| /** 获取事件发射器的唯一标识符 */ | ||
| get id(): string; | ||
| /** 获取事件发射器的标题 */ | ||
| get title(): string; | ||
| /** | ||
| * 初始化选项(供子类重载) | ||
| * @param initial - 可选的初始选项 | ||
| */ | ||
| _initOptions(initial?: Partial<FastLiteEventOptions>): Partial<FastLiteEventOptions> | undefined; | ||
| /** | ||
| * 添加事件监听器到事件树(仅尾插,已移除 prepend 插队) | ||
| * @param parts - 事件路径数组 | ||
| * @param listener - 事件监听器函数 | ||
| * @param options - 监听器配置(count / tag / flags) | ||
| * @returns [节点, 监听器索引] | ||
| */ | ||
| private _addListener; | ||
| /** | ||
| * 根据 parts 路径遍历监听器树,并在最后的节点上执行回调 | ||
| */ | ||
| private _forEachNodes; | ||
| /** | ||
| * 从监听器节点中移除指定的事件监听器 | ||
| */ | ||
| private _removeListener; | ||
| /** | ||
| * 注册事件监听器 | ||
| * @param type - 事件类型,支持普通字符串、通配符(user/*)、全局监听(**) | ||
| * @param listener - 事件监听器函数 | ||
| * @param options - 监听器配置(count / tag / flags) | ||
| * @returns 订阅者对象,包含 off 方法用于取消监听 | ||
| */ | ||
| on<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 注册一次性事件监听器(触发一次后自动注销) | ||
| */ | ||
| once<T extends string = KeyOf<Events> | "**">(type: T, listener: FastEventCommonListener<T extends IsTransformedEvent<AllEvents, T> ? PickPayload<ValueOf<GetClosestEvents<Events, T>>> : T extends "**" ? MutableMessage<Events> : GetClosestMessage<Events, T, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 注册一个监听所有事件的监听器(等同 on('**', listener)) | ||
| */ | ||
| onAny(listener: FastEventCommonListener<MutableMessage<AllEvents, any>, any, any>, options?: FastLiteListenOptions): FastEventSubscriber; | ||
| /** | ||
| * 移除事件监听器 | ||
| */ | ||
| off(listener: Function): void; | ||
| off(type: string, listener: Function): void; | ||
| off(type: Types): void; | ||
| off(type: string): void; | ||
| /** | ||
| * 移除所有事件监听器 | ||
| * @param entry - 可选的事件前缀,提供则只移除该前缀下的监听器 | ||
| */ | ||
| offAll(entry?: string): void; | ||
| /** | ||
| * 移除保留的事件 | ||
| */ | ||
| private _removeRetainedEvents; | ||
| /** | ||
| * 清除所有事件或指定前缀的事件(含保留消息) | ||
| */ | ||
| clear(prefix?: string): void; | ||
| /** | ||
| * 发送最后一次事件的消息给对应的监听器(用于 retain) | ||
| */ | ||
| private _emitRetainMessage; | ||
| /** | ||
| * 遍历监听器节点树,支持三种匹配模式:精确 / 单层通配 * / 多层通配 ** | ||
| */ | ||
| private _traverseToPath; | ||
| private _traverseListeners; | ||
| /** | ||
| * 监听器执行出错处理(移除了 ListenerError hook) | ||
| */ | ||
| private _onListenerError; | ||
| /** | ||
| * 执行单个监听器函数(移除了 debug / abortSignal 分支,this 指向实例) | ||
| */ | ||
| private _executeListener; | ||
| /** | ||
| * 执行监听器节点列表中的所有监听器(移除了 executor,退化为同步顺序执行) | ||
| */ | ||
| private _executeListeners; | ||
| /** | ||
| * 减少侦听器的执行次数(达到 count 限制时移除) | ||
| */ | ||
| _decListenerExecCount(listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][]): void; | ||
| /** | ||
| * 获取指定类型的所有事件监听器 | ||
| */ | ||
| getListeners(type: string): FastEventListenerMeta[]; | ||
| /** | ||
| * 清除所有事件或指定事件的保留消息 | ||
| */ | ||
| clearRetainMessages(type?: EventNames | string): void; | ||
| /** | ||
| * 同步触发事件 | ||
| * | ||
| * 支持两种调用方式: | ||
| * emit(type, payload, retain?) | ||
| * emit({ type, payload }, retain?) | ||
| */ | ||
| emit<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): R[]; | ||
| emit<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): R[]; | ||
| emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>, retain?: boolean): R[]; | ||
| emit<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): R[]; | ||
| emit<R = any>(message: { | ||
| type: keyof AllEvents; | ||
| }, retain?: boolean): R[]; | ||
| emit<R = any>(message: FastEventMessage, retain?: boolean): R[]; | ||
| /** | ||
| * 异步触发事件(使用 Promise.allSettled,等待所有异步监听器完成) | ||
| */ | ||
| emitAsync<R = any, T extends Types = Types>(type: T, payload?: UnTransformedEvents<AllEvents>[T], retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any, T extends string = string>(type: ReplaceWildcard<T> | Types, payload?: InMatchedEvent<Events, T> extends true ? GetPayload<UnTransformedEvents<AllEvents>, T> : any, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): Promise<(R | Error)[]>; | ||
| emitAsync<R = any>(message: { | ||
| type: keyof AllEvents; | ||
| }, retain?: boolean): Promise<(R | Error)[]>; | ||
| } | ||
| export { FastLiteEvent, type FastLiteEventOptions, type FastLiteListenOptions, type FastLiteListener, type FastLiteListenerArgs, type FastLiteMessage, type FastLiteSubscriber }; |
| var FastLiteEvent=(function(exports){'use strict';var L=Object.defineProperty;var _=(a,e,t)=>e in a?L(a,e,{enumerable:true,configurable:true,writable:true,value:t}):a[e]=t;var d=(a,e,t)=>_(a,typeof e!="symbol"?e+"":e,t);function v(a,e){let t=a.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let n=0;n<s-1;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}for(let n=0;n<t;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}function c(a,e){let t=[];for(let s=a.length-1;s>=0;s--)e(a[s])&&(t.push(s),a.splice(s,1));return t.reverse()}function u(a){return a&&typeof a=="function"}var F=Symbol.for("__expandable__");function f(a){return a&&a[F]}function y(a){for(let e=0;e<a.length;e++){let t=a[e];Array.isArray(t)&&f(t)&&(a.splice(e,1,...t),e+=t.length-1);}return a}function m(a,e){return a.catch(t=>(e&&e(t),Promise.resolve(t)))}function g(a){return a.map(e=>e.status==="fulfilled"?e.value:e.reason)}function b(a){let e={},t={};return typeof a[0]=="object"?(Object.assign(e,a[0]),t=typeof a[1]=="boolean"?{retain:a[1]}:{}):(e.type=a[0],e.payload=a[1],t=typeof a[2]=="boolean"?{retain:a[2]}:{}),[e,t]}var h=class{constructor(e){d(this,"__FastLiteEvent__",true);d(this,"listeners",{__listeners:[]});d(this,"_options");d(this,"_delimiter","/");d(this,"retainedMessages",new Map);d(this,"listenerCount",0);this._options=Object.assign({id:Math.random().toString(36).substring(2),delimiter:"/",ignoreErrors:true,expandEmitResults:true},this._initOptions(e)),this._delimiter=this._options.delimiter;}get options(){return this._options}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastLiteEvent"}_initOptions(e){return e}_addListener(e,t,s){let n=0;return [this._forEachNodes(e,r=>{let o=[t,s.count,0,s.tag,s.flags];r.__listeners.push(o),n=r.__listeners.length-1,this.listenerCount++;}),n]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let n=0;n<e.length;n++){let i=e[n];if(i in s||(s[i]={__listeners:[]}),n===e.length-1){let r=s[i];return t(r,s),r}else s=s[i];}}_removeListener(e,t,s){s&&c(e.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let i=n===s;return i&&this.listenerCount--,i});}on(e,t,s){if(e.length===0)throw new Error("event cannot be empty");let n=Object.assign({count:0,flags:0},s),i=e.split(this._delimiter),[r,o]=this._addListener(i,t,n),l=()=>r&&this._removeListener(r,i,t);return this._emitRetainMessage(e,r,o),{off:l,listener:t,[Symbol.dispose](){l();}}}once(e,t,s){return this.on(e,t,Object.assign({},s,{count:1}))}onAny(e,t){return this.on("**",e,t)}off(){let e=arguments,t=u(e[0])?void 0:e[0],s=u(e[0])?e[0]:e[1],n=t?t.split(this._delimiter):[],i=t?t.includes("*"):false;if(t&&!i)this._traverseToPath(this.listeners,n,r=>{s?this._removeListener(r,n,s):t&&(r.__listeners=[]);});else {let r=i?[]:n;this._traverseListeners(this.listeners,r,(o,l)=>{(s!==void 0||i&&v(o,n))&&(s?this._removeListener(l,n,s):l.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(n,i)=>{s+=i.__listeners.length,i.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(e);}else {let t=0;this._traverseListeners(this.listeners,[],(s,n)=>{t+=n.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let n=[];if(e.includes("*")){let i=e.split(this._delimiter);this.retainedMessages.forEach((r,o)=>{let l=o.split(this._delimiter);v(l,i)&&n.push(r);});}else this.retainedMessages.has(e)&&n.push(this.retainedMessages.get(e));t&&n.forEach(i=>{this._executeListeners([t],i,{},r=>r[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,n=0,i){if(n>=t.length){s(e);return}let r=t[n];if(i===true){this._traverseToPath(e,t,s,n+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,n+1),"**"in e&&this._traverseToPath(e["**"],t,s,n+1,true),r in e&&this._traverseToPath(e[r],t,s,n+1);}_traverseListeners(e,t,s){let n=e;t&&t.length>0&&this._traverseToPath(e,t,r=>{n=r;});let i=(r,o,l)=>{o(l,r);for(let[p,E]of Object.entries(r))p.startsWith("__")||E&&i(E,o,[...l,p]);};i(n,s,[]);}_onListenerError(e,t,s,n){if(n instanceof Error&&(n._emitter=`${e.name||"anonymous"}:${t.type}`),this._options.ignoreErrors)return n;throw n}_executeListener(e,t,s,n=false){let i=e[0];try{let r=((s?.flags||0)&1)>0,o=i.call(this,r?t.payload:t,s);return n&&o&&o instanceof Promise&&(o=m(o,l=>this._onListenerError(i,t,s,l))),o}catch(r){return this._onListenerError(i,t,s,r)}}_executeListeners(e,t,s,n){if(!e||e.length===0)return [];let i=[];for(let r of e){let o=0;for(let l of r.__listeners)(!n||n(l,r))&&i.push([l,o++,r.__listeners]);}return this._decListenerExecCount(i),i.map(r=>this._executeListener(r[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,i=>{t.push(i);});let n=[];return t.map(i=>{n.push(...i.__listeners);}),n}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=b(arguments),s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let n=[];if(this._traverseToPath(this.listeners,s,r=>{n.push(r);}),u(this._options.transform)){let r=this._options.transform.call(this,e);r!==e&&(e.payload=r,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}let i=[];return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&y(i),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return g(e)}};exports.FastLiteEvent=h;return exports;})({});//# sourceMappingURL=liteEvent.global.js.map | ||
| //# sourceMappingURL=liteEvent.global.js.map |
| {"version":3,"sources":["../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/utils/isFunction.ts","../src/utils/expandable.ts","../src/utils/expandEmitResults.ts","../src/utils/tryReturnError.ts","../src/utils/getPromiseResults.ts","../src/liteEvent.ts"],"names":["isPathMatched","path","pattern","pathLen","patternLen","i","removeItem","arr","condition","removedIndices","isFunction","fn","__expandable__","isExpandable","value","expandEmitResults","items","item","tryReturnError","callback","e","getPromiseResults","results","result","parseLiteEmitArgs","args","message","emitArgs","FastLiteEvent","options","__publicField","initial","parts","listener","index","node","newListener","current","part","isRemove","type","finalOptions","off","hasWildcard","entryParts","entry","count","_path","prefix","key","listenerNode","messages","patterns","t","listenerMeta","lastFollowing","entryNode","n","traverseNodes","parentPath","childNode","_args","catchErrors","listenerFn","isTransformed","nodes","filter","listeners","meta","transformed"],"mappings":"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","file":"liteEvent.global.js","sourcesContent":["/**\n *\n * 判断path是否与pattern匹配\n *\n * isPathMatched(\"a.b.c\",\"a.b.c\") == true\n * isPathMatched(\"a.b.c\",\"a.b.*\") == true\n * isPathMatched(\"a.b.c\",\"a.*.*\") == true\n * isPathMatched(\"a.b.c\",\"*.*.*\") == true\n * isPathMatched(\"a.b.c\",\".b.*\") == true\n * isPathMatched(\"a.b.c.d\",\"a.**\") == true\n *\n * - '**' 匹配后续的\n * - '*' 匹配任意数量的字符,包括零个字符\n *\n * @param path\n * @param pattern\n */\nexport function isPathMatched(path: string[], pattern: string[]): boolean {\n const pathLen = path.length;\n const patternLen = pattern.length;\n\n // 快速失败: 长度不匹配(除非以 ** 结尾)\n if (pathLen !== patternLen && (patternLen === 0 || pattern[patternLen - 1] !== '**')) {\n return false;\n }\n\n // 处理 ** 通配符: 直接检查前缀匹配\n if (patternLen > 0 && pattern[patternLen - 1] === '**') {\n // 检查前 n-1 个元素是否匹配\n for (let i = 0; i < patternLen - 1; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n return true;\n }\n\n // 普通匹配: 逐元素比较\n for (let i = 0; i < pathLen; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n// export function isPathMatched(path:string[],pattern:string[]):boolean{\n// if(path.length !== pattern.length && (path.length>0 && pattern[pattern.length-1]!=='**') ){\n// return false;\n// }\n// let fPattern = [...pattern]\n// if(pattern.length >0 && pattern[pattern.length-1] === '**'){\n// fPattern.splice(pattern.length-1,1,...Array.from<string>({\n// length: path.length-pattern.length+1\n// }).fill('*'))\n// }\n// for(let i=0;i<path.length;i++){\n// if(fPattern[i]==='*'){\n// continue\n// }\n// if(fPattern[i]!==path[i]){\n// return false\n// }\n// }\n// return true\n// }\n","/**\n * 从数组中移除满足条件的元素并返回被移除元素的索引\n * @param {any[]} arr - 需要操作的数组\n * @param {(item: any) => boolean} condition - 判断元素是否应该被移除的条件函数\n * @returns {number[]} 被移除元素在原数组中的索引集合\n */\nexport function removeItem(arr: any[], condition: (item: any) => boolean) {\n const removedIndices: number[] = [];\n // 从后往前遍历,避免删除元素时索引变化的问题\n for (let i = arr.length - 1; i >= 0; i--) {\n if (condition(arr[i])) {\n removedIndices.push(i); // 记录原始索引\n arr.splice(i, 1); // 删除元素\n }\n }\n\n // 因为是从后往前遍历的,所以索引是降序的,需要反转得到升序结果\n return removedIndices.reverse();\n}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\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 { isExpandable } from \"./expandable\";\n/**\n * \n * 判断成员isExpandable,如果是则说明是一个数组,则原地展开\n * \n * \n */\nexport function expandEmitResults(items: any[]): any[] {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (Array.isArray(item) && isExpandable(item)) {\n items.splice(i, 1, ...item)\n i += item.length - 1\n }\n }\n return items\n\n}\n\n\n// import { expandable } from \"./expandable\";\n// const items = [1, 2, expandable([3, 4]), 0, 0, expandable([5, 6]), expandable([7, 8]), 9, 10, 11]\n// // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n// expandEmitResults(items)\n// console.log(items)","\n\n/**\n * 包装 Promise,将 catch 的错误转换为正常返回值\n * @param fn 需要包装的 Promise\n * @returns 包装后的 Promise,如果发生错误则返回错误对象\n */\nexport function tryReturnError(fn: Promise<any>, callback?: (e: any) => any): Promise<any> {\n return fn.catch((e) => {\n if (callback) callback(e)\n return Promise.resolve(e)\n })\n}\n","export function getPromiseResults(results: any[]) {\n return results.map((result) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n } else {\n return result.reason;\n }\n });\n}\n","/**\n * FastLiteEvent 轻量级事件发射器\n *\n * 从 FastEvent 派生的精简版本,移除了以下高级特性:\n * scope / hook / meta / pipe / executor / 异步迭代 / context\n * debug / abortSignal / 订阅时的 filter+off / 监听优先级 prepend\n *\n * 仅保留核心的事件收发能力:on / once / onAny / off / offAll / clear /\n * emit / emitAsync / waitFor / getListeners / clearRetainMessages,以及通配符\n * (* / **)、retain 保留事件、count / tag / flags、ignoreErrors、transform\n * 消息转换、expandEmitResults 等基础特性。\n *\n * 类型与 FastEvent 同源派生(Omit / 复用),监听器、消息、订阅者与 FastEvent\n * 双向兼容——同一监听器函数可同时挂到 FastEvent 与 FastLiteEvent 上。\n */\nimport {\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n Expand,\n Fallback,\n ReplaceWildcard,\n UnTransformedEvents,\n FastEventMessage,\n TypedFastEventMessage,\n FastEventEmitMessage,\n FastListeners,\n FastEventListenerNode,\n FastEventListenerMeta,\n FastEventCommonListener,\n FastEventSubscriber,\n FastEventOptions,\n FastEventListenOptions,\n FastEventListenerArgs,\n FastEvents,\n FastEventListenerFlags,\n IsTransformedEvent,\n ExtendWildcardEvents,\n PayloadValues,\n PickPayload,\n ValueOf,\n GetPayload,\n} from \"./types\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { isPathMatched } from \"./utils/isPathMatched\";\nimport { removeItem } from \"./utils/removeItem\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { expandEmitResults } from \"./utils/expandEmitResults\";\nimport { tryReturnError } from \"./utils/tryReturnError\";\nimport { getPromiseResults } from \"./utils/getPromiseResults\";\n\n// —— 从原始类型 Omit 派生:剥离被移除特性对应的字段 ——\nexport type FastLiteMessage<T extends string = string, P = any> = Omit<\n FastEventMessage<T, P>,\n \"meta\"\n>;\n\nexport type FastLiteListenerArgs = Omit<\n FastEventListenerArgs,\n \"meta\" | \"executor\" | \"parseArgs\" | \"abortSignal\"\n>;\n\nexport type FastLiteListenOptions<\n Events extends Record<string, any> = Record<string, any>,\n> = Omit<FastEventListenOptions<Events>, \"pipes\" | \"iterable\" | \"filter\" | \"off\" | \"prepend\">;\n\nexport type FastLiteEventOptions = Omit<\n FastEventOptions,\n | \"context\"\n | \"meta\"\n | \"executor\"\n | \"debug\"\n | \"onAddBeforeListener\"\n | \"onAddAfterListener\"\n | \"onRemoveListener\"\n | \"onClearListeners\"\n | \"onListenerError\"\n | \"onBeforeExecuteListener\"\n | \"onAfterExecuteListener\"\n>;\n\n// —— 完全复用原始类型(与 FastEvent 互换兼容)——\nexport type FastLiteSubscriber = FastEventSubscriber;\nexport type FastLiteListener<\n T extends string = string,\n P = any,\n> = FastEventCommonListener<FastLiteMessage<T, P>, any, any>;\n\n/**\n * 解析 emit 参数(简化版,不复用 parseEmitArgs)\n *\n * 仅支持两种形态:\n * (type, payload, retain?)\n * (message, retain?)\n *\n * @param args - emit 的 arguments\n * @returns [消息, 监听器参数]\n */\nfunction parseLiteEmitArgs(\n args: IArguments,\n): [TypedFastEventMessage, FastLiteListenerArgs] {\n let message = {} as TypedFastEventMessage;\n let emitArgs: FastLiteListenerArgs = {};\n if (typeof args[0] === \"object\") {\n Object.assign(message, args[0]);\n emitArgs = typeof args[1] === \"boolean\" ? { retain: args[1] } : {};\n } else {\n message.type = args[0] as any;\n message.payload = args[1] as any;\n emitArgs = typeof args[2] === \"boolean\" ? { retain: args[2] } : {};\n }\n return [message, emitArgs];\n}\n\n/**\n * FastLiteEvent 轻量级事件发射器类\n *\n * @template Events - 事件类型定义,继承自 FastEvents 接口\n */\nexport class FastLiteEvent<\n Events extends Record<string, any> = Record<string, any>,\n AllEvents extends Record<string, any> = Expand<Events & FastEvents>,\n Types extends keyof AllEvents = KeyOf<AllEvents>,\n EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>,\n> {\n __FastLiteEvent__: boolean = true;\n\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = {\n __listeners: [],\n } as unknown as FastListeners;\n\n /** 事件发射器的配置选项 */\n private _options: FastLiteEventOptions;\n\n /** 事件名称的分隔符,默认为 '/' */\n private _delimiter: string = \"/\";\n\n /** 保留的事件消息映射,Key 是事件名称,Value 是保留的事件消息 */\n retainedMessages: Map<string, any> = new Map<string, any>();\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0;\n\n /**\n * 创建 FastLiteEvent 实例\n * @param options - 事件发射器的配置选项\n *\n * 默认配置:\n * - id: 随机字符串 - 实例唯一标识符\n * - delimiter: '/' - 事件名称分隔符\n * - ignoreErrors: true - 是否忽略监听器执行错误\n * - expandEmitResults: true - 是否展开 emit 返回值\n */\n constructor(options?: Partial<FastLiteEventOptions>) {\n this._options = Object.assign(\n {\n id: Math.random().toString(36).substring(2),\n delimiter: \"/\",\n ignoreErrors: true,\n expandEmitResults: true,\n },\n this._initOptions(options),\n ) as unknown as FastLiteEventOptions;\n this._delimiter = this._options.delimiter!;\n }\n\n /** 获取事件发射器的配置选项 */\n get options() {\n return this._options;\n }\n /** 获取事件发射器的唯一标识符 */\n get id() {\n return this._options.id!;\n }\n /** 获取事件发射器的标题 */\n get title() {\n return this._options.title || this.id || \"FastLiteEvent\";\n }\n\n /**\n * 初始化选项(供子类重载)\n * @param initial - 可选的初始选项\n */\n _initOptions(initial?: Partial<FastLiteEventOptions>) {\n return initial;\n }\n\n /**\n * 添加事件监听器到事件树(仅尾插,已移除 prepend 插队)\n * @param parts - 事件路径数组\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns [节点, 监听器索引]\n */\n private _addListener(\n parts: string[],\n listener: Function,\n options: { count: number; tag?: string; flags?: number },\n ): [FastEventListenerNode | undefined, number] {\n let index: number = 0;\n const node = this._forEachNodes(parts, (node) => {\n const newListener = [\n listener,\n options.count,\n 0,\n options.tag,\n options.flags,\n ] as unknown as FastEventListenerMeta;\n node.__listeners.push(newListener);\n index = node.__listeners.length - 1;\n this.listenerCount++;\n });\n return [node, index];\n }\n\n /**\n * 根据 parts 路径遍历监听器树,并在最后的节点上执行回调\n */\n private _forEachNodes(\n parts: string[],\n callback: (node: FastEventListenerNode, parent: FastEventListenerNode) => void,\n ): FastEventListenerNode | undefined {\n if (parts.length === 0) return;\n let current = this.listeners;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {\n __listeners: [],\n } as unknown as FastListeners;\n }\n if (i === parts.length - 1) {\n const node = current[part];\n callback(node, current);\n return node;\n } else {\n current = current[part];\n }\n }\n return undefined;\n }\n\n /**\n * 从监听器节点中移除指定的事件监听器\n */\n private _removeListener(\n node: FastEventListenerNode,\n path: string[],\n listener: Function,\n ): void {\n if (!listener) return;\n removeItem(node.__listeners, (item: any) => {\n item = Array.isArray(item) ? item[0] : item;\n const isRemove = item === listener;\n if (isRemove) this.listenerCount--;\n return isRemove;\n });\n }\n\n /**\n * 注册事件监听器\n * @param type - 事件类型,支持普通字符串、通配符(user/*)、全局监听(**)\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns 订阅者对象,包含 off 方法用于取消监听\n */\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n if (type.length === 0) throw new Error(\"event cannot be empty\");\n const finalOptions = Object.assign(\n { count: 0, flags: 0 },\n options,\n ) as Required<FastLiteListenOptions> & { count: number; flags: number };\n\n const parts = type.split(this._delimiter);\n const [node, index] = this._addListener(parts, listener as any, finalOptions);\n const off = () => node && this._removeListener(node, parts, listener as any);\n\n // 触发监听器保留消息(retain)\n this._emitRetainMessage(type, node, index);\n\n return {\n off,\n listener: listener as any,\n [Symbol.dispose]() {\n off();\n },\n };\n }\n\n /**\n * 注册一次性事件监听器(触发一次后自动注销)\n */\n public once<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(type, listener, Object.assign({}, options, { count: 1 }));\n }\n\n /**\n * 注册一个监听所有事件的监听器(等同 on('**', listener))\n */\n public onAny(\n listener: FastEventCommonListener<MutableMessage<AllEvents, any>, any, any>,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(\"**\", listener as any, options as any) as FastEventSubscriber;\n }\n\n /**\n * 移除事件监听器\n */\n off(listener: Function): void;\n off(type: string, listener: Function): void;\n off(type: Types): void;\n off(type: string): void;\n off() {\n const args = arguments;\n const type = isFunction(args[0]) ? undefined : args[0];\n const listener = isFunction(args[0]) ? args[0] : args[1];\n const parts = type ? type.split(this._delimiter) : [];\n const hasWildcard = type ? type.includes(\"*\") : false;\n if (type && !hasWildcard) {\n this._traverseToPath(this.listeners, parts, (node) => {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else if (type) {\n node.__listeners = [];\n }\n });\n } else {\n const entryParts: string[] = hasWildcard ? [] : parts;\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else {\n node.__listeners = [];\n }\n }\n });\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,提供则只移除该前缀下的监听器\n */\n offAll(entry?: string) {\n if (entry) {\n const parts = entry.split(this._delimiter);\n let count = 0;\n this._traverseListeners(this.listeners, parts, (_path, node) => {\n count += node.__listeners.length;\n node.__listeners = [];\n });\n this.listenerCount -= count;\n this._removeRetainedEvents(entry);\n } else {\n let count = 0;\n this._traverseListeners(this.listeners, [], (_path, node) => {\n count += node.__listeners.length;\n });\n this.listenerCount -= count;\n this.retainedMessages.clear();\n this.listeners = { __listeners: [] } as unknown as FastListeners;\n }\n }\n\n /**\n * 移除保留的事件\n */\n private _removeRetainedEvents(prefix?: string) {\n if (!prefix) this.retainedMessages.clear();\n if (prefix?.endsWith(this._delimiter)) {\n prefix += this._delimiter;\n }\n this.retainedMessages.delete(prefix!);\n for (let key of this.retainedMessages.keys()) {\n if (key.startsWith(prefix!)) {\n this.retainedMessages.delete(key);\n }\n }\n }\n\n /**\n * 清除所有事件或指定前缀的事件(含保留消息)\n */\n clear(prefix?: string) {\n this.offAll(prefix);\n this._removeRetainedEvents(prefix);\n }\n\n /**\n * 发送最后一次事件的消息给对应的监听器(用于 retain)\n */\n private _emitRetainMessage(\n type: string,\n listenerNode: FastEventListenerNode | undefined,\n index: number,\n ) {\n let messages = [] as TypedFastEventMessage[];\n if (type.includes(\"*\")) {\n const patterns = type.split(this._delimiter);\n this.retainedMessages.forEach((message, t) => {\n const parts = t.split(this._delimiter);\n if (isPathMatched(parts, patterns)) {\n messages.push(message);\n }\n });\n } else if (this.retainedMessages.has(type)) {\n messages.push(this.retainedMessages.get(type));\n }\n if (listenerNode) {\n messages.forEach((message) => {\n this._executeListeners([listenerNode], message, {}, (listenerMeta) => {\n return listenerMeta[0] === listenerNode.__listeners[index][0];\n });\n });\n }\n }\n\n /**\n * 遍历监听器节点树,支持三种匹配模式:精确 / 单层通配 * / 多层通配 **\n */\n private _traverseToPath(\n node: FastEventListenerNode,\n parts: string[],\n callback: (node: FastEventListenerNode) => void,\n index: number = 0,\n lastFollowing?: boolean,\n ): void {\n if (index >= parts.length) {\n callback(node);\n return;\n }\n const part = parts[index];\n if (lastFollowing === true) {\n this._traverseToPath(node, parts, callback, index + 1, true);\n return;\n }\n if (\"*\" in node) {\n this._traverseToPath(node[\"*\"], parts, callback, index + 1);\n }\n if (\"**\" in node) {\n this._traverseToPath(node[\"**\"], parts, callback, index + 1, true);\n }\n if (part in node) {\n this._traverseToPath(node[part], parts, callback, index + 1);\n }\n }\n\n private _traverseListeners(\n node: FastEventListenerNode,\n entry: string[],\n callback: (path: string[], node: FastEventListenerNode) => void,\n ): void {\n let entryNode: FastEventListenerNode = node;\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (n) => {\n entryNode = n;\n });\n }\n const traverseNodes = (\n node: FastEventListenerNode,\n callback: (path: string[], node: FastEventListenerNode) => void,\n parentPath: string[],\n ) => {\n callback(parentPath, node);\n for (let [key, childNode] of Object.entries(node)) {\n if (key.startsWith(\"__\")) continue;\n if (childNode) {\n traverseNodes(childNode as FastEventListenerNode, callback, [\n ...parentPath,\n key,\n ]);\n }\n }\n };\n traverseNodes(entryNode, callback, []);\n }\n\n /**\n * 监听器执行出错处理(移除了 ListenerError hook)\n */\n private _onListenerError(\n listener: Function,\n message: TypedFastEventMessage,\n _args: FastLiteListenerArgs | undefined,\n e: any,\n ) {\n if (e instanceof Error) {\n // @ts-ignore\n e._emitter = `${listener.name || \"anonymous\"}:${message.type}`;\n }\n if (this._options.ignoreErrors) {\n return e;\n } else {\n throw e;\n }\n }\n\n /**\n * 执行单个监听器函数(移除了 debug / abortSignal 分支,this 指向实例)\n */\n private _executeListener(\n listener: FastEventListenerMeta,\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs | undefined,\n catchErrors: boolean = false,\n ): Promise<any> | any {\n const listenerFn = listener[0];\n try {\n const isTransformed =\n ((args?.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n let result = listenerFn.call(\n this,\n isTransformed ? message.payload : message,\n args!,\n );\n // 自动处理 reject Promise\n if (catchErrors && result && result instanceof Promise) {\n result = tryReturnError(result, (e) =>\n this._onListenerError(listenerFn, message, args, e),\n );\n }\n return result;\n } catch (e: any) {\n return this._onListenerError(listenerFn, message, args, e);\n }\n }\n\n /**\n * 执行监听器节点列表中的所有监听器(移除了 executor,退化为同步顺序执行)\n */\n private _executeListeners(\n nodes: FastEventListenerNode[],\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs,\n filter?: (listener: FastEventListenerMeta, node: FastEventListenerNode) => boolean,\n ): any[] {\n if (!nodes || nodes.length === 0) return [];\n const listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][] = [];\n for (const node of nodes) {\n let i: number = 0;\n for (const listener of node.__listeners) {\n if (!filter || filter(listener, node)) {\n listeners.push([listener, i++, node.__listeners]);\n }\n }\n }\n // 执行监听器前计数先减一,避免在监听器中再次触发导致重复执行\n this._decListenerExecCount(listeners);\n return listeners.map((listener) => {\n return this._executeListener(listener[0], message, args, true);\n });\n }\n\n /**\n * 减少侦听器的执行次数(达到 count 限制时移除)\n */\n _decListenerExecCount(\n listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][],\n ) {\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastEventListenerMeta;\n meta[2]++; // 实际执行的次数\n // count > 0 时代表执行次数限制\n if (meta[1] > 0 && meta[1] <= meta[2]) {\n listeners[i][2].splice(i, 1);\n }\n }\n }\n\n /**\n * 获取指定类型的所有事件监听器\n */\n getListeners(type: string): FastEventListenerMeta[] {\n const nodes: FastEventListenerNode[] = [];\n const parts = type.split(this._delimiter);\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n const listeners: any[] = [];\n nodes.map((node) => {\n listeners.push(...node.__listeners);\n });\n return listeners;\n }\n\n /**\n * 清除所有事件或指定事件的保留消息\n */\n clearRetainMessages(type?: EventNames | string) {\n if (type) {\n this.retainedMessages.delete(type as string);\n } else {\n this.retainedMessages.clear();\n }\n }\n\n /**\n * 同步触发事件\n *\n * 支持两种调用方式:\n * emit(type, payload, retain?)\n * emit({ type, payload }, retain?)\n */\n public emit<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): R[];\n public emit<R = any>(message: { type: keyof AllEvents }, retain?: boolean): R[];\n public emit<R = any>(message: FastEventMessage, retain?: boolean): R[];\n public emit(): any {\n const [message, args] = parseLiteEmitArgs(arguments);\n\n const parts = message.type.split(this._delimiter);\n if (args.retain) {\n this.retainedMessages.set(message.type, message);\n }\n\n const nodes: FastEventListenerNode[] = [];\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n\n // 触发时进行消息转换\n if (isFunction(this._options.transform)) {\n const transformed = this._options.transform.call(this, message as any);\n if (transformed !== message) {\n message.payload = transformed;\n args.rawEventType = message.type;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n }\n }\n\n // 执行监听器\n const results: any[] = [];\n results.push(...this._executeListeners(nodes, message, args));\n\n // 展开 expandable 结果\n if (this._options.expandEmitResults) {\n expandEmitResults(results);\n }\n return results;\n }\n\n /**\n * 异步触发事件(使用 Promise.allSettled,等待所有异步监听器完成)\n */\n public async emitAsync<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<AllEvents, any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: { type: keyof AllEvents },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(): Promise<(R | Error)[]> {\n const results = await Promise.allSettled(\n this.emit.apply(this, arguments as any),\n );\n return getPromiseResults(results);\n }\n\n}\n"]} |
| 'use strict';var L=Object.defineProperty;var _=(a,e,t)=>e in a?L(a,e,{enumerable:true,configurable:true,writable:true,value:t}):a[e]=t;var d=(a,e,t)=>_(a,typeof e!="symbol"?e+"":e,t);function v(a,e){let t=a.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let n=0;n<s-1;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}for(let n=0;n<t;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}function c(a,e){let t=[];for(let s=a.length-1;s>=0;s--)e(a[s])&&(t.push(s),a.splice(s,1));return t.reverse()}function u(a){return a&&typeof a=="function"}var F=Symbol.for("__expandable__");function f(a){return a&&a[F]}function y(a){for(let e=0;e<a.length;e++){let t=a[e];Array.isArray(t)&&f(t)&&(a.splice(e,1,...t),e+=t.length-1);}return a}function m(a,e){return a.catch(t=>(e&&e(t),Promise.resolve(t)))}function g(a){return a.map(e=>e.status==="fulfilled"?e.value:e.reason)}function b(a){let e={},t={};return typeof a[0]=="object"?(Object.assign(e,a[0]),t=typeof a[1]=="boolean"?{retain:a[1]}:{}):(e.type=a[0],e.payload=a[1],t=typeof a[2]=="boolean"?{retain:a[2]}:{}),[e,t]}var h=class{constructor(e){d(this,"__FastLiteEvent__",true);d(this,"listeners",{__listeners:[]});d(this,"_options");d(this,"_delimiter","/");d(this,"retainedMessages",new Map);d(this,"listenerCount",0);this._options=Object.assign({id:Math.random().toString(36).substring(2),delimiter:"/",ignoreErrors:true,expandEmitResults:true},this._initOptions(e)),this._delimiter=this._options.delimiter;}get options(){return this._options}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastLiteEvent"}_initOptions(e){return e}_addListener(e,t,s){let n=0;return [this._forEachNodes(e,r=>{let o=[t,s.count,0,s.tag,s.flags];r.__listeners.push(o),n=r.__listeners.length-1,this.listenerCount++;}),n]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let n=0;n<e.length;n++){let i=e[n];if(i in s||(s[i]={__listeners:[]}),n===e.length-1){let r=s[i];return t(r,s),r}else s=s[i];}}_removeListener(e,t,s){s&&c(e.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let i=n===s;return i&&this.listenerCount--,i});}on(e,t,s){if(e.length===0)throw new Error("event cannot be empty");let n=Object.assign({count:0,flags:0},s),i=e.split(this._delimiter),[r,o]=this._addListener(i,t,n),l=()=>r&&this._removeListener(r,i,t);return this._emitRetainMessage(e,r,o),{off:l,listener:t,[Symbol.dispose](){l();}}}once(e,t,s){return this.on(e,t,Object.assign({},s,{count:1}))}onAny(e,t){return this.on("**",e,t)}off(){let e=arguments,t=u(e[0])?void 0:e[0],s=u(e[0])?e[0]:e[1],n=t?t.split(this._delimiter):[],i=t?t.includes("*"):false;if(t&&!i)this._traverseToPath(this.listeners,n,r=>{s?this._removeListener(r,n,s):t&&(r.__listeners=[]);});else {let r=i?[]:n;this._traverseListeners(this.listeners,r,(o,l)=>{(s!==void 0||i&&v(o,n))&&(s?this._removeListener(l,n,s):l.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(n,i)=>{s+=i.__listeners.length,i.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(e);}else {let t=0;this._traverseListeners(this.listeners,[],(s,n)=>{t+=n.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let n=[];if(e.includes("*")){let i=e.split(this._delimiter);this.retainedMessages.forEach((r,o)=>{let l=o.split(this._delimiter);v(l,i)&&n.push(r);});}else this.retainedMessages.has(e)&&n.push(this.retainedMessages.get(e));t&&n.forEach(i=>{this._executeListeners([t],i,{},r=>r[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,n=0,i){if(n>=t.length){s(e);return}let r=t[n];if(i===true){this._traverseToPath(e,t,s,n+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,n+1),"**"in e&&this._traverseToPath(e["**"],t,s,n+1,true),r in e&&this._traverseToPath(e[r],t,s,n+1);}_traverseListeners(e,t,s){let n=e;t&&t.length>0&&this._traverseToPath(e,t,r=>{n=r;});let i=(r,o,l)=>{o(l,r);for(let[p,E]of Object.entries(r))p.startsWith("__")||E&&i(E,o,[...l,p]);};i(n,s,[]);}_onListenerError(e,t,s,n){if(n instanceof Error&&(n._emitter=`${e.name||"anonymous"}:${t.type}`),this._options.ignoreErrors)return n;throw n}_executeListener(e,t,s,n=false){let i=e[0];try{let r=((s?.flags||0)&1)>0,o=i.call(this,r?t.payload:t,s);return n&&o&&o instanceof Promise&&(o=m(o,l=>this._onListenerError(i,t,s,l))),o}catch(r){return this._onListenerError(i,t,s,r)}}_executeListeners(e,t,s,n){if(!e||e.length===0)return [];let i=[];for(let r of e){let o=0;for(let l of r.__listeners)(!n||n(l,r))&&i.push([l,o++,r.__listeners]);}return this._decListenerExecCount(i),i.map(r=>this._executeListener(r[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,i=>{t.push(i);});let n=[];return t.map(i=>{n.push(...i.__listeners);}),n}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=b(arguments),s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let n=[];if(this._traverseToPath(this.listeners,s,r=>{n.push(r);}),u(this._options.transform)){let r=this._options.transform.call(this,e);r!==e&&(e.payload=r,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}let i=[];return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&y(i),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return g(e)}};exports.FastLiteEvent=h;//# sourceMappingURL=liteEvent.js.map | ||
| //# sourceMappingURL=liteEvent.js.map |
| {"version":3,"sources":["../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/utils/isFunction.ts","../src/utils/expandable.ts","../src/utils/expandEmitResults.ts","../src/utils/tryReturnError.ts","../src/utils/getPromiseResults.ts","../src/liteEvent.ts"],"names":["isPathMatched","path","pattern","pathLen","patternLen","i","removeItem","arr","condition","removedIndices","isFunction","fn","__expandable__","isExpandable","value","expandEmitResults","items","item","tryReturnError","callback","e","getPromiseResults","results","result","parseLiteEmitArgs","args","message","emitArgs","FastLiteEvent","options","__publicField","initial","parts","listener","index","node","newListener","current","part","isRemove","type","finalOptions","off","hasWildcard","entryParts","entry","count","_path","prefix","key","listenerNode","messages","patterns","t","listenerMeta","lastFollowing","entryNode","n","traverseNodes","parentPath","childNode","_args","catchErrors","listenerFn","isTransformed","nodes","filter","listeners","meta","transformed"],"mappings":"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","file":"liteEvent.js","sourcesContent":["/**\n *\n * 判断path是否与pattern匹配\n *\n * isPathMatched(\"a.b.c\",\"a.b.c\") == true\n * isPathMatched(\"a.b.c\",\"a.b.*\") == true\n * isPathMatched(\"a.b.c\",\"a.*.*\") == true\n * isPathMatched(\"a.b.c\",\"*.*.*\") == true\n * isPathMatched(\"a.b.c\",\".b.*\") == true\n * isPathMatched(\"a.b.c.d\",\"a.**\") == true\n *\n * - '**' 匹配后续的\n * - '*' 匹配任意数量的字符,包括零个字符\n *\n * @param path\n * @param pattern\n */\nexport function isPathMatched(path: string[], pattern: string[]): boolean {\n const pathLen = path.length;\n const patternLen = pattern.length;\n\n // 快速失败: 长度不匹配(除非以 ** 结尾)\n if (pathLen !== patternLen && (patternLen === 0 || pattern[patternLen - 1] !== '**')) {\n return false;\n }\n\n // 处理 ** 通配符: 直接检查前缀匹配\n if (patternLen > 0 && pattern[patternLen - 1] === '**') {\n // 检查前 n-1 个元素是否匹配\n for (let i = 0; i < patternLen - 1; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n return true;\n }\n\n // 普通匹配: 逐元素比较\n for (let i = 0; i < pathLen; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n// export function isPathMatched(path:string[],pattern:string[]):boolean{\n// if(path.length !== pattern.length && (path.length>0 && pattern[pattern.length-1]!=='**') ){\n// return false;\n// }\n// let fPattern = [...pattern]\n// if(pattern.length >0 && pattern[pattern.length-1] === '**'){\n// fPattern.splice(pattern.length-1,1,...Array.from<string>({\n// length: path.length-pattern.length+1\n// }).fill('*'))\n// }\n// for(let i=0;i<path.length;i++){\n// if(fPattern[i]==='*'){\n// continue\n// }\n// if(fPattern[i]!==path[i]){\n// return false\n// }\n// }\n// return true\n// }\n","/**\n * 从数组中移除满足条件的元素并返回被移除元素的索引\n * @param {any[]} arr - 需要操作的数组\n * @param {(item: any) => boolean} condition - 判断元素是否应该被移除的条件函数\n * @returns {number[]} 被移除元素在原数组中的索引集合\n */\nexport function removeItem(arr: any[], condition: (item: any) => boolean) {\n const removedIndices: number[] = [];\n // 从后往前遍历,避免删除元素时索引变化的问题\n for (let i = arr.length - 1; i >= 0; i--) {\n if (condition(arr[i])) {\n removedIndices.push(i); // 记录原始索引\n arr.splice(i, 1); // 删除元素\n }\n }\n\n // 因为是从后往前遍历的,所以索引是降序的,需要反转得到升序结果\n return removedIndices.reverse();\n}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\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 { isExpandable } from \"./expandable\";\n/**\n * \n * 判断成员isExpandable,如果是则说明是一个数组,则原地展开\n * \n * \n */\nexport function expandEmitResults(items: any[]): any[] {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (Array.isArray(item) && isExpandable(item)) {\n items.splice(i, 1, ...item)\n i += item.length - 1\n }\n }\n return items\n\n}\n\n\n// import { expandable } from \"./expandable\";\n// const items = [1, 2, expandable([3, 4]), 0, 0, expandable([5, 6]), expandable([7, 8]), 9, 10, 11]\n// // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n// expandEmitResults(items)\n// console.log(items)","\n\n/**\n * 包装 Promise,将 catch 的错误转换为正常返回值\n * @param fn 需要包装的 Promise\n * @returns 包装后的 Promise,如果发生错误则返回错误对象\n */\nexport function tryReturnError(fn: Promise<any>, callback?: (e: any) => any): Promise<any> {\n return fn.catch((e) => {\n if (callback) callback(e)\n return Promise.resolve(e)\n })\n}\n","export function getPromiseResults(results: any[]) {\n return results.map((result) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n } else {\n return result.reason;\n }\n });\n}\n","/**\n * FastLiteEvent 轻量级事件发射器\n *\n * 从 FastEvent 派生的精简版本,移除了以下高级特性:\n * scope / hook / meta / pipe / executor / 异步迭代 / context\n * debug / abortSignal / 订阅时的 filter+off / 监听优先级 prepend\n *\n * 仅保留核心的事件收发能力:on / once / onAny / off / offAll / clear /\n * emit / emitAsync / waitFor / getListeners / clearRetainMessages,以及通配符\n * (* / **)、retain 保留事件、count / tag / flags、ignoreErrors、transform\n * 消息转换、expandEmitResults 等基础特性。\n *\n * 类型与 FastEvent 同源派生(Omit / 复用),监听器、消息、订阅者与 FastEvent\n * 双向兼容——同一监听器函数可同时挂到 FastEvent 与 FastLiteEvent 上。\n */\nimport {\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n Expand,\n Fallback,\n ReplaceWildcard,\n UnTransformedEvents,\n FastEventMessage,\n TypedFastEventMessage,\n FastEventEmitMessage,\n FastListeners,\n FastEventListenerNode,\n FastEventListenerMeta,\n FastEventCommonListener,\n FastEventSubscriber,\n FastEventOptions,\n FastEventListenOptions,\n FastEventListenerArgs,\n FastEvents,\n FastEventListenerFlags,\n IsTransformedEvent,\n ExtendWildcardEvents,\n PayloadValues,\n PickPayload,\n ValueOf,\n GetPayload,\n} from \"./types\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { isPathMatched } from \"./utils/isPathMatched\";\nimport { removeItem } from \"./utils/removeItem\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { expandEmitResults } from \"./utils/expandEmitResults\";\nimport { tryReturnError } from \"./utils/tryReturnError\";\nimport { getPromiseResults } from \"./utils/getPromiseResults\";\n\n// —— 从原始类型 Omit 派生:剥离被移除特性对应的字段 ——\nexport type FastLiteMessage<T extends string = string, P = any> = Omit<\n FastEventMessage<T, P>,\n \"meta\"\n>;\n\nexport type FastLiteListenerArgs = Omit<\n FastEventListenerArgs,\n \"meta\" | \"executor\" | \"parseArgs\" | \"abortSignal\"\n>;\n\nexport type FastLiteListenOptions<\n Events extends Record<string, any> = Record<string, any>,\n> = Omit<FastEventListenOptions<Events>, \"pipes\" | \"iterable\" | \"filter\" | \"off\" | \"prepend\">;\n\nexport type FastLiteEventOptions = Omit<\n FastEventOptions,\n | \"context\"\n | \"meta\"\n | \"executor\"\n | \"debug\"\n | \"onAddBeforeListener\"\n | \"onAddAfterListener\"\n | \"onRemoveListener\"\n | \"onClearListeners\"\n | \"onListenerError\"\n | \"onBeforeExecuteListener\"\n | \"onAfterExecuteListener\"\n>;\n\n// —— 完全复用原始类型(与 FastEvent 互换兼容)——\nexport type FastLiteSubscriber = FastEventSubscriber;\nexport type FastLiteListener<\n T extends string = string,\n P = any,\n> = FastEventCommonListener<FastLiteMessage<T, P>, any, any>;\n\n/**\n * 解析 emit 参数(简化版,不复用 parseEmitArgs)\n *\n * 仅支持两种形态:\n * (type, payload, retain?)\n * (message, retain?)\n *\n * @param args - emit 的 arguments\n * @returns [消息, 监听器参数]\n */\nfunction parseLiteEmitArgs(\n args: IArguments,\n): [TypedFastEventMessage, FastLiteListenerArgs] {\n let message = {} as TypedFastEventMessage;\n let emitArgs: FastLiteListenerArgs = {};\n if (typeof args[0] === \"object\") {\n Object.assign(message, args[0]);\n emitArgs = typeof args[1] === \"boolean\" ? { retain: args[1] } : {};\n } else {\n message.type = args[0] as any;\n message.payload = args[1] as any;\n emitArgs = typeof args[2] === \"boolean\" ? { retain: args[2] } : {};\n }\n return [message, emitArgs];\n}\n\n/**\n * FastLiteEvent 轻量级事件发射器类\n *\n * @template Events - 事件类型定义,继承自 FastEvents 接口\n */\nexport class FastLiteEvent<\n Events extends Record<string, any> = Record<string, any>,\n AllEvents extends Record<string, any> = Expand<Events & FastEvents>,\n Types extends keyof AllEvents = KeyOf<AllEvents>,\n EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>,\n> {\n __FastLiteEvent__: boolean = true;\n\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = {\n __listeners: [],\n } as unknown as FastListeners;\n\n /** 事件发射器的配置选项 */\n private _options: FastLiteEventOptions;\n\n /** 事件名称的分隔符,默认为 '/' */\n private _delimiter: string = \"/\";\n\n /** 保留的事件消息映射,Key 是事件名称,Value 是保留的事件消息 */\n retainedMessages: Map<string, any> = new Map<string, any>();\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0;\n\n /**\n * 创建 FastLiteEvent 实例\n * @param options - 事件发射器的配置选项\n *\n * 默认配置:\n * - id: 随机字符串 - 实例唯一标识符\n * - delimiter: '/' - 事件名称分隔符\n * - ignoreErrors: true - 是否忽略监听器执行错误\n * - expandEmitResults: true - 是否展开 emit 返回值\n */\n constructor(options?: Partial<FastLiteEventOptions>) {\n this._options = Object.assign(\n {\n id: Math.random().toString(36).substring(2),\n delimiter: \"/\",\n ignoreErrors: true,\n expandEmitResults: true,\n },\n this._initOptions(options),\n ) as unknown as FastLiteEventOptions;\n this._delimiter = this._options.delimiter!;\n }\n\n /** 获取事件发射器的配置选项 */\n get options() {\n return this._options;\n }\n /** 获取事件发射器的唯一标识符 */\n get id() {\n return this._options.id!;\n }\n /** 获取事件发射器的标题 */\n get title() {\n return this._options.title || this.id || \"FastLiteEvent\";\n }\n\n /**\n * 初始化选项(供子类重载)\n * @param initial - 可选的初始选项\n */\n _initOptions(initial?: Partial<FastLiteEventOptions>) {\n return initial;\n }\n\n /**\n * 添加事件监听器到事件树(仅尾插,已移除 prepend 插队)\n * @param parts - 事件路径数组\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns [节点, 监听器索引]\n */\n private _addListener(\n parts: string[],\n listener: Function,\n options: { count: number; tag?: string; flags?: number },\n ): [FastEventListenerNode | undefined, number] {\n let index: number = 0;\n const node = this._forEachNodes(parts, (node) => {\n const newListener = [\n listener,\n options.count,\n 0,\n options.tag,\n options.flags,\n ] as unknown as FastEventListenerMeta;\n node.__listeners.push(newListener);\n index = node.__listeners.length - 1;\n this.listenerCount++;\n });\n return [node, index];\n }\n\n /**\n * 根据 parts 路径遍历监听器树,并在最后的节点上执行回调\n */\n private _forEachNodes(\n parts: string[],\n callback: (node: FastEventListenerNode, parent: FastEventListenerNode) => void,\n ): FastEventListenerNode | undefined {\n if (parts.length === 0) return;\n let current = this.listeners;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {\n __listeners: [],\n } as unknown as FastListeners;\n }\n if (i === parts.length - 1) {\n const node = current[part];\n callback(node, current);\n return node;\n } else {\n current = current[part];\n }\n }\n return undefined;\n }\n\n /**\n * 从监听器节点中移除指定的事件监听器\n */\n private _removeListener(\n node: FastEventListenerNode,\n path: string[],\n listener: Function,\n ): void {\n if (!listener) return;\n removeItem(node.__listeners, (item: any) => {\n item = Array.isArray(item) ? item[0] : item;\n const isRemove = item === listener;\n if (isRemove) this.listenerCount--;\n return isRemove;\n });\n }\n\n /**\n * 注册事件监听器\n * @param type - 事件类型,支持普通字符串、通配符(user/*)、全局监听(**)\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns 订阅者对象,包含 off 方法用于取消监听\n */\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n if (type.length === 0) throw new Error(\"event cannot be empty\");\n const finalOptions = Object.assign(\n { count: 0, flags: 0 },\n options,\n ) as Required<FastLiteListenOptions> & { count: number; flags: number };\n\n const parts = type.split(this._delimiter);\n const [node, index] = this._addListener(parts, listener as any, finalOptions);\n const off = () => node && this._removeListener(node, parts, listener as any);\n\n // 触发监听器保留消息(retain)\n this._emitRetainMessage(type, node, index);\n\n return {\n off,\n listener: listener as any,\n [Symbol.dispose]() {\n off();\n },\n };\n }\n\n /**\n * 注册一次性事件监听器(触发一次后自动注销)\n */\n public once<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(type, listener, Object.assign({}, options, { count: 1 }));\n }\n\n /**\n * 注册一个监听所有事件的监听器(等同 on('**', listener))\n */\n public onAny(\n listener: FastEventCommonListener<MutableMessage<AllEvents, any>, any, any>,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(\"**\", listener as any, options as any) as FastEventSubscriber;\n }\n\n /**\n * 移除事件监听器\n */\n off(listener: Function): void;\n off(type: string, listener: Function): void;\n off(type: Types): void;\n off(type: string): void;\n off() {\n const args = arguments;\n const type = isFunction(args[0]) ? undefined : args[0];\n const listener = isFunction(args[0]) ? args[0] : args[1];\n const parts = type ? type.split(this._delimiter) : [];\n const hasWildcard = type ? type.includes(\"*\") : false;\n if (type && !hasWildcard) {\n this._traverseToPath(this.listeners, parts, (node) => {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else if (type) {\n node.__listeners = [];\n }\n });\n } else {\n const entryParts: string[] = hasWildcard ? [] : parts;\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else {\n node.__listeners = [];\n }\n }\n });\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,提供则只移除该前缀下的监听器\n */\n offAll(entry?: string) {\n if (entry) {\n const parts = entry.split(this._delimiter);\n let count = 0;\n this._traverseListeners(this.listeners, parts, (_path, node) => {\n count += node.__listeners.length;\n node.__listeners = [];\n });\n this.listenerCount -= count;\n this._removeRetainedEvents(entry);\n } else {\n let count = 0;\n this._traverseListeners(this.listeners, [], (_path, node) => {\n count += node.__listeners.length;\n });\n this.listenerCount -= count;\n this.retainedMessages.clear();\n this.listeners = { __listeners: [] } as unknown as FastListeners;\n }\n }\n\n /**\n * 移除保留的事件\n */\n private _removeRetainedEvents(prefix?: string) {\n if (!prefix) this.retainedMessages.clear();\n if (prefix?.endsWith(this._delimiter)) {\n prefix += this._delimiter;\n }\n this.retainedMessages.delete(prefix!);\n for (let key of this.retainedMessages.keys()) {\n if (key.startsWith(prefix!)) {\n this.retainedMessages.delete(key);\n }\n }\n }\n\n /**\n * 清除所有事件或指定前缀的事件(含保留消息)\n */\n clear(prefix?: string) {\n this.offAll(prefix);\n this._removeRetainedEvents(prefix);\n }\n\n /**\n * 发送最后一次事件的消息给对应的监听器(用于 retain)\n */\n private _emitRetainMessage(\n type: string,\n listenerNode: FastEventListenerNode | undefined,\n index: number,\n ) {\n let messages = [] as TypedFastEventMessage[];\n if (type.includes(\"*\")) {\n const patterns = type.split(this._delimiter);\n this.retainedMessages.forEach((message, t) => {\n const parts = t.split(this._delimiter);\n if (isPathMatched(parts, patterns)) {\n messages.push(message);\n }\n });\n } else if (this.retainedMessages.has(type)) {\n messages.push(this.retainedMessages.get(type));\n }\n if (listenerNode) {\n messages.forEach((message) => {\n this._executeListeners([listenerNode], message, {}, (listenerMeta) => {\n return listenerMeta[0] === listenerNode.__listeners[index][0];\n });\n });\n }\n }\n\n /**\n * 遍历监听器节点树,支持三种匹配模式:精确 / 单层通配 * / 多层通配 **\n */\n private _traverseToPath(\n node: FastEventListenerNode,\n parts: string[],\n callback: (node: FastEventListenerNode) => void,\n index: number = 0,\n lastFollowing?: boolean,\n ): void {\n if (index >= parts.length) {\n callback(node);\n return;\n }\n const part = parts[index];\n if (lastFollowing === true) {\n this._traverseToPath(node, parts, callback, index + 1, true);\n return;\n }\n if (\"*\" in node) {\n this._traverseToPath(node[\"*\"], parts, callback, index + 1);\n }\n if (\"**\" in node) {\n this._traverseToPath(node[\"**\"], parts, callback, index + 1, true);\n }\n if (part in node) {\n this._traverseToPath(node[part], parts, callback, index + 1);\n }\n }\n\n private _traverseListeners(\n node: FastEventListenerNode,\n entry: string[],\n callback: (path: string[], node: FastEventListenerNode) => void,\n ): void {\n let entryNode: FastEventListenerNode = node;\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (n) => {\n entryNode = n;\n });\n }\n const traverseNodes = (\n node: FastEventListenerNode,\n callback: (path: string[], node: FastEventListenerNode) => void,\n parentPath: string[],\n ) => {\n callback(parentPath, node);\n for (let [key, childNode] of Object.entries(node)) {\n if (key.startsWith(\"__\")) continue;\n if (childNode) {\n traverseNodes(childNode as FastEventListenerNode, callback, [\n ...parentPath,\n key,\n ]);\n }\n }\n };\n traverseNodes(entryNode, callback, []);\n }\n\n /**\n * 监听器执行出错处理(移除了 ListenerError hook)\n */\n private _onListenerError(\n listener: Function,\n message: TypedFastEventMessage,\n _args: FastLiteListenerArgs | undefined,\n e: any,\n ) {\n if (e instanceof Error) {\n // @ts-ignore\n e._emitter = `${listener.name || \"anonymous\"}:${message.type}`;\n }\n if (this._options.ignoreErrors) {\n return e;\n } else {\n throw e;\n }\n }\n\n /**\n * 执行单个监听器函数(移除了 debug / abortSignal 分支,this 指向实例)\n */\n private _executeListener(\n listener: FastEventListenerMeta,\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs | undefined,\n catchErrors: boolean = false,\n ): Promise<any> | any {\n const listenerFn = listener[0];\n try {\n const isTransformed =\n ((args?.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n let result = listenerFn.call(\n this,\n isTransformed ? message.payload : message,\n args!,\n );\n // 自动处理 reject Promise\n if (catchErrors && result && result instanceof Promise) {\n result = tryReturnError(result, (e) =>\n this._onListenerError(listenerFn, message, args, e),\n );\n }\n return result;\n } catch (e: any) {\n return this._onListenerError(listenerFn, message, args, e);\n }\n }\n\n /**\n * 执行监听器节点列表中的所有监听器(移除了 executor,退化为同步顺序执行)\n */\n private _executeListeners(\n nodes: FastEventListenerNode[],\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs,\n filter?: (listener: FastEventListenerMeta, node: FastEventListenerNode) => boolean,\n ): any[] {\n if (!nodes || nodes.length === 0) return [];\n const listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][] = [];\n for (const node of nodes) {\n let i: number = 0;\n for (const listener of node.__listeners) {\n if (!filter || filter(listener, node)) {\n listeners.push([listener, i++, node.__listeners]);\n }\n }\n }\n // 执行监听器前计数先减一,避免在监听器中再次触发导致重复执行\n this._decListenerExecCount(listeners);\n return listeners.map((listener) => {\n return this._executeListener(listener[0], message, args, true);\n });\n }\n\n /**\n * 减少侦听器的执行次数(达到 count 限制时移除)\n */\n _decListenerExecCount(\n listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][],\n ) {\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastEventListenerMeta;\n meta[2]++; // 实际执行的次数\n // count > 0 时代表执行次数限制\n if (meta[1] > 0 && meta[1] <= meta[2]) {\n listeners[i][2].splice(i, 1);\n }\n }\n }\n\n /**\n * 获取指定类型的所有事件监听器\n */\n getListeners(type: string): FastEventListenerMeta[] {\n const nodes: FastEventListenerNode[] = [];\n const parts = type.split(this._delimiter);\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n const listeners: any[] = [];\n nodes.map((node) => {\n listeners.push(...node.__listeners);\n });\n return listeners;\n }\n\n /**\n * 清除所有事件或指定事件的保留消息\n */\n clearRetainMessages(type?: EventNames | string) {\n if (type) {\n this.retainedMessages.delete(type as string);\n } else {\n this.retainedMessages.clear();\n }\n }\n\n /**\n * 同步触发事件\n *\n * 支持两种调用方式:\n * emit(type, payload, retain?)\n * emit({ type, payload }, retain?)\n */\n public emit<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): R[];\n public emit<R = any>(message: { type: keyof AllEvents }, retain?: boolean): R[];\n public emit<R = any>(message: FastEventMessage, retain?: boolean): R[];\n public emit(): any {\n const [message, args] = parseLiteEmitArgs(arguments);\n\n const parts = message.type.split(this._delimiter);\n if (args.retain) {\n this.retainedMessages.set(message.type, message);\n }\n\n const nodes: FastEventListenerNode[] = [];\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n\n // 触发时进行消息转换\n if (isFunction(this._options.transform)) {\n const transformed = this._options.transform.call(this, message as any);\n if (transformed !== message) {\n message.payload = transformed;\n args.rawEventType = message.type;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n }\n }\n\n // 执行监听器\n const results: any[] = [];\n results.push(...this._executeListeners(nodes, message, args));\n\n // 展开 expandable 结果\n if (this._options.expandEmitResults) {\n expandEmitResults(results);\n }\n return results;\n }\n\n /**\n * 异步触发事件(使用 Promise.allSettled,等待所有异步监听器完成)\n */\n public async emitAsync<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<AllEvents, any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: { type: keyof AllEvents },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(): Promise<(R | Error)[]> {\n const results = await Promise.allSettled(\n this.emit.apply(this, arguments as any),\n );\n return getPromiseResults(results);\n }\n\n}\n"]} |
| var L=Object.defineProperty;var _=(a,e,t)=>e in a?L(a,e,{enumerable:true,configurable:true,writable:true,value:t}):a[e]=t;var d=(a,e,t)=>_(a,typeof e!="symbol"?e+"":e,t);function v(a,e){let t=a.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let n=0;n<s-1;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}for(let n=0;n<t;n++)if(e[n]!=="*"&&e[n]!==a[n])return false;return true}function c(a,e){let t=[];for(let s=a.length-1;s>=0;s--)e(a[s])&&(t.push(s),a.splice(s,1));return t.reverse()}function u(a){return a&&typeof a=="function"}var F=Symbol.for("__expandable__");function f(a){return a&&a[F]}function y(a){for(let e=0;e<a.length;e++){let t=a[e];Array.isArray(t)&&f(t)&&(a.splice(e,1,...t),e+=t.length-1);}return a}function m(a,e){return a.catch(t=>(e&&e(t),Promise.resolve(t)))}function g(a){return a.map(e=>e.status==="fulfilled"?e.value:e.reason)}function b(a){let e={},t={};return typeof a[0]=="object"?(Object.assign(e,a[0]),t=typeof a[1]=="boolean"?{retain:a[1]}:{}):(e.type=a[0],e.payload=a[1],t=typeof a[2]=="boolean"?{retain:a[2]}:{}),[e,t]}var h=class{constructor(e){d(this,"__FastLiteEvent__",true);d(this,"listeners",{__listeners:[]});d(this,"_options");d(this,"_delimiter","/");d(this,"retainedMessages",new Map);d(this,"listenerCount",0);this._options=Object.assign({id:Math.random().toString(36).substring(2),delimiter:"/",ignoreErrors:true,expandEmitResults:true},this._initOptions(e)),this._delimiter=this._options.delimiter;}get options(){return this._options}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastLiteEvent"}_initOptions(e){return e}_addListener(e,t,s){let n=0;return [this._forEachNodes(e,r=>{let o=[t,s.count,0,s.tag,s.flags];r.__listeners.push(o),n=r.__listeners.length-1,this.listenerCount++;}),n]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let n=0;n<e.length;n++){let i=e[n];if(i in s||(s[i]={__listeners:[]}),n===e.length-1){let r=s[i];return t(r,s),r}else s=s[i];}}_removeListener(e,t,s){s&&c(e.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let i=n===s;return i&&this.listenerCount--,i});}on(e,t,s){if(e.length===0)throw new Error("event cannot be empty");let n=Object.assign({count:0,flags:0},s),i=e.split(this._delimiter),[r,o]=this._addListener(i,t,n),l=()=>r&&this._removeListener(r,i,t);return this._emitRetainMessage(e,r,o),{off:l,listener:t,[Symbol.dispose](){l();}}}once(e,t,s){return this.on(e,t,Object.assign({},s,{count:1}))}onAny(e,t){return this.on("**",e,t)}off(){let e=arguments,t=u(e[0])?void 0:e[0],s=u(e[0])?e[0]:e[1],n=t?t.split(this._delimiter):[],i=t?t.includes("*"):false;if(t&&!i)this._traverseToPath(this.listeners,n,r=>{s?this._removeListener(r,n,s):t&&(r.__listeners=[]);});else {let r=i?[]:n;this._traverseListeners(this.listeners,r,(o,l)=>{(s!==void 0||i&&v(o,n))&&(s?this._removeListener(l,n,s):l.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(n,i)=>{s+=i.__listeners.length,i.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(e);}else {let t=0;this._traverseListeners(this.listeners,[],(s,n)=>{t+=n.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let n=[];if(e.includes("*")){let i=e.split(this._delimiter);this.retainedMessages.forEach((r,o)=>{let l=o.split(this._delimiter);v(l,i)&&n.push(r);});}else this.retainedMessages.has(e)&&n.push(this.retainedMessages.get(e));t&&n.forEach(i=>{this._executeListeners([t],i,{},r=>r[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,n=0,i){if(n>=t.length){s(e);return}let r=t[n];if(i===true){this._traverseToPath(e,t,s,n+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,n+1),"**"in e&&this._traverseToPath(e["**"],t,s,n+1,true),r in e&&this._traverseToPath(e[r],t,s,n+1);}_traverseListeners(e,t,s){let n=e;t&&t.length>0&&this._traverseToPath(e,t,r=>{n=r;});let i=(r,o,l)=>{o(l,r);for(let[p,E]of Object.entries(r))p.startsWith("__")||E&&i(E,o,[...l,p]);};i(n,s,[]);}_onListenerError(e,t,s,n){if(n instanceof Error&&(n._emitter=`${e.name||"anonymous"}:${t.type}`),this._options.ignoreErrors)return n;throw n}_executeListener(e,t,s,n=false){let i=e[0];try{let r=((s?.flags||0)&1)>0,o=i.call(this,r?t.payload:t,s);return n&&o&&o instanceof Promise&&(o=m(o,l=>this._onListenerError(i,t,s,l))),o}catch(r){return this._onListenerError(i,t,s,r)}}_executeListeners(e,t,s,n){if(!e||e.length===0)return [];let i=[];for(let r of e){let o=0;for(let l of r.__listeners)(!n||n(l,r))&&i.push([l,o++,r.__listeners]);}return this._decListenerExecCount(i),i.map(r=>this._executeListener(r[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,i=>{t.push(i);});let n=[];return t.map(i=>{n.push(...i.__listeners);}),n}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=b(arguments),s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let n=[];if(this._traverseToPath(this.listeners,s,r=>{n.push(r);}),u(this._options.transform)){let r=this._options.transform.call(this,e);r!==e&&(e.payload=r,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}let i=[];return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&y(i),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return g(e)}};export{h as FastLiteEvent};//# sourceMappingURL=liteEvent.mjs.map | ||
| //# sourceMappingURL=liteEvent.mjs.map |
| {"version":3,"sources":["../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/utils/isFunction.ts","../src/utils/expandable.ts","../src/utils/expandEmitResults.ts","../src/utils/tryReturnError.ts","../src/utils/getPromiseResults.ts","../src/liteEvent.ts"],"names":["isPathMatched","path","pattern","pathLen","patternLen","i","removeItem","arr","condition","removedIndices","isFunction","fn","__expandable__","isExpandable","value","expandEmitResults","items","item","tryReturnError","callback","e","getPromiseResults","results","result","parseLiteEmitArgs","args","message","emitArgs","FastLiteEvent","options","__publicField","initial","parts","listener","index","node","newListener","current","part","isRemove","type","finalOptions","off","hasWildcard","entryParts","entry","count","_path","prefix","key","listenerNode","messages","patterns","t","listenerMeta","lastFollowing","entryNode","n","traverseNodes","parentPath","childNode","_args","catchErrors","listenerFn","isTransformed","nodes","filter","listeners","meta","transformed"],"mappings":"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","file":"liteEvent.mjs","sourcesContent":["/**\n *\n * 判断path是否与pattern匹配\n *\n * isPathMatched(\"a.b.c\",\"a.b.c\") == true\n * isPathMatched(\"a.b.c\",\"a.b.*\") == true\n * isPathMatched(\"a.b.c\",\"a.*.*\") == true\n * isPathMatched(\"a.b.c\",\"*.*.*\") == true\n * isPathMatched(\"a.b.c\",\".b.*\") == true\n * isPathMatched(\"a.b.c.d\",\"a.**\") == true\n *\n * - '**' 匹配后续的\n * - '*' 匹配任意数量的字符,包括零个字符\n *\n * @param path\n * @param pattern\n */\nexport function isPathMatched(path: string[], pattern: string[]): boolean {\n const pathLen = path.length;\n const patternLen = pattern.length;\n\n // 快速失败: 长度不匹配(除非以 ** 结尾)\n if (pathLen !== patternLen && (patternLen === 0 || pattern[patternLen - 1] !== '**')) {\n return false;\n }\n\n // 处理 ** 通配符: 直接检查前缀匹配\n if (patternLen > 0 && pattern[patternLen - 1] === '**') {\n // 检查前 n-1 个元素是否匹配\n for (let i = 0; i < patternLen - 1; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n return true;\n }\n\n // 普通匹配: 逐元素比较\n for (let i = 0; i < pathLen; i++) {\n if (pattern[i] !== '*' && pattern[i] !== path[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n// export function isPathMatched(path:string[],pattern:string[]):boolean{\n// if(path.length !== pattern.length && (path.length>0 && pattern[pattern.length-1]!=='**') ){\n// return false;\n// }\n// let fPattern = [...pattern]\n// if(pattern.length >0 && pattern[pattern.length-1] === '**'){\n// fPattern.splice(pattern.length-1,1,...Array.from<string>({\n// length: path.length-pattern.length+1\n// }).fill('*'))\n// }\n// for(let i=0;i<path.length;i++){\n// if(fPattern[i]==='*'){\n// continue\n// }\n// if(fPattern[i]!==path[i]){\n// return false\n// }\n// }\n// return true\n// }\n","/**\n * 从数组中移除满足条件的元素并返回被移除元素的索引\n * @param {any[]} arr - 需要操作的数组\n * @param {(item: any) => boolean} condition - 判断元素是否应该被移除的条件函数\n * @returns {number[]} 被移除元素在原数组中的索引集合\n */\nexport function removeItem(arr: any[], condition: (item: any) => boolean) {\n const removedIndices: number[] = [];\n // 从后往前遍历,避免删除元素时索引变化的问题\n for (let i = arr.length - 1; i >= 0; i--) {\n if (condition(arr[i])) {\n removedIndices.push(i); // 记录原始索引\n arr.splice(i, 1); // 删除元素\n }\n }\n\n // 因为是从后往前遍历的,所以索引是降序的,需要反转得到升序结果\n return removedIndices.reverse();\n}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\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 { isExpandable } from \"./expandable\";\n/**\n * \n * 判断成员isExpandable,如果是则说明是一个数组,则原地展开\n * \n * \n */\nexport function expandEmitResults(items: any[]): any[] {\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (Array.isArray(item) && isExpandable(item)) {\n items.splice(i, 1, ...item)\n i += item.length - 1\n }\n }\n return items\n\n}\n\n\n// import { expandable } from \"./expandable\";\n// const items = [1, 2, expandable([3, 4]), 0, 0, expandable([5, 6]), expandable([7, 8]), 9, 10, 11]\n// // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n// expandEmitResults(items)\n// console.log(items)","\n\n/**\n * 包装 Promise,将 catch 的错误转换为正常返回值\n * @param fn 需要包装的 Promise\n * @returns 包装后的 Promise,如果发生错误则返回错误对象\n */\nexport function tryReturnError(fn: Promise<any>, callback?: (e: any) => any): Promise<any> {\n return fn.catch((e) => {\n if (callback) callback(e)\n return Promise.resolve(e)\n })\n}\n","export function getPromiseResults(results: any[]) {\n return results.map((result) => {\n if (result.status === \"fulfilled\") {\n return result.value;\n } else {\n return result.reason;\n }\n });\n}\n","/**\n * FastLiteEvent 轻量级事件发射器\n *\n * 从 FastEvent 派生的精简版本,移除了以下高级特性:\n * scope / hook / meta / pipe / executor / 异步迭代 / context\n * debug / abortSignal / 订阅时的 filter+off / 监听优先级 prepend\n *\n * 仅保留核心的事件收发能力:on / once / onAny / off / offAll / clear /\n * emit / emitAsync / waitFor / getListeners / clearRetainMessages,以及通配符\n * (* / **)、retain 保留事件、count / tag / flags、ignoreErrors、transform\n * 消息转换、expandEmitResults 等基础特性。\n *\n * 类型与 FastEvent 同源派生(Omit / 复用),监听器、消息、订阅者与 FastEvent\n * 双向兼容——同一监听器函数可同时挂到 FastEvent 与 FastLiteEvent 上。\n */\nimport {\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n Expand,\n Fallback,\n ReplaceWildcard,\n UnTransformedEvents,\n FastEventMessage,\n TypedFastEventMessage,\n FastEventEmitMessage,\n FastListeners,\n FastEventListenerNode,\n FastEventListenerMeta,\n FastEventCommonListener,\n FastEventSubscriber,\n FastEventOptions,\n FastEventListenOptions,\n FastEventListenerArgs,\n FastEvents,\n FastEventListenerFlags,\n IsTransformedEvent,\n ExtendWildcardEvents,\n PayloadValues,\n PickPayload,\n ValueOf,\n GetPayload,\n} from \"./types\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { isPathMatched } from \"./utils/isPathMatched\";\nimport { removeItem } from \"./utils/removeItem\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { expandEmitResults } from \"./utils/expandEmitResults\";\nimport { tryReturnError } from \"./utils/tryReturnError\";\nimport { getPromiseResults } from \"./utils/getPromiseResults\";\n\n// —— 从原始类型 Omit 派生:剥离被移除特性对应的字段 ——\nexport type FastLiteMessage<T extends string = string, P = any> = Omit<\n FastEventMessage<T, P>,\n \"meta\"\n>;\n\nexport type FastLiteListenerArgs = Omit<\n FastEventListenerArgs,\n \"meta\" | \"executor\" | \"parseArgs\" | \"abortSignal\"\n>;\n\nexport type FastLiteListenOptions<\n Events extends Record<string, any> = Record<string, any>,\n> = Omit<FastEventListenOptions<Events>, \"pipes\" | \"iterable\" | \"filter\" | \"off\" | \"prepend\">;\n\nexport type FastLiteEventOptions = Omit<\n FastEventOptions,\n | \"context\"\n | \"meta\"\n | \"executor\"\n | \"debug\"\n | \"onAddBeforeListener\"\n | \"onAddAfterListener\"\n | \"onRemoveListener\"\n | \"onClearListeners\"\n | \"onListenerError\"\n | \"onBeforeExecuteListener\"\n | \"onAfterExecuteListener\"\n>;\n\n// —— 完全复用原始类型(与 FastEvent 互换兼容)——\nexport type FastLiteSubscriber = FastEventSubscriber;\nexport type FastLiteListener<\n T extends string = string,\n P = any,\n> = FastEventCommonListener<FastLiteMessage<T, P>, any, any>;\n\n/**\n * 解析 emit 参数(简化版,不复用 parseEmitArgs)\n *\n * 仅支持两种形态:\n * (type, payload, retain?)\n * (message, retain?)\n *\n * @param args - emit 的 arguments\n * @returns [消息, 监听器参数]\n */\nfunction parseLiteEmitArgs(\n args: IArguments,\n): [TypedFastEventMessage, FastLiteListenerArgs] {\n let message = {} as TypedFastEventMessage;\n let emitArgs: FastLiteListenerArgs = {};\n if (typeof args[0] === \"object\") {\n Object.assign(message, args[0]);\n emitArgs = typeof args[1] === \"boolean\" ? { retain: args[1] } : {};\n } else {\n message.type = args[0] as any;\n message.payload = args[1] as any;\n emitArgs = typeof args[2] === \"boolean\" ? { retain: args[2] } : {};\n }\n return [message, emitArgs];\n}\n\n/**\n * FastLiteEvent 轻量级事件发射器类\n *\n * @template Events - 事件类型定义,继承自 FastEvents 接口\n */\nexport class FastLiteEvent<\n Events extends Record<string, any> = Record<string, any>,\n AllEvents extends Record<string, any> = Expand<Events & FastEvents>,\n Types extends keyof AllEvents = KeyOf<AllEvents>,\n EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>,\n> {\n __FastLiteEvent__: boolean = true;\n\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = {\n __listeners: [],\n } as unknown as FastListeners;\n\n /** 事件发射器的配置选项 */\n private _options: FastLiteEventOptions;\n\n /** 事件名称的分隔符,默认为 '/' */\n private _delimiter: string = \"/\";\n\n /** 保留的事件消息映射,Key 是事件名称,Value 是保留的事件消息 */\n retainedMessages: Map<string, any> = new Map<string, any>();\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0;\n\n /**\n * 创建 FastLiteEvent 实例\n * @param options - 事件发射器的配置选项\n *\n * 默认配置:\n * - id: 随机字符串 - 实例唯一标识符\n * - delimiter: '/' - 事件名称分隔符\n * - ignoreErrors: true - 是否忽略监听器执行错误\n * - expandEmitResults: true - 是否展开 emit 返回值\n */\n constructor(options?: Partial<FastLiteEventOptions>) {\n this._options = Object.assign(\n {\n id: Math.random().toString(36).substring(2),\n delimiter: \"/\",\n ignoreErrors: true,\n expandEmitResults: true,\n },\n this._initOptions(options),\n ) as unknown as FastLiteEventOptions;\n this._delimiter = this._options.delimiter!;\n }\n\n /** 获取事件发射器的配置选项 */\n get options() {\n return this._options;\n }\n /** 获取事件发射器的唯一标识符 */\n get id() {\n return this._options.id!;\n }\n /** 获取事件发射器的标题 */\n get title() {\n return this._options.title || this.id || \"FastLiteEvent\";\n }\n\n /**\n * 初始化选项(供子类重载)\n * @param initial - 可选的初始选项\n */\n _initOptions(initial?: Partial<FastLiteEventOptions>) {\n return initial;\n }\n\n /**\n * 添加事件监听器到事件树(仅尾插,已移除 prepend 插队)\n * @param parts - 事件路径数组\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns [节点, 监听器索引]\n */\n private _addListener(\n parts: string[],\n listener: Function,\n options: { count: number; tag?: string; flags?: number },\n ): [FastEventListenerNode | undefined, number] {\n let index: number = 0;\n const node = this._forEachNodes(parts, (node) => {\n const newListener = [\n listener,\n options.count,\n 0,\n options.tag,\n options.flags,\n ] as unknown as FastEventListenerMeta;\n node.__listeners.push(newListener);\n index = node.__listeners.length - 1;\n this.listenerCount++;\n });\n return [node, index];\n }\n\n /**\n * 根据 parts 路径遍历监听器树,并在最后的节点上执行回调\n */\n private _forEachNodes(\n parts: string[],\n callback: (node: FastEventListenerNode, parent: FastEventListenerNode) => void,\n ): FastEventListenerNode | undefined {\n if (parts.length === 0) return;\n let current = this.listeners;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (!(part in current)) {\n current[part] = {\n __listeners: [],\n } as unknown as FastListeners;\n }\n if (i === parts.length - 1) {\n const node = current[part];\n callback(node, current);\n return node;\n } else {\n current = current[part];\n }\n }\n return undefined;\n }\n\n /**\n * 从监听器节点中移除指定的事件监听器\n */\n private _removeListener(\n node: FastEventListenerNode,\n path: string[],\n listener: Function,\n ): void {\n if (!listener) return;\n removeItem(node.__listeners, (item: any) => {\n item = Array.isArray(item) ? item[0] : item;\n const isRemove = item === listener;\n if (isRemove) this.listenerCount--;\n return isRemove;\n });\n }\n\n /**\n * 注册事件监听器\n * @param type - 事件类型,支持普通字符串、通配符(user/*)、全局监听(**)\n * @param listener - 事件监听器函数\n * @param options - 监听器配置(count / tag / flags)\n * @returns 订阅者对象,包含 off 方法用于取消监听\n */\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n if (type.length === 0) throw new Error(\"event cannot be empty\");\n const finalOptions = Object.assign(\n { count: 0, flags: 0 },\n options,\n ) as Required<FastLiteListenOptions> & { count: number; flags: number };\n\n const parts = type.split(this._delimiter);\n const [node, index] = this._addListener(parts, listener as any, finalOptions);\n const off = () => node && this._removeListener(node, parts, listener as any);\n\n // 触发监听器保留消息(retain)\n this._emitRetainMessage(type, node, index);\n\n return {\n off,\n listener: listener as any,\n [Symbol.dispose]() {\n off();\n },\n };\n }\n\n /**\n * 注册一次性事件监听器(触发一次后自动注销)\n */\n public once<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, any>,\n any,\n any\n >,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(type, listener, Object.assign({}, options, { count: 1 }));\n }\n\n /**\n * 注册一个监听所有事件的监听器(等同 on('**', listener))\n */\n public onAny(\n listener: FastEventCommonListener<MutableMessage<AllEvents, any>, any, any>,\n options?: FastLiteListenOptions,\n ): FastEventSubscriber {\n return this.on(\"**\", listener as any, options as any) as FastEventSubscriber;\n }\n\n /**\n * 移除事件监听器\n */\n off(listener: Function): void;\n off(type: string, listener: Function): void;\n off(type: Types): void;\n off(type: string): void;\n off() {\n const args = arguments;\n const type = isFunction(args[0]) ? undefined : args[0];\n const listener = isFunction(args[0]) ? args[0] : args[1];\n const parts = type ? type.split(this._delimiter) : [];\n const hasWildcard = type ? type.includes(\"*\") : false;\n if (type && !hasWildcard) {\n this._traverseToPath(this.listeners, parts, (node) => {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else if (type) {\n node.__listeners = [];\n }\n });\n } else {\n const entryParts: string[] = hasWildcard ? [] : parts;\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener);\n } else {\n node.__listeners = [];\n }\n }\n });\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,提供则只移除该前缀下的监听器\n */\n offAll(entry?: string) {\n if (entry) {\n const parts = entry.split(this._delimiter);\n let count = 0;\n this._traverseListeners(this.listeners, parts, (_path, node) => {\n count += node.__listeners.length;\n node.__listeners = [];\n });\n this.listenerCount -= count;\n this._removeRetainedEvents(entry);\n } else {\n let count = 0;\n this._traverseListeners(this.listeners, [], (_path, node) => {\n count += node.__listeners.length;\n });\n this.listenerCount -= count;\n this.retainedMessages.clear();\n this.listeners = { __listeners: [] } as unknown as FastListeners;\n }\n }\n\n /**\n * 移除保留的事件\n */\n private _removeRetainedEvents(prefix?: string) {\n if (!prefix) this.retainedMessages.clear();\n if (prefix?.endsWith(this._delimiter)) {\n prefix += this._delimiter;\n }\n this.retainedMessages.delete(prefix!);\n for (let key of this.retainedMessages.keys()) {\n if (key.startsWith(prefix!)) {\n this.retainedMessages.delete(key);\n }\n }\n }\n\n /**\n * 清除所有事件或指定前缀的事件(含保留消息)\n */\n clear(prefix?: string) {\n this.offAll(prefix);\n this._removeRetainedEvents(prefix);\n }\n\n /**\n * 发送最后一次事件的消息给对应的监听器(用于 retain)\n */\n private _emitRetainMessage(\n type: string,\n listenerNode: FastEventListenerNode | undefined,\n index: number,\n ) {\n let messages = [] as TypedFastEventMessage[];\n if (type.includes(\"*\")) {\n const patterns = type.split(this._delimiter);\n this.retainedMessages.forEach((message, t) => {\n const parts = t.split(this._delimiter);\n if (isPathMatched(parts, patterns)) {\n messages.push(message);\n }\n });\n } else if (this.retainedMessages.has(type)) {\n messages.push(this.retainedMessages.get(type));\n }\n if (listenerNode) {\n messages.forEach((message) => {\n this._executeListeners([listenerNode], message, {}, (listenerMeta) => {\n return listenerMeta[0] === listenerNode.__listeners[index][0];\n });\n });\n }\n }\n\n /**\n * 遍历监听器节点树,支持三种匹配模式:精确 / 单层通配 * / 多层通配 **\n */\n private _traverseToPath(\n node: FastEventListenerNode,\n parts: string[],\n callback: (node: FastEventListenerNode) => void,\n index: number = 0,\n lastFollowing?: boolean,\n ): void {\n if (index >= parts.length) {\n callback(node);\n return;\n }\n const part = parts[index];\n if (lastFollowing === true) {\n this._traverseToPath(node, parts, callback, index + 1, true);\n return;\n }\n if (\"*\" in node) {\n this._traverseToPath(node[\"*\"], parts, callback, index + 1);\n }\n if (\"**\" in node) {\n this._traverseToPath(node[\"**\"], parts, callback, index + 1, true);\n }\n if (part in node) {\n this._traverseToPath(node[part], parts, callback, index + 1);\n }\n }\n\n private _traverseListeners(\n node: FastEventListenerNode,\n entry: string[],\n callback: (path: string[], node: FastEventListenerNode) => void,\n ): void {\n let entryNode: FastEventListenerNode = node;\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (n) => {\n entryNode = n;\n });\n }\n const traverseNodes = (\n node: FastEventListenerNode,\n callback: (path: string[], node: FastEventListenerNode) => void,\n parentPath: string[],\n ) => {\n callback(parentPath, node);\n for (let [key, childNode] of Object.entries(node)) {\n if (key.startsWith(\"__\")) continue;\n if (childNode) {\n traverseNodes(childNode as FastEventListenerNode, callback, [\n ...parentPath,\n key,\n ]);\n }\n }\n };\n traverseNodes(entryNode, callback, []);\n }\n\n /**\n * 监听器执行出错处理(移除了 ListenerError hook)\n */\n private _onListenerError(\n listener: Function,\n message: TypedFastEventMessage,\n _args: FastLiteListenerArgs | undefined,\n e: any,\n ) {\n if (e instanceof Error) {\n // @ts-ignore\n e._emitter = `${listener.name || \"anonymous\"}:${message.type}`;\n }\n if (this._options.ignoreErrors) {\n return e;\n } else {\n throw e;\n }\n }\n\n /**\n * 执行单个监听器函数(移除了 debug / abortSignal 分支,this 指向实例)\n */\n private _executeListener(\n listener: FastEventListenerMeta,\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs | undefined,\n catchErrors: boolean = false,\n ): Promise<any> | any {\n const listenerFn = listener[0];\n try {\n const isTransformed =\n ((args?.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n let result = listenerFn.call(\n this,\n isTransformed ? message.payload : message,\n args!,\n );\n // 自动处理 reject Promise\n if (catchErrors && result && result instanceof Promise) {\n result = tryReturnError(result, (e) =>\n this._onListenerError(listenerFn, message, args, e),\n );\n }\n return result;\n } catch (e: any) {\n return this._onListenerError(listenerFn, message, args, e);\n }\n }\n\n /**\n * 执行监听器节点列表中的所有监听器(移除了 executor,退化为同步顺序执行)\n */\n private _executeListeners(\n nodes: FastEventListenerNode[],\n message: TypedFastEventMessage,\n args: FastLiteListenerArgs,\n filter?: (listener: FastEventListenerMeta, node: FastEventListenerNode) => boolean,\n ): any[] {\n if (!nodes || nodes.length === 0) return [];\n const listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][] = [];\n for (const node of nodes) {\n let i: number = 0;\n for (const listener of node.__listeners) {\n if (!filter || filter(listener, node)) {\n listeners.push([listener, i++, node.__listeners]);\n }\n }\n }\n // 执行监听器前计数先减一,避免在监听器中再次触发导致重复执行\n this._decListenerExecCount(listeners);\n return listeners.map((listener) => {\n return this._executeListener(listener[0], message, args, true);\n });\n }\n\n /**\n * 减少侦听器的执行次数(达到 count 限制时移除)\n */\n _decListenerExecCount(\n listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][],\n ) {\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastEventListenerMeta;\n meta[2]++; // 实际执行的次数\n // count > 0 时代表执行次数限制\n if (meta[1] > 0 && meta[1] <= meta[2]) {\n listeners[i][2].splice(i, 1);\n }\n }\n }\n\n /**\n * 获取指定类型的所有事件监听器\n */\n getListeners(type: string): FastEventListenerMeta[] {\n const nodes: FastEventListenerNode[] = [];\n const parts = type.split(this._delimiter);\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n const listeners: any[] = [];\n nodes.map((node) => {\n listeners.push(...node.__listeners);\n });\n return listeners;\n }\n\n /**\n * 清除所有事件或指定事件的保留消息\n */\n clearRetainMessages(type?: EventNames | string) {\n if (type) {\n this.retainedMessages.delete(type as string);\n } else {\n this.retainedMessages.clear();\n }\n }\n\n /**\n * 同步触发事件\n *\n * 支持两种调用方式:\n * emit(type, payload, retain?)\n * emit({ type, payload }, retain?)\n */\n public emit<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<AllEvents, any>, retain?: boolean): R[];\n public emit<R = any>(message: { type: keyof AllEvents }, retain?: boolean): R[];\n public emit<R = any>(message: FastEventMessage, retain?: boolean): R[];\n public emit(): any {\n const [message, args] = parseLiteEmitArgs(arguments);\n\n const parts = message.type.split(this._delimiter);\n if (args.retain) {\n this.retainedMessages.set(message.type, message);\n }\n\n const nodes: FastEventListenerNode[] = [];\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n\n // 触发时进行消息转换\n if (isFunction(this._options.transform)) {\n const transformed = this._options.transform.call(this, message as any);\n if (transformed !== message) {\n message.payload = transformed;\n args.rawEventType = message.type;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n }\n }\n\n // 执行监听器\n const results: any[] = [];\n results.push(...this._executeListeners(nodes, message, args));\n\n // 展开 expandable 结果\n if (this._options.expandEmitResults) {\n expandEmitResults(results);\n }\n return results;\n }\n\n /**\n * 异步触发事件(使用 Promise.allSettled,等待所有异步监听器完成)\n */\n public async emitAsync<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<AllEvents>[T],\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<AllEvents, any>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: { type: keyof AllEvents },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(): Promise<(R | Error)[]> {\n const results = await Promise.allSettled(\n this.emit.apply(this, arguments as any),\n );\n return getPromiseResults(results);\n }\n\n}\n"]} |
+32
-26
| { | ||
| "name": "fastevent", | ||
| "version": "2.5.1", | ||
| "version": "2.6.0", | ||
| "private": false, | ||
| "description": "The Ultimate Event Trigger Library – Fast, Feature-Rich, Battle-Tested!", | ||
| "main": "dist/index.js", | ||
| "module": "dist/index.mjs", | ||
| "types": "./dist/index.d.ts", | ||
| "private": false, | ||
| "access": "public", | ||
| "keywords": [ | ||
| "eventemitter", | ||
| "events" | ||
| ], | ||
| "homepage": "https://zhangfisher.github.io/fastevent/", | ||
| "license": "MIT", | ||
| "author": "zhangfisher", | ||
| "repository": { | ||
@@ -15,2 +17,18 @@ "type": "git", | ||
| }, | ||
| "workspaces": [ | ||
| "packages/*", | ||
| "examples/*", | ||
| "docs" | ||
| ], | ||
| "files": [ | ||
| "dist", | ||
| "readme.md" | ||
| ], | ||
| "sideEffects": [ | ||
| "dist/viewer/*.js", | ||
| "dist/viewer/*.mjs" | ||
| ], | ||
| "main": "dist/index.js", | ||
| "module": "dist/index.mjs", | ||
| "types": "./dist/index.d.ts", | ||
| "exports": { | ||
@@ -22,2 +40,8 @@ ".": { | ||
| }, | ||
| "./lite": { | ||
| "types": "./dist/liteEvent.d.ts", | ||
| "import": "./dist/liteEvent.mjs", | ||
| "require": "./dist/liteEvent.js", | ||
| "default": "./dist/liteEvent.js" | ||
| }, | ||
| "./executors": { | ||
@@ -47,16 +71,2 @@ "types": "./dist/executors/index.d.ts", | ||
| }, | ||
| "keywords": [ | ||
| "eventemitter", | ||
| "events" | ||
| ], | ||
| "files": [ | ||
| "dist", | ||
| "readme.md" | ||
| ], | ||
| "sideEffects": [ | ||
| "dist/viewer/*.js", | ||
| "dist/viewer/*.mjs" | ||
| ], | ||
| "author": "zhangfisher", | ||
| "license": "MIT", | ||
| "devDependencies": { | ||
@@ -79,7 +89,3 @@ "@changesets/cli": "^2.28.1", | ||
| "packageManager": "bun@1.3.10", | ||
| "workspaces": [ | ||
| "packages/*", | ||
| "examples/*", | ||
| "docs" | ||
| ] | ||
| } | ||
| "access": "public" | ||
| } |
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
1597963
16.09%37
27.59%7540
12.52%12
33.33%