package main import ( "log" "net/http" "sync" "time" "github.com/gorilla/websocket" ) // WebSocket upgrader var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, // Allow all origins (CORS) CheckOrigin: func(r *http.Request) bool { return true }, } var ( clients = make(map[*websocket.Conn]bool) clientsMu sync.Mutex appState = "idle" appStateMu sync.Mutex ) func websocketHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("WebSocket upgrade error:", err) return } defer conn.Close() // Register client clientsMu.Lock() clients[conn] = true clientsMu.Unlock() log.Println("Client connected") // Optionally send initial state sendStateToClient(conn) for { _, _, err := conn.ReadMessage() if err != nil { break } // (Ignore incoming messages — or handle if needed) } // Remove client on disconnect clientsMu.Lock() delete(clients, conn) clientsMu.Unlock() log.Println("Client disconnected") } func setState(newState string) { appStateMu.Lock() defer appStateMu.Unlock() if appState != newState { appState = newState //log.Printf("State changed to: %s", newState) broadcastState() } } func broadcastState() { clientsMu.Lock() defer clientsMu.Unlock() for conn := range clients { err := conn.WriteJSON(map[string]string{ "type": "state_update", "state": appState, "time": time.Now().Format(time.RFC3339), }) if err != nil { log.Println("Error sending to client, removing:", err) conn.Close() delete(clients, conn) } } } func sendStateToClient(conn *websocket.Conn) { appStateMu.Lock() defer appStateMu.Unlock() conn.WriteJSON(map[string]string{ "type": "state_update", "state": appState, "time": time.Now().Format(time.RFC3339), }) }