From 49e93ba0f8c65fc673e1c288fbf2dab0ff93b0ec Mon Sep 17 00:00:00 2001 From: lukasIO Date: Wed, 2 Sep 2026 13:35:29 +0200 Subject: [PATCH] add test-server support for compressed join requests (#4834) --- cmd/test-server/signal.go | 45 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/cmd/test-server/signal.go b/cmd/test-server/signal.go index 376359ab4..22d52651b 100644 --- a/cmd/test-server/signal.go +++ b/cmd/test-server/signal.go @@ -15,7 +15,11 @@ package main import ( + "bytes" + "compress/gzip" + "encoding/base64" "encoding/json" + "io" "net/http" "strconv" "strings" @@ -216,7 +220,7 @@ func (h *mockHandler) handleSignal(w http.ResponseWriter, r *http.Request) { return } - reconnect := r.URL.Query().Get("reconnect") == "1" + reconnect := r.URL.Query().Get("reconnect") == "1" || joinRequestSaysReconnect(r.URL.Query().Get("join_request")) conn, err := signalUpgrader.Upgrade(w, r, nil) if err != nil { @@ -416,6 +420,45 @@ func reconnectResponse(regionIndex int) *livekit.SignalResponse { } } +// joinRequestSaysReconnect unpacks the v1 `join_request` param and reports its +// Reconnect flag. Any decode error is ignored (treated as non-reconnect); this +// is a test mock, not a validator. +func joinRequestSaysReconnect(param string) bool { + if param == "" { + return false + } + wrappedBytes, err := base64.URLEncoding.DecodeString(param) + if err != nil { + return false + } + wrapped := &livekit.WrappedJoinRequest{} + if err := proto.Unmarshal(wrappedBytes, wrapped); err != nil { + return false + } + var joinBytes []byte + switch wrapped.Compression { + case livekit.WrappedJoinRequest_NONE: + joinBytes = wrapped.JoinRequest + case livekit.WrappedJoinRequest_GZIP: + gz, err := gzip.NewReader(bytes.NewReader(wrapped.JoinRequest)) + if err != nil { + return false + } + defer func() { _ = gz.Close() }() + joinBytes, err = io.ReadAll(gz) + if err != nil { + return false + } + default: + return false + } + join := &livekit.JoinRequest{} + if err := proto.Unmarshal(joinBytes, join); err != nil { + return false + } + return join.Reconnect +} + func leaveResponse(action livekit.LeaveRequest_Action) *livekit.SignalResponse { return &livekit.SignalResponse{ Message: &livekit.SignalResponse_Leave{