fix: keep session when refresh fails on network error or 5xx (WealthLedger/frontend#97) #100

Merged
codex-bot merged 1 commits from fix/97-refresh-transient-failure into develop 2026-10-23 15:06:20 +03:00
Owner

Closes #97
Связано с WealthLedger/backend#123 (refresh cookie без срока жизни, PR WealthLedger/backend#124)

Проблема

Во время деплоя backend остановлен, nginx отвечает 502. Любой неуспех POST /auth/refresh вызывал clearSession(): пользователь с валидной refresh-cookie уходил на login, кэш очищался.

Изменения

  • auth.vm.ts: refresh() очищает session только при ответе сервера без data и статусе ниже 500 (практически 401). Сетевая ошибка и 5xx выставляют unavailable, session и кэш остаются. Успешный refresh и clearSession сбрасывают unavailable. В контекст добавлен retry() (тот же single-flight refresh, нового loop нет).
  • client.ts: если refresh не удался из-за unavailable, shared client не вызывает clear() после исходного 401. Следующий 401 снова запускает refresh.
  • RouteGuards.tsx: вместо редиректа на /login при !user && unavailable показывается StateView с кнопкой «Повторить»; тексты в auth.* (ru).
  • .ai/conventions/data.md: правило «Auth и invalidation» дополнено этой политикой.
  • Retry/backoff внутри refresh не добавлялся (решение владельца задачи).

Проверки (Node 24.22.1)

  • Тесты на transport boundary (MSW): холодный старт с 401 очищает session; с сетевой ошибкой, 502 и 503 сохраняет кэш и ставит unavailable; retry() после сбоя восстанавливает session; protected 401 при недоступном refresh не очищает session; route-тест: retry-экран вместо login, затем возврат на маршрут; client-тест: clear не вызывается при unavailable.
  • Без правки в src восьми новых/изменённых тестов красные, с правкой зелёные.
  • npm run verify зелёный (467 тестов, depcruise, knip, build, storybook build). Падающие в этот момент на develop два теста AccountEventsPage.filters (зависимость от даты) исправлены отдельным PR к WealthLedger/frontend#98 и были подключены для прогона.

Влияние

Пользователь больше не теряет вход из-за кратковременной недоступности backend. После окончания простоя нужно нажать «Повторить» или перезагрузить страницу.

Порядок merge

Код #97 не зависит от #98, но зелёный CI verify на develop требует #98 (иначе падает дата-зависимый тест).

Closes #97 Связано с WealthLedger/backend#123 (refresh cookie без срока жизни, PR WealthLedger/backend#124) ## Проблема Во время деплоя backend остановлен, nginx отвечает 502. Любой неуспех `POST /auth/refresh` вызывал `clearSession()`: пользователь с валидной refresh-cookie уходил на login, кэш очищался. ## Изменения - `auth.vm.ts`: `refresh()` очищает session только при ответе сервера без `data` и статусе ниже 500 (практически 401). Сетевая ошибка и 5xx выставляют `unavailable`, session и кэш остаются. Успешный refresh и `clearSession` сбрасывают `unavailable`. В контекст добавлен `retry()` (тот же single-flight `refresh`, нового loop нет). - `client.ts`: если refresh не удался из-за `unavailable`, shared client не вызывает `clear()` после исходного 401. Следующий 401 снова запускает refresh. - `RouteGuards.tsx`: вместо редиректа на `/login` при `!user && unavailable` показывается `StateView` с кнопкой «Повторить»; тексты в `auth.*` (ru). - `.ai/conventions/data.md`: правило «Auth и invalidation» дополнено этой политикой. - Retry/backoff внутри refresh не добавлялся (решение владельца задачи). ## Проверки (Node 24.22.1) - Тесты на transport boundary (MSW): холодный старт с 401 очищает session; с сетевой ошибкой, 502 и 503 сохраняет кэш и ставит `unavailable`; `retry()` после сбоя восстанавливает session; protected 401 при недоступном refresh не очищает session; route-тест: retry-экран вместо login, затем возврат на маршрут; client-тест: `clear` не вызывается при `unavailable`. - Без правки в `src` восьми новых/изменённых тестов красные, с правкой зелёные. - `npm run verify` зелёный (467 тестов, depcruise, knip, build, storybook build). Падающие в этот момент на `develop` два теста `AccountEventsPage.filters` (зависимость от даты) исправлены отдельным PR к WealthLedger/frontend#98 и были подключены для прогона. ## Влияние Пользователь больше не теряет вход из-за кратковременной недоступности backend. После окончания простоя нужно нажать «Повторить» или перезагрузить страницу. ## Порядок merge Код #97 не зависит от #98, но зелёный CI `verify` на `develop` требует #98 (иначе падает дата-зависимый тест).
codex-bot added the Kind/Bug
Priority
Medium
3
labels 2026-10-23 08:06:23 +03:00
ksv741 force-pushed fix/97-refresh-transient-failure from d1a6e3d930 to f5b8b16966 2026-10-23 08:16:25 +03:00 Compare
ksv741 added 1 commit 2026-10-23 14:36:04 +03:00
fix: keep session when refresh fails on network error or 5xx (WealthLedger/frontend#97)
Frontend verify / commits (pull_request) Successful in 46s
Frontend verify / security (pull_request) Successful in 1m14s
Frontend verify / verify (pull_request) Successful in 7m6s
d4d5edecec
A backend outage during deploy cleared the session and sent the user
to login although the refresh cookie was still valid. Only a definitive
401 ends the session now; network errors and 5xx keep it and show a
retry screen.
ksv741 force-pushed fix/97-refresh-transient-failure from fe91ddbb91 to d4d5edecec 2026-10-23 14:36:04 +03:00 Compare
codex-bot merged commit 3af9df0ae2 into develop 2026-10-23 15:06:20 +03:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/frontend#100