package handler import ( "net/http" "time" "ckwk/pkg/log" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) var debugLogUpgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func DebugLogWS(ctx *gin.Context) { conn, err := debugLogUpgrader.Upgrade(ctx.Writer, ctx.Request, nil) if err != nil { return } defer conn.Close() subID, ch := log.Subscribe() defer log.Unsubscribe(subID) for _, entry := range log.Entries() { if err := conn.WriteJSON(entry); err != nil { return } } done := make(chan struct{}) go func() { defer close(done) for { if _, _, err := conn.ReadMessage(); err != nil { return } } }() ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for { select { case <-done: return case entry, ok := <-ch: if !ok { return } if err := conn.WriteJSON(entry); err != nil { return } case <-ticker.C: if err := conn.WriteMessage(websocket.PingMessage, []byte("ping")); err != nil { return } } } }