diff options
author | George Goldberg <george@gberg.me> | 2018-03-02 15:55:03 +0000 |
---|---|---|
committer | George Goldberg <george@gberg.me> | 2018-03-02 15:55:03 +0000 |
commit | 901acc9703ae58b625b44e7abfd02333b9bab951 (patch) | |
tree | 1a8fc17a85544bc7b8064874923e2fe6e3f44354 /model/websocket_message.go | |
parent | 21afaf4bedcad578d4f876bb315d1072ccd296e6 (diff) | |
parent | 2b3b6051d265edf131d006b2eb14f55284faf1e5 (diff) | |
download | chat-901acc9703ae58b625b44e7abfd02333b9bab951.tar.gz chat-901acc9703ae58b625b44e7abfd02333b9bab951.tar.bz2 chat-901acc9703ae58b625b44e7abfd02333b9bab951.zip |
Merge branch 'master' into advanced-permissions-phase-1
Diffstat (limited to 'model/websocket_message.go')
-rw-r--r-- | model/websocket_message.go | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/model/websocket_message.go b/model/websocket_message.go index a1427e196..aea77b1b6 100644 --- a/model/websocket_message.go +++ b/model/websocket_message.go @@ -5,6 +5,7 @@ package model import ( "encoding/json" + "fmt" "io" ) @@ -59,11 +60,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{}) { @@ -84,6 +106,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) } |