// Code scaffolded by goctl. Safe to edit. // goctl 1.10.1 package handler import ( "encoding/json" "fmt" "net/http" "github.com/zeromicro/go-zero/rest/httpx" "img_infinite_canvas/internal/logic" "img_infinite_canvas/internal/svc" "img_infinite_canvas/internal/types" ) func projectEventsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.ProjectIdRequest if err := httpx.Parse(r, &req); err != nil { httpx.ErrorCtx(r.Context(), w, err) return } flusher, ok := w.(http.Flusher) if !ok { httpx.ErrorCtx(r.Context(), w, fmt.Errorf("streaming is not supported")) return } header := w.Header() header.Set("Content-Type", "text/event-stream") header.Set("Cache-Control", "no-cache") header.Set("Connection", "keep-alive") header.Set("X-Accel-Buffering", "no") l := logic.NewProjectEventsLogic(r.Context(), svcCtx) threadID := r.URL.Query().Get("threadId") if threadID == "" { threadID = r.URL.Query().Get("thread_id") } err := l.Stream(&req, threadID, func(event string, payload any) error { data, err := json.Marshal(payload) if err != nil { return err } if _, err := fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, data); err != nil { return err } flusher.Flush() return nil }) if err != nil && r.Context().Err() == nil { data, _ := json.Marshal(map[string]string{"error": err.Error()}) _, _ = fmt.Fprintf(w, "event: stream_error\ndata: %s\n\n", data) flusher.Flush() } } }