package main import ( "context" "flag" "log" "os" "os/signal" "syscall" "time" "checkpoint_service/middleware" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/compress" "github.com/gofiber/fiber/v2/middleware/logger" ) func main() { // Parse command-line flags port := flag.String("port", "8080", "Port to listen on") skipCheckpoint := flag.Bool("skip-checkpoint", false, "Skip the checkpoint middleware") flag.Parse() // Create Fiber app app := fiber.New() // Request logging app.Use(logger.New()) // Response compression app.Use(compress.New()) // Load and apply middleware plugins for _, handler := range middleware.LoadPlugins(*skipCheckpoint) { app.Use(handler) } log.Println("Loaded middleware plugins") // API group for proof-of-work endpoints api := app.Group("/api") api.Get("/pow/challenge", middleware.GetCheckpointChallengeHandler) api.Post("/pow/verify", middleware.VerifyCheckpointHandler) api.Get("/verify", middleware.VerifyCheckpointHandler) // Start the server in a goroutine go func() { addr := ":" + *port log.Printf("Checkpoint service starting on %s", addr) if err := app.Listen(addr); err != nil { log.Fatalf("Server error: %v", err) } }() // Graceful shutdown on SIGINT/SIGTERM quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := app.ShutdownWithContext(ctx); err != nil { log.Fatalf("Server forced to shutdown: %v", err) } log.Println("Server exiting") }