package server import ( "log/slog" "net/http" "time" "crypto/ecdsa" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "gitea.songhuwan.com/actions/docker-compose-updater/internal/auth" "gitea.songhuwan.com/actions/docker-compose-updater/internal/docker" ) // Server 封装 HTTP 服务器。 type Server struct { addr string router *chi.Mux srv *http.Server } // New 创建 Server。 func New( addr string, verifyKey *ecdsa.PublicKey, updater *docker.Updater, sessionTTL time.Duration, nonceTTL time.Duration, timeWindow time.Duration, ) *Server { sessionMgr := auth.NewSessionManager(sessionTTL) nonceCache := auth.NewNonceCache(nonceTTL) h := NewHandler(verifyKey, sessionMgr, nonceCache, updater, timeWindow) r := chi.NewRouter() r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Use(middleware.RequestSize(1024 * 1024)) // 1MB r.Get("/health", h.Health) r.Post("/session", h.HandleSession) r.Post("/hook", h.HandleHook) return &Server{ addr: addr, router: r, } } // Start 启动 HTTP 服务器。 func (s *Server) Start() error { s.srv = &http.Server{ Addr: s.addr, Handler: s.router, } slog.Info("server starting", "addr", s.addr) return s.srv.ListenAndServe() }