From 3de8dc9fc292db886d29c011bf6bba6ee458526a Mon Sep 17 00:00:00 2001 From: Owen Date: Thu, 12 Mar 2026 17:49:12 -0700 Subject: [PATCH] Add optional compression --- websocket/client.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/websocket/client.go b/websocket/client.go index dcf6acd..35b76b9 100644 --- a/websocket/client.go +++ b/websocket/client.go @@ -2,6 +2,7 @@ package websocket import ( "bytes" + "compress/gzip" "crypto/tls" "crypto/x509" "encoding/json" @@ -803,8 +804,7 @@ func (c *Client) readPumpWithDisconnectDetection() { case <-c.done: return default: - var msg WSMessage - err := c.conn.ReadJSON(&msg) + messageType, p, err := c.conn.ReadMessage() if err != nil { // Check if we're shutting down or explicitly disconnected before logging error select { @@ -829,6 +829,30 @@ func (c *Client) readPumpWithDisconnectDetection() { } } + // Decompress binary frames (gzip-compressed JSON) + var data []byte + if messageType == websocket.BinaryMessage { + gr, gzErr := gzip.NewReader(bytes.NewReader(p)) + if gzErr != nil { + logger.Error("websocket: failed to create gzip reader: %v", gzErr) + continue + } + data, gzErr = io.ReadAll(gr) + gr.Close() + if gzErr != nil { + logger.Error("websocket: failed to decompress message: %v", gzErr) + continue + } + } else { + data = p + } + + var msg WSMessage + if err = json.Unmarshal(data, &msg); err != nil { + logger.Error("websocket: failed to parse message: %v", err) + continue + } + // Update config version from incoming message c.setConfigVersion(msg.ConfigVersion)