package main import ( "context" "encoding/json" "errors" "log/slog" "net/http" "os" "os/signal" "syscall" "time" ) func main() { // 1. Setup Logger // Use JSON handler for structured logging logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelDebug, // Log debug messages and above })) slog.SetDefault(logger) // Set as default logger for convenience logger.Info("Starting Stream Converter API Server...") // 2. Setup Router (Go 1.22+ ServeMux) mux := http.NewServeMux() // Wrap handler with logger middleware (or pass logger directly) chatHandler := func(w http.ResponseWriter, r *http.Request) { chatCompletionsHandler(logger, w, r) } mux.HandleFunc("POST /v1/chat/completions", chatHandler) // Add a simple health check endpoint mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(map[string]string{"status": "ok"}) logger.Debug("Health check accessed") }) // 3. Configure HTTP Server server := &http.Server{ Addr: ":8080", // Listen on port 8080 Handler: mux, ReadTimeout: 10 * time.Second, // Example timeout values WriteTimeout: 90 * time.Second, // Longer for potential streaming IdleTimeout: 120 * time.Second, } // 4. Start Server in a Goroutine go func() { logger.Info("Server listening", "address", server.Addr) if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { logger.Error("Server failed to start", "error", err) os.Exit(1) } }() // 5. Graceful Shutdown Handling quit := make(chan os.Signal, 1) // signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) signal.Notify(quit, os.Interrupt, syscall.SIGTERM) // More portable signals // Block until a signal is received sig := <-quit logger.Info("Shutdown signal received", "signal", sig.String()) // Create a context with timeout for shutdown ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Attempt graceful shutdown if err := server.Shutdown(ctx); err != nil { logger.Error("Server shutdown failed", "error", err) os.Exit(1) } logger.Info("Server gracefully stopped") }