diff --git a/server/channels/app/platform/web_conn.go b/server/channels/app/platform/web_conn.go index ddd4eb1c96..cce589989f 100644 --- a/server/channels/app/platform/web_conn.go +++ b/server/channels/app/platform/web_conn.go @@ -463,7 +463,7 @@ func (wc *WebConn) writePump() { var err error if evtOk { evt = evt.SetSequence(wc.Sequence) - err = evt.Encode(enc) + err = evt.Encode(enc, &buf) wc.Sequence++ } else { err = enc.Encode(msg) @@ -530,7 +530,7 @@ func (wc *WebConn) writeMessage(msg *model.WebSocketEvent) error { // We don't use the encoder from the write pump because it's unwieldy to pass encoders // around, and this is only called during initialization of the webConn. var buf bytes.Buffer - err := msg.Encode(json.NewEncoder(&buf)) + err := msg.Encode(json.NewEncoder(&buf), &buf) if err != nil { mlog.Warn("Error in encoding websocket message", mlog.Err(err)) return nil diff --git a/server/public/model/websocket_message.go b/server/public/model/websocket_message.go index 6a8bf5ae31..80119ef1ca 100644 --- a/server/public/model/websocket_message.go +++ b/server/public/model/websocket_message.go @@ -294,9 +294,10 @@ func (ev *WebSocketEvent) ToJSON() ([]byte, error) { } // Encode encodes the event to the given encoder. -func (ev *WebSocketEvent) Encode(enc *json.Encoder) error { +func (ev *WebSocketEvent) Encode(enc *json.Encoder, buf io.Writer) error { if ev.precomputedJSON != nil { - return enc.Encode(json.RawMessage(ev.precomputedJSONBuf())) + _, err := buf.Write(ev.precomputedJSONBuf()) + return err } return enc.Encode(webSocketEventJSON{ diff --git a/server/public/model/websocket_message_test.go b/server/public/model/websocket_message_test.go index b6092a26eb..3fa743bee0 100644 --- a/server/public/model/websocket_message_test.go +++ b/server/public/model/websocket_message_test.go @@ -247,8 +247,11 @@ func BenchmarkEncodeJSON(b *testing.B) { ev := message.PrecomputeJSON() + var seq int64 enc := json.NewEncoder(io.Discard) for i := 0; i < b.N; i++ { - err = ev.Encode(enc) + ev = ev.SetSequence(seq) + err = ev.Encode(enc, io.Discard) + seq++ } }