MCPcopy Index your code
hub / github.com/coder/coder / ServerSentEventSender

Function ServerSentEventSender

coderd/httpapi/httpapi.go:306–408  ·  view source on GitHub ↗

ServerSentEventSender establishes a Server-Sent Event connection and allows the consumer to send messages to the client. The function returned allows you to send a single message to the client, while the channel lets you listen for when the connection closes. As much as possible, this function sho

(rw http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

304// As much as possible, this function should be avoided in favor of using the
305// OneWayWebSocket function. See OneWayWebSocket for more context.
306func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
307 func(sse codersdk.ServerSentEvent) error,
308 <-chan struct{},
309 error,
310) {
311 h := rw.Header()
312 h.Set("Content-Type", "text/event-stream")
313 h.Set("Cache-Control", "no-cache")
314 h.Set("Connection", "keep-alive")
315 h.Set("X-Accel-Buffering", "no")
316
317 f, ok := rw.(http.Flusher)
318 if !ok {
319 panic("http.ResponseWriter is not http.Flusher")
320 }
321
322 ctx := r.Context()
323 closed := make(chan struct{})
324 type sseEvent struct {
325 payload []byte
326 errC chan error
327 }
328 eventC := make(chan sseEvent)
329
330 // Synchronized handling of events (no guarantee of order).
331 go func() {
332 defer close(closed)
333 ticker := time.NewTicker(HeartbeatInterval)
334 defer ticker.Stop()
335
336 for {
337 var event sseEvent
338 select {
339 case <-ctx.Done():
340 return
341 case event = <-eventC:
342 case <-ticker.C:
343 event = sseEvent{
344 payload: []byte(fmt.Sprintf("event: %s\n\n", codersdk.ServerSentEventTypePing)),
345 }
346 }
347
348 _, err := rw.Write(event.payload)
349 if event.errC != nil {
350 event.errC <- err
351 }
352 if err != nil {
353 return
354 }
355 f.Flush()
356 }
357 }()
358
359 sendEvent := func(newEvent codersdk.ServerSentEvent) error {
360 buf := &bytes.Buffer{}
361 _, err := buf.WriteString(fmt.Sprintf("event: %s\n", newEvent.Type))
362 if err != nil {
363 return err

Callers 3

TransmitMethod · 0.92
TestExpMcpReporterFunction · 0.92

Calls 12

WriteStringMethod · 0.80
EncodeMethod · 0.80
ErrMethod · 0.80
SetMethod · 0.65
ContextMethod · 0.65
StopMethod · 0.65
WriteMethod · 0.65
FlushMethod · 0.65
NewMethod · 0.65
HeaderMethod · 0.45
DoneMethod · 0.45
BytesMethod · 0.45

Tested by 2

TestExpMcpReporterFunction · 0.74