fix(ui): poll/refetch fallback for a missed opponent_joined in the open-game wait #54
Reference in New Issue
Block a user
Delete Branch "feature/open-game-wait-poll-fallback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что и зачем
Закрываю регрессию из PR #51. Там ожидание соперника в авто-матче переехало с экрана матчмейкинга внутрь самой партии (
status='open'), но poll-фоллбэк того экрана с собой не уехал.Шина событий (
notify.Hub) — best-effort: роняет событие при переполненном буфере и никогда не переотправляет; переподписка стрима не шлёт курсор; аGame.svelteобновлялся только из push. В отличие отopponent_moved/game_over, уopponent_joinedнет последующего события, которое запустило бы догоночный refetch поmoveCount. Итог: еслиopponent_joinedпотерян, пока стрим был недоступен (типичный кейс — уход приложения в фон на мобильном), стартер залипал на «ищу соперника» с пустой карточкой и заблокированными 🏁/чатом — пока вручную не выйдет и не зайдёт в игру заново.Как починено (вариант A+B)
В
Game.svelte:streamAlivefalse→true) — одинload()для догона пропущенного (заодно спасает пропущенныеopponent_moved/game_over; покрывает частый suspend/resume на мобильном);game.stateкаждые 2.5 с (повторяет удалённыйstartPollиз лобби); как только место занято — таймер сам гасится.Плюс: mock-seam
window.__streamдля e2e, два изолированных e2e-теста (один проверяет именно poll, другой — refetch на reconnect), правка устаревшего комментария кstreamAlive, запись вARCHITECTURE.md §10.Проверка локально
pnpm check(0 ошибок) ·test:unit(164) ·build· bundle-size gate · e2e 112 passed (chromium + webkit). Тайминги тестов подтверждают изоляцию: poll-тест ~4.6 с (ждёт тик 2.5 с), reconnect-тест ~1.9 с (мгновенный refetch до тика).Go не трогал.
New commits pushed, approval review dismissed automatically according to repository settings