feat(lobby): keep lobby/game caches fresh from any screen + invitation delta channel
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 14s
CI / ui (pull_request) Successful in 48s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m7s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 14s
CI / ui (pull_request) Successful in 48s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m7s
Builds on the cross-screen cache work: the global stream handler now keeps both caches current no matter which screen is mounted, and invitations become a live delta channel so the lobby's invitations list is fresh from any screen too. Client (boundary already started): - advanceCached now also folds opponent_joined into a not-currently-viewed game's cache via a new pure reducer applyOpponentJoined (extracted and reused by the mounted game board), so opening an open game that filled while you were elsewhere is flash-free. - patchLobbyInvitation upserts a still-pending invitation and removes a terminal one (started/declined/cancelled/expired); the global notify handler calls it on the invitation / invitation_update sub-kinds. Invitations delta channel (no wire/gateway/connector change — the notification already carries the full invitation with id/status/game_id end to end): - notify: a new in-app-only NotifyInvitationUpdate sub + NotificationInvitationUpdate constructor (shares encoding with NotificationInvitation). The Telegram connector renders no message for it, so a decline/cancel never becomes an out-of-app push. - lobby: emit the changed invitation to every participant on respond (accept/decline), on the final accept's game start, and on cancel — so each participant's lobby patches its list in place. The authoritative list holds only pending invitations, so the client's pending-vs-terminal rule matches it exactly. Tests: applyOpponentJoined + patchLobbyInvitation unit tests (TDD), the NotificationInvitationUpdate encoding unit test, and integration assertions that decline/cancel/accept publish invitation_update to every participant. Full local suite green (backend unit+integration, UI check/unit/build/bundle/e2e). Docs: ARCHITECTURE §10 (notify catalog + in-app-only note) and UI_DESIGN updated.
This commit is contained in:
+4
-2
@@ -53,8 +53,10 @@ Login uses `Screen`.
|
||||
stream handler (`lib/app.svelte.ts`) is the one place that runs for every live event regardless of
|
||||
the mounted screen, so it owns cross-screen freshness: it upserts the affected game's `GameView`
|
||||
into the lobby snapshot (`patchLobbyGame`) on every game event — opponent move, game-over,
|
||||
opponent-joined, and a match/started game (which it also adds) — and advances a not-currently-viewed
|
||||
game's own cache from the move/over delta (`advanceCached`, skipping the game in view, whose mounted
|
||||
opponent-joined, and a match/started game (which it also adds) — patches the lobby's invitations
|
||||
list (`patchLobbyInvitation`: a still-pending invitation upserted, a terminal one removed) on the
|
||||
`invitation` / `invitation_update` notifications, and advances a not-currently-viewed game's own
|
||||
cache from the move/over/joined delta (`advanceCached`, skipping the game in view, whose mounted
|
||||
board owns its cache). The game board additionally mirrors the player's **own** move and its own
|
||||
`load()` into the lobby snapshot — the two updates no live event carries.
|
||||
- **Telegram integration** (`lib/telegram.ts`): inside the Mini App the colour
|
||||
|
||||
Reference in New Issue
Block a user