package ws import ( "encoding/json" "sync" "github.com/gorilla/websocket" ) type Hub struct { mu sync.RWMutex clients map[*websocket.Conn]struct{} } type Event struct { Type string `json:"type"` Data interface{} `json:"data"` } func NewHub() *Hub { return &Hub{clients: make(map[*websocket.Conn]struct{})} } func (h *Hub) Add(conn *websocket.Conn) { h.mu.Lock() defer h.mu.Unlock() h.clients[conn] = struct{}{} } func (h *Hub) Remove(conn *websocket.Conn) { h.mu.Lock() defer h.mu.Unlock() delete(h.clients, conn) } func (h *Hub) Broadcast(event Event) { payload, err := json.Marshal(event) if err != nil { return } h.mu.RLock() defer h.mu.RUnlock() for conn := range h.clients { _ = conn.WriteMessage(websocket.TextMessage, payload) } }