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

fastevent

Package Overview
Dependencies
Maintainers
1
Versions
45
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fastevent - npm Package Compare versions

Comparing version
2.5.0
to
2.5.1
+1
-1
dist/executors/index.js

@@ -1,2 +0,2 @@

'use strict';var v=Object.defineProperty;var o=(r,c)=>v(r,"name",{value:c,configurable:true});var S=o(()=>(r,c,t,a)=>(r.forEach(e=>e[2]--),r[0][2]++,[a.call(r[0],r[0],c,t)]),"first");var j=o(()=>(r,c,t,a)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[a.call(r[r.length-1],r[r.length-1],c,t)]),"last");var M=o(()=>(r,c,t,a)=>{let e,n;return (!t||t&&!t.abortSignal)&&(n=new AbortController,t||(t={}),t.abortSignal=n.signal),[Promise.race(r.map(f=>(f[2]--,Promise.resolve(a.call(f,f,c,t)).then(m=>(e||(e=f,f[2]++),n?.abort(),m)))))]},"race");var A=o(()=>(r,c,t,a)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(n=>n[2]--),r[e][2]++,[a.call(r[e],r[e],c,t)]},"random");var z=o(()=>(r,c,t,a)=>{let e,n=0;return r.forEach((u,f)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],n=f);}),r[n][2]++,[a.call(r[n],r[n],c,t)]},"balance");function i(r){return r&&typeof r=="function"}o(i,"isFunction");function y(r){return r&&typeof r=="string"}o(y,"isString");var g=o(r=>{let{reverse:c,onNext:t,onReturns:a,onError:e}=Object.assign({reverse:false,onError:o(()=>{},"onError"),onNext:o(()=>true,"onNext"),onReturns:o((n,u)=>u,"onReturns")},r);return async(n,u,f,m)=>{let l,x,k=0;n.forEach(p=>p[2]--);for(let p=0;p<n.length;p++){let b=n[c?n.length-1-p:p],d=b;try{if(i(t)&&t(++k,x,u,f,l)===!1)break;x=await m.call(d,d,u,f,!1),i(a)?l=a(l,x):l=x,b[2]++;}catch(E){try{let h=y(e)?e:i(e)&&e(E,u,f);if(h==="skip")continue;if(h==="error"){l=E;break}else if(h==="abort")break}catch{}}}return l}},"series");var V=o(r=>g(Object.assign({},r,{onError:"abort",onNext:o((c,t,a)=>{a.payload=t;},"onNext")})),"waterfall");var Y=o(()=>(r,c,t,a)=>r.map((e,n)=>a.call(r[n],e,c,t,true)),"parallel");exports.balance=z;exports.first=S;exports.last=j;exports.parallel=Y;exports.race=M;exports.random=A;exports.series=g;exports.waterfall=V;//# sourceMappingURL=index.js.map
'use strict';var L=()=>(t,a,r,n)=>(t.forEach(e=>e[2]--),t[0][2]++,[n.call(t[0],t[0],a,r)]);var g=()=>(t,a,r,n)=>(t.forEach(e=>e[2]--),t[t.length-1][2]++,[n.call(t[t.length-1],t[t.length-1],a,r)]);var M=()=>(t,a,r,n)=>{let e,o;return (!r||r&&!r.abortSignal)&&(o=new AbortController,r||(r={}),r.abortSignal=o.signal),[Promise.race(t.map(s=>(s[2]--,Promise.resolve(n.call(s,s,a,r)).then(m=>(e||(e=s,s[2]++),o?.abort(),m)))))]};var S=()=>(t,a,r,n)=>{let e=Math.floor(Math.random()*t.length);return t.forEach(o=>o[2]--),t[e][2]++,[n.call(t[e],t[e],a,r)]};var w=()=>(t,a,r,n)=>{let e,o=0;return t.forEach((i,s)=>{i[2]--,(e===void 0||e>i[2])&&(e=i[2],o=s);}),t[o][2]++,[n.call(t[o],t[o],a,r)]};function f(t){return t&&typeof t=="function"}function y(t){return t&&typeof t=="string"}var d=t=>{let{reverse:a,onNext:r,onReturns:n,onError:e}=Object.assign({reverse:false,onError:()=>{},onNext:()=>true,onReturns:(o,i)=>i},t);return async(o,i,s,m)=>{let u,p,b=0;o.forEach(c=>c[2]--);for(let c=0;c<o.length;c++){let E=o[a?o.length-1-c:c],l=E;try{if(f(r)&&r(++b,p,i,s,u)===!1)break;p=await m.call(l,l,i,s,!1),f(n)?u=n(u,p):u=p,E[2]++;}catch(F){try{let x=y(e)?e:f(e)&&e(F,i,s);if(x==="skip")continue;if(x==="error"){u=F;break}else if(x==="abort")break}catch{}}}return u}};var _=t=>d(Object.assign({},t,{onError:"abort",onNext:(a,r,n)=>{n.payload=r;}}));var z=()=>(t,a,r,n)=>t.map((e,o)=>n.call(t[o],e,a,r,true));exports.balance=w;exports.first=L;exports.last=g;exports.parallel=z;exports.race=M;exports.random=S;exports.series=d;exports.waterfall=_;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","call","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行第一个监听器的执行器函数\n *\n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[0][2]++;\n return [execute.call(listeners[0], listeners[0], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[listeners.length - 1][2]++;\n return [\n execute.call(\n listeners[listeners.length - 1],\n listeners[listeners.length - 1],\n message,\n args,\n ),\n ];\n };\n};\n","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | 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(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute.call(listener, listener, message, args)).then(\n (result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n },\n );\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n *\n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n *\n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (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 [execute.call(listeners[index], listeners[index], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n *\n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (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.call(listeners[index], listeners[index], message, args)];\n };\n};\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerMeta, TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item as unknown as FastEventListenerMeta;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute.call(listener, listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n *\n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map((listener, i) =>\n execute.call(listeners[i], listener, message, args, true),\n );\n };\n};\n"]}
{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","listeners","message","args","execute","listener","last","race","winner","abortController","result","random","index","balance","count","i","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","_","cur","results","stepResult","item","e","behavior","waterfall","previous","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行第一个监听器的执行器函数\n *\n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[0][2]++;\n return [execute.call(listeners[0], listeners[0], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[listeners.length - 1][2]++;\n return [\n execute.call(\n listeners[listeners.length - 1],\n listeners[listeners.length - 1],\n message,\n args,\n ),\n ];\n };\n};\n","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | 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(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute.call(listener, listener, message, args)).then(\n (result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n },\n );\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n *\n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n *\n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (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 [execute.call(listeners[index], listeners[index], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n *\n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (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.call(listeners[index], listeners[index], message, args)];\n };\n};\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerMeta, TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item as unknown as FastEventListenerMeta;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute.call(listener, listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n *\n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map((listener, i) =>\n execute.call(listeners[i], listener, message, args, true),\n );\n };\n};\n"]}

@@ -1,2 +0,2 @@

var v=Object.defineProperty;var o=(r,c)=>v(r,"name",{value:c,configurable:true});var S=o(()=>(r,c,t,a)=>(r.forEach(e=>e[2]--),r[0][2]++,[a.call(r[0],r[0],c,t)]),"first");var j=o(()=>(r,c,t,a)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[a.call(r[r.length-1],r[r.length-1],c,t)]),"last");var M=o(()=>(r,c,t,a)=>{let e,n;return (!t||t&&!t.abortSignal)&&(n=new AbortController,t||(t={}),t.abortSignal=n.signal),[Promise.race(r.map(f=>(f[2]--,Promise.resolve(a.call(f,f,c,t)).then(m=>(e||(e=f,f[2]++),n?.abort(),m)))))]},"race");var A=o(()=>(r,c,t,a)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(n=>n[2]--),r[e][2]++,[a.call(r[e],r[e],c,t)]},"random");var z=o(()=>(r,c,t,a)=>{let e,n=0;return r.forEach((u,f)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],n=f);}),r[n][2]++,[a.call(r[n],r[n],c,t)]},"balance");function i(r){return r&&typeof r=="function"}o(i,"isFunction");function y(r){return r&&typeof r=="string"}o(y,"isString");var g=o(r=>{let{reverse:c,onNext:t,onReturns:a,onError:e}=Object.assign({reverse:false,onError:o(()=>{},"onError"),onNext:o(()=>true,"onNext"),onReturns:o((n,u)=>u,"onReturns")},r);return async(n,u,f,m)=>{let l,x,k=0;n.forEach(p=>p[2]--);for(let p=0;p<n.length;p++){let b=n[c?n.length-1-p:p],d=b;try{if(i(t)&&t(++k,x,u,f,l)===!1)break;x=await m.call(d,d,u,f,!1),i(a)?l=a(l,x):l=x,b[2]++;}catch(E){try{let h=y(e)?e:i(e)&&e(E,u,f);if(h==="skip")continue;if(h==="error"){l=E;break}else if(h==="abort")break}catch{}}}return l}},"series");var V=o(r=>g(Object.assign({},r,{onError:"abort",onNext:o((c,t,a)=>{a.payload=t;},"onNext")})),"waterfall");var Y=o(()=>(r,c,t,a)=>r.map((e,n)=>a.call(r[n],e,c,t,true)),"parallel");export{z as balance,S as first,j as last,Y as parallel,M as race,A as random,g as series,V as waterfall};//# sourceMappingURL=index.mjs.map
var L=()=>(t,a,r,n)=>(t.forEach(e=>e[2]--),t[0][2]++,[n.call(t[0],t[0],a,r)]);var g=()=>(t,a,r,n)=>(t.forEach(e=>e[2]--),t[t.length-1][2]++,[n.call(t[t.length-1],t[t.length-1],a,r)]);var M=()=>(t,a,r,n)=>{let e,o;return (!r||r&&!r.abortSignal)&&(o=new AbortController,r||(r={}),r.abortSignal=o.signal),[Promise.race(t.map(s=>(s[2]--,Promise.resolve(n.call(s,s,a,r)).then(m=>(e||(e=s,s[2]++),o?.abort(),m)))))]};var S=()=>(t,a,r,n)=>{let e=Math.floor(Math.random()*t.length);return t.forEach(o=>o[2]--),t[e][2]++,[n.call(t[e],t[e],a,r)]};var w=()=>(t,a,r,n)=>{let e,o=0;return t.forEach((i,s)=>{i[2]--,(e===void 0||e>i[2])&&(e=i[2],o=s);}),t[o][2]++,[n.call(t[o],t[o],a,r)]};function f(t){return t&&typeof t=="function"}function y(t){return t&&typeof t=="string"}var d=t=>{let{reverse:a,onNext:r,onReturns:n,onError:e}=Object.assign({reverse:false,onError:()=>{},onNext:()=>true,onReturns:(o,i)=>i},t);return async(o,i,s,m)=>{let u,p,b=0;o.forEach(c=>c[2]--);for(let c=0;c<o.length;c++){let E=o[a?o.length-1-c:c],l=E;try{if(f(r)&&r(++b,p,i,s,u)===!1)break;p=await m.call(l,l,i,s,!1),f(n)?u=n(u,p):u=p,E[2]++;}catch(F){try{let x=y(e)?e:f(e)&&e(F,i,s);if(x==="skip")continue;if(x==="error"){u=F;break}else if(x==="abort")break}catch{}}}return u}};var _=t=>d(Object.assign({},t,{onError:"abort",onNext:(a,r,n)=>{n.payload=r;}}));var z=()=>(t,a,r,n)=>t.map((e,o)=>n.call(t[o],e,a,r,true));export{w as balance,L as first,g as last,z as parallel,M as race,S as random,d as series,_ as waterfall};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","call","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行第一个监听器的执行器函数\n *\n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[0][2]++;\n return [execute.call(listeners[0], listeners[0], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[listeners.length - 1][2]++;\n return [\n execute.call(\n listeners[listeners.length - 1],\n listeners[listeners.length - 1],\n message,\n args,\n ),\n ];\n };\n};\n","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | 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(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute.call(listener, listener, message, args)).then(\n (result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n },\n );\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n *\n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n *\n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (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 [execute.call(listeners[index], listeners[index], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n *\n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (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.call(listeners[index], listeners[index], message, args)];\n };\n};\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerMeta, TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item as unknown as FastEventListenerMeta;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute.call(listener, listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n *\n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map((listener, i) =>\n execute.call(listeners[i], listener, message, args, true),\n );\n };\n};\n"]}
{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","listeners","message","args","execute","listener","last","race","winner","abortController","result","random","index","balance","count","i","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","_","cur","results","stepResult","item","e","behavior","waterfall","previous","parallel"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行第一个监听器的执行器函数\n *\n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[0][2]++;\n return [execute.call(listeners[0], listeners[0], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach((listener) => listener[2]--);\n listeners[listeners.length - 1][2]++;\n return [\n execute.call(\n listeners[listeners.length - 1],\n listeners[listeners.length - 1],\n message,\n args,\n ),\n ];\n };\n};\n","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | 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(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute.call(listener, listener, message, args)).then(\n (result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n },\n );\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n *\n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n *\n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (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 [execute.call(listeners[index], listeners[index], message, args)];\n };\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n *\n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (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.call(listeners[index], listeners[index], message, args)];\n };\n};\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { FastEventListenerMeta, TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item as unknown as FastEventListenerMeta;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute.call(listener, listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\";\n\n/**\n *\n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map((listener, i) =>\n execute.call(listeners[i], listener, message, args, true),\n );\n };\n};\n"]}

@@ -1,2 +0,2 @@

