Files
EveryPublish/server/internal/ws/browser.go
T

46 lines
1.1 KiB
Go

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
}
}
}
}