fix(gateway): put the opened game on the wire even when the enqueue is not yet matched
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 8s
CI / integration (pull_request) Successful in 15s
CI / ui (pull_request) Successful in 46s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 57s

The real cause of 'Start game does not enter the game': encodeMatch gated the MatchResult game on matched (matched := m.Matched && m.Game != nil), so an open game awaiting an opponent (matched=false, game set) lost its game on the wire and the client had nothing to navigate into. Encode the game whenever m.Game is present; the backend's matched flag is authoritative. Regression test added (matched=false + game reaches the wire). The earlier codec fix guarded the same drop on the decode side.
This commit is contained in:
Ilia Denisov
2026-06-13 10:50:16 +02:00
parent a3cb917ec7
commit efaf633691
2 changed files with 37 additions and 4 deletions
+7 -4
View File
@@ -166,14 +166,17 @@ func toWireState(s backendclient.StateResp) wire.StateView {
// encodeMatch builds a MatchResult payload.
func encodeMatch(m backendclient.MatchResp) []byte {
b := flatbuffers.NewBuilder(512)
matched := m.Matched && m.Game != nil
// Enqueue always lands the caller in a game; an open game awaiting an opponent reports
// matched=false but still carries it, so encode the game whenever it is present (else the
// client never receives it and cannot navigate in).
hasGame := m.Game != nil
var game flatbuffers.UOffsetT
if matched {
if hasGame {
game = buildGameView(b, *m.Game)
}
fb.MatchResultStart(b)
fb.MatchResultAddMatched(b, matched)
if matched {
fb.MatchResultAddMatched(b, m.Matched)
if hasGame {
fb.MatchResultAddGame(b, game)
}
b.Finish(fb.MatchResultEnd(b))