diff options
Diffstat (limited to 'internal/server/admin.go')
| -rw-r--r-- | internal/server/admin.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/server/admin.go b/internal/server/admin.go new file mode 100644 index 0000000..46242d4 --- /dev/null +++ b/internal/server/admin.go @@ -0,0 +1,62 @@ +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) +} |
