66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
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")
|
|
}
|