UNPKG

throttlers

Version:

[![Version](https://img.shields.io/npm/v/throttlers.svg)](https://www.npmjs.com/package/throttlers) [![Maintenance](https://img.shields.io/maintenance/yes/2025)](https://github.com/havelessbemore/throttlers/graphs/commit-activity) [![License](https://img.

3 lines 3.73 kB
/*! @license throttlers | MIT | https://github.com/havelessbemore/throttlers */ var w=Object.defineProperty;var x=(o,t,r)=>t in o?w(o,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):o[t]=r;var e=(o,t,r)=>x(o,typeof t!="symbol"?t+"":t,r);import{TimeoutError as G}from"wait-utils";import{poll as T}from"wait-utils";var i=class{constructor({strategy:t}){e(this,"strategy");this.strategy=t}tryAcquire(){return this.strategy.tryAcquire().success}acquire({signal:t,timeout:r}={}){return T(s=>{let{retryAfterMs:h,success:n}=this.strategy.tryAcquire();s.delay=h,s.stop=n},{delay:0,signal:t,timeout:r})}};var a=class{constructor({duration:t,limit:r}){e(this,"duration");e(this,"limit");e(this,"windowEnd");e(this,"count");if(t<0)throw new RangeError("Invalid duration");if(r<1)throw new RangeError("Invalid limit");this.count=0,this.duration=t,this.limit=r,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})}},p=class extends i{constructor(t){super({strategy:new a(t)})}};var l=class{constructor({capacity:t,leakRate:r}){e(this,"capacity");e(this,"leakedAt");e(this,"leakRate");e(this,"tokens");if(t<1)throw new RangeError("Invalid capacity");if(r<=0)throw new RangeError("Invalid leak rate");this.capacity=t,this.leakedAt=performance.now(),this.leakRate=r,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 n=1e3*(this.tokens-this.capacity+1)/this.leakRate;return{success:!1,retryAfterMs:Math.max(1,n)}}return++this.tokens,{success:!0}}},m=class extends i{constructor(t){super({strategy:new l(t)})}};var u=class{constructor({duration:t}){e(this,"duration");e(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})}},f=class extends i{constructor(t){super({strategy:new u(t)})}};var c=class{constructor({duration:t,limit:r}){e(this,"duration");e(this,"index");e(this,"limit");e(this,"slots");if(t<0)throw new RangeError("Invalid duration");if(!Number.isInteger(r)||r<1)throw new RangeError("Invalid limit");this.duration=t,this.index=0,this.limit=r,this.slots=new Array(r).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})}},d=class extends i{constructor(t){super({strategy:new c(t)})}};var y=class{constructor({capacity:t,refillRate:r}){e(this,"capacity");e(this,"refilledAt");e(this,"refillRate");e(this,"tokens");if(t<1)throw new RangeError("Invalid capacity");if(r<=0)throw new RangeError("Invalid refill rate");this.capacity=t,this.refilledAt=performance.now(),this.refillRate=r,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 n=1e3*(1-this.tokens)/this.refillRate;return{success:!1,retryAfterMs:Math.max(1,n)}}return--this.tokens,{success:!0}}},g=class extends i{constructor(t){super({strategy:new y(t)})}};export{a as FixedWindowStrategy,p as FixedWindowThrottler,l as LeakyBucketStrategy,m as LeakyBucketThrottler,u as LinearStrategy,f as LinearThrottler,c as SlidingWindowStrategy,d as SlidingWindowThrottler,i as StrategyThrottler,G as TimeoutError,y as TokenBucketStrategy,g as TokenBucketThrottler}; //# sourceMappingURL=index.js.map