rate-keeper
Version:
A lightweight utility for easily adding rate limiting to functions, ideal for preventing API rate limit violations.
2 lines (1 loc) • 1.51 kB
JavaScript
var M=(f,k)=>()=>(k||f((k={exports:{}}).exports,k),k.exports);var w=M((_)=>{Object.defineProperty(_,"__esModule",{value:!0});_.DropPolicy=void 0;_.default=q;var J=new Map,H;(function(f){f[f.Reject=0]="Reject",f[f.DropOldest=1]="DropOldest"})(H||(_.DropPolicy=H={}));class Z{#k=[];#f=0;push(f){this.#k.push(f)}shift(){if(this.#f>=this.#k.length)return;let f=this.#k[this.#f];if(this.#k[this.#f++]=void 0,this.#f>64&&this.#f>this.#k.length/2)this.#k=this.#k.slice(this.#f),this.#f=0;return f}remove(f){let k=this.#k.indexOf(f,this.#f);if(k!==-1){if(this.#k.splice(k,1),k<this.#f)this.#f--;return!0}return!1}get length(){return this.#k.length-this.#f}}class N{queue=new Z;timer=null;settings;constructor(f){this.settings=f}}function U(f){let{id:k}=f;if(J.has(k))return J.get(k);let B=new N(f);return J.set(k,B),B}function q(f,k,B={id:0}){let A=B.id===0?new N(B):U(B);function O(){let G=A.queue.shift();if(G)G.action();if(A.queue.length===0&&A.timer!==null)clearInterval(A.timer),A.timer=null}function F(...G){let{maxQueueSize:T,dropPolicy:V}=A.settings,W,X,Y=new Promise((C,K)=>{W=C,X=K}),I={action:()=>W(f(...G)),reject:(C)=>{X(C)},id:B.id};if(Y.cancel=(C)=>{if(A.queue.remove(I))I.reject(C||Error("Cancelled by user."))},T!==void 0&&A.queue.length>=T){if(V===H.Reject)return Promise.reject(Error("Queue is at max capacity."));else if(V===H.DropOldest)A.queue.shift()?.reject(Error("Queue is at max capacity."))}if(A.queue.push(I),A.timer===null)O(),A.timer=setInterval(O,k);return Y}return F}});export default w();