fastevent 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,7 +49,8 @@ type QueueListenerPipeOptions = {
49
49
  expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
50
50
  overflow?: FastQueueOverflows;
51
51
  lifetime?: number;
52
- onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
52
+ onPush?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
53
+ onPop?: (messages: [FastEventMessage, number][], hasNew: boolean) => [FastEventMessage, number] | undefined;
53
54
  onDrop?: (message: FastEventMessage) => void;
54
55
  };
55
56
  declare const queue: (options?: QueueListenerPipeOptions) => FastListenerPipe;
@@ -49,7 +49,8 @@ type QueueListenerPipeOptions = {
49
49
  expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
50
50
  overflow?: FastQueueOverflows;
51
51
  lifetime?: number;
52
- onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
52
+ onPush?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void;
53
+ onPop?: (messages: [FastEventMessage, number][], hasNew: boolean) => [FastEventMessage, number] | undefined;
53
54
  onDrop?: (message: FastEventMessage) => void;
54
55
  };
55
56
  declare const queue: (options?: QueueListenerPipeOptions) => FastListenerPipe;
@@ -1,2 +1,2 @@
1
- 'use strict';var O=Object.defineProperty;var n=(t,o)=>O(t,"name",{value:o,configurable:true});var _=class _ extends Error{constructor(o){super(o);}};n(_,"FastEventError");var w=_,P=class P extends w{};n(P,"TimeoutError");var h=P;var z=class z extends w{};n(z,"QueueOverflowError");var y=z;function u(t){return t&&typeof t=="function"}n(u,"isFunction");var F=n(t=>{let{lifetime:o,size:c,overflow:r,maxExpandSize:i,expandOverflow:a,onEnter:s,onDrop:e}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),l=[],p=c,x=false,v=n(f=>{u(s)?s(f,l):l.push(o>0?[f,Date.now()]:[f,0]);},"pushMessage"),T=n(f=>{switch(l.length>=i&&r==="expand"?a:r){case "drop":return u(e)&&e(f),false;case "expand":return p=Math.min(p+c,i),v(f),true;case "slide":let d=l.shift();return u(e)&&d&&e(d[0]),v(f),true;case "throw":throw u(e)&&e(f),new y;default:return false}},"handleOverflow");return f=>async function(m,d){if(x){l.length<p?v(m):T(m);return}x=true;try{for(await f.call(this,m,d);l.length>0;){let[S,D]=l.shift()||[void 0,0];if(S){if(o>0&&Date.now()-D>o){u(e)&&e(S);continue}await f.call(this,S,d);}}}finally{x=false;}}},"queue"),H=n((t=10)=>F({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>F({size:t,overflow:"slide"}),"sliding"),J=n(t=>F(Object.assign({},t,{overflow:"expand"})),"expanding");var X=n((t,o)=>{let{interval:c=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,l;for(;e<=t;)try{return await i.call(this,a,s)}catch(p){if(l=p,e<t)await new Promise(x=>{setTimeout(x,u(c)?c(e):c);}),e++;else throw u(r)&&r(a,l),l}}},"retry");var g=n((t,o)=>c=>async function(r,i){let a,s=new Promise((l,p)=>{a=setTimeout(()=>{o!==void 0?l(o):p(new h);},t);}),e=Promise.resolve(c.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var V=n((t,o)=>c=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await c.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var tt=n((t,o)=>c=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await c.call(this,i,a)}},"throttle");function ot(t){let o,c=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(c){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let l=await a.call(this,s,e);return o=l,i||(r=s.payload),c=true,l}}}n(ot,"memorize");exports.debounce=V;exports.dropping=H;exports.expanding=J;exports.memorize=ot;exports.queue=F;exports.retry=X;exports.sliding=G;exports.throttle=tt;exports.timeout=g;//# sourceMappingURL=index.js.map
1
+ 'use strict';var R=Object.defineProperty;var n=(t,o)=>R(t,"name",{value:o,configurable:true});var F=class F extends Error{constructor(o){super(o);}};n(F,"FastEventError");var y=F,T=class T extends y{};n(T,"TimeoutError");var v=T;var D=class D extends y{};n(D,"QueueOverflowError");var P=D;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var M=n(t=>{let{lifetime:o,size:l,overflow:r,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:e,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],x=l,S=false,m=false,_=n(u=>{p(s)?s(u,c):c.push(o>0?[u,Date.now()]:[u,0]);},"pushMessage"),O=n(u=>{switch(c.length>=i&&r==="expand"?a:r){case "drop":return p(e)&&e(u),false;case "expand":return x=Math.min(x+l,i),_(u),true;case "slide":let d=c.shift();return p(e)&&d&&e(d[0]),_(u),true;case "throw":throw p(e)&&e(u),new P;default:return false}},"handleOverflow");return u=>async function(h,d){if(m=true,S){c.length<x?_(h):O(h);return}S=true;try{for(await u.call(this,h,d);c.length>0;){let w,z;if(m&&p(f)?([w,z]=f(c,m)||[void 0,0],m=!1):[w,z]=c.shift()||[void 0,0],w){if(o>0&&Date.now()-z>o){p(e)&&e(w);continue}await u.call(this,w,d);}}}finally{S=false;}}},"queue"),E=n((t=10)=>M({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>M({size:t,overflow:"slide"}),"sliding"),J=n(t=>M(Object.assign({},t,{overflow:"expand"})),"expanding");var Y=n((t,o)=>{let{interval:l=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,f;for(;e<=t;)try{return await i.call(this,a,s)}catch(c){if(f=c,e<t)await new Promise(x=>{setTimeout(x,p(l)?l(e):l);}),e++;else throw p(r)&&r(a,f),f}}},"retry");var Q=n((t,o)=>l=>async function(r,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{o!==void 0?f(o):c(new v);},t);}),e=Promise.resolve(l.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var U=n((t,o)=>l=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await l.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var nt=n((t,o)=>l=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await l.call(this,i,a)}},"throttle");function it(t){let o,l=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(l){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let f=await a.call(this,s,e);return o=f,i||(r=s.payload),l=true,f}}}n(it,"memorize");exports.debounce=U;exports.dropping=E;exports.expanding=J;exports.memorize=it;exports.queue=M;exports.retry=Y;exports.sliding=G;exports.throttle=nt;exports.timeout=Q;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onEnter","onDrop","Object","assign","buffer","currentSize","isHandling","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","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\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onEnter, onDrop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n const buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onEnter)) {\n onEnter(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","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","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","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\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (messages: [FastEventMessage, number][], hasNew: boolean) => [FastEventMessage, number] | undefined\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n let buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false\n\n const pushMessage = (message: FastEventMessage) => {\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: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n 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'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
@@ -1,2 +1,2 @@
1
- var O=Object.defineProperty;var n=(t,o)=>O(t,"name",{value:o,configurable:true});var _=class _ extends Error{constructor(o){super(o);}};n(_,"FastEventError");var w=_,P=class P extends w{};n(P,"TimeoutError");var h=P;var z=class z extends w{};n(z,"QueueOverflowError");var y=z;function u(t){return t&&typeof t=="function"}n(u,"isFunction");var F=n(t=>{let{lifetime:o,size:c,overflow:r,maxExpandSize:i,expandOverflow:a,onEnter:s,onDrop:e}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),l=[],p=c,x=false,v=n(f=>{u(s)?s(f,l):l.push(o>0?[f,Date.now()]:[f,0]);},"pushMessage"),T=n(f=>{switch(l.length>=i&&r==="expand"?a:r){case "drop":return u(e)&&e(f),false;case "expand":return p=Math.min(p+c,i),v(f),true;case "slide":let d=l.shift();return u(e)&&d&&e(d[0]),v(f),true;case "throw":throw u(e)&&e(f),new y;default:return false}},"handleOverflow");return f=>async function(m,d){if(x){l.length<p?v(m):T(m);return}x=true;try{for(await f.call(this,m,d);l.length>0;){let[S,D]=l.shift()||[void 0,0];if(S){if(o>0&&Date.now()-D>o){u(e)&&e(S);continue}await f.call(this,S,d);}}}finally{x=false;}}},"queue"),H=n((t=10)=>F({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>F({size:t,overflow:"slide"}),"sliding"),J=n(t=>F(Object.assign({},t,{overflow:"expand"})),"expanding");var X=n((t,o)=>{let{interval:c=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,l;for(;e<=t;)try{return await i.call(this,a,s)}catch(p){if(l=p,e<t)await new Promise(x=>{setTimeout(x,u(c)?c(e):c);}),e++;else throw u(r)&&r(a,l),l}}},"retry");var g=n((t,o)=>c=>async function(r,i){let a,s=new Promise((l,p)=>{a=setTimeout(()=>{o!==void 0?l(o):p(new h);},t);}),e=Promise.resolve(c.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var V=n((t,o)=>c=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await c.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var tt=n((t,o)=>c=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await c.call(this,i,a)}},"throttle");function ot(t){let o,c=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(c){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let l=await a.call(this,s,e);return o=l,i||(r=s.payload),c=true,l}}}n(ot,"memorize");export{V as debounce,H as dropping,J as expanding,ot as memorize,F as queue,X as retry,G as sliding,tt as throttle,g as timeout};//# sourceMappingURL=index.mjs.map
1
+ var R=Object.defineProperty;var n=(t,o)=>R(t,"name",{value:o,configurable:true});var F=class F extends Error{constructor(o){super(o);}};n(F,"FastEventError");var y=F,T=class T extends y{};n(T,"TimeoutError");var v=T;var D=class D extends y{};n(D,"QueueOverflowError");var P=D;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var M=n(t=>{let{lifetime:o,size:l,overflow:r,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:e,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],x=l,S=false,m=false,_=n(u=>{p(s)?s(u,c):c.push(o>0?[u,Date.now()]:[u,0]);},"pushMessage"),O=n(u=>{switch(c.length>=i&&r==="expand"?a:r){case "drop":return p(e)&&e(u),false;case "expand":return x=Math.min(x+l,i),_(u),true;case "slide":let d=c.shift();return p(e)&&d&&e(d[0]),_(u),true;case "throw":throw p(e)&&e(u),new P;default:return false}},"handleOverflow");return u=>async function(h,d){if(m=true,S){c.length<x?_(h):O(h);return}S=true;try{for(await u.call(this,h,d);c.length>0;){let w,z;if(m&&p(f)?([w,z]=f(c,m)||[void 0,0],m=!1):[w,z]=c.shift()||[void 0,0],w){if(o>0&&Date.now()-z>o){p(e)&&e(w);continue}await u.call(this,w,d);}}}finally{S=false;}}},"queue"),E=n((t=10)=>M({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>M({size:t,overflow:"slide"}),"sliding"),J=n(t=>M(Object.assign({},t,{overflow:"expand"})),"expanding");var Y=n((t,o)=>{let{interval:l=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,f;for(;e<=t;)try{return await i.call(this,a,s)}catch(c){if(f=c,e<t)await new Promise(x=>{setTimeout(x,p(l)?l(e):l);}),e++;else throw p(r)&&r(a,f),f}}},"retry");var Q=n((t,o)=>l=>async function(r,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{o!==void 0?f(o):c(new v);},t);}),e=Promise.resolve(l.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var U=n((t,o)=>l=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await l.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var nt=n((t,o)=>l=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await l.call(this,i,a)}},"throttle");function it(t){let o,l=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(l){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let f=await a.call(this,s,e);return o=f,i||(r=s.payload),l=true,f}}}n(it,"memorize");export{U as debounce,E as dropping,J as expanding,it as memorize,M as queue,Y as retry,G as sliding,nt as throttle,Q as timeout};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onEnter","onDrop","Object","assign","buffer","currentSize","isHandling","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","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\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onEnter?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onEnter, onDrop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n const buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n\n const pushMessage = (message: FastEventMessage) => {\n if (isFunction(onEnter)) {\n onEnter(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n const [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","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","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","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\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (newMessage: FastEventMessage, messages: [FastEventMessage, number][]) => void\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (messages: [FastEventMessage, number][], hasNew: boolean) => [FastEventMessage, number] | undefined\n // 当消息被丢弃时触发此回调\n onDrop?: (message: FastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n let buffer: [FastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false\n\n const pushMessage = (message: FastEventMessage) => {\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: FastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage<any>, args: FastEventListenerArgs) {\n 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'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: FastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: FastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: FastEventListener): FastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { FastEventListener, FastEventListenerArgs, FastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: FastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: FastEventListener): FastEventListener {\n return async function (message: FastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fastevent",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "The Ultimate Event Trigger Library – Fast, Feature-Rich, Battle-Tested!",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",