summaryrefslogtreecommitdiffstats
path: root/model/websocket_message.go
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2018-02-20 12:50:10 -0600
committerChristopher Speller <crspeller@gmail.com>2018-02-20 10:50:10 -0800
commit19a5d0047dbe5e4d7f4675893bfee125d3a12312 (patch)
tree3007bd99e82309f2f03eabe79aad70e1ec25204e /model/websocket_message.go
parentbabd795d792e95f6e708af6ee8207ef6877e2b32 (diff)
downloadchat-19a5d0047dbe5e4d7f4675893bfee125d3a12312.tar.gz
chat-19a5d0047dbe5e4d7f4675893bfee125d3a12312.tar.bz2
chat-19a5d0047dbe5e4d7f4675893bfee125d3a12312.zip
MM-8710: Web Hub optimizations (#8293)
* webhub optimizations * test fix * minor fix * big perf improvement to ToJson after precomputing * fix hub connection count
Diffstat (limited to 'model/websocket_message.go')
-rw-r--r--model/websocket_message.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/model/websocket_message.go b/model/websocket_message.go
index 0256e400f..8d1abecfa 100644
--- a/model/websocket_message.go
+++ b/model/websocket_message.go
@@ -5,6 +5,7 @@ package model
import (
"encoding/json"
+ "fmt"
"io"
)
@@ -58,11 +59,32 @@ type WebsocketBroadcast struct {
TeamId string `json:"team_id"` // broadcast only occurs for users in this team
}
+type precomputedWebSocketEventJSON struct {
+ Event json.RawMessage
+ Data json.RawMessage
+ Broadcast json.RawMessage
+}
+
type WebSocketEvent struct {
Event string `json:"event"`
Data map[string]interface{} `json:"data"`
Broadcast *WebsocketBroadcast `json:"broadcast"`
Sequence int64 `json:"seq"`
+
+ precomputedJSON *precomputedWebSocketEventJSON
+}
+
+// PrecomputeJSON precomputes and stores the serialized JSON for all fields other than Sequence.
+// This makes ToJson much more efficient when sending the same event to multiple connections.
+func (m *WebSocketEvent) PrecomputeJSON() {
+ event, _ := json.Marshal(m.Event)
+ data, _ := json.Marshal(m.Data)
+ broadcast, _ := json.Marshal(m.Broadcast)
+ m.precomputedJSON = &precomputedWebSocketEventJSON{
+ Event: json.RawMessage(event),
+ Data: json.RawMessage(data),
+ Broadcast: json.RawMessage(broadcast),
+ }
}
func (m *WebSocketEvent) Add(key string, value interface{}) {
@@ -83,6 +105,9 @@ func (o *WebSocketEvent) EventType() string {
}
func (o *WebSocketEvent) ToJson() string {
+ if o.precomputedJSON != nil {
+ return fmt.Sprintf(`{"event": %s, "data": %s, "broadcast": %s, "seq": %d}`, o.precomputedJSON.Event, o.precomputedJSON.Data, o.precomputedJSON.Broadcast, o.Sequence)
+ }
b, _ := json.Marshal(o)
return string(b)
}