MCPcopy Index your code
hub / github.com/go-spring/go-spring / HandleStream

Function HandleStream

stdlib/httpsvr/handler.go:253–335  ·  view source on GitHub ↗

HandleStream wraps a StreamHandler into an http.HandlerFunc to handle streaming requests using Server-Sent Events (SSE).

(w http.ResponseWriter,
	r *http.Request, req Req, h StreamHandler[Req, Resp])

Source from the content-addressed store, hash-verified

251// HandleStream wraps a StreamHandler into an http.HandlerFunc to
252// handle streaming requests using Server-Sent Events (SSE).
253func HandleStream[Req RequestObject, Resp *Event[T], T any](w http.ResponseWriter,
254 r *http.Request, req Req, h StreamHandler[Req, Resp]) {
255
256 // Ensure the response writer supports flushing (required for SSE)
257 flusher, ok := w.(http.Flusher)
258 if !ok {
259 err := errutil.Explain(nil, "streaming not supported")
260 ErrorHandler(r, w, err)
261 return
262 }
263
264 if err := ReadRequest(r, req); err != nil {
265 ErrorHandler(r, w, err)
266 return
267 }
268
269 done := make(chan struct{})
270 responses := make(chan Resp)
271
272 go func() {
273 defer close(done)
274 var res *Event[T]
275 for res = range responses {
276
277 select {
278 case <-r.Context().Done():
279 return
280 default: // for linter
281 }
282
283 // Write SSE event
284 if res.HasID() {
285 if _, err := w.Write([]byte("id: " + res.GetID() + "\n")); err != nil {
286 ErrorHandler(r, w, err)
287 continue
288 }
289 }
290
291 // Write SSE event
292 if res.HasEvent() {
293 if _, err := w.Write([]byte("event: " + res.GetEvent() + "\n")); err != nil {
294 ErrorHandler(r, w, err)
295 continue
296 }
297 }
298
299 // Write SSE event
300 if _, err := w.Write([]byte("data: ")); err != nil {
301 ErrorHandler(r, w, err)
302 continue
303 }
304 if err := jsonflow.MarshalWrite(w, res.GetData()); err != nil {
305 ErrorHandler(r, w, err)
306 continue
307 }
308 if _, err := w.Write([]byte("\n")); err != nil {
309 ErrorHandler(r, w, err)
310 continue

Callers

nothing calls this directly

Calls 13

HasIDMethod · 0.95
GetIDMethod · 0.95
HasEventMethod · 0.95
GetEventMethod · 0.95
GetDataMethod · 0.95
HasRetryMethod · 0.95
GetRetryMethod · 0.95
ContextMethod · 0.80
ReadRequestFunction · 0.70
InitMethod · 0.65
hFunction · 0.50
WriteMethod · 0.45

Tested by

no test coverage detected