c7cc92382b
Co-authored-by: nova28 <17953305+nova28@users.noreply.github.com> Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package websocket
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
ws "github.com/kandev/kandev/pkg/websocket"
|
|
)
|
|
|
|
// rememberAndBroadcastSessionLaunchWarning stores the latest warning before
|
|
// the live fan-out. This ordering closes the subscribe-versus-publish race:
|
|
// a client either receives the live notification or replays the cached frame
|
|
// when it joins later.
|
|
func (h *Hub) rememberAndBroadcastSessionLaunchWarning(sessionID string, message *ws.Message) {
|
|
if sessionID == "" || message == nil {
|
|
return
|
|
}
|
|
data, err := json.Marshal(message)
|
|
if err != nil {
|
|
return
|
|
}
|
|
h.mu.Lock()
|
|
if h.sessionLaunchWarnings == nil {
|
|
h.sessionLaunchWarnings = make(map[string][]byte)
|
|
}
|
|
h.sessionLaunchWarnings[sessionID] = append([]byte(nil), data...)
|
|
h.mu.Unlock()
|
|
h.BroadcastToSession(sessionID, message)
|
|
}
|
|
|
|
func (h *Hub) clearSessionLaunchWarning(sessionID string) {
|
|
if sessionID == "" {
|
|
return
|
|
}
|
|
h.mu.Lock()
|
|
delete(h.sessionLaunchWarnings, sessionID)
|
|
h.mu.Unlock()
|
|
}
|
|
|
|
func (h *Hub) replaySessionLaunchWarning(client *Client, sessionID string) {
|
|
if client == nil || sessionID == "" {
|
|
return
|
|
}
|
|
h.mu.RLock()
|
|
data := append([]byte(nil), h.sessionLaunchWarnings[sessionID]...)
|
|
h.mu.RUnlock()
|
|
if len(data) == 0 {
|
|
return
|
|
}
|
|
client.sendNotificationFrame(newOutboundNotification(data, ws.ActionSessionLaunchWarning))
|
|
}
|