package main import ( "encoding/json" "log/slog" "net/http" "os" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/openmeterio/openmeter/api" ) func startMockServer() { port := os.Getenv("PORT") if port == "" { port = "7860" // Default port for Hugging Face Spaces } addr := "0.0.0.0:" + port slog.Info("Starting OpenMeter Mock Server for Hugging Face Spaces", "address", addr) r := chi.NewRouter() r.Use(middleware.RequestID) r.Use(middleware.RealIP) r.Use(middleware.Logger) r.Use(middleware.Recoverer) // Swagger Spec swagger, err := api.GetSwagger() var swaggerJSON []byte if err == nil { swagger.Servers = nil swaggerJSON, _ = json.Marshal(swagger) } // Redirect root to api-docs r.Get("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/api-docs", http.StatusFound) }) // /health r.Get("/health", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("OK")) }) // /api/swagger.json r.Get("/api/swagger.json", func(w http.ResponseWriter, r *http.Request) { if len(swaggerJSON) > 0 { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, _ = w.Write(swaggerJSON) } else { http.Error(w, "Swagger spec not found", http.StatusNotFound) } }) // /api-docs r.Get("/api-docs", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(` OpenMeter API Documentation (Mock Server)
`)) }) // GET /api/v1/meters r.Get("/api/v1/meters", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(`[ { "id": "api_requests_total", "slug": "api_requests_total", "description": "API Requests", "eventType": "request", "aggregation": "COUNT" }, { "id": "tokens_total", "slug": "tokens_total", "description": "AI Token Usage", "eventType": "prompt", "aggregation": "SUM" } ]`)) }) // POST /api/v1/events r.Post("/api/v1/events", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusAccepted) _, _ = w.Write([]byte(`{"status": "accepted"}`)) }) // GET /api/v1/meters/{meterIdOrSlug}/query r.Get("/api/v1/meters/{meterIdOrSlug}/query", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(`{ "data": [ { "value": 150, "windowStart": "2026-07-07T00:00:00Z", "windowEnd": "2026-07-07T01:00:00Z" } ] }`)) }) err = http.ListenAndServe(addr, r) if err != nil { slog.Error("Mock server stopped with error", "error", err) os.Exit(1) } }