Files
hunjing/shenshi/internal/relay/sse.go
T

47 lines
1.1 KiB
Go

// 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: <Delta JSON>)。
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
}