// Package server implements the HTTP server for Metacrypt. package server import ( "context" "database/sql" "log/slog" "sync" "google.golang.org/grpc" "git.wntrmute.dev/mc/mcdsl/httpserver" internacme "git.wntrmute.dev/mc/metacrypt/internal/acme" "git.wntrmute.dev/mc/metacrypt/internal/audit" "git.wntrmute.dev/mc/metacrypt/internal/auth" "git.wntrmute.dev/mc/metacrypt/internal/config" "git.wntrmute.dev/mc/metacrypt/internal/engine" "git.wntrmute.dev/mc/metacrypt/internal/policy" "git.wntrmute.dev/mc/metacrypt/internal/seal" ) // Server is the Metacrypt HTTP server. type Server struct { cfg *config.Config database *sql.DB seal *seal.Manager auth *auth.Authenticator policy *policy.Engine engines *engine.Registry audit *audit.Logger httpSrv *httpserver.Server grpcSrv *grpc.Server logger *slog.Logger acmeHandlers map[string]*internacme.Handler version string acmeMu sync.Mutex } // New creates a new server. func New(cfg *config.Config, database *sql.DB, sealMgr *seal.Manager, authenticator *auth.Authenticator, policyEngine *policy.Engine, engineRegistry *engine.Registry, auditLog *audit.Logger, logger *slog.Logger, version string) *Server { s := &Server{ cfg: cfg, database: database, seal: sealMgr, auth: authenticator, policy: policyEngine, engines: engineRegistry, audit: auditLog, logger: logger, version: version, } return s } // Start starts the HTTPS server. func (s *Server) Start() error { s.httpSrv = httpserver.New(s.cfg.Server.ServerConfig, s.logger) s.httpSrv.Router.Use(s.httpSrv.LoggingMiddleware) s.registerRoutes(s.httpSrv.Router) return s.httpSrv.ListenAndServeTLS() } // Shutdown gracefully shuts down the server. func (s *Server) Shutdown(ctx context.Context) error { if s.httpSrv != nil { return s.httpSrv.Shutdown(ctx) } return nil }