R4: push enrichment — events carry a state delta, kill the last poll
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 37s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m8s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 37s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m8s
Enrich the in-app live stream into a delta channel so the UI renders a move from the event without a follow-up game.state, and make the matchmaking poll a stream-down fallback. - pkg/fbs: trailing fields on opponent_moved (move+game+bag_len), your_turn (move_count), match_found (state), game_over (game), notify (account/invitation/state), MoveResult (rack+bag_len); regenerate Go + TS. - backend: notify owns the FB encoding (encode.go + payload.go input structs); game/lobby/social map their domain types in. emitMove builds the move delta; game.Service.InitialState feeds match_found/game_started the recipient's initial StateView; friends/invitations notify carry their account/invitation. The move-commit response (submit_play/pass/exchange/resign) returns the actor's refilled rack + bag size. - gateway: MoveResult transcode carries rack+bag_len. - ui: pure lib/gamedelta.ts reducer advances the per-game cache keyed on move_count (idempotent + gap-safe); app.svelte seeds the cache on match_found/game_started; Game.svelte applies the delta (commit/pass/exchange/resign drop their load()); NewGame polls only while app.streamAlive is false. - docs: ARCHITECTURE §10, FUNCTIONAL(+ru), backend/gateway/ui READMEs; PRERELEASE R4 marked done + Refinements.
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
package notify
|
||||
|
||||
// The structs below are the wire-agnostic inputs the domain services hand to the
|
||||
// enriched event constructors. Keeping them here — rather than importing the wire
|
||||
// schema into game/lobby/social — preserves the package boundary: notify owns the
|
||||
// FlatBuffers encoding, while the domain only fills in already-resolved values (seat
|
||||
// display names, alphabet-index racks). Each mirrors the matching scrabblefb table.
|
||||
|
||||
// SeatStanding is one seat's public standing inside a GameSummary (mirrors
|
||||
// scrabblefb.SeatView).
|
||||
type SeatStanding struct {
|
||||
Seat int
|
||||
AccountID string
|
||||
DisplayName string
|
||||
Score int
|
||||
HintsUsed int
|
||||
IsWinner bool
|
||||
}
|
||||
|
||||
// GameSummary is the shared, non-private game state embedded in enriched events
|
||||
// (mirrors scrabblefb.GameView). LastActivityUnix is the lobby sort key: the current
|
||||
// turn's start for an active game, the finish time once finished.
|
||||
type GameSummary struct {
|
||||
ID string
|
||||
Variant string
|
||||
DictVersion string
|
||||
Status string
|
||||
Players int
|
||||
ToMove int
|
||||
TurnTimeoutSecs int
|
||||
MoveCount int
|
||||
EndReason string
|
||||
Seats []SeatStanding
|
||||
LastActivityUnix int64
|
||||
}
|
||||
|
||||
// AlphabetLetter is one variant alphabet entry (a display-only row) embedded in an
|
||||
// initial PlayerState so a client seeing a variant for the first time can render its
|
||||
// rack (mirrors scrabblefb.AlphabetEntry).
|
||||
type AlphabetLetter struct {
|
||||
Index int
|
||||
Letter string
|
||||
Value int
|
||||
}
|
||||
|
||||
// PlayerState is a player's full initial view of a game — the shared summary plus
|
||||
// their private rack and budgets (mirrors scrabblefb.StateView). Rack carries wire
|
||||
// alphabet indices (a blank is the sentinel index 255). Alphabet is set only when the
|
||||
// recipient may not have cached the variant yet (match_found / game_started).
|
||||
type PlayerState struct {
|
||||
Game GameSummary
|
||||
Seat int
|
||||
Rack []int
|
||||
BagLen int
|
||||
HintsRemaining int
|
||||
Alphabet []AlphabetLetter
|
||||
}
|
||||
|
||||
// AccountRef is a referenced account with its display name resolved (mirrors
|
||||
// scrabblefb.AccountRef).
|
||||
type AccountRef struct {
|
||||
AccountID string
|
||||
DisplayName string
|
||||
}
|
||||
|
||||
// InvitationInvitee is one invited player's seat and response inside an
|
||||
// InvitationSummary (mirrors scrabblefb.InvitationInvitee).
|
||||
type InvitationInvitee struct {
|
||||
AccountID string
|
||||
DisplayName string
|
||||
Seat int
|
||||
Response string
|
||||
}
|
||||
|
||||
// InvitationSummary is a friend-game invitation carried by the NotifyInvitation event so
|
||||
// the client adds it to its lobby list without a refetch (mirrors scrabblefb.Invitation).
|
||||
type InvitationSummary struct {
|
||||
ID string
|
||||
Inviter AccountRef
|
||||
Invitees []InvitationInvitee
|
||||
Variant string
|
||||
TurnTimeoutSecs int
|
||||
HintsAllowed bool
|
||||
HintsPerPlayer int
|
||||
DropoutTiles string
|
||||
Status string
|
||||
GameID string
|
||||
ExpiresAtUnix int64
|
||||
}
|
||||
Reference in New Issue
Block a user