fastevent 2.0.0 → 2.0.2
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.d.mts +23 -2
- package/dist/index.d.ts +23 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -644,13 +644,27 @@ type QueueListenerPipeOptions = {
|
|
|
644
644
|
maxExpandSize?: number;
|
|
645
645
|
expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
|
|
646
646
|
overflow?: FastQueueOverflows;
|
|
647
|
-
|
|
647
|
+
lifetime?: number;
|
|
648
|
+
onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
|
|
649
|
+
onDrop?: (message: FastEventMessage) => void;
|
|
648
650
|
};
|
|
649
651
|
declare const queue: (options?: QueueListenerPipeOptions) => FastListenerPipe;
|
|
650
652
|
declare const dropping: (size?: number) => FastListenerPipe;
|
|
651
653
|
declare const sliding: (size?: number) => FastListenerPipe;
|
|
652
654
|
declare const expanding: (options?: Omit<QueueListenerPipeOptions, "overflow">) => FastListenerPipe;
|
|
653
655
|
|
|
656
|
+
interface RetryListenerPipeOptions {
|
|
657
|
+
interval?: number;
|
|
658
|
+
drop?: (message: FastEventMessage, error: Error) => void;
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* 创建一个重试管道,在监听器执行失败时自动重试
|
|
662
|
+
* @param count 最大重试次数
|
|
663
|
+
* @param options 配置选项
|
|
664
|
+
* @returns FastListenerPipe
|
|
665
|
+
*/
|
|
666
|
+
declare const retry: (count: number, options?: RetryListenerPipeOptions) => FastListenerPipe;
|
|
667
|
+
|
|
654
668
|
/**
|
|
655
669
|
* 创建一个超时装饰器,限制监听器函数的执行时间
|
|
656
670
|
* @param ms 超时时间(毫秒)
|
|
@@ -687,6 +701,13 @@ interface ThrottleOptions {
|
|
|
687
701
|
*/
|
|
688
702
|
declare const throttle: (interval: number, options?: ThrottleOptions) => FastListenerPipe;
|
|
689
703
|
|
|
704
|
+
/**
|
|
705
|
+
* 创建一个memorize pipe,用于缓存上一次的返回值
|
|
706
|
+
* @param predicate 可选的判断函数,用于决定是否使用缓存
|
|
707
|
+
* @returns FastListenerPipe
|
|
708
|
+
*/
|
|
709
|
+
declare function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe;
|
|
710
|
+
|
|
690
711
|
declare class FastEventError extends Error {
|
|
691
712
|
}
|
|
692
713
|
declare class TimeoutError extends FastEventError {
|
|
@@ -696,4 +717,4 @@ declare class AbortError extends FastEventError {
|
|
|
696
717
|
declare class QueueOverflowError extends FastEventError {
|
|
697
718
|
}
|
|
698
719
|
|
|
699
|
-
export { AbortError, type DebounceOptions, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventListenerDecorators, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerExecutorArgs, type FastListenerMeta, type FastListenerNode, type FastListenerPipe, type FastListeners, type FastQueueOverflows, type FastQueuePriority, type IFastListenerExecutor, type Merge, type PickScopeEvents, type QueueListenerPipeOptions, QueueOverflowError, type RequiredItems, type ScopeEvents, type ThrottleOptions, TimeoutError, debounce, dropping, expanding, queue, sliding, throttle, timeout };
|
|
720
|
+
export { AbortError, type DebounceOptions, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventListenerDecorators, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerExecutorArgs, type FastListenerMeta, type FastListenerNode, type FastListenerPipe, type FastListeners, type FastQueueOverflows, type FastQueuePriority, type IFastListenerExecutor, type Merge, type PickScopeEvents, type QueueListenerPipeOptions, QueueOverflowError, type RequiredItems, type RetryListenerPipeOptions, type ScopeEvents, type ThrottleOptions, TimeoutError, debounce, dropping, expanding, memorize, queue, retry, sliding, throttle, timeout };
|
package/dist/index.d.ts
CHANGED
|
@@ -644,13 +644,27 @@ type QueueListenerPipeOptions = {
|
|
|
644
644
|
maxExpandSize?: number;
|
|
645
645
|
expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
|
|
646
646
|
overflow?: FastQueueOverflows;
|
|
647
|
-
|
|
647
|
+
lifetime?: number;
|
|
648
|
+
onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
|
|
649
|
+
onDrop?: (message: FastEventMessage) => void;
|
|
648
650
|
};
|
|
649
651
|
declare const queue: (options?: QueueListenerPipeOptions) => FastListenerPipe;
|
|
650
652
|
declare const dropping: (size?: number) => FastListenerPipe;
|
|
651
653
|
declare const sliding: (size?: number) => FastListenerPipe;
|
|
652
654
|
declare const expanding: (options?: Omit<QueueListenerPipeOptions, "overflow">) => FastListenerPipe;
|
|
653
655
|
|
|
656
|
+
interface RetryListenerPipeOptions {
|
|
657
|
+
interval?: number;
|
|
658
|
+
drop?: (message: FastEventMessage, error: Error) => void;
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* 创建一个重试管道,在监听器执行失败时自动重试
|
|
662
|
+
* @param count 最大重试次数
|
|
663
|
+
* @param options 配置选项
|
|
664
|
+
* @returns FastListenerPipe
|
|
665
|
+
*/
|
|
666
|
+
declare const retry: (count: number, options?: RetryListenerPipeOptions) => FastListenerPipe;
|
|
667
|
+
|
|
654
668
|
/**
|
|
655
669
|
* 创建一个超时装饰器,限制监听器函数的执行时间
|
|
656
670
|
* @param ms 超时时间(毫秒)
|
|
@@ -687,6 +701,13 @@ interface ThrottleOptions {
|
|
|
687
701
|
*/
|
|
688
702
|
declare const throttle: (interval: number, options?: ThrottleOptions) => FastListenerPipe;
|
|
689
703
|
|
|
704
|
+
/**
|
|
705
|
+
* 创建一个memorize pipe,用于缓存上一次的返回值
|
|
706
|
+
* @param predicate 可选的判断函数,用于决定是否使用缓存
|
|
707
|
+
* @returns FastListenerPipe
|
|
708
|
+
*/
|
|
709
|
+
declare function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe;
|
|
710
|
+
|
|
690
711
|
declare class FastEventError extends Error {
|
|
691
712
|
}
|
|
692
713
|
declare class TimeoutError extends FastEventError {
|
|
@@ -696,4 +717,4 @@ declare class AbortError extends FastEventError {
|
|
|
696
717
|
declare class QueueOverflowError extends FastEventError {
|
|
697
718
|
}
|
|
698
719
|
|
|
699
|
-
export { AbortError, type DebounceOptions, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventListenerDecorators, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerExecutorArgs, type FastListenerMeta, type FastListenerNode, type FastListenerPipe, type FastListeners, type FastQueueOverflows, type FastQueuePriority, type IFastListenerExecutor, type Merge, type PickScopeEvents, type QueueListenerPipeOptions, QueueOverflowError, type RequiredItems, type ScopeEvents, type ThrottleOptions, TimeoutError, debounce, dropping, expanding, queue, sliding, throttle, timeout };
|
|
720
|
+
export { AbortError, type DebounceOptions, type Fallback, type FaseEventMessageExtends, FastEvent, type FastEventAnyListener, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, type FastEventListenerDecorators, type FastEventMessage, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerExecutorArgs, type FastListenerMeta, type FastListenerNode, type FastListenerPipe, type FastListeners, type FastQueueOverflows, type FastQueuePriority, type IFastListenerExecutor, type Merge, type PickScopeEvents, type QueueListenerPipeOptions, QueueOverflowError, type RequiredItems, type RetryListenerPipeOptions, type ScopeEvents, type ThrottleOptions, TimeoutError, debounce, dropping, expanding, memorize, queue, retry, sliding, throttle, timeout };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var T=Object.defineProperty;var z=(r,t,e)=>t in r?T(r,t,{enumerable:true,configurable:true,writable:true,value:e}):r[t]=e;var l=(r,t)=>T(r,"name",{value:t,configurable:true});var D=(r,t)=>{for(var e in t)T(r,e,{get:t[e],enumerable:true});};var f=(r,t,e)=>z(r,typeof t!="symbol"?t+"":t,e);function x(r,t,e,s){let i,n,o,c={};typeof r[0]=="object"?(i=r[0].type,n=r[0].payload,c=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},o=r[0].meta):(i=r[0],n=r[1],c=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),o=Object.assign({},t,e,c.meta,o),Object.keys(o).length===0&&(o=void 0);let a={type:i,payload:n,meta:o};return c.executor===void 0&&(c.executor=s),[a,c]}l(x,"handleEmitArgs");function m(r,t){return Object.defineProperty(r,"name",{value:t||"anonymous",configurable:true}),r}l(m,"renameFn");var L=class L{constructor(t,e,s){f(this,"emitter");f(this,"prefix");f(this,"options");f(this,"events");this.emitter=t,this.prefix=e,this.options=Object.assign({},{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}get context(){return this.options.context}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;let s=this;return m(function(n,o){if(n.type.startsWith(e))return t.call(s.context||s.emitter.context,Object.assign({},n,{type:n.type.substring(e.length)}),o)},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(t,e){return this.on("**",t,e)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[t,e]=x(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(t,e){let s=Object.assign({},this.options.meta,e?.meta),i=e?.context!==void 0?e.context:this.context,n=Object.assign({},this.options,e,{meta:Object.keys(s).length===0?void 0:s,context:i});return new L(this.emitter,this.prefix+t,n)}};l(L,"FastEventScope");var y=L;function N(r,t){if(r.length!==t.length&&r.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:r.length-t.length+1}).fill("*"));for(let s=0;s<r.length;s++)if(e[s]!=="*"&&e[s]!==r[s])return false;return true}l(N,"isPathMatched");function W(r,t){let e=[];for(;;){let s=r.findIndex(i=>t(i));if(s===-1){e.push(s);break}r.splice(s,1);}return e}l(W,"removeItem");var w={};D(w,{allSettled:()=>I,balance:()=>V,first:()=>k,last:()=>X,race:()=>B,random:()=>$});var I=l((r,t,e,s)=>Promise.allSettled(r.map(i=>s(i[0],t,e))),"allSettled"),B=l((r,t,e,s)=>{let i,n;return (!e||e&&!e.abortSignal)&&(n=new AbortController,e||(e={}),e.abortSignal=n.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(s(c[0],t,e)).then(a=>(i||(i=c,c[2]++),n?.abort(),a)))))]},"race"),V=l((r,t,e,s)=>{let i,n=0;return r.forEach((o,c)=>{o[2]--,(i===void 0||i>o[2])&&(i=o[2],n=c);}),r[n][2]++,[s(r[n][0],t,e)]},"balance"),k=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[0][2]++,[s(r[0][0],t,e)]),"first"),X=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[r.length-1][2]++,[s(r[r.length-1][0],t,e)]),"last"),$=l((r,t,e,s)=>{let i=Math.floor(Math.random()*r.length);return r.forEach(n=>n[2]--),r[i][2]++,[s(r[i][0],t,e)]},"random");function u(r){return r&&typeof r=="function"}l(u,"isFunction");var P=class P extends Error{};l(P,"FastEventError");var d=P,S=class S extends d{};l(S,"TimeoutError");var b=S,M=class M extends d{};l(M,"AbortError");var v=M,O=class O extends d{};l(O,"QueueOverflowError");var E=O;var A=class A{constructor(t){f(this,"listeners",{__listeners:[]});f(this,"_options");f(this,"_delimiter","/");f(this,"_context");f(this,"retainedMessages",new Map);f(this,"listenerCount",0);f(this,"events");this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0},t),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this._context}get id(){return this._options.id}_addListener(t,e,s){let{count:i,prepend:n}=s;return this._forEachNodes(t,o=>{let c=[e,i,0];n?o.__listeners.splice(0,0,c):o.__listeners.push(c),this.listenerCount++,u(this._options.onAddListener)&&this._options.onAddListener(t,e);})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let i=0;i<t.length;i++){let n=t[i];if(n in s||(s[n]={__listeners:[]}),i===t.length-1){let o=s[n];return e(o,s),o}else s=s[n];}}_removeListener(t,e,s){s&&W(t.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,u(this._options.onRemoveListener)&&this._options.onRemoveListener(e,s)),n});}_pipeListener(t,e){return e.forEach(s=>{t=m(s(t),t.name);}),t}on(){let t=arguments[0],e=u(arguments[1])?arguments[1]:this.onMessage.bind(this),s=Object.assign({count:0,prepend:false},u(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");let i=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),u(s.filter)||u(s.off)){let c=e;e=m(function(a,h){if(u(s.off)&&s.off.call(this,a,h)){o();return}if(u(s.filter)){if(s.filter.call(this,a,h))return c.call(this,a,h)}else return c.call(this,a,h)},e.name);}let n=this._addListener(i,e,s),o=l(()=>n&&this._removeListener(n,i,e),"off");return n&&!t.includes("*")&&this._emitForLastEvent(t),{off:o,listener:e}}once(){return u(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t){}off(){let t=arguments,e=u(t[0])?void 0:t[0],s=u(t[0])?t[0]:t[1],i=e?e.split(this._delimiter):[],n=e?e.includes("*"):false;if(e&&!n)this._traverseToPath(this.listeners,i,o=>{s?this._removeListener(o,i,s):e&&(o.__listeners=[]);});else {let o=n?[]:i;this._traverseListeners(this.listeners,o,(c,a)=>{(s!==void 0||n&&N(c,i))&&(s?this._removeListener(a,i,s):a.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(i,n)=>{s+=n.__listeners.length,n.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,i)=>{e+=i.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}u(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitForLastEvent(t){if(this.retainedMessages.has(t)){let e=this.retainedMessages.get(t),s=t.split(this._delimiter),i=[];this._traverseToPath(this.listeners,s,n=>{i.push(n);}),this._executeListeners(i,e);}}_traverseToPath(t,e,s,i=0,n){if(i>=e.length){s(t);return}let o=e[i];if(n===true){this._traverseToPath(t,e,s,i+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,i+1),"**"in t&&this._traverseToPath(t["**"],e,s,i+1,true),o in t&&this._traverseToPath(t[o],e,s,i+1);}_traverseListeners(t,e,s){let i=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{i=o;});let n=l((o,c,a)=>{c(a,o);for(let[h,_]of Object.entries(o))h.startsWith("__")||_&&n(_,c,[...a,h]);},"traverseNodes");n(i,s,[]);}_onListenerError(t,e,s,i){if(i instanceof Error&&(i._emitter=`${t.name||"anonymous"}:${e.type}`),u(this._options.onListenerError))try{this._options.onListenerError.call(this,t,i,e,s);}catch{}if(this._options.ignoreErrors)return i;throw i}_executeListener(t,e,s){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new v(t.name));let i=t.call(this._context||this,e,s);return i&&i instanceof Promise&&(i=i.catch(n=>this._onListenerError(t,e,s,n))),i}catch(i){return this._onListenerError(t,e,s,i)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(u(e))return e;if(e&&e in w)return w[e]}_executeListeners(t,e,s){if(!t||t.length===0)return [];let i=t.reduce((n,o)=>n.concat(o.__listeners.map((c,a)=>[c,a,o.__listeners])),[]);try{let n=this._getListenerExecutor(s);return n?n(i.map(o=>o[0]),e,s,this._executeListener.bind(this)):i.map(o=>this._executeListener(o[0][0],e,s))}finally{for(let n=i.length-1;n>=0;n--){let o=i[n][0];o[2]++,o[1]>0&&o[1]<=o[2]&&i[n][2].splice(n,1);}}}emit(){let[t,e]=x(arguments,this.options.meta),s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let i=[],n=[];if(this._traverseToPath(this.listeners,s,o=>{n.push(o);}),u(this._options.onBeforeExecuteListener)&&this._options.onBeforeExecuteListener.call(this,t,e)===false)throw new Error("emit "+t.type+" is aborted");return i.push(...this._executeListeners(n,t,e)),u(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,i,n),i}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,i)=>{let n,o,c=l(a=>{clearTimeout(n),o.off(),s(a);},"listener");e&&e>0&&(n=setTimeout(()=>{o&&o.off(),i(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,c);})}scope(t,e){return new y(this,t,e)}};l(A,"FastEvent");var R=A;var j=l(r=>{let{size:t,overflow:e,maxExpandSize:s,expandOverflow:i,onNew:n}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide"},r),o=[],c=t,a=false,h=l(p=>{u(n)?n(p,o):o.push(p);},"pushMessage"),_=l(p=>{switch(o.length>=s&&e==="expand"?i:e){case "drop":return false;case "expand":return c=Math.min(c+t,s),h(p),true;case "slide":return o.shift(),h(p),true;case "throw":throw new E;default:return false}},"handleOverflow");return p=>async function(g,C){if(a){o.length<c?h(g):_(g);return}a=true;try{for(await p.call(this,g,C);o.length>0;){let F=o.shift();F&&await p.call(this,F,C);}}finally{a=false;}}},"queue"),Lt=l((r=10)=>j({size:r,overflow:"drop"}),"dropping"),wt=l((r=10)=>j({size:r,overflow:"slide"}),"sliding"),bt=l(r=>j(Object.assign({},r,{overflow:"expand"})),"expanding");var Pt=l((r,t)=>e=>async function(s,i){let n,o=new Promise((a,h)=>{n=setTimeout(()=>{t!==void 0?a(t):h(new b);},r);}),c=Promise.resolve(e.call(this,s,i));try{return await Promise.race([c,o])}finally{clearTimeout(n);}},"timeout");var Ot=l((r,t)=>e=>{let s=false,i=null;return async function(n,o){if(s){t?.drop&&t.drop(n);return}try{s=!0;let c=await e.call(this,n,o);return i=setTimeout(()=>{s=!1,i=null;},r),c}catch(c){throw s=false,i&&(clearTimeout(i),i=null),c}}},"debounce");var Ct=l((r,t)=>e=>{let s=0;return async function(i,n){let o=Date.now();if(o-s<r){t?.drop&&t.drop(i);return}return s=o,await e.call(this,i,n)}},"throttle");exports.AbortError=v;exports.FastEvent=R;exports.FastEventError=d;exports.FastEventScope=y;exports.QueueOverflowError=E;exports.TimeoutError=b;exports.debounce=Ot;exports.dropping=Lt;exports.expanding=bt;exports.queue=j;exports.sliding=wt;exports.throttle=Ct;exports.timeout=Pt;//# sourceMappingURL=index.js.map
|
|
1
|
+
'use strict';var O=Object.defineProperty;var B=(s,t,e)=>t in s?O(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var c=(s,t)=>O(s,"name",{value:t,configurable:true});var V=(s,t)=>{for(var e in t)O(s,e,{get:t[e],enumerable:true});};var h=(s,t,e)=>B(s,typeof t!="symbol"?t+"":t,e);function y(s,t,e,i){let n,r,o,l={};typeof s[0]=="object"?(n=s[0].type,r=s[0].payload,l=typeof s[1]=="boolean"?{retain:s[1]}:s[1]||{},o=s[0].meta):(n=s[0],r=s[1],l=typeof s[2]=="boolean"?{retain:s[2]}:s[2]||{}),o=Object.assign({},t,e,l.meta,o),Object.keys(o).length===0&&(o=void 0);let u={type:n,payload:r,meta:o};return l.executor===void 0&&(l.executor=i),[u,l]}c(y,"handleEmitArgs");function _(s,t){return Object.defineProperty(s,"name",{value:t||"anonymous",configurable:true}),s}c(_,"renameFn");var L=class L{constructor(t,e,i){h(this,"emitter");h(this,"prefix");h(this,"options");h(this,"events");this.emitter=t,this.prefix=e,this.options=Object.assign({},{scope:e},i),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}get context(){return this.options.context}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;let i=this;return _(function(r,o){if(r.type.startsWith(e))return t.call(i.context||i.emitter.context,Object.assign({},r,{type:r.type.substring(e.length)}),o)},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(t,e){return this.on("**",t,e)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[t,e]=y(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],i=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},i,{type:this._fixScopeType(i.type)})}scope(t,e){let i=Object.assign({},this.options.meta,e?.meta),n=e?.context!==void 0?e.context:this.context,r=Object.assign({},this.options,e,{meta:Object.keys(i).length===0?void 0:i,context:n});return new L(this.emitter,this.prefix+t,r)}};c(L,"FastEventScope");var w=L;function R(s,t){if(s.length!==t.length&&s.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:s.length-t.length+1}).fill("*"));for(let i=0;i<s.length;i++)if(e[i]!=="*"&&e[i]!==s[i])return false;return true}c(R,"isPathMatched");function N(s,t){let e=[];for(;;){let i=s.findIndex(n=>t(n));if(i===-1){e.push(i);break}s.splice(i,1);}return e}c(N,"removeItem");var v={};V(v,{allSettled:()=>k,balance:()=>$,first:()=>q,last:()=>H,race:()=>X,random:()=>G});var k=c((s,t,e,i)=>Promise.allSettled(s.map(n=>i(n[0],t,e))),"allSettled"),X=c((s,t,e,i)=>{let n,r;return (!e||e&&!e.abortSignal)&&(r=new AbortController,e||(e={}),e.abortSignal=r.signal),[Promise.race(s.map(l=>(l[2]--,Promise.resolve(i(l[0],t,e)).then(u=>(n||(n=l,l[2]++),r?.abort(),u)))))]},"race"),$=c((s,t,e,i)=>{let n,r=0;return s.forEach((o,l)=>{o[2]--,(n===void 0||n>o[2])&&(n=o[2],r=l);}),s[r][2]++,[i(s[r][0],t,e)]},"balance"),q=c((s,t,e,i)=>(s.forEach(n=>n[2]--),s[0][2]++,[i(s[0][0],t,e)]),"first"),H=c((s,t,e,i)=>(s.forEach(n=>n[2]--),s[s.length-1][2]++,[i(s[s.length-1][0],t,e)]),"last"),G=c((s,t,e,i)=>{let n=Math.floor(Math.random()*s.length);return s.forEach(r=>r[2]--),s[n][2]++,[i(s[n][0],t,e)]},"random");function a(s){return s&&typeof s=="function"}c(a,"isFunction");var M=class M extends Error{};c(M,"FastEventError");var x=M,A=class A extends x{};c(A,"TimeoutError");var b=A,j=class j extends x{};c(j,"AbortError");var E=j,C=class C extends x{};c(C,"QueueOverflowError");var T=C;var F=class F{constructor(t){h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"events");this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0},t),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this._context}get id(){return this._options.id}_addListener(t,e,i){let{count:n,prepend:r}=i;return this._forEachNodes(t,o=>{let l=[e,n,0];r?o.__listeners.splice(0,0,l):o.__listeners.push(l),this.listenerCount++,a(this._options.onAddListener)&&this._options.onAddListener(t,e);})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let i=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in i||(i[r]={__listeners:[]}),n===t.length-1){let o=i[r];return e(o,i),o}else i=i[r];}}_removeListener(t,e,i){i&&N(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===i;return r&&(this.listenerCount--,a(this._options.onRemoveListener)&&this._options.onRemoveListener(e,i)),r});}_pipeListener(t,e){return e.forEach(i=>{t=_(i(t),t.name);}),t}on(){let t=arguments[0],e=a(arguments[1])?arguments[1]:this.onMessage.bind(this),i=Object.assign({count:0,prepend:false},a(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");let n=t.split(this._delimiter);if(i.pipes&&i.pipes.length>0&&(e=this._pipeListener(e,i.pipes)),a(i.filter)||a(i.off)){let l=e;e=_(function(u,f){if(a(i.off)&&i.off.call(this,u,f)){o();return}if(a(i.filter)){if(i.filter.call(this,u,f))return l.call(this,u,f)}else return l.call(this,u,f)},e.name);}let r=this._addListener(n,e,i),o=c(()=>r&&this._removeListener(r,n,e),"off");return r&&!t.includes("*")&&this._emitForLastEvent(t),{off:o,listener:e}}once(){return a(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t){}off(){let t=arguments,e=a(t[0])?void 0:t[0],i=a(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{i?this._removeListener(o,n,i):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(l,u)=>{(i!==void 0||r&&R(l,n))&&(i?this._removeListener(u,n,i):u.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),i=0;this._traverseListeners(this.listeners,e,(n,r)=>{i+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=i,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(i,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}a(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitForLastEvent(t){if(this.retainedMessages.has(t)){let e=this.retainedMessages.get(t),i=t.split(this._delimiter),n=[];this._traverseToPath(this.listeners,i,r=>{n.push(r);}),this._executeListeners(n,e);}}_traverseToPath(t,e,i,n=0,r){if(n>=e.length){i(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,i,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,i,n+1),"**"in t&&this._traverseToPath(t["**"],e,i,n+1,true),o in t&&this._traverseToPath(t[o],e,i,n+1);}_traverseListeners(t,e,i){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=c((o,l,u)=>{l(u,o);for(let[f,m]of Object.entries(o))f.startsWith("__")||m&&r(m,l,[...u,f]);},"traverseNodes");r(n,i,[]);}_onListenerError(t,e,i,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),a(this._options.onListenerError))try{this._options.onListenerError.call(this,t,n,e,i);}catch{}if(this._options.ignoreErrors)return n;throw n}_executeListener(t,e,i){try{if(i&&i.abortSignal&&i.abortSignal.aborted)return this._onListenerError(t,e,i,new E(t.name));let n=t.call(this._context||this,e,i);return n&&n instanceof Promise&&(n=n.catch(r=>this._onListenerError(t,e,i,r))),n}catch(n){return this._onListenerError(t,e,i,n)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(a(e))return e;if(e&&e in v)return v[e]}_executeListeners(t,e,i){if(!t||t.length===0)return [];let n=t.reduce((r,o)=>r.concat(o.__listeners.map((l,u)=>[l,u,o.__listeners])),[]);try{let r=this._getListenerExecutor(i);return r?r(n.map(o=>o[0]),e,i,this._executeListener.bind(this)):n.map(o=>this._executeListener(o[0][0],e,i))}finally{for(let r=n.length-1;r>=0;r--){let o=n[r][0];o[2]++,o[1]>0&&o[1]<=o[2]&&n[r][2].splice(r,1);}}}emit(){let[t,e]=y(arguments,this.options.meta),i=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,i,o=>{r.push(o);}),a(this._options.onBeforeExecuteListener)&&this._options.onBeforeExecuteListener.call(this,t,e)===false)throw new Error("emit "+t.type+" is aborted");return n.push(...this._executeListeners(r,t,e)),a(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((i,n)=>{let r,o,l=c(u=>{clearTimeout(r),o.off(),i(u);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,l);})}scope(t,e){return new w(this,t,e)}};c(F,"FastEvent");var W=F;var D=c(s=>{let{lifetime:t,size:e,overflow:i,maxExpandSize:n,expandOverflow:r,onEnter:o,onDrop:l}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},s),u=[],f=e,m=false,P=c(p=>{a(o)?o(p,u):u.push(t>0?[p,Date.now()]:[p,0]);},"pushMessage"),z=c(p=>{switch(u.length>=n&&i==="expand"?r:i){case "drop":return a(l)&&l(p),false;case "expand":return f=Math.min(f+e,n),P(p),true;case "slide":let d=u.shift();return a(l)&&d&&l(d[0]),P(p),true;case "throw":throw a(l)&&l(p),new T;default:return false}},"handleOverflow");return p=>async function(g,d){if(m){u.length<f?P(g):z(g);return}m=true;try{for(await p.call(this,g,d);u.length>0;){let[S,I]=u.shift()||[void 0,0];if(S){if(t>0&&Date.now()-I>t){a(l)&&l(S);continue}await p.call(this,S,d);}}}finally{m=false;}}},"queue"),bt=c((s=10)=>D({size:s,overflow:"drop"}),"dropping"),Et=c((s=10)=>D({size:s,overflow:"slide"}),"sliding"),Tt=c(s=>D(Object.assign({},s,{overflow:"expand"})),"expanding");var Mt=c((s,t)=>{let{interval:e=1e3,drop:i}=t||{};return n=>async function(r,o){let l=0,u;for(;l<=s;)try{return await n.call(this,r,o)}catch(f){if(u=f,l<s)await new Promise(m=>{setTimeout(m,e);}),l++;else throw a(i)&&i(r,u),u}}},"retry");var Ft=c((s,t)=>e=>async function(i,n){let r,o=new Promise((u,f)=>{r=setTimeout(()=>{t!==void 0?u(t):f(new b);},s);}),l=Promise.resolve(e.call(this,i,n));try{return await Promise.race([l,o])}finally{clearTimeout(r);}},"timeout");var Nt=c((s,t)=>e=>{let i=false,n=null;return async function(r,o){if(i){t?.drop&&t.drop(r);return}try{i=!0;let l=await e.call(this,r,o);return n=setTimeout(()=>{i=!1,n=null;},s),l}catch(l){throw i=false,n&&(clearTimeout(n),n=null),l}}},"debounce");var It=c((s,t)=>e=>{let i=0;return async function(n,r){let o=Date.now();if(o-i<s){t?.drop&&t.drop(n);return}return i=o,await e.call(this,n,r)}},"throttle");function kt(s){let t,e=false,i,n=typeof s=="function";return function(r){return async function(o,l){if(e){if(typeof s=="function"){if(await s(o,l))return t}else if(o.payload===i)return t}let u=await r.call(this,o,l);return t=u,n||(i=o.payload),e=true,u}}}c(kt,"memorize");exports.AbortError=E;exports.FastEvent=W;exports.FastEventError=x;exports.FastEventScope=w;exports.QueueOverflowError=T;exports.TimeoutError=b;exports.debounce=Nt;exports.dropping=bt;exports.expanding=Tt;exports.memorize=kt;exports.queue=D;exports.retry=Mt;exports.sliding=Et;exports.throttle=It;exports.timeout=Ft;//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/handleEmitArgs.ts","../src/utils/renameFn.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/executors.ts","../src/utils/isFunction.ts","../src/consts.ts","../src/event.ts","../src/pipe/queue.ts","../src/pipe/timeout.ts","../src/pipe/debounce.ts","../src/pipe/throttle.ts"],"names":["handleEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","type","payload","meta","emitArgs","retain","Object","assign","keys","length","undefined","message","executor","renameFn","fn","name","defineProperty","value","configurable","FastEventScope","constructor","emitter","prefix","options","events","scope","endsWith","delimiter","context","_getScopeListener","listener","scopePrefix","scopeThis","startsWith","call","substring","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","opts","_FastEventScope","isPathMatched","path","pattern","fPattern","splice","Array","from","fill","i","removeItem","arr","condition","index","findIndex","item","push","executors_exports","__export","balance","first","last","race","random","__name","listeners","execute","winner","abortController","abortSignal","AbortController","signal","resolve","then","abort","forEach","Math","floor","isFunction","FastEventError","Error","_FastEventError","TimeoutError","_TimeoutError","AbortError","_AbortError","QueueOverflowError","_QueueOverflowError","FastEvent","__listeners","_options","_delimiter","_context","retainedMessages","Map","listenerCount","debug","id","toString","ignoreErrors","_enableDevTools","_addListener","parts","prepend","_forEachNodes","node","newListener","onAddListener","globalThis","__FLEXEVENT_DEVTOOLS__","add","callback","current","part","_removeListener","isArray","isRemove","onRemoveListener","_pipeListener","pipes","decorator","onMessage","bind","split","filter","oldListener","includes","_emitForLastEvent","hasWildcard","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","has","get","nodes","_executeListeners","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","e","_emitter","onListenerError","_executeListener","aborted","catch","_getListenerExecutor","executors","reduce","concat","executeor","set","results","onBeforeExecuteListener","onAfterExecuteListener","reject","tid","subscriber","clearTimeout","setTimeout","_FastEvent","queue","size","overflow","maxExpandSize","expandOverflow","onNew","buffer","currentSize","isHandling","pushMessage","handleOverflow","min","shift","nextMessage","dropping","sliding","expanding","ms","defaultValue","timeoutId","timeoutPromise","listenerPromise","debounce","isBlocked","drop","error","throttle","interval","lastExecutionTime","now","Date"],"mappings":"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","file":"index.js","sourcesContent":["import { FastEventListenerArgs, FastEventMessage } from \"../types\"\n\nexport function handleEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown\n>(args: IArguments, emitterMeta: any, scopeMeta?: any, scopeExecutor?: any): [FastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let type: string, payload: any, meta: any\n let emitArgs: FastEventListenerArgs<Meta> = {}\n\n if (typeof (args[0]) === 'object') {\n type = args[0].type as string\n payload = args[0].payload as any\n emitArgs = typeof (args[1]) === 'boolean' ? { retain: args[1] } : args[1] || {}\n meta = args[0].meta\n } else {\n type = args[0] as string\n 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) meta = undefined\n\n const message = {\n type,\n payload,\n meta\n } as FastEventMessage<Events, Meta>\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor\n }\n\n return [message, emitArgs]\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","import type { FastEvent } from \"./event\";\nimport { FastListenerExecutorArgs, FastEventAnyListener, FastEventEmitMessage, FastEventListener, FastEventListenerArgs, FastEventListenOptions, FastEventMessage, FastEventSubscriber, ScopeEvents, FastEventMeta } from \"./types\";\nimport { handleEmitArgs } from \"./utils/handleEmitArgs\";\nimport { renameFn } from \"./utils/renameFn\";\n\nexport type FastEventScopeOptions<Meta, Context> = {\n meta?: FastEventMeta & Meta\n context?: Context\n executor?: FastListenerExecutorArgs\n}\n\nexport type FastEventScopeMeta = {\n scope: string\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 = any,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = Meta & FastEventScopeMeta,\n> {\n options: Required<FastEventScopeOptions<FinalMeta, Context>>\n // @ts-ignore\n events: Events\n constructor(public emitter: FastEvent<Events>, public prefix: string, options?: FastEventScopeOptions<Meta, Context>) {\n this.options = Object.assign({}, {\n scope: prefix\n }, options) 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 get context() { return this.options.context }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: FastEventListener): FastEventListener {\n const scopePrefix = this.prefix\n if (scopePrefix.length === 0) return listener\n const scopeThis = this\n const scopeListener = renameFn(function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (message.type.startsWith(scopePrefix)) {\n return listener.call(scopeThis.context || scopeThis.emitter.context, Object.assign({}, message, {\n type: message.type.substring(scopePrefix.length)\n }), args)\n }\n }, listener.name)\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\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Events, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(): FastEventSubscriber {\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 public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n }\n\n onAny<P = any>(listener: FastEventAnyListener<{ [K: string]: P }, FinalMeta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber {\n return this.on('**' as any, listener, options)\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 public emit<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? Events[Types] : any, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{\n [K in T]: K extends Types ? Events[K] : any\n }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(): R[] {\n const [message, options] = handleEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor\n )\n message.type = this._getScopeType(message.type)!\n return this.emitter.emit(message as FastEventMessage<Events, FinalMeta>, options)\n }\n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\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 Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: Events[T] }, FinalMeta>>\n public async waitFor(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: any }, FinalMeta>>\n public async waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, FinalMeta>>\n public async waitFor(): Promise<FastEventMessage<Events, FinalMeta>> {\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 as unknown as FastEventMessage<Events, FinalMeta>\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 public 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 >(prefix: P, options?: FastEventScopeOptions<Partial<FinalMeta> & M, C>) {\n const meta = Object.assign({}, this.options.meta, options?.meta)\n // 如果options中提供了新的context,使用新的context;否则继承父scope的context\n const context = options?.context !== undefined ? options.context : this.context\n const opts = Object.assign({}, this.options, options, {\n meta: Object.keys(meta).length === 0 ? undefined : meta,\n context\n }) as FastEventScopeOptions<FinalMeta & M, C>\n return new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>(\n this.emitter as any,\n this.prefix + prefix,\n opts\n )\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 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\nexport function removeItem(arr:any[],condition:(item:any)=>boolean){\n let index:number[] = []\n while (true) {\n const i = arr.findIndex((item)=>{ \n return condition(item)\n })\n if(i === -1) {\n index.push(i)\n break\n } \n arr.splice(i,1)\n }\n return index\n}","import { FastListenerMeta, IFastListenerExecutor } from \"./types\"\n\nexport const allSettled: IFastListenerExecutor = (listeners, message, args, execute) => {\n return Promise.allSettled(listeners.map(listener => execute(listener[0], message, args)))\n}\n\nexport const race: IFastListenerExecutor = (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n}\n\n/**\n * 负载均衡执行器\n * \n * 不像其他执行器,只执行所有监听器中执行次数最少的那个\n * \n * @param listeners FastListenerMeta\n * @returns Promise 最先完成的监听器的执行结果\n */\nexport const balance: IFastListenerExecutor = (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n}\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n}\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n}\n\nexport const random: IFastListenerExecutor = (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","\n\nexport class FastEventError extends Error { }\n\nexport class TimeoutError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }","import { FastEventScope, type FastEventScopeOptions } from './scope';\nimport {\n FastEventListener,\n FastEventOptions,\n FastListeners,\n FastListenerNode,\n FastEventSubscriber,\n FastEventListenOptions,\n FastEventMessage,\n FastEventAnyListener,\n RequiredItems,\n Fallback,\n FastEventEmitMessage,\n FastEventListenerArgs,\n FastListenerMeta,\n IFastListenerExecutor,\n FastEvents\n} from './types';\nimport { handleEmitArgs } from './utils/handleEmitArgs';\nimport { isPathMatched } from './utils/isPathMatched';\nimport { removeItem } from './utils/removeItem';\nimport { renameFn } from './utils/renameFn';\nimport * as executors from \"./executors\"\nimport { isFunction } from './utils/isFunction';\nimport { ScopeEvents } from './types';\nimport { FastListenerPipe } from './pipe';\nimport { AbortError } from './consts';\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 AllEvents extends Record<string, any> = Events & FastEvents,\n Types extends keyof AllEvents = Exclude<keyof (AllEvents), number | symbol>\n> {\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners\n\n /** 事件发射器的配置选项 */\n private _options: RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = '/'\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context\n\n /** 保留的事件消息映射,用于新订阅者 */\n retainedMessages: Map<string, any> = new Map<string, any>()\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0\n // @ts-ignore\n events: Events\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?: FastEventOptions<Meta, Context>) {\n this._options = Object.assign({\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: '/',\n context: null,\n ignoreErrors: true,\n meta: undefined\n }, options) as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n this._delimiter = this._options.delimiter!\n this._context = this._options.context!\n this._enableDevTools()\n }\n\n /** 获取事件发射器的配置选项 */\n get options() { return this._options as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']> }\n get context() { return this._context }\n /** 获取事件发射器的唯一标识符 */\n get id() { return this._options.id! }\n private _addListener(parts: string[], listener: FastEventListener<any, any>, options: Required<FastEventListenOptions>): FastListenerNode | undefined {\n const { count, prepend } = options\n return this._forEachNodes(parts, (node) => {\n const newListener = [listener, count, 0] as unknown as FastListenerMeta// count > 0 ? [listener, count] : listener as any\n if (prepend) {\n node.__listeners.splice(0, 0, newListener)\n } else {\n node.__listeners.push(newListener)\n }\n this.listenerCount++\n if (isFunction(this._options.onAddListener)) {\n this._options.onAddListener(parts, listener)\n }\n })\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n globalThis.__FLEXEVENT_DEVTOOLS__ && globalThis.__FLEXEVENT_DEVTOOLS__.add(this)\n }\n }\n /**\n * \n * 根据parts路径遍历侦听器树,并在最后的节点上执行回调函数\n * \n * @param parts \n * @param callback \n * @returns \n */\n private _forEachNodes(parts: string[], callback: (node: FastListenerNode, parent: FastListenerNode) => void): FastListenerNode | undefined {\n if (parts.length === 0) return\n let current = this.listeners\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (!(part in current)) {\n current[part] = {\n __listeners: []\n } as unknown as FastListeners\n }\n if (i === parts.length - 1) {\n const node = current[part]\n callback(node, current)\n return node\n } else {\n current = current[part]\n }\n }\n return undefined\n }\n\n\n /**\n * 从监听器节点中移除指定的事件监听器\n * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(node: FastListenerNode, path: string[], listener: FastEventListener<any, any, any>): 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, listener)\n }\n }\n return isRemove\n })\n }\n private _pipeListener(listener: FastEventListener<any, any, any, any>, pipes: FastListenerPipe[]): FastEventListener<any, any, any, any> {\n pipes.forEach(decorator => {\n listener = renameFn(decorator(listener), listener.name)\n })\n return listener\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(): FastEventSubscriber {\n\n const type = arguments[0] as string\n let listener = isFunction(arguments[1]) ? arguments[1] : this.onMessage.bind(this)\n\n const options = Object.assign({\n count: 0,\n prepend: false\n }, isFunction(arguments[1]) ? arguments[2] : arguments[1]) as Required<FastEventListenOptions>\n\n if (type.length === 0) throw new Error('event type cannot be empty')\n\n const parts = type.split(this._delimiter);\n\n if (options.pipes && options.pipes.length > 0) {\n listener = this._pipeListener(listener, options.pipes)\n }\n\n if (isFunction(options.filter) || isFunction(options.off)) {\n const oldListener = listener\n listener = renameFn<FastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (isFunction(options.off) && options.off.call(this, message, args)) {\n off()\n return\n }\n // 如果满足条件就触发监听器\n if (isFunction(options.filter)) {\n if (options.filter.call(this, message, args!)) return oldListener.call(this, message, args)\n } else {\n return oldListener.call(this, message, args)\n }\n }, listener.name)\n }\n\n const node = this._addListener(parts, listener, options)\n const off = () => node && this._removeListener(node, parts, listener)\n // Retain不支持通配符\n if (node && !type.includes('*')) this._emitForLastEvent(type)\n\n return { off, listener }\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n } else {\n return this.on(arguments[0], Object.assign({}, arguments[2], { count: 1 }))\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 * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber\n */\n onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny<P = any>(listener: FastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny(): FastEventSubscriber {\n return this.on(\"**\", arguments[0], arguments[1])\n }\n /**\n * \n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n * \n * 此方法供子类继承\n * \n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onMessage(message: FastEventMessage) {\n\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 this._removeListener(node, parts, listener)\n } else if (type) {\n node.__listeners = []\n }\n })\n } else { // 仅删除指定的侦听器\n const entryParts: string[] = hasWildcard ? [] : parts\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener)\n } else {\n node.__listeners = []\n }\n }\n })\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器\n * @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 private _emitForLastEvent(type: string) {\n if (this.retainedMessages.has(type)) {\n const message = this.retainedMessages.get(type)\n const parts = type.split(this._delimiter);\n const nodes: FastListenerNode[] = []\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n this._executeListeners(nodes, message)\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(node: FastListenerNode, parts: string[], callback: (node: FastListenerNode) => void, index: number = 0, lastFollowing?: boolean): void {\n\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(node: FastListenerNode, entry: string[], callback: (path: string[], node: FastListenerNode) => void): void {\n let entryNode: FastListenerNode = node\n // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node\n });\n }\n const traverseNodes = (node: FastListenerNode, callback: (path: string[], node: FastListenerNode) => void, parentPath: string[]) => {\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 FastListenerNode, callback, [...parentPath, key]);\n }\n }\n }\n // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined, e: any) {\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 { this._options.onListenerError.call(this, listener, e, message, args) } catch { }\n }\n if (this._options.ignoreErrors) {\n return e\n } else {\n throw e\n }\n\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\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(listener: any, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(listener, message, args, new AbortError(listener.name))\n }\n let result = listener.call(this._context || this, message, args)\n // 自动处理reject Promise\n if (result && result instanceof Promise) {\n result = result.catch(e => { return this._onListenerError(listener, message, args, e) })\n }\n return result\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e)\n }\n }\n private _getListenerExecutor(args?: FastEventListenerArgs): IFastListenerExecutor | undefined {\n if (!args) return\n const executor = args.executor || this._options.executor\n if (isFunction(executor)) return executor\n if (executor && executor in executors) return (executors as any)[executor]\n }\n /**\n * 触发事件并执行对应的监听器\n * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n return\n }\n /**\n * 执行监听器节点中的所有监听函数\n * @param node - FastListenerNode类型的监听器节点\n * @param payload - 事件携带的数据\n * @param type - 事件类型\n * @returns 返回所有监听函数的执行结果数组\n * @private\n * \n * @description\n * 遍历执行节点中的所有监听函数:\n * - 对于普通监听器,直接执行并收集结果\n * - 对于带次数限制的监听器(数组形式),执行后递减次数,当次数为0时移除该监听器\n */\n private _executeListeners(nodes: FastListenerNode[], message: FastEventMessage, args?: FastEventListenerArgs<Meta>): any[] {\n if (!nodes || nodes.length === 0) return []\n\n // 1. 遍历所有监听器任务,即需要执行的监听器函数列[]\n const listeners = nodes.reduce<[FastListenerMeta, number, FastListenerMeta[]][]>((result, node) => {\n return result.concat(node.__listeners.map((listener, i) => [listener, i, node.__listeners] as [FastListenerMeta, number, FastListenerMeta[]]));\n }, []);\n\n try {\n const executeor = this._getListenerExecutor(args)\n if (executeor) {\n return executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]\n } else {\n return listeners.map(listener => this._executeListener(listener[0][0], message, args))\n }\n } finally {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastListenerMeta\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 * \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 public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], retain?: boolean): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, retain?: boolean): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[]\n //----\n public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(): R[] {\n const [message, args] = handleEmitArgs<AllEvents, Meta>(arguments, this.options.meta)\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: FastListenerNode[] = []\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n if (isFunction(this._options.onBeforeExecuteListener)) {\n if (this._options.onBeforeExecuteListener.call(this, message, args) === false) {\n throw new Error('emit ' + message.type + ' is aborted')\n }\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\n return results\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>(type: string, payload?: any, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>\n // --- \n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): 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 public waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: AllEvents[T] }, Meta>>\n public waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>\n public waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, Meta>>\n public waitFor(): Promise<FastEventMessage<AllEvents, Meta>> {\n const type = arguments[0] as any\n const timeout = arguments[1] as number\n return new Promise<FastEventMessage<AllEvents, Meta>>((resolve, reject) => {\n let tid: any\n let subscriber: FastEventSubscriber\n const listener = (message: FastEventMessage<AllEvents, Meta>) => {\n clearTimeout(tid)\n subscriber.off()\n resolve(message)\n }\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber && subscriber.off()\n reject(new Error('wait for event<' + type + '> is timeout'))\n }, timeout)\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<\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 >(prefix: P, options?: FastEventScopeOptions<M, C>) {\n return new FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>(\n this as any, prefix, options as FastEventScopeOptions<Meta & M, C>)\n }\n} ","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onNew?: (newMessage: FastEventMessage, messages: FastEventMessage[]) => void\n}\n\n/**\n * 对消息队列进行排序\n * \n * \n * \n * @param messages \n * @param options \n */\nfunction sortMessageQueue(messages: FastEventMessage[], options: Required<QueueListenerPipeOptions>) {\n\n}\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { size, overflow, maxExpandSize, expandOverflow, onNew } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n }, options)\n\n const buffer: FastEventMessage[] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onNew)) {\n onNew(message, buffer)\n } else {\n buffer.push(message)\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n buffer.shift() // 移除最旧的消息\n pushMessage(message)\n return true\n case 'throw':\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const nextMessage = buffer.shift()\n if (nextMessage) {\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/handleEmitArgs.ts","../src/utils/renameFn.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/executors.ts","../src/utils/isFunction.ts","../src/consts.ts","../src/event.ts","../src/pipe/queue.ts","../src/pipe/retry.ts","../src/pipe/timeout.ts","../src/pipe/debounce.ts","../src/pipe/throttle.ts","../src/pipe/memorize.ts"],"names":["handleEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","type","payload","meta","emitArgs","retain","Object","assign","keys","length","undefined","message","executor","renameFn","fn","name","defineProperty","value","configurable","FastEventScope","constructor","emitter","prefix","options","events","scope","endsWith","delimiter","context","_getScopeListener","listener","scopePrefix","scopeThis","startsWith","call","substring","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","opts","_FastEventScope","isPathMatched","path","pattern","fPattern","splice","Array","from","fill","i","removeItem","arr","condition","index","findIndex","item","push","executors_exports","__export","balance","first","last","race","random","__name","listeners","execute","winner","abortController","abortSignal","AbortController","signal","resolve","then","abort","forEach","Math","floor","isFunction","FastEventError","Error","_FastEventError","TimeoutError","_TimeoutError","AbortError","_AbortError","QueueOverflowError","_QueueOverflowError","FastEvent","__listeners","_options","_delimiter","_context","retainedMessages","Map","listenerCount","debug","id","toString","ignoreErrors","_enableDevTools","_addListener","parts","prepend","_forEachNodes","node","newListener","onAddListener","globalThis","__FLEXEVENT_DEVTOOLS__","add","callback","current","part","_removeListener","isArray","isRemove","onRemoveListener","_pipeListener","pipes","decorator","onMessage","bind","split","filter","oldListener","includes","_emitForLastEvent","hasWildcard","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","has","get","nodes","_executeListeners","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","e","_emitter","onListenerError","_executeListener","aborted","catch","_getListenerExecutor","executors","reduce","concat","executeor","set","results","onBeforeExecuteListener","onAfterExecuteListener","reject","tid","subscriber","clearTimeout","setTimeout","_FastEvent","queue","lifetime","size","overflow","maxExpandSize","expandOverflow","onEnter","onDrop","buffer","currentSize","isHandling","pushMessage","Date","now","handleOverflow","min","msg","shift","nextMessage","enterTime","dropping","sliding","expanding","retry","interval","drop","retries","lastError","error","ms","defaultValue","timeoutId","timeoutPromise","listenerPromise","debounce","isBlocked","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate"],"mappings":"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","file":"index.js","sourcesContent":["import { FastEventListenerArgs, FastEventMessage } from \"../types\"\n\nexport function handleEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown\n>(args: IArguments, emitterMeta: any, scopeMeta?: any, scopeExecutor?: any): [FastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let type: string, payload: any, meta: any\n let emitArgs: FastEventListenerArgs<Meta> = {}\n\n if (typeof (args[0]) === 'object') {\n type = args[0].type as string\n payload = args[0].payload as any\n emitArgs = typeof (args[1]) === 'boolean' ? { retain: args[1] } : args[1] || {}\n meta = args[0].meta\n } else {\n type = args[0] as string\n 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) meta = undefined\n\n const message = {\n type,\n payload,\n meta\n } as FastEventMessage<Events, Meta>\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor\n }\n\n return [message, emitArgs]\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","import type { FastEvent } from \"./event\";\nimport { FastListenerExecutorArgs, FastEventAnyListener, FastEventEmitMessage, FastEventListener, FastEventListenerArgs, FastEventListenOptions, FastEventMessage, FastEventSubscriber, ScopeEvents, FastEventMeta } from \"./types\";\nimport { handleEmitArgs } from \"./utils/handleEmitArgs\";\nimport { renameFn } from \"./utils/renameFn\";\n\nexport type FastEventScopeOptions<Meta, Context> = {\n meta?: FastEventMeta & Meta\n context?: Context\n executor?: FastListenerExecutorArgs\n}\n\nexport type FastEventScopeMeta = {\n scope: string\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 = any,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = Meta & FastEventScopeMeta,\n> {\n options: Required<FastEventScopeOptions<FinalMeta, Context>>\n // @ts-ignore\n events: Events\n constructor(public emitter: FastEvent<Events>, public prefix: string, options?: FastEventScopeOptions<Meta, Context>) {\n this.options = Object.assign({}, {\n scope: prefix\n }, options) 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 get context() { return this.options.context }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: FastEventListener): FastEventListener {\n const scopePrefix = this.prefix\n if (scopePrefix.length === 0) return listener\n const scopeThis = this\n const scopeListener = renameFn(function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (message.type.startsWith(scopePrefix)) {\n return listener.call(scopeThis.context || scopeThis.emitter.context, Object.assign({}, message, {\n type: message.type.substring(scopePrefix.length)\n }), args)\n }\n }, listener.name)\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\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Events, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(): FastEventSubscriber {\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 public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n }\n\n onAny<P = any>(listener: FastEventAnyListener<{ [K: string]: P }, FinalMeta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber {\n return this.on('**' as any, listener, options)\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 public emit<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? Events[Types] : any, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{\n [K in T]: K extends Types ? Events[K] : any\n }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(): R[] {\n const [message, options] = handleEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor\n )\n message.type = this._getScopeType(message.type)!\n return this.emitter.emit(message as FastEventMessage<Events, FinalMeta>, options)\n }\n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\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 Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: Events[T] }, FinalMeta>>\n public async waitFor(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: any }, FinalMeta>>\n public async waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, FinalMeta>>\n public async waitFor(): Promise<FastEventMessage<Events, FinalMeta>> {\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 as unknown as FastEventMessage<Events, FinalMeta>\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 public 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 >(prefix: P, options?: FastEventScopeOptions<Partial<FinalMeta> & M, C>) {\n const meta = Object.assign({}, this.options.meta, options?.meta)\n // 如果options中提供了新的context,使用新的context;否则继承父scope的context\n const context = options?.context !== undefined ? options.context : this.context\n const opts = Object.assign({}, this.options, options, {\n meta: Object.keys(meta).length === 0 ? undefined : meta,\n context\n }) as FastEventScopeOptions<FinalMeta & M, C>\n return new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>(\n this.emitter as any,\n this.prefix + prefix,\n opts\n )\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 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\nexport function removeItem(arr:any[],condition:(item:any)=>boolean){\n let index:number[] = []\n while (true) {\n const i = arr.findIndex((item)=>{ \n return condition(item)\n })\n if(i === -1) {\n index.push(i)\n break\n } \n arr.splice(i,1)\n }\n return index\n}","import { FastListenerMeta, IFastListenerExecutor } from \"./types\"\n\nexport const allSettled: IFastListenerExecutor = (listeners, message, args, execute) => {\n return Promise.allSettled(listeners.map(listener => execute(listener[0], message, args)))\n}\n\nexport const race: IFastListenerExecutor = (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n}\n\n/**\n * 负载均衡执行器\n * \n * 不像其他执行器,只执行所有监听器中执行次数最少的那个\n * \n * @param listeners FastListenerMeta\n * @returns Promise 最先完成的监听器的执行结果\n */\nexport const balance: IFastListenerExecutor = (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n}\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n}\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n}\n\nexport const random: IFastListenerExecutor = (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","\n\nexport class FastEventError extends Error { }\n\nexport class TimeoutError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }","import { FastEventScope, type FastEventScopeOptions } from './scope';\nimport {\n FastEventListener,\n FastEventOptions,\n FastListeners,\n FastListenerNode,\n FastEventSubscriber,\n FastEventListenOptions,\n FastEventMessage,\n FastEventAnyListener,\n RequiredItems,\n Fallback,\n FastEventEmitMessage,\n FastEventListenerArgs,\n FastListenerMeta,\n IFastListenerExecutor,\n FastEvents\n} from './types';\nimport { handleEmitArgs } from './utils/handleEmitArgs';\nimport { isPathMatched } from './utils/isPathMatched';\nimport { removeItem } from './utils/removeItem';\nimport { renameFn } from './utils/renameFn';\nimport * as executors from \"./executors\"\nimport { isFunction } from './utils/isFunction';\nimport { ScopeEvents } from './types';\nimport { FastListenerPipe } from './pipe';\nimport { AbortError } from './consts';\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 AllEvents extends Record<string, any> = Events & FastEvents,\n Types extends keyof AllEvents = Exclude<keyof (AllEvents), number | symbol>\n> {\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners\n\n /** 事件发射器的配置选项 */\n private _options: RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = '/'\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context\n\n /** 保留的事件消息映射,用于新订阅者 */\n retainedMessages: Map<string, any> = new Map<string, any>()\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0\n // @ts-ignore\n events: Events\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?: FastEventOptions<Meta, Context>) {\n this._options = Object.assign({\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: '/',\n context: null,\n ignoreErrors: true,\n meta: undefined\n }, options) as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n this._delimiter = this._options.delimiter!\n this._context = this._options.context!\n this._enableDevTools()\n }\n\n /** 获取事件发射器的配置选项 */\n get options() { return this._options as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']> }\n get context() { return this._context }\n /** 获取事件发射器的唯一标识符 */\n get id() { return this._options.id! }\n private _addListener(parts: string[], listener: FastEventListener<any, any>, options: Required<FastEventListenOptions>): FastListenerNode | undefined {\n const { count, prepend } = options\n return this._forEachNodes(parts, (node) => {\n const newListener = [listener, count, 0] as unknown as FastListenerMeta// count > 0 ? [listener, count] : listener as any\n if (prepend) {\n node.__listeners.splice(0, 0, newListener)\n } else {\n node.__listeners.push(newListener)\n }\n this.listenerCount++\n if (isFunction(this._options.onAddListener)) {\n this._options.onAddListener(parts, listener)\n }\n })\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n globalThis.__FLEXEVENT_DEVTOOLS__ && globalThis.__FLEXEVENT_DEVTOOLS__.add(this)\n }\n }\n /**\n * \n * 根据parts路径遍历侦听器树,并在最后的节点上执行回调函数\n * \n * @param parts \n * @param callback \n * @returns \n */\n private _forEachNodes(parts: string[], callback: (node: FastListenerNode, parent: FastListenerNode) => void): FastListenerNode | undefined {\n if (parts.length === 0) return\n let current = this.listeners\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (!(part in current)) {\n current[part] = {\n __listeners: []\n } as unknown as FastListeners\n }\n if (i === parts.length - 1) {\n const node = current[part]\n callback(node, current)\n return node\n } else {\n current = current[part]\n }\n }\n return undefined\n }\n\n\n /**\n * 从监听器节点中移除指定的事件监听器\n * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(node: FastListenerNode, path: string[], listener: FastEventListener<any, any, any>): 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, listener)\n }\n }\n return isRemove\n })\n }\n private _pipeListener(listener: FastEventListener<any, any, any, any>, pipes: FastListenerPipe[]): FastEventListener<any, any, any, any> {\n pipes.forEach(decorator => {\n listener = renameFn(decorator(listener), listener.name)\n })\n return listener\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(): FastEventSubscriber {\n\n const type = arguments[0] as string\n let listener = isFunction(arguments[1]) ? arguments[1] : this.onMessage.bind(this)\n\n const options = Object.assign({\n count: 0,\n prepend: false\n }, isFunction(arguments[1]) ? arguments[2] : arguments[1]) as Required<FastEventListenOptions>\n\n if (type.length === 0) throw new Error('event type cannot be empty')\n\n const parts = type.split(this._delimiter);\n\n if (options.pipes && options.pipes.length > 0) {\n listener = this._pipeListener(listener, options.pipes)\n }\n\n if (isFunction(options.filter) || isFunction(options.off)) {\n const oldListener = listener\n listener = renameFn<FastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (isFunction(options.off) && options.off.call(this, message, args)) {\n off()\n return\n }\n // 如果满足条件就触发监听器\n if (isFunction(options.filter)) {\n if (options.filter.call(this, message, args!)) return oldListener.call(this, message, args)\n } else {\n return oldListener.call(this, message, args)\n }\n }, listener.name)\n }\n\n const node = this._addListener(parts, listener, options)\n const off = () => node && this._removeListener(node, parts, listener)\n // Retain不支持通配符\n if (node && !type.includes('*')) this._emitForLastEvent(type)\n\n return { off, listener }\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n } else {\n return this.on(arguments[0], Object.assign({}, arguments[2], { count: 1 }))\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 * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber\n */\n onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny<P = any>(listener: FastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny(): FastEventSubscriber {\n return this.on(\"**\", arguments[0], arguments[1])\n }\n /**\n * \n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n * \n * 此方法供子类继承\n * \n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onMessage(message: FastEventMessage) {\n\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 this._removeListener(node, parts, listener)\n } else if (type) {\n node.__listeners = []\n }\n })\n } else { // 仅删除指定的侦听器\n const entryParts: string[] = hasWildcard ? [] : parts\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener)\n } else {\n node.__listeners = []\n }\n }\n })\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器\n * @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 private _emitForLastEvent(type: string) {\n if (this.retainedMessages.has(type)) {\n const message = this.retainedMessages.get(type)\n const parts = type.split(this._delimiter);\n const nodes: FastListenerNode[] = []\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n this._executeListeners(nodes, message)\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(node: FastListenerNode, parts: string[], callback: (node: FastListenerNode) => void, index: number = 0, lastFollowing?: boolean): void {\n\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(node: FastListenerNode, entry: string[], callback: (path: string[], node: FastListenerNode) => void): void {\n let entryNode: FastListenerNode = node\n // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node\n });\n }\n const traverseNodes = (node: FastListenerNode, callback: (path: string[], node: FastListenerNode) => void, parentPath: string[]) => {\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 FastListenerNode, callback, [...parentPath, key]);\n }\n }\n }\n // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined, e: any) {\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 { this._options.onListenerError.call(this, listener, e, message, args) } catch { }\n }\n if (this._options.ignoreErrors) {\n return e\n } else {\n throw e\n }\n\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\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(listener: any, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(listener, message, args, new AbortError(listener.name))\n }\n let result = listener.call(this._context || this, message, args)\n // 自动处理reject Promise\n if (result && result instanceof Promise) {\n result = result.catch(e => { return this._onListenerError(listener, message, args, e) })\n }\n return result\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e)\n }\n }\n private _getListenerExecutor(args?: FastEventListenerArgs): IFastListenerExecutor | undefined {\n if (!args) return\n const executor = args.executor || this._options.executor\n if (isFunction(executor)) return executor\n if (executor && executor in executors) return (executors as any)[executor]\n }\n /**\n * 触发事件并执行对应的监听器\n * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n return\n }\n /**\n * 执行监听器节点中的所有监听函数\n * @param node - FastListenerNode类型的监听器节点\n * @param payload - 事件携带的数据\n * @param type - 事件类型\n * @returns 返回所有监听函数的执行结果数组\n * @private\n * \n * @description\n * 遍历执行节点中的所有监听函数:\n * - 对于普通监听器,直接执行并收集结果\n * - 对于带次数限制的监听器(数组形式),执行后递减次数,当次数为0时移除该监听器\n */\n private _executeListeners(nodes: FastListenerNode[], message: FastEventMessage, args?: FastEventListenerArgs<Meta>): any[] {\n if (!nodes || nodes.length === 0) return []\n\n // 1. 遍历所有监听器任务,即需要执行的监听器函数列[]\n const listeners = nodes.reduce<[FastListenerMeta, number, FastListenerMeta[]][]>((result, node) => {\n return result.concat(node.__listeners.map((listener, i) => [listener, i, node.__listeners] as [FastListenerMeta, number, FastListenerMeta[]]));\n }, []);\n\n try {\n const executeor = this._getListenerExecutor(args)\n if (executeor) {\n return executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]\n } else {\n return listeners.map(listener => this._executeListener(listener[0][0], message, args))\n }\n } finally {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastListenerMeta\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 * \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 public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], retain?: boolean): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, retain?: boolean): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[]\n //----\n public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(): R[] {\n const [message, args] = handleEmitArgs<AllEvents, Meta>(arguments, this.options.meta)\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: FastListenerNode[] = []\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n if (isFunction(this._options.onBeforeExecuteListener)) {\n if (this._options.onBeforeExecuteListener.call(this, message, args) === false) {\n throw new Error('emit ' + message.type + ' is aborted')\n }\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\n return results\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>(type: string, payload?: any, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>\n // --- \n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): 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 public waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: AllEvents[T] }, Meta>>\n public waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>\n public waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, Meta>>\n public waitFor(): Promise<FastEventMessage<AllEvents, Meta>> {\n const type = arguments[0] as any\n const timeout = arguments[1] as number\n return new Promise<FastEventMessage<AllEvents, Meta>>((resolve, reject) => {\n let tid: any\n let subscriber: FastEventSubscriber\n const listener = (message: FastEventMessage<AllEvents, Meta>) => {\n clearTimeout(tid)\n subscriber.off()\n resolve(message)\n }\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber && subscriber.off()\n reject(new Error('wait for event<' + type + '> is timeout'))\n }, timeout)\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<\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 >(prefix: P, options?: FastEventScopeOptions<M, C>) {\n return new FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>(\n this as any, prefix, options as FastEventScopeOptions<Meta & M, C>)\n }\n} ","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onEnter, onDrop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n const buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onEnter)) {\n onEnter(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var T=Object.defineProperty;var z=(r,t,e)=>t in r?T(r,t,{enumerable:true,configurable:true,writable:true,value:e}):r[t]=e;var l=(r,t)=>T(r,"name",{value:t,configurable:true});var D=(r,t)=>{for(var e in t)T(r,e,{get:t[e],enumerable:true});};var f=(r,t,e)=>z(r,typeof t!="symbol"?t+"":t,e);function x(r,t,e,s){let i,n,o,c={};typeof r[0]=="object"?(i=r[0].type,n=r[0].payload,c=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},o=r[0].meta):(i=r[0],n=r[1],c=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),o=Object.assign({},t,e,c.meta,o),Object.keys(o).length===0&&(o=void 0);let a={type:i,payload:n,meta:o};return c.executor===void 0&&(c.executor=s),[a,c]}l(x,"handleEmitArgs");function m(r,t){return Object.defineProperty(r,"name",{value:t||"anonymous",configurable:true}),r}l(m,"renameFn");var L=class L{constructor(t,e,s){f(this,"emitter");f(this,"prefix");f(this,"options");f(this,"events");this.emitter=t,this.prefix=e,this.options=Object.assign({},{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}get context(){return this.options.context}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;let s=this;return m(function(n,o){if(n.type.startsWith(e))return t.call(s.context||s.emitter.context,Object.assign({},n,{type:n.type.substring(e.length)}),o)},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(t,e){return this.on("**",t,e)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[t,e]=x(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(t,e){let s=Object.assign({},this.options.meta,e?.meta),i=e?.context!==void 0?e.context:this.context,n=Object.assign({},this.options,e,{meta:Object.keys(s).length===0?void 0:s,context:i});return new L(this.emitter,this.prefix+t,n)}};l(L,"FastEventScope");var y=L;function N(r,t){if(r.length!==t.length&&r.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:r.length-t.length+1}).fill("*"));for(let s=0;s<r.length;s++)if(e[s]!=="*"&&e[s]!==r[s])return false;return true}l(N,"isPathMatched");function W(r,t){let e=[];for(;;){let s=r.findIndex(i=>t(i));if(s===-1){e.push(s);break}r.splice(s,1);}return e}l(W,"removeItem");var w={};D(w,{allSettled:()=>I,balance:()=>V,first:()=>k,last:()=>X,race:()=>B,random:()=>$});var I=l((r,t,e,s)=>Promise.allSettled(r.map(i=>s(i[0],t,e))),"allSettled"),B=l((r,t,e,s)=>{let i,n;return (!e||e&&!e.abortSignal)&&(n=new AbortController,e||(e={}),e.abortSignal=n.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(s(c[0],t,e)).then(a=>(i||(i=c,c[2]++),n?.abort(),a)))))]},"race"),V=l((r,t,e,s)=>{let i,n=0;return r.forEach((o,c)=>{o[2]--,(i===void 0||i>o[2])&&(i=o[2],n=c);}),r[n][2]++,[s(r[n][0],t,e)]},"balance"),k=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[0][2]++,[s(r[0][0],t,e)]),"first"),X=l((r,t,e,s)=>(r.forEach(i=>i[2]--),r[r.length-1][2]++,[s(r[r.length-1][0],t,e)]),"last"),$=l((r,t,e,s)=>{let i=Math.floor(Math.random()*r.length);return r.forEach(n=>n[2]--),r[i][2]++,[s(r[i][0],t,e)]},"random");function u(r){return r&&typeof r=="function"}l(u,"isFunction");var P=class P extends Error{};l(P,"FastEventError");var d=P,S=class S extends d{};l(S,"TimeoutError");var b=S,M=class M extends d{};l(M,"AbortError");var v=M,O=class O extends d{};l(O,"QueueOverflowError");var E=O;var A=class A{constructor(t){f(this,"listeners",{__listeners:[]});f(this,"_options");f(this,"_delimiter","/");f(this,"_context");f(this,"retainedMessages",new Map);f(this,"listenerCount",0);f(this,"events");this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0},t),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this._context}get id(){return this._options.id}_addListener(t,e,s){let{count:i,prepend:n}=s;return this._forEachNodes(t,o=>{let c=[e,i,0];n?o.__listeners.splice(0,0,c):o.__listeners.push(c),this.listenerCount++,u(this._options.onAddListener)&&this._options.onAddListener(t,e);})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let i=0;i<t.length;i++){let n=t[i];if(n in s||(s[n]={__listeners:[]}),i===t.length-1){let o=s[n];return e(o,s),o}else s=s[n];}}_removeListener(t,e,s){s&&W(t.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,u(this._options.onRemoveListener)&&this._options.onRemoveListener(e,s)),n});}_pipeListener(t,e){return e.forEach(s=>{t=m(s(t),t.name);}),t}on(){let t=arguments[0],e=u(arguments[1])?arguments[1]:this.onMessage.bind(this),s=Object.assign({count:0,prepend:false},u(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");let i=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),u(s.filter)||u(s.off)){let c=e;e=m(function(a,h){if(u(s.off)&&s.off.call(this,a,h)){o();return}if(u(s.filter)){if(s.filter.call(this,a,h))return c.call(this,a,h)}else return c.call(this,a,h)},e.name);}let n=this._addListener(i,e,s),o=l(()=>n&&this._removeListener(n,i,e),"off");return n&&!t.includes("*")&&this._emitForLastEvent(t),{off:o,listener:e}}once(){return u(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t){}off(){let t=arguments,e=u(t[0])?void 0:t[0],s=u(t[0])?t[0]:t[1],i=e?e.split(this._delimiter):[],n=e?e.includes("*"):false;if(e&&!n)this._traverseToPath(this.listeners,i,o=>{s?this._removeListener(o,i,s):e&&(o.__listeners=[]);});else {let o=n?[]:i;this._traverseListeners(this.listeners,o,(c,a)=>{(s!==void 0||n&&N(c,i))&&(s?this._removeListener(a,i,s):a.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(i,n)=>{s+=n.__listeners.length,n.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,i)=>{e+=i.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}u(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitForLastEvent(t){if(this.retainedMessages.has(t)){let e=this.retainedMessages.get(t),s=t.split(this._delimiter),i=[];this._traverseToPath(this.listeners,s,n=>{i.push(n);}),this._executeListeners(i,e);}}_traverseToPath(t,e,s,i=0,n){if(i>=e.length){s(t);return}let o=e[i];if(n===true){this._traverseToPath(t,e,s,i+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,i+1),"**"in t&&this._traverseToPath(t["**"],e,s,i+1,true),o in t&&this._traverseToPath(t[o],e,s,i+1);}_traverseListeners(t,e,s){let i=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{i=o;});let n=l((o,c,a)=>{c(a,o);for(let[h,_]of Object.entries(o))h.startsWith("__")||_&&n(_,c,[...a,h]);},"traverseNodes");n(i,s,[]);}_onListenerError(t,e,s,i){if(i instanceof Error&&(i._emitter=`${t.name||"anonymous"}:${e.type}`),u(this._options.onListenerError))try{this._options.onListenerError.call(this,t,i,e,s);}catch{}if(this._options.ignoreErrors)return i;throw i}_executeListener(t,e,s){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new v(t.name));let i=t.call(this._context||this,e,s);return i&&i instanceof Promise&&(i=i.catch(n=>this._onListenerError(t,e,s,n))),i}catch(i){return this._onListenerError(t,e,s,i)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(u(e))return e;if(e&&e in w)return w[e]}_executeListeners(t,e,s){if(!t||t.length===0)return [];let i=t.reduce((n,o)=>n.concat(o.__listeners.map((c,a)=>[c,a,o.__listeners])),[]);try{let n=this._getListenerExecutor(s);return n?n(i.map(o=>o[0]),e,s,this._executeListener.bind(this)):i.map(o=>this._executeListener(o[0][0],e,s))}finally{for(let n=i.length-1;n>=0;n--){let o=i[n][0];o[2]++,o[1]>0&&o[1]<=o[2]&&i[n][2].splice(n,1);}}}emit(){let[t,e]=x(arguments,this.options.meta),s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let i=[],n=[];if(this._traverseToPath(this.listeners,s,o=>{n.push(o);}),u(this._options.onBeforeExecuteListener)&&this._options.onBeforeExecuteListener.call(this,t,e)===false)throw new Error("emit "+t.type+" is aborted");return i.push(...this._executeListeners(n,t,e)),u(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,i,n),i}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,i)=>{let n,o,c=l(a=>{clearTimeout(n),o.off(),s(a);},"listener");e&&e>0&&(n=setTimeout(()=>{o&&o.off(),i(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,c);})}scope(t,e){return new y(this,t,e)}};l(A,"FastEvent");var R=A;var j=l(r=>{let{size:t,overflow:e,maxExpandSize:s,expandOverflow:i,onNew:n}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide"},r),o=[],c=t,a=false,h=l(p=>{u(n)?n(p,o):o.push(p);},"pushMessage"),_=l(p=>{switch(o.length>=s&&e==="expand"?i:e){case "drop":return false;case "expand":return c=Math.min(c+t,s),h(p),true;case "slide":return o.shift(),h(p),true;case "throw":throw new E;default:return false}},"handleOverflow");return p=>async function(g,C){if(a){o.length<c?h(g):_(g);return}a=true;try{for(await p.call(this,g,C);o.length>0;){let F=o.shift();F&&await p.call(this,F,C);}}finally{a=false;}}},"queue"),Lt=l((r=10)=>j({size:r,overflow:"drop"}),"dropping"),wt=l((r=10)=>j({size:r,overflow:"slide"}),"sliding"),bt=l(r=>j(Object.assign({},r,{overflow:"expand"})),"expanding");var Pt=l((r,t)=>e=>async function(s,i){let n,o=new Promise((a,h)=>{n=setTimeout(()=>{t!==void 0?a(t):h(new b);},r);}),c=Promise.resolve(e.call(this,s,i));try{return await Promise.race([c,o])}finally{clearTimeout(n);}},"timeout");var Ot=l((r,t)=>e=>{let s=false,i=null;return async function(n,o){if(s){t?.drop&&t.drop(n);return}try{s=!0;let c=await e.call(this,n,o);return i=setTimeout(()=>{s=!1,i=null;},r),c}catch(c){throw s=false,i&&(clearTimeout(i),i=null),c}}},"debounce");var Ct=l((r,t)=>e=>{let s=0;return async function(i,n){let o=Date.now();if(o-s<r){t?.drop&&t.drop(i);return}return s=o,await e.call(this,i,n)}},"throttle");export{v as AbortError,R as FastEvent,d as FastEventError,y as FastEventScope,E as QueueOverflowError,b as TimeoutError,Ot as debounce,Lt as dropping,bt as expanding,j as queue,wt as sliding,Ct as throttle,Pt as timeout};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var O=Object.defineProperty;var B=(s,t,e)=>t in s?O(s,t,{enumerable:true,configurable:true,writable:true,value:e}):s[t]=e;var c=(s,t)=>O(s,"name",{value:t,configurable:true});var V=(s,t)=>{for(var e in t)O(s,e,{get:t[e],enumerable:true});};var h=(s,t,e)=>B(s,typeof t!="symbol"?t+"":t,e);function y(s,t,e,i){let n,r,o,l={};typeof s[0]=="object"?(n=s[0].type,r=s[0].payload,l=typeof s[1]=="boolean"?{retain:s[1]}:s[1]||{},o=s[0].meta):(n=s[0],r=s[1],l=typeof s[2]=="boolean"?{retain:s[2]}:s[2]||{}),o=Object.assign({},t,e,l.meta,o),Object.keys(o).length===0&&(o=void 0);let u={type:n,payload:r,meta:o};return l.executor===void 0&&(l.executor=i),[u,l]}c(y,"handleEmitArgs");function _(s,t){return Object.defineProperty(s,"name",{value:t||"anonymous",configurable:true}),s}c(_,"renameFn");var L=class L{constructor(t,e,i){h(this,"emitter");h(this,"prefix");h(this,"options");h(this,"events");this.emitter=t,this.prefix=e,this.options=Object.assign({},{scope:e},i),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}get context(){return this.options.context}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;let i=this;return _(function(r,o){if(r.type.startsWith(e))return t.call(i.context||i.emitter.context,Object.assign({},r,{type:r.type.substring(e.length)}),o)},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(t,e){return this.on("**",t,e)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[t,e]=y(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],i=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},i,{type:this._fixScopeType(i.type)})}scope(t,e){let i=Object.assign({},this.options.meta,e?.meta),n=e?.context!==void 0?e.context:this.context,r=Object.assign({},this.options,e,{meta:Object.keys(i).length===0?void 0:i,context:n});return new L(this.emitter,this.prefix+t,r)}};c(L,"FastEventScope");var w=L;function R(s,t){if(s.length!==t.length&&s.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:s.length-t.length+1}).fill("*"));for(let i=0;i<s.length;i++)if(e[i]!=="*"&&e[i]!==s[i])return false;return true}c(R,"isPathMatched");function N(s,t){let e=[];for(;;){let i=s.findIndex(n=>t(n));if(i===-1){e.push(i);break}s.splice(i,1);}return e}c(N,"removeItem");var v={};V(v,{allSettled:()=>k,balance:()=>$,first:()=>q,last:()=>H,race:()=>X,random:()=>G});var k=c((s,t,e,i)=>Promise.allSettled(s.map(n=>i(n[0],t,e))),"allSettled"),X=c((s,t,e,i)=>{let n,r;return (!e||e&&!e.abortSignal)&&(r=new AbortController,e||(e={}),e.abortSignal=r.signal),[Promise.race(s.map(l=>(l[2]--,Promise.resolve(i(l[0],t,e)).then(u=>(n||(n=l,l[2]++),r?.abort(),u)))))]},"race"),$=c((s,t,e,i)=>{let n,r=0;return s.forEach((o,l)=>{o[2]--,(n===void 0||n>o[2])&&(n=o[2],r=l);}),s[r][2]++,[i(s[r][0],t,e)]},"balance"),q=c((s,t,e,i)=>(s.forEach(n=>n[2]--),s[0][2]++,[i(s[0][0],t,e)]),"first"),H=c((s,t,e,i)=>(s.forEach(n=>n[2]--),s[s.length-1][2]++,[i(s[s.length-1][0],t,e)]),"last"),G=c((s,t,e,i)=>{let n=Math.floor(Math.random()*s.length);return s.forEach(r=>r[2]--),s[n][2]++,[i(s[n][0],t,e)]},"random");function a(s){return s&&typeof s=="function"}c(a,"isFunction");var M=class M extends Error{};c(M,"FastEventError");var x=M,A=class A extends x{};c(A,"TimeoutError");var b=A,j=class j extends x{};c(j,"AbortError");var E=j,C=class C extends x{};c(C,"QueueOverflowError");var T=C;var F=class F{constructor(t){h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"events");this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0},t),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this._context}get id(){return this._options.id}_addListener(t,e,i){let{count:n,prepend:r}=i;return this._forEachNodes(t,o=>{let l=[e,n,0];r?o.__listeners.splice(0,0,l):o.__listeners.push(l),this.listenerCount++,a(this._options.onAddListener)&&this._options.onAddListener(t,e);})}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let i=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in i||(i[r]={__listeners:[]}),n===t.length-1){let o=i[r];return e(o,i),o}else i=i[r];}}_removeListener(t,e,i){i&&N(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===i;return r&&(this.listenerCount--,a(this._options.onRemoveListener)&&this._options.onRemoveListener(e,i)),r});}_pipeListener(t,e){return e.forEach(i=>{t=_(i(t),t.name);}),t}on(){let t=arguments[0],e=a(arguments[1])?arguments[1]:this.onMessage.bind(this),i=Object.assign({count:0,prepend:false},a(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");let n=t.split(this._delimiter);if(i.pipes&&i.pipes.length>0&&(e=this._pipeListener(e,i.pipes)),a(i.filter)||a(i.off)){let l=e;e=_(function(u,f){if(a(i.off)&&i.off.call(this,u,f)){o();return}if(a(i.filter)){if(i.filter.call(this,u,f))return l.call(this,u,f)}else return l.call(this,u,f)},e.name);}let r=this._addListener(n,e,i),o=c(()=>r&&this._removeListener(r,n,e),"off");return r&&!t.includes("*")&&this._emitForLastEvent(t),{off:o,listener:e}}once(){return a(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t){}off(){let t=arguments,e=a(t[0])?void 0:t[0],i=a(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{i?this._removeListener(o,n,i):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(l,u)=>{(i!==void 0||r&&R(l,n))&&(i?this._removeListener(u,n,i):u.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),i=0;this._traverseListeners(this.listeners,e,(n,r)=>{i+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=i,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(i,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}a(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitForLastEvent(t){if(this.retainedMessages.has(t)){let e=this.retainedMessages.get(t),i=t.split(this._delimiter),n=[];this._traverseToPath(this.listeners,i,r=>{n.push(r);}),this._executeListeners(n,e);}}_traverseToPath(t,e,i,n=0,r){if(n>=e.length){i(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,i,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,i,n+1),"**"in t&&this._traverseToPath(t["**"],e,i,n+1,true),o in t&&this._traverseToPath(t[o],e,i,n+1);}_traverseListeners(t,e,i){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=c((o,l,u)=>{l(u,o);for(let[f,m]of Object.entries(o))f.startsWith("__")||m&&r(m,l,[...u,f]);},"traverseNodes");r(n,i,[]);}_onListenerError(t,e,i,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),a(this._options.onListenerError))try{this._options.onListenerError.call(this,t,n,e,i);}catch{}if(this._options.ignoreErrors)return n;throw n}_executeListener(t,e,i){try{if(i&&i.abortSignal&&i.abortSignal.aborted)return this._onListenerError(t,e,i,new E(t.name));let n=t.call(this._context||this,e,i);return n&&n instanceof Promise&&(n=n.catch(r=>this._onListenerError(t,e,i,r))),n}catch(n){return this._onListenerError(t,e,i,n)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(a(e))return e;if(e&&e in v)return v[e]}_executeListeners(t,e,i){if(!t||t.length===0)return [];let n=t.reduce((r,o)=>r.concat(o.__listeners.map((l,u)=>[l,u,o.__listeners])),[]);try{let r=this._getListenerExecutor(i);return r?r(n.map(o=>o[0]),e,i,this._executeListener.bind(this)):n.map(o=>this._executeListener(o[0][0],e,i))}finally{for(let r=n.length-1;r>=0;r--){let o=n[r][0];o[2]++,o[1]>0&&o[1]<=o[2]&&n[r][2].splice(r,1);}}}emit(){let[t,e]=y(arguments,this.options.meta),i=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,i,o=>{r.push(o);}),a(this._options.onBeforeExecuteListener)&&this._options.onBeforeExecuteListener.call(this,t,e)===false)throw new Error("emit "+t.type+" is aborted");return n.push(...this._executeListeners(r,t,e)),a(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((i,n)=>{let r,o,l=c(u=>{clearTimeout(r),o.off(),i(u);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,l);})}scope(t,e){return new w(this,t,e)}};c(F,"FastEvent");var W=F;var D=c(s=>{let{lifetime:t,size:e,overflow:i,maxExpandSize:n,expandOverflow:r,onEnter:o,onDrop:l}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},s),u=[],f=e,m=false,P=c(p=>{a(o)?o(p,u):u.push(t>0?[p,Date.now()]:[p,0]);},"pushMessage"),z=c(p=>{switch(u.length>=n&&i==="expand"?r:i){case "drop":return a(l)&&l(p),false;case "expand":return f=Math.min(f+e,n),P(p),true;case "slide":let d=u.shift();return a(l)&&d&&l(d[0]),P(p),true;case "throw":throw a(l)&&l(p),new T;default:return false}},"handleOverflow");return p=>async function(g,d){if(m){u.length<f?P(g):z(g);return}m=true;try{for(await p.call(this,g,d);u.length>0;){let[S,I]=u.shift()||[void 0,0];if(S){if(t>0&&Date.now()-I>t){a(l)&&l(S);continue}await p.call(this,S,d);}}}finally{m=false;}}},"queue"),bt=c((s=10)=>D({size:s,overflow:"drop"}),"dropping"),Et=c((s=10)=>D({size:s,overflow:"slide"}),"sliding"),Tt=c(s=>D(Object.assign({},s,{overflow:"expand"})),"expanding");var Mt=c((s,t)=>{let{interval:e=1e3,drop:i}=t||{};return n=>async function(r,o){let l=0,u;for(;l<=s;)try{return await n.call(this,r,o)}catch(f){if(u=f,l<s)await new Promise(m=>{setTimeout(m,e);}),l++;else throw a(i)&&i(r,u),u}}},"retry");var Ft=c((s,t)=>e=>async function(i,n){let r,o=new Promise((u,f)=>{r=setTimeout(()=>{t!==void 0?u(t):f(new b);},s);}),l=Promise.resolve(e.call(this,i,n));try{return await Promise.race([l,o])}finally{clearTimeout(r);}},"timeout");var Nt=c((s,t)=>e=>{let i=false,n=null;return async function(r,o){if(i){t?.drop&&t.drop(r);return}try{i=!0;let l=await e.call(this,r,o);return n=setTimeout(()=>{i=!1,n=null;},s),l}catch(l){throw i=false,n&&(clearTimeout(n),n=null),l}}},"debounce");var It=c((s,t)=>e=>{let i=0;return async function(n,r){let o=Date.now();if(o-i<s){t?.drop&&t.drop(n);return}return i=o,await e.call(this,n,r)}},"throttle");function kt(s){let t,e=false,i,n=typeof s=="function";return function(r){return async function(o,l){if(e){if(typeof s=="function"){if(await s(o,l))return t}else if(o.payload===i)return t}let u=await r.call(this,o,l);return t=u,n||(i=o.payload),e=true,u}}}c(kt,"memorize");export{E as AbortError,W as FastEvent,x as FastEventError,w as FastEventScope,T as QueueOverflowError,b as TimeoutError,Nt as debounce,bt as dropping,Tt as expanding,kt as memorize,D as queue,Mt as retry,Et as sliding,It as throttle,Ft as timeout};//# sourceMappingURL=index.mjs.map
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/handleEmitArgs.ts","../src/utils/renameFn.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/executors.ts","../src/utils/isFunction.ts","../src/consts.ts","../src/event.ts","../src/pipe/queue.ts","../src/pipe/timeout.ts","../src/pipe/debounce.ts","../src/pipe/throttle.ts"],"names":["handleEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","type","payload","meta","emitArgs","retain","Object","assign","keys","length","undefined","message","executor","renameFn","fn","name","defineProperty","value","configurable","FastEventScope","constructor","emitter","prefix","options","events","scope","endsWith","delimiter","context","_getScopeListener","listener","scopePrefix","scopeThis","startsWith","call","substring","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","opts","_FastEventScope","isPathMatched","path","pattern","fPattern","splice","Array","from","fill","i","removeItem","arr","condition","index","findIndex","item","push","executors_exports","__export","balance","first","last","race","random","__name","listeners","execute","winner","abortController","abortSignal","AbortController","signal","resolve","then","abort","forEach","Math","floor","isFunction","FastEventError","Error","_FastEventError","TimeoutError","_TimeoutError","AbortError","_AbortError","QueueOverflowError","_QueueOverflowError","FastEvent","__listeners","_options","_delimiter","_context","retainedMessages","Map","listenerCount","debug","id","toString","ignoreErrors","_enableDevTools","_addListener","parts","prepend","_forEachNodes","node","newListener","onAddListener","globalThis","__FLEXEVENT_DEVTOOLS__","add","callback","current","part","_removeListener","isArray","isRemove","onRemoveListener","_pipeListener","pipes","decorator","onMessage","bind","split","filter","oldListener","includes","_emitForLastEvent","hasWildcard","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","has","get","nodes","_executeListeners","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","e","_emitter","onListenerError","_executeListener","aborted","catch","_getListenerExecutor","executors","reduce","concat","executeor","set","results","onBeforeExecuteListener","onAfterExecuteListener","reject","tid","subscriber","clearTimeout","setTimeout","_FastEvent","queue","size","overflow","maxExpandSize","expandOverflow","onNew","buffer","currentSize","isHandling","pushMessage","handleOverflow","min","shift","nextMessage","dropping","sliding","expanding","ms","defaultValue","timeoutId","timeoutPromise","listenerPromise","debounce","isBlocked","drop","error","throttle","interval","lastExecutionTime","now","Date"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastEventListenerArgs, FastEventMessage } from \"../types\"\n\nexport function handleEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown\n>(args: IArguments, emitterMeta: any, scopeMeta?: any, scopeExecutor?: any): [FastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let type: string, payload: any, meta: any\n let emitArgs: FastEventListenerArgs<Meta> = {}\n\n if (typeof (args[0]) === 'object') {\n type = args[0].type as string\n payload = args[0].payload as any\n emitArgs = typeof (args[1]) === 'boolean' ? { retain: args[1] } : args[1] || {}\n meta = args[0].meta\n } else {\n type = args[0] as string\n 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) meta = undefined\n\n const message = {\n type,\n payload,\n meta\n } as FastEventMessage<Events, Meta>\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor\n }\n\n return [message, emitArgs]\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","import type { FastEvent } from \"./event\";\nimport { FastListenerExecutorArgs, FastEventAnyListener, FastEventEmitMessage, FastEventListener, FastEventListenerArgs, FastEventListenOptions, FastEventMessage, FastEventSubscriber, ScopeEvents, FastEventMeta } from \"./types\";\nimport { handleEmitArgs } from \"./utils/handleEmitArgs\";\nimport { renameFn } from \"./utils/renameFn\";\n\nexport type FastEventScopeOptions<Meta, Context> = {\n meta?: FastEventMeta & Meta\n context?: Context\n executor?: FastListenerExecutorArgs\n}\n\nexport type FastEventScopeMeta = {\n scope: string\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 = any,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = Meta & FastEventScopeMeta,\n> {\n options: Required<FastEventScopeOptions<FinalMeta, Context>>\n // @ts-ignore\n events: Events\n constructor(public emitter: FastEvent<Events>, public prefix: string, options?: FastEventScopeOptions<Meta, Context>) {\n this.options = Object.assign({}, {\n scope: prefix\n }, options) 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 get context() { return this.options.context }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: FastEventListener): FastEventListener {\n const scopePrefix = this.prefix\n if (scopePrefix.length === 0) return listener\n const scopeThis = this\n const scopeListener = renameFn(function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (message.type.startsWith(scopePrefix)) {\n return listener.call(scopeThis.context || scopeThis.emitter.context, Object.assign({}, message, {\n type: message.type.substring(scopePrefix.length)\n }), args)\n }\n }, listener.name)\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\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Events, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(): FastEventSubscriber {\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 public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n }\n\n onAny<P = any>(listener: FastEventAnyListener<{ [K: string]: P }, FinalMeta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber {\n return this.on('**' as any, listener, options)\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 public emit<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? Events[Types] : any, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{\n [K in T]: K extends Types ? Events[K] : any\n }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(): R[] {\n const [message, options] = handleEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor\n )\n message.type = this._getScopeType(message.type)!\n return this.emitter.emit(message as FastEventMessage<Events, FinalMeta>, options)\n }\n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\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 Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: Events[T] }, FinalMeta>>\n public async waitFor(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: any }, FinalMeta>>\n public async waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, FinalMeta>>\n public async waitFor(): Promise<FastEventMessage<Events, FinalMeta>> {\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 as unknown as FastEventMessage<Events, FinalMeta>\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 public 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 >(prefix: P, options?: FastEventScopeOptions<Partial<FinalMeta> & M, C>) {\n const meta = Object.assign({}, this.options.meta, options?.meta)\n // 如果options中提供了新的context,使用新的context;否则继承父scope的context\n const context = options?.context !== undefined ? options.context : this.context\n const opts = Object.assign({}, this.options, options, {\n meta: Object.keys(meta).length === 0 ? undefined : meta,\n context\n }) as FastEventScopeOptions<FinalMeta & M, C>\n return new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>(\n this.emitter as any,\n this.prefix + prefix,\n opts\n )\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 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\nexport function removeItem(arr:any[],condition:(item:any)=>boolean){\n let index:number[] = []\n while (true) {\n const i = arr.findIndex((item)=>{ \n return condition(item)\n })\n if(i === -1) {\n index.push(i)\n break\n } \n arr.splice(i,1)\n }\n return index\n}","import { FastListenerMeta, IFastListenerExecutor } from \"./types\"\n\nexport const allSettled: IFastListenerExecutor = (listeners, message, args, execute) => {\n return Promise.allSettled(listeners.map(listener => execute(listener[0], message, args)))\n}\n\nexport const race: IFastListenerExecutor = (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n}\n\n/**\n * 负载均衡执行器\n * \n * 不像其他执行器,只执行所有监听器中执行次数最少的那个\n * \n * @param listeners FastListenerMeta\n * @returns Promise 最先完成的监听器的执行结果\n */\nexport const balance: IFastListenerExecutor = (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n}\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n}\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n}\n\nexport const random: IFastListenerExecutor = (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","\n\nexport class FastEventError extends Error { }\n\nexport class TimeoutError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }","import { FastEventScope, type FastEventScopeOptions } from './scope';\nimport {\n FastEventListener,\n FastEventOptions,\n FastListeners,\n FastListenerNode,\n FastEventSubscriber,\n FastEventListenOptions,\n FastEventMessage,\n FastEventAnyListener,\n RequiredItems,\n Fallback,\n FastEventEmitMessage,\n FastEventListenerArgs,\n FastListenerMeta,\n IFastListenerExecutor,\n FastEvents\n} from './types';\nimport { handleEmitArgs } from './utils/handleEmitArgs';\nimport { isPathMatched } from './utils/isPathMatched';\nimport { removeItem } from './utils/removeItem';\nimport { renameFn } from './utils/renameFn';\nimport * as executors from \"./executors\"\nimport { isFunction } from './utils/isFunction';\nimport { ScopeEvents } from './types';\nimport { FastListenerPipe } from './pipe';\nimport { AbortError } from './consts';\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 AllEvents extends Record<string, any> = Events & FastEvents,\n Types extends keyof AllEvents = Exclude<keyof (AllEvents), number | symbol>\n> {\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners\n\n /** 事件发射器的配置选项 */\n private _options: RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = '/'\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context\n\n /** 保留的事件消息映射,用于新订阅者 */\n retainedMessages: Map<string, any> = new Map<string, any>()\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0\n // @ts-ignore\n events: Events\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?: FastEventOptions<Meta, Context>) {\n this._options = Object.assign({\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: '/',\n context: null,\n ignoreErrors: true,\n meta: undefined\n }, options) as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n this._delimiter = this._options.delimiter!\n this._context = this._options.context!\n this._enableDevTools()\n }\n\n /** 获取事件发射器的配置选项 */\n get options() { return this._options as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']> }\n get context() { return this._context }\n /** 获取事件发射器的唯一标识符 */\n get id() { return this._options.id! }\n private _addListener(parts: string[], listener: FastEventListener<any, any>, options: Required<FastEventListenOptions>): FastListenerNode | undefined {\n const { count, prepend } = options\n return this._forEachNodes(parts, (node) => {\n const newListener = [listener, count, 0] as unknown as FastListenerMeta// count > 0 ? [listener, count] : listener as any\n if (prepend) {\n node.__listeners.splice(0, 0, newListener)\n } else {\n node.__listeners.push(newListener)\n }\n this.listenerCount++\n if (isFunction(this._options.onAddListener)) {\n this._options.onAddListener(parts, listener)\n }\n })\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n globalThis.__FLEXEVENT_DEVTOOLS__ && globalThis.__FLEXEVENT_DEVTOOLS__.add(this)\n }\n }\n /**\n * \n * 根据parts路径遍历侦听器树,并在最后的节点上执行回调函数\n * \n * @param parts \n * @param callback \n * @returns \n */\n private _forEachNodes(parts: string[], callback: (node: FastListenerNode, parent: FastListenerNode) => void): FastListenerNode | undefined {\n if (parts.length === 0) return\n let current = this.listeners\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (!(part in current)) {\n current[part] = {\n __listeners: []\n } as unknown as FastListeners\n }\n if (i === parts.length - 1) {\n const node = current[part]\n callback(node, current)\n return node\n } else {\n current = current[part]\n }\n }\n return undefined\n }\n\n\n /**\n * 从监听器节点中移除指定的事件监听器\n * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(node: FastListenerNode, path: string[], listener: FastEventListener<any, any, any>): 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, listener)\n }\n }\n return isRemove\n })\n }\n private _pipeListener(listener: FastEventListener<any, any, any, any>, pipes: FastListenerPipe[]): FastEventListener<any, any, any, any> {\n pipes.forEach(decorator => {\n listener = renameFn(decorator(listener), listener.name)\n })\n return listener\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(): FastEventSubscriber {\n\n const type = arguments[0] as string\n let listener = isFunction(arguments[1]) ? arguments[1] : this.onMessage.bind(this)\n\n const options = Object.assign({\n count: 0,\n prepend: false\n }, isFunction(arguments[1]) ? arguments[2] : arguments[1]) as Required<FastEventListenOptions>\n\n if (type.length === 0) throw new Error('event type cannot be empty')\n\n const parts = type.split(this._delimiter);\n\n if (options.pipes && options.pipes.length > 0) {\n listener = this._pipeListener(listener, options.pipes)\n }\n\n if (isFunction(options.filter) || isFunction(options.off)) {\n const oldListener = listener\n listener = renameFn<FastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (isFunction(options.off) && options.off.call(this, message, args)) {\n off()\n return\n }\n // 如果满足条件就触发监听器\n if (isFunction(options.filter)) {\n if (options.filter.call(this, message, args!)) return oldListener.call(this, message, args)\n } else {\n return oldListener.call(this, message, args)\n }\n }, listener.name)\n }\n\n const node = this._addListener(parts, listener, options)\n const off = () => node && this._removeListener(node, parts, listener)\n // Retain不支持通配符\n if (node && !type.includes('*')) this._emitForLastEvent(type)\n\n return { off, listener }\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n } else {\n return this.on(arguments[0], Object.assign({}, arguments[2], { count: 1 }))\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 * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber\n */\n onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny<P = any>(listener: FastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny(): FastEventSubscriber {\n return this.on(\"**\", arguments[0], arguments[1])\n }\n /**\n * \n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n * \n * 此方法供子类继承\n * \n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onMessage(message: FastEventMessage) {\n\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 this._removeListener(node, parts, listener)\n } else if (type) {\n node.__listeners = []\n }\n })\n } else { // 仅删除指定的侦听器\n const entryParts: string[] = hasWildcard ? [] : parts\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener)\n } else {\n node.__listeners = []\n }\n }\n })\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器\n * @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 private _emitForLastEvent(type: string) {\n if (this.retainedMessages.has(type)) {\n const message = this.retainedMessages.get(type)\n const parts = type.split(this._delimiter);\n const nodes: FastListenerNode[] = []\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n this._executeListeners(nodes, message)\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(node: FastListenerNode, parts: string[], callback: (node: FastListenerNode) => void, index: number = 0, lastFollowing?: boolean): void {\n\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(node: FastListenerNode, entry: string[], callback: (path: string[], node: FastListenerNode) => void): void {\n let entryNode: FastListenerNode = node\n // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node\n });\n }\n const traverseNodes = (node: FastListenerNode, callback: (path: string[], node: FastListenerNode) => void, parentPath: string[]) => {\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 FastListenerNode, callback, [...parentPath, key]);\n }\n }\n }\n // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined, e: any) {\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 { this._options.onListenerError.call(this, listener, e, message, args) } catch { }\n }\n if (this._options.ignoreErrors) {\n return e\n } else {\n throw e\n }\n\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\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(listener: any, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(listener, message, args, new AbortError(listener.name))\n }\n let result = listener.call(this._context || this, message, args)\n // 自动处理reject Promise\n if (result && result instanceof Promise) {\n result = result.catch(e => { return this._onListenerError(listener, message, args, e) })\n }\n return result\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e)\n }\n }\n private _getListenerExecutor(args?: FastEventListenerArgs): IFastListenerExecutor | undefined {\n if (!args) return\n const executor = args.executor || this._options.executor\n if (isFunction(executor)) return executor\n if (executor && executor in executors) return (executors as any)[executor]\n }\n /**\n * 触发事件并执行对应的监听器\n * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n return\n }\n /**\n * 执行监听器节点中的所有监听函数\n * @param node - FastListenerNode类型的监听器节点\n * @param payload - 事件携带的数据\n * @param type - 事件类型\n * @returns 返回所有监听函数的执行结果数组\n * @private\n * \n * @description\n * 遍历执行节点中的所有监听函数:\n * - 对于普通监听器,直接执行并收集结果\n * - 对于带次数限制的监听器(数组形式),执行后递减次数,当次数为0时移除该监听器\n */\n private _executeListeners(nodes: FastListenerNode[], message: FastEventMessage, args?: FastEventListenerArgs<Meta>): any[] {\n if (!nodes || nodes.length === 0) return []\n\n // 1. 遍历所有监听器任务,即需要执行的监听器函数列[]\n const listeners = nodes.reduce<[FastListenerMeta, number, FastListenerMeta[]][]>((result, node) => {\n return result.concat(node.__listeners.map((listener, i) => [listener, i, node.__listeners] as [FastListenerMeta, number, FastListenerMeta[]]));\n }, []);\n\n try {\n const executeor = this._getListenerExecutor(args)\n if (executeor) {\n return executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]\n } else {\n return listeners.map(listener => this._executeListener(listener[0][0], message, args))\n }\n } finally {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastListenerMeta\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 * \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 public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], retain?: boolean): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, retain?: boolean): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[]\n //----\n public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(): R[] {\n const [message, args] = handleEmitArgs<AllEvents, Meta>(arguments, this.options.meta)\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: FastListenerNode[] = []\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n if (isFunction(this._options.onBeforeExecuteListener)) {\n if (this._options.onBeforeExecuteListener.call(this, message, args) === false) {\n throw new Error('emit ' + message.type + ' is aborted')\n }\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\n return results\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>(type: string, payload?: any, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>\n // --- \n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): 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 public waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: AllEvents[T] }, Meta>>\n public waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>\n public waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, Meta>>\n public waitFor(): Promise<FastEventMessage<AllEvents, Meta>> {\n const type = arguments[0] as any\n const timeout = arguments[1] as number\n return new Promise<FastEventMessage<AllEvents, Meta>>((resolve, reject) => {\n let tid: any\n let subscriber: FastEventSubscriber\n const listener = (message: FastEventMessage<AllEvents, Meta>) => {\n clearTimeout(tid)\n subscriber.off()\n resolve(message)\n }\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber && subscriber.off()\n reject(new Error('wait for event<' + type + '> is timeout'))\n }, timeout)\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<\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 >(prefix: P, options?: FastEventScopeOptions<M, C>) {\n return new FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>(\n this as any, prefix, options as FastEventScopeOptions<Meta & M, C>)\n }\n} ","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onNew?: (newMessage: FastEventMessage, messages: FastEventMessage[]) => void\n}\n\n/**\n * 对消息队列进行排序\n * \n * \n * \n * @param messages \n * @param options \n */\nfunction sortMessageQueue(messages: FastEventMessage[], options: Required<QueueListenerPipeOptions>) {\n\n}\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { size, overflow, maxExpandSize, expandOverflow, onNew } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n }, options)\n\n const buffer: FastEventMessage[] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onNew)) {\n onNew(message, buffer)\n } else {\n buffer.push(message)\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n buffer.shift() // 移除最旧的消息\n pushMessage(message)\n return true\n case 'throw':\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const nextMessage = buffer.shift()\n if (nextMessage) {\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/handleEmitArgs.ts","../src/utils/renameFn.ts","../src/scope.ts","../src/utils/isPathMatched.ts","../src/utils/removeItem.ts","../src/executors.ts","../src/utils/isFunction.ts","../src/consts.ts","../src/event.ts","../src/pipe/queue.ts","../src/pipe/retry.ts","../src/pipe/timeout.ts","../src/pipe/debounce.ts","../src/pipe/throttle.ts","../src/pipe/memorize.ts"],"names":["handleEmitArgs","args","emitterMeta","scopeMeta","scopeExecutor","type","payload","meta","emitArgs","retain","Object","assign","keys","length","undefined","message","executor","renameFn","fn","name","defineProperty","value","configurable","FastEventScope","constructor","emitter","prefix","options","events","scope","endsWith","delimiter","context","_getScopeListener","listener","scopePrefix","scopeThis","startsWith","call","substring","_getScopeType","_fixScopeType","on","arguments","once","count","onAny","off","offAll","clear","emit","emitAsync","Promise","allSettled","apply","map","result","status","reason","waitFor","timeout","opts","_FastEventScope","isPathMatched","path","pattern","fPattern","splice","Array","from","fill","i","removeItem","arr","condition","index","findIndex","item","push","executors_exports","__export","balance","first","last","race","random","__name","listeners","execute","winner","abortController","abortSignal","AbortController","signal","resolve","then","abort","forEach","Math","floor","isFunction","FastEventError","Error","_FastEventError","TimeoutError","_TimeoutError","AbortError","_AbortError","QueueOverflowError","_QueueOverflowError","FastEvent","__listeners","_options","_delimiter","_context","retainedMessages","Map","listenerCount","debug","id","toString","ignoreErrors","_enableDevTools","_addListener","parts","prepend","_forEachNodes","node","newListener","onAddListener","globalThis","__FLEXEVENT_DEVTOOLS__","add","callback","current","part","_removeListener","isArray","isRemove","onRemoveListener","_pipeListener","pipes","decorator","onMessage","bind","split","filter","oldListener","includes","_emitForLastEvent","hasWildcard","_traverseToPath","entryParts","_traverseListeners","entry","_removeRetainedEvents","onClearListeners","delete","key","has","get","nodes","_executeListeners","lastFollowing","entryNode","traverseNodes","parentPath","childNode","entries","_onListenerError","e","_emitter","onListenerError","_executeListener","aborted","catch","_getListenerExecutor","executors","reduce","concat","executeor","set","results","onBeforeExecuteListener","onAfterExecuteListener","reject","tid","subscriber","clearTimeout","setTimeout","_FastEvent","queue","lifetime","size","overflow","maxExpandSize","expandOverflow","onEnter","onDrop","buffer","currentSize","isHandling","pushMessage","Date","now","handleOverflow","min","msg","shift","nextMessage","enterTime","dropping","sliding","expanding","retry","interval","drop","retries","lastError","error","ms","defaultValue","timeoutId","timeoutPromise","listenerPromise","debounce","isBlocked","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastEventListenerArgs, FastEventMessage } from \"../types\"\n\nexport function handleEmitArgs<\n Events extends Record<string, any> = Record<string, any>,\n Meta = unknown\n>(args: IArguments, emitterMeta: any, scopeMeta?: any, scopeExecutor?: any): [FastEventMessage<Events, Meta>, FastEventListenerArgs<Meta>] {\n let type: string, payload: any, meta: any\n let emitArgs: FastEventListenerArgs<Meta> = {}\n\n if (typeof (args[0]) === 'object') {\n type = args[0].type as string\n payload = args[0].payload as any\n emitArgs = typeof (args[1]) === 'boolean' ? { retain: args[1] } : args[1] || {}\n meta = args[0].meta\n } else {\n type = args[0] as string\n 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) meta = undefined\n\n const message = {\n type,\n payload,\n meta\n } as FastEventMessage<Events, Meta>\n\n if (emitArgs.executor === undefined) {\n emitArgs.executor = scopeExecutor\n }\n\n return [message, emitArgs]\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","import type { FastEvent } from \"./event\";\nimport { FastListenerExecutorArgs, FastEventAnyListener, FastEventEmitMessage, FastEventListener, FastEventListenerArgs, FastEventListenOptions, FastEventMessage, FastEventSubscriber, ScopeEvents, FastEventMeta } from \"./types\";\nimport { handleEmitArgs } from \"./utils/handleEmitArgs\";\nimport { renameFn } from \"./utils/renameFn\";\n\nexport type FastEventScopeOptions<Meta, Context> = {\n meta?: FastEventMeta & Meta\n context?: Context\n executor?: FastListenerExecutorArgs\n}\n\nexport type FastEventScopeMeta = {\n scope: string\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 = any,\n Types extends keyof Events = keyof Events,\n FinalMeta extends Record<string, any> = Meta & FastEventScopeMeta,\n> {\n options: Required<FastEventScopeOptions<FinalMeta, Context>>\n // @ts-ignore\n events: Events\n constructor(public emitter: FastEvent<Events>, public prefix: string, options?: FastEventScopeOptions<Meta, Context>) {\n this.options = Object.assign({}, {\n scope: prefix\n }, options) 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 get context() { return this.options.context }\n /**\n * 获取作用域监听器\n * 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑\n * @param listener 原始事件监听器\n * @returns 包装后的作用域监听器\n * @private\n */\n private _getScopeListener(listener: FastEventListener): FastEventListener {\n const scopePrefix = this.prefix\n if (scopePrefix.length === 0) return listener\n const scopeThis = this\n const scopeListener = renameFn(function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (message.type.startsWith(scopePrefix)) {\n return listener.call(scopeThis.context || scopeThis.emitter.context, Object.assign({}, message, {\n type: message.type.substring(scopePrefix.length)\n }), args)\n }\n }, listener.name)\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\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Events, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public on(): FastEventSubscriber {\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 public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventListener<string, any, FinalMeta, Context>, options?: FastEventListenOptions): FastEventSubscriber\n public once(): FastEventSubscriber {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n }\n\n onAny<P = any>(listener: FastEventAnyListener<{ [K: string]: P }, FinalMeta, Context>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber {\n return this.on('**' as any, listener, options)\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 public emit<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? Events[Types] : any, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{\n [K in T]: K extends Types ? Events[K] : any\n }, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[]\n public emit<R = any>(): R[] {\n const [message, options] = handleEmitArgs(\n arguments,\n this.emitter.options.meta,\n this.options.meta,\n this.options.executor\n )\n message.type = this._getScopeType(message.type)!\n return this.emitter.emit(message as FastEventMessage<Events, FinalMeta>, options)\n }\n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: Events[Types], options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventMessage<Events, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>\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 Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: Events[T] }, FinalMeta>>\n public async waitFor(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: any }, FinalMeta>>\n public async waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, FinalMeta>>\n public async waitFor(): Promise<FastEventMessage<Events, FinalMeta>> {\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 as unknown as FastEventMessage<Events, FinalMeta>\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 public 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 >(prefix: P, options?: FastEventScopeOptions<Partial<FinalMeta> & M, C>) {\n const meta = Object.assign({}, this.options.meta, options?.meta)\n // 如果options中提供了新的context,使用新的context;否则继承父scope的context\n const context = options?.context !== undefined ? options.context : this.context\n const opts = Object.assign({}, this.options, options, {\n meta: Object.keys(meta).length === 0 ? undefined : meta,\n context\n }) as FastEventScopeOptions<FinalMeta & M, C>\n return new FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>(\n this.emitter as any,\n this.prefix + prefix,\n opts\n )\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 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\nexport function removeItem(arr:any[],condition:(item:any)=>boolean){\n let index:number[] = []\n while (true) {\n const i = arr.findIndex((item)=>{ \n return condition(item)\n })\n if(i === -1) {\n index.push(i)\n break\n } \n arr.splice(i,1)\n }\n return index\n}","import { FastListenerMeta, IFastListenerExecutor } from \"./types\"\n\nexport const allSettled: IFastListenerExecutor = (listeners, message, args, execute) => {\n return Promise.allSettled(listeners.map(listener => execute(listener[0], message, args)))\n}\n\nexport const race: IFastListenerExecutor = (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n}\n\n/**\n * 负载均衡执行器\n * \n * 不像其他执行器,只执行所有监听器中执行次数最少的那个\n * \n * @param listeners FastListenerMeta\n * @returns Promise 最先完成的监听器的执行结果\n */\nexport const balance: IFastListenerExecutor = (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n}\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n}\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last: IFastListenerExecutor = (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n}\n\nexport const random: IFastListenerExecutor = (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","\n\nexport class FastEventError extends Error { }\n\nexport class TimeoutError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }","import { FastEventScope, type FastEventScopeOptions } from './scope';\nimport {\n FastEventListener,\n FastEventOptions,\n FastListeners,\n FastListenerNode,\n FastEventSubscriber,\n FastEventListenOptions,\n FastEventMessage,\n FastEventAnyListener,\n RequiredItems,\n Fallback,\n FastEventEmitMessage,\n FastEventListenerArgs,\n FastListenerMeta,\n IFastListenerExecutor,\n FastEvents\n} from './types';\nimport { handleEmitArgs } from './utils/handleEmitArgs';\nimport { isPathMatched } from './utils/isPathMatched';\nimport { removeItem } from './utils/removeItem';\nimport { renameFn } from './utils/renameFn';\nimport * as executors from \"./executors\"\nimport { isFunction } from './utils/isFunction';\nimport { ScopeEvents } from './types';\nimport { FastListenerPipe } from './pipe';\nimport { AbortError } from './consts';\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 AllEvents extends Record<string, any> = Events & FastEvents,\n Types extends keyof AllEvents = Exclude<keyof (AllEvents), number | symbol>\n> {\n /** 事件监听器树结构,存储所有注册的事件监听器 */\n public listeners: FastListeners = { __listeners: [] } as unknown as FastListeners\n\n /** 事件发射器的配置选项 */\n private _options: RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n\n /** 事件名称的分隔符,默认为'/' */\n private _delimiter: string = '/'\n\n /** 事件监听器执行时的上下文对象 */\n private _context: Context\n\n /** 保留的事件消息映射,用于新订阅者 */\n retainedMessages: Map<string, any> = new Map<string, any>()\n\n /** 当前注册的监听器总数 */\n listenerCount: number = 0\n // @ts-ignore\n events: Events\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?: FastEventOptions<Meta, Context>) {\n this._options = Object.assign({\n debug: false,\n id: Math.random().toString(36).substring(2),\n delimiter: '/',\n context: null,\n ignoreErrors: true,\n meta: undefined\n }, options) as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']>\n this._delimiter = this._options.delimiter!\n this._context = this._options.context!\n this._enableDevTools()\n }\n\n /** 获取事件发射器的配置选项 */\n get options() { return this._options as RequiredItems<FastEventOptions<Meta, Context>, ['meta', 'context']> }\n get context() { return this._context }\n /** 获取事件发射器的唯一标识符 */\n get id() { return this._options.id! }\n private _addListener(parts: string[], listener: FastEventListener<any, any>, options: Required<FastEventListenOptions>): FastListenerNode | undefined {\n const { count, prepend } = options\n return this._forEachNodes(parts, (node) => {\n const newListener = [listener, count, 0] as unknown as FastListenerMeta// count > 0 ? [listener, count] : listener as any\n if (prepend) {\n node.__listeners.splice(0, 0, newListener)\n } else {\n node.__listeners.push(newListener)\n }\n this.listenerCount++\n if (isFunction(this._options.onAddListener)) {\n this._options.onAddListener(parts, listener)\n }\n })\n }\n private _enableDevTools() {\n if (this.options.debug) {\n // @ts-ignore\n globalThis.__FLEXEVENT_DEVTOOLS__ && globalThis.__FLEXEVENT_DEVTOOLS__.add(this)\n }\n }\n /**\n * \n * 根据parts路径遍历侦听器树,并在最后的节点上执行回调函数\n * \n * @param parts \n * @param callback \n * @returns \n */\n private _forEachNodes(parts: string[], callback: (node: FastListenerNode, parent: FastListenerNode) => void): FastListenerNode | undefined {\n if (parts.length === 0) return\n let current = this.listeners\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (!(part in current)) {\n current[part] = {\n __listeners: []\n } as unknown as FastListeners\n }\n if (i === parts.length - 1) {\n const node = current[part]\n callback(node, current)\n return node\n } else {\n current = current[part]\n }\n }\n return undefined\n }\n\n\n /**\n * 从监听器节点中移除指定的事件监听器\n * @private\n * @param node - 监听器节点\n * @param listener - 需要移除的事件监听器\n * @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器\n */\n private _removeListener(node: FastListenerNode, path: string[], listener: FastEventListener<any, any, any>): 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, listener)\n }\n }\n return isRemove\n })\n }\n private _pipeListener(listener: FastEventListener<any, any, any, any>, pipes: FastListenerPipe[]): FastEventListener<any, any, any, any> {\n pipes.forEach(decorator => {\n listener = renameFn(decorator(listener), listener.name)\n })\n return listener\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n\n public on<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(type: '**', listener: FastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public on(): FastEventSubscriber {\n\n const type = arguments[0] as string\n let listener = isFunction(arguments[1]) ? arguments[1] : this.onMessage.bind(this)\n\n const options = Object.assign({\n count: 0,\n prepend: false\n }, isFunction(arguments[1]) ? arguments[2] : arguments[1]) as Required<FastEventListenOptions>\n\n if (type.length === 0) throw new Error('event type cannot be empty')\n\n const parts = type.split(this._delimiter);\n\n if (options.pipes && options.pipes.length > 0) {\n listener = this._pipeListener(listener, options.pipes)\n }\n\n if (isFunction(options.filter) || isFunction(options.off)) {\n const oldListener = listener\n listener = renameFn<FastEventListener>(function (message, args) {\n // 如果满足条件就退订\n if (isFunction(options.off) && options.off.call(this, message, args)) {\n off()\n return\n }\n // 如果满足条件就触发监听器\n if (isFunction(options.filter)) {\n if (options.filter.call(this, message, args!)) return oldListener.call(this, message, args)\n } else {\n return oldListener.call(this, message, args)\n }\n }, listener.name)\n }\n\n const node = this._addListener(parts, listener, options)\n const off = () => node && this._removeListener(node, parts, listener)\n // Retain不支持通配符\n if (node && !type.includes('*')) this._emitForLastEvent(type)\n\n return { off, listener }\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 Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends Types = Types>(type: T, listener: FastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once<T extends string>(type: T, listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber\n public once(): FastEventSubscriber {\n if (isFunction(arguments[1])) {\n return this.on(arguments[0], arguments[1], Object.assign({}, arguments[2], { count: 1 }))\n } else {\n return this.on(arguments[0], Object.assign({}, arguments[2], { count: 1 }))\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 * ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber\n */\n onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny<P = any>(listener: FastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber\n onAny(): FastEventSubscriber {\n return this.on(\"**\", arguments[0], arguments[1])\n }\n /**\n * \n * 当调用on/once/onAny时如果没有指定监听器,则调用此方法\n * \n * 此方法供子类继承\n * \n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onMessage(message: FastEventMessage) {\n\n }\n off(listener: FastEventListener<any, any, any>): void\n off(type: string, listener: FastEventListener<any, any, any>): void\n off(type: Types, listener: FastEventListener<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 this._removeListener(node, parts, listener)\n } else if (type) {\n node.__listeners = []\n }\n })\n } else { // 仅删除指定的侦听器\n const entryParts: string[] = hasWildcard ? [] : parts\n this._traverseListeners(this.listeners, entryParts, (path, node) => {\n if (listener !== undefined || (hasWildcard && isPathMatched(path, parts))) {\n if (listener) {\n this._removeListener(node, parts, listener)\n } else {\n node.__listeners = []\n }\n }\n })\n }\n }\n\n /**\n * 移除所有事件监听器\n * @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器\n * @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 private _emitForLastEvent(type: string) {\n if (this.retainedMessages.has(type)) {\n const message = this.retainedMessages.get(type)\n const parts = type.split(this._delimiter);\n const nodes: FastListenerNode[] = []\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n this._executeListeners(nodes, message)\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(node: FastListenerNode, parts: string[], callback: (node: FastListenerNode) => void, index: number = 0, lastFollowing?: boolean): void {\n\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(node: FastListenerNode, entry: string[], callback: (path: string[], node: FastListenerNode) => void): void {\n let entryNode: FastListenerNode = node\n // 如果指定了entry路径,则按照路径遍历\n if (entry && entry.length > 0) {\n this._traverseToPath(node, entry, (node) => {\n entryNode = node\n });\n }\n const traverseNodes = (node: FastListenerNode, callback: (path: string[], node: FastListenerNode) => void, parentPath: string[]) => {\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 FastListenerNode, callback, [...parentPath, key]);\n }\n }\n }\n // 如果没有指定entry或entry为空数组,则递归遍历所有节点\n traverseNodes(entryNode, callback, []);\n }\n\n private _onListenerError(listener: FastEventListener, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined, e: any) {\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 { this._options.onListenerError.call(this, listener, e, message, args) } catch { }\n }\n if (this._options.ignoreErrors) {\n return e\n } else {\n throw e\n }\n\n }\n /**\n * 执行单个监听器函数\n * @param listener - 要执行的监听器函数或包装过的监听器对象\n * @param message - 事件消息对象,包含type、payload和meta\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(listener: any, message: FastEventMessage, args: FastEventListenerArgs<any> | undefined): Promise<any> | any {\n try {\n // 如果传入已经aborted的abortSignal,则直接返回\n if (args && args.abortSignal && args.abortSignal.aborted) {\n return this._onListenerError(listener, message, args, new AbortError(listener.name))\n }\n let result = listener.call(this._context || this, message, args)\n // 自动处理reject Promise\n if (result && result instanceof Promise) {\n result = result.catch(e => { return this._onListenerError(listener, message, args, e) })\n }\n return result\n } catch (e: any) {\n return this._onListenerError(listener, message, args, e)\n }\n }\n private _getListenerExecutor(args?: FastEventListenerArgs): IFastListenerExecutor | undefined {\n if (!args) return\n const executor = args.executor || this._options.executor\n if (isFunction(executor)) return executor\n if (executor && executor in executors) return (executors as any)[executor]\n }\n /**\n * 触发事件并执行对应的监听器\n * @param type - 事件类型字符串或包含事件信息的对象\n * @param payload - 事件携带的数据负载\n return\n }\n /**\n * 执行监听器节点中的所有监听函数\n * @param node - FastListenerNode类型的监听器节点\n * @param payload - 事件携带的数据\n * @param type - 事件类型\n * @returns 返回所有监听函数的执行结果数组\n * @private\n * \n * @description\n * 遍历执行节点中的所有监听函数:\n * - 对于普通监听器,直接执行并收集结果\n * - 对于带次数限制的监听器(数组形式),执行后递减次数,当次数为0时移除该监听器\n */\n private _executeListeners(nodes: FastListenerNode[], message: FastEventMessage, args?: FastEventListenerArgs<Meta>): any[] {\n if (!nodes || nodes.length === 0) return []\n\n // 1. 遍历所有监听器任务,即需要执行的监听器函数列[]\n const listeners = nodes.reduce<[FastListenerMeta, number, FastListenerMeta[]][]>((result, node) => {\n return result.concat(node.__listeners.map((listener, i) => [listener, i, node.__listeners] as [FastListenerMeta, number, FastListenerMeta[]]));\n }, []);\n\n try {\n const executeor = this._getListenerExecutor(args)\n if (executeor) {\n return executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]\n } else {\n return listeners.map(listener => this._executeListener(listener[0][0], message, args))\n }\n } finally {\n // 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除\n for (let i = listeners.length - 1; i >= 0; i--) {\n const meta = listeners[i][0] as FastListenerMeta\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 * \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 public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], retain?: boolean): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, retain?: boolean): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[]\n //----\n public emit<R = any, T extends Types = Types>(type: T, payload?: AllEvents[T], options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[]\n public emit<R = any>(): R[] {\n const [message, args] = handleEmitArgs<AllEvents, Meta>(arguments, this.options.meta)\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: FastListenerNode[] = []\n\n this._traverseToPath(this.listeners, parts, (node) => {\n nodes.push(node)\n })\n if (isFunction(this._options.onBeforeExecuteListener)) {\n if (this._options.onBeforeExecuteListener.call(this, message, args) === false) {\n throw new Error('emit ' + message.type + ' is aborted')\n }\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\n return results\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>(type: string, payload?: any, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, retain?: boolean): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>\n // --- \n public async emitAsync<R = any>(type: string, payload?: any, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(type: Types, payload?: AllEvents[Types], options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{ [K in T]: K extends Types ? AllEvents[K] : any }, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>\n public async emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): 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 public waitFor<T extends Types>(type: T, timeout?: number): Promise<FastEventMessage<{ [key in T]: AllEvents[T] }, Meta>>\n public waitFor(type: string, timeout?: number): Promise<FastEventMessage<AllEvents, Meta>>\n public waitFor<P = any>(type: string, timeout?: number): Promise<FastEventMessage<{ [key: string]: P }, Meta>>\n public waitFor(): Promise<FastEventMessage<AllEvents, Meta>> {\n const type = arguments[0] as any\n const timeout = arguments[1] as number\n return new Promise<FastEventMessage<AllEvents, Meta>>((resolve, reject) => {\n let tid: any\n let subscriber: FastEventSubscriber\n const listener = (message: FastEventMessage<AllEvents, Meta>) => {\n clearTimeout(tid)\n subscriber.off()\n resolve(message)\n }\n if (timeout && timeout > 0) {\n tid = setTimeout(() => {\n subscriber && subscriber.off()\n reject(new Error('wait for event<' + type + '> is timeout'))\n }, timeout)\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<\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 >(prefix: P, options?: FastEventScopeOptions<M, C>) {\n return new FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>(\n this as any, prefix, options as FastEventScopeOptions<Meta & M, C>)\n }\n} ","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onEnter, onDrop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n const buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onEnter)) {\n onEnter(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
|