|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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")
- }
|