fastevent 2.3.7 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/consts.ts","../src/types/FastEvents.ts","../src/utils/parseEmitArgs.ts","../src/utils/isFastEventScope.ts","../src/utils/parseScopeArgs.ts","../src/utils/renameFn.ts","../src/utils/isFunction.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/utils/isFastEventMessage.ts","../src/utils/isString.ts","../src/utils/expandable.ts","../src/utils/isSubsctiber.ts","../src/utils/isClass.ts","../src/utils/isFastEvent.ts","../src/executors/parallel.ts","../src/utils/expandEmitResults.ts","../src/utils/tryReturnError.ts","../src/eventIterator.ts","../src/utils/wrapPipeListener.ts","../src/event.ts"],"names":["__FastEvent__","Symbol","for","__FastEventScope__","FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","UnboundError","_UnboundError","AbortError","_AbortError","CancelError","_CancelError","QueueOverflowError","_QueueOverflowError","FastEventListenerFlags","parseEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","meta","emitArgs","Object","assign","retain","type","payload","keys","length","undefined","executor","isFastEventScope","target","parseScopeArgs","scopeContext","prefix","scopeObj","options","context","renameFn","fn","name","defineProperty","value","configurable","isFunction","FastEventScope","__events__","__meta__","__context__","_options","emitter","_initOptions","listeners","getListeners","bind","scope","endsWith","delimiter","initial","_getScopeListener","listener","scopePrefix","scopeThis","rawEventType","startsWith","msg","flags","Transformed","substring","call","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","_transformMessage","transform","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","_FastEventScope","isPathMatched","path","pattern","pathLen","patternLen","i","removeItem","arr","condition","removedIndices","push","splice","reverse","isFastEventMessage","isString","str","__expandable__","expandable","isExpandable","isSubsctiber","val","isClass","toString","prototype","isFastEvent","parallel","__name","execute","expandEmitResults","items","item","Array","isArray","tryReturnError","callback","catch","e","resolve","FastEventIterator","eventEmitter","eventName","buffer","resolvers","errorResolvers","isStopped","error","currentSize","hasNewMessage","_listener","_ready","_listenOptions","_cleanups","defaultSize","defaultMaxExpandSize","size","maxExpandSize","expandOverflow","overflow","lifetime","onPush","onPop","onDrop","onError","signal","onMessage","ready","create","subscriber","aborted","offFn","addEventListener","removeEventListener","Date","now","handleOverflow","strategy","Math","min","shift","_args","data","done","abort","forEach","resolver","next","reject","nextMessage","enterTime","asyncIterator","throw","return","dispose","_FastEventIterator","createAsyncEventIterator","wrapPipeListener","pipes","decorator","FastEvent","__listeners","_delimiter","_context","retainedMessages","Map","listenerCount","types","debug","id","random","ignoreErrors","_enableDevTools","_addListener","parts","prepend","index","_forEachNodes","node","newListener","tag","globalThis","__FASTEVENT_DEVTOOLS__","add","current","part","_removeListener","isRemove","onRemoveListener","join","_onAddListener","onAddListener","r","returnIterator","finalOptions","iteratorOpts","iterable","iterator","split","filter","oldListener","_emitRetainMessage","hasWildcard","includes","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","listenerNode","messages","patterns","has","get","_executeListeners","listenerMeta","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","_emitter","onListenerError","_setListenerFlags","_executeListener","catchErrors","abortSignal","isTransformed","_getListenerExecutor","nodes","_decListenerExecCount","executeor","clearRetainMessages","parseArgs","set","results","onBeforeExecuteListener","onAfterExecuteListener","tid","clearTimeout","setTimeout","_FastEvent"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","/**\n * 事件相关\n */\nimport { TypedFastEventMessage, FastEventMessage } from \"./FastEventMessages\";\nimport { FastEventSubscriber } from \"./FastEventSubscribers\";\nimport { TypedFastEventListener, FastEventListenerNode } from \"./FastEventListeners\";\nimport type { FastListenerExecutor } from \"../executors\";\nimport type { FastListenerPipe } from \"../pipes\";\nimport { DeepPartial } from \"./utils/DeepPartial\";\nimport { FastEventIteratorOptions } from \"../eventIterator\";\n\nexport type FastEventOptions<Meta = Record<string, any>, Context = never> = {\n id: string;\n debug: boolean;\n // 事件分隔符\n delimiter: string;\n // 监听器函数执行上下文\n context: Context;\n // 当执行监听器函数出错时是否忽略,默认true\n ignoreErrors: boolean;\n // 额外的全局元数据,当触发事件时传递给监听器\n meta: Meta;\n // 当创建新监听器时回调,返回false中止添加监听器\n onAddListener?: (\n type: string,\n listener: TypedFastEventListener,\n options: FastEventListenOptions<Record<string, any>, Meta>,\n ) => boolean | FastEventSubscriber | void;\n // 当移除监听器时回调\n onRemoveListener?: (type: string, listener: TypedFastEventListener) => void;\n // 当清空监听器时回调\n onClearListeners?: () => void;\n // 当监听器函数执行出错时的回调,用于诊断时使用,可以打印错误信息\n onListenerError?: (\n error: Error,\n listener: TypedFastEventListener,\n message: TypedFastEventMessage<any, Meta>,\n args: FastEventListenerArgs<Meta> | undefined,\n ) => void;\n // 当执行监听器前时回调,返回false代表取消执行,any[]返回给emit\n onBeforeExecuteListener?: (\n message: TypedFastEventMessage<any, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean | void | any[];\n // 当执行监听器后时回调\n onAfterExecuteListener?: (\n message: TypedFastEventMessage<any, Meta>,\n returns: any[],\n listeners: FastEventListenerNode[],\n ) => void;\n /**\n * 全局执行器\n */\n executor?: FastListenerExecutor;\n /**\n * 是否展开emit返回值,默认为false,用于将事件转发给其他FastEvent时使用\n */\n expandEmitResults?: boolean;\n /**\n * 对接收到的消息进行转换,用于将消息转换成其他格式\n *\n * new FastEvent({\n * transform:(message)=>{\n * message.payload\n * }\n * })\n */\n transform?: (message: FastEventMessage) => any;\n};\n\nexport interface FastEvents {}\n\nexport type FastEventListenOptions<\n Events extends Record<string, any> = Record<string, any>,\n Meta = any,\n> = {\n // 侦听执行次数,当为1时为单次侦听,为0时为永久侦听,其他值为执行次数,每执行一次减一,减到0时移除监听器\n count?: number;\n // 将监听器添加到监听器列表的头部\n prepend?: boolean;\n // 该监听器会在其他监听器执行完毕后再触发执行\n flags?: number;\n filter?: (\n message: TypedFastEventMessage<Events, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean;\n // 当执行监听器前,如果此函数返回true则自动注销监听\n off?: (\n message: TypedFastEventMessage<Events, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean;\n // 对监听器函数进行包装装饰,返回包装后的函数\n pipes?: FastListenerPipe[];\n /**\n * 为监听器添加一个tag,在监听器注册表中记录,用于调试使用\n * emitter.on(type,listener,{tag:\"x\"})\n * emitter.getListeners(tag)\n */\n tag?: string;\n /**\n * 异步迭代器选项\n *\n * 用于配置返回异步迭代器的参数\n * \n * 默认值是\n {\n overflow: \"expand\",\n size: 10,\n maxExpandSize: 100,\n }\n */\n iterable?: FastEventIteratorOptions;\n};\n\nexport enum FastEventListenerFlags {\n Transformed = 1,\n}\n\nexport type FastEventListenerArgs<M = Record<string, any>> = {\n retain?: boolean;\n meta?: DeepPartial<M> & Record<string, any>;\n abortSignal?: AbortSignal; // 用于传递给监听器函数\n /**\n *\n * allSettled: 使用Promise.allSettled()执行所有监听器\n * race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略\n * balance: 尽可能平均执行各个监听器\n * sequence: 按照监听器添加顺序依次执行\n */\n executor?: FastListenerExecutor;\n /**\n * 当emit参数解析完成后的回调,用于修改emit参数\n */\n parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;\n /**\n * 额外的标识\n *\n * - 1: transformed 当消息是经过transform转换后的消息时的标识\n *\n */\n flags?: FastEventListenerFlags;\n /**\n * 如果消息经过转换前的原主题\n */\n rawEventType?: string;\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\n\nexport function parseEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown,\n>(\n args: IArguments,\n emitterMeta: any,\n scopeMeta?: any,\n scopeExecutor?: any,\n): [TypedFastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let meta: any;\n let emitArgs: FastEventListenerArgs<Meta> = {};\n let message = {} as TypedFastEventMessage<Events, Meta>;\n if (typeof args[0] === \"object\") {\n Object.assign(message, args[0]);\n emitArgs = typeof args[1] === \"boolean\" ? { retain: args[1] } : args[1] || {};\n meta = args[0].meta;\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] } : args[2] || {};\n }\n meta = Object.assign({}, emitterMeta, scopeMeta, emitArgs.meta, meta);\n\n if (Object.keys(meta).length === 0) {\n meta = undefined;\n delete message.meta;\n } else {\n message.meta = meta;\n }\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor;\n }\n\n return [message, emitArgs];\n}\n","import type { FastEventScope } from \"../scope\"\n\nexport function isFastEventScope(target: any): target is FastEventScope {\n if (!target) return false\n return typeof target === 'object' && '__FastEventScope__' in target\n}","import { isFastEventScope } from \"./isFastEventScope\"\n\nexport function parseScopeArgs(args: IArguments, scopeMeta?: any, scopeContext?: any) {\n const prefix = args[0]\n const scopeObj = isFastEventScope(args[1]) ? args[1] : undefined\n const options = (scopeObj ? args[2] : args[1]) || {}\n options.meta = Object.assign({}, scopeMeta, options?.meta)\n options.context = options.context !== undefined ? options.context : scopeContext\n return [prefix, scopeObj, options]\n}","\n\n\n\n/**\n * 重命名函数,修改函数的 name 属性\n * @param fn 需要重命名的函数\n * @param name 新的函数名\n * @returns 返回重命名后的函数\n */\nexport function renameFn<F>(fn: F, name: string): F {\n Object.defineProperty(fn, 'name', {\n value: name || 'anonymous',\n configurable: true\n });\n return fn;\n}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","// oxlint-disable no-unused-vars\nimport { UnboundError } from \"./consts\";\nimport type { FastEvent } from \"./event\";\nimport { FastListenerExecutor } from \"./executors/types\";\nimport {\n ScopeEvents,\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n UnTransformedEvents,\n ReplaceWildcard,\n GetPayload,\n Fallback,\n GetClosestEventPayload,\n} from \"./types\";\nimport {\n FastEventEmitMessage,\n TypedFastEventMessage,\n FastEventMeta,\n FastEventMessage,\n} from \"./types/FastEventMessages\";\nimport { FastEventSubscriber } from \"./types/FastEventSubscribers\";\nimport { TypedFastEventListener, FastEventCommonListener } from \"./types/FastEventListeners\";\nimport {\n FastEventListenerArgs,\n FastEventListenOptions,\n FastEventListenerFlags,\n} from \"./types/FastEvents\";\nimport { IsTransformedEvent } from \"./types/transformed/IsTransformedEvent\";\nimport { ExtendWildcardEvents } from \"./types/wildcards/ExtendWildcardEvents\";\nimport { PayloadValues } from \"./types/transformed/PayloadValues\";\nimport { ValueOf } from \"./types/utils/ValueOf\";\nimport { Dict } from \"./types/utils/Dict\";\nimport { DeepPartial } from \"./types/utils/DeepPartial\";\nimport { IsAllTransformed } from \"./types/transformed/IsAllTransformed\";\nimport { parseEmitArgs } from \"./utils/parseEmitArgs\";\nimport { parseScopeArgs } from \"./utils/parseScopeArgs\";\nimport { renameFn } from \"./utils/renameFn\";\nimport { PickPayload } from \"./types/transformed/PickPayload\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { FastEventIterator } from \"./eventIterator\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\n\nexport type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {\n meta: FastEventScopeMeta & FastEventMeta & Meta;\n context: Context;\n executor?: FastListenerExecutor;\n /**\n * 对接收到的消息进行转换,用于将消息转换成其他格式\n *\n * new FastEvent({\n * transform:(message)=>{\n * message.payload\n * }\n * })\n */\n transform?: (message: FastEventMessage) => any;\n};\n\nexport interface FastEventScopeMeta {\n scope: string;\n}\n\nexport interface IFastEventScope<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n> {\n __FastEventScope__: boolean;\n readonly __events__: Events;\n readonly __meta__: Meta;\n readonly __context__: Context;\n}\n\nexport class FastEventScope<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = FastEventMeta & FastEventScopeMeta & Meta,\n> {\n __FastEventScope__: boolean = true;\n // 添加类型标记\n readonly __events__!: Events;\n readonly __meta__!: Meta & FastEventScopeMeta;\n readonly __context__!: Context;\n private _options: DeepPartial<FastEventScopeOptions<FinalMeta, Context>> = {};\n\n declare types: {\n events: ExtendWildcardEvents<Events>;\n eventNames: KeyOf<ExtendWildcardEvents<Events>>;\n messages: MutableMessage<Events, FinalMeta>;\n rawEvents: Events;\n meta: FinalMeta;\n };\n prefix: string = \"\";\n emitter!: FastEvent<any>;\n constructor(options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>) {\n this._options = Object.assign(\n {},\n this._initOptions(options),\n ) as unknown as FastEventScopeOptions<FinalMeta, Context>;\n }\n get context(): Fallback<Context, typeof this> {\n return (this.options.context || this) as Fallback<Context, typeof this>;\n }\n get options() {\n return this._options as FastEventScopeOptions<FinalMeta, Context>;\n }\n /**\n * 获取监听器\n * @returns 监听器\n */\n get listeners() {\n return this.emitter.getListeners(this.prefix);\n }\n bind(\n emitter: FastEvent<any>,\n prefix: string,\n options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>,\n ) {\n this.emitter = emitter;\n this._options = Object.assign(\n this._options,\n {\n scope: prefix,\n },\n options,\n ) as unknown as Required<FastEventScopeOptions<FinalMeta, Context>>;\n if (prefix.length > 0 && !prefix.endsWith(emitter.options.delimiter!)) {\n this.prefix = prefix + emitter.options.delimiter;\n }\n }\n\n /**\n * 初始化选项\n *\n * 本方法主要供子类重载\n *\n * @param initial - 可选的初始字典对象\n * @returns 返回传入的初始字典对象\n */\n _initOptions(initial: Dict | undefined) {\n return initial;\n }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: TypedFastEventListener): TypedFastEventListener {\n const scopePrefix = this.prefix;\n if (scopePrefix.length === 0) return listener;\n // 如果没有指定监听器,则使用onMessage作为监听器\n if (!listener) {\n throw new Error();\n }\n // oxlint-disable-next-line typescript/no-this-alias\n const scopeThis = this;\n const scopeListener = renameFn(function (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) {\n const type = args.rawEventType || message.type;\n if (type.startsWith(scopePrefix)) {\n // 1. 判断是否经过全局Transform转换\n // 消息是否经过转换,如果经过转换,由于结果不确定,所以不进行前缀处理,直接将消息传递给监听器\n const isTransformed = ((args.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n let msg = isTransformed\n ? message\n : Object.assign({}, message, {\n type: type.substring(scopePrefix.length),\n });\n\n return listener.call(scopeThis.context, msg, args);\n }\n }, listener.name) as TypedFastEventListener;\n return scopeListener;\n }\n private _getScopeType(type: string) {\n return type === undefined ? undefined : this.prefix + type;\n }\n private _fixScopeType(type: string) {\n return type.startsWith(this.prefix) ? type.substring(this.prefix.length) : type;\n }\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): T extends IsTransformedEvent<Events, T>\n ? FastEventIterator<\n T extends \"**\"\n ? IsAllTransformed<Events> extends true\n ? PayloadValues<Events>\n : any\n : PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n >\n : FastEventIterator<\n T extends \"**\" ? MutableMessage<Events> : GetClosestMessage<Events, T, FinalMeta>\n >;\n\n // 指定监听器\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, FinalMeta>,\n FinalMeta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public on(): FastEventSubscriber | FastEventIterator<any> {\n if (!this.emitter) throw new UnboundError();\n const args = [...arguments] as [any, any, any];\n args[0] = this._getScopeType(args[0]);\n args[1] = this._getScopeListener(args[1]);\n return this.emitter.on(...args);\n }\n /**\n * 只订阅一次\n * @param type\n * @param options\n */\n public once<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, FinalMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }));\n }\n /**\n * 订阅全部\n * @param options\n */\n public onAny(\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): FastEventIterator<MutableMessage<Events, FinalMeta>>;\n\n public onAny(\n listener: FastEventCommonListener<\n MutableMessage<Events, FinalMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): FastEventSubscriber;\n onAny() {\n return this.on(\"**\" as any, ...(arguments as any)) as any;\n }\n\n off(listener: TypedFastEventListener<any, any, any>): void;\n off(type: string, listener: TypedFastEventListener<any, any, any>): void;\n off(type: Types, listener: TypedFastEventListener<any, any, any>): void;\n off(type: string): void;\n off(type: Types): void;\n off() {\n const args = arguments as unknown as [any, any];\n if (typeof args[0] === \"string\") {\n args[0] = this._getScopeType(args[0]);\n }\n this.emitter.off(...args);\n }\n offAll() {\n this.emitter.offAll(this.prefix.substring(0, this.prefix.length - 1));\n }\n clear() {\n this.emitter.clear(this.prefix.substring(0, this.prefix.length - 1));\n }\n /**\n * 触发事件\n * @param type\n * @param directive\n */\n public emit<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<Events>[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<Events>, T>\n : any,\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<Events>, T>\n : any,\n options?: FastEventListenerArgs<Partial<FinalMeta>>,\n ): R[];\n public emit<R = any, T extends KeyOf<Events> = KeyOf<Events>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<Events, FinalMeta>, retain?: boolean): R[];\n public emit<R = any>(\n message: {\n type: keyof Events;\n },\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<Events>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit(): any {\n let [message, args] = parseEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor,\n );\n\n this._transformMessage(message as any, args);\n message.type = this._getScopeType(message.type)!;\n return this.emitter.emit(message as any, args);\n }\n\n private _transformMessage(message: FastEventMessage, args: FastEventListenerArgs<FinalMeta>) {\n if (isFunction(this._options.transform)) {\n args.rawEventType = this._getScopeType(message.type)!;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n message.payload = this._options.transform.call(this, message);\n }\n }\n\n public async emitAsync<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<Events>[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<Events>, T>\n : any,\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<Events>, T>\n : any,\n options?: FastEventListenerArgs<Partial<FinalMeta>>,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<Events> = KeyOf<Events>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<Events, FinalMeta>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: {\n type: keyof Events;\n },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<Events>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n\n public async emitAsync<R = any>(): Promise<[R | Error][]> {\n const results = await Promise.allSettled(this.emit.apply(this, arguments as 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 public async waitFor<T extends string = KeyOf<Events>>(\n type: T,\n timeout?: number,\n ): Promise<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : FastEventMessage<T, GetClosestEventPayload<Events, T>, FinalMeta>\n >;\n public async waitFor<T extends string = string>(\n type: T,\n timeout?: number,\n ): Promise<TypedFastEventMessage<Events, FinalMeta>>;\n\n public async waitFor(): Promise<any> {\n const type = arguments[0] as string;\n const timeout = arguments[1] as number;\n const message = await this.emitter.waitFor(this._getScopeType(type)!, timeout);\n const scopeMessage = Object.assign({}, message, {\n type: this._fixScopeType(message.type),\n });\n return scopeMessage;\n }\n /**\n * 创建一个新的作用域实例\n * @param prefix - 作用域前缀\n * @returns 新的FastEventScope实例\n *\n * @description\n * 基于当前作用域创建一个新的子作用域。新作用域会继承当前作用域的所有特性,\n * 并在事件类型前添加额外的前缀。这允许创建层级化的事件命名空间。\n *\n * 作用域的特性:\n * - 自动为所有事件类型添加前缀\n * - 在触发事件时自动添加前缀\n * - 在接收事件时自动移除前缀\n * - 支持多层级的作用域嵌套\n *\n * @example\n * ```ts\n * const emitter = new FastEvent();\n * const userScope = emitter.scope('user');\n * const profileScope = userScope.scope('profile');\n *\n * // 在profileScope中监听'update'事件\n * // 实际监听的是'user/profile/update'\n * profileScope.on('update', (data) => {\n * console.log('Profile updated:', data);\n * });\n *\n * // 在profileScope中触发'update'事件\n * // 实际触发的是'user/profile/update'\n * profileScope.emit('update', { name: 'John' });\n * ```\n */\n\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(\n prefix: P,\n options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>,\n ): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C>;\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n ScopeInstance extends IFastEventScope<Record<string, any>, any, any> = FastEventScope<\n Record<string, any>,\n any,\n any\n >,\n >(\n prefix: P,\n scopeObj: ScopeInstance,\n options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>,\n ): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C> & ScopeInstance; //FastEventScopeExtend<Events & E, P, ScopeInstance, Meta>;\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(): any {\n const [prefix, scopeObj, options] = parseScopeArgs(\n arguments,\n this.options.meta,\n this.options.context,\n );\n let scope: FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;\n if (scopeObj) {\n scope = scopeObj;\n } else {\n scope = new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>();\n }\n scope.bind(this.emitter as any, this.prefix + prefix, options);\n return scope;\n }\n}\n","/**\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","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\n\nexport function isFastEventMessage(msg: any): msg is TypedFastEventMessage {\n if (!msg) return false;\n return typeof msg === \"object\" && \"type\" in msg;\n}\n","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventSubscriber } from \"../types/FastEventSubscribers\";\n\nexport function isSubsctiber(val: any): val is FastEventSubscriber {\n return val && typeof val === \"object\" && \"off\" in val && \"listener\" in val;\n}\n","\n\nexport function isClass(target: unknown): target is new (...args: any[]) => any {\n return typeof target === 'function' &&\n (target.toString().startsWith('class ') ||\n target.prototype?.constructor === target);\n}","import { FastEvent } from \"../event\"\n\n\nexport function isFastEvent(target: any): target is FastEvent {\n if (!target) return false\n return typeof target === 'object' && '__FastEvent__' in target\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}","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","/**\n * FastEventIterator - 使用异步迭代器从 FastEvent 或 FastEventScope 订阅事件\n * 重构:使用 queue.ts 中的队列参数和逻辑\n */\n\nimport { AbortError } from \"./consts\";\nimport type { FastEvent } from \"./event\";\nimport type { FastEventScope } from \"./scope\";\nimport type { FastEventMessage } from \"./types/FastEventMessages\";\nimport type { FastEventListener } from \"./types/FastEventListeners\";\nimport type { FastEventListenerArgs, FastEventListenOptions } from \"./types/FastEvents\";\n\n// 溢出策略类型\nexport type FastQueueOverflows =\n | \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | \"slide\" // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | \"throw\"; // 当缓冲区满时,抛出异常\n\n// FastEventIterator 配置选项\nexport interface FastEventIteratorOptions<T = FastEventMessage> {\n /** 缓冲区默认大小(默认:100) */\n size?: number;\n /** 缓冲区扩展到多大时不再扩展(默认:1000) */\n maxExpandSize?: number;\n /** 当扩展到最大大小后的溢出策略(默认:'slide') */\n expandOverflow?: Omit<FastQueueOverflows, \"expand\">;\n /** 溢出策略(默认:'slide') */\n overflow?: FastQueueOverflows;\n /** 消息生命周期(毫秒),0表示不启用(默认:0) */\n lifetime?: number;\n /** 当新消息到达时触发此回调 */\n onPush?: (newMessage: T, messages: [T, number][]) => void;\n /** 当消息被弹出时触发此回调,可以在此对消息队列进行排序等操作 */\n onPop?: (messages: [T, number][], hasNew: boolean) => [T, number] | undefined;\n /** 当消息被丢弃时触发此回调 */\n onDrop?: (message: T) => void;\n /** 错误处理函数,返回true表示继续迭代,false表示停止迭代 */\n onError?: (error: Error) => boolean | Promise<boolean>;\n /** 信号,用于取消迭代 */\n signal?: AbortSignal;\n}\n\nexport class FastEventIterator<T = any> implements AsyncIterableIterator<T> {\n // 使用 [message, timestamp] 元组存储,支持 lifetime 机制\n private buffer: [T, number][] = [];\n private resolvers: Array<(value: IteratorResult<any>) => void> = [];\n private errorResolvers: Array<(error: Error) => void> = [];\n private isStopped = false; // 已经停止迭代\n private error: Error | null = null;\n private options: Required<\n Omit<FastEventIteratorOptions<T>, \"onPush\" | \"onPop\" | \"onDrop\" | \"onError\" | \"signal\">\n > & {\n onPush?: FastEventIteratorOptions<T>[\"onPush\"];\n onPop?: FastEventIteratorOptions<T>[\"onPop\"];\n onDrop?: FastEventIteratorOptions<T>[\"onDrop\"];\n onError?: FastEventIteratorOptions<T>[\"onError\"];\n signal?: AbortSignal;\n };\n private currentSize: number; // 当前缓冲区大小\n private hasNewMessage: boolean = false; // 自上次pop后是否有新消息\n private _listener: FastEventListener;\n private _ready: boolean = false;\n private _listenOptions?: FastEventListenOptions;\n private _cleanups: (() => void)[] = [];\n constructor(\n private eventEmitter: FastEvent<any> | FastEventScope<any, any, any>,\n private eventName: string,\n options: FastEventIteratorOptions<T> = {},\n ) {\n const defaultSize = 20;\n const defaultMaxExpandSize = 100;\n\n this.options = {\n size: options.size ?? defaultSize,\n maxExpandSize: options.maxExpandSize ?? defaultMaxExpandSize,\n expandOverflow: options.expandOverflow ?? \"slide\",\n overflow: options.overflow ?? \"slide\",\n lifetime: options.lifetime ?? 0,\n onPush: options.onPush,\n onPop: options.onPop,\n onDrop: options.onDrop,\n onError: options.onError ?? (() => true),\n signal: options.signal,\n };\n\n // 确保 currentSize 被正确初始化\n this.currentSize = this.options.size;\n this._listener = this.onMessage.bind(this);\n }\n get listener() {\n return this._listener;\n }\n get ready() {\n return this._ready;\n }\n /**\n * 创建异步迭代器\n */\n create(options?: FastEventListenOptions) {\n if (this._ready) return;\n this._listenOptions = options;\n try {\n // 监听事件 - 使用 FastEvent 的 on 方法,返回订阅者对象\n const subscriber = (this.eventEmitter as any).on(\n this.eventName,\n this._listener,\n options,\n );\n this._cleanups.push(() => subscriber.off());\n // 处理中止信号\n if (this.options.signal && !this.options.signal.aborted) {\n const offFn = () => {\n this.off(true);\n };\n this.options.signal.addEventListener(\"abort\", offFn);\n this._cleanups.push(() => {\n this.options.signal!.removeEventListener(\"abort\", offFn);\n });\n }\n } finally {\n this._ready = true;\n }\n }\n /**\n * 推送消息到缓冲区\n */\n private push(message: T): void {\n if (this.options.onPush) {\n this.options.onPush(message, this.buffer);\n } else {\n this.buffer.push(this.options.lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n }\n\n /**\n * 处理缓冲区溢出\n * @returns 返回 true 表示消息已添加,false 表示消息被丢弃\n */\n private handleOverflow(message: T): boolean {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n this.buffer.length >= this.options.maxExpandSize && this.options.overflow === \"expand\"\n ? this.options.expandOverflow\n : this.options.overflow;\n\n switch (strategy) {\n case \"drop\":\n if (this.options.onDrop) this.options.onDrop(message);\n return false;\n case \"expand\":\n this.currentSize = Math.min(\n this.currentSize + this.options.size,\n this.options.maxExpandSize,\n );\n this.push(message);\n return true;\n case \"slide\":\n const msg = this.buffer.shift(); // 移除最旧的消息\n if (this.options.onDrop && msg) this.options.onDrop(msg[0]);\n this.push(message);\n return true;\n case \"throw\":\n if (this.options.onDrop) this.options.onDrop(message);\n throw new Error(\n `EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`,\n );\n default:\n return false;\n }\n }\n\n private onMessage(\n message: FastEventMessage<any, any, any>,\n _args: FastEventListenerArgs,\n ): void {\n if (this.isStopped) return;\n\n // 从 FastEvent 消息中提取 payload\n const data = message as T;\n\n // 如果有等待的消费者,直接resolve\n if (this.resolvers.length > 0) {\n const resolver = this.resolvers.shift()!;\n resolver({ value: data, done: false });\n return;\n }\n\n // 否则加入缓冲区\n this.hasNewMessage = true;\n\n if (this.buffer.length < this.currentSize) {\n this.push(data);\n } else {\n this.handleOverflow(data);\n }\n }\n /**\n * 中止监听\n * @param abort\n * @returns\n */\n off(abort?: boolean): void {\n if (!this._ready) return;\n if (this.isStopped) return;\n this.isStopped = true;\n // 取消事件订阅\n this._cleanups.forEach((fn) => fn());\n this._cleanups = [];\n this.buffer = [];\n this._ready = false;\n // 如果是强制中止,如调用了AbortSign\n if (abort) {\n // 清理等待的error resolvers\n this.errorResolvers.forEach((resolver) => {\n resolver(new AbortError());\n });\n this.errorResolvers = [];\n } else {\n // 清理等待的resolvers\n this.resolvers.forEach((resolver) => {\n resolver({ value: undefined, done: true });\n });\n this.resolvers = [];\n }\n this._ready = false;\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.error) {\n return Promise.reject(this.error);\n }\n\n if (this.isStopped && this.buffer.length === 0) {\n return { value: undefined, done: true };\n }\n\n // 如果缓冲区有数据,立即返回\n if (this.buffer.length > 0) {\n let nextMessage: T | undefined;\n let enterTime: number;\n\n // 从队列中弹出消息\n if (this.options.onPop) {\n const result = this.options.onPop(this.buffer, this.hasNewMessage);\n if (result) {\n [nextMessage, enterTime] = result;\n } else {\n [nextMessage, enterTime] = this.buffer.shift() || [undefined, 0];\n }\n } else {\n [nextMessage, enterTime] = this.buffer.shift() || [undefined, 0];\n }\n\n // 重置 hasNewMessage 标志\n this.hasNewMessage = false;\n\n if (nextMessage !== undefined) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (this.options.lifetime > 0 && Date.now() - enterTime > this.options.lifetime) {\n if (this.options.onDrop) this.options.onDrop(nextMessage);\n // 递归获取下一个消息\n return this.next();\n }\n return { value: nextMessage, done: false };\n }\n }\n\n // 否则等待新事件\n return new Promise((resolve, reject) => {\n this.resolvers.push(resolve);\n this.errorResolvers.push(reject);\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this as unknown as AsyncIterableIterator<T>;\n }\n\n async done(): Promise<IteratorResult<T>> {\n this.off();\n return { value: undefined, done: true };\n }\n\n async throw(error?: any): Promise<IteratorResult<T>> {\n this.error = error;\n this.off();\n return Promise.reject(error);\n }\n\n /**\n * 当 for await...of 循环被 break、return 或 throw 中断时调用\n * 自动清理资源,防止内存泄漏\n */\n async return(): Promise<IteratorResult<T>> {\n this.off();\n return { value: undefined, done: true };\n }\n\n /**\n * 同步资源释放(支持 using 语句)\n *\n * @description\n * 当使用 `using` 语句时,此方法会在作用域结束时自动调用,\n * 执行 off() 方法取消订阅。\n *\n * @example\n * ```ts\n * {\n * using subscriber = emitter.on('event');\n * // subscriber 在作用域结束时自动调用 off()\n * }\n * ```\n */\n [Symbol.dispose](): void {\n this.off();\n }\n\n on() {\n this.create(this._listenOptions);\n this.isStopped = false;\n }\n}\n\n/**\n * 创建一个异步迭代器,从 FastEvent 或 FastEventScope 订阅事件\n * @param eventEmitter FastEvent 或 FastEventScope 实例\n * @param eventName 事件名称\n * @param options 配置选项\n * @param listenerOptions 监听器配置选项\n * @returns 异步迭代器\n */\nexport function createAsyncEventIterator<T = any>(\n eventEmitter: FastEvent<any> | FastEventScope<any, any, any>,\n eventName: string,\n options: FastEventIteratorOptions<T> = {},\n): FastEventIterator<T> {\n return new FastEventIterator<T>(eventEmitter, eventName, options);\n}\n","import { FastListenerPipe } from \"../pipes/types\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { renameFn } from \"./renameFn\";\n\nexport function wrapPipeListener(\n listener: TypedFastEventListener<any, any, any, any>,\n pipes: FastListenerPipe[],\n): TypedFastEventListener<any, any, any, any> {\n if (Array.isArray(pipes)) {\n pipes.forEach((decorator) => {\n listener = renameFn(decorator(listener), listener.name);\n });\n return listener;\n }\n return listener;\n}\n","import { RemoveAnyRecord } from \"./types/utils/RemoveAnyRecord\";\nimport { FastEventScope, IFastEventScope, type FastEventScopeOptions } from \"./scope\";\nimport {\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n Expand,\n Fallback,\n ReplaceWildcard,\n UnTransformedEvents,\n FastEventMessage,\n GetClosestEventPayload,\n} from \"./types\";\nimport {\n TypedFastEventMessage,\n FastEventEmitMessage,\n FastEventMeta,\n} from \"./types/FastEventMessages\";\nimport {\n FastEventListeners,\n FastListeners,\n TypedFastEventAnyListener,\n} from \"./types/FastEventListeners\";\nimport { FastEventSubscriber } from \"./types/FastEventSubscribers\";\nimport {\n TypedFastEventListener,\n FastEventListenerNode,\n FastEventListenerMeta,\n FastEventCommonListener,\n} from \"./types/FastEventListeners\";\nimport {\n FastEventOptions,\n FastEventListenOptions,\n FastEventListenerArgs,\n FastEvents,\n FastEventListenerFlags,\n} from \"./types/FastEvents\";\nimport { IsTransformedEvent } from \"./types/transformed/IsTransformedEvent\";\nimport { ExtendWildcardEvents } from \"./types/wildcards/ExtendWildcardEvents\";\nimport { PayloadValues } from \"./types/transformed/PayloadValues\";\nimport { PickPayload } from \"./types/transformed/PickPayload\";\nimport { ValueOf } from \"./types/utils/ValueOf\";\nimport { DeepPartial } from \"./types/utils/DeepPartial\";\nimport { GetPayload } from \"./types/transformed/GetPayload\";\nimport { IsAllTransformed } from \"./types/transformed/IsAllTransformed\";\nimport { parseEmitArgs } from \"./utils/parseEmitArgs\";\nimport { isPathMatched } from \"./utils/isPathMatched\";\nimport { removeItem } from \"./utils/removeItem\";\nimport { renameFn } from \"./utils/renameFn\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { ScopeEvents } from \"./types\";\nimport { AbortError, CancelError } from \"./consts\";\nimport { parseScopeArgs } from \"./utils/parseScopeArgs\";\nimport { FastListenerExecutor, parallel } from \"./executors\";\nimport { expandEmitResults } from \"./utils/expandEmitResults\";\nimport { isSubsctiber } from \"./utils/isSubsctiber\";\nimport { tryReturnError } from \"./utils/tryReturnError\";\nimport {\n createAsyncEventIterator,\n FastEventIterator,\n FastEventIteratorOptions,\n} from \"./eventIterator\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { wrapPipeListener } from \"./utils/wrapPipeListener\";\n\n/**\n * FastEvent 事件发射器类\n *\n * @template Events - 事件类型定义,继承自FastEvents接口\n * @template Meta - 事件元数据类型,默认为任意键值对对象\n * @template Types - 事件类型的键名类型,默认为Events的键名类型\n */\nexport class FastEvent<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n // 泛型快捷方式\n AllEvents extends Record<string, any> = Expand<Events & FastEvents>,\n Types extends keyof AllEvents = KeyOf<AllEvents>,\n AllMeta extends Record<string, any> = FastEventMeta & Meta,\n EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>,\n> {\n __FastEvent__: boolean = true;\n\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners;\n\n /** 事件发射器的配置选项 */\n private _options: FastEventOptions<Meta, Context>;\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = \"/\";\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context;\n\n /** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */\n retainedMessages: Map<string, any> = new Map<string, any>();\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0;\n\n // 子类通过:declare types : { } & typeof FastEvent.types 扩展类型\n types = null as unknown as {\n events: ExtendWildcardEvents<AllEvents>;\n eventNames: KeyOf<ExtendWildcardEvents<AllEvents>>;\n meta: AllMeta;\n context: Expand<Fallback<Context, FastEvent<AllEvents, Meta, Context>>>;\n messages: MutableMessage<AllEvents, Meta>;\n message: MutableMessage<AllEvents, Meta>;\n listeners: FastEventListeners<\n AllEvents,\n Expand<FastEventMeta & Meta & Record<string, any>>\n >;\n anyListener: TypedFastEventAnyListener<\n AllEvents,\n Expand<FastEventMeta & Meta & Record<string, any>>\n >;\n };\n /**\n * 创建FastEvent实例\n * @param options - 事件发射器的配置选项\n *\n * 默认配置:\n * - debug: false - 是否启用调试模式\n * - id: 随机字符串 - 实例唯一标识符\n * - delimiter: '/' - 事件名称分隔符\n * - context: null - 监听器执行上下文\n * - ignoreErrors: true - 是否忽略监听器执行错误\n */\n constructor(options?: Partial<FastEventOptions<Meta, Context>>) {\n this._options = Object.assign(\n {\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: \"/\",\n context: null,\n ignoreErrors: true,\n meta: undefined,\n expandEmitResults: true,\n executor: parallel(),\n },\n this._initOptions(options),\n ) as unknown as FastEventOptions<Meta, Context>;\n this._delimiter = this._options.delimiter!;\n this._context = this._options.context as Context;\n this._enableDevTools();\n }\n\n /** 获取事件发射器的配置选项 */\n get options() {\n return this._options;\n }\n get context(): Fallback<Context, typeof this> {\n return (this.options.context || this) as Fallback<Context, typeof this>;\n }\n get meta() {\n return this.options.meta;\n }\n /** 获取事件发射器的唯一标识符 */\n get id() {\n return this._options.id!;\n }\n\n /**\n * 初始化选项\n *\n * 本方法主要供子类重载\n *\n * @param initial - 可选的初始字典对象\n * @returns 返回传入的初始字典对象\n */\n _initOptions(initial?: Partial<FastEventOptions<Meta, Context>>) {\n return initial;\n }\n /**\n * 添加事件监听器到事件树中\n * @param parts - 事件路径数组\n * @param listener - 事件监听器函数\n * @param options - 监听器配置选项\n * @param options.count - 监听器触发次数限制\n * @param options.prepend - 是否将监听器添加到监听器列表开头\n * @returns [节点, 监听器索引] - 返回监听器所在节点和在节点监听器列表中的索引\n * @private\n */\n private _addListener(\n parts: string[],\n listener: TypedFastEventListener<any, any>,\n options: Required<FastEventListenOptions>,\n ): [FastEventListenerNode | undefined, number] {\n const { count, prepend } = options;\n let index: number = 0;\n const node = this._forEachNodes(parts, (node) => {\n const newListener = [\n listener,\n count,\n 0,\n options.tag,\n options.flags,\n ] as unknown as FastEventListenerMeta;\n if (prepend) {\n node.__listeners.splice(0, 0, newListener);\n index = 0;\n } else {\n node.__listeners.push(newListener);\n index = node.__listeners.length - 1;\n }\n this.listenerCount++;\n });\n return [node, index];\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n // oxlint-disable-next-line no-unused-expressions\n globalThis.__FASTEVENT_DEVTOOLS__ && globalThis.__FASTEVENT_DEVTOOLS__.add(this);\n }\n }\n /**\n *\n * 根据parts路径遍历监听器树,并在最后的节点上执行回调函数\n *\n * @param parts\n * @param callback\n * @returns\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 * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(\n node: FastEventListenerNode,\n path: string[],\n listener: TypedFastEventListener<any, any, any>,\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) {\n this.listenerCount--;\n if (isFunction(this._options.onRemoveListener)) {\n this._options.onRemoveListener(path.join(this._delimiter), listener);\n }\n }\n return isRemove;\n });\n }\n /**\n * 调用onAddListener HOOK\n * @param type\n * @param listener\n * @param options\n * @returns\n */\n private _onAddListener(type: string, listener: any, options: any) {\n if (isFunction(this._options.onAddListener)) {\n const r = this._options.onAddListener(type, listener, options);\n if (r === false) {\n throw new CancelError();\n } else if (isSubsctiber(r)) {\n return r;\n }\n }\n }\n /**\n * 注册事件监听器\n * @param type - 事件类型,支持以下格式:\n * - 普通字符串:'user/login'\n * - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)\n * - 全局监听:'**'(监听所有事件)\n * @param listener - 事件监听器函数\n * @param options - 监听器配置选项:\n * - count: 触发次数限制,0表示无限制\n * - prepend: 是否将监听器添加到监听器队列开头\n * @returns 返回订阅者对象,包含off方法用于取消监听\n *\n * @example\n * ```ts\n * // 监听特定事件\n * emitter.on('user/login', (data) => console.log(data));\n *\n * // 使用通配符\n * emitter.on('user/*', (data) => console.log(data));\n *\n * // 限制触发次数\n * emitter.on('event', handler, { count: 3 });\n * ```\n */\n // 返回迭代器\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n options?: FastEventListenOptions<AllEvents, Meta>,\n ): T extends IsTransformedEvent<AllEvents, T>\n ? FastEventIterator<\n T extends \"**\"\n ? IsAllTransformed<Events> extends true\n ? PayloadValues<AllEvents>\n : any\n : PickPayload<ValueOf<GetClosestEvents<AllEvents, T>>>\n >\n : FastEventIterator<\n T extends \"**\" ? MutableMessage<AllEvents> : GetClosestMessage<Events, T, Meta>\n >;\n\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, Meta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n\n public on(): any {\n const type = arguments[0] as string;\n\n // 解析参数和选项\n let listener: any = null;\n let options: any;\n\n // 当不提供监听器时返回异步迭代器\n const returnIterator = !isFunction(arguments[1]);\n if (returnIterator) {\n options = arguments[1] || {};\n } else {\n // on(type, listener, options?)\n listener = arguments[1];\n options = arguments[2] || {};\n }\n\n const finalOptions = Object.assign(\n {\n count: 0,\n flags: 0,\n prepend: false,\n },\n options,\n ) as Required<FastEventListenOptions>;\n\n if (type.length === 0) throw new Error(\"event type cannot be empty\");\n // 当未指定监听器时返回一个异步迭代器\n if (returnIterator || listener === null) {\n const iteratorOpts = Object.assign(\n {\n overflow: \"expand\",\n size: 10,\n maxExpandSize: 100,\n },\n finalOptions.iterable,\n ) as FastEventIteratorOptions;\n const iterator = createAsyncEventIterator<any>(this as any, type, iteratorOpts);\n iterator.create(finalOptions);\n this._onAddListener(type, iterator.listener, finalOptions);\n return iterator;\n }\n // 执行回调\n if (isFunction(this._options.onAddListener)) {\n const r = this._options.onAddListener(type, listener, finalOptions);\n if (r === false) {\n throw new CancelError();\n } else if (isSubsctiber(r)) {\n return r;\n }\n }\n\n const parts = type.split(this._delimiter);\n\n // 处理 pipes(适用于所有订阅者,包括 iterable)\n if (finalOptions.pipes && finalOptions.pipes.length > 0) {\n listener = wrapPipeListener(listener, finalOptions.pipes);\n }\n\n // 处理 filter 和 off(仅用于普通订阅者)\n if (isFunction(finalOptions.filter) || isFunction(finalOptions.off)) {\n const oldListener = listener;\n const off = () => node && this._removeListener(node, parts, listener);\n listener = renameFn<TypedFastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (\n isFunction(finalOptions.off) &&\n finalOptions.off.call(this, message as any, args)\n ) {\n off();\n return;\n }\n // 如果满足条件就触发监听器\n if (isFunction(finalOptions.filter)) {\n if (finalOptions.filter.call(this, message as any, args!))\n return oldListener.call(this, message, args);\n } else {\n return oldListener.call(this, message, args);\n }\n }, listener.name);\n }\n\n // 添加到监听器树\n const [node, index] = this._addListener(parts, listener, finalOptions);\n const off = () => node && this._removeListener(node, parts, listener);\n\n // 触发监听器保留消息\n this._emitRetainMessage(type, node, index);\n\n return {\n off,\n listener,\n [Symbol.dispose]() {\n off();\n },\n };\n }\n\n /**\n * 注册一次性事件监听器\n * @param type - 事件类型,支持与on方法相同的格式:\n * - 普通字符串:'user/login'\n * - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)\n * @param listener - 事件监听器函数\n * @returns 返回订阅者对象,包含off方法用于取消监听\n *\n * @description\n * 监听器只会在事件首次触发时被调用一次,之后会自动解除注册。\n * 这是on方法的特例,相当于设置options.count = 1。\n * 如果事件有保留消息,新注册的监听器会立即收到最近一次的保留消息并解除注册。\n *\n * @example\n * ```ts\n * // 只监听一次登录事件\n * emitter.once('user/login', (data) => {\n * console.log('用户登录:', data);\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, Meta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(\n arguments[0],\n arguments[1],\n Object.assign({}, arguments[2], { count: 1 }),\n );\n } else {\n return this.on(\n arguments[0],\n Object.assign({}, arguments[2], { count: 1 }),\n ) as unknown as FastEventSubscriber;\n }\n }\n\n /**\n * 注册一个监听器,用于监听所有事件\n * @param listener 事件监听器函数,可以接收任意类型的事件数据\n * @returns {FastEventSubscriber} 返回一个订阅者对象,包含 off 方法用于取消监听\n * @example\n * ```ts\n * const subscriber = emitter.onAny((eventName, data) => {\n * console.log(eventName, data);\n * });\n *\n * // 取消监听\n * subscriber.off();\n * ```\n */\n // 返回迭代器(不指定监听器时)\n public onAny(\n options?: FastEventListenOptions<AllEvents, AllMeta>,\n ): FastEventIterator<MutableMessage<AllEvents, AllMeta>>;\n // 指定监听器\n public onAny(\n listener: FastEventCommonListener<\n MutableMessage<AllEvents, AllMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions<AllEvents, AllMeta>,\n ): FastEventSubscriber;\n public onAny() {\n return this.on(\"**\", ...arguments) as any;\n }\n /**\n *\n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n *\n * 此方法供子类继承\n *\n */\n off(listener: TypedFastEventListener<any, any, any>): void;\n off(type: string, listener: TypedFastEventListener<any, any, any>): void;\n off(type: Types, listener: TypedFastEventListener<any, any, any>): void;\n off(type: string): void;\n off(type: Types): 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 // 只删除指定的监听器\n this._removeListener(node, parts, listener);\n } else if (type) {\n node.__listeners = [];\n }\n });\n } else {\n // 仅删除指定的监听器\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 * @description \n * - 如果提供了prefix参数,则只清除该前缀下的所有监听器\n * - 如果没有提供prefix,则清除所有监听器\n * - 同时会清空保留的事件(_retainedEvents)\n * - 重置监听器对象为空\n \n * @example\n * \n * ```ts\n * emitter.offAll(); // 清除所有监听器\n * emitter.offAll('a/b'); // 清除a/b下的所有监听器\n * \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 if (isFunction(this._options.onClearListeners)) this._options.onClearListeners.call(this);\n }\n /**\n * 移除保留的事件\n * @param prefix - 事件前缀。如果不提供,将清除所有保留的事件。\n * 如果提供前缀,将删除所有以该前缀开头的事件。\n * 如果前缀不以分隔符结尾,会自动添加分隔符。\n * @private\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 clear(prefix?: string) {\n this.offAll(prefix);\n this._removeRetainedEvents(prefix);\n }\n\n /**\n * 发送最后一次事件的消息给对应的监听器\n *\n * @param type - 事件类型,支持通配符(*)匹配\n * @private\n *\n * 处理流程:\n * 1. 如果事件类型包含通配符,则遍历所有保留的消息,匹配符合模式的事件\n * 2. 如果是普通事件类型,则直接获取对应的保留消息\n * 3. 遍历匹配到的消息,查找对应路径的监听器节点\n * 4. 执行所有匹配到的监听器\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 // 找出所有保留的消息\n const patterns = type.split(this._delimiter);\n this.retainedMessages.forEach((message, type) => {\n const parts = type.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 * @param node 当前遍历的监听器节点\n * @param parts 事件名称按'.'分割的部分数组\n * @param callback 遍历到目标节点时的回调函数\n * @param index 当前遍历的parts数组索引,默认为0\n * @param lastFollowing 当命中**时该值为true, 注意**只能作在路径的最后面,如a.**有效,而a.**.b无效\n * @private\n *\n * 支持三种匹配模式:\n * - 精确匹配: 'a.b.c'\n * - 单层通配: 'a.*.c'\n * - 多层通配: 'a.**'\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\n if (lastFollowing === true) {\n this._traverseToPath(node, parts, callback, index + 1, true);\n return;\n }\n\n if (\"*\" in node) {\n this._traverseToPath(node[\"*\"], parts, callback, index + 1);\n }\n //\n if (\"**\" in node) {\n this._traverseToPath(node[\"**\"], parts, callback, index + 1, true);\n }\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 // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node;\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 // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(\n listener: TypedFastEventListener,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<any> | undefined,\n e: any,\n ) {\n if (e instanceof Error) {\n // @ts-ignore\n e._emitter = `${listener.name || \"anonymous\"}:${message.type}`;\n }\n if (isFunction(this._options.onListenerError)) {\n try {\n this._options.onListenerError.call(this, e, listener, message, args);\n } catch {}\n }\n if (this._options.ignoreErrors) {\n return e;\n } else {\n throw e;\n }\n }\n private _setListenerFlags(flags: any, value: FastEventListenerFlags): FastEventListenerFlags {\n if (!flags || flags === 0) return value;\n return flags | value;\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\n * @param args - 监听器参数\n * @param catchErrors - 是否捕获并处理执行过程中的错误\n * @returns 监听器的执行结果或错误对象(如果配置了ignoreErrors)\n * @private\n *\n * @description\n * 执行单个监听器函数,处理以下情况:\n * - 如果监听器是包装过的(有__wrappedListener属性),调用包装的函数\n * - 否则直接调用监听器函数\n * - 使用配置的上下文(_context)作为this\n * - 捕获并处理执行过程中的错误:\n * - 如果有onListenerError回调,调用它\n * - 如果配置了ignoreErrors,返回错误对象\n * - 否则抛出错误\n */\n private _executeListener(\n listener: TypedFastEventListener<any, any>,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<any> | undefined,\n catchErrors: boolean = false,\n ): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(\n listener,\n message,\n args,\n new AbortError(listener.name),\n );\n }\n const isTransformed = ((args?.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n\n let result = listener.call(\n this.context,\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(listener, message, args, e),\n );\n }\n return result;\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e);\n }\n }\n private _getListenerExecutor(args: FastEventListenerArgs): FastListenerExecutor | undefined {\n if (!args) return;\n const executor = args.executor || this._options.executor;\n if (isFunction(executor)) return executor;\n }\n\n /**\n * 执行监听器节点列表中的所有监听器函数\n * @param nodes 监听器节点列表\n * @param message 事件消息对象\n * @param args 监听器参数\n * @param args 监听器参数\n * @returns 所有监听器函数的执行结果数组\n * @private\n *\n * 执行流程:\n * 1. 将所有节点中的监听器函数展平为一维数组\n * 2. 通过执行器执行所有监听器函数\n * 3. 更新监听器的执行次数,并移除达到执行次数限制的监听器\n */\n private _executeListeners(\n nodes: FastEventListenerNode[],\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<Meta>,\n filter?: (listener: FastEventListenerMeta, node: FastEventListenerNode) => boolean,\n ): any[] {\n if (!nodes || nodes.length === 0) return [];\n // 1. 遍历所有监听器任务,即需要执行的监听器函数[]\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 // 执行监听器前计数选减一,否则如果在监听器函数中再次触发时会导致重复执行。\n // 比如:在once('x')监听函数中执行再次emit('x')就会导致循环\n this._decListenerExecCount(listeners);\n\n const executeor = this._getListenerExecutor(args);\n if (executeor) {\n const r = executeor(\n listeners.map((listener) => listener[0]),\n message,\n args,\n this._executeListener.bind(this),\n ) as any[];\n return Array.isArray(r) ? r : [r];\n } else {\n return listeners.map((listener) =>\n this._executeListener(listener[0][0], message, args, true),\n );\n }\n }\n /**\n * 减少侦听器的执行次数\n * @param listeners\n */\n _decListenerExecCount(listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][]) {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastEventListenerMeta;\n meta[2]++; // 实际执行的次数\n // =0不限执行次数,>0时代表执行次数限制\n if (meta[1] > 0 && meta[1] <= meta[2]) {\n listeners[i][2].splice(i, 1);\n }\n }\n }\n\n /**\n * 获取指定类型的所有事件监听器\n * @param type - 事件类型,必须是 AllEvents 的键\n * @returns 包含指定类型的所有监听器元数据的数组\n */\n getListeners(type: keyof AllEvents): FastEventListenerMeta[];\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 return nodes[0].__listeners;\n }\n /**\n * 清除所有事件或指定事件的保留消息\n * @param type\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 * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n * @param retain - 是否保留该事件(用于新订阅者)\n * @param meta - 事件元数据\n * @returns 所有监听器的执行结果数组\n *\n * @example\n * // 方式1: 参数形式\n * emit('user.login', { id: 1 }, true)\n *\n * // 方式2: 对象形式\n * emit({ type: 'user.login', payload: { id: 1 } ,meta:{...}}}, true)\n */\n /**\n * 同步触发事件\n * @param type - 事件类型,可以是字符串或预定义的事件类型\n * @param payload - 事件数据负载\n * @param retain - 是否保留该事件,用于后续新的订阅者\n * @param meta - 事件元数据\n * @returns 所有监听器的执行结果数组\n *\n * @description\n * 同步触发指定类型的事件,支持两种调用方式:\n * 1. 参数形式:emit(type, payload, retain, meta)\n * 2. 对象形式:emit({ type, payload, meta }, retain)\n *\n * 特性:\n * - 支持通配符匹配,一个事件可能触发多个监听器\n * - 如果设置了retain为true,会保存最后一次的事件数据\n * - 按照注册顺序同步调用所有匹配的监听器\n * - 如果配置了ignoreErrors,监听器抛出的错误会被捕获并返回\n *\n * @example\n * ```ts\n * // 简单事件触发\n * emitter.emit('user/login', { userId: 123 });\n *\n * // 带保留的事件触发\n * emitter.emit('status/change', { online: true }, true);\n *\n * // 带元数据的事件触发\n * emitter.emit('data/update', newData, false, { timestamp: Date.now() });\n *\n * // 使用对象形式触发\n * emitter.emit({\n * type: 'user/login',\n * payload: { userId: 123 },\n * meta: { time: Date.now() }\n * }, true);\n *\n * // 清除保留事件\n * emitter.emit(\"user/login\")\n *\n * ```\n *\n * 为什么事件要使用UnTransformedEvents?\n *\n * 因为如果事件使用NotPayload,则会进行转换\n *\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 string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n options?: FastEventListenerArgs<Partial<Meta>>,\n ): R[];\n public emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<AllEvents, Meta>, retain?: boolean): R[];\n public emit<R = any>(\n message: {\n type: keyof AllEvents;\n },\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: FastEventMessage, retain?: boolean): R[];\n public emit<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit(): any {\n const [message, args] = parseEmitArgs<AllEvents, Meta>(arguments, this.options.meta);\n\n if (isFunction(args.parseArgs)) {\n args.parseArgs(message, args);\n }\n const parts = message.type.split(this._delimiter);\n if (args.retain) {\n this.retainedMessages.set(message.type, message);\n }\n const results: any[] = [];\n const nodes: FastEventListenerNode[] = [];\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n if (isFunction(this._options.onBeforeExecuteListener)) {\n const r = this._options.onBeforeExecuteListener.call(this, message, args);\n if (Array.isArray(r)) {\n return r;\n } else if (r === false) {\n throw new AbortError(message.type);\n }\n }\n // 触发时进行消息转换\n if (isFunction(this._options.transform)) {\n message.payload = this._options.transform.call(this, message as any);\n args.rawEventType = message.type;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n }\n // 执行监听器\n results.push(...this._executeListeners(nodes, message, args));\n\n if (isFunction(this._options.onAfterExecuteListener)) {\n this._options.onAfterExecuteListener.call(this, message, results, nodes);\n }\n // 将results内部所有expandable的项展开,见utils\\expandable.ts说明\n if (this._options.expandEmitResults) {\n expandEmitResults(results);\n }\n return results;\n }\n\n /**\n * 异步触发事件\n * @param type - 事件类型,可以是字符串或预定义的事件类型\n * @param payload - 事件数据负载\n * @param retain - 是否保留该事件,用于后续新的订阅者\n * @param meta - 事件元数据\n * @returns Promise,解析为所有监听器的执行结果数组\n *\n * @description\n * 异步触发指定类型的事件,与emit方法类似,但有以下区别:\n * - 返回Promise,等待所有异步监听器执行完成\n * - 使用Promise.allSettled处理监听器的执行结果\n * - 即使某些监听器失败,也会等待所有监听器执行完成\n * - 返回结果包含成功值或错误信息\n *\n * @example\n * ```ts\n * // 异步事件处理\n * const results = await emitter.emitAsync('data/process', rawData);\n *\n * // 处理结果包含成功和失败的情况\n * results.forEach(result => {\n * if (result instanceof Error) {\n * console.error('处理失败:', result);\n * } else {\n * console.log('处理成功:', result);\n * }\n * });\n *\n * // 带元数据的异步事件\n * await emitter.emitAsync('batch/process', items, false, {\n * batchId: 'batch-001',\n * timestamp: Date.now()\n * });\n * ```\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 string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n options?: FastEventListenerArgs<Partial<Meta>>,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<AllEvents, Meta>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: {\n type: keyof AllEvents;\n },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n\n public async emitAsync<R = any>(): Promise<(R | Error)[]> {\n const results = await Promise.allSettled(this.emit.apply(this, arguments as 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 /**\n * 等待指定事件发生,返回一个Promise\n * @param type - 要等待的事件类型\n * @param timeout - 超时时间(毫秒),默认为0表示永不超时\n * @returns Promise,解析为事件消息对象,包含type、payload和meta\n *\n * @description\n * 创建一个Promise,在指定事件发生时解析。\n * - 当事件触发时,Promise会解析为事件消息对象\n * - 如果设置了timeout且超时,Promise会被拒绝\n * - 一旦事件发生或超时,会自动取消事件监听\n *\n * @example\n * ```ts\n * try {\n * // 等待登录事件,最多等待5秒\n * const event = await emitter.waitFor('user/login', 5000);\n * console.log('用户登录成功:', event.payload);\n * } catch (error) {\n * console.error('等待登录超时');\n * }\n *\n * // 无限等待事件\n * const event = await emitter.waitFor('server/ready');\n * console.log('服务器就绪');\n *\n * // 等待指定的事件发生,并且如果该事件有其他订阅者,则同时等待该事件的所有订阅执行完成\n * waitFor\n *\n *\n *\n * ```\n */\n public waitFor<T extends string = KeyOf<AllEvents>>(\n type: T,\n timeout?: number,\n ): Promise<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : FastEventMessage<T, GetClosestEventPayload<AllEvents, T>, Meta>\n >;\n public waitFor<T extends string = string>(\n type: T,\n timeout?: number,\n ): Promise<TypedFastEventMessage<AllEvents, Meta>>;\n\n public waitFor(): Promise<any> {\n const type = arguments[0] as any;\n const timeout = arguments[1] as number;\n return new Promise<any>((resolve, reject) => {\n let tid: any;\n let subscriber: FastEventSubscriber;\n const listener = (message: any) => {\n clearTimeout(tid);\n subscriber?.off();\n resolve(message);\n };\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber?.off();\n reject(new Error(\"wait for event<\" + type + \"> is timeout\"));\n }, timeout);\n }\n // 订阅事件\n subscriber = this.on(type, listener as any) as unknown as FastEventSubscriber;\n });\n }\n\n /**\n * 创建一个新的事件作用域\n * @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前\n * @returns 新的FastEventScope实例\n *\n * @description\n * 创建一个新的事件作用域,用于在特定命名空间下管理事件。\n *\n * 重要特性:\n * - 作用域与父事件发射器共享同一个监听器表\n * - 作用域中的事件会自动添加前缀\n * - 作用域的所有操作都会映射到父事件发射器上\n * - 作用域不是完全隔离的,只是提供了事件名称的命名空间\n *\n * @example\n * ```ts\n * const emitter = new FastEvent();\n *\n * // 创建用户相关事件的作用域\n * const userEvents = emitter.scope('user');\n *\n * // 在作用域中监听事件\n * userEvents.on('login', (data) => {\n * // 实际监听的是 'user/login'\n * console.log('用户登录:', data);\n * });\n *\n * // 在作用域中触发事件\n * userEvents.emit('login', { userId: 123 });\n * // 等同于 emitter.emit('user/login', { userId: 123 })\n *\n * // 创建嵌套作用域\n * const profileEvents = userEvents.scope('profile');\n * profileEvents.emit('update', { name: 'John' });\n * // 等同于 emitter.emit('user/profile/update', { name: 'John' })\n *\n * // 清理作用域\n * userEvents.offAll(); // 清理 'user' 前缀下的所有事件\n * ```\n */\n scope<P extends string = string, ScopeInstance extends IFastEventScope = IFastEventScope>(\n prefix: P,\n scopeObj: ScopeInstance,\n options?: DeepPartial<FastEventScopeOptions<Meta>>,\n ): FastEventScope<\n RemoveAnyRecord<ScopeEvents<AllEvents, P> & ScopeInstance[\"__events__\"]>,\n RemoveAnyRecord<Meta & ScopeInstance[\"__meta__\"]>,\n RemoveAnyRecord<Context & ScopeInstance[\"__context__\"]>\n > &\n ScopeInstance;\n scope<\n E = unknown, //用于扩展事件\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(\n prefix: P,\n options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>,\n ): FastEventScope<ScopeEvents<Events, P> & E, Meta & M, C>;\n scope() {\n const [prefix, scopeObj, options] = parseScopeArgs(\n arguments,\n this.options.meta,\n this.options.context,\n );\n let scope;\n if (scopeObj) {\n scope = scopeObj;\n } else {\n scope = new FastEventScope();\n }\n scope.bind(this as any, prefix, options);\n return scope;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/consts.ts","../src/types/FastEvents.ts","../src/utils/parseEmitArgs.ts","../src/utils/isFastEventScope.ts","../src/utils/parseScopeArgs.ts","../src/utils/renameFn.ts","../src/utils/isFunction.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/utils/isFastEventMessage.ts","../src/utils/isString.ts","../src/utils/expandable.ts","../src/utils/isSubsctiber.ts","../src/utils/isClass.ts","../src/utils/isFastEvent.ts","../src/executors/parallel.ts","../src/utils/expandEmitResults.ts","../src/utils/tryReturnError.ts","../src/eventIterator.ts","../src/utils/wrapPipeListener.ts","../src/event.ts"],"names":["__FastEvent__","Symbol","for","__FastEventScope__","FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","UnboundError","_UnboundError","AbortError","_AbortError","CancelError","_CancelError","QueueOverflowError","_QueueOverflowError","FastEventListenerFlags","parseEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","meta","emitArgs","Object","assign","retain","type","payload","keys","length","undefined","executor","isFastEventScope","target","parseScopeArgs","scopeContext","prefix","scopeObj","options","context","renameFn","fn","name","defineProperty","value","configurable","isFunction","FastEventScope","__events__","__meta__","__context__","_options","emitter","_initOptions","listeners","getListeners","bind","scope","endsWith","delimiter","initial","_getScopeListener","listener","scopePrefix","scopeThis","rawEventType","startsWith","msg","flags","Transformed","substring","call","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","_transformMessage","transform","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","_FastEventScope","isPathMatched","path","pattern","pathLen","patternLen","i","removeItem","arr","condition","removedIndices","push","splice","reverse","isFastEventMessage","isString","str","__expandable__","expandable","isExpandable","isSubsctiber","val","isClass","toString","prototype","isFastEvent","parallel","__name","execute","expandEmitResults","items","item","Array","isArray","tryReturnError","callback","catch","e","resolve","FastEventIterator","eventEmitter","eventName","buffer","resolvers","errorResolvers","isStopped","error","currentSize","hasNewMessage","_listener","_ready","_listenOptions","_cleanups","defaultSize","defaultMaxExpandSize","size","maxExpandSize","expandOverflow","overflow","lifetime","onPush","onPop","onDrop","onError","signal","onMessage","ready","create","subscriber","aborted","offFn","addEventListener","removeEventListener","Date","now","handleOverflow","strategy","Math","min","shift","_args","data","done","abort","forEach","resolver","next","reject","nextMessage","enterTime","asyncIterator","throw","return","dispose","_FastEventIterator","createAsyncEventIterator","wrapPipeListener","pipes","decorator","FastEvent","__listeners","_delimiter","_context","retainedMessages","Map","listenerCount","types","debug","id","random","ignoreErrors","_enableDevTools","_addListener","parts","prepend","index","_forEachNodes","node","newListener","tag","globalThis","__FASTEVENT_DEVTOOLS__","add","current","part","_removeListener","isRemove","onRemoveListener","join","_onAddListener","onAddListener","r","returnIterator","finalOptions","iteratorOpts","iterable","iterator","split","filter","oldListener","_emitRetainMessage","hasWildcard","includes","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","listenerNode","messages","patterns","has","get","_executeListeners","listenerMeta","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","_emitter","onListenerError","_setListenerFlags","_executeListener","catchErrors","abortSignal","isTransformed","_getListenerExecutor","nodes","_decListenerExecCount","executeor","clearRetainMessages","parseArgs","set","results","onBeforeExecuteListener","onAfterExecuteListener","tid","clearTimeout","setTimeout","_FastEvent"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","/**\n * 事件相关\n */\nimport { TypedFastEventMessage, FastEventMessage } from \"./FastEventMessages\";\nimport { FastEventSubscriber } from \"./FastEventSubscribers\";\nimport { TypedFastEventListener, FastEventListenerNode } from \"./FastEventListeners\";\nimport type { FastListenerExecutor } from \"../executors\";\nimport type { FastListenerPipe } from \"../pipes\";\nimport { DeepPartial } from \"./utils/DeepPartial\";\nimport { FastEventIteratorOptions } from \"../eventIterator\";\n\nexport type FastEventOptions<Meta = Record<string, any>, Context = never> = {\n id: string;\n debug: boolean;\n // 事件分隔符\n delimiter: string;\n // 监听器函数执行上下文\n context: Context;\n // 当执行监听器函数出错时是否忽略,默认true\n ignoreErrors: boolean;\n // 额外的全局元数据,当触发事件时传递给监听器\n meta: Meta;\n // 当创建新监听器时回调,返回false中止添加监听器\n onAddListener?: (\n type: string,\n listener: TypedFastEventListener,\n options: FastEventListenOptions<Record<string, any>, Meta>,\n ) => boolean | FastEventSubscriber | void;\n // 当移除监听器时回调\n onRemoveListener?: (type: string, listener: TypedFastEventListener) => void;\n // 当清空监听器时回调\n onClearListeners?: () => void;\n // 当监听器函数执行出错时的回调,用于诊断时使用,可以打印错误信息\n onListenerError?: (\n error: Error,\n listener: TypedFastEventListener,\n message: TypedFastEventMessage<any, Meta>,\n args: FastEventListenerArgs<Meta> | undefined,\n ) => void;\n // 当执行监听器前时回调,返回false代表取消执行,any[]返回给emit\n onBeforeExecuteListener?: (\n message: TypedFastEventMessage<any, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean | void | any[];\n // 当执行监听器后时回调\n onAfterExecuteListener?: (\n message: TypedFastEventMessage<any, Meta>,\n returns: any[],\n listeners: FastEventListenerNode[],\n ) => void;\n /**\n * 全局执行器\n */\n executor?: FastListenerExecutor;\n /**\n * 是否展开emit返回值,默认为false,用于将事件转发给其他FastEvent时使用\n */\n expandEmitResults?: boolean;\n /**\n * 对接收到的消息进行转换,用于将消息转换成其他格式\n *\n * new FastEvent({\n * transform:(message)=>{\n * message.payload\n * }\n * })\n */\n transform?: (message: FastEventMessage) => any;\n};\n\nexport interface FastEvents {}\n\nexport type FastEventListenOptions<\n Events extends Record<string, any> = Record<string, any>,\n Meta = any,\n> = {\n // 侦听执行次数,当为1时为单次侦听,为0时为永久侦听,其他值为执行次数,每执行一次减一,减到0时移除监听器\n count?: number;\n // 将监听器添加到监听器列表的头部\n prepend?: boolean;\n // 该监听器会在其他监听器执行完毕后再触发执行\n flags?: number;\n filter?: (\n message: TypedFastEventMessage<Events, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean;\n // 当执行监听器前,如果此函数返回true则自动注销监听\n off?: (\n message: TypedFastEventMessage<Events, Meta>,\n args: FastEventListenerArgs<Meta>,\n ) => boolean;\n // 对监听器函数进行包装装饰,返回包装后的函数\n pipes?: FastListenerPipe[];\n /**\n * 为监听器添加一个tag,在监听器注册表中记录,用于调试使用\n * emitter.on(type,listener,{tag:\"x\"})\n * emitter.getListeners(tag)\n */\n tag?: string;\n /**\n * 异步迭代器选项\n *\n * 用于配置返回异步迭代器的参数\n * \n * 默认值是\n {\n overflow: \"expand\",\n size: 10,\n maxExpandSize: 100,\n }\n */\n iterable?: FastEventIteratorOptions;\n};\n\nexport enum FastEventListenerFlags {\n Transformed = 1,\n}\n\nexport type FastEventListenerArgs<M = Record<string, any>> = {\n retain?: boolean;\n meta?: DeepPartial<M> & Record<string, any>;\n abortSignal?: AbortSignal; // 用于传递给监听器函数\n /**\n *\n * allSettled: 使用Promise.allSettled()执行所有监听器\n * race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略\n * balance: 尽可能平均执行各个监听器\n * sequence: 按照监听器添加顺序依次执行\n */\n executor?: FastListenerExecutor;\n /**\n * 当emit参数解析完成后的回调,用于修改emit参数\n */\n parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;\n /**\n * 额外的标识\n *\n * - 1: transformed 当消息是经过transform转换后的消息时的标识\n *\n */\n flags?: FastEventListenerFlags;\n /**\n * 如果消息经过转换前的原主题\n */\n rawEventType?: string;\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\n\nexport function parseEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown,\n>(\n args: IArguments,\n emitterMeta: any,\n scopeMeta?: any,\n scopeExecutor?: any,\n): [TypedFastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let meta: any;\n let emitArgs: FastEventListenerArgs<Meta> = {};\n let message = {} as TypedFastEventMessage<Events, Meta>;\n if (typeof args[0] === \"object\") {\n Object.assign(message, args[0]);\n emitArgs = typeof args[1] === \"boolean\" ? { retain: args[1] } : args[1] || {};\n meta = args[0].meta;\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] } : args[2] || {};\n }\n meta = Object.assign({}, emitterMeta, scopeMeta, emitArgs.meta, meta);\n\n if (Object.keys(meta).length === 0) {\n meta = undefined;\n delete message.meta;\n } else {\n message.meta = meta;\n }\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor;\n }\n\n return [message, emitArgs];\n}\n","import type { FastEventScope } from \"../scope\"\n\nexport function isFastEventScope(target: any): target is FastEventScope {\n if (!target) return false\n return typeof target === 'object' && '__FastEventScope__' in target\n}","import { isFastEventScope } from \"./isFastEventScope\"\n\nexport function parseScopeArgs(args: IArguments, scopeMeta?: any, scopeContext?: any) {\n const prefix = args[0]\n const scopeObj = isFastEventScope(args[1]) ? args[1] : undefined\n const options = (scopeObj ? args[2] : args[1]) || {}\n options.meta = Object.assign({}, scopeMeta, options?.meta)\n options.context = options.context !== undefined ? options.context : scopeContext\n return [prefix, scopeObj, options]\n}","\n\n\n\n/**\n * 重命名函数,修改函数的 name 属性\n * @param fn 需要重命名的函数\n * @param name 新的函数名\n * @returns 返回重命名后的函数\n */\nexport function renameFn<F>(fn: F, name: string): F {\n Object.defineProperty(fn, 'name', {\n value: name || 'anonymous',\n configurable: true\n });\n return fn;\n}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","// oxlint-disable no-unused-vars\nimport { UnboundError } from \"./consts\";\nimport type { FastEvent } from \"./event\";\nimport { FastListenerExecutor } from \"./executors/types\";\nimport {\n ScopeEvents,\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n UnTransformedEvents,\n ReplaceWildcard,\n GetPayload,\n Fallback,\n GetClosestEventPayload,\n} from \"./types\";\nimport {\n FastEventEmitMessage,\n TypedFastEventMessage,\n FastEventMeta,\n FastEventMessage,\n} from \"./types/FastEventMessages\";\nimport { FastEventSubscriber } from \"./types/FastEventSubscribers\";\nimport { TypedFastEventListener, FastEventCommonListener } from \"./types/FastEventListeners\";\nimport {\n FastEventListenerArgs,\n FastEventListenOptions,\n FastEventListenerFlags,\n} from \"./types/FastEvents\";\nimport { IsTransformedEvent } from \"./types/transformed/IsTransformedEvent\";\nimport { ExtendWildcardEvents } from \"./types/wildcards/ExtendWildcardEvents\";\nimport { PayloadValues } from \"./types/transformed/PayloadValues\";\nimport { ValueOf } from \"./types/utils/ValueOf\";\nimport { Dict } from \"./types/utils/Dict\";\nimport { DeepPartial } from \"./types/utils/DeepPartial\";\nimport { IsAllTransformed } from \"./types/transformed/IsAllTransformed\";\nimport { parseEmitArgs } from \"./utils/parseEmitArgs\";\nimport { parseScopeArgs } from \"./utils/parseScopeArgs\";\nimport { renameFn } from \"./utils/renameFn\";\nimport { PickPayload } from \"./types/transformed/PickPayload\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { FastEventIterator } from \"./eventIterator\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\n\nexport type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {\n meta: FastEventScopeMeta & FastEventMeta & Meta;\n context: Context;\n executor?: FastListenerExecutor;\n /**\n * 对接收到的消息进行转换,用于将消息转换成其他格式\n *\n * new FastEvent({\n * transform:(message)=>{\n * message.payload\n * }\n * })\n */\n transform?: (message: FastEventMessage) => any;\n};\n\nexport interface FastEventScopeMeta {\n scope: string;\n}\n\nexport interface IFastEventScope<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n> {\n __FastEventScope__: boolean;\n readonly __events__: Events;\n readonly __meta__: Meta;\n readonly __context__: Context;\n}\n\nexport class FastEventScope<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = FastEventMeta & FastEventScopeMeta & Meta,\n> {\n __FastEventScope__: boolean = true;\n // 添加类型标记\n readonly __events__!: Events;\n readonly __meta__!: Meta & FastEventScopeMeta;\n readonly __context__!: Context;\n private _options: DeepPartial<FastEventScopeOptions<FinalMeta, Context>> = {};\n\n declare types: {\n events: ExtendWildcardEvents<Events>;\n eventNames: KeyOf<ExtendWildcardEvents<Events>>;\n messages: MutableMessage<Events, FinalMeta>;\n rawEvents: Events;\n meta: FinalMeta;\n };\n prefix: string = \"\";\n emitter!: FastEvent<any>;\n constructor(options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>) {\n this._options = Object.assign(\n {},\n this._initOptions(options),\n ) as unknown as FastEventScopeOptions<FinalMeta, Context>;\n }\n get context(): Fallback<Context, typeof this> {\n return (this.options.context || this) as Fallback<Context, typeof this>;\n }\n get options() {\n return this._options as FastEventScopeOptions<FinalMeta, Context>;\n }\n /**\n * 获取监听器\n * @returns 监听器\n */\n get listeners() {\n return this.emitter.getListeners(this.prefix);\n }\n bind(\n emitter: FastEvent<any>,\n prefix: string,\n options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>,\n ) {\n this.emitter = emitter;\n this._options = Object.assign(\n this._options,\n {\n scope: prefix,\n },\n options,\n ) as unknown as Required<FastEventScopeOptions<FinalMeta, Context>>;\n if (prefix.length > 0 && !prefix.endsWith(emitter.options.delimiter!)) {\n this.prefix = prefix + emitter.options.delimiter;\n }\n }\n\n /**\n * 初始化选项\n *\n * 本方法主要供子类重载\n *\n * @param initial - 可选的初始字典对象\n * @returns 返回传入的初始字典对象\n */\n _initOptions(initial: Dict | undefined) {\n return initial;\n }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: TypedFastEventListener): TypedFastEventListener {\n const scopePrefix = this.prefix;\n if (scopePrefix.length === 0) return listener;\n // 如果没有指定监听器,则使用onMessage作为监听器\n if (!listener) {\n throw new Error();\n }\n // oxlint-disable-next-line typescript/no-this-alias\n const scopeThis = this;\n const scopeListener = renameFn(function (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) {\n const type = args.rawEventType || message.type;\n if (type.startsWith(scopePrefix)) {\n // 1. 判断是否经过全局Transform转换\n // 消息是否经过转换,如果经过转换,由于结果不确定,所以不进行前缀处理,直接将消息传递给监听器\n const isTransformed = ((args.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n let msg = isTransformed\n ? message\n : Object.assign({}, message, {\n type: type.substring(scopePrefix.length),\n });\n\n return listener.call(scopeThis.context, msg, args);\n }\n }, listener.name) as TypedFastEventListener;\n return scopeListener;\n }\n private _getScopeType(type: string) {\n return type === undefined ? undefined : this.prefix + type;\n }\n private _fixScopeType(type: string) {\n return type.startsWith(this.prefix) ? type.substring(this.prefix.length) : type;\n }\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): T extends IsTransformedEvent<Events, T>\n ? FastEventIterator<\n T extends \"**\"\n ? IsAllTransformed<Events> extends true\n ? PayloadValues<Events>\n : any\n : PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n >\n : FastEventIterator<\n T extends \"**\" ? MutableMessage<Events> : GetClosestMessage<Events, T, FinalMeta>\n >;\n\n // 指定监听器\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, FinalMeta>,\n FinalMeta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public on(): FastEventSubscriber | FastEventIterator<any> {\n if (!this.emitter) throw new UnboundError();\n const args = [...arguments] as [any, any, any];\n args[0] = this._getScopeType(args[0]);\n args[1] = this._getScopeListener(args[1]);\n return this.emitter.on(...args);\n }\n /**\n * 只订阅一次\n * @param type\n * @param options\n */\n public once<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n listener: FastEventCommonListener<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : T extends \"**\"\n ? MutableMessage<Events>\n : GetClosestMessage<Events, T, FinalMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }));\n }\n /**\n * 订阅全部\n * @param options\n */\n public onAny(\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): FastEventIterator<MutableMessage<Events, FinalMeta>>;\n\n public onAny(\n listener: FastEventCommonListener<\n MutableMessage<Events, FinalMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions<Events, FinalMeta>,\n ): FastEventSubscriber;\n onAny() {\n return this.on(\"**\" as any, ...(arguments as any)) as any;\n }\n\n off(listener: TypedFastEventListener<any, any, any>): void;\n off(type: string, listener: TypedFastEventListener<any, any, any>): void;\n off(type: Types, listener: TypedFastEventListener<any, any, any>): void;\n off(type: string): void;\n off(type: Types): void;\n off() {\n const args = arguments as unknown as [any, any];\n if (typeof args[0] === \"string\") {\n args[0] = this._getScopeType(args[0]);\n }\n this.emitter.off(...args);\n }\n offAll() {\n this.emitter.offAll(this.prefix.substring(0, this.prefix.length - 1));\n }\n clear() {\n this.emitter.clear(this.prefix.substring(0, this.prefix.length - 1));\n }\n /**\n * 触发事件\n * @param type\n * @param directive\n */\n public emit<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<Events>[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<Events>, T>\n : any,\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<Events>, T>\n : any,\n options?: FastEventListenerArgs<Partial<FinalMeta>>,\n ): R[];\n public emit<R = any, T extends KeyOf<Events> = KeyOf<Events>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<Events, FinalMeta>, retain?: boolean): R[];\n public emit<R = any>(\n message: {\n type: keyof Events;\n },\n retain?: boolean,\n ): R[];\n public emit<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<Events>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit(): any {\n let [message, args] = parseEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor,\n );\n\n this._transformMessage(message as any, args);\n message.type = this._getScopeType(message.type)!;\n return this.emitter.emit(message as any, args);\n }\n\n private _transformMessage(message: FastEventMessage, args: FastEventListenerArgs<FinalMeta>) {\n if (isFunction(this._options.transform)) {\n args.rawEventType = this._getScopeType(message.type)!;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n message.payload = this._options.transform.call(this, message);\n }\n }\n\n public async emitAsync<R = any, T extends Types = Types>(\n type: T,\n payload?: UnTransformedEvents<Events>[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<Events>, T>\n : any,\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<Events>, T>\n : any,\n options?: FastEventListenerArgs<Partial<FinalMeta>>,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<Events> = KeyOf<Events>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<Events>[T], Partial<FinalMeta>>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<Events, FinalMeta>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: {\n type: keyof Events;\n },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<Events>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n\n public async emitAsync<R = any>(): Promise<[R | Error][]> {\n const results = await Promise.allSettled(this.emit.apply(this, arguments as 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 public async waitFor<T extends string = KeyOf<Events>>(\n type: T,\n timeout?: number,\n ): Promise<\n T extends IsTransformedEvent<Events, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : FastEventMessage<T, GetClosestEventPayload<Events, T>, FinalMeta>\n >;\n public async waitFor<T extends string = string>(\n type: T,\n timeout?: number,\n ): Promise<TypedFastEventMessage<Events, FinalMeta>>;\n\n public async waitFor(): Promise<any> {\n const type = arguments[0] as string;\n const timeout = arguments[1] as number;\n const message = await this.emitter.waitFor(this._getScopeType(type)!, timeout);\n const scopeMessage = Object.assign({}, message, {\n type: this._fixScopeType(message.type),\n });\n return scopeMessage;\n }\n /**\n * 创建一个新的作用域实例\n * @param prefix - 作用域前缀\n * @returns 新的FastEventScope实例\n *\n * @description\n * 基于当前作用域创建一个新的子作用域。新作用域会继承当前作用域的所有特性,\n * 并在事件类型前添加额外的前缀。这允许创建层级化的事件命名空间。\n *\n * 作用域的特性:\n * - 自动为所有事件类型添加前缀\n * - 在触发事件时自动添加前缀\n * - 在接收事件时自动移除前缀\n * - 支持多层级的作用域嵌套\n *\n * @example\n * ```ts\n * const emitter = new FastEvent();\n * const userScope = emitter.scope('user');\n * const profileScope = userScope.scope('profile');\n *\n * // 在profileScope中监听'update'事件\n * // 实际监听的是'user/profile/update'\n * profileScope.on('update', (data) => {\n * console.log('Profile updated:', data);\n * });\n *\n * // 在profileScope中触发'update'事件\n * // 实际触发的是'user/profile/update'\n * profileScope.emit('update', { name: 'John' });\n * ```\n */\n\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(\n prefix: P,\n options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>,\n ): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C>;\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n ScopeInstance extends IFastEventScope<Record<string, any>, any, any> = FastEventScope<\n Record<string, any>,\n any,\n any\n >,\n >(\n prefix: P,\n scopeObj: ScopeInstance,\n options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>,\n ): FastEventScope<ScopeEvents<Events & E, P>, FinalMeta & M, C> & ScopeInstance; //FastEventScopeExtend<Events & E, P, ScopeInstance, Meta>;\n scope<\n E extends Record<string, any> = Record<string, any>,\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(): any {\n const [prefix, scopeObj, options] = parseScopeArgs(\n arguments,\n this.options.meta,\n this.options.context,\n );\n let scope: FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;\n if (scopeObj) {\n scope = scopeObj;\n } else {\n scope = new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>();\n }\n scope.bind(this.emitter as any, this.prefix + prefix, options);\n return scope;\n }\n}\n","/**\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","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\n\nexport function isFastEventMessage(msg: any): msg is TypedFastEventMessage {\n if (!msg) return false;\n return typeof msg === \"object\" && \"type\" in msg;\n}\n","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { FastEventSubscriber } from \"../types/FastEventSubscribers\";\n\nexport function isSubsctiber(val: any): val is FastEventSubscriber {\n return val && typeof val === \"object\" && \"off\" in val && \"listener\" in val;\n}\n","\n\nexport function isClass(target: unknown): target is new (...args: any[]) => any {\n return typeof target === 'function' &&\n (target.toString().startsWith('class ') ||\n target.prototype?.constructor === target);\n}","import { FastEvent } from \"../event\"\n\n\nexport function isFastEvent(target: any): target is FastEvent {\n if (!target) return false\n return typeof target === 'object' && '__FastEvent__' in target\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}","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","/**\n * FastEventIterator - 使用异步迭代器从 FastEvent 或 FastEventScope 订阅事件\n * 重构:使用 queue.ts 中的队列参数和逻辑\n */\n\nimport { AbortError } from \"./consts\";\nimport type { FastEvent } from \"./event\";\nimport type { FastEventScope } from \"./scope\";\nimport type { FastEventMessage } from \"./types/FastEventMessages\";\nimport type { FastEventListener } from \"./types/FastEventListeners\";\nimport type { FastEventListenerArgs, FastEventListenOptions } from \"./types/FastEvents\";\n\n// 溢出策略类型\nexport type FastQueueOverflows =\n | \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | \"slide\" // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | \"throw\"; // 当缓冲区满时,抛出异常\n\n// FastEventIterator 配置选项\nexport interface FastEventIteratorOptions<T = FastEventMessage> {\n /** 缓冲区默认大小(默认:100) */\n size?: number;\n /** 缓冲区扩展到多大时不再扩展(默认:1000) */\n maxExpandSize?: number;\n /** 当扩展到最大大小后的溢出策略(默认:'slide') */\n expandOverflow?: Omit<FastQueueOverflows, \"expand\">;\n /** 溢出策略(默认:'slide') */\n overflow?: FastQueueOverflows;\n /** 消息生命周期(毫秒),0表示不启用(默认:0) */\n lifetime?: number;\n /** 当新消息到达时触发此回调 */\n onPush?: (newMessage: T, messages: [T, number][]) => void;\n /** 当消息被弹出时触发此回调,可以在此对消息队列进行排序等操作 */\n onPop?: (messages: [T, number][], hasNew: boolean) => [T, number] | undefined;\n /** 当消息被丢弃时触发此回调 */\n onDrop?: (message: T) => void;\n /** 错误处理函数,返回true表示继续迭代,false表示停止迭代 */\n onError?: (error: Error) => boolean | Promise<boolean>;\n /** 信号,用于取消迭代 */\n signal?: AbortSignal;\n}\n\nexport class FastEventIterator<T = any> implements AsyncIterableIterator<T> {\n // 使用 [message, timestamp] 元组存储,支持 lifetime 机制\n private buffer: [T, number][] = [];\n private resolvers: Array<(value: IteratorResult<any>) => void> = [];\n private errorResolvers: Array<(error: Error) => void> = [];\n private isStopped = false; // 已经停止迭代\n private error: Error | null = null;\n private options: Required<\n Omit<FastEventIteratorOptions<T>, \"onPush\" | \"onPop\" | \"onDrop\" | \"onError\" | \"signal\">\n > & {\n onPush?: FastEventIteratorOptions<T>[\"onPush\"];\n onPop?: FastEventIteratorOptions<T>[\"onPop\"];\n onDrop?: FastEventIteratorOptions<T>[\"onDrop\"];\n onError?: FastEventIteratorOptions<T>[\"onError\"];\n signal?: AbortSignal;\n };\n private currentSize: number; // 当前缓冲区大小\n private hasNewMessage: boolean = false; // 自上次pop后是否有新消息\n private _listener: FastEventListener;\n private _ready: boolean = false;\n private _listenOptions?: FastEventListenOptions;\n private _cleanups: (() => void)[] = [];\n constructor(\n private eventEmitter: FastEvent<any> | FastEventScope<any, any, any>,\n private eventName: string,\n options: FastEventIteratorOptions<T> = {},\n ) {\n const defaultSize = 20;\n const defaultMaxExpandSize = 100;\n\n this.options = {\n size: options.size ?? defaultSize,\n maxExpandSize: options.maxExpandSize ?? defaultMaxExpandSize,\n expandOverflow: options.expandOverflow ?? \"slide\",\n overflow: options.overflow ?? \"slide\",\n lifetime: options.lifetime ?? 0,\n onPush: options.onPush,\n onPop: options.onPop,\n onDrop: options.onDrop,\n onError: options.onError ?? (() => true),\n signal: options.signal,\n };\n\n // 确保 currentSize 被正确初始化\n this.currentSize = this.options.size;\n this._listener = this.onMessage.bind(this);\n }\n get listener() {\n return this._listener;\n }\n get ready() {\n return this._ready;\n }\n /**\n * 创建异步迭代器\n */\n create(options?: FastEventListenOptions) {\n if (this._ready) return;\n this._listenOptions = options;\n try {\n // 监听事件 - 使用 FastEvent 的 on 方法,返回订阅者对象\n const subscriber = (this.eventEmitter as any).on(\n this.eventName,\n this._listener,\n options,\n );\n this._cleanups.push(() => subscriber.off());\n // 处理中止信号\n if (this.options.signal && !this.options.signal.aborted) {\n const offFn = () => {\n this.off(true);\n };\n this.options.signal.addEventListener(\"abort\", offFn);\n this._cleanups.push(() => {\n this.options.signal!.removeEventListener(\"abort\", offFn);\n });\n }\n } finally {\n this._ready = true;\n }\n }\n /**\n * 推送消息到缓冲区\n */\n private push(message: T): void {\n if (this.options.onPush) {\n this.options.onPush(message, this.buffer);\n } else {\n this.buffer.push(this.options.lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n }\n\n /**\n * 处理缓冲区溢出\n * @returns 返回 true 表示消息已添加,false 表示消息被丢弃\n */\n private handleOverflow(message: T): boolean {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n this.buffer.length >= this.options.maxExpandSize && this.options.overflow === \"expand\"\n ? this.options.expandOverflow\n : this.options.overflow;\n\n switch (strategy) {\n case \"drop\":\n if (this.options.onDrop) this.options.onDrop(message);\n return false;\n case \"expand\":\n this.currentSize = Math.min(\n this.currentSize + this.options.size,\n this.options.maxExpandSize,\n );\n this.push(message);\n return true;\n case \"slide\":\n const msg = this.buffer.shift(); // 移除最旧的消息\n if (this.options.onDrop && msg) this.options.onDrop(msg[0]);\n this.push(message);\n return true;\n case \"throw\":\n if (this.options.onDrop) this.options.onDrop(message);\n throw new Error(\n `EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`,\n );\n default:\n return false;\n }\n }\n\n private onMessage(\n message: FastEventMessage<any, any, any>,\n _args: FastEventListenerArgs,\n ): void {\n if (this.isStopped) return;\n\n // 从 FastEvent 消息中提取 payload\n const data = message as T;\n\n // 如果有等待的消费者,直接resolve\n if (this.resolvers.length > 0) {\n const resolver = this.resolvers.shift()!;\n resolver({ value: data, done: false });\n return;\n }\n\n // 否则加入缓冲区\n this.hasNewMessage = true;\n\n if (this.buffer.length < this.currentSize) {\n this.push(data);\n } else {\n this.handleOverflow(data);\n }\n }\n /**\n * 中止监听\n * @param abort\n * @returns\n */\n off(abort?: boolean): void {\n if (!this._ready) return;\n if (this.isStopped) return;\n this.isStopped = true;\n // 取消事件订阅\n this._cleanups.forEach((fn) => fn());\n this._cleanups = [];\n this.buffer = [];\n this._ready = false;\n // 如果是强制中止,如调用了AbortSign\n if (abort) {\n // 清理等待的error resolvers\n this.errorResolvers.forEach((resolver) => {\n resolver(new AbortError());\n });\n this.errorResolvers = [];\n } else {\n // 清理等待的resolvers\n this.resolvers.forEach((resolver) => {\n resolver({ value: undefined, done: true });\n });\n this.resolvers = [];\n }\n this._ready = false;\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.error) {\n return Promise.reject(this.error);\n }\n\n if (this.isStopped && this.buffer.length === 0) {\n return { value: undefined, done: true };\n }\n\n // 如果缓冲区有数据,立即返回\n if (this.buffer.length > 0) {\n let nextMessage: T | undefined;\n let enterTime: number;\n\n // 从队列中弹出消息\n if (this.options.onPop) {\n const result = this.options.onPop(this.buffer, this.hasNewMessage);\n if (result) {\n [nextMessage, enterTime] = result;\n } else {\n [nextMessage, enterTime] = this.buffer.shift() || [undefined, 0];\n }\n } else {\n [nextMessage, enterTime] = this.buffer.shift() || [undefined, 0];\n }\n\n // 重置 hasNewMessage 标志\n this.hasNewMessage = false;\n\n if (nextMessage !== undefined) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (this.options.lifetime > 0 && Date.now() - enterTime > this.options.lifetime) {\n if (this.options.onDrop) this.options.onDrop(nextMessage);\n // 递归获取下一个消息\n return this.next();\n }\n return { value: nextMessage, done: false };\n }\n }\n\n // 否则等待新事件\n return new Promise((resolve, reject) => {\n this.resolvers.push(resolve);\n this.errorResolvers.push(reject);\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this as unknown as AsyncIterableIterator<T>;\n }\n\n async done(): Promise<IteratorResult<T>> {\n this.off();\n return { value: undefined, done: true };\n }\n\n async throw(error?: any): Promise<IteratorResult<T>> {\n this.error = error;\n this.off();\n return Promise.reject(error);\n }\n\n /**\n * 当 for await...of 循环被 break、return 或 throw 中断时调用\n * 自动清理资源,防止内存泄漏\n */\n async return(): Promise<IteratorResult<T>> {\n this.off();\n return { value: undefined, done: true };\n }\n\n /**\n * 同步资源释放(支持 using 语句)\n *\n * @description\n * 当使用 `using` 语句时,此方法会在作用域结束时自动调用,\n * 执行 off() 方法取消订阅。\n *\n * @example\n * ```ts\n * {\n * using subscriber = emitter.on('event');\n * // subscriber 在作用域结束时自动调用 off()\n * }\n * ```\n */\n [Symbol.dispose](): void {\n this.off();\n }\n\n on() {\n this.create(this._listenOptions);\n this.isStopped = false;\n }\n}\n\n/**\n * 创建一个异步迭代器,从 FastEvent 或 FastEventScope 订阅事件\n * @param eventEmitter FastEvent 或 FastEventScope 实例\n * @param eventName 事件名称\n * @param options 配置选项\n * @param listenerOptions 监听器配置选项\n * @returns 异步迭代器\n */\nexport function createAsyncEventIterator<T = any>(\n eventEmitter: FastEvent<any> | FastEventScope<any, any, any>,\n eventName: string,\n options: FastEventIteratorOptions<T> = {},\n): FastEventIterator<T> {\n return new FastEventIterator<T>(eventEmitter, eventName, options);\n}\n","import { FastListenerPipe } from \"../pipes/types\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { renameFn } from \"./renameFn\";\n\nexport function wrapPipeListener(\n listener: TypedFastEventListener<any, any, any, any>,\n pipes: FastListenerPipe[],\n): TypedFastEventListener<any, any, any, any> {\n if (Array.isArray(pipes)) {\n pipes.forEach((decorator) => {\n listener = renameFn(decorator(listener), listener.name);\n });\n return listener;\n }\n return listener;\n}\n","import { RemoveAnyRecord } from \"./types/utils/RemoveAnyRecord\";\nimport { FastEventScope, IFastEventScope, type FastEventScopeOptions } from \"./scope\";\nimport {\n GetClosestEvents,\n KeyOf,\n MutableMessage,\n Expand,\n Fallback,\n ReplaceWildcard,\n UnTransformedEvents,\n FastEventMessage,\n GetClosestEventPayload,\n} from \"./types\";\nimport {\n TypedFastEventMessage,\n FastEventEmitMessage,\n FastEventMeta,\n} from \"./types/FastEventMessages\";\nimport {\n FastEventListeners,\n FastListeners,\n TypedFastEventAnyListener,\n} from \"./types/FastEventListeners\";\nimport { FastEventSubscriber } from \"./types/FastEventSubscribers\";\nimport {\n TypedFastEventListener,\n FastEventListenerNode,\n FastEventListenerMeta,\n FastEventCommonListener,\n} from \"./types/FastEventListeners\";\nimport {\n FastEventOptions,\n FastEventListenOptions,\n FastEventListenerArgs,\n FastEvents,\n FastEventListenerFlags,\n} from \"./types/FastEvents\";\nimport { IsTransformedEvent } from \"./types/transformed/IsTransformedEvent\";\nimport { ExtendWildcardEvents } from \"./types/wildcards/ExtendWildcardEvents\";\nimport { PayloadValues } from \"./types/transformed/PayloadValues\";\nimport { PickPayload } from \"./types/transformed/PickPayload\";\nimport { ValueOf } from \"./types/utils/ValueOf\";\nimport { DeepPartial } from \"./types/utils/DeepPartial\";\nimport { GetPayload } from \"./types/transformed/GetPayload\";\nimport { IsAllTransformed } from \"./types/transformed/IsAllTransformed\";\nimport { parseEmitArgs } from \"./utils/parseEmitArgs\";\nimport { isPathMatched } from \"./utils/isPathMatched\";\nimport { removeItem } from \"./utils/removeItem\";\nimport { renameFn } from \"./utils/renameFn\";\nimport { isFunction } from \"./utils/isFunction\";\nimport { ScopeEvents } from \"./types\";\nimport { AbortError, CancelError } from \"./consts\";\nimport { parseScopeArgs } from \"./utils/parseScopeArgs\";\nimport { FastListenerExecutor, parallel } from \"./executors\";\nimport { expandEmitResults } from \"./utils/expandEmitResults\";\nimport { isSubsctiber } from \"./utils/isSubsctiber\";\nimport { tryReturnError } from \"./utils/tryReturnError\";\nimport {\n createAsyncEventIterator,\n FastEventIterator,\n FastEventIteratorOptions,\n} from \"./eventIterator\";\nimport { InMatchedEvent } from \"./types/wildcards/InMatchedEvent\";\nimport { GetClosestMessage } from \"./types/closest/GetClosestMessage\";\nimport { wrapPipeListener } from \"./utils/wrapPipeListener\";\n\n/**\n * FastEvent 事件发射器类\n *\n * @template Events - 事件类型定义,继承自FastEvents接口\n * @template Meta - 事件元数据类型,默认为任意键值对对象\n * @template Types - 事件类型的键名类型,默认为Events的键名类型\n */\nexport class FastEvent<\n Events extends Record<string, any> = Record<string, any>,\n Meta extends Record<string, any> = Record<string, any>,\n Context = never,\n // 泛型快捷方式\n AllEvents extends Record<string, any> = Expand<Events & FastEvents>,\n Types extends keyof AllEvents = KeyOf<AllEvents>,\n AllMeta extends Record<string, any> = FastEventMeta & Meta,\n EventNames = KeyOf<ExtendWildcardEvents<AllEvents>>,\n> {\n __FastEvent__: boolean = true;\n\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners;\n\n /** 事件发射器的配置选项 */\n private _options: FastEventOptions<Meta, Context>;\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = \"/\";\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context;\n\n /** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */\n retainedMessages: Map<string, any> = new Map<string, any>();\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0;\n\n // 子类通过:declare types : { } & typeof FastEvent.types 扩展类型\n types = null as unknown as {\n events: ExtendWildcardEvents<AllEvents>;\n eventNames: KeyOf<ExtendWildcardEvents<AllEvents>>;\n meta: AllMeta;\n context: Expand<Fallback<Context, FastEvent<AllEvents, Meta, Context>>>;\n messages: MutableMessage<AllEvents, Meta>;\n message: MutableMessage<AllEvents, Meta>;\n listeners: FastEventListeners<\n AllEvents,\n Expand<FastEventMeta & Meta & Record<string, any>>\n >;\n anyListener: TypedFastEventAnyListener<\n AllEvents,\n Expand<FastEventMeta & Meta & Record<string, any>>\n >;\n };\n /**\n * 创建FastEvent实例\n * @param options - 事件发射器的配置选项\n *\n * 默认配置:\n * - debug: false - 是否启用调试模式\n * - id: 随机字符串 - 实例唯一标识符\n * - delimiter: '/' - 事件名称分隔符\n * - context: null - 监听器执行上下文\n * - ignoreErrors: true - 是否忽略监听器执行错误\n */\n constructor(options?: Partial<FastEventOptions<Meta, Context>>) {\n this._options = Object.assign(\n {\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: \"/\",\n context: null,\n ignoreErrors: true,\n meta: undefined,\n expandEmitResults: true,\n executor: parallel(),\n },\n this._initOptions(options),\n ) as unknown as FastEventOptions<Meta, Context>;\n this._delimiter = this._options.delimiter!;\n this._context = this._options.context as Context;\n this._enableDevTools();\n }\n\n /** 获取事件发射器的配置选项 */\n get options() {\n return this._options;\n }\n get context(): Fallback<Context, typeof this> {\n return (this.options.context || this) as Fallback<Context, typeof this>;\n }\n get meta() {\n return this.options.meta;\n }\n /** 获取事件发射器的唯一标识符 */\n get id() {\n return this._options.id!;\n }\n\n /**\n * 初始化选项\n *\n * 本方法主要供子类重载\n *\n * @param initial - 可选的初始字典对象\n * @returns 返回传入的初始字典对象\n */\n _initOptions(initial?: Partial<FastEventOptions<Meta, Context>>) {\n return initial;\n }\n /**\n * 添加事件监听器到事件树中\n * @param parts - 事件路径数组\n * @param listener - 事件监听器函数\n * @param options - 监听器配置选项\n * @param options.count - 监听器触发次数限制\n * @param options.prepend - 是否将监听器添加到监听器列表开头\n * @returns [节点, 监听器索引] - 返回监听器所在节点和在节点监听器列表中的索引\n * @private\n */\n private _addListener(\n parts: string[],\n listener: TypedFastEventListener<any, any>,\n options: Required<FastEventListenOptions>,\n ): [FastEventListenerNode | undefined, number] {\n const { count, prepend } = options;\n let index: number = 0;\n const node = this._forEachNodes(parts, (node) => {\n const newListener = [\n listener,\n count,\n 0,\n options.tag,\n options.flags,\n ] as unknown as FastEventListenerMeta;\n if (prepend) {\n node.__listeners.splice(0, 0, newListener);\n index = 0;\n } else {\n node.__listeners.push(newListener);\n index = node.__listeners.length - 1;\n }\n this.listenerCount++;\n });\n return [node, index];\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n // oxlint-disable-next-line no-unused-expressions\n globalThis.__FASTEVENT_DEVTOOLS__ && globalThis.__FASTEVENT_DEVTOOLS__.add(this);\n }\n }\n /**\n *\n * 根据parts路径遍历监听器树,并在最后的节点上执行回调函数\n *\n * @param parts\n * @param callback\n * @returns\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 * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(\n node: FastEventListenerNode,\n path: string[],\n listener: TypedFastEventListener<any, any, any>,\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) {\n this.listenerCount--;\n if (isFunction(this._options.onRemoveListener)) {\n this._options.onRemoveListener(path.join(this._delimiter), listener);\n }\n }\n return isRemove;\n });\n }\n /**\n * 调用onAddListener HOOK\n * @param type\n * @param listener\n * @param options\n * @returns\n */\n private _onAddListener(type: string, listener: any, options: any) {\n if (isFunction(this._options.onAddListener)) {\n const r = this._options.onAddListener(type, listener, options);\n if (r === false) {\n throw new CancelError();\n } else if (isSubsctiber(r)) {\n return r;\n }\n }\n }\n /**\n * 注册事件监听器\n * @param type - 事件类型,支持以下格式:\n * - 普通字符串:'user/login'\n * - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)\n * - 全局监听:'**'(监听所有事件)\n * @param listener - 事件监听器函数\n * @param options - 监听器配置选项:\n * - count: 触发次数限制,0表示无限制\n * - prepend: 是否将监听器添加到监听器队列开头\n * @returns 返回订阅者对象,包含off方法用于取消监听\n *\n * @example\n * ```ts\n * // 监听特定事件\n * emitter.on('user/login', (data) => console.log(data));\n *\n * // 使用通配符\n * emitter.on('user/*', (data) => console.log(data));\n *\n * // 限制触发次数\n * emitter.on('event', handler, { count: 3 });\n * ```\n */\n // 返回迭代器\n public on<T extends string = KeyOf<Events> | \"**\">(\n type: T,\n options?: FastEventListenOptions<AllEvents, Meta>,\n ): T extends IsTransformedEvent<AllEvents, T>\n ? FastEventIterator<\n T extends \"**\"\n ? IsAllTransformed<Events> extends true\n ? PayloadValues<AllEvents>\n : any\n : PickPayload<ValueOf<GetClosestEvents<AllEvents, T>>>\n >\n : FastEventIterator<\n T extends \"**\" ? MutableMessage<AllEvents> : GetClosestMessage<Events, T, Meta>\n >;\n\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, Meta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n\n public on(): any {\n const type = arguments[0] as string;\n\n // 解析参数和选项\n let listener: any = null;\n let options: any;\n\n // 当不提供监听器时返回异步迭代器\n const returnIterator = !isFunction(arguments[1]);\n if (returnIterator) {\n options = arguments[1] || {};\n } else {\n // on(type, listener, options?)\n listener = arguments[1];\n options = arguments[2] || {};\n }\n\n const finalOptions = Object.assign(\n {\n count: 0,\n flags: 0,\n prepend: false,\n },\n options,\n ) as Required<FastEventListenOptions>;\n\n if (type.length === 0) throw new Error(\"event type cannot be empty\");\n // 当未指定监听器时返回一个异步迭代器\n if (returnIterator || listener === null) {\n const iteratorOpts = Object.assign(\n {\n overflow: \"expand\",\n size: 10,\n maxExpandSize: 100,\n },\n finalOptions.iterable,\n ) as FastEventIteratorOptions;\n const iterator = createAsyncEventIterator<any>(this as any, type, iteratorOpts);\n iterator.create(finalOptions);\n this._onAddListener(type, iterator.listener, finalOptions);\n return iterator;\n }\n // 执行回调\n if (isFunction(this._options.onAddListener)) {\n const r = this._options.onAddListener(type, listener, finalOptions);\n if (r === false) {\n throw new CancelError();\n } else if (isSubsctiber(r)) {\n return r;\n }\n }\n\n const parts = type.split(this._delimiter);\n\n // 处理 pipes(适用于所有订阅者,包括 iterable)\n if (finalOptions.pipes && finalOptions.pipes.length > 0) {\n listener = wrapPipeListener(listener, finalOptions.pipes);\n }\n\n // 处理 filter 和 off(仅用于普通订阅者)\n if (isFunction(finalOptions.filter) || isFunction(finalOptions.off)) {\n const oldListener = listener;\n const off = () => node && this._removeListener(node, parts, listener);\n listener = renameFn<TypedFastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (\n isFunction(finalOptions.off) &&\n finalOptions.off.call(this, message as any, args)\n ) {\n off();\n return;\n }\n // 如果满足条件就触发监听器\n if (isFunction(finalOptions.filter)) {\n if (finalOptions.filter.call(this, message as any, args!))\n return oldListener.call(this, message, args);\n } else {\n return oldListener.call(this, message, args);\n }\n }, listener.name);\n }\n\n // 添加到监听器树\n const [node, index] = this._addListener(parts, listener, finalOptions);\n const off = () => node && this._removeListener(node, parts, listener);\n\n // 触发监听器保留消息\n this._emitRetainMessage(type, node, index);\n\n return {\n off,\n listener,\n [Symbol.dispose]() {\n off();\n },\n };\n }\n\n /**\n * 注册一次性事件监听器\n * @param type - 事件类型,支持与on方法相同的格式:\n * - 普通字符串:'user/login'\n * - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)\n * @param listener - 事件监听器函数\n * @returns 返回订阅者对象,包含off方法用于取消监听\n *\n * @description\n * 监听器只会在事件首次触发时被调用一次,之后会自动解除注册。\n * 这是on方法的特例,相当于设置options.count = 1。\n * 如果事件有保留消息,新注册的监听器会立即收到最近一次的保留消息并解除注册。\n *\n * @example\n * ```ts\n * // 只监听一次登录事件\n * emitter.once('user/login', (data) => {\n * console.log('用户登录:', data);\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, Meta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions,\n ): FastEventSubscriber;\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(\n arguments[0],\n arguments[1],\n Object.assign({}, arguments[2], { count: 1 }),\n );\n } else {\n return this.on(\n arguments[0],\n Object.assign({}, arguments[2], { count: 1 }),\n ) as unknown as FastEventSubscriber;\n }\n }\n\n /**\n * 注册一个监听器,用于监听所有事件\n * @param listener 事件监听器函数,可以接收任意类型的事件数据\n * @returns {FastEventSubscriber} 返回一个订阅者对象,包含 off 方法用于取消监听\n * @example\n * ```ts\n * const subscriber = emitter.onAny((eventName, data) => {\n * console.log(eventName, data);\n * });\n *\n * // 取消监听\n * subscriber.off();\n * ```\n */\n // 返回迭代器(不指定监听器时)\n public onAny(\n options?: FastEventListenOptions<AllEvents, AllMeta>,\n ): FastEventIterator<MutableMessage<AllEvents, AllMeta>>;\n // 指定监听器\n public onAny(\n listener: FastEventCommonListener<\n MutableMessage<AllEvents, AllMeta>,\n Meta,\n Fallback<Context, typeof this>\n >,\n options?: FastEventListenOptions<AllEvents, AllMeta>,\n ): FastEventSubscriber;\n public onAny() {\n return this.on(\"**\", ...arguments) as any;\n }\n /**\n *\n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n *\n * 此方法供子类继承\n *\n */\n off(listener: TypedFastEventListener<any, any, any>): void;\n off(type: string, listener: TypedFastEventListener<any, any, any>): void;\n off(type: Types, listener: TypedFastEventListener<any, any, any>): void;\n off(type: string): void;\n off(type: Types): 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 // 只删除指定的监听器\n this._removeListener(node, parts, listener);\n } else if (type) {\n node.__listeners = [];\n }\n });\n } else {\n // 仅删除指定的监听器\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 * @description \n * - 如果提供了prefix参数,则只清除该前缀下的所有监听器\n * - 如果没有提供prefix,则清除所有监听器\n * - 同时会清空保留的事件(_retainedEvents)\n * - 重置监听器对象为空\n \n * @example\n * \n * ```ts\n * emitter.offAll(); // 清除所有监听器\n * emitter.offAll('a/b'); // 清除a/b下的所有监听器\n * \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 if (isFunction(this._options.onClearListeners)) this._options.onClearListeners.call(this);\n }\n /**\n * 移除保留的事件\n * @param prefix - 事件前缀。如果不提供,将清除所有保留的事件。\n * 如果提供前缀,将删除所有以该前缀开头的事件。\n * 如果前缀不以分隔符结尾,会自动添加分隔符。\n * @private\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 clear(prefix?: string) {\n this.offAll(prefix);\n this._removeRetainedEvents(prefix);\n }\n\n /**\n * 发送最后一次事件的消息给对应的监听器\n *\n * @param type - 事件类型,支持通配符(*)匹配\n * @private\n *\n * 处理流程:\n * 1. 如果事件类型包含通配符,则遍历所有保留的消息,匹配符合模式的事件\n * 2. 如果是普通事件类型,则直接获取对应的保留消息\n * 3. 遍历匹配到的消息,查找对应路径的监听器节点\n * 4. 执行所有匹配到的监听器\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 // 找出所有保留的消息\n const patterns = type.split(this._delimiter);\n this.retainedMessages.forEach((message, type) => {\n const parts = type.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 * @param node 当前遍历的监听器节点\n * @param parts 事件名称按'.'分割的部分数组\n * @param callback 遍历到目标节点时的回调函数\n * @param index 当前遍历的parts数组索引,默认为0\n * @param lastFollowing 当命中**时该值为true, 注意**只能作在路径的最后面,如a.**有效,而a.**.b无效\n * @private\n *\n * 支持三种匹配模式:\n * - 精确匹配: 'a.b.c'\n * - 单层通配: 'a.*.c'\n * - 多层通配: 'a.**'\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\n if (lastFollowing === true) {\n this._traverseToPath(node, parts, callback, index + 1, true);\n return;\n }\n\n if (\"*\" in node) {\n this._traverseToPath(node[\"*\"], parts, callback, index + 1);\n }\n //\n if (\"**\" in node) {\n this._traverseToPath(node[\"**\"], parts, callback, index + 1, true);\n }\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 // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node;\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 // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(\n listener: TypedFastEventListener,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<any> | undefined,\n e: any,\n ) {\n if (e instanceof Error) {\n // @ts-ignore\n e._emitter = `${listener.name || \"anonymous\"}:${message.type}`;\n }\n if (isFunction(this._options.onListenerError)) {\n try {\n this._options.onListenerError.call(this, e, listener, message, args);\n } catch {}\n }\n if (this._options.ignoreErrors) {\n return e;\n } else {\n throw e;\n }\n }\n private _setListenerFlags(flags: any, value: FastEventListenerFlags): FastEventListenerFlags {\n if (!flags || flags === 0) return value;\n return flags | value;\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\n * @param args - 监听器参数\n * @param catchErrors - 是否捕获并处理执行过程中的错误\n * @returns 监听器的执行结果或错误对象(如果配置了ignoreErrors)\n * @private\n *\n * @description\n * 执行单个监听器函数,处理以下情况:\n * - 如果监听器是包装过的(有__wrappedListener属性),调用包装的函数\n * - 否则直接调用监听器函数\n * - 使用配置的上下文(_context)作为this\n * - 捕获并处理执行过程中的错误:\n * - 如果有onListenerError回调,调用它\n * - 如果配置了ignoreErrors,返回错误对象\n * - 否则抛出错误\n */\n private _executeListener(\n listener: TypedFastEventListener<any, any>,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<any> | undefined,\n catchErrors: boolean = false,\n ): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(\n listener,\n message,\n args,\n new AbortError(listener.name),\n );\n }\n const isTransformed = ((args?.flags || 0) & FastEventListenerFlags.Transformed) > 0;\n\n let result = listener.call(\n this.context,\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(listener, message, args, e),\n );\n }\n return result;\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e);\n }\n }\n private _getListenerExecutor(args: FastEventListenerArgs): FastListenerExecutor | undefined {\n if (!args) return;\n const executor = args.executor || this._options.executor;\n if (isFunction(executor)) return executor;\n }\n\n /**\n * 执行监听器节点列表中的所有监听器函数\n * @param nodes 监听器节点列表\n * @param message 事件消息对象\n * @param args 监听器参数\n * @param args 监听器参数\n * @returns 所有监听器函数的执行结果数组\n * @private\n *\n * 执行流程:\n * 1. 将所有节点中的监听器函数展平为一维数组\n * 2. 通过执行器执行所有监听器函数\n * 3. 更新监听器的执行次数,并移除达到执行次数限制的监听器\n */\n private _executeListeners(\n nodes: FastEventListenerNode[],\n message: TypedFastEventMessage,\n args: FastEventListenerArgs<Meta>,\n filter?: (listener: FastEventListenerMeta, node: FastEventListenerNode) => boolean,\n ): any[] {\n if (!nodes || nodes.length === 0) return [];\n // 1. 遍历所有监听器任务,即需要执行的监听器函数[]\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 // 执行监听器前计数选减一,否则如果在监听器函数中再次触发时会导致重复执行。\n // 比如:在once('x')监听函数中执行再次emit('x')就会导致循环\n this._decListenerExecCount(listeners);\n\n const executeor = this._getListenerExecutor(args);\n if (executeor) {\n const r = executeor(\n listeners.map((listener) => listener[0]),\n message,\n args,\n this._executeListener.bind(this),\n ) as any[];\n return Array.isArray(r) ? r : [r];\n } else {\n return listeners.map((listener) =>\n this._executeListener(listener[0][0], message, args, true),\n );\n }\n }\n /**\n * 减少侦听器的执行次数\n * @param listeners\n */\n _decListenerExecCount(listeners: [FastEventListenerMeta, number, FastEventListenerMeta[]][]) {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastEventListenerMeta;\n meta[2]++; // 实际执行的次数\n // =0不限执行次数,>0时代表执行次数限制\n if (meta[1] > 0 && meta[1] <= meta[2]) {\n listeners[i][2].splice(i, 1);\n }\n }\n }\n\n /**\n * 获取指定类型的所有事件监听器\n * @param type - 事件类型,必须是 AllEvents 的键\n * @returns 包含指定类型的所有监听器元数据的数组\n */\n getListeners(type: keyof AllEvents): FastEventListenerMeta[];\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 return nodes[0].__listeners;\n }\n /**\n * 清除所有事件或指定事件的保留消息\n * @param type\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 * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n * @param retain - 是否保留该事件(用于新订阅者)\n * @param meta - 事件元数据\n * @returns 所有监听器的执行结果数组\n *\n * @example\n * // 方式1: 参数形式\n * emit('user.login', { id: 1 }, true)\n *\n * // 方式2: 对象形式\n * emit({ type: 'user.login', payload: { id: 1 } ,meta:{...}}}, true)\n */\n /**\n * 同步触发事件\n * @param type - 事件类型,可以是字符串或预定义的事件类型\n * @param payload - 事件数据负载\n * @param retain - 是否保留该事件,用于后续新的订阅者\n * @param meta - 事件元数据\n * @returns 所有监听器的执行结果数组\n *\n * @description\n * 同步触发指定类型的事件,支持两种调用方式:\n * 1. 参数形式:emit(type, payload, retain, meta)\n * 2. 对象形式:emit({ type, payload, meta }, retain)\n *\n * 特性:\n * - 支持通配符匹配,一个事件可能触发多个监听器\n * - 如果设置了retain为true,会保存最后一次的事件数据\n * - 按照注册顺序同步调用所有匹配的监听器\n * - 如果配置了ignoreErrors,监听器抛出的错误会被捕获并返回\n *\n * @example\n * ```ts\n * // 简单事件触发\n * emitter.emit('user/login', { userId: 123 });\n *\n * // 带保留的事件触发\n * emitter.emit('status/change', { online: true }, true);\n *\n * // 带元数据的事件触发\n * emitter.emit('data/update', newData, false, { timestamp: Date.now() });\n *\n * // 使用对象形式触发\n * emitter.emit({\n * type: 'user/login',\n * payload: { userId: 123 },\n * meta: { time: Date.now() }\n * }, true);\n *\n * // 清除保留事件\n * emitter.emit(\"user/login\")\n *\n * ```\n *\n * 为什么事件要使用UnTransformedEvents?\n *\n * 因为如果事件使用NotPayload,则会进行转换\n *\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 string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n options?: FastEventListenerArgs<Partial<Meta>>,\n ): R[];\n public emit<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>,\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: MutableMessage<AllEvents, Meta>, retain?: boolean): R[];\n public emit<R = any>(\n message: {\n type: keyof AllEvents;\n },\n retain?: boolean,\n ): R[];\n public emit<R = any>(message: FastEventMessage, retain?: boolean): R[];\n public emit<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): R[];\n public emit(): any {\n const [message, args] = parseEmitArgs<AllEvents, Meta>(arguments, this.options.meta);\n\n if (isFunction(args.parseArgs)) {\n args.parseArgs(message, args);\n }\n const parts = message.type.split(this._delimiter);\n if (args.retain) {\n this.retainedMessages.set(message.type, message);\n }\n const results: any[] = [];\n const nodes: FastEventListenerNode[] = [];\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node);\n });\n if (isFunction(this._options.onBeforeExecuteListener)) {\n const r = this._options.onBeforeExecuteListener.call(this, message, args);\n if (Array.isArray(r)) {\n return r;\n } else if (r === false) {\n throw new AbortError(message.type);\n }\n }\n // 触发时进行消息转换\n if (isFunction(this._options.transform)) {\n message.payload = this._options.transform.call(this, message as any);\n args.rawEventType = message.type;\n args.flags = (args.flags || 0) | FastEventListenerFlags.Transformed;\n }\n // 执行监听器\n results.push(...this._executeListeners(nodes, message, args));\n\n if (isFunction(this._options.onAfterExecuteListener)) {\n this._options.onAfterExecuteListener.call(this, message, results, nodes);\n }\n // 将results内部所有expandable的项展开,见utils\\expandable.ts说明\n if (this._options.expandEmitResults) {\n expandEmitResults(results);\n }\n return results;\n }\n\n /**\n * 异步触发事件\n * @param type - 事件类型,可以是字符串或预定义的事件类型\n * @param payload - 事件数据负载\n * @param retain - 是否保留该事件,用于后续新的订阅者\n * @param meta - 事件元数据\n * @returns Promise,解析为所有监听器的执行结果数组\n *\n * @description\n * 异步触发指定类型的事件,与emit方法类似,但有以下区别:\n * - 返回Promise,等待所有异步监听器执行完成\n * - 使用Promise.allSettled处理监听器的执行结果\n * - 即使某些监听器失败,也会等待所有监听器执行完成\n * - 返回结果包含成功值或错误信息\n *\n * @example\n * ```ts\n * // 异步事件处理\n * const results = await emitter.emitAsync('data/process', rawData);\n *\n * // 处理结果包含成功和失败的情况\n * results.forEach(result => {\n * if (result instanceof Error) {\n * console.error('处理失败:', result);\n * } else {\n * console.log('处理成功:', result);\n * }\n * });\n *\n * // 带元数据的异步事件\n * await emitter.emitAsync('batch/process', items, false, {\n * batchId: 'batch-001',\n * timestamp: Date.now()\n * });\n * ```\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 string = string>(\n type: ReplaceWildcard<T> | Types,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n options?: FastEventListenerArgs<Partial<Meta>>,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends KeyOf<AllEvents> = KeyOf<AllEvents>>(\n message: FastEventEmitMessage<T, UnTransformedEvents<AllEvents>[T], Partial<Meta>>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: MutableMessage<AllEvents, Meta>,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any>(\n message: {\n type: keyof AllEvents;\n },\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n public async emitAsync<R = any, T extends string = string>(\n type: T,\n payload?: InMatchedEvent<Events, T> extends true\n ? GetPayload<UnTransformedEvents<AllEvents>, T>\n : any,\n retain?: boolean,\n ): Promise<(R | Error)[]>;\n\n public async emitAsync<R = any>(): Promise<(R | Error)[]> {\n const results = await Promise.allSettled(this.emit.apply(this, arguments as 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 /**\n * 等待指定事件发生,返回一个Promise\n * @param type - 要等待的事件类型\n * @param timeout - 超时时间(毫秒),默认为0表示永不超时\n * @returns Promise,解析为事件消息对象,包含type、payload和meta\n *\n * @description\n * 创建一个Promise,在指定事件发生时解析。\n * - 当事件触发时,Promise会解析为事件消息对象\n * - 如果设置了timeout且超时,Promise会被拒绝\n * - 一旦事件发生或超时,会自动取消事件监听\n *\n * @example\n * ```ts\n * try {\n * // 等待登录事件,最多等待5秒\n * const event = await emitter.waitFor('user/login', 5000);\n * console.log('用户登录成功:', event.payload);\n * } catch (error) {\n * console.error('等待登录超时');\n * }\n *\n * // 无限等待事件\n * const event = await emitter.waitFor('server/ready');\n * console.log('服务器就绪');\n *\n * // 等待指定的事件发生,并且如果该事件有其他订阅者,则同时等待该事件的所有订阅执行完成\n * waitFor\n *\n *\n *\n * ```\n */\n public waitFor<T extends string = KeyOf<AllEvents>>(\n type: T,\n timeout?: number,\n ): Promise<\n T extends IsTransformedEvent<AllEvents, T>\n ? PickPayload<ValueOf<GetClosestEvents<Events, T>>>\n : FastEventMessage<T, GetClosestEventPayload<AllEvents, T>, Meta>\n >;\n public waitFor<T extends string = string>(\n type: T,\n timeout?: number,\n ): Promise<TypedFastEventMessage<AllEvents, Meta>>;\n\n public waitFor(): Promise<any> {\n const type = arguments[0] as any;\n const timeout = arguments[1] as number;\n return new Promise<any>((resolve, reject) => {\n let tid: any;\n let subscriber: FastEventSubscriber;\n const listener = (message: any) => {\n clearTimeout(tid);\n subscriber?.off();\n resolve(message);\n };\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber?.off();\n reject(new Error(\"wait for event<\" + type + \"> is timeout\"));\n }, timeout);\n }\n // 订阅事件\n subscriber = this.on(type, listener as any) as unknown as FastEventSubscriber;\n });\n }\n\n /**\n * 创建一个新的事件作用域\n * @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前\n * @returns 新的FastEventScope实例\n *\n * @description\n * 创建一个新的事件作用域,用于在特定命名空间下管理事件。\n *\n * 重要特性:\n * - 作用域与父事件发射器共享同一个监听器表\n * - 作用域中的事件会自动添加前缀\n * - 作用域的所有操作都会映射到父事件发射器上\n * - 作用域不是完全隔离的,只是提供了事件名称的命名空间\n *\n * @example\n * ```ts\n * const emitter = new FastEvent();\n *\n * // 创建用户相关事件的作用域\n * const userEvents = emitter.scope('user');\n *\n * // 在作用域中监听事件\n * userEvents.on('login', (data) => {\n * // 实际监听的是 'user/login'\n * console.log('用户登录:', data);\n * });\n *\n * // 在作用域中触发事件\n * userEvents.emit('login', { userId: 123 });\n * // 等同于 emitter.emit('user/login', { userId: 123 })\n *\n * // 创建嵌套作用域\n * const profileEvents = userEvents.scope('profile');\n * profileEvents.emit('update', { name: 'John' });\n * // 等同于 emitter.emit('user/profile/update', { name: 'John' })\n *\n * // 清理作用域\n * userEvents.offAll(); // 清理 'user' 前缀下的所有事件\n * ```\n */\n scope<P extends string = string, ScopeInstance extends IFastEventScope = IFastEventScope>(\n prefix: P,\n scopeObj: ScopeInstance,\n options?: DeepPartial<FastEventScopeOptions<Meta>>,\n ): FastEventScope<\n RemoveAnyRecord<ScopeEvents<AllEvents, P> & ScopeInstance[\"__events__\"]>,\n RemoveAnyRecord<Meta & ScopeInstance[\"__meta__\"]>,\n RemoveAnyRecord<Context & ScopeInstance[\"__context__\"]>\n > &\n ScopeInstance;\n scope<\n E = unknown, //用于扩展事件\n P extends string = string,\n M extends Record<string, any> = Record<string, any>,\n C = Context,\n >(\n prefix: P,\n options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>,\n ): FastEventScope<ScopeEvents<Events, P> & E, Meta & M, C>;\n scope() {\n const [prefix, scopeObj, options] = parseScopeArgs(\n arguments,\n this.options.meta,\n this.options.context,\n );\n let scope;\n if (scopeObj) {\n scope = scopeObj;\n } else {\n scope = new FastEventScope();\n }\n scope.bind(this as any, prefix, options);\n return scope;\n }\n}\n"]}