mirror of
https://github.com/jwetzell/showbridge-go.git
synced 2026-04-26 12:55:29 +00:00
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package showbridge
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type Event struct {
|
|
Type string `json:"type"`
|
|
Data any `json:"data,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
func (e Event) toJSON() ([]byte, error) {
|
|
return json.Marshal(e)
|
|
}
|
|
|
|
func (r *Router) handleEvent(event Event, sender *websocket.Conn) {
|
|
switch event.Type {
|
|
case "ping":
|
|
r.unicastEvent(Event{Type: "pong"}, sender)
|
|
default:
|
|
r.logger.Warn("unknown event type", "eventType", event.Type)
|
|
}
|
|
}
|
|
|
|
func (r *Router) unicastEvent(event Event, conn *websocket.Conn) {
|
|
eventJSON, err := event.toJSON()
|
|
if err != nil {
|
|
r.logger.Error("failed to marshal event to JSON", "error", err)
|
|
return
|
|
}
|
|
err = conn.WriteMessage(websocket.TextMessage, eventJSON)
|
|
if err != nil {
|
|
r.logger.Error("failed to write message to websocket connection", "error", err)
|
|
}
|
|
}
|
|
|
|
func (r *Router) broadcastEvent(event Event, excluded ...*websocket.Conn) {
|
|
eventJSON, err := event.toJSON()
|
|
if err != nil {
|
|
r.logger.Error("failed to marshal event to JSON", "error", err)
|
|
return
|
|
}
|
|
r.wsConnsMu.Lock()
|
|
defer r.wsConnsMu.Unlock()
|
|
for _, conn := range r.wsConns {
|
|
exclude := false
|
|
for _, excludedConn := range excluded {
|
|
if conn == excludedConn {
|
|
exclude = true
|
|
break
|
|
}
|
|
}
|
|
if exclude {
|
|
continue
|
|
}
|
|
err := conn.WriteMessage(websocket.TextMessage, eventJSON)
|
|
if err != nil {
|
|
r.logger.Error("failed to write message to websocket connection", "error", err)
|
|
}
|
|
}
|
|
}
|