package ws import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) // FirmwareProgressHandler — M9-4 hot-fix。 // // 對稱於 FlashProgressHandler。Client 連 /ws/devices/:id/firmware-progress // 後會被 join 到 room "firmware:",由 // firmware_handler.forwardProgressToWS 透過 hub.BroadcastToRoom 推進度。 // // 行為與 flash 版完全一致: // - 共用 package-level upgrader(CheckOrigin = loopback 白名單,見 device_events_ws.go) // - 用 RegisterSync 確保 client 已 join room 才回到 read/write loop // - 一個 goroutine drain client 端 incoming 訊息(純為觸發斷線偵測) // - 主 goroutine 把 client.Send channel 的訊息 WriteMessage 到 conn // - conn / unregister 統一由 defer 處理 func FirmwareProgressHandler(hub *Hub) gin.HandlerFunc { return func(c *gin.Context) { deviceID := c.Param("id") conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { return } defer conn.Close() client := &Client{Conn: conn, Send: make(chan []byte, 20)} room := "firmware:" + deviceID sub := &Subscription{Client: client, Room: room} hub.RegisterSync(sub) defer hub.Unregister(sub) // Read pump — drain incoming messages; close handled by outer defer go func() { for { if _, _, err := conn.ReadMessage(); err != nil { break } } }() for msg := range client.Send { if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil { return } } } }