package ws import ( "log" "github.com/coder/websocket" "github.com/gin-gonic/gin" "everypublish/server/internal/auth" "everypublish/server/internal/config" ) // HandleBrowser 浏览器实时通道:?token=JWT 鉴权,只读订阅工作空间事件 func HandleBrowser(cfg *config.Config, hub *Hub) gin.HandlerFunc { return func(c *gin.Context) { claims, err := auth.ParseAccess(cfg.JWTSecret, c.Query("token")) if err != nil { c.JSON(401, gin.H{"code": 1002, "message": "令牌无效"}) return } conn, err := websocket.Accept(c.Writer, c.Request, &websocket.AcceptOptions{InsecureSkipVerify: true}) if err != nil { return } sess := &Conn{ ID: randHex(16), Kind: "browser", WSID: claims.WorkspaceID, ws: conn, send: make(chan []byte, 64), } hub.RegisterBrowser(sess) go sess.writeLoop() log.Printf("[ws] browser session %s online (workspace %d)", sess.ID, claims.WorkspaceID) defer func() { hub.UnregisterBrowser(sess) log.Printf("[ws] browser session %s offline", sess.ID) }() for { if _, _, err = conn.Read(c.Request.Context()); err != nil { return } } } }