package http import ( "net/http" "github.com/gin-gonic/gin" "gitlink.org.cn/cloudream/common/pkgs/logger" "gitlink.org.cn/cloudream/common/utils/serder" "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types" cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1" "gitlink.org.cn/cloudream/jcs-pub/common/ecode" "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/sysevent" ) type SysEventService struct { *Server } func (s *Server) SysEvent() *SysEventService { return &SysEventService{s} } func (s *SysEventService) Watch(ctx *gin.Context) { log := logger.WithField("HTTP", "SysEvent.Watch") _, err := types.ShouldBindJSONEx[cliapi.SysEventWatch](ctx) if err != nil { log.Warnf("binding body: %s", err.Error()) ctx.JSON(http.StatusBadRequest, types.Failed(ecode.BadArgument, "%v", err)) return } if s.svc.EvtWatcher == nil { ctx.JSON(http.StatusOK, types.Failed(ecode.OperationFailed, "event watcher not configured")) return } ctx.Writer.Header().Set("Content-Type", "text/event-stream") ctx.Writer.Header().Set("Cache-Control", "no-cache") ctx.Writer.Header().Set("Connection", "keep-alive") wtchr := s.svc.EvtWatcher.AddWatcherFn(func(event sysevent.SysEvent) { data, err := serder.ObjectToJSONEx(event) if err != nil { log.Warnf("serializing event: %s", err.Error()) return } ctx.SSEvent("message", string(data)) ctx.Writer.Flush() }) <-ctx.Request.Context().Done() s.svc.EvtWatcher.RemoveWatcher(wtchr) log.Debugf("event watcher stopped") }