package contracts import ( "io" "net/http" "git.fsdpf.net/go/req" "github.com/samber/do/v2" ) type EventStream interface { Controller // 获取请求信息 Request() *http.Request // 请求处理 Execute(req.GlobalParams) error // 获取用户信息 User() req.User // 路由信息 Route() req.Route // 发送数据 Sent(data, event string) error } type EsHandleController struct { Controller w http.ResponseWriter flusher http.Flusher request *http.Request } func (this EsHandleController) Request() *http.Request { return this.request } func (this EsHandleController) Route() req.Route { return this.Request().Context().Value(req.RouteCtx{Name: "Route"}).(req.Route) } func (this EsHandleController) User() req.User { return this.Request().Context().Value(req.RouteCtx{Name: "User"}).(req.User) } func (this EsHandleController) Execute(req.GlobalParams) error { return ErrFuncNotImplemented } func (this EsHandleController) Sent(data, event string) error { if _, err := io.WriteString(this.w, "event: "+event+"\ndata: "+data+"\n\n"); err != nil { return err } this.flusher.Flush() return nil } func NewEventStreamController(container do.Injector, request *http.Request, w http.ResponseWriter) EventStream { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") return &EsHandleController{ Controller: &BaseController{container}, request: request, w: w, flusher: w.(http.Flusher), } }