UNPKG

@sap-cloud-sdk/resilience

Version:

SAP Cloud SDK for JavaScript resilience

57 lines 2.07 kB
"use strict"; 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