| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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
- }
- }
- }
|