UNPKG

minimal-promise-pool

Version:

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

1 lines 4.13 kB
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["export class PromisePool<T = unknown> {\n private readonly promises: Set<Promise<T>>;\n private waitingPromise: Promise<void> | undefined;\n private resumeFunction: (() => void) | undefined;\n private _concurrency: number;\n private _queuedPromiseCount: number;\n\n constructor(concurrency = 10) {\n this._concurrency = concurrency;\n this._queuedPromiseCount = 0;\n this.promises = new Set();\n }\n\n get workingPromiseCount(): number {\n return this.promises.size;\n }\n\n get concurrency(): number {\n return this._concurrency;\n }\n\n set concurrency(concurrency: number) {\n const oldConcurrency = this._concurrency;\n this._concurrency = concurrency;\n if (concurrency > oldConcurrency) {\n this.resume();\n }\n }\n\n get queuedPromiseCount(): number {\n return this._queuedPromiseCount;\n }\n\n promiseAll(): Promise<T[]> {\n return Promise.all(this.promises.values());\n }\n\n promiseAllSettled(): Promise<PromiseSettledResult<T>[]> {\n return Promise.all(\n [...this.promises.values()].map((promise: Promise<T>) =>\n promise\n .then((value) => ({ status: 'fulfilled', value }) as PromiseFulfilledResult<T>)\n .catch((error: unknown) => ({ status: 'rejected', reason: error }) as PromiseRejectedResult)\n )\n );\n }\n\n async run(startPromise: () => Promise<T>): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n await this.privateRunAndWaitForReturnValue(startPromise);\n }\n\n async runAndWaitForReturnValue<R extends T>(startPromise: () => Promise<R>): Promise<R> {\n const [promise] = await this.privateRunAndWaitForReturnValue(startPromise);\n return await promise;\n }\n\n private async privateRunAndWaitForReturnValue<R extends T>(startPromise: () => Promise<R>): Promise<[Promise<R>]> {\n this._queuedPromiseCount++;\n while (this.promises.size >= this._concurrency) {\n this.waitingPromise ??= new Promise<void>((resolve) => {\n this.resumeFunction = resolve;\n });\n await this.waitingPromise;\n }\n const promise = startPromise().finally(() => {\n this._queuedPromiseCount--;\n this.promises.delete(promise);\n this.resume();\n });\n this.promises.add(promise);\n // Don't return the promise as is since run() wants to ignore the return value.\n return [promise];\n }\n\n private resume(): void {\n if (!this.resumeFunction) return;\n\n this.resumeFunction();\n this.waitingPromise = undefined;\n this.resumeFunction = undefined;\n }\n}\n"],"names":["constructor","concurrency","this","_concurrency","_queuedPromiseCount","promises","Set","workingPromiseCount","size","oldConcurrency","resume","queuedPromiseCount","promiseAll","Promise","all","values","promiseAllSettled","map","promise","then","value","status","catch","error","reason","run","startPromise","privateRunAndWaitForReturnValue","runAndWaitForReturnValue","waitingPromise","resolve","resumeFunction","finally","delete","add","undefined"],"mappings":"iCAAO,MAOLA,WAAAA,CAAYC,EAAc,IACxBC,KAAKC,aAAeF,EACpBC,KAAKE,oBAAsB,EAC3BF,KAAKG,SAAW,IAAIC,GACtB,CAEA,uBAAIC,GACF,OAAOL,KAAKG,SAASG,IACvB,CAEA,eAAIP,GACF,OAAOC,KAAKC,YACd,CAEA,eAAIF,CAAYA,GACd,MAAMQ,EAAiBP,KAAKC,aAC5BD,KAAKC,aAAeF,EAChBA,EAAcQ,GAChBP,KAAKQ,QAET,CAEA,sBAAIC,GACF,OAAOT,KAAKE,mBACd,CAEAQ,UAAAA,GACE,OAAOC,QAAQC,IAAIZ,KAAKG,SAASU,SACnC,CAEAC,iBAAAA,GACE,OAAOH,QAAQC,IACb,IAAIZ,KAAKG,SAASU,UAAUE,KAAKC,GAC/BA,EACGC,MAAMC,IAAW,CAAEC,OAAQ,YAAaD,YACxCE,OAAOC,IAAoB,CAAEF,OAAQ,WAAYG,OAAQD,QAGlE,CAEA,SAAME,CAAIC,SAEFxB,KAAKyB,gCAAgCD,EAC7C,CAEA,8BAAME,CAAsCF,GAC1C,MAAOR,SAAiBhB,KAAKyB,gCAAgCD,GAC7D,aAAaR,CACf,CAEA,qCAAcS,CAA6CD,GAEzD,IADAxB,KAAKE,sBACEF,KAAKG,SAASG,MAAQN,KAAKC,cAChCD,KAAK2B,iBAAmB,IAAIhB,SAAeiB,IACzC5B,KAAK6B,eAAiBD,WAElB5B,KAAK2B,eAEb,MAAMX,EAAUQ,IAAeM,SAAQ,KACrC9B,KAAKE,sBACLF,KAAKG,SAAS4B,OAAOf,GACrBhB,KAAKQ,YAIP,OAFAR,KAAKG,SAAS6B,IAAIhB,GAEX,CAACA,EACV,CAEQR,MAAAA,GACDR,KAAK6B,iBAEV7B,KAAK6B,iBACL7B,KAAK2B,oBAAiBM,EACtBjC,KAAK6B,oBAAiBI,EACxB"}