// Package relay 负责流式转发:把适配器增量以 SSE 帧写出。 // 转发红线(shenshi-gateway.md §5):X-Accel-Buffering 防代理缓冲;帧即写即刷。 package relay import ( "encoding/json" "fmt" "net/http" "hunjing/shenshi/internal/ir" ) // SSEHeaders 设置流式响应头(在写第一帧前调用)。 func SSEHeaders(w http.ResponseWriter) { w.Header().Set("Content-Type", "text/event-stream; charset=utf-8") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("X-Accel-Buffering", "no") } // WriteDelta 写一帧增量事件(data: )。 func WriteDelta(w http.ResponseWriter, d ir.Delta) error { body, err := json.Marshal(d) if err != nil { return fmt.Errorf("序列化增量失败: %w", err) } _, err = fmt.Fprintf(w, "data: %s\n\n", body) if err != nil { return err } if f, ok := w.(http.Flusher); ok { f.Flush() } return nil } // WriteDone 写终止帧(data: [DONE])。 func WriteDone(w http.ResponseWriter) error { _, err := fmt.Fprint(w, "data: [DONE]\n\n") if err != nil { return err } if f, ok := w.(http.Flusher); ok { f.Flush() } return nil }