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" "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types" v1 "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/v1" "gitlink.org.cn/cloudream/jcs-pub/client/internal/services" ) type ServerEventChan = async.UnboundChannel[ServerEvent] type ServerEvent interface { IsServerEvent() bool } type ExitEvent struct { ServerEvent Err error } type Server struct { cfg *types.Config httpSrv *http.Server svc *services.Service eventChan *ServerEventChan v1Svr *v1.Server } func NewServer(cfg *types.Config, svc *services.Service) *Server { return &Server{ cfg: cfg, svc: svc, eventChan: async.NewUnboundChannel[ServerEvent](), v1Svr: v1.NewServer(cfg, svc), } } 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.v1Svr.InitRouters(engine.Group("/v1")) 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()) }