feat(parser): авто-переподключение к SHiP с backoff (1.3.0) #12

Merged
claude merged 1 commits from dev into main 2026-06-05 13:01:02 +00:00
Owner

ReconnectSupervisor подключён к циклу чтения: backoff при разрыве вместо долбёжки. Resume из Redis на каждом реконнекте, resetBackoff на прогрессе, чистый exit на мёртвой ноде. +8 unit (229). Релиз 1.3.0.

ReconnectSupervisor подключён к циклу чтения: backoff при разрыве вместо долбёжки. Resume из Redis на каждом реконнекте, resetBackoff на прогрессе, чистый exit на мёртвой ноде. +8 unit (229). Релиз 1.3.0.
claude added 1 commit 2026-06-05 13:00:48 +00:00
feat(parser): авто-переподключение к SHiP через ReconnectSupervisor с backoff
CI / Lint (pull_request) Successful in 9m51s
CI / Integration tests (pull_request) Successful in 9m46s
CI / Build (pull_request) Successful in 9m25s
CI / Typecheck (pull_request) Successful in 9m27s
CI / Unit tests (pull_request) Successful in 9m33s
92811c258f
ReconnectSupervisor был написан, протестирован и экспортнут, но НИГДЕ не
подключён к циклу чтения. Parser.start() имел голый for-await без try/catch:
падение ноды → ShipConnectionError наверх → темп переподключений целиком
зависел от внешнего супервизора процесса. Мёртвая нода = рестарт без пауз =
долбёжка ноды без ограничителей.

Что сделано:
- Цикл чтения вынесен в runStreamLoop (core/streamLoop.ts) с инъекцией
  зависимостей — чтобы покрыть reconnect/resume юнит-тестами на фейках, без
  реального Redis и SHiP.
- runStreamLoop оборачивает (пере)подключение в ReconnectSupervisor:
  backoff 1→2→5→15→60с, после maxAttempts без прогресса — process.exit(1)
  (оркестратор перезапустит штатно).
- Позиция возобновления перечитывается из Redis на КАЖДОМ подключении
  (sync-hash пишется после каждого блока) — продолжаем ровно с последнего
  записанного блока, без потерь и дублей.
- ReconnectSupervisor.run теперь передаёт fn callback resetBackoff: каждый
  обработанный блок сбрасывает счётчик попыток, чтобы долгая стабильная сессия
  после редкого разрыва не копила attempt до выхода.
- Штатная остановка (stop закрывает ws) ловится и не вызывает лишний backoff.
- Parser получил структурный логгер (opts.logger) для onAttempt/onGiveUp.

Тесты: +4 runStreamLoop (reconnect+resume, stop без reconnect, give-up на
мёртвой ноде, resetBackoff на прогрессе), +4 ReconnectSupervisor (resetBackoff).
Всего 229 unit. README: секция «Авто-переподключение к SHiP».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claude merged commit 2218c7c1b7 into main 2026-06-05 13:01:02 +00:00
Sign in to join this conversation.