{"version":3,"sources":["../src/events/liteEvent.ts"],"names":["_LiteEvent","options","event","callback","objectify","count","listenerId","eventListeners","isAbort","listener","matchedListeners","eventName","timeout","resolve","reject","tmId","isTimeout","message","listeners","e","results","retain","LiteEvent"],"mappings":"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","file":"chunk-MJTPGF3L.mjs","sourcesContent":["/** \n* 一个简单的事件触发器 \n*/\n \nexport interface FlexLiteEvents{\n\n}\n\nexport interface LiteEventSubscribeOptions{\n    objectify?: boolean                 //  当调用时返回一个对象用来退订\n    count?:number                       // 触发几次\n}\nexport interface LiteEventOptions{\n    ignoreError?:boolean                // 执行侦听器出错时是否忽略错误\n}\n\nexport interface LiteEventListener<Message=any>{\n    (message:Message):void \n}\n\n\nexport type ForEachLiteEventListenerCallback<Events,Message> = ({event,listenerId,listener,count,eventListeners}:{event:Events,listenerId:number,listener:LiteEventListener<Message>,count:number,eventListeners:LiteEventListenerRegistry<Message>})=>boolean | void\n\n\nexport interface LiteEventSubscriber{\n    off():void\n}\n\n\nexport type LiteEventListenerRegistry<M> = Map<number,[LiteEventListener<M>,number]>\nexport type LiteListenerRegistry<E,M> = Map<E,LiteEventListenerRegistry<M>>\n\n\nexport class LiteEvent<\n    Events extends FlexLiteEvents = Record<string,any>,\n    EventNames extends keyof Events = keyof Events,\n    Message = any\n>{\n     \n    private _listeners:LiteListenerRegistry<EventNames,Message>= new Map()     // {\"<事件名称>\":{<listenerId>:[Callback,<侦听次数>]}}\n     \n    private _lastMessage:Record<string,any> = {}                       // 保留最后一次触发的消息,key=事件名称,value=消息\n    static listenerSeqId:number = 0\n    options:Required<LiteEventOptions>\n    constructor(options?:LiteEventOptions){\n        this.options = Object.assign({\n            ignoreError:false\n        },options) as Required<LiteEventOptions>\n     }\n    get listeners(){return this._listeners}\n     /**\n      * 订阅事件并返回一个事件订阅ID\n      * \n      * @param event \n      * @param callback \n      * @param options \n      * @returns \n      */\n    on<T extends EventNames>(event:T,callback:LiteEventListener<Events[T]>,options?:LiteEventSubscribeOptions):LiteEventSubscriber | number\n    on(event:'*',callback:LiteEventListener<Message>,options?:LiteEventSubscribeOptions):LiteEventSubscriber | number\n    on():LiteEventSubscriber | number{\n        const event    = arguments[0] as EventNames\n        const callback = arguments[1] as LiteEventListener<Message>\n        const options  = arguments[2] as LiteEventSubscribeOptions\n        const { objectify=true,count=-1 } = Object.assign({},options) as Required<LiteEventSubscribeOptions>        \n        if(!this._listeners.has(event)){\n             this._listeners.set(event,new Map())        \n        }\n        const listenerId     = ++LiteEvent.listenerSeqId            \n        const eventListeners = this._listeners.get(event) as LiteEventListenerRegistry<Message>\n        eventListeners?.set(listenerId,[callback,count])        \n        this._emitRetainEvent(event,listenerId,eventListeners)      \n        if(objectify){\n            return {\n                off:()=>{\n                    eventListeners?.delete(listenerId)\n                    if(eventListeners?.size==0){\n                        this._listeners.delete(event)\n                    }\n                }\n            }\n        }else{\n            return listenerId\n        }\n     } \n    onAny(callback:LiteEventListener<Message>,options?:LiteEventSubscribeOptions):LiteEventSubscriber | number{\n        return this.on('*',callback,options)\n    }\n     /**\n      * 如果事件已经有最近触发时保留的数据，则立即触发事件将最近的数据传递给侦听器\n      * @param event \n      */\n    private _emitRetainEvent(event:EventNames,listenerId:number,eventListeners:LiteEventListenerRegistry<Message>){\n        if(event in this._lastMessage){\n            this._executeListener(listenerId,eventListeners,this._lastMessage[event as string])   \n        }        \n    }\n     /**\n      * 只订阅一次事件\n      * @param event \n      * @param callback \n      * @param options \n      * @returns \n      */\n    once<T extends EventNames>(event:T,callback:LiteEventListener<Events[T]>,options?:LiteEventSubscribeOptions){\n         return this.on(event,callback,Object.assign({},options,{count:1}))        \n    }  \n \n    /**\n      * 遍历所有侦听器\n      *   {\"<事件名称>\":{<listenerId>:[Callback,<侦听次数>]}}\n      * @param callback  ={}\n      */\n    private _forEachListeners(callback:({event,listenerId,listener,count,eventListeners}:{event:EventNames,listenerId:number,listener:LiteEventListener<Message>,count:number,eventListeners:LiteEventListenerRegistry<Message>})=>boolean | void){\n         // {\"<事件名称>\":{<listenerId>:[Callback,<侦听次数>]}}\n         let isAbort = false\n         for(let [event,eventListeners] of this._listeners.entries()){\n             if(isAbort) break\n             for(let [listenerId,[listener,count]] of eventListeners.entries()){\n                 if(isAbort) break\n                 let r = callback({event,listenerId,listener,count,eventListeners})                \n                 isAbort = r === false // 显式返回false时中止遍历\n             }\n         }         \n     }\n     /**\n      * 遍历符合event事件的侦听器\n      * \n      * forEachEventListeners(event,callback)\n      * \n      * @param event         事件名称\n      * @param callback \n      * @returns \n      */\n     private _forEachEventListeners(event:EventNames,callback:ForEachLiteEventListenerCallback<EventNames,Message>){\n         // {\"<事件名称>\":{<listenerId>:[Callback,<侦听次数>]}}        \n         let isAbort = false        \n         let matchedListeners = [[event,this._listeners.get(event)]] as [EventNames,LiteEventListenerRegistry<Message> | undefined][]       \n         for(let [eventName,eventListeners] of matchedListeners){\n             if(!eventListeners) continue\n             for(let [listenerId,[listener,count]] of eventListeners){\n                 if(isAbort) break\n                 let r = callback({event:eventName,listenerId,listener,count,eventListeners})            \n                 isAbort = r === false// 显式返回false时中止遍历\n             }     \n         }\n     }  \n     /**\n      * 注销订阅\n      * \n      * - 通过listenerId进行退订\n      * - 直接指定一个callback并且callback严格相等\n      * - 具备同一样原型链的callback的均退订\n      * \n      *  let listenerId = emitter.on(event,callback)\n      * \n      *  emitter.off(listenerId)              // 精确退订指定的订阅，需要自行保存订阅Id\n      *  emitter.off(callback)                // 所有callback均会退订\n      *  emitter.off(event,callback)          // 退订指定事件的callback均会退订 \n      * \n      * @param event \n      * @param callback \n      * @returns \n      */ \n      off(listener:LiteEventListener<Message>):void;\n      off(listenerId:number):void;\n      off(event:EventNames,listener:LiteEventListener<any>):void;\n      off(){\n         // {\"<事件名称>\":{<listenerId>:[Callback,<侦听次数>]}}\n        if(arguments.length==1){\n             if(typeof(arguments[0])=='number'){// off(listenerId) 根据订阅ID退订\n                 this._forEachListeners(({listenerId,eventListeners,event})=>{\n                     if(listenerId == arguments[0]){\n                         eventListeners.delete(listenerId)\n                         if(this._listeners.get(event)?.size==0) this._listeners.delete(event)\n                         return false\n                     }   \n                 })\n             }else if(typeof(arguments[0])=='function'){  // off(callback) \n                 let callback = arguments[0]\n                 this._forEachListeners(({listenerId,listener,eventListeners,event})=>{\n                     if(listener == callback){\n                         eventListeners.delete(listenerId) \n                         if(this._listeners.get(event)?.size==0) this._listeners.delete(event)\n                     }   \n                 })\n             }\n        }else if(arguments.length==2){\n             if(typeof(arguments[0])=='string' && typeof(arguments[1])=='function'){// off(event,callback)\n                 this._forEachEventListeners(arguments[0] as EventNames,({event,listenerId,listener,eventListeners})=>{\n                     if(event == arguments[0] && listener ==  arguments[1] ){\n                         eventListeners.delete(listenerId) \n                         if(this._listeners.get(event)?.size==0) this._listeners.delete(event)\n                     }\n                 })\n             }\n        } \n     }\n \n     /**\n      * 等待某个事件触发后返回\n      * @param event  事件名称\n      */\n    waitFor(event:EventNames,timeout:number=0){        \n         return new Promise<Message>((resolve,reject)=>{\n             let tmId:any,isTimeout:boolean=false \n             let listenerId:number\n             if(timeout>0){\n                 tmId=setTimeout(()=>{\n                     isTimeout=true\n                     this.off(listenerId)\n                     reject(new Error(\"Timeout\"))    \n                 },timeout)\n             }        \n            listenerId = this.once(event,(message:any)=>{     \n                if(isTimeout) return\n                clearTimeout(tmId) \n                resolve(message)\n            }) as number\n        })\n    }\n    offAll(event?:EventNames){\n         if(event){\n             this._listeners.delete(event)\n         }else{\n             this._listeners.clear()\n         }        \n     }\n     /**    \n      * 执行侦听器函数\n      * \n      * @param listenerId  侦听器ID\n      * @param listeners   事件侦听器列表  \n      * @param message \n      * @returns \n      */\n    private _executeListener(listenerId:number,listeners:LiteEventListenerRegistry<Message>,message?:Message){\n         if(!listeners) return \n         const listener = listeners!.get(listenerId)\n         if(!listener) return \n         try{\n            return listener[0](message!) \n         }catch(e){\n            if(!this.options.ignoreError) throw e\n         }finally{\n             if(listener[1]>-1){\n                 listener[1] = listener[1]-1\n                 if(listener[1]==0){\n                     listeners.delete(listenerId)\n                 }\n             }            \n         }  \n     }   \n     private _executeListeners(event:EventNames,message?:Message,callback?:(listenerId?:number)=>void){\n         let results:any[] = []\n         this._forEachEventListeners(event,({event:eventName,listenerId,eventListeners})=>{\n             results.push(this._executeListener(listenerId,eventListeners,message))\n             if(typeof(callback)=='function') callback(listenerId)\n             if(eventListeners.size==0){\n                 this._listeners.delete(eventName)\n             }\n         })   \n         return results\n     }\n     /**\n      * 触发事件\n      * @param event \n      * @param message \n      */\n    emit<T extends EventNames>(event:T,message?:Events[T],retain?:boolean){\n        if(retain){\n            this._lastMessage[event as any] = message\n        }\n        return this._executeListeners(event,message as any)\n    }\n    async emitAsync<T extends EventNames>(event:T,message?:Events[T],retain?:boolean){\n        return await Promise.allSettled(this.emit(event,message,retain))\n     }\n } \n\n \n  \n//  export type VoerkaI18nEvents = {\n//     log        : { level: string, message:string }       // 当有日志输出时，data={level\n//     ready      : { scope:string,language:string }                        // 当默认语言第一次加载完成后触发，data={language,scope}\n//     Change     : string                                                 // 当语言切换时    data=language\n//     Registered : string                                                 // 当Scope注册到成功后    \n//     Restore    : { scope:string,language:string }                        // 当Scope加载并从本地存储中读取语言包合并到语言包时 ，data={language,scope}\n//     Patched    : { scope:string,language:string }                        // 当Scope加载并从本地存储中读取语言包合并到语言包时 ，data={language,scope}               \n// }      \n    \n\n\n//  const ev = new LiteEvent<VoerkaI18nEvents>()\n\n//  ev.on(\"log\",({level,message})=>{\n//     console.log(level,message)\n//  })\n//  ev.on(\"*\",({level,message})=>{\n//     console.log(level,message)\n//  })\n//  ev.emit(\"log\",{level:\"\",message:\"\"})"]}