UNPKG

@freemework/common

Version:

Common library of the Freemework Project.

61 lines 2.08 kB
import { FLimitException } from "../f_limit_exception.js"; import { FInternalLimitSyncBase } from "./f_internal_limit_sync_base.js"; import { FInternalLimitTokenDeferred } from "./f_internal_limit_token_deferred.js"; export class FLimitInternalParallelLimit extends FInternalLimitSyncBase { _maxWeight; _activeTokenDefers; constructor(totalWeight) { super(); this._maxWeight = totalWeight; this._activeTokenDefers = []; } get availableWeight() { if (super.disposed) { throw new Error("Wrong operation on disposed object"); } return this._maxWeight - this._activeTokenDefers.reduce((p, c) => p + c.weight, 0); } get maxWeight() { if (super.disposed) { throw new Error("Wrong operation on disposed object"); } return this._maxWeight; } accrueToken(weight) { super.verifyNotDisposed(); if (this.availableWeight < weight) { throw new FLimitException("No any available tokens"); } let defer = null; { // local scope const realDefer = { ...FInternalLimitTokenDeferred.create(weight), finalize: () => { realDefer.resolve(); const index = this._activeTokenDefers.indexOf(realDefer); this._activeTokenDefers.splice(index, 1); this.raiseReleaseToken(); } }; this._activeTokenDefers.push(realDefer); defer = realDefer; } const token = { commit: () => { if (defer !== null) { defer.finalize(); } }, rollback: () => { if (defer !== null) { defer.finalize(); } } }; return token; } async onDispose() { await Promise.all(this._activeTokenDefers.map(d => d.promise)); } } //# sourceMappingURL=f_limit_internal_parallel_limit.js.map