@sap-cloud-sdk/resilience
Version:
SAP Cloud SDK for JavaScript resilience
57 lines • 2.07 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.circuitBreakerDefaultOptions = exports.circuitBreakers = void 0;
exports.circuitBreaker = circuitBreaker;
const opossum_1 = __importDefault(require("opossum"));
/**
* Map of all existing circuit breakers.
* Entries are added in a lazy way.
* TODO:
* The value type here should be CircuitBreaker, but this would make the Opossum types part of our public API.
* This happens although it is marked as internal, because transpilation includes internal.
* Adding CircuitBreaker will break transpilation on generation.
* @internal
*/
exports.circuitBreakers = {};
/**
* @internal
*/
exports.circuitBreakerDefaultOptions = {
timeout: false,
errorThresholdPercentage: 50,
volumeThreshold: 10,
resetTimeout: 30000,
cache: false
};
function httpErrorFilter(error) {
return (!!error.response?.status && error.response.status.toString().startsWith('4'));
}
function circuitBreakerKeyBuilder({ uri, tenantId = 'tenant_id' }) {
return `${uri}::${tenantId}`;
}
/**
* Helper method to build a circuit breaker middleware.
* @returns The middleware adding a circuit breaker to the function.
*/
function circuitBreaker() {
return circuitBreakerGeneric(circuitBreakerKeyBuilder, httpErrorFilter);
}
function circuitBreakerGeneric(keyBuilder, errorFilter) {
return (options) => fnArgument => getCircuitBreaker(keyBuilder(options.context), errorFilter).fire(options.fn, fnArgument);
}
function getCircuitBreaker(key, errorFilter) {
if (!exports.circuitBreakers[key]) {
exports.circuitBreakers[key] = new opossum_1.default(executeFunction, {
...exports.circuitBreakerDefaultOptions,
errorFilter
});
}
return exports.circuitBreakers[key];
}
function executeFunction(fn, ...parameters) {
return fn(...parameters);
}
//# sourceMappingURL=circuit-breaker.js.map