update some...
All checks were successful
Build go program / Explore-Gitea-Actions (push) Successful in 13m4s
All checks were successful
Build go program / Explore-Gitea-Actions (push) Successful in 13m4s
This commit is contained in:
102
websocket.go
Normal file
102
websocket.go
Normal file
@@ -0,0 +1,102 @@
|
||||
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),
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user