throttlers
Version:
[](https://www.npmjs.com/package/throttlers) [](https://github.com/havelessbemore/throttlers/graphs/commit-activity) [=>t in o?p(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var R=(o,t)=>{for(var e in t)p(o,e,{get:t[e],enumerable:!0})},q=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of A(t))!S.call(o,n)&&n!==e&&p(o,n,{get:()=>t[n],enumerable:!(s=k(t,n))||s.enumerable});return o};var C=o=>q(p({},"__esModule",{value:!0}),o);var r=(o,t,e)=>b(o,typeof t!="symbol"?t+"":t,e);var v={};R(v,{FixedWindowStrategy:()=>l,FixedWindowThrottler:()=>m,LeakyBucketStrategy:()=>u,LeakyBucketThrottler:()=>f,LinearStrategy:()=>c,LinearThrottler:()=>d,SlidingWindowStrategy:()=>y,SlidingWindowThrottler:()=>g,StrategyThrottler:()=>i,TimeoutError:()=>T.TimeoutError,TokenBucketStrategy:()=>h,TokenBucketThrottler:()=>w});module.exports=C(v);var T=require("wait-utils");var x=require("wait-utils");var i=class{constructor({strategy:t}){r(this,"strategy");this.strategy=t}tryAcquire(){return this.strategy.tryAcquire().success}acquire({signal:t,timeout:e}={}){return(0,x.poll)(s=>{let{retryAfterMs:n,success:a}=this.strategy.tryAcquire();s.delay=n,s.stop=a},{delay:0,signal:t,timeout:e})}};var l=class{constructor({duration:t,limit:e}){r(this,"duration");r(this,"limit");r(this,"windowEnd");r(this,"count");if(t<0)throw new RangeError("Invalid duration");if(e<1)throw new RangeError("Invalid limit");this.count=0,this.duration=t,this.limit=e,this.windowEnd=0}tryAcquire(){let t=performance.now();return t>=this.windowEnd&&(this.windowEnd=t+this.duration,this.count=0),this.count+1>this.limit?{success:!1,retryAfterMs:this.windowEnd-t}:(++this.count,{success:!0})}},m=class extends i{constructor(t){super({strategy:new l(t)})}};var u=class{constructor({capacity:t,leakRate:e}){r(this,"capacity");r(this,"leakedAt");r(this,"leakRate");r(this,"tokens");if(t<1)throw new RangeError("Invalid capacity");if(e<=0)throw new RangeError("Invalid leak rate");this.capacity=t,this.leakedAt=performance.now(),this.leakRate=e,this.tokens=0}tryAcquire(){let t=performance.now(),s=(t-this.leakedAt)/1e3*this.leakRate;if(this.tokens=Math.max(0,this.tokens-s),this.leakedAt=t,this.tokens>this.capacity-1){let a=1e3*(this.tokens-this.capacity+1)/this.leakRate;return{success:!1,retryAfterMs:Math.max(1,a)}}return++this.tokens,{success:!0}}},f=class extends i{constructor(t){super({strategy:new u(t)})}};var c=class{constructor({duration:t}){r(this,"duration");r(this,"slot");if(t<0)throw new RangeError("Duration must be non-negative");this.duration=t,this.slot=0}tryAcquire(){let t=performance.now();return t<this.slot?{success:!1,retryAfterMs:this.slot-t}:(this.slot=t+this.duration,{success:!0})}},d=class extends i{constructor(t){super({strategy:new c(t)})}};var y=class{constructor({duration:t,limit:e}){r(this,"duration");r(this,"index");r(this,"limit");r(this,"slots");if(t<0)throw new RangeError("Invalid duration");if(!Number.isInteger(e)||e<1)throw new RangeError("Invalid limit");this.duration=t,this.index=0,this.limit=e,this.slots=new Array(e).fill(0)}tryAcquire(){let t=performance.now();return t<this.slots[this.index]?{success:!1,retryAfterMs:this.slots[this.index]-t}:(this.slots[this.index]=t+this.duration,this.index=(this.index+1)%this.limit,{success:!0})}},g=class extends i{constructor(t){super({strategy:new y(t)})}};var h=class{constructor({capacity:t,refillRate:e}){r(this,"capacity");r(this,"refilledAt");r(this,"refillRate");r(this,"tokens");if(t<1)throw new RangeError("Invalid capacity");if(e<=0)throw new RangeError("Invalid refill rate");this.capacity=t,this.refilledAt=performance.now(),this.refillRate=e,this.tokens=t}tryAcquire(){let t=performance.now(),s=(t-this.refilledAt)/1e3*this.refillRate;if(this.tokens=Math.min(this.capacity,this.tokens+s),this.refilledAt=t,this.tokens<1){let a=1e3*(1-this.tokens)/this.refillRate;return{success:!1,retryAfterMs:Math.max(1,a)}}return--this.tokens,{success:!0}}},w=class extends i{constructor(t){super({strategy:new h(t)})}};
//# sourceMappingURL=index.cjs.map