add event cache. sending all cached event when new websocket connection establish

This commit is contained in:
aynakeya
2024-05-14 22:28:15 +08:00
parent 46ea45580c
commit 9b6f681d4a
3 changed files with 28 additions and 2 deletions

View File

@@ -14,3 +14,9 @@ type EventDataReceived struct {
EventID event.EventId EventID event.EventId
Data json.RawMessage Data json.RawMessage
} }
var eventCache []*EventData
func init() {
eventCache = make([]*EventData, 0)
}

View File

@@ -112,6 +112,20 @@ func (s *wsServer) handleWsInfo(w http.ResponseWriter, r *http.Request) {
s.register(client) s.register(client)
defer s.unregister(client) defer s.unregister(client)
go client.start() go client.start()
// send initial data
for _, data := range eventCache {
// ignore empty
if data.EventID == "" {
continue
}
eventCacheData, _ := json.Marshal(data)
err := client.conn.WriteMessage(websocket.TextMessage, eventCacheData)
if err != nil {
s.log.Warn("write message failed", err)
return
}
}
// start message loop
for { for {
select { select {
case data := <-client.Data: case data := <-client.Data:

View File

@@ -162,19 +162,25 @@ func (w *WsHub) CreatePanel() fyne.CanvasObject {
} }
func (w *WsHub) registerEvents() { func (w *WsHub) registerEvents() {
i := 0
for eid, _ := range events.EventsMapping { for eid, _ := range events.EventsMapping {
eventCache = append(eventCache, &EventData{})
currentIdx := i
global.EventManager.RegisterA(eid, global.EventManager.RegisterA(eid,
"plugin.wshub.event."+string(eid), "plugin.wshub.event."+string(eid),
func(e *event.Event) { func(e *event.Event) {
val, err := json.Marshal(EventData{ ed := EventData{
EventID: e.Id, EventID: e.Id,
Data: e.Data, Data: e.Data,
}) }
val, err := json.Marshal(ed)
if err != nil { if err != nil {
w.log.Errorf("failed to marshal event data %v", err) w.log.Errorf("failed to marshal event data %v", err)
return return
} }
eventCache[currentIdx] = &ed
w.server.broadcast(val) w.server.broadcast(val)
}) })
i++
} }
} }