🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

fastevent

Package Overview
Dependencies
Maintainers
1
Versions
45
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fastevent - npm Package Compare versions

Comparing version
2.5.1
to
2.6.0
+827
dist/liteEvent.d.mts
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"
}