mirror of
https://github.com/sablierapp/sablier.git
synced 2025-12-21 13:23:03 +01:00
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/sablierapp/sablier/internal/api"
|
|
"github.com/sablierapp/sablier/pkg/config"
|
|
)
|
|
|
|
func setupRouter(ctx context.Context, logger *slog.Logger, serverConf config.Server, s *api.ServeStrategy) *gin.Engine {
|
|
r := gin.New()
|
|
|
|
r.Use(StructuredLogger(logger))
|
|
r.Use(gin.Recovery())
|
|
|
|
registerRoutes(ctx, r, serverConf, s)
|
|
|
|
return r
|
|
}
|
|
|
|
func Start(ctx context.Context, logger *slog.Logger, serverConf config.Server, s *api.ServeStrategy) {
|
|
start := time.Now()
|
|
|
|
if logger.Enabled(ctx, slog.LevelDebug) {
|
|
gin.SetMode(gin.DebugMode)
|
|
} else {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
}
|
|
|
|
r := setupRouter(ctx, logger, serverConf, s)
|
|
|
|
server := &http.Server{
|
|
Addr: fmt.Sprintf(":%d", serverConf.Port),
|
|
Handler: r,
|
|
}
|
|
|
|
logger.Info("starting ",
|
|
slog.String("listen", server.Addr),
|
|
slog.Duration("startup", time.Since(start)),
|
|
slog.String("mode", gin.Mode()),
|
|
)
|
|
|
|
go StartHttp(server, logger)
|
|
|
|
// Graceful web server shutdown.
|
|
<-ctx.Done()
|
|
logger.Info("server: shutting down")
|
|
err := server.Close()
|
|
if err != nil {
|
|
logger.Error("server: shutdown failed", slog.Any("error", err))
|
|
}
|
|
}
|
|
|
|
// StartHttp starts the Web server in http mode.
|
|
func StartHttp(s *http.Server, logger *slog.Logger) {
|
|
if err := s.ListenAndServe(); err != nil {
|
|
if errors.Is(err, http.ErrServerClosed) {
|
|
logger.Info("server: shutdown complete")
|
|
} else {
|
|
logger.Error("server failed to start", slog.Any("error", err))
|
|
}
|
|
}
|
|
}
|