package server import ( "fmt" "log/slog" "net/http" ) type Admin struct { server *http.Server s *Server } func NewAdmin(listen string, s *Server) *Admin { if listen == "" { return nil } mux := http.NewServeMux() a := &Admin{ server: &http.Server{ Addr: listen, Handler: mux, }, s: s, } mux.HandleFunc("/health", a.healthHandler) return a } func (a *Admin) Start() { if a == nil { return } go func() { slog.Info("admin server listening", "addr", a.server.Addr) if err := a.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { slog.Error("admin server failed", "error", err) } }() } func (a *Admin) Close() error { if a == nil { return nil } return a.server.Close() } func (a *Admin) healthHandler(w http.ResponseWriter, r *http.Request) { if a.s == nil { http.Error(w, "not ready", http.StatusServiceUnavailable) return } if a.s.Ready() { w.WriteHeader(http.StatusOK) fmt.Fprint(w, "ok\n") return } http.Error(w, "not ready", http.StatusServiceUnavailable) }