package handlers import ( "log" "net/http" "aroll/ws" gws "github.com/gorilla/websocket" ) var upgrader = gws.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 4096, CheckOrigin: func(r *http.Request) bool { return true }, } func WSHandler(hub *ws.Hub) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Printf("ws upgrade: %v", err) return } client := &ws.Client{Send: make(chan []byte, 256)} hub.Register <- client // Writer goroutine: pumps messages from hub → WebSocket go func() { defer conn.Close() for msg := range client.Send { if err := conn.WriteMessage(gws.TextMessage, msg); err != nil { return } } }() // Reader loop: keeps the connection alive and detects close frames for { if _, _, err := conn.ReadMessage(); err != nil { break } } hub.Unregister <- client } }