package gateway import ( "bufio" "encoding/json" "fmt" "net" "net/http" ) type statusResponseWriter struct { http.ResponseWriter status int bytes int } func (w *statusResponseWriter) WriteHeader(code int) { w.status = code w.ResponseWriter.WriteHeader(code) } func (w *statusResponseWriter) Write(b []byte) (int, error) { n, err := w.ResponseWriter.Write(b) w.bytes += n return n, err } // Ensure websocket upgrades work by preserving Hijacker/Flusher/Pusher // interfaces when the underlying ResponseWriter supports them. func (w *statusResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { if h, ok := w.ResponseWriter.(http.Hijacker); ok { return h.Hijack() } return nil, nil, fmt.Errorf("hijacker not supported") } func (w *statusResponseWriter) Flush() { if f, ok := w.ResponseWriter.(http.Flusher); ok { f.Flush() } } func (w *statusResponseWriter) Push(target string, opts *http.PushOptions) error { if p, ok := w.ResponseWriter.(http.Pusher); ok { return p.Push(target, opts) } return http.ErrNotSupported } // writeJSON writes JSON with status code func writeJSON(w http.ResponseWriter, code int, v any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) _ = json.NewEncoder(w).Encode(v) } // writeError writes a standardized JSON error func writeError(w http.ResponseWriter, code int, msg string) { writeJSON(w, code, map[string]any{"error": msg}) }