var FastEventSpaces=(function(exports){'use strict';var C=Object.defineProperty;var re=(r,e,t)=>e in r?C(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var o=(r,e)=>C(r,"name",{value:e,configurable:true});var h=(r,e,t)=>re(r,typeof e!="symbol"?e+"":e,t);var ne=Symbol.for("__FastEvent__"),oe=Symbol.for("__FastEventScope__"),j=class j extends Error{constructor(e){super(e);}};o(j,"FastEventError");var m=j,O=class O extends m{};o(O,"TimeoutError");var N=O,T=class T extends m{};o(T,"UnboundError");var L=T,R=class R extends m{};o(R,"AbortError");var _=R,F=class F extends m{};o(F,"CancelError");var b=F,z=class z extends m{};o(z,"QueueOverflowError");var B=z;var d=(function(r){return r[r.Transformed=1]="Transformed",r})({});function w(r,e,t,s){let i,n={},f={};return typeof r[0]=="object"?(Object.assign(f,r[0]),n=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},i=r[0].meta):(f.type=r[0],f.payload=r[1],n=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),i=Object.assign({},e,t,n.meta,i),Object.keys(i).length===0?(i=void 0,delete f.meta):f.meta=i,n.executor===void 0&&(n.executor=s),[f,n]}o(w,"parseEmitArgs");function $(r){return r?typeof r=="object"&&"__FastEventScope__"in r:false}o($,"isFastEventScope");function S(r,e,t){let s=r[0],i=$(r[1])?r[1]:void 0,n=(i?r[2]:r[1])||{};return n.meta=Object.assign({},e,n?.meta),n.context=n.context!==void 0?n.context:t,[s,i,n]}o(S,"parseScopeArgs");function x(r,e){return Object.defineProperty(r,"name",{value:e||"anonymous",configurable:true}),r}o(x,"renameFn");function l(r){return r&&typeof r=="function"}o(l,"isFunction");var P=class P{constructor(e){h(this,"__FastEventScope__",true);h(this,"__events__");h(this,"__meta__");h(this,"__context__");h(this,"_options",{});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return x(function(n,f){let a=f.rawEventType||n.type;if(a.startsWith(t)){let c=((f.flags||0)&d.Transformed)>0?n:Object.assign({},n,{type:a.substring(t.length)});return e.call(s.context,c,f)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new L;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=w(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){l(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|d.Transformed,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new P,i.bind(this.emitter,this.prefix+e,s),i}};o(P,"FastEventScope");var A=P;function k(r,e){let t=r.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let i=0;i<s-1;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}for(let i=0;i<t;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}o(k,"isPathMatched");function V(r,e){let t=[];for(let s=r.length-1;s>=0;s--)e(r[s])&&(t.push(s),r.splice(s,1));return t.reverse()}o(V,"removeItem");function Fe(r){return r?typeof r=="object"&&"type"in r:false}o(Fe,"isFastEventMessage");function Ie(r){return r&&typeof r=="string"}o(Ie,"isString");var q=Symbol.for("__expandable__");function He(r){return r[q]=true,r}o(He,"expandable");function G(r){return r&&r[q]}o(G,"isExpandable");function J(r){return r&&typeof r=="object"&&"off"in r&&"listener"in r}o(J,"isSubsctiber");function Ve(r){return typeof r=="function"&&(r.toString().startsWith("class ")||r.prototype?.constructor===r)}o(Ve,"isClass");function Je(r){return r?typeof r=="object"&&"__FastEvent__"in r:false}o(Je,"isFastEvent");function K(r){if(r===null||typeof r!="object")return false;let e=r;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}o(K,"isAsyncIterable");var X=o(()=>(r,e,t,s)=>r.map((i,n)=>s.call(r[n],i,e,t,true)),"parallel");function Y(r){for(let e=0;e<r.length;e++){let t=r[e];Array.isArray(t)&&G(t)&&(r.splice(e,1,...t),e+=t.length-1);}return r}o(Y,"expandEmitResults");function Z(r,e){return r.catch(t=>(e&&e(t),Promise.resolve(t)))}o(Z,"tryReturnError");var D=class D{constructor(e,t,s={}){h(this,"eventEmitter");h(this,"eventName");h(this,"buffer",[]);h(this,"resolvers",[]);h(this,"errorResolvers",[]);h(this,"isStopped",false);h(this,"error",null);h(this,"options");h(this,"currentSize");h(this,"hasNewMessage",false);h(this,"_listener");h(this,"_ready",false);h(this,"_listenOptions");h(this,"_cleanups",[]);this.eventEmitter=e,this.eventName=t;let i=20,n=100;this.options={size:s.size??i,maxExpandSize:s.maxExpandSize??n,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=o(()=>{this.off(!0);},"offFn");this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new _);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};o(D,"FastEventIterator");var I=D;function U(r,e,t={}){return new I(r,e,t)}o(U,"createAsyncEventIterator");function Q(r,e){return Array.isArray(e)&&e.forEach(t=>{r=x(t(r),r.name);}),r}o(Q,"wrapPipeListener");function M(r){return r!==null&&(typeof r=="object"||typeof r=="function")?new WeakRef(r):r}o(M,"getWeakRef");function W(r){return r.map(e=>e.status==="fulfilled"?e.value:e.reason)}o(W,"getPromiseResults");function ee(r){if(r==null)return false;let e=typeof r;return e!=="object"&&e!=="function"?false:typeof r.then=="function"}o(ee,"isPromise");async function te(r){try{return r instanceof Promise?await r:r}catch(e){return e instanceof Error?e:new Error(String(e))}}o(te,"resolveValue");var H=class H{constructor(e){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"_hooks");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:X()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=W(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let i=this.hooks[e];Array.isArray(i)&&i.length>0&&Promise.allSettled(i.map(n=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(n,t);else return n.apply(this,t)}));}),!s){let i=this.options[`on${e}`];if(l(i))if(e==="AfterExecuteListener")this._execAfterExecuteListener(i,t);else return i.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:i,prepend:n}=s,f=0;return [this._forEachNodes(e,u=>{let c=[t,i,0,s.tag,s.flags];n?(u.__listeners.splice(0,0,c),f=0):(u.__listeners.push(c),f=u.__listeners.length-1),this.listenerCount++;}),f]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let i=0;i<e.length;i++){let n=e[i];if(n in s||(s[n]={__listeners:[]}),i===e.length-1){let f=s[n];return t(f,s),f}else s=s[n];}}_removeListener(e,t,s){s&&V(e.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),n});}on(){let e=arguments[0],t=null,s,i=!l(arguments[1]);i?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let n=Object.assign({count:0,flags:0,prepend:false},s);if(e.length===0)throw new Error("event type cannot be empty");if(i||t===null){let v=Object.assign({overflow:"expand",size:10,maxExpandSize:100},n.iterable),y=U(this,e,v);y.create(n);let p=this._executeHooks("AddBeforeListener",[e,y.listener,n]);if(p===false)throw new b;return K(p)?p:y}let f=this._executeHooks("AddBeforeListener",[e,t,n]);if(f===false)throw new b;if(J(f))return f;let a=e.split(this._delimiter);if(n.pipes&&n.pipes.length>0&&(t=Q(t,n.pipes)),l(n.filter)||l(n.off)){let v=t,y=o(()=>u&&this._removeListener(u,a,t),"off");t=x(function(p,E){if(l(n.off)&&n.off.call(this,p,E)){y();return}if(l(n.filter)){if(n.filter.call(this,p,E))return v.call(this,p,E)}else return v.call(this,p,E)},t.name);}let[u,c]=this._addListener(a,t,n),g=o(()=>u&&this._removeListener(u,a,t),"off");return this._executeHooks("AddAfterListener",[e,u]),this._emitRetainMessage(e,u,c),{off:g,listener:t,[Symbol.dispose](){g();}}}once(){return l(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)}off(){let e=arguments,t=l(e[0])?void 0:e[0],s=l(e[0])?e[0]:e[1],i=t?t.split(this._delimiter):[],n=t?t.includes("*"):false;if(t&&!n)this._traverseToPath(this.listeners,i,f=>{s?this._removeListener(f,i,s):t&&(f.__listeners=[]);});else {let f=n?[]:i;this._traverseListeners(this.listeners,f,(a,u)=>{(s!==void 0||n&&k(a,i))&&(s?this._removeListener(u,i,s):u.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(i,n)=>{s+=n.__listeners.length;try{n.__listeners.forEach(f=>{this._executeHooks("RemoveListener",[i.join(this.options.delimiter),f[0],n]);});}finally{n.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,i)=>{t+=i.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let i=[];if(e.includes("*")){let n=e.split(this._delimiter);this.retainedMessages.forEach((f,a)=>{let u=a.split(this._delimiter);k(u,n)&&i.push(f);});}else this.retainedMessages.has(e)&&i.push(this.retainedMessages.get(e));t&&i.forEach(n=>{this._executeListeners([t],n,{},f=>f[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,i=0,n){if(i>=t.length){s(e);return}let f=t[i];if(n===true){this._traverseToPath(e,t,s,i+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,i+1),"**"in e&&this._traverseToPath(e["**"],t,s,i+1,true),f in e&&this._traverseToPath(e[f],t,s,i+1);}_traverseListeners(e,t,s){let i=e;t&&t.length>0&&this._traverseToPath(e,t,f=>{i=f;});let n=o((f,a,u)=>{a(u,f);for(let[c,g]of Object.entries(f))c.startsWith("__")||g&&n(g,a,[...u,c]);},"traverseNodes");n(i,s,[]);}_onListenerError(e,t,s,i){if(i instanceof Error&&(i._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[i,e,t,s]),this._options.ignoreErrors)return i;throw i}_executeListener(e,t,s,i=false){let n=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(n,t,s,new _(e[0].name));let f=((s?.flags||0)&d.Transformed)>0,a=n.call(this.context,f?t.payload:t,s);return i&&a&&a instanceof Promise&&(a=Z(a,u=>this._onListenerError(n,t,s,u))),this.options.debug&&(Promise.resolve(a),ee(a)?te(a).then(u=>{e[5]=M(u);}):e[5]=M(a)),a}catch(f){let a=this._onListenerError(n,t,s,f);return a instanceof Error&&(e[5]=M(a)),a}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(l(t))return t}_executeListeners(e,t,s,i){if(!e||e.length===0)return [];let n=[];for(let a of e){let u=0;for(let c of a.__listeners)(!i||i(c,a))&&n.push([c,u++,a.__listeners]);}this._decListenerExecCount(n);let f=this._getListenerExecutor(s);if(f){let a=f(n.map(u=>u[0]),t,s,this._executeListener.bind(this));return Array.isArray(a)?a:[a]}else return n.map(a=>this._executeListener(a[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,n=>{t.push(n);});let i=[];return t.map(n=>{i.push(...n.__listeners);}),i}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=w(arguments,this.options.meta);l(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let i=[],n=[];this._traverseToPath(this.listeners,s,a=>{n.push(a);});let f=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(f))return f;if(f===false)throw new _(e.type);if(l(this._options.transform)){let a=this._options.transform.call(this,e);a!==e&&(e.payload=a,t.rawEventType=e.type,t.flags=(t.flags||0)|d.Transformed);}return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&Y(i),this._executeHooks("AfterExecuteListener",[e,i,n]),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return W(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,i)=>{let n,f,a=o(u=>{clearTimeout(n),f?.off(),s(u);},"listener");t&&t>0&&(n=setTimeout(()=>{f?.off(),i(new Error("wait for event<"+e+"> is timeout"));},t)),f=this.on(e,a);})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new A,i.bind(this,e,s),i}};o(H,"FastEvent");var se=H;exports.AbortError=_;exports.CancelError=b;exports.FastEvent=se;exports.FastEventError=m;exports.FastEventIterator=I;exports.FastEventListenerFlags=d;exports.FastEventScope=A;exports.QueueOverflowError=B;exports.TimeoutError=N;exports.UnboundError=L;exports.__FastEventScope__=oe;exports.__FastEvent__=ne;exports.__expandable__=q;exports.createAsyncEventIterator=U;exports.expandable=He;exports.isAsyncIterable=K;exports.isClass=Ve;exports.isExpandable=G;exports.isFastEvent=Je;exports.isFastEventMessage=Fe;exports.isFastEventScope=$;exports.isFunction=l;exports.isPathMatched=k;exports.isString=Ie;exports.isSubsctiber=J;return exports;})({});//# sourceMappingURL=index.global.js.map
var FastEventSpaces=(function(exports){'use strict';var V=Object.defineProperty;var B=(n,e,t)=>e in n?V(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var l=(n,e,t)=>B(n,typeof e!="symbol"?e+"":e,t);var Q=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),E=class extends Error{constructor(e){super(e);}},O=class extends E{},x=class extends E{},y=class extends E{},d=class extends E{},w=class extends E{};var q=(e=>(e[e.Transformed=1]="Transformed",e))(q||{});function T(n,e,t,s){let r,a={},i={};return typeof n[0]=="object"?(Object.assign(i,n[0]),a=typeof n[1]=="boolean"?{retain:n[1]}:n[1]||{},r=n[0].meta):(i.type=n[0],i.payload=n[1],a=typeof n[2]=="boolean"?{retain:n[2]}:n[2]||{}),r=Object.assign({},e,t,a.meta,r),Object.keys(r).length===0?(r=void 0,delete i.meta):i.meta=r,a.executor===void 0&&(a.executor=s),[i,a]}function I(n){return n?typeof n=="object"&&"__FastEventScope__"in n:false}function b(n,e,t){let s=n[0],r=I(n[1])?n[1]:void 0,a=(r?n[2]:n[1])||{};return a.meta=Object.assign({},e,a?.meta),a.context=a.context!==void 0?a.context:t,[s,r,a]}function u(n,e){return Object.defineProperty(n,"name",{value:e||"anonymous",configurable:true}),n}function c(n){return n&&typeof n=="function"}var M=class n{constructor(e){l(this,"__FastEventScope__",true);l(this,"__events__");l(this,"__meta__");l(this,"__context__");l(this,"_options",{});l(this,"prefix","");l(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return u(function(a,i){let o=i.rawEventType||a.type;if(o.startsWith(t)){let v=((i.flags||0)&1)>0?a:Object.assign({},a,{type:o.substring(t.length)});return e.call(s.context,v,i)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new x;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=T(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){c(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|1,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new n,r.bind(this.emitter,this.prefix+e,s),r}};function L(n,e){let t=n.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let r=0;r<s-1;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}for(let r=0;r<t;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}function C(n,e){let t=[];for(let s=n.length-1;s>=0;s--)e(n[s])&&(t.push(s),n.splice(s,1));return t.reverse()}function ye(n){return n?typeof n=="object"&&"type"in n:false}function ue(n){return n&&typeof n=="string"}var k=Symbol.for("__expandable__");function he(n){return n[k]=true,n}function D(n){return n&&n[k]}function G(n){return n&&typeof n=="object"&&"off"in n&&"listener"in n}function xe(n){return typeof n=="function"&&(n.toString().startsWith("class ")||n.prototype?.constructor===n)}function be(n){return n?typeof n=="object"&&"__FastEvent__"in n:false}function A(n){if(n===null||typeof n!="object")return false;let e=n;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}var j=()=>(n,e,t,s)=>n.map((r,a)=>s.call(n[a],r,e,t,true));function N(n){for(let e=0;e<n.length;e++){let t=n[e];Array.isArray(t)&&D(t)&&(n.splice(e,1,...t),e+=t.length-1);}return n}function W(n,e){return n.catch(t=>(e&&e(t),Promise.resolve(t)))}var P=class{constructor(e,t,s={}){this.eventEmitter=e;this.eventName=t;l(this,"resolvers",[]);l(this,"errorResolvers",[]);l(this,"isStopped",false);l(this,"options");l(this,"currentSize");l(this,"hasNewMessage",false);l(this,"_listener");l(this,"_ready",false);l(this,"_listenOptions");l(this,"_cleanups",[]);l(this,"error",null);l(this,"buffer",[]);this.options={size:s.size??20,maxExpandSize:s.maxExpandSize??100,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=()=>{this.off(!0);};this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new y);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};function R(n,e,t={}){return new P(n,e,t)}function U(n,e){return Array.isArray(e)&&e.forEach(t=>{n=u(t(n),n.name);}),n}function _(n){return n!==null&&(typeof n=="object"||typeof n=="function")?new WeakRef(n):n}function S(n){return n.map(e=>e.status==="fulfilled"?e.value:e.reason)}function z(n){if(n==null)return false;let e=typeof n;return e!=="object"&&e!=="function"?false:typeof n.then=="function"}async function K(n){try{return n instanceof Promise?await n:n}catch(e){return e instanceof Error?e:new Error(String(e))}}var H=class{constructor(e){l(this,"__FastEvent__",true);l(this,"listeners",{__listeners:[]});l(this,"_options");l(this,"_delimiter","/");l(this,"_context");l(this,"_hooks");l(this,"retainedMessages",new Map);l(this,"listenerCount",0);l(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:j()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=S(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let r=this.hooks[e];Array.isArray(r)&&r.length>0&&Promise.allSettled(r.map(a=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(a,t);else return a.apply(this,t)}));}),!s){let r=this.options[`on${e}`];if(c(r))if(e==="AfterExecuteListener")this._execAfterExecuteListener(r,t);else return r.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:r,prepend:a}=s,i=0;return [this._forEachNodes(e,p=>{let v=[t,r,0,s.tag,s.flags];a?(p.__listeners.splice(0,0,v),i=0):(p.__listeners.push(v),i=p.__listeners.length-1),this.listenerCount++;}),i]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let r=0;r<e.length;r++){let a=e[r];if(a in s||(s[a]={__listeners:[]}),r===e.length-1){let i=s[a];return t(i,s),i}else s=s[a];}}_removeListener(e,t,s){s&&C(e.__listeners,r=>{r=Array.isArray(r)?r[0]:r;let a=r===s;return a&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),a});}_createAyncIteratorListener(e,t){let s=Object.assign({overflow:"expand",size:10,maxExpandSize:100},t.iterable),r=R(this,e,s);r.create(t);let a=this._executeHooks("AddBeforeListener",[e,r.listener,t]);if(a===false)throw new d;return A(a)?a:r}on(){let e=arguments[0];if(e.length===0)throw new Error("event cannot be empty");let t=null,s,r=!c(arguments[1]);r?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let a=Object.assign({count:0,flags:0,prepend:false},s);if(r||t===null)return this._createAyncIteratorListener(e,a);let i=this._executeHooks("AddBeforeListener",[e,t,a]);if(i===false)throw new d;if(G(i))return i;let o=e.split(this._delimiter);if(a.pipes&&a.pipes.length>0&&(t=U(t,a.pipes)),c(a.filter)||c(a.off)){let g=t,h=()=>p&&this._removeListener(p,o,t);t=u(function(f,F){if(c(a.off)&&a.off.call(this,f,F)){h();return}if(c(a.filter)){if(a.filter.call(this,f,F))return g.call(this,f,F)}else return g.call(this,f,F)},t.name);}let[p,v]=this._addListener(o,t,a),m=()=>p&&this._removeListener(p,o,t);return this._executeHooks("AddAfterListener",[e,p]),this._emitRetainMessage(e,p,v),{off:m,listener:t,[Symbol.dispose](){m();}}}once(){return c(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)}off(){let e=arguments,t=c(e[0])?void 0:e[0],s=c(e[0])?e[0]:e[1],r=t?t.split(this._delimiter):[],a=t?t.includes("*"):false;if(t&&!a)this._traverseToPath(this.listeners,r,i=>{s?this._removeListener(i,r,s):t&&(i.__listeners=[]);});else {let i=a?[]:r;this._traverseListeners(this.listeners,i,(o,p)=>{(s!==void 0||a&&L(o,r))&&(s?this._removeListener(p,r,s):p.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(r,a)=>{s+=a.__listeners.length;try{a.__listeners.forEach(i=>{this._executeHooks("RemoveListener",[r.join(this.options.delimiter),i[0],a]);});}finally{a.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,r)=>{t+=r.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let r=[];if(e.includes("*")){let a=e.split(this._delimiter);this.retainedMessages.forEach((i,o)=>{let p=o.split(this._delimiter);L(p,a)&&r.push(i);});}else this.retainedMessages.has(e)&&r.push(this.retainedMessages.get(e));t&&r.forEach(a=>{this._executeListeners([t],a,{},i=>i[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,r=0,a){if(r>=t.length){s(e);return}let i=t[r];if(a===true){this._traverseToPath(e,t,s,r+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,r+1),"**"in e&&this._traverseToPath(e["**"],t,s,r+1,true),i in e&&this._traverseToPath(e[i],t,s,r+1);}_traverseListeners(e,t,s){let r=e;t&&t.length>0&&this._traverseToPath(e,t,i=>{r=i;});let a=(i,o,p)=>{o(p,i);for(let[v,m]of Object.entries(i))v.startsWith("__")||m&&a(m,o,[...p,v]);};a(r,s,[]);}_onListenerError(e,t,s,r){if(r instanceof Error&&(r._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[r,e,t,s]),this._options.ignoreErrors)return r;throw r}_executeListener(e,t,s,r=false){let a=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(a,t,s,new y(e[0].name));let i=((s?.flags||0)&1)>0,o=a.call(this.context,i?t.payload:t,s);return r&&o&&o instanceof Promise&&(o=W(o,p=>this._onListenerError(a,t,s,p))),this.options.debug&&(Promise.resolve(o),z(o)?K(o).then(p=>{e[5]=_(p);}):e[5]=_(o)),o}catch(i){let o=this._onListenerError(a,t,s,i);return o instanceof Error&&(e[5]=_(o)),o}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(c(t))return t}_executeListeners(e,t,s,r){if(!e||e.length===0)return [];let a=[];for(let o of e){let p=0;for(let v of o.__listeners)(!r||r(v,o))&&a.push([v,p++,o.__listeners]);}this._decListenerExecCount(a);let i=this._getListenerExecutor(s);if(i){let o=i(a.map(p=>p[0]),t,s,this._executeListener.bind(this));return Array.isArray(o)?o:[o]}else return a.map(o=>this._executeListener(o[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,a=>{t.push(a);});let r=[];return t.map(a=>{r.push(...a.__listeners);}),r}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=T(arguments,this.options.meta);c(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let r=[],a=[];this._traverseToPath(this.listeners,s,o=>{a.push(o);});let i=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(i))return i;if(i===false)throw new y(e.type);if(c(this._options.transform)){let o=this._options.transform.call(this,e);o!==e&&(e.payload=o,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}return r.push(...this._executeListeners(a,e,t)),this._options.expandEmitResults&&N(r),this._executeHooks("AfterExecuteListener",[e,r,a]),r}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return S(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,r)=>{let a,i,o=p=>{clearTimeout(a),i?.off(),s(p);};t&&t>0&&(a=setTimeout(()=>{i?.off(),r(new Error("wait for event<"+e+"> is timeout"));},t)),i=this.on(e,o);})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new M,r.bind(this,e,s),r}};exports.AbortError=y;exports.CancelError=d;exports.FastEvent=H;exports.FastEventError=E;exports.FastEventIterator=P;exports.FastEventListenerFlags=q;exports.FastEventScope=M;exports.QueueOverflowError=w;exports.TimeoutError=O;exports.UnboundError=x;exports.__FastEventScope__=J;exports.__FastEvent__=Q;exports.__expandable__=k;exports.createAsyncEventIterator=R;exports.expandable=he;exports.isAsyncIterable=A;exports.isClass=xe;exports.isExpandable=D;exports.isFastEvent=be;exports.isFastEventMessage=ye;exports.isFastEventScope=I;exports.isFunction=c;exports.isPathMatched=L;exports.isString=ue;exports.isSubsctiber=G;return exports;})({});//# sourceMappingURL=index.global.js.map
//# sourceMappingURL=index.global.js.map

@@ -1,2 +0,2 @@

'use strict';var C=Object.defineProperty;var re=(r,e,t)=>e in r?C(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var o=(r,e)=>C(r,"name",{value:e,configurable:true});var h=(r,e,t)=>re(r,typeof e!="symbol"?e+"":e,t);var ne=Symbol.for("__FastEvent__"),oe=Symbol.for("__FastEventScope__"),j=class j extends Error{constructor(e){super(e);}};o(j,"FastEventError");var m=j,O=class O extends m{};o(O,"TimeoutError");var N=O,T=class T extends m{};o(T,"UnboundError");var L=T,R=class R extends m{};o(R,"AbortError");var _=R,F=class F extends m{};o(F,"CancelError");var b=F,z=class z extends m{};o(z,"QueueOverflowError");var B=z;var d=(function(r){return r[r.Transformed=1]="Transformed",r})({});function w(r,e,t,s){let i,n={},f={};return typeof r[0]=="object"?(Object.assign(f,r[0]),n=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},i=r[0].meta):(f.type=r[0],f.payload=r[1],n=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),i=Object.assign({},e,t,n.meta,i),Object.keys(i).length===0?(i=void 0,delete f.meta):f.meta=i,n.executor===void 0&&(n.executor=s),[f,n]}o(w,"parseEmitArgs");function $(r){return r?typeof r=="object"&&"__FastEventScope__"in r:false}o($,"isFastEventScope");function S(r,e,t){let s=r[0],i=$(r[1])?r[1]:void 0,n=(i?r[2]:r[1])||{};return n.meta=Object.assign({},e,n?.meta),n.context=n.context!==void 0?n.context:t,[s,i,n]}o(S,"parseScopeArgs");function x(r,e){return Object.defineProperty(r,"name",{value:e||"anonymous",configurable:true}),r}o(x,"renameFn");function l(r){return r&&typeof r=="function"}o(l,"isFunction");var P=class P{constructor(e){h(this,"__FastEventScope__",true);h(this,"__events__");h(this,"__meta__");h(this,"__context__");h(this,"_options",{});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return x(function(n,f){let a=f.rawEventType||n.type;if(a.startsWith(t)){let c=((f.flags||0)&d.Transformed)>0?n:Object.assign({},n,{type:a.substring(t.length)});return e.call(s.context,c,f)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new L;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=w(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){l(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|d.Transformed,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new P,i.bind(this.emitter,this.prefix+e,s),i}};o(P,"FastEventScope");var A=P;function k(r,e){let t=r.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let i=0;i<s-1;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}for(let i=0;i<t;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}o(k,"isPathMatched");function V(r,e){let t=[];for(let s=r.length-1;s>=0;s--)e(r[s])&&(t.push(s),r.splice(s,1));return t.reverse()}o(V,"removeItem");function Fe(r){return r?typeof r=="object"&&"type"in r:false}o(Fe,"isFastEventMessage");function Ie(r){return r&&typeof r=="string"}o(Ie,"isString");var q=Symbol.for("__expandable__");function He(r){return r[q]=true,r}o(He,"expandable");function G(r){return r&&r[q]}o(G,"isExpandable");function J(r){return r&&typeof r=="object"&&"off"in r&&"listener"in r}o(J,"isSubsctiber");function Ve(r){return typeof r=="function"&&(r.toString().startsWith("class ")||r.prototype?.constructor===r)}o(Ve,"isClass");function Je(r){return r?typeof r=="object"&&"__FastEvent__"in r:false}o(Je,"isFastEvent");function K(r){if(r===null||typeof r!="object")return false;let e=r;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}o(K,"isAsyncIterable");var X=o(()=>(r,e,t,s)=>r.map((i,n)=>s.call(r[n],i,e,t,true)),"parallel");function Y(r){for(let e=0;e<r.length;e++){let t=r[e];Array.isArray(t)&&G(t)&&(r.splice(e,1,...t),e+=t.length-1);}return r}o(Y,"expandEmitResults");function Z(r,e){return r.catch(t=>(e&&e(t),Promise.resolve(t)))}o(Z,"tryReturnError");var D=class D{constructor(e,t,s={}){h(this,"eventEmitter");h(this,"eventName");h(this,"buffer",[]);h(this,"resolvers",[]);h(this,"errorResolvers",[]);h(this,"isStopped",false);h(this,"error",null);h(this,"options");h(this,"currentSize");h(this,"hasNewMessage",false);h(this,"_listener");h(this,"_ready",false);h(this,"_listenOptions");h(this,"_cleanups",[]);this.eventEmitter=e,this.eventName=t;let i=20,n=100;this.options={size:s.size??i,maxExpandSize:s.maxExpandSize??n,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=o(()=>{this.off(!0);},"offFn");this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new _);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};o(D,"FastEventIterator");var I=D;function U(r,e,t={}){return new I(r,e,t)}o(U,"createAsyncEventIterator");function Q(r,e){return Array.isArray(e)&&e.forEach(t=>{r=x(t(r),r.name);}),r}o(Q,"wrapPipeListener");function M(r){return r!==null&&(typeof r=="object"||typeof r=="function")?new WeakRef(r):r}o(M,"getWeakRef");function W(r){return r.map(e=>e.status==="fulfilled"?e.value:e.reason)}o(W,"getPromiseResults");function ee(r){if(r==null)return false;let e=typeof r;return e!=="object"&&e!=="function"?false:typeof r.then=="function"}o(ee,"isPromise");async function te(r){try{return r instanceof Promise?await r:r}catch(e){return e instanceof Error?e:new Error(String(e))}}o(te,"resolveValue");var H=class H{constructor(e){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"_hooks");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:X()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=W(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let i=this.hooks[e];Array.isArray(i)&&i.length>0&&Promise.allSettled(i.map(n=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(n,t);else return n.apply(this,t)}));}),!s){let i=this.options[`on${e}`];if(l(i))if(e==="AfterExecuteListener")this._execAfterExecuteListener(i,t);else return i.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:i,prepend:n}=s,f=0;return [this._forEachNodes(e,u=>{let c=[t,i,0,s.tag,s.flags];n?(u.__listeners.splice(0,0,c),f=0):(u.__listeners.push(c),f=u.__listeners.length-1),this.listenerCount++;}),f]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let i=0;i<e.length;i++){let n=e[i];if(n in s||(s[n]={__listeners:[]}),i===e.length-1){let f=s[n];return t(f,s),f}else s=s[n];}}_removeListener(e,t,s){s&&V(e.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),n});}on(){let e=arguments[0],t=null,s,i=!l(arguments[1]);i?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let n=Object.assign({count:0,flags:0,prepend:false},s);if(e.length===0)throw new Error("event type cannot be empty");if(i||t===null){let v=Object.assign({overflow:"expand",size:10,maxExpandSize:100},n.iterable),y=U(this,e,v);y.create(n);let p=this._executeHooks("AddBeforeListener",[e,y.listener,n]);if(p===false)throw new b;return K(p)?p:y}let f=this._executeHooks("AddBeforeListener",[e,t,n]);if(f===false)throw new b;if(J(f))return f;let a=e.split(this._delimiter);if(n.pipes&&n.pipes.length>0&&(t=Q(t,n.pipes)),l(n.filter)||l(n.off)){let v=t,y=o(()=>u&&this._removeListener(u,a,t),"off");t=x(function(p,E){if(l(n.off)&&n.off.call(this,p,E)){y();return}if(l(n.filter)){if(n.filter.call(this,p,E))return v.call(this,p,E)}else return v.call(this,p,E)},t.name);}let[u,c]=this._addListener(a,t,n),g=o(()=>u&&this._removeListener(u,a,t),"off");return this._executeHooks("AddAfterListener",[e,u]),this._emitRetainMessage(e,u,c),{off:g,listener:t,[Symbol.dispose](){g();}}}once(){return l(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)}off(){let e=arguments,t=l(e[0])?void 0:e[0],s=l(e[0])?e[0]:e[1],i=t?t.split(this._delimiter):[],n=t?t.includes("*"):false;if(t&&!n)this._traverseToPath(this.listeners,i,f=>{s?this._removeListener(f,i,s):t&&(f.__listeners=[]);});else {let f=n?[]:i;this._traverseListeners(this.listeners,f,(a,u)=>{(s!==void 0||n&&k(a,i))&&(s?this._removeListener(u,i,s):u.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(i,n)=>{s+=n.__listeners.length;try{n.__listeners.forEach(f=>{this._executeHooks("RemoveListener",[i.join(this.options.delimiter),f[0],n]);});}finally{n.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,i)=>{t+=i.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let i=[];if(e.includes("*")){let n=e.split(this._delimiter);this.retainedMessages.forEach((f,a)=>{let u=a.split(this._delimiter);k(u,n)&&i.push(f);});}else this.retainedMessages.has(e)&&i.push(this.retainedMessages.get(e));t&&i.forEach(n=>{this._executeListeners([t],n,{},f=>f[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,i=0,n){if(i>=t.length){s(e);return}let f=t[i];if(n===true){this._traverseToPath(e,t,s,i+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,i+1),"**"in e&&this._traverseToPath(e["**"],t,s,i+1,true),f in e&&this._traverseToPath(e[f],t,s,i+1);}_traverseListeners(e,t,s){let i=e;t&&t.length>0&&this._traverseToPath(e,t,f=>{i=f;});let n=o((f,a,u)=>{a(u,f);for(let[c,g]of Object.entries(f))c.startsWith("__")||g&&n(g,a,[...u,c]);},"traverseNodes");n(i,s,[]);}_onListenerError(e,t,s,i){if(i instanceof Error&&(i._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[i,e,t,s]),this._options.ignoreErrors)return i;throw i}_executeListener(e,t,s,i=false){let n=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(n,t,s,new _(e[0].name));let f=((s?.flags||0)&d.Transformed)>0,a=n.call(this.context,f?t.payload:t,s);return i&&a&&a instanceof Promise&&(a=Z(a,u=>this._onListenerError(n,t,s,u))),this.options.debug&&(Promise.resolve(a),ee(a)?te(a).then(u=>{e[5]=M(u);}):e[5]=M(a)),a}catch(f){let a=this._onListenerError(n,t,s,f);return a instanceof Error&&(e[5]=M(a)),a}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(l(t))return t}_executeListeners(e,t,s,i){if(!e||e.length===0)return [];let n=[];for(let a of e){let u=0;for(let c of a.__listeners)(!i||i(c,a))&&n.push([c,u++,a.__listeners]);}this._decListenerExecCount(n);let f=this._getListenerExecutor(s);if(f){let a=f(n.map(u=>u[0]),t,s,this._executeListener.bind(this));return Array.isArray(a)?a:[a]}else return n.map(a=>this._executeListener(a[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,n=>{t.push(n);});let i=[];return t.map(n=>{i.push(...n.__listeners);}),i}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=w(arguments,this.options.meta);l(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let i=[],n=[];this._traverseToPath(this.listeners,s,a=>{n.push(a);});let f=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(f))return f;if(f===false)throw new _(e.type);if(l(this._options.transform)){let a=this._options.transform.call(this,e);a!==e&&(e.payload=a,t.rawEventType=e.type,t.flags=(t.flags||0)|d.Transformed);}return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&Y(i),this._executeHooks("AfterExecuteListener",[e,i,n]),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return W(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,i)=>{let n,f,a=o(u=>{clearTimeout(n),f?.off(),s(u);},"listener");t&&t>0&&(n=setTimeout(()=>{f?.off(),i(new Error("wait for event<"+e+"> is timeout"));},t)),f=this.on(e,a);})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new A,i.bind(this,e,s),i}};o(H,"FastEvent");var se=H;exports.AbortError=_;exports.CancelError=b;exports.FastEvent=se;exports.FastEventError=m;exports.FastEventIterator=I;exports.FastEventListenerFlags=d;exports.FastEventScope=A;exports.QueueOverflowError=B;exports.TimeoutError=N;exports.UnboundError=L;exports.__FastEventScope__=oe;exports.__FastEvent__=ne;exports.__expandable__=q;exports.createAsyncEventIterator=U;exports.expandable=He;exports.isAsyncIterable=K;exports.isClass=Ve;exports.isExpandable=G;exports.isFastEvent=Je;exports.isFastEventMessage=Fe;exports.isFastEventScope=$;exports.isFunction=l;exports.isPathMatched=k;exports.isString=Ie;exports.isSubsctiber=J;//# sourceMappingURL=index.js.map
'use strict';var V=Object.defineProperty;var B=(n,e,t)=>e in n?V(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var l=(n,e,t)=>B(n,typeof e!="symbol"?e+"":e,t);var Q=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),E=class extends Error{constructor(e){super(e);}},O=class extends E{},x=class extends E{},y=class extends E{},d=class extends E{},w=class extends E{};var q=(e=>(e[e.Transformed=1]="Transformed",e))(q||{});function T(n,e,t,s){let r,a={},i={};return typeof n[0]=="object"?(Object.assign(i,n[0]),a=typeof n[1]=="boolean"?{retain:n[1]}:n[1]||{},r=n[0].meta):(i.type=n[0],i.payload=n[1],a=typeof n[2]=="boolean"?{retain:n[2]}:n[2]||{}),r=Object.assign({},e,t,a.meta,r),Object.keys(r).length===0?(r=void 0,delete i.meta):i.meta=r,a.executor===void 0&&(a.executor=s),[i,a]}function I(n){return n?typeof n=="object"&&"__FastEventScope__"in n:false}function b(n,e,t){let s=n[0],r=I(n[1])?n[1]:void 0,a=(r?n[2]:n[1])||{};return a.meta=Object.assign({},e,a?.meta),a.context=a.context!==void 0?a.context:t,[s,r,a]}function u(n,e){return Object.defineProperty(n,"name",{value:e||"anonymous",configurable:true}),n}function c(n){return n&&typeof n=="function"}var M=class n{constructor(e){l(this,"__FastEventScope__",true);l(this,"__events__");l(this,"__meta__");l(this,"__context__");l(this,"_options",{});l(this,"prefix","");l(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return u(function(a,i){let o=i.rawEventType||a.type;if(o.startsWith(t)){let v=((i.flags||0)&1)>0?a:Object.assign({},a,{type:o.substring(t.length)});return e.call(s.context,v,i)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new x;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=T(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){c(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|1,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new n,r.bind(this.emitter,this.prefix+e,s),r}};function L(n,e){let t=n.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let r=0;r<s-1;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}for(let r=0;r<t;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}function C(n,e){let t=[];for(let s=n.length-1;s>=0;s--)e(n[s])&&(t.push(s),n.splice(s,1));return t.reverse()}function ye(n){return n?typeof n=="object"&&"type"in n:false}function ue(n){return n&&typeof n=="string"}var k=Symbol.for("__expandable__");function he(n){return n[k]=true,n}function D(n){return n&&n[k]}function G(n){return n&&typeof n=="object"&&"off"in n&&"listener"in n}function xe(n){return typeof n=="function"&&(n.toString().startsWith("class ")||n.prototype?.constructor===n)}function be(n){return n?typeof n=="object"&&"__FastEvent__"in n:false}function A(n){if(n===null||typeof n!="object")return false;let e=n;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}var j=()=>(n,e,t,s)=>n.map((r,a)=>s.call(n[a],r,e,t,true));function N(n){for(let e=0;e<n.length;e++){let t=n[e];Array.isArray(t)&&D(t)&&(n.splice(e,1,...t),e+=t.length-1);}return n}function W(n,e){return n.catch(t=>(e&&e(t),Promise.resolve(t)))}var P=class{constructor(e,t,s={}){this.eventEmitter=e;this.eventName=t;l(this,"resolvers",[]);l(this,"errorResolvers",[]);l(this,"isStopped",false);l(this,"options");l(this,"currentSize");l(this,"hasNewMessage",false);l(this,"_listener");l(this,"_ready",false);l(this,"_listenOptions");l(this,"_cleanups",[]);l(this,"error",null);l(this,"buffer",[]);this.options={size:s.size??20,maxExpandSize:s.maxExpandSize??100,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=()=>{this.off(!0);};this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new y);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};function R(n,e,t={}){return new P(n,e,t)}function U(n,e){return Array.isArray(e)&&e.forEach(t=>{n=u(t(n),n.name);}),n}function _(n){return n!==null&&(typeof n=="object"||typeof n=="function")?new WeakRef(n):n}function S(n){return n.map(e=>e.status==="fulfilled"?e.value:e.reason)}function z(n){if(n==null)return false;let e=typeof n;return e!=="object"&&e!=="function"?false:typeof n.then=="function"}async function K(n){try{return n instanceof Promise?await n:n}catch(e){return e instanceof Error?e:new Error(String(e))}}var H=class{constructor(e){l(this,"__FastEvent__",true);l(this,"listeners",{__listeners:[]});l(this,"_options");l(this,"_delimiter","/");l(this,"_context");l(this,"_hooks");l(this,"retainedMessages",new Map);l(this,"listenerCount",0);l(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:j()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=S(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let r=this.hooks[e];Array.isArray(r)&&r.length>0&&Promise.allSettled(r.map(a=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(a,t);else return a.apply(this,t)}));}),!s){let r=this.options[`on${e}`];if(c(r))if(e==="AfterExecuteListener")this._execAfterExecuteListener(r,t);else return r.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:r,prepend:a}=s,i=0;return [this._forEachNodes(e,p=>{let v=[t,r,0,s.tag,s.flags];a?(p.__listeners.splice(0,0,v),i=0):(p.__listeners.push(v),i=p.__listeners.length-1),this.listenerCount++;}),i]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let r=0;r<e.length;r++){let a=e[r];if(a in s||(s[a]={__listeners:[]}),r===e.length-1){let i=s[a];return t(i,s),i}else s=s[a];}}_removeListener(e,t,s){s&&C(e.__listeners,r=>{r=Array.isArray(r)?r[0]:r;let a=r===s;return a&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),a});}_createAyncIteratorListener(e,t){let s=Object.assign({overflow:"expand",size:10,maxExpandSize:100},t.iterable),r=R(this,e,s);r.create(t);let a=this._executeHooks("AddBeforeListener",[e,r.listener,t]);if(a===false)throw new d;return A(a)?a:r}on(){let e=arguments[0];if(e.length===0)throw new Error("event cannot be empty");let t=null,s,r=!c(arguments[1]);r?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let a=Object.assign({count:0,flags:0,prepend:false},s);if(r||t===null)return this._createAyncIteratorListener(e,a);let i=this._executeHooks("AddBeforeListener",[e,t,a]);if(i===false)throw new d;if(G(i))return i;let o=e.split(this._delimiter);if(a.pipes&&a.pipes.length>0&&(t=U(t,a.pipes)),c(a.filter)||c(a.off)){let g=t,h=()=>p&&this._removeListener(p,o,t);t=u(function(f,F){if(c(a.off)&&a.off.call(this,f,F)){h();return}if(c(a.filter)){if(a.filter.call(this,f,F))return g.call(this,f,F)}else return g.call(this,f,F)},t.name);}let[p,v]=this._addListener(o,t,a),m=()=>p&&this._removeListener(p,o,t);return this._executeHooks("AddAfterListener",[e,p]),this._emitRetainMessage(e,p,v),{off:m,listener:t,[Symbol.dispose](){m();}}}once(){return c(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)}off(){let e=arguments,t=c(e[0])?void 0:e[0],s=c(e[0])?e[0]:e[1],r=t?t.split(this._delimiter):[],a=t?t.includes("*"):false;if(t&&!a)this._traverseToPath(this.listeners,r,i=>{s?this._removeListener(i,r,s):t&&(i.__listeners=[]);});else {let i=a?[]:r;this._traverseListeners(this.listeners,i,(o,p)=>{(s!==void 0||a&&L(o,r))&&(s?this._removeListener(p,r,s):p.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(r,a)=>{s+=a.__listeners.length;try{a.__listeners.forEach(i=>{this._executeHooks("RemoveListener",[r.join(this.options.delimiter),i[0],a]);});}finally{a.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,r)=>{t+=r.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let r=[];if(e.includes("*")){let a=e.split(this._delimiter);this.retainedMessages.forEach((i,o)=>{let p=o.split(this._delimiter);L(p,a)&&r.push(i);});}else this.retainedMessages.has(e)&&r.push(this.retainedMessages.get(e));t&&r.forEach(a=>{this._executeListeners([t],a,{},i=>i[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,r=0,a){if(r>=t.length){s(e);return}let i=t[r];if(a===true){this._traverseToPath(e,t,s,r+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,r+1),"**"in e&&this._traverseToPath(e["**"],t,s,r+1,true),i in e&&this._traverseToPath(e[i],t,s,r+1);}_traverseListeners(e,t,s){let r=e;t&&t.length>0&&this._traverseToPath(e,t,i=>{r=i;});let a=(i,o,p)=>{o(p,i);for(let[v,m]of Object.entries(i))v.startsWith("__")||m&&a(m,o,[...p,v]);};a(r,s,[]);}_onListenerError(e,t,s,r){if(r instanceof Error&&(r._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[r,e,t,s]),this._options.ignoreErrors)return r;throw r}_executeListener(e,t,s,r=false){let a=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(a,t,s,new y(e[0].name));let i=((s?.flags||0)&1)>0,o=a.call(this.context,i?t.payload:t,s);return r&&o&&o instanceof Promise&&(o=W(o,p=>this._onListenerError(a,t,s,p))),this.options.debug&&(Promise.resolve(o),z(o)?K(o).then(p=>{e[5]=_(p);}):e[5]=_(o)),o}catch(i){let o=this._onListenerError(a,t,s,i);return o instanceof Error&&(e[5]=_(o)),o}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(c(t))return t}_executeListeners(e,t,s,r){if(!e||e.length===0)return [];let a=[];for(let o of e){let p=0;for(let v of o.__listeners)(!r||r(v,o))&&a.push([v,p++,o.__listeners]);}this._decListenerExecCount(a);let i=this._getListenerExecutor(s);if(i){let o=i(a.map(p=>p[0]),t,s,this._executeListener.bind(this));return Array.isArray(o)?o:[o]}else return a.map(o=>this._executeListener(o[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,a=>{t.push(a);});let r=[];return t.map(a=>{r.push(...a.__listeners);}),r}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=T(arguments,this.options.meta);c(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let r=[],a=[];this._traverseToPath(this.listeners,s,o=>{a.push(o);});let i=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(i))return i;if(i===false)throw new y(e.type);if(c(this._options.transform)){let o=this._options.transform.call(this,e);o!==e&&(e.payload=o,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}return r.push(...this._executeListeners(a,e,t)),this._options.expandEmitResults&&N(r),this._executeHooks("AfterExecuteListener",[e,r,a]),r}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return S(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,r)=>{let a,i,o=p=>{clearTimeout(a),i?.off(),s(p);};t&&t>0&&(a=setTimeout(()=>{i?.off(),r(new Error("wait for event<"+e+"> is timeout"));},t)),i=this.on(e,o);})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new M,r.bind(this,e,s),r}};exports.AbortError=y;exports.CancelError=d;exports.FastEvent=H;exports.FastEventError=E;exports.FastEventIterator=P;exports.FastEventListenerFlags=q;exports.FastEventScope=M;exports.QueueOverflowError=w;exports.TimeoutError=O;exports.UnboundError=x;exports.__FastEventScope__=J;exports.__FastEvent__=Q;exports.__expandable__=k;exports.createAsyncEventIterator=R;exports.expandable=he;exports.isAsyncIterable=A;exports.isClass=xe;exports.isExpandable=D;exports.isFastEvent=be;exports.isFastEventMessage=ye;exports.isFastEventScope=I;exports.isFunction=c;exports.isPathMatched=L;exports.isString=ue;exports.isSubsctiber=G;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,2 +0,2 @@

var C=Object.defineProperty;var re=(r,e,t)=>e in r?C(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var o=(r,e)=>C(r,"name",{value:e,configurable:true});var h=(r,e,t)=>re(r,typeof e!="symbol"?e+"":e,t);var ne=Symbol.for("__FastEvent__"),oe=Symbol.for("__FastEventScope__"),j=class j extends Error{constructor(e){super(e);}};o(j,"FastEventError");var m=j,O=class O extends m{};o(O,"TimeoutError");var N=O,T=class T extends m{};o(T,"UnboundError");var L=T,R=class R extends m{};o(R,"AbortError");var _=R,F=class F extends m{};o(F,"CancelError");var b=F,z=class z extends m{};o(z,"QueueOverflowError");var B=z;var d=(function(r){return r[r.Transformed=1]="Transformed",r})({});function w(r,e,t,s){let i,n={},f={};return typeof r[0]=="object"?(Object.assign(f,r[0]),n=typeof r[1]=="boolean"?{retain:r[1]}:r[1]||{},i=r[0].meta):(f.type=r[0],f.payload=r[1],n=typeof r[2]=="boolean"?{retain:r[2]}:r[2]||{}),i=Object.assign({},e,t,n.meta,i),Object.keys(i).length===0?(i=void 0,delete f.meta):f.meta=i,n.executor===void 0&&(n.executor=s),[f,n]}o(w,"parseEmitArgs");function $(r){return r?typeof r=="object"&&"__FastEventScope__"in r:false}o($,"isFastEventScope");function S(r,e,t){let s=r[0],i=$(r[1])?r[1]:void 0,n=(i?r[2]:r[1])||{};return n.meta=Object.assign({},e,n?.meta),n.context=n.context!==void 0?n.context:t,[s,i,n]}o(S,"parseScopeArgs");function x(r,e){return Object.defineProperty(r,"name",{value:e||"anonymous",configurable:true}),r}o(x,"renameFn");function l(r){return r&&typeof r=="function"}o(l,"isFunction");var P=class P{constructor(e){h(this,"__FastEventScope__",true);h(this,"__events__");h(this,"__meta__");h(this,"__context__");h(this,"_options",{});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return x(function(n,f){let a=f.rawEventType||n.type;if(a.startsWith(t)){let c=((f.flags||0)&d.Transformed)>0?n:Object.assign({},n,{type:a.substring(t.length)});return e.call(s.context,c,f)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new L;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=w(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){l(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|d.Transformed,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new P,i.bind(this.emitter,this.prefix+e,s),i}};o(P,"FastEventScope");var A=P;function k(r,e){let t=r.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let i=0;i<s-1;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}for(let i=0;i<t;i++)if(e[i]!=="*"&&e[i]!==r[i])return false;return true}o(k,"isPathMatched");function V(r,e){let t=[];for(let s=r.length-1;s>=0;s--)e(r[s])&&(t.push(s),r.splice(s,1));return t.reverse()}o(V,"removeItem");function Fe(r){return r?typeof r=="object"&&"type"in r:false}o(Fe,"isFastEventMessage");function Ie(r){return r&&typeof r=="string"}o(Ie,"isString");var q=Symbol.for("__expandable__");function He(r){return r[q]=true,r}o(He,"expandable");function G(r){return r&&r[q]}o(G,"isExpandable");function J(r){return r&&typeof r=="object"&&"off"in r&&"listener"in r}o(J,"isSubsctiber");function Ve(r){return typeof r=="function"&&(r.toString().startsWith("class ")||r.prototype?.constructor===r)}o(Ve,"isClass");function Je(r){return r?typeof r=="object"&&"__FastEvent__"in r:false}o(Je,"isFastEvent");function K(r){if(r===null||typeof r!="object")return false;let e=r;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}o(K,"isAsyncIterable");var X=o(()=>(r,e,t,s)=>r.map((i,n)=>s.call(r[n],i,e,t,true)),"parallel");function Y(r){for(let e=0;e<r.length;e++){let t=r[e];Array.isArray(t)&&G(t)&&(r.splice(e,1,...t),e+=t.length-1);}return r}o(Y,"expandEmitResults");function Z(r,e){return r.catch(t=>(e&&e(t),Promise.resolve(t)))}o(Z,"tryReturnError");var D=class D{constructor(e,t,s={}){h(this,"eventEmitter");h(this,"eventName");h(this,"buffer",[]);h(this,"resolvers",[]);h(this,"errorResolvers",[]);h(this,"isStopped",false);h(this,"error",null);h(this,"options");h(this,"currentSize");h(this,"hasNewMessage",false);h(this,"_listener");h(this,"_ready",false);h(this,"_listenOptions");h(this,"_cleanups",[]);this.eventEmitter=e,this.eventName=t;let i=20,n=100;this.options={size:s.size??i,maxExpandSize:s.maxExpandSize??n,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=o(()=>{this.off(!0);},"offFn");this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new _);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};o(D,"FastEventIterator");var I=D;function U(r,e,t={}){return new I(r,e,t)}o(U,"createAsyncEventIterator");function Q(r,e){return Array.isArray(e)&&e.forEach(t=>{r=x(t(r),r.name);}),r}o(Q,"wrapPipeListener");function M(r){return r!==null&&(typeof r=="object"||typeof r=="function")?new WeakRef(r):r}o(M,"getWeakRef");function W(r){return r.map(e=>e.status==="fulfilled"?e.value:e.reason)}o(W,"getPromiseResults");function ee(r){if(r==null)return false;let e=typeof r;return e!=="object"&&e!=="function"?false:typeof r.then=="function"}o(ee,"isPromise");async function te(r){try{return r instanceof Promise?await r:r}catch(e){return e instanceof Error?e:new Error(String(e))}}o(te,"resolveValue");var H=class H{constructor(e){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"_hooks");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:X()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=W(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let i=this.hooks[e];Array.isArray(i)&&i.length>0&&Promise.allSettled(i.map(n=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(n,t);else return n.apply(this,t)}));}),!s){let i=this.options[`on${e}`];if(l(i))if(e==="AfterExecuteListener")this._execAfterExecuteListener(i,t);else return i.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:i,prepend:n}=s,f=0;return [this._forEachNodes(e,u=>{let c=[t,i,0,s.tag,s.flags];n?(u.__listeners.splice(0,0,c),f=0):(u.__listeners.push(c),f=u.__listeners.length-1),this.listenerCount++;}),f]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let i=0;i<e.length;i++){let n=e[i];if(n in s||(s[n]={__listeners:[]}),i===e.length-1){let f=s[n];return t(f,s),f}else s=s[n];}}_removeListener(e,t,s){s&&V(e.__listeners,i=>{i=Array.isArray(i)?i[0]:i;let n=i===s;return n&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),n});}on(){let e=arguments[0],t=null,s,i=!l(arguments[1]);i?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let n=Object.assign({count:0,flags:0,prepend:false},s);if(e.length===0)throw new Error("event type cannot be empty");if(i||t===null){let v=Object.assign({overflow:"expand",size:10,maxExpandSize:100},n.iterable),y=U(this,e,v);y.create(n);let p=this._executeHooks("AddBeforeListener",[e,y.listener,n]);if(p===false)throw new b;return K(p)?p:y}let f=this._executeHooks("AddBeforeListener",[e,t,n]);if(f===false)throw new b;if(J(f))return f;let a=e.split(this._delimiter);if(n.pipes&&n.pipes.length>0&&(t=Q(t,n.pipes)),l(n.filter)||l(n.off)){let v=t,y=o(()=>u&&this._removeListener(u,a,t),"off");t=x(function(p,E){if(l(n.off)&&n.off.call(this,p,E)){y();return}if(l(n.filter)){if(n.filter.call(this,p,E))return v.call(this,p,E)}else return v.call(this,p,E)},t.name);}let[u,c]=this._addListener(a,t,n),g=o(()=>u&&this._removeListener(u,a,t),"off");return this._executeHooks("AddAfterListener",[e,u]),this._emitRetainMessage(e,u,c),{off:g,listener:t,[Symbol.dispose](){g();}}}once(){return l(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)}off(){let e=arguments,t=l(e[0])?void 0:e[0],s=l(e[0])?e[0]:e[1],i=t?t.split(this._delimiter):[],n=t?t.includes("*"):false;if(t&&!n)this._traverseToPath(this.listeners,i,f=>{s?this._removeListener(f,i,s):t&&(f.__listeners=[]);});else {let f=n?[]:i;this._traverseListeners(this.listeners,f,(a,u)=>{(s!==void 0||n&&k(a,i))&&(s?this._removeListener(u,i,s):u.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(i,n)=>{s+=n.__listeners.length;try{n.__listeners.forEach(f=>{this._executeHooks("RemoveListener",[i.join(this.options.delimiter),f[0],n]);});}finally{n.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,i)=>{t+=i.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let i=[];if(e.includes("*")){let n=e.split(this._delimiter);this.retainedMessages.forEach((f,a)=>{let u=a.split(this._delimiter);k(u,n)&&i.push(f);});}else this.retainedMessages.has(e)&&i.push(this.retainedMessages.get(e));t&&i.forEach(n=>{this._executeListeners([t],n,{},f=>f[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,i=0,n){if(i>=t.length){s(e);return}let f=t[i];if(n===true){this._traverseToPath(e,t,s,i+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,i+1),"**"in e&&this._traverseToPath(e["**"],t,s,i+1,true),f in e&&this._traverseToPath(e[f],t,s,i+1);}_traverseListeners(e,t,s){let i=e;t&&t.length>0&&this._traverseToPath(e,t,f=>{i=f;});let n=o((f,a,u)=>{a(u,f);for(let[c,g]of Object.entries(f))c.startsWith("__")||g&&n(g,a,[...u,c]);},"traverseNodes");n(i,s,[]);}_onListenerError(e,t,s,i){if(i instanceof Error&&(i._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[i,e,t,s]),this._options.ignoreErrors)return i;throw i}_executeListener(e,t,s,i=false){let n=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(n,t,s,new _(e[0].name));let f=((s?.flags||0)&d.Transformed)>0,a=n.call(this.context,f?t.payload:t,s);return i&&a&&a instanceof Promise&&(a=Z(a,u=>this._onListenerError(n,t,s,u))),this.options.debug&&(Promise.resolve(a),ee(a)?te(a).then(u=>{e[5]=M(u);}):e[5]=M(a)),a}catch(f){let a=this._onListenerError(n,t,s,f);return a instanceof Error&&(e[5]=M(a)),a}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(l(t))return t}_executeListeners(e,t,s,i){if(!e||e.length===0)return [];let n=[];for(let a of e){let u=0;for(let c of a.__listeners)(!i||i(c,a))&&n.push([c,u++,a.__listeners]);}this._decListenerExecCount(n);let f=this._getListenerExecutor(s);if(f){let a=f(n.map(u=>u[0]),t,s,this._executeListener.bind(this));return Array.isArray(a)?a:[a]}else return n.map(a=>this._executeListener(a[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,n=>{t.push(n);});let i=[];return t.map(n=>{i.push(...n.__listeners);}),i}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=w(arguments,this.options.meta);l(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let i=[],n=[];this._traverseToPath(this.listeners,s,a=>{n.push(a);});let f=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(f))return f;if(f===false)throw new _(e.type);if(l(this._options.transform)){let a=this._options.transform.call(this,e);a!==e&&(e.payload=a,t.rawEventType=e.type,t.flags=(t.flags||0)|d.Transformed);}return i.push(...this._executeListeners(n,e,t)),this._options.expandEmitResults&&Y(i),this._executeHooks("AfterExecuteListener",[e,i,n]),i}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return W(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,i)=>{let n,f,a=o(u=>{clearTimeout(n),f?.off(),s(u);},"listener");t&&t>0&&(n=setTimeout(()=>{f?.off(),i(new Error("wait for event<"+e+"> is timeout"));},t)),f=this.on(e,a);})}scope(){let[e,t,s]=S(arguments,this.options.meta,this.options.context),i;return t?i=t:i=new A,i.bind(this,e,s),i}};o(H,"FastEvent");var se=H;export{_ as AbortError,b as CancelError,se as FastEvent,m as FastEventError,I as FastEventIterator,d as FastEventListenerFlags,A as FastEventScope,B as QueueOverflowError,N as TimeoutError,L as UnboundError,oe as __FastEventScope__,ne as __FastEvent__,q as __expandable__,U as createAsyncEventIterator,He as expandable,K as isAsyncIterable,Ve as isClass,G as isExpandable,Je as isFastEvent,Fe as isFastEventMessage,$ as isFastEventScope,l as isFunction,k as isPathMatched,Ie as isString,J as isSubsctiber};//# sourceMappingURL=index.mjs.map
var V=Object.defineProperty;var B=(n,e,t)=>e in n?V(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var l=(n,e,t)=>B(n,typeof e!="symbol"?e+"":e,t);var Q=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),E=class extends Error{constructor(e){super(e);}},O=class extends E{},x=class extends E{},y=class extends E{},d=class extends E{},w=class extends E{};var q=(e=>(e[e.Transformed=1]="Transformed",e))(q||{});function T(n,e,t,s){let r,a={},i={};return typeof n[0]=="object"?(Object.assign(i,n[0]),a=typeof n[1]=="boolean"?{retain:n[1]}:n[1]||{},r=n[0].meta):(i.type=n[0],i.payload=n[1],a=typeof n[2]=="boolean"?{retain:n[2]}:n[2]||{}),r=Object.assign({},e,t,a.meta,r),Object.keys(r).length===0?(r=void 0,delete i.meta):i.meta=r,a.executor===void 0&&(a.executor=s),[i,a]}function I(n){return n?typeof n=="object"&&"__FastEventScope__"in n:false}function b(n,e,t){let s=n[0],r=I(n[1])?n[1]:void 0,a=(r?n[2]:n[1])||{};return a.meta=Object.assign({},e,a?.meta),a.context=a.context!==void 0?a.context:t,[s,r,a]}function u(n,e){return Object.defineProperty(n,"name",{value:e||"anonymous",configurable:true}),n}function c(n){return n&&typeof n=="function"}var M=class n{constructor(e){l(this,"__FastEventScope__",true);l(this,"__events__");l(this,"__meta__");l(this,"__context__");l(this,"_options",{});l(this,"prefix","");l(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,s){this.emitter=e,this._options=Object.assign(this._options,{scope:t},s),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let s=this;return u(function(a,i){let o=i.rawEventType||a.type;if(o.startsWith(t)){let v=((i.flags||0)&1)>0?a:Object.assign({},a,{type:o.substring(t.length)});return e.call(s.context,v,i)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new x;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}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[e,t]=T(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){c(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|1,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],s=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new n,r.bind(this.emitter,this.prefix+e,s),r}};function L(n,e){let t=n.length,s=e.length;if(t!==s&&(s===0||e[s-1]!=="**"))return false;if(s>0&&e[s-1]==="**"){for(let r=0;r<s-1;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}for(let r=0;r<t;r++)if(e[r]!=="*"&&e[r]!==n[r])return false;return true}function C(n,e){let t=[];for(let s=n.length-1;s>=0;s--)e(n[s])&&(t.push(s),n.splice(s,1));return t.reverse()}function ye(n){return n?typeof n=="object"&&"type"in n:false}function ue(n){return n&&typeof n=="string"}var k=Symbol.for("__expandable__");function he(n){return n[k]=true,n}function D(n){return n&&n[k]}function G(n){return n&&typeof n=="object"&&"off"in n&&"listener"in n}function xe(n){return typeof n=="function"&&(n.toString().startsWith("class ")||n.prototype?.constructor===n)}function be(n){return n?typeof n=="object"&&"__FastEvent__"in n:false}function A(n){if(n===null||typeof n!="object")return false;let e=n;return typeof e[Symbol.asyncIterator]=="function"||typeof e["@@asyncIterator"]=="function"}var j=()=>(n,e,t,s)=>n.map((r,a)=>s.call(n[a],r,e,t,true));function N(n){for(let e=0;e<n.length;e++){let t=n[e];Array.isArray(t)&&D(t)&&(n.splice(e,1,...t),e+=t.length-1);}return n}function W(n,e){return n.catch(t=>(e&&e(t),Promise.resolve(t)))}var P=class{constructor(e,t,s={}){this.eventEmitter=e;this.eventName=t;l(this,"resolvers",[]);l(this,"errorResolvers",[]);l(this,"isStopped",false);l(this,"options");l(this,"currentSize");l(this,"hasNewMessage",false);l(this,"_listener");l(this,"_ready",false);l(this,"_listenOptions");l(this,"_cleanups",[]);l(this,"error",null);l(this,"buffer",[]);this.options={size:s.size??20,maxExpandSize:s.maxExpandSize??100,expandOverflow:s.expandOverflow??"slide",overflow:s.overflow??"slide",lifetime:s.lifetime??0,onPush:s.onPush,onPop:s.onPop,onDrop:s.onDrop,onError:s.onError??(()=>true),signal:s.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let s=()=>{this.off(!0);};this.options.signal.addEventListener("abort",s),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",s);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let s=this.buffer.shift();return this.options.onDrop&&s&&this.options.onDrop(s[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let s=e;if(this.resolvers.length>0){this.resolvers.shift()({value:s,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(s):this.handleOverflow(s);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new y);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let s=this.options.onPop(this.buffer,this.hasNewMessage);s?[e,t]=s:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};function R(n,e,t={}){return new P(n,e,t)}function U(n,e){return Array.isArray(e)&&e.forEach(t=>{n=u(t(n),n.name);}),n}function _(n){return n!==null&&(typeof n=="object"||typeof n=="function")?new WeakRef(n):n}function S(n){return n.map(e=>e.status==="fulfilled"?e.value:e.reason)}function z(n){if(n==null)return false;let e=typeof n;return e!=="object"&&e!=="function"?false:typeof n.then=="function"}async function K(n){try{return n instanceof Promise?await n:n}catch(e){return e instanceof Error?e:new Error(String(e))}}var H=class{constructor(e){l(this,"__FastEvent__",true);l(this,"listeners",{__listeners:[]});l(this,"_options");l(this,"_delimiter","/");l(this,"_context");l(this,"_hooks");l(this,"retainedMessages",new Map);l(this,"listenerCount",0);l(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:j()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context;}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}get title(){return this._options.title||this.id||"FastEvent"}get hooks(){return this._hooks||(this._hooks={AddBeforeListener:[],AddAfterListener:[],RemoveListener:[],ClearListeners:[],ListenerError:[],BeforeExecuteListener:[],AfterExecuteListener:[]}),this._hooks}_execAfterExecuteListener(e,t){Promise.allSettled(t[1]).then(s=>{t[1]=S(s),e.apply(this,t);});}_executeHooks(e,t,s=false){if(setTimeout(()=>{if(!this._hooks)return;let r=this.hooks[e];Array.isArray(r)&&r.length>0&&Promise.allSettled(r.map(a=>{if(e==="AfterExecuteListener")this._execAfterExecuteListener(a,t);else return a.apply(this,t)}));}),!s){let r=this.options[`on${e}`];if(c(r))if(e==="AfterExecuteListener")this._execAfterExecuteListener(r,t);else return r.apply(this,t)}}_initOptions(e){return e}_addListener(e,t,s){let{count:r,prepend:a}=s,i=0;return [this._forEachNodes(e,p=>{let v=[t,r,0,s.tag,s.flags];a?(p.__listeners.splice(0,0,v),i=0):(p.__listeners.push(v),i=p.__listeners.length-1),this.listenerCount++;}),i]}_forEachNodes(e,t){if(e.length===0)return;let s=this.listeners;for(let r=0;r<e.length;r++){let a=e[r];if(a in s||(s[a]={__listeners:[]}),r===e.length-1){let i=s[a];return t(i,s),i}else s=s[a];}}_removeListener(e,t,s){s&&C(e.__listeners,r=>{r=Array.isArray(r)?r[0]:r;let a=r===s;return a&&(this.listenerCount--,this._executeHooks("RemoveListener",[t.join(this._delimiter),s,e])),a});}_createAyncIteratorListener(e,t){let s=Object.assign({overflow:"expand",size:10,maxExpandSize:100},t.iterable),r=R(this,e,s);r.create(t);let a=this._executeHooks("AddBeforeListener",[e,r.listener,t]);if(a===false)throw new d;return A(a)?a:r}on(){let e=arguments[0];if(e.length===0)throw new Error("event cannot be empty");let t=null,s,r=!c(arguments[1]);r?s=arguments[1]||{}:(t=arguments[1],s=arguments[2]||{});let a=Object.assign({count:0,flags:0,prepend:false},s);if(r||t===null)return this._createAyncIteratorListener(e,a);let i=this._executeHooks("AddBeforeListener",[e,t,a]);if(i===false)throw new d;if(G(i))return i;let o=e.split(this._delimiter);if(a.pipes&&a.pipes.length>0&&(t=U(t,a.pipes)),c(a.filter)||c(a.off)){let g=t,h=()=>p&&this._removeListener(p,o,t);t=u(function(f,F){if(c(a.off)&&a.off.call(this,f,F)){h();return}if(c(a.filter)){if(a.filter.call(this,f,F))return g.call(this,f,F)}else return g.call(this,f,F)},t.name);}let[p,v]=this._addListener(o,t,a),m=()=>p&&this._removeListener(p,o,t);return this._executeHooks("AddAfterListener",[e,p]),this._emitRetainMessage(e,p,v),{off:m,listener:t,[Symbol.dispose](){m();}}}once(){return c(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)}off(){let e=arguments,t=c(e[0])?void 0:e[0],s=c(e[0])?e[0]:e[1],r=t?t.split(this._delimiter):[],a=t?t.includes("*"):false;if(t&&!a)this._traverseToPath(this.listeners,r,i=>{s?this._removeListener(i,r,s):t&&(i.__listeners=[]);});else {let i=a?[]:r;this._traverseListeners(this.listeners,i,(o,p)=>{(s!==void 0||a&&L(o,r))&&(s?this._removeListener(p,r,s):p.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),s=0;this._traverseListeners(this.listeners,t,(r,a)=>{s+=a.__listeners.length;try{a.__listeners.forEach(i=>{this._executeHooks("RemoveListener",[r.join(this.options.delimiter),i[0],a]);});}finally{a.__listeners=[];}}),this.listenerCount-=s,this._removeRetainedEvents(e);}else try{let t=0;this._traverseListeners(this.listeners,[],(s,r)=>{t+=r.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}finally{this._executeHooks("ClearListeners",[]);}}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,s){let r=[];if(e.includes("*")){let a=e.split(this._delimiter);this.retainedMessages.forEach((i,o)=>{let p=o.split(this._delimiter);L(p,a)&&r.push(i);});}else this.retainedMessages.has(e)&&r.push(this.retainedMessages.get(e));t&&r.forEach(a=>{this._executeListeners([t],a,{},i=>i[0]===t.__listeners[s][0]);});}_traverseToPath(e,t,s,r=0,a){if(r>=t.length){s(e);return}let i=t[r];if(a===true){this._traverseToPath(e,t,s,r+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,s,r+1),"**"in e&&this._traverseToPath(e["**"],t,s,r+1,true),i in e&&this._traverseToPath(e[i],t,s,r+1);}_traverseListeners(e,t,s){let r=e;t&&t.length>0&&this._traverseToPath(e,t,i=>{r=i;});let a=(i,o,p)=>{o(p,i);for(let[v,m]of Object.entries(i))v.startsWith("__")||m&&a(m,o,[...p,v]);};a(r,s,[]);}_onListenerError(e,t,s,r){if(r instanceof Error&&(r._emitter=`${e.name||"anonymous"}:${t.type}`),this._executeHooks("ListenerError",[r,e,t,s]),this._options.ignoreErrors)return r;throw r}_executeListener(e,t,s,r=false){let a=e[0];try{if(this.options.debug&&(e.length=5),s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(a,t,s,new y(e[0].name));let i=((s?.flags||0)&1)>0,o=a.call(this.context,i?t.payload:t,s);return r&&o&&o instanceof Promise&&(o=W(o,p=>this._onListenerError(a,t,s,p))),this.options.debug&&(Promise.resolve(o),z(o)?K(o).then(p=>{e[5]=_(p);}):e[5]=_(o)),o}catch(i){let o=this._onListenerError(a,t,s,i);return o instanceof Error&&(e[5]=_(o)),o}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(c(t))return t}_executeListeners(e,t,s,r){if(!e||e.length===0)return [];let a=[];for(let o of e){let p=0;for(let v of o.__listeners)(!r||r(v,o))&&a.push([v,p++,o.__listeners]);}this._decListenerExecCount(a);let i=this._getListenerExecutor(s);if(i){let o=i(a.map(p=>p[0]),t,s,this._executeListener.bind(this));return Array.isArray(o)?o:[o]}else return a.map(o=>this._executeListener(o[0],t,s,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let s=e[t][0];s[2]++,s[1]>0&&s[1]<=s[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],s=e.split(this._delimiter);this._traverseToPath(this.listeners,s,a=>{t.push(a);});let r=[];return t.map(a=>{r.push(...a.__listeners);}),r}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=T(arguments,this.options.meta);c(t.parseArgs)&&t.parseArgs(e,t);let s=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let r=[],a=[];this._traverseToPath(this.listeners,s,o=>{a.push(o);});let i=this._executeHooks("BeforeExecuteListener",[e,t]);if(Array.isArray(i))return i;if(i===false)throw new y(e.type);if(c(this._options.transform)){let o=this._options.transform.call(this,e);o!==e&&(e.payload=o,t.rawEventType=e.type,t.flags=(t.flags||0)|1);}return r.push(...this._executeListeners(a,e,t)),this._options.expandEmitResults&&N(r),this._executeHooks("AfterExecuteListener",[e,r,a]),r}async emitAsync(){let e=await Promise.allSettled(this.emit.apply(this,arguments));return S(e)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((s,r)=>{let a,i,o=p=>{clearTimeout(a),i?.off(),s(p);};t&&t>0&&(a=setTimeout(()=>{i?.off(),r(new Error("wait for event<"+e+"> is timeout"));},t)),i=this.on(e,o);})}scope(){let[e,t,s]=b(arguments,this.options.meta,this.options.context),r;return t?r=t:r=new M,r.bind(this,e,s),r}};export{y as AbortError,d as CancelError,H as FastEvent,E as FastEventError,P as FastEventIterator,q as FastEventListenerFlags,M as FastEventScope,w as QueueOverflowError,O as TimeoutError,x as UnboundError,J as __FastEventScope__,Q as __FastEvent__,k as __expandable__,R as createAsyncEventIterator,he as expandable,A as isAsyncIterable,xe as isClass,D as isExpandable,be as isFastEvent,ye as isFastEventMessage,I as isFastEventScope,c as isFunction,L as isPathMatched,ue as isString,G as isSubsctiber};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,5 +0,1 @@

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**

@@ -25,2 +21,6 @@ * 检查类型是否为多级通配符(包含 **)

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;

@@ -27,0 +27,0 @@ type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];

@@ -1,5 +0,1 @@

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**

@@ -25,2 +21,6 @@ * 检查类型是否为多级通配符(包含 **)

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;

@@ -27,0 +27,0 @@ type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];

@@ -1,2 +0,2 @@

'use strict';var j=Object.defineProperty;var n=(t,e)=>j(t,"name",{value:e,configurable:true});var T=class T extends Error{constructor(e){super(e);}};n(T,"FastEventError");var h=T,F=class F extends h{};n(F,"TimeoutError");var y=F;var O=class O extends h{};n(O,"QueueOverflowError");var v=O;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var D=n(t=>{let{lifetime:e,size:l,overflow:o,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:r,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],P=l,_=false,m=false,S=n(u=>{p(s)?s(u,c):c.push(e>0?[u,Date.now()]:[u,0]);},"pushMessage"),b=n(u=>{switch(c.length>=i&&o==="expand"?a:o){case "drop":return p(r)&&r(u),false;case "expand":return P=Math.min(P+l,i),S(u),true;case "slide":let x=c.shift();return p(r)&&x&&r(x[0]),S(u),true;case "throw":throw p(r)&&r(u),new v;default:return false}},"handleOverflow");return u=>async function(w,x){if(m=true,_){c.length<P?S(w):b(w);return}_=true;try{for(await u.call(this,w,x);c.length>0;){let d,z;if(m&&p(f)?([d,z]=f(c,m)||[void 0,0],m=!1):[d,z]=c.shift()||[void 0,0],d){if(e>0&&Date.now()-z>e){p(r)&&r(d);continue}await u.call(this,d,x);}}}finally{_=false;}}},"queue"),H=n((t=10)=>D({size:t,overflow:"drop"}),"dropping"),N=n((t=10)=>D({size:t,overflow:"slide"}),"sliding"),G=n(t=>D(Object.assign({},t,{overflow:"expand"})),"expanding");var M=n(t=>new Promise(e=>setTimeout(e,t)),"delay");function $(t){let{retries:e,interval:l,drop:o}=Object.assign({retries:1,interval:100},t);return i=>async function(a,s){let r=0,f;for(;r<=e;)try{return await i.call(this,a,s)}catch(c){if(f=c,r++,r<=e)await M(p(l)?l(r):l);else throw p(o)&&o(a,f),f}}}n($,"retry");var V=n((t,e)=>l=>async function(o,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{e!==void 0?f(e):c(new y);},t);}),r=Promise.resolve(l.call(this,o,i));try{return await Promise.race([r,s])}finally{clearTimeout(a);}},"timeout");var tt=n((t,e)=>l=>{let o=false,i=null;return async function(a,s){if(o){e?.drop&&e.drop(a);return}try{o=!0;let r=await l.call(this,a,s);return i=setTimeout(()=>{o=!1,i=null;},t),r}catch(r){throw o=false,i&&(clearTimeout(i),i=null),r}}},"debounce");var rt=n((t,e)=>l=>{let o=0;return async function(i,a){let s=Date.now();if(s-o<t){e?.drop&&e.drop(i);return}return o=s,await l.call(this,i,a)}},"throttle");function st(t){let e,l=false,o,i=typeof t=="function";return function(a){return async function(s,r){if(l){if(typeof t=="function"){if(await t(s,r))return e}else if(s.payload===o)return e}let f=await a.call(this,s,r);return e=f,i||(o=s.payload),l=true,f}}}n(st,"memorize");exports.debounce=tt;exports.dropping=H;exports.expanding=G;exports.memorize=st;exports.queue=D;exports.retry=$;exports.sliding=N;exports.throttle=rt;exports.timeout=V;//# sourceMappingURL=index.js.map
'use strict';var v=class extends Error{constructor(t){super(t);}},F=class extends v{};var E=class extends v{};function l(e){return e&&typeof e=="function"}var w=e=>{let{lifetime:t,size:i,overflow:s,maxExpandSize:n,expandOverflow:a,onPush:o,onDrop:r,onPop:u}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},e),p=[],x=i,T=false,c=false,L=f=>{l(o)?o(f,p):p.push(t>0?[f,Date.now()]:[f,0]);},P=f=>{switch(p.length>=n&&s==="expand"?a:s){case "drop":return l(r)&&r(f),false;case "expand":return x=Math.min(x+i,n),L(f),true;case "slide":let m=p.shift();return l(r)&&m&&r(m[0]),L(f),true;case "throw":throw l(r)&&r(f),new E;default:return false}};return f=>async function(y,m){if(c=true,T){p.length<x?L(y):P(y);return}T=true;try{for(await f.call(this,y,m);p.length>0;){let d,g;if(c&&l(u)?([d,g]=u(p,c)||[void 0,0],c=!1):[d,g]=p.shift()||[void 0,0],d){if(t>0&&Date.now()-g>t){l(r)&&r(d);continue}await f.call(this,d,m);}}}finally{T=false;}}},A=(e=10)=>w({size:e,overflow:"drop"}),S=(e=10)=>w({size:e,overflow:"slide"}),z=e=>w(Object.assign({},e,{overflow:"expand"}));var h=e=>new Promise(t=>setTimeout(t,e));function q(e){let{retries:t,interval:i,drop:s}=Object.assign({retries:1,interval:100},e);return n=>async function(a,o){let r=0,u;for(;r<=t;)try{return await n.call(this,a,o)}catch(p){if(u=p,r++,r<=t)await h(l(i)?i(r):i);else throw l(s)&&s(a,u),u}}}var k=(e,t)=>i=>async function(s,n){let a,o=new Promise((u,p)=>{a=setTimeout(()=>{t!==void 0?u(t):p(new F);},e);}),r=Promise.resolve(i.call(this,s,n));try{return await Promise.race([r,o])}finally{clearTimeout(a);}};var C=(e,t)=>i=>{let s=false,n=null;return async function(a,o){if(s){t?.drop&&t.drop(a);return}try{s=!0;let r=await i.call(this,a,o);return n=setTimeout(()=>{s=!1,n=null;},e),r}catch(r){throw s=false,n&&(clearTimeout(n),n=null),r}}};var G=(e,t)=>i=>{let s=0;return async function(n,a){let o=Date.now();if(o-s<e){t?.drop&&t.drop(n);return}return s=o,await i.call(this,n,a)}};function K(e){let t,i=false,s,n=typeof e=="function";return function(a){return async function(o,r){if(i){if(typeof e=="function"){if(await e(o,r))return t}else if(o.payload===s)return t}let u=await a.call(this,o,r);return t=u,n||(s=o.payload),i=true,u}}}exports.debounce=C;exports.dropping=A;exports.expanding=z;exports.memorize=K;exports.queue=w;exports.retry=q;exports.sliding=S;exports.throttle=G;exports.timeout=k;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","delay","ms","Promise","resolve","setTimeout","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\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 onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n 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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\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 let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\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\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): 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: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据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}\n"]}
{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","message","TimeoutError","QueueOverflowError","isFunction","fn","queue","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","buffer","currentSize","isHandling","hasNewMessage","pushMessage","handleOverflow","msg","listener","args","nextMessage","enterTime","dropping","sliding","expanding","delay","ms","resolve","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","debounce","isBlocked","result","throttle","lastExecutionTime","now","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\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 onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n 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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\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 let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\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\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): 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: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据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}\n"]}

@@ -1,2 +0,2 @@

var j=Object.defineProperty;var n=(t,e)=>j(t,"name",{value:e,configurable:true});var T=class T extends Error{constructor(e){super(e);}};n(T,"FastEventError");var h=T,F=class F extends h{};n(F,"TimeoutError");var y=F;var O=class O extends h{};n(O,"QueueOverflowError");var v=O;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var D=n(t=>{let{lifetime:e,size:l,overflow:o,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:r,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],P=l,_=false,m=false,S=n(u=>{p(s)?s(u,c):c.push(e>0?[u,Date.now()]:[u,0]);},"pushMessage"),b=n(u=>{switch(c.length>=i&&o==="expand"?a:o){case "drop":return p(r)&&r(u),false;case "expand":return P=Math.min(P+l,i),S(u),true;case "slide":let x=c.shift();return p(r)&&x&&r(x[0]),S(u),true;case "throw":throw p(r)&&r(u),new v;default:return false}},"handleOverflow");return u=>async function(w,x){if(m=true,_){c.length<P?S(w):b(w);return}_=true;try{for(await u.call(this,w,x);c.length>0;){let d,z;if(m&&p(f)?([d,z]=f(c,m)||[void 0,0],m=!1):[d,z]=c.shift()||[void 0,0],d){if(e>0&&Date.now()-z>e){p(r)&&r(d);continue}await u.call(this,d,x);}}}finally{_=false;}}},"queue"),H=n((t=10)=>D({size:t,overflow:"drop"}),"dropping"),N=n((t=10)=>D({size:t,overflow:"slide"}),"sliding"),G=n(t=>D(Object.assign({},t,{overflow:"expand"})),"expanding");var M=n(t=>new Promise(e=>setTimeout(e,t)),"delay");function $(t){let{retries:e,interval:l,drop:o}=Object.assign({retries:1,interval:100},t);return i=>async function(a,s){let r=0,f;for(;r<=e;)try{return await i.call(this,a,s)}catch(c){if(f=c,r++,r<=e)await M(p(l)?l(r):l);else throw p(o)&&o(a,f),f}}}n($,"retry");var V=n((t,e)=>l=>async function(o,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{e!==void 0?f(e):c(new y);},t);}),r=Promise.resolve(l.call(this,o,i));try{return await Promise.race([r,s])}finally{clearTimeout(a);}},"timeout");var tt=n((t,e)=>l=>{let o=false,i=null;return async function(a,s){if(o){e?.drop&&e.drop(a);return}try{o=!0;let r=await l.call(this,a,s);return i=setTimeout(()=>{o=!1,i=null;},t),r}catch(r){throw o=false,i&&(clearTimeout(i),i=null),r}}},"debounce");var rt=n((t,e)=>l=>{let o=0;return async function(i,a){let s=Date.now();if(s-o<t){e?.drop&&e.drop(i);return}return o=s,await l.call(this,i,a)}},"throttle");function st(t){let e,l=false,o,i=typeof t=="function";return function(a){return async function(s,r){if(l){if(typeof t=="function"){if(await t(s,r))return e}else if(s.payload===o)return e}let f=await a.call(this,s,r);return e=f,i||(o=s.payload),l=true,f}}}n(st,"memorize");export{tt as debounce,H as dropping,G as expanding,st as memorize,D as queue,$ as retry,N as sliding,rt as throttle,V as timeout};//# sourceMappingURL=index.mjs.map
var v=class extends Error{constructor(t){super(t);}},F=class extends v{};var E=class extends v{};function l(e){return e&&typeof e=="function"}var w=e=>{let{lifetime:t,size:i,overflow:s,maxExpandSize:n,expandOverflow:a,onPush:o,onDrop:r,onPop:u}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},e),p=[],x=i,T=false,c=false,L=f=>{l(o)?o(f,p):p.push(t>0?[f,Date.now()]:[f,0]);},P=f=>{switch(p.length>=n&&s==="expand"?a:s){case "drop":return l(r)&&r(f),false;case "expand":return x=Math.min(x+i,n),L(f),true;case "slide":let m=p.shift();return l(r)&&m&&r(m[0]),L(f),true;case "throw":throw l(r)&&r(f),new E;default:return false}};return f=>async function(y,m){if(c=true,T){p.length<x?L(y):P(y);return}T=true;try{for(await f.call(this,y,m);p.length>0;){let d,g;if(c&&l(u)?([d,g]=u(p,c)||[void 0,0],c=!1):[d,g]=p.shift()||[void 0,0],d){if(t>0&&Date.now()-g>t){l(r)&&r(d);continue}await f.call(this,d,m);}}}finally{T=false;}}},A=(e=10)=>w({size:e,overflow:"drop"}),S=(e=10)=>w({size:e,overflow:"slide"}),z=e=>w(Object.assign({},e,{overflow:"expand"}));var h=e=>new Promise(t=>setTimeout(t,e));function q(e){let{retries:t,interval:i,drop:s}=Object.assign({retries:1,interval:100},e);return n=>async function(a,o){let r=0,u;for(;r<=t;)try{return await n.call(this,a,o)}catch(p){if(u=p,r++,r<=t)await h(l(i)?i(r):i);else throw l(s)&&s(a,u),u}}}var k=(e,t)=>i=>async function(s,n){let a,o=new Promise((u,p)=>{a=setTimeout(()=>{t!==void 0?u(t):p(new F);},e);}),r=Promise.resolve(i.call(this,s,n));try{return await Promise.race([r,o])}finally{clearTimeout(a);}};var C=(e,t)=>i=>{let s=false,n=null;return async function(a,o){if(s){t?.drop&&t.drop(a);return}try{s=!0;let r=await i.call(this,a,o);return n=setTimeout(()=>{s=!1,n=null;},e),r}catch(r){throw s=false,n&&(clearTimeout(n),n=null),r}}};var G=(e,t)=>i=>{let s=0;return async function(n,a){let o=Date.now();if(o-s<e){t?.drop&&t.drop(n);return}return s=o,await i.call(this,n,a)}};function K(e){let t,i=false,s,n=typeof e=="function";return function(a){return async function(o,r){if(i){if(typeof e=="function"){if(await e(o,r))return t}else if(o.payload===s)return t}let u=await a.call(this,o,r);return t=u,n||(s=o.payload),i=true,u}}}export{C as debounce,A as dropping,z as expanding,K as memorize,w as queue,q as retry,S as sliding,G as throttle,k as timeout};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","delay","ms","Promise","resolve","setTimeout","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.mjs","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\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 onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n 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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\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 let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\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\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): 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: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据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}\n"]}
{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","message","TimeoutError","QueueOverflowError","isFunction","fn","queue","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","buffer","currentSize","isHandling","hasNewMessage","pushMessage","handleOverflow","msg","listener","args","nextMessage","enterTime","dropping","sliding","expanding","delay","ms","resolve","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","debounce","isBlocked","result","throttle","lastExecutionTime","now","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate"],"mappings":"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","file":"index.mjs","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\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 onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n 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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\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 let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\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\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\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: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => 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: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, 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};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): 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: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据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}\n"]}
{
"name": "fastevent",
"version": "2.5.0",
"version": "2.5.1",
"description": "The Ultimate Event Trigger Library – Fast, Feature-Rich, Battle-Tested!",

@@ -5,0 +5,0 @@ "main": "dist/index.js",

+66
-65

@@ -58,3 +58,3 @@ # FastEvent

```ts
events.on('user/login', (message) => {
events.on("user/login", (message) => {
// {

@@ -76,9 +76,9 @@ // type: 'user/login', // Event name

// Publish and retain event
events.emit('config/theme', { dark: true }, true);
events.emit("config/theme", { dark: true }, true);
// Equivalent to
events.emit('config/theme', { dark: true }, { retain: true });
events.emit("config/theme", { dark: true }, { retain: true });
// Subsequent subscribers immediately receive the retained value
events.on('config/theme', (message) => {
console.log('Theme:', message.payload); // Immediately outputs: { dark: true }
events.on("config/theme", (message) => {
console.log("Theme:", message.payload); // Immediately outputs: { dark: true }
});

@@ -91,4 +91,4 @@ ```

- The default event hierarchy delimiter is `/`, which can be modified via `options.delimiter`
- Two types of wildcards are supported when subscribing to events: `*` matches a single path level, `**` matches multiple path levels (only used at the end of event names)
- The default event hierarchy delimiter is `/`, which can be modified via `options.delimiter`
- Two types of wildcards are supported when subscribing to events: `*` matches a single path level, `**` matches multiple path levels (only used at the end of event names)

@@ -99,14 +99,14 @@ ```typescript

// Match user/*/login
events.on('user/*/login', (message) => {
console.log('Any user type login:', message.payload);
events.on("user/*/login", (message) => {
console.log("Any user type login:", message.payload);
});
// Match all events under user
events.on('user/**', (message) => {
console.log('All user-related events:', message.payload);
events.on("user/**", (message) => {
console.log("All user-related events:", message.payload);
});
// Trigger events
events.emit('user/admin/login', { id: 1 }); // Both handlers will be called
events.emit('user/admin/profile/update', { name: 'New' }); // Only the ** handler will be called
events.emit("user/admin/login", { id: 1 }); // Both handlers will be called
events.emit("user/admin/profile/update", { name: "New" }); // Only the ** handler will be called
```

@@ -120,3 +120,3 @@

// Return a subscriber object to remove the listener, recommended approach
const subscriber = events.on('user/login', handler);
const subscriber = events.on("user/login", handler);
subscriber.off();

@@ -127,11 +127,11 @@

// Remove all listeners for a specific event
events.off('user/login');
events.off("user/login");
// Remove a specific listener for a specific event
events.off('user/login', listener);
events.off("user/login", listener);
// Remove listeners using wildcard patterns
events.off('user/*');
events.off("user/*");
// Remove all listeners
events.offAll();
// Remove all listeners under a specific prefix
events.offAll('user');
events.offAll("user");
```

@@ -149,11 +149,11 @@

// Create a user-related scope
const userScope = events.scope('user');
const userScope = events.scope("user");
// The following two approaches are equivalent:
userScope.on('login', handler);
events.on('user/login', handler);
userScope.on("login", handler);
events.on("user/login", handler);
// The following two approaches are also equivalent:
userScope.emit('login', data);
events.emit('user/login', data);
userScope.emit("login", data);
events.emit("user/login", data);

@@ -174,6 +174,6 @@ // Clear all listeners in the scope

// Wait for login event with a 5-second timeout
const userData = await events.waitFor('user/login', 5000);
console.log('User logged in:', userData);
const userData = await events.waitFor("user/login", 5000);
console.log("User logged in:", userData);
} catch (error) {
console.log('Login wait timeout');
console.log("Login wait timeout");
}

@@ -184,3 +184,3 @@ }

// Later trigger the login event
events.emit('user/login', { id: 1, name: 'Alice' });
events.emit("user/login", { id: 1, name: "Alice" });
```

@@ -196,4 +196,4 @@

// Called when a new listener is added
onAddListener: (type, listener, options) => {
console.log('Added new listener:', type);
onAddBeforeListener: (type, listener, options) => {
console.log("Added new listener:", type);
// Return false to prevent the listener from being added

@@ -203,13 +203,14 @@ return false;

// For example: transfer events starting with `@` to another FastEvent
if (type.startsWith('@')) {
if (type.startsWith("@")) {
return otherEvents.on(type, listener, options);
}
},
onAddBeforeListener
// Called when a listener is removed
onRemoveListener: (type, listener) => {
console.log('Removed listener:', type);
console.log("Removed listener:", type);
},
// Called when listeners are cleared
onClearListeners: () => {
console.log('All listeners cleared');
console.log("All listeners cleared");
},

@@ -222,3 +223,3 @@ // Called when a listener throws an error

onBeforeExecuteListener: (message, args) => {
console.log('Before executing event listener');
console.log("Before executing event listener");
// Return false to prevent listener execution

@@ -229,3 +230,3 @@ return false;

// For example: forward events starting with `@` to another FastEvent
if (type.startsWith('@')) {
if (type.startsWith("@")) {
return otherEvents.emit(message.type);

@@ -236,3 +237,3 @@ }

onAfterExecuteListener: (message, returns, listeners) => {
console.log('After executing event listener');
console.log("After executing event listener");
// Can intercept and modify return values here

@@ -250,3 +251,3 @@ },

```typescript
import { race } from 'fastevent/executors';
import { race } from "fastevent/executors";
const events = new FastEvent({

@@ -256,6 +257,6 @@ executor: race(),

events.on('task/start', async () => {
events.on("task/start", async () => {
/* Time-consuming operation 1 */
});
events.on('task/start', async () => {
events.on("task/start", async () => {
/* Time-consuming operation 2 */

@@ -265,3 +266,3 @@ });

// The two listeners will execute in parallel, returning the fastest result
await events.emitAsync('task/start');
await events.emitAsync("task/start");
```

@@ -288,3 +289,3 @@

```typescript
import { queue } from 'fastevent/pipes';
import { queue } from "fastevent/pipes";
const events = new FastEvent();

@@ -294,5 +295,5 @@

events.on(
'data/update',
"data/update",
(data) => {
console.log('Processing data:', data);
console.log("Processing data:", data);
},

@@ -325,3 +326,3 @@ {

// Subscription forwarding rule: when event name starts with `@/`, forward subscription to another `FastEvent` instance
if (type.startsWith('@/')) {
if (type.startsWith("@/")) {
return otherEmitter.on(type.substring(2), listener, options);

@@ -332,3 +333,3 @@ }

// Event forwarding rule: when event name starts with `@/`, publish to another `FastEvent` instance
if (message.type.startsWith('@/')) {
if (message.type.startsWith("@/")) {
message.type = message.type.substring(2);

@@ -340,7 +341,7 @@ return otherEmitter.emit(message, args);

const events: any[] = [];
otherEmitter.on('data', ({ payload }) => {
otherEmitter.on("data", ({ payload }) => {
events.push(payload);
});
// Subscribe to otherEmitter's data event
emitter.on('@/data', ({ payload }) => {
emitter.on("@/data", ({ payload }) => {
expect(payload).toBe(1);

@@ -350,3 +351,3 @@ events.push(payload);

// Publish data event to otherEmitter
const subscriber = emitter.emit('@/data', 1);
const subscriber = emitter.emit("@/data", 1);
subscriber.off();

@@ -364,20 +365,20 @@ ```

meta: {
version: '1.0',
environment: 'production',
version: "1.0",
environment: "production",
},
});
events.on('user/login', (message) => {
console.log('Event data:', message.payload);
console.log('Metadata:', message.meta); // Includes type, version, and environment
events.on("user/login", (message) => {
console.log("Event data:", message.payload);
console.log("Metadata:", message.meta); // Includes type, version, and environment
});
// Using scope-level metadata
const userScope = events.scope('user', {
meta: { domain: 'user' },
const userScope = events.scope("user", {
meta: { domain: "user" },
});
// Add specific metadata when publishing events
userScope.emit(
'login',
{ userId: '123' },
"login",
{ userId: "123" },
{

@@ -389,4 +390,4 @@ meta: { timestamp: Date.now() }, // Event-specific metadata

// Listeners receive merged metadata
userScope.on('login', (message) => {
console.log('Metadata:', message.meta);
userScope.on("login", (message) => {
console.log("Metadata:", message.meta);
});

@@ -402,5 +403,5 @@ ```

interface ComplexEvents {
'data/number': number;
'data/string': string;
'data/object': { value: any };
"data/number": number;
"data/string": string;
"data/object": { value: any };
}

@@ -411,3 +412,3 @@

// TypeScript ensures type safety for each event
events.on('data/number', (message) => {
events.on("data/number", (message) => {
const sum = message.payload + 1; // payload type is number

@@ -417,5 +418,5 @@ });

// All event emissions are type-checked
events.emit('data/number', 42);
events.emit('data/string', 'hello');
events.emit('data/object', { value: true });
events.emit("data/number", 42);
events.emit("data/string", "hello");
events.emit("data/object", { value: true });
```

@@ -422,0 +423,0 @@

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display