Код Senior Ошибки и логирование обновлено
Circuit breaker: closed, open, half-open
Условие
Реализуй class CircuitBreaker с new CircuitBreaker(fn, { failureThreshold, resetMs, now = () => Date.now() }) и методом call(...args):
- closed: вызывает
fn. Успех обнуляет счётчик ошибок подряд. ПослеfailureThresholdошибок подряд переходит в open. - open: не вызывает
fn, сразу отклоняет ошибкой сcode = 'EOPENBREAKER'. ЧерезresetMsс момента открытия следующий вызов переводит в half-open. - half-open: пропускает один пробный вызов. Успех → closed (счётчик 0), ошибка → снова open (отсчёт
resetMsзаново). Пока пробный вызов идёт, остальные отклоняются как в open.
Геттер state возвращает 'closed' | 'open' | 'half-open'. Ошибки fn пробрасываются наружу как есть.
Что проверяют тесты
открывается после порога
успех обнуляет счётчик
half-open и восстановление
неудачная проба снова открывает
во время пробы остальные отклоняются
ошибка fn пробрасывается как есть
Как подойти
Подсказки: 2
- Переход open → half-open проверяй в начале
callпо времени. - Флаг «проба идёт» нужен, чтобы в half-open пропустить ровно один вызов.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Статистика по access-логу: коды и p95
Следующий вопрос
Цепочка причин ошибки (error.cause)