package ws import ( "encoding/json" "visiona-local/server/pkg/logger" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) func ServerLogsHandler(hub *Hub, broadcaster *logger.Broadcaster) gin.HandlerFunc { return func(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { return } defer conn.Close() client := &Client{Conn: conn, Send: make(chan []byte, 100)} sub := &Subscription{Client: client, Room: "server-logs"} hub.RegisterSync(sub) defer hub.Unregister(sub) // Send buffered recent logs to the newly connected client if broadcaster != nil { for _, entry := range broadcaster.Recent() { data, err := json.Marshal(entry) if err != nil { continue } select { case client.Send <- data: default: return } } } // Read pump — drain incoming messages (close frames) go func() { defer conn.Close() for { if _, _, err := conn.ReadMessage(); err != nil { break } } }() // Write pump for msg := range client.Send { if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil { return } } } }