UNPKG

nestjs-resilience

Version:

A module for improving the reliability and fault-tolerance of your NestJS applications

62 lines (61 loc) 1.97 kB
"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 };