@freemework/common
Version:
Common library of the Freemework Project.
65 lines • 2.38 kB
JavaScript
;
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