UNPKG

push-it-to-the-limit

Version:

Delay function wrappers for common purposes. Throttle, debounce and ratelimit with promises

3 lines (2 loc) 5.41 kB
"use strict";var R=Object.defineProperty,G=Object.defineProperties,K=Object.getOwnPropertyDescriptor,X=Object.getOwnPropertyDescriptors,Z=Object.getOwnPropertyNames,P=Object.getOwnPropertySymbols;var v=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var S=(t,e,r)=>e in t?R(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,n=(t,e)=>{for(var r in e||(e={}))v.call(e,r)&&S(t,r,e[r]);if(P)for(var r of P(e))$.call(e,r)&&S(t,r,e[r]);return t},I=(t,e)=>G(t,X(e));var ee=(t,e)=>{for(var r in e)R(t,r,{get:e[r],enumerable:!0})},te=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Z(e))!v.call(t,o)&&o!==r&&R(t,o,{get:()=>e[o],enumerable:!(i=K(e,o))||i.enumerable});return t};var re=t=>te(R({},"__esModule",{value:!0}),t);var _=(t,e,r)=>(S(t,typeof e!="symbol"?e+"":e,r),r);var me={};ee(me,{DEFAULT_DELAY:()=>z,Limiter:()=>y,REJECTED:()=>k,REJECTED_ON_CANCEL:()=>j,adapter:()=>l,assert:()=>H,assertFn:()=>J,complete:()=>b,debounce:()=>x,delay:()=>M,dropTimeout:()=>m,fail:()=>F,failOnCancel:()=>O,normalizeDelay:()=>W,ratelimit:()=>U,repeat:()=>Y,stabilize:()=>B,throttle:()=>Q});module.exports=re(me);function b(t,e,r,i){t(e.call(i,...r))}var k="Rejected";function F(t,e=k){t(new Error(e))}var j="Rejected on cancel";function O(t){F(t,j)}var z=0,oe=(t={})=>n({delay:z},t);function l(t){return(e,r,i)=>{J(e);let o=oe(i);return typeof r=="number"?o=I(n({},o),{delay:r}):Array.isArray(r)?o=I(n({},o),{limit:r}):typeof r=="object"&&(o=typeof r.period=="number"&&typeof r.count=="number"?I(n({},o),{delay:r}):n(n({},o),r)),t(e,o)}}function H(t,e="Assertion error"){if(!t)throw new Error(e)}function J(t){H(typeof t=="function","Target must be a function")}function m(t){t&&clearTimeout(t)}function W(t){return t===void 0?[]:(Array.isArray(t)?t:[t]).map(r=>typeof r=="number"?{period:r,count:1}:r)}var y=class t{constructor(e){_(this,"limits");return this.limits=e.reduce((r,i)=>i instanceof t?r.concat(i.limits):[...r,I(n({},i),{rest:i.count,ttl:0})],[]),this}decrease(){this.limits.forEach(e=>{e.rest+=-1})}reset(){this.limits.forEach(t.refreshLimit)}resetTtl(){this.limits.forEach(t.refreshTtl)}isAllowed(){return!this.limits.some(({rest:e})=>e<1)}getNextDelay(){let e=0,r=this.limits;for(let i of r)i.rest<1&&i.ttl>e&&(e=i.ttl);return e-Date.now()}getNextQueueSize(){return Math.min(...this.limits.map(({rest:e})=>e))}static refreshLimit(e){return(e.ttl===void 0||e.ttl<Date.now())&&(e.rest=e.count,e.ttl=Date.now()+e.period),e}static refreshTtl(e){e.ttl=Date.now()+e.period}};var ie={leading:!1,trailing:!0},x=l((t,e)=>{let{delay:r,limit:i,context:o,rejectOnCancel:s,maxWait:f,leading:T,order:h,limiter:d}=n(n({},ie),e),p=d||new y(W(i||r)),c=[],a=[],u=()=>{a.forEach(L=>L.complete()),a.length=0},E,A,D,g,C=(...L)=>{m(E),c.push(L),g===void 0&&(p.reset(),g=p.getNextQueueSize());let q=T&&g>0;if((g>0||D===void 0)&&(p.decrease(),g-=1,D=new Promise((N,V)=>{a.push({complete:()=>b(N,t,h==="fifo"?c.shift():c.pop(),o),fail:O.bind(void 0,V)})})),p.resetTtl(),E=setTimeout(C.flush,p.getNextDelay()),q){let N=D;return D=void 0,u(),N}return f&&!A&&(A=setTimeout(C.flush,f)),D};return C.flush=()=>{p.reset(),D=void 0,g=void 0,u(),C.cancel()},C.cancel=()=>{m(E),m(A),g=void 0,D=void 0,E=void 0,A=void 0,c.length=0,s&&a.forEach(L=>L.fail()),a.length=0},C});var M=l((t,e)=>{let r=typeof e.delay=="number"?{period:e.delay,count:Number.POSITIVE_INFINITY}:e.delay,i=typeof e.delay=="number"?e.delay:void 0;return x(t,I(n({maxWait:i},e),{delay:r,order:"fifo"}))});var U=l((t,e)=>{let r,{delay:i,limit:o,context:s,rejectOnCancel:f,limiter:T}=e,h=T||new y(W(o||i)),d=[],p=(a,u)=>{m(r),u.reset(),ne(a,u),r=pe(a,u,p)},c=(...a)=>new Promise((u,E)=>{d.push({complete:b.bind(void 0,u,t,a,s),fail:O.bind(void 0,E)}),p(d,h)});return c.flush=()=>{d.forEach(a=>a.complete()),c.cancel()},c.cancel=()=>{f&&d.forEach(a=>a.fail()),d.length=0,m(r)},c});function ne(t,e){var r;for(;t.length>0&&e.isAllowed();)e.decrease(),(r=t.shift())==null||r.complete()}function ae(t,e,r){return setTimeout(()=>r(t,e),e.getNextDelay())}function pe(t,e,r){return t.length>0?ae(t,e,r):void 0}function w(t,e,r,i){if(typeof t=="object"){let{target:s,delay:f,context:T,limit:h}=t;return w(s,f,T,h)}le(t,e);let o=(...s)=>{let{timeout:f,target:T,limit:h,context:d}=o,p=se(h);return clearTimeout(f),(p===void 0||p>0)&&(o.limit=p,o.args=s,o.timeout=setTimeout(o.bind(o,...s),e)),T.call(d,...s)};return o.target=t,o.delay=e,o.limit=i,o.context=r,o}function le(t,e){if(typeof t!="function")throw new TypeError("repeater: target must be callable");if(!e)throw new TypeError("repeater: delay must not be empty")}function se(t){return typeof t=="number"?t-1:void 0}var Y=l((t,e)=>{var o,s;let r=I(n({},e),{target:t,delay:typeof e.delay=="number"?e.delay:e.delay.period,limit:Array.isArray(e.limit)?e.limit[0].period:(o=e.limit)==null?void 0:o.period}),i=(((s=w)==null?void 0:s.default)||w)(r);return i.cancel=()=>{m(i.timeout)},i.flush=()=>{t.call(i.context,i.args),m(i.timeout)},i});var B=l((t,e)=>{let r=typeof e.delay=="number"?e.delay:void 0;return x(t,n({maxWait:r},e))});var Q=l((t,e)=>{let r=typeof e.delay=="number"?e.delay:void 0;return x(t,n({leading:!0,maxWait:r},e))});0&&(module.exports={DEFAULT_DELAY,Limiter,REJECTED,REJECTED_ON_CANCEL,adapter,assert,assertFn,complete,debounce,delay,dropTimeout,fail,failOnCancel,normalizeDelay,ratelimit,repeat,stabilize,throttle}); //# sourceMappingURL=index.cjs.map