nestjs-resilience
Version:
A module for improving the reliability and fault-tolerance of your NestJS applications
62 lines (61 loc) • 1.97 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BulkheadStrategy = void 0;
const base_strategy_1 = require("./base.strategy");
const rxjs_1 = require("rxjs");
const exceptions_1 = require("../exceptions");
class BulkheadStrategy extends base_strategy_1.Strategy {
get executionSlots() {
return this.options.maxConcurrent - this.active;
}
get queueSlots() {
return this.options.maxQueue - this.queue.length;
}
constructor(options) {
super(Object.assign(Object.assign({}, BulkheadStrategy.DEFAULT_OPTIONS), options));
this.active = 0;
this.queue = [];
this.queue$ = new rxjs_1.Subject();
}
process(observable) {
if (this.executionSlots > 0) {
return this.concurrent(observable);
}
if (this.queueSlots > 0) {
return this.enqueue(observable);
}
return (0, rxjs_1.throwError)(() => new exceptions_1.BulkheadRejectedException(this.options.maxConcurrent, this.options.maxQueue));
}
concurrent(observable) {
this.active++;
return observable.pipe((0, rxjs_1.finalize)(() => {
this.active--;
this.dequeue();
}));
}
enqueue(observable) {
this.queue.push(observable);
return new rxjs_1.Observable(subscriber => {
this.queue$.subscribe(queuedObservable => {
if (queuedObservable === observable) {
return this.concurrent(observable).subscribe(subscriber);
}
});
});
}
dequeue() {
if (this.executionSlots === 0) {
return;
}
const observable = this.queue.shift();
if (!observable) {
return;
}
return this.queue$.next(observable);
}
}
exports.BulkheadStrategy = BulkheadStrategy;
BulkheadStrategy.DEFAULT_OPTIONS = {
maxConcurrent: 1,
maxQueue: 1
};