47 lines
1.1 KiB
Go
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
|
|
}
|