package broadcast import ( "encoding/json" "goseg/structs" "log/slog" "os" "sync" "github.com/gorilla/websocket" ) var ( logger = slog.New(slog.NewJSONHandler(os.Stdout, nil)) clients = make(map[*websocket.Conn]bool) broadcastState structs.AuthBroadcast mu sync.RWMutex // synchronize access to broadcastState ) // adds ws client func RegisterClient(conn *websocket.Conn) { clients[conn] = true } // remove ws client func UnregisterClient(conn *websocket.Conn) { delete(clients, conn) } // update the state and broadcast it to all clients // ex: // newState := structs.AuthBroadcast{ /* ... */ } // broadcast.UpdateState(newState) func UpdateState(newState structs.AuthBroadcast) { mu.Lock() defer mu.Unlock() broadcastState = newState broadcastToClients() } // mutex return broadcast state func GetState() structs.AuthBroadcast { mu.Lock() defer mu.Unlock() return broadcastState } // broadcast the global state to all clients func broadcastToClients() { broadcastJson, err := json.Marshal(broadcastState) if err != nil { logger.Error("Error marshalling response:", err) return } for client := range clients { if err := client.WriteMessage(websocket.TextMessage, broadcastJson); err != nil { logger.Error("Error writing response:", err) return } } }