UNPKG

minimal-promise-pool

Version:

A minimal library for managing multiple promise instances (promise pool).

2 lines 2.59 kB
const e=Promise.resolve();var t=class{promises;resumeFunctions;resumeFunctionIndex;reservedPromiseCount;_concurrency;_queuedPromiseCount;constructor(e=10){this._concurrency=e,this._queuedPromiseCount=0,this.promises=new Set,this.resumeFunctions=[],this.resumeFunctionIndex=0,this.reservedPromiseCount=0}get workingPromiseCount(){return this.promises.size}get concurrency(){return this._concurrency}set concurrency(e){let t=this._concurrency;this._concurrency=e,e>t&&this.resume()}get queuedPromiseCount(){return this._queuedPromiseCount}promiseAll(){return Promise.all(this.promises)}promiseAllSettled(){return Promise.allSettled(this.promises)}run(t){if(this._queuedPromiseCount++,this.tryReserveCapacity()){try{this.startReservedTask(t)}catch(e){return Promise.reject(e)}return e}return this.runQueued(t)}runAndWaitForReturnValue(e){if(this._queuedPromiseCount++,this.tryReserveCapacity())try{return this.startReservedTask(e)}catch(e){return Promise.reject(e)}return this.runQueuedAndWaitForReturnValue(e)}async runQueued(e){for(;!this.tryReserveCapacity()&&(await this.waitForResume(),!this.tryKeepReservedSlot()););this.startReservedTask(e)}async runQueuedAndWaitForReturnValue(e){for(;!this.tryReserveCapacity()&&(await this.waitForResume(),!this.tryKeepReservedSlot()););return this.startReservedTask(e)}startReservedTask(e){let t;try{t=e().then(e=>(this.completeTask(t),e),e=>{throw this.completeTask(t),e})}catch(e){throw this._queuedPromiseCount--,this.reservedPromiseCount--,this.resume(),e}return this.reservedPromiseCount--,this.promises.add(t),t}tryReserveCapacity(){return this.promises.size+this.reservedPromiseCount>=this._concurrency?!1:(this.reservedPromiseCount++,!0)}waitForResume(){return new Promise(e=>{this.resumeFunctions.push(e)})}tryKeepReservedSlot(){return this.promises.size+this.reservedPromiseCount<=this._concurrency?!0:(this.reservedPromiseCount--,!1)}completeTask(e){this._queuedPromiseCount--,this.promises.delete(e),this.resume()}resume(){for(;this.hasCapacity();){let e=this.resumeFunctionIndex,t=this.resumeFunctions[e];if(!t)break;this.resumeFunctionIndex++,this.resumeFunctions[e]=void 0,this.reservedPromiseCount++,t()}this.resumeFunctionIndex===this.resumeFunctions.length?(this.resumeFunctions.length=0,this.resumeFunctionIndex=0):this.resumeFunctionIndex>=256&&this.resumeFunctionIndex>=this.resumeFunctions.length/2&&(this.resumeFunctions.splice(0,this.resumeFunctionIndex),this.resumeFunctionIndex=0)}hasCapacity(){return this.promises.size+this.reservedPromiseCount<this._concurrency}};export{t as PromisePool}; //# sourceMappingURL=index.js.map