package handler import ( "net/http" "time" "github.com/Tencent/WeKnora/internal/application/service" apperrors "github.com/Tencent/WeKnora/internal/errors" "github.com/gin-gonic/gin" ) func (h *DigitalHumanHandler) Trial(c *gin.Context) { c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, 32<<10) var input service.DigitalHumanTrialInput if err := c.ShouldBindJSON(&input); err != nil { c.Error(apperrors.NewBadRequestError("请填写有效的试写版本、主题和要求")) return } stream, err := h.service.Trial(c.Request.Context(), c.Param("id"), input) if err != nil { digitalHumanHTTPError(c, err) return } c.Header("Content-Type", "text/event-stream") c.Header("Cache-Control", "no-cache, no-transform") c.Header("X-Accel-Buffering", "no") c.Writer.Flush() ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for { select { case <-c.Request.Context().Done(): return case event, ok := <-stream: if !ok { return } c.SSEvent("trial", event) c.Writer.Flush() case <-ticker.C: c.SSEvent("heartbeat", gin.H{"status": "running"}) c.Writer.Flush() } } }