Код 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
  1. Переход open → half-open проверяй в начале call по времени.
  2. Флаг «проба идёт» нужен, чтобы в half-open пропустить ровно один вызов.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.