hash-of-wisdom/cmd/server/main.go

74 lines
1.7 KiB
Go
Raw Normal View History

2025-08-23 08:52:41 +03:00
package main
import (
"context"
"log/slog"
"os"
"os/signal"
"syscall"
"time"
"hash-of-wisdom/internal/lib/sl"
"hash-of-wisdom/internal/pow/challenge"
"hash-of-wisdom/internal/quotes"
"hash-of-wisdom/internal/server"
"hash-of-wisdom/internal/service"
)
func main() {
addr := ":8080"
if len(os.Args) > 1 {
addr = os.Args[1]
}
logger := slog.Default()
logger.Info("starting word of wisdom server", "address", addr)
// Create components
challengeConfig, err := challenge.NewConfig()
if err != nil {
logger.Error("failed to create config", sl.Err(err))
os.Exit(1)
}
generator := challenge.NewGenerator(challengeConfig)
verifier := challenge.NewVerifier(challengeConfig)
quoteService := quotes.NewHTTPService()
// Wire up service
genAdapter := service.NewGeneratorAdapter(generator)
wisdomService := service.NewWisdomService(genAdapter, verifier, quoteService)
// Create server configuration
serverConfig := server.DefaultConfig()
serverConfig.Address = addr
// Create server
srv := server.NewTCPServer(wisdomService,
server.WithConfig(serverConfig),
server.WithLogger(logger))
// Start server
ctx := context.Background()
if err := srv.Start(ctx); err != nil {
logger.Error("failed to start server", sl.Err(err))
os.Exit(1)
}
// Wait for interrupt
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
logger.Info("server ready - press ctrl+c to stop")
<-sigChan
// Graceful shutdown
logger.Info("shutting down server")
if err := srv.Stop(); err != nil {
logger.Error("error during shutdown", sl.Err(err))
}
// Give connections time to close
time.Sleep(100 * time.Millisecond)
logger.Info("server stopped")
}