package http import ( "context" "net/http" "github.com/gin-gonic/gin" "gitlink.org.cn/cloudream/common/pkgs/async" "gitlink.org.cn/cloudream/common/pkgs/logger" hubapi "gitlink.org.cn/cloudream/jcs-pub/hub/sdk/api" ) type ServerEventChan = async.UnboundChannel[ServerEvent] type ServerEvent interface { IsServerEvent() bool } type ExitEvent struct { ServerEvent Err error } type Server struct { cfg *Config httpSrv *http.Server svc *Service eventChan *ServerEventChan } func NewServer(cfg *Config, svc *Service) *Server { return &Server{ cfg: cfg, svc: svc, eventChan: async.NewUnboundChannel[ServerEvent](), } } func (s *Server) Start() *ServerEventChan { go func() { if s.cfg == nil { return } engine := gin.New() s.httpSrv = &http.Server{ Addr: s.cfg.Listen, Handler: engine, } s.initRouters(engine) logger.Infof("start serving http at: %s", s.cfg.Listen) err := s.httpSrv.ListenAndServe() s.eventChan.Send(ExitEvent{Err: err}) }() return s.eventChan } func (s *Server) Stop() { if s.httpSrv == nil { s.eventChan.Send(ExitEvent{}) return } s.httpSrv.Shutdown(context.Background()) } func (s *Server) initRouters(engine *gin.Engine) { engine.GET(hubapi.GetStreamPath, s.IOSvc().GetStream) engine.POST(hubapi.SendStreamPath, s.IOSvc().SendStream) engine.POST(hubapi.ExecuteIOPlanPath, s.IOSvc().ExecuteIOPlan) engine.POST(hubapi.SendVarPath, s.IOSvc().SendVar) engine.GET(hubapi.GetVarPath, s.IOSvc().GetVar) }