feat: verify multi-client reset recovery and document the emergency workflow

This commit is contained in:
2026-08-31 00:04:24 +03:00
parent 93af738e36
commit 3fcab465f8
4 changed files with 424 additions and 1 deletions
+2
View File
@@ -79,6 +79,8 @@ session, clears match and cumulative statistics, and starts a fresh game
generation. Successful recovery responses contain `resetReason` (`session_left`,
`profile_reset`, or `game_reset`) and `generation`. Invalidated-token state
polling returns `SESSION_INVALIDATED` with the same bounded recovery metadata.
The recovery generation and `gameId` make delayed commands stale; retrying a
completed recovery is harmless and cannot mutate a newly registered session.
## Role-safe state event
+40
View File
@@ -0,0 +1,40 @@
# Если игра застряла
Кнопка с спасательным кругом «Помощь» доступна после подключения к игре. Она
не стреляет и не меняет поле сама по себе: сначала выберите действие, затем
подтвердите его.
## Выйти из игры
Выберите «Выйти из игры», чтобы освободить своё место. Имя на этом устройстве
останется, поэтому можно быстро подключиться снова. Если игрок выходит во
время партии, партия безопасно прекращается и оставшийся игрок возвращается в
лобби.
## Сбросить мой профиль
Этот пункт удаляет только данные текущего браузера: имя, выбранного героя и
токен. Данные других игроков не меняются. Без связи профиль всё равно можно
очистить локально; место на ESP32 освободится после восстановления связи или
обычного таймаута.
## Сбросить всю игру
Этот пункт виден только игроку. Он возвращает всех пользователей к первому
экрану и удаляет текущую партию и статистику текущего запуска. Для защиты от
случайного нажатия подтверждение нужно удерживать около двух секунд.
Старые вкладки и токены после этого не могут изменить новую партию.
## Что не удаляется
Эти действия не стирают Wi‑Fi, пароль сети, прошивку, файлы игры, flash или
настройки платы. Перезагрузка ESP32 не нужна.
## Проверка на устройстве
Проверьте с двумя игроками и зрителем выход, локальный профиль, полный сброс
из лобби/игры/результата, WebSocket и HTTP fallback. После 50 смешанных
циклов сравните `/api/health`: свободная куча, largest free block, число
клиентов и причина перезагрузки не должны показывать утечку, зависание или
перезагрузку.