plugai_updsrv/pkg/controllers/controller_ws.go

72 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controllers
import (
"intent-system/pkg/dal/core"
"net/http"
"time"
"github.com/civet148/log"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
var upgrader1 = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
// 开发阶段允许所有来源,生产环境你可以限制
return true
},
}
func (m *Controller) DeployStatusWS(c *gin.Context) {
appID := c.Param("appID")
username := c.Param("user")
conn, err := upgrader1.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log.Warnf("WebSocket 升级失败: %v", err)
return
}
defer conn.Close()
// 设置超时时间
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
// 接收到 pong 帧,刷新 ReadDeadline
conn.SetPongHandler(func(string) error {
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
return nil
})
// 启动 ping 心跳(后台 goroutine 定时发 ping
go func() {
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
for range ticker.C {
// 发送 ping 帧,保持连接活跃
if err := conn.WriteControl(websocket.PingMessage, []byte("ping"), time.Now().Add(10*time.Second)); err != nil {
log.Warnf("发送 ping 失败: %v", err)
return
}
log.Debugf("➡️ 已发送 ping 帧到客户端")
}
}()
// 获取部署任务并 attach
task := core.GlobalTaskManager.Get(appID)
if task == nil {
conn.WriteMessage(websocket.TextMessage, []byte("任务未启动或已结束"))
return
}
task.Attach(conn, username)
defer task.Detach(conn)
// 保持连接监听(用于捕获客户端断开)
for {
if _, _, err := conn.ReadMessage(); err != nil {
log.Infof("🔌 客户端断开(%s/%s: %v", username, appID, err)
break
}
}
}