51 lines
1.0 KiB
Go
51 lines
1.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"mengyamonitor-backend-server/internal/hub"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
var wsUpgrader = websocket.Upgrader{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
return true
|
|
},
|
|
}
|
|
|
|
// MonitorWebSocket upgrades to WebSocket and streams hub snapshots.
|
|
func MonitorWebSocket(h *hub.Hub) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
conn, err := wsUpgrader.Upgrade(c.Writer, c.Request, nil)
|
|
if err != nil {
|
|
log.Printf("ws: upgrade: %v", err)
|
|
return
|
|
}
|
|
defer h.Unregister(conn)
|
|
snap, err := h.BuildSnapshotMessage()
|
|
if err != nil {
|
|
_ = conn.Close()
|
|
return
|
|
}
|
|
_ = conn.SetWriteDeadline(time.Now().Add(15 * time.Second))
|
|
if err := conn.WriteMessage(websocket.TextMessage, snap); err != nil {
|
|
_ = conn.Close()
|
|
return
|
|
}
|
|
h.AddSubscriber(conn)
|
|
for {
|
|
_ = conn.SetReadDeadline(time.Now().Add(120 * time.Second))
|
|
_, _, err := conn.ReadMessage()
|
|
if err != nil {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|