@@ -2,6 +2,7 @@ package server
22
33import (
44 "context"
5+ "encoding/json"
56 "net/http"
67 "strings"
78 "sync"
@@ -110,33 +111,59 @@ func (h *SocketHub) deleteSubscriber(s *socketSubscriber) {
110111}
111112
112113func (h * SocketHub ) welcome (subscriber * socketSubscriber , params []util.Param ) {
113- var msg strings. Builder
114- msg . WriteString ( "{" )
114+ msg := make ( map [ string ]json. RawMessage , len ( params ))
115+
115116 for _ , p := range params {
116- if msg .Len () > 1 {
117- msg .WriteString ("," )
117+ k := p .Key
118+ if p .Loadpoint != nil {
119+ k = "loadpoints." + p .UniqueID ()
118120 }
119- msg .WriteString (kv (p ))
121+
122+ msg [k ] = json .RawMessage (socketEncode (p .Val ))
120123 }
121- msg .WriteString ("}" )
124+
125+ b , _ := json .Marshal (msg )
122126
123127 // should not block
124- subscriber .send <- [] byte ( msg . String ())
128+ subscriber .send <- b
125129}
126130
127131func (h * SocketHub ) broadcast (p util.Param ) {
128132 h .mu .RLock ()
129133 defer h .mu .RUnlock ()
130134
131- if len (h .subscribers ) > 0 {
132- msg := "{" + kv (p ) + "}"
135+ if len (h .subscribers ) == 0 {
136+ return
137+ }
138+
139+ msg := make (map [string ]json.RawMessage )
133140
134- for s := range h .subscribers {
135- select {
136- case s .send <- []byte (msg ):
137- default :
138- s .closeSlow ()
139- }
141+ k := p .Key
142+ if p .Loadpoint != nil {
143+ k = "loadpoints." + p .UniqueID ()
144+ }
145+
146+ // Sharder splits data into chunks
147+ if sp , ok := (p .Val ).(util.Sharder ); ok {
148+ shards := sp .Shards ()
149+ if len (shards ) == 0 {
150+ return // nothing changed, skip broadcast
151+ }
152+
153+ for _ , shard := range shards {
154+ msg [k + "." + shard .Key ] = json .RawMessage (socketEncode (shard .Value ))
155+ }
156+ } else {
157+ msg [k ] = json .RawMessage (socketEncode (p .Val ))
158+ }
159+
160+ b , _ := json .Marshal (msg )
161+
162+ for s := range h .subscribers {
163+ select {
164+ case s .send <- b :
165+ default :
166+ s .closeSlow ()
140167 }
141168 }
142169}
0 commit comments