package middleware import ( "log/slog" "net/http" "runtime/debug" ) // Recovery recovers from panics, logs the stack, and returns 500. func Recovery(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { slog.Error("panic recovered", "err", err, "stack", string(debug.Stack())) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(`{"error":"internal_error","message":"internal server error"}`)) } }() next.ServeHTTP(w, r) }) }