mux/router_serve.go

43 lines
852 B
Go
Raw Normal View History

2024-10-12 14:04:17 +00:00
package mux
import (
"context"
2024-10-12 15:27:57 +00:00
"errors"
2024-10-12 14:04:17 +00:00
"log/slog"
"net/http"
"os"
"os/signal"
)
type ServeCB func(srv *http.Server) error
2024-10-12 15:27:57 +00:00
// Serve with graceful shutdown
2024-10-12 14:04:17 +00:00
func (r *Router) Serve(cb ServeCB) {
srv := &http.Server{
Handler: r,
}
idleConnsClosed := make(chan struct{})
go func() {
sigint := make(chan os.Signal, 1)
signal.Notify(sigint, os.Interrupt)
<-sigint
// We received an interrupt signal, shut down.
if err := srv.Shutdown(context.Background()); err != nil {
// Error from closing listeners, or context timeout:
slog.Error("server shutdown error", "error", err)
} else {
slog.Info("server shutdown")
}
close(idleConnsClosed)
}()
2024-10-12 15:27:57 +00:00
if err := cb(srv); !errors.Is(err, http.ErrServerClosed) {
2024-10-12 14:04:17 +00:00
// Error starting or closing listener:
slog.Error("start server error", "error", err)
}
<-idleConnsClosed
}