@daiso-tech/core
Version:
The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.
136 lines (114 loc) • 4.17 kB
JavaScript
/**
* @module CircuitBreaker
*/
import { CLOSED_TRANSITIONS, HALF_OPEN_TRANSITIONS, } from "../../../../../circuit-breaker/contracts/_module.js";
/**
* @internal
*/
export const countBreakerLua = `
-- @param settings Required<CountBreakerSettings>
-- @return ICircuitBreakerPolicy<CountBreakerState>
local function CountBreaker(settings)
-- @param currentMetrics CountBreakerState
-- @return number
local function getFailureCount(currentMetrics)
local count = 0
for _index, isSuccess in ipairs(currentMetrics.samples) do
if not isSuccess then
count = count + 1
end
end
return count
end
-- @param currentMetrics CountBreakerState
-- @return number
local function getSuccessCount(currentMetrics)
local count = 0
for _index, isSuccess in ipairs(currentMetrics.samples) do
if isSuccess then
count = count + 1
end
end
return count
end
-- @param currentMetrics CountBreakerState
-- @return boolean
local function isMinimumNotMet(currentMetrics)
return #currentMetrics.samples <= settings.minimumNumberOfCalls
end
-- @template TItem
-- @param list Array<TItem>
-- @return Array<TItem>
local function copyList(list)
local newList = {}
for i = 1, #list do
newList[i] = list[i]
end
return newList
end
-- @param success boolean
-- @param currentState CircuitBreakerTrackState<CountBreakerState>
-- @return CountBreakerState
local function track(success, currentState)
local newSamples = copyList(currentState.metrics.samples)
table.insert(newSamples, success)
if #currentState.metrics.samples >= settings.size then
table.remove(newSamples, 1)
end
return {
samples = newSamples
}
end
return {
-- @return CountBreakerState
initialMetrics = function()
return {
samples = {}
}
end,
-- @param currentMetrics CountBreakerState
-- @param _currentDate number
-- @return ClosedTransitions
whenClosed = function(currentMetrics, _currentDate)
if isMinimumNotMet(currentMetrics) then
return "${CLOSED_TRANSITIONS.NONE}"
end
local allowedFailureCount = math.ceil(
settings.failureThreshold * #currentMetrics.samples
)
local hasFailed = getFailureCount(currentMetrics) > allowedFailureCount
if hasFailed then
return "${CLOSED_TRANSITIONS.TO_OPEN}"
end
return "${CLOSED_TRANSITIONS.NONE}"
end,
-- @param currentMetrics CountBreakerState
-- @param _currentDate number
-- @return HalfOpenTransitions
whenHalfOpened = function(currentMetrics, _currentDate)
if isMinimumNotMet(currentMetrics) then
return "${CLOSED_TRANSITIONS.NONE}"
end
local allowedSuccessCount = math.ceil(settings.successThreshold * #currentMetrics.samples)
local hasSucceeded = getSuccessCount(currentMetrics) >= allowedSuccessCount
if hasSucceeded then
return "${HALF_OPEN_TRANSITIONS.TO_CLOSED}"
end
return "${HALF_OPEN_TRANSITIONS.TO_OPEN}"
end,
-- @param currentState CircuitBreakerTrackState<CountBreakerState>
-- @param _settings CircuitBreakerTrackSettings<CountBreakerState>
-- @return CountBreakerState
trackFailure = function(currentState, _settings)
return track(false, currentState)
end,
-- @param currentState CircuitBreakerTrackState<CountBreakerState>
-- @param _settings CircuitBreakerTrackSettings<CountBreakerState>
-- @return CountBreakerState
trackSuccess = function(currentState, _settings)
return track(true, currentState)
end
}
end
`;
//# sourceMappingURL=count-breaker-lua.js.map