From 89e7626ae982f626b707f490c5d618f8bf6a5875 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Mon, 24 Apr 2023 11:19:27 +0200 Subject: [PATCH 1/2] Workaround Safari Websocket Compression issue See: https://github.com/nhooyr/websocket/issues/218 --- example/main.ts | 2 +- internal/signaling/handler.go | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/example/main.ts b/example/main.ts index b470839..c341383 100644 --- a/example/main.ts +++ b/example/main.ts @@ -52,7 +52,7 @@ n.on('ready', () => { const el = document.getElementById('lobbies') if (el !== null) { el.innerHTML = '' - if (lobbies.length === 0) { + if (!lobbies || lobbies.length === 0) { const li = document.createElement('li') li.innerHTML = 'no lobbies' el.appendChild(li) diff --git a/internal/signaling/handler.go b/internal/signaling/handler.go index d413d7b..4e414f5 100644 --- a/internal/signaling/handler.go +++ b/internal/signaling/handler.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "net/http" + "strings" "time" "github.com/koenbollen/logging" @@ -18,11 +19,6 @@ import ( const MaxConnectionTime = 1 * time.Hour func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.CredentialsClient) http.HandlerFunc { - acceptOptions := &websocket.AcceptOptions{ - // Allow any origin/game to connect. - InsecureSkipVerify: true, - } - manager := &TimeoutManager{} go manager.Run(ctx) @@ -34,6 +30,17 @@ func Handler(ctx context.Context, store stores.Store, cloudflare *cloudflare.Cre ctx, cancel := context.WithTimeout(ctx, MaxConnectionTime) defer cancel() + userAgentLower := strings.ToLower(r.Header.Get("User-Agent")) + isSafari := strings.Contains(userAgentLower, "safari") && !strings.Contains(userAgentLower, "chrome") && !strings.Contains(userAgentLower, "android") + acceptOptions := &websocket.AcceptOptions{ + // Allow any origin/game to connect. + InsecureSkipVerify: true, + } + + if isSafari { + acceptOptions.CompressionMode = websocket.CompressionDisabled + } + conn, err := websocket.Accept(w, r, acceptOptions) if err != nil { util.ErrorAndAbort(w, r, http.StatusBadRequest, "", err) From 9ca24521d6ee4be0e4b2c02f67db77156c275448 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Mon, 24 Apr 2023 11:22:39 +0200 Subject: [PATCH 2/2] Fix lint --- example/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/main.ts b/example/main.ts index c341383..a624a21 100644 --- a/example/main.ts +++ b/example/main.ts @@ -52,7 +52,7 @@ n.on('ready', () => { const el = document.getElementById('lobbies') if (el !== null) { el.innerHTML = '' - if (!lobbies || lobbies.length === 0) { + if (lobbies === null || lobbies.length === 0) { const li = document.createElement('li') li.innerHTML = 'no lobbies' el.appendChild(li)