UNPKG

rate-limitation

Version:
2 lines (1 loc) 1.08 kB
"use strict";class Deferred{constructor(e){this.promise,this.resolve,this.reject,this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t}),void 0!==e&&this.resolve(e)}}class RateLimiter{constructor(e,t={}){this.limit,this.waitingQueue=[],this.processingQueue=[],this.onQueueEmpty,this.limit=e,this.onQueueEmpty=t.onQueueEmpty}enqueue(e,t,...s){const i={def:new Deferred,func:e.bind(t,...s)};return this.waitingQueue.push(i),this.processingQueue.length<this.limit&&this._processRequest(),i.def.promise}_onDequeue(){this.waitingQueue.length?this._processRequest():this.onQueueEmpty&&this.onQueueEmpty()}_processRequest(){const e=this.waitingQueue.shift();let t;this.processingQueue.push(e);try{t=e.func()}catch(t){e.def.reject(t),this._dequeueRequest(e)}t&&"function"==typeof t.then?t.then(t=>{e.def.resolve(t),this._dequeueRequest(e)}).catch(t=>{e.def.reject(t),this._dequeueRequest(e)}):(e.def.resolve(t),this._dequeueRequest(e))}_dequeueRequest(e){const t=this.processingQueue.findIndex(t=>t===e);this.processingQueue.splice(t,1),this._onDequeue()}}module.exports=RateLimiter;