broadcast.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package broadcast
  2. import (
  3. "encoding/json"
  4. "goseg/structs"
  5. "log/slog"
  6. "os"
  7. "sync"
  8. "github.com/gorilla/websocket"
  9. )
  10. var (
  11. logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
  12. clients = make(map[*websocket.Conn]bool)
  13. broadcastState structs.AuthBroadcast
  14. mu sync.RWMutex // synchronize access to broadcastState
  15. )
  16. // adds ws client
  17. func RegisterClient(conn *websocket.Conn) {
  18. clients[conn] = true
  19. }
  20. // remove ws client
  21. func UnregisterClient(conn *websocket.Conn) {
  22. delete(clients, conn)
  23. }
  24. // update the state and broadcast it to all clients
  25. // ex:
  26. // newState := structs.AuthBroadcast{ /* ... */ }
  27. // broadcast.UpdateState(newState)
  28. func UpdateState(newState structs.AuthBroadcast) {
  29. mu.Lock()
  30. defer mu.Unlock()
  31. broadcastState = newState
  32. broadcastToClients()
  33. }
  34. // mutex return broadcast state
  35. func GetState() structs.AuthBroadcast {
  36. mu.Lock()
  37. defer mu.Unlock()
  38. return broadcastState
  39. }
  40. // broadcast the global state to all clients
  41. func broadcastToClients() {
  42. broadcastJson, err := json.Marshal(broadcastState)
  43. if err != nil {
  44. logger.Error("Error marshalling response:", err)
  45. return
  46. }
  47. for client := range clients {
  48. if err := client.WriteMessage(websocket.TextMessage, broadcastJson); err != nil {
  49. logger.Error("Error writing response:", err)
  50. return
  51. }
  52. }
  53. }