Files
fn_registry/functions/infra/sse_send.go
T

44 lines
1.1 KiB
Go

package infra
import (
"fmt"
"net/http"
"strings"
)
// SSESend escribe un evento SSE formateado al ResponseWriter y hace flush si es posible.
// Sigue la spec W3C: campos opcionales (event, id, retry) solo se incluyen si tienen valor.
// Data con saltos de linea se traduce a multiples lineas "data:" segun la spec.
// Retorna error si la escritura falla.
func SSESend(w http.ResponseWriter, event SSEEvent) error {
var b strings.Builder
if event.Event != "" {
b.WriteString("event: ")
b.WriteString(event.Event)
b.WriteByte('\n')
}
if event.ID != "" {
b.WriteString("id: ")
b.WriteString(event.ID)
b.WriteByte('\n')
}
if event.Retry > 0 {
fmt.Fprintf(&b, "retry: %d\n", event.Retry)
}
// Data: cada salto de linea genera una nueva linea "data:"
for _, line := range strings.Split(event.Data, "\n") {
b.WriteString("data: ")
b.WriteString(line)
b.WriteByte('\n')
}
b.WriteByte('\n') // separador de eventos
if _, err := w.Write([]byte(b.String())); err != nil {
return fmt.Errorf("sse send: %w", err)
}
if flusher, ok := w.(http.Flusher); ok {
flusher.Flush()
}
return nil
}