UNPKG

@freemework/common

Version:

Common library of the Freemework Project.

65 lines 2.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FLimitInternalParallelLimit = void 0; const f_limit_exception_js_1 = require("../f_limit_exception.js"); const f_internal_limit_sync_base_js_1 = require("./f_internal_limit_sync_base.js"); const f_internal_limit_token_deferred_js_1 = require("./f_internal_limit_token_deferred.js"); class FLimitInternalParallelLimit extends f_internal_limit_sync_base_js_1.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 f_limit_exception_js_1.FLimitException("No any available tokens"); } let defer = null; { // local scope const realDefer = { ...f_internal_limit_token_deferred_js_1.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)); } } exports.FLimitInternalParallelLimit = FLimitInternalParallelLimit; //# sourceMappingURL=f_limit_internal_parallel_limit.js.map