From fd3d0732185a50b7bbe2e5b2b070ed607adbfa4e Mon Sep 17 00:00:00 2001 From: Nikolay Makhonin Date: Tue, 14 Nov 2023 11:02:22 +0400 Subject: [PATCH] v1.0.1 --- dist/bundle/browser.js | 152 +++++++++++++------------ dist/lib/object-pool/ObjectPool.cjs | 13 ++- dist/lib/object-pool/ObjectPool.d.ts | 1 + dist/lib/object-pool/ObjectPool.mjs | 13 ++- dist/lib/pool/Pool.cjs | 11 +- dist/lib/pool/Pool.d.ts | 4 +- dist/lib/pool/Pool.mjs | 11 +- dist/lib/pool/PoolWrapper.cjs | 4 +- dist/lib/pool/PoolWrapper.d.ts | 2 +- dist/lib/pool/PoolWrapper.mjs | 4 +- dist/lib/pool/Pools.cjs | 11 +- dist/lib/pool/Pools.d.ts | 2 +- dist/lib/pool/Pools.mjs | 11 +- dist/lib/time-limit/TimeLimitPool.cjs | 7 +- dist/lib/time-limit/TimeLimitPool.d.ts | 3 +- dist/lib/time-limit/TimeLimitPool.mjs | 7 +- 16 files changed, 143 insertions(+), 113 deletions(-) diff --git a/dist/bundle/browser.js b/dist/bundle/browser.js index 68c7973..f5fc86b 100644 --- a/dist/bundle/browser.js +++ b/dist/bundle/browser.js @@ -9,11 +9,11 @@ if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+Str e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype, new r)}function r(t,e,n,r){ return new(n||(n=Promise))((function(o,i){ -function s(t){try{u(r.next(t))}catch(t){i(t)}} -function l(t){try{u(r.throw(t))}catch(t){i(t)}} -function u(t){var e +function s(t){try{c(r.next(t))}catch(t){i(t)}} +function l(t){try{c(r.throw(t))}catch(t){i(t)}} +function c(t){var e ;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){ -t(e)}))).then(s,l)}u((r=r.apply(t,e||[])).next()) +t(e)}))).then(s,l)}c((r=r.apply(t,e||[])).next()) }))}function o(t,e){var n,r,o,i,s={label:0, sent:function(){if(1&o[0])throw o[1];return o[1]}, trys:[],ops:[]};return i={next:l(0),throw:l(1), @@ -46,10 +46,10 @@ setTimeout:"undefined"==typeof window?setTimeout:function(){ return i.apply(window,arguments)}, clearTimeout:"undefined"==typeof window?clearTimeout:function(){ return s.apply(window,arguments)}} -;function u(t,e){return t{this._status="resolved" }),(()=>{this._status="rejected"}))}get state(){ -return this._status}}function O(t,e){ +return this._status}}function x(t,e){ return e?t.then((t=>(e(),t)),(t=>{throw e(),t})):t -}function x(t,e){return e?function(){try{ +}function O(t,e){return e?function(){try{ const n=t.apply(this,arguments) -;return p(n)?O(n,e):(e(),n)}catch(t){throw e(),t} +;return p(n)?x(n,e):(e(),n)}catch(t){throw e(),t} }:t}class S{constructor(t,e){ this._branch=null,this.order=t,this.parent=e} get branch(){if(!this._branch){ @@ -190,8 +190,8 @@ const n=t&&t.branch,r=e&&e.branch,o=n?n.length:0,i=r?r.length:0,s=o>i?o:i ;for(let t=0;t=o?0:n[o-1-t],s=t>=i?0:r[i-1-t] ;if(e!==s)return e>s?1:-1}return 0 -}(t.priority,e.priority)<0}let k=1;class A{ -constructor(){this._queue=new c({lessThanFunc:T})} +}(t.priority,e.priority)<0}let k=1;class E{ +constructor(){this._queue=new u({lessThanFunc:T})} run(t,e,n){return this._run(!1,t,e,n)} runTask(t,e,n){return this._run(!0,t,e,n)} _run(t,e,n,r){const o=new z(r),i={ @@ -214,13 +214,13 @@ e=n.item,t.delete(n)} if(e.abortSignal&&e.abortSignal.aborted)e.reject(e.abortSignal.reason);else try{ let t=e.func&&e.func(e.abortSignal) ;t&&"function"==typeof t.then&&(t=yield t),e.resolve(t) -}catch(t){e.reject(t)}}}))}}const E=function(){ -const t=new A;return function(e,n){ +}catch(t){e.reject(t)}}}))}}const A=function(){ +const t=new E;return function(e,n){ return t.run(void 0,e,n)}}();var W=function(){ function t(t){ if(this._maxSize=0,this._size=0,this._tickPromise=new z,!t)throw new Error("maxSize should be > 0") ;this._maxSize=t, -this._size=t,this._priorityQueue=new A} +this._size=t,this._priorityQueue=new E} return Object.defineProperty(t.prototype,"maxSize",{ get:function(){return this._maxSize}, enumerable:!1,configurable:!0 @@ -234,13 +234,14 @@ var e=this._size;return!(t>e)&&(this._size=e-t,!0) },Object.defineProperty(t.prototype,"releaseAvailable",{ get:function(){return this.maxSize-this._size}, enumerable:!1,configurable:!0 -}),t.prototype.release=function(t){ -var e=this._size,n=this.maxSize-e -;if(t>n&&(t=n),t>0&&(this._size=e+t,this._tickPromise)){ -var r=this._tickPromise -;this._tickPromise=null,r.resolve()}return t +}),t.prototype.release=function(t,e){ +var n=this._size,r=this.maxSize-n;if(t>r){ +if(!e)throw new Error("count (".concat(t," > maxReleaseCount (").concat(r,"))")) +;t=r}if(t>0&&(this._size=n+t,this._tickPromise)){ +var o=this._tickPromise +;this._tickPromise=null,o.resolve()}return t },t.prototype.tick=function(t){ -if(!(this._size>0))return this._tickPromise||(this._tickPromise=new z), +if(!(this._size>=this._maxSize))return this._tickPromise||(this._tickPromise=new z), function(t,e){return t?new Promise((function(n){ if(t&&t.aborted)return void f(n,t.reason);let r,o ;function i(t){o||(o=!0,r&&r(),f(n,t))} @@ -250,7 +251,7 @@ e.then((function(t){r&&r(),n(t) },t.prototype.holdWait=function(t,e,n,i){ var s=this ;if(t>this.maxSize)throw new Error("holdCount (".concat(t," > maxSize (").concat(this.maxSize,"))")) -;return i||(i=E), +;return i||(i=A), this._priorityQueue.run((function(n){ return r(s,void 0,void 0,(function(){ return o(this,(function(r){switch(r.label){case 0: @@ -258,11 +259,11 @@ return t>this._size?[4,this.tick(n)]:[3,3];case 1: return r.sent(),[4,i(e,n)];case 2: return r.sent(),[3,0];case 3: if(!this.hold(t))throw new Error("Unexpected behavior") -;return[2]}}))}))}),e,n)},t}(),F=function(){ +;return[2]}}))}))}),e,n)},t}(),R=function(){ function t(){ for(var t=[],e=0;ethis.size)return!1 },Object.defineProperty(t.prototype,"releaseAvailable",{ get:function(){return this.maxSize-this.size}, enumerable:!1,configurable:!0 -}),t.prototype.release=function(t){ -var e=this.size,n=this.maxSize-e -;if(t>n&&(t=n),t>0){ -for(var r=this._pools,o=null,i=0,s=r.length;ir){ +if(!e)throw new Error("count (".concat(t," > maxReleaseCount (").concat(r,"))")) +;t=r}if(t>0){ +for(var o=this._pools,i=null,s=0,l=o.length;sthis.maxSize)throw new Error("holdCount (".concat(t," > maxSize (").concat(this.maxSize,"))")) -;return i||(i=E), +;return i||(i=A), [4,this._priorityQueue.run((function(n){ return r(s,void 0,void 0,(function(){ return o(this,(function(r){switch(r.label){case 0: @@ -306,7 +308,7 @@ return r.sent(),i?[4,i(e,n)]:[3,3];case 2: r.sent(),r.label=3;case 3:return[3,0];case 4: if(!this.hold(t))throw new Error("Unexpected behavior") ;return[2]}}))}))}),e,n)];case 1: -return l.sent(),[2]}}))}))},t}(),R=function(){ +return l.sent(),[2]}}))}))},t}(),C=function(){ function t(t){this._pool=t} return Object.defineProperty(t.prototype,"pool",{ get:function(){return this._pool},enumerable:!1, @@ -319,7 +321,7 @@ r.sent(),r.label=2;case 2: return r.trys.push([2,,4,5]),[4,e(i)];case 3: return[2,r.sent()];case 4: return this._pool.release(t),[7];case 5:return[2]} -}))}))},t}(),C=function(){function t(t){ +}))}))},t}(),F=function(){function t(t){ this._pool=t} return Object.defineProperty(t.prototype,"size",{ get:function(){return this._pool.size}, @@ -335,8 +337,8 @@ get:function(){return this._pool.releaseAvailable },enumerable:!1,configurable:!0 }),t.prototype.hold=function(t){ return this._pool.hold(t) -},t.prototype.release=function(t){ -return this._pool.release(t) +},t.prototype.release=function(t,e){ +return this._pool.release(t,e) },t.prototype.tick=function(t){ return this._pool.tick(t) },t.prototype.holdWait=function(t,e,n,r){ @@ -364,7 +366,7 @@ null==e&&(e=0),null==n&&(n=t.length) }(),U=function(){function t(t){ var e=t.pool,n=t.availableObjects,r=t.holdObjects,o=t.destroy,i=t.create ;this._allocatePool=new W(e.maxSize), -this._pool=new F(e,this._allocatePool),this._availableObjects=n||new Q, +this._pool=new R(e,this._allocatePool),this._availableObjects=n||new Q, this._holdObjects=!0===r?new Set:r||null, this._create=i,this._destroy=o} return Object.defineProperty(t.prototype,"pool",{ @@ -382,14 +384,18 @@ var e=this._availableObjects.get(t) ;if(this._holdObjects&&e)for(var n=0,r=e.length;n implements IObjectPool; get(count: number): TObject[]; release(objects: TObject[], start?: number, end?: number): Promise; + private _release; tick(abortSignal?: IAbortSignalFast): Promise | void; getWait(count: number, priority?: Priority, abortSignal?: IAbortSignalFast, awaitPriority?: AwaitPriority): Promise; use(count: number, func: (objects: ReadonlyArray, abortSignal?: IAbortSignalFast) => Promise | TResult, priority?: Priority, abortSignal?: IAbortSignalFast, awaitPriority?: AwaitPriority): Promise; diff --git a/dist/lib/object-pool/ObjectPool.mjs b/dist/lib/object-pool/ObjectPool.mjs index bd6aebe..bbca6a0 100644 --- a/dist/lib/object-pool/ObjectPool.mjs +++ b/dist/lib/object-pool/ObjectPool.mjs @@ -37,6 +37,11 @@ class ObjectPool { return objects; } release(objects, start, end) { + return __awaiter(this, void 0, void 0, function* () { + return this._release(objects, this._pool, start, end); + }); + } + _release(objects, pool, start, end) { return __awaiter(this, void 0, void 0, function* () { if (start == null) { start = 0; @@ -45,7 +50,7 @@ class ObjectPool { end = objects.length; } const tryReleaseCount = end - start; - const releasedCount = yield this._pool.release(tryReleaseCount); + const releasedCount = yield pool.release(tryReleaseCount, true); end = Math.min(objects.length, releasedCount); this._availableObjects.release(objects, start, end); if (this._holdObjects) { @@ -62,7 +67,7 @@ class ObjectPool { }); } tick(abortSignal) { - return this._pool.tick(); + return this._pool.tick(abortSignal); } getWait(count, priority, abortSignal, awaitPriority) { return __awaiter(this, void 0, void 0, function* () { @@ -134,7 +139,7 @@ class ObjectPool { yield _this._allocatePool.release(1); throw err; } - const count = yield _this.release([obj]); + const count = yield _this._release([obj], _this._allocatePool); allocatedCount += count; }); } @@ -150,7 +155,7 @@ class ObjectPool { promises.push(releasePromiseObject(objectOrPromise)); } else { - const promise = this.release([objectOrPromise]); + const promise = this._release([objectOrPromise], this._allocatePool); if (isPromiseLike(promise)) { promises.push(releasePromise(promise)); } diff --git a/dist/lib/pool/Pool.cjs b/dist/lib/pool/Pool.cjs index ec47b2b..3ec9701 100644 --- a/dist/lib/pool/Pool.cjs +++ b/dist/lib/pool/Pool.cjs @@ -41,11 +41,16 @@ class Pool { get releaseAvailable() { return this.maxSize - this._size; } - release(count) { + release(count, dontThrow) { const size = this._size; const maxReleaseCount = this.maxSize - size; if (count > maxReleaseCount) { - count = maxReleaseCount; + if (dontThrow) { + count = maxReleaseCount; + } + else { + throw new Error(`count (${count} > maxReleaseCount (${maxReleaseCount}))`); + } } if (count > 0) { this._size = size + count; @@ -58,7 +63,7 @@ class Pool { return count; } tick(abortSignal) { - if (this._size > 0) { + if (this._size >= this._maxSize) { return; } if (!this._tickPromise) { diff --git a/dist/lib/pool/Pool.d.ts b/dist/lib/pool/Pool.d.ts index a03f348..81c820f 100644 --- a/dist/lib/pool/Pool.d.ts +++ b/dist/lib/pool/Pool.d.ts @@ -7,7 +7,7 @@ export interface IPool { hold(count: number): boolean; /** it returns false if the obj cannot be pushed into the object pool (if size >= maxSize) */ releaseAvailable: number; - release(count: number): Promise | number; + release(count: number, dontThrow?: boolean): Promise | number; /** it will resolve when size > 0 */ tick(abortSignal?: IAbortSignalFast): Promise | void; /** wait size > 0 and hold, use this for concurrency hold */ @@ -23,7 +23,7 @@ export declare class Pool implements IPool { get holdAvailable(): number; hold(count: number): boolean; get releaseAvailable(): number; - release(count: number): number; + release(count: number, dontThrow?: boolean): number; private _tickPromise; tick(abortSignal?: IAbortSignalFast): Promise | void; holdWait(count: number, priority?: Priority, abortSignal?: IAbortSignalFast, awaitPriority?: AwaitPriority): Promise; diff --git a/dist/lib/pool/Pool.mjs b/dist/lib/pool/Pool.mjs index 41e362b..f9e4ad8 100644 --- a/dist/lib/pool/Pool.mjs +++ b/dist/lib/pool/Pool.mjs @@ -37,11 +37,16 @@ class Pool { get releaseAvailable() { return this.maxSize - this._size; } - release(count) { + release(count, dontThrow) { const size = this._size; const maxReleaseCount = this.maxSize - size; if (count > maxReleaseCount) { - count = maxReleaseCount; + if (dontThrow) { + count = maxReleaseCount; + } + else { + throw new Error(`count (${count} > maxReleaseCount (${maxReleaseCount}))`); + } } if (count > 0) { this._size = size + count; @@ -54,7 +59,7 @@ class Pool { return count; } tick(abortSignal) { - if (this._size > 0) { + if (this._size >= this._maxSize) { return; } if (!this._tickPromise) { diff --git a/dist/lib/pool/PoolWrapper.cjs b/dist/lib/pool/PoolWrapper.cjs index 529c483..fe26b86 100644 --- a/dist/lib/pool/PoolWrapper.cjs +++ b/dist/lib/pool/PoolWrapper.cjs @@ -21,8 +21,8 @@ class PoolWrapper { hold(count) { return this._pool.hold(count); } - release(count) { - return this._pool.release(count); + release(count, dontThrow) { + return this._pool.release(count, dontThrow); } tick(abortSignal) { return this._pool.tick(abortSignal); diff --git a/dist/lib/pool/PoolWrapper.d.ts b/dist/lib/pool/PoolWrapper.d.ts index fdc4331..b5e8512 100644 --- a/dist/lib/pool/PoolWrapper.d.ts +++ b/dist/lib/pool/PoolWrapper.d.ts @@ -9,7 +9,7 @@ export declare class PoolWrapper implements IPool { get holdAvailable(): number; get releaseAvailable(): number; hold(count: number): boolean; - release(count: number): number | Promise; + release(count: number, dontThrow?: boolean): number | Promise; tick(abortSignal?: IAbortSignalFast): Promise | void; holdWait(count: number, priority?: Priority, abortSignal?: IAbortSignalFast, awaitPriority?: AwaitPriority): Promise; } diff --git a/dist/lib/pool/PoolWrapper.mjs b/dist/lib/pool/PoolWrapper.mjs index 7ec8c61..044dcfd 100644 --- a/dist/lib/pool/PoolWrapper.mjs +++ b/dist/lib/pool/PoolWrapper.mjs @@ -17,8 +17,8 @@ class PoolWrapper { hold(count) { return this._pool.hold(count); } - release(count) { - return this._pool.release(count); + release(count, dontThrow) { + return this._pool.release(count, dontThrow); } tick(abortSignal) { return this._pool.tick(abortSignal); diff --git a/dist/lib/pool/Pools.cjs b/dist/lib/pool/Pools.cjs index 7a2a45f..5c6611c 100644 --- a/dist/lib/pool/Pools.cjs +++ b/dist/lib/pool/Pools.cjs @@ -53,17 +53,22 @@ class Pools { get releaseAvailable() { return this.maxSize - this.size; } - release(count) { + release(count, dontThrow) { const size = this.size; const maxReleaseCount = this.maxSize - size; if (count > maxReleaseCount) { - count = maxReleaseCount; + if (dontThrow) { + count = maxReleaseCount; + } + else { + throw new Error(`count (${count} > maxReleaseCount (${maxReleaseCount}))`); + } } if (count > 0) { const pools = this._pools; let promises = null; for (let i = 0, len = pools.length; i < len; i++) { - const promise = pools[i].release(count); + const promise = pools[i].release(count, dontThrow); if (asyncUtils.isPromiseLike(promise)) { if (!promises) { promises = [promise]; diff --git a/dist/lib/pool/Pools.d.ts b/dist/lib/pool/Pools.d.ts index 31ff44a..448f7ec 100644 --- a/dist/lib/pool/Pools.d.ts +++ b/dist/lib/pool/Pools.d.ts @@ -10,7 +10,7 @@ export declare class Pools implements IPool { get holdAvailable(): number; hold(count: number): boolean; get releaseAvailable(): number; - release(count: number): Promise | number; + release(count: number, dontThrow?: boolean): Promise | number; tick(abortSignal?: IAbortSignalFast): Promise | void; holdWait(count: number, priority?: Priority, abortSignal?: IAbortSignalFast, awaitPriority?: AwaitPriority): Promise; } diff --git a/dist/lib/pool/Pools.mjs b/dist/lib/pool/Pools.mjs index 2fed5cf..85e92a5 100644 --- a/dist/lib/pool/Pools.mjs +++ b/dist/lib/pool/Pools.mjs @@ -49,17 +49,22 @@ class Pools { get releaseAvailable() { return this.maxSize - this.size; } - release(count) { + release(count, dontThrow) { const size = this.size; const maxReleaseCount = this.maxSize - size; if (count > maxReleaseCount) { - count = maxReleaseCount; + if (dontThrow) { + count = maxReleaseCount; + } + else { + throw new Error(`count (${count} > maxReleaseCount (${maxReleaseCount}))`); + } } if (count > 0) { const pools = this._pools; let promises = null; for (let i = 0, len = pools.length; i < len; i++) { - const promise = pools[i].release(count); + const promise = pools[i].release(count, dontThrow); if (isPromiseLike(promise)) { if (!promises) { promises = [promise]; diff --git a/dist/lib/time-limit/TimeLimitPool.cjs b/dist/lib/time-limit/TimeLimitPool.cjs index 55b13d5..88d9d18 100644 --- a/dist/lib/time-limit/TimeLimitPool.cjs +++ b/dist/lib/time-limit/TimeLimitPool.cjs @@ -16,15 +16,12 @@ class TimeLimitPool extends pool_PoolWrapper.PoolWrapper { get time() { return this._time; } - release(count) { + release(count, dontThrow) { return tslib.__awaiter(this, void 0, void 0, function* () { yield asyncUtils.delay(this._time, null, this._timeController); - return this._release(count); + return this._pool.release(count, dontThrow); }); } - _release(count) { - return this._pool.release(count); - } } exports.TimeLimitPool = TimeLimitPool; diff --git a/dist/lib/time-limit/TimeLimitPool.d.ts b/dist/lib/time-limit/TimeLimitPool.d.ts index 10f8eab..3950a4e 100644 --- a/dist/lib/time-limit/TimeLimitPool.d.ts +++ b/dist/lib/time-limit/TimeLimitPool.d.ts @@ -14,6 +14,5 @@ export declare class TimeLimitPool extends PoolWrapper implements ITimeLimitPool private readonly _timeController; constructor({ pool, time, timeController, }: TimeLimitPoolParams); get time(): number; - release(count: number): Promise; - private _release; + release(count: number, dontThrow?: boolean): Promise; } diff --git a/dist/lib/time-limit/TimeLimitPool.mjs b/dist/lib/time-limit/TimeLimitPool.mjs index 50a1a41..25b6d3b 100644 --- a/dist/lib/time-limit/TimeLimitPool.mjs +++ b/dist/lib/time-limit/TimeLimitPool.mjs @@ -12,15 +12,12 @@ class TimeLimitPool extends PoolWrapper { get time() { return this._time; } - release(count) { + release(count, dontThrow) { return __awaiter(this, void 0, void 0, function* () { yield delay(this._time, null, this._timeController); - return this._release(count); + return this._pool.release(count, dontThrow); }); } - _release(count) { - return this._pool.release(count); - } } export { TimeLimitPool };