diff --git a/api/sse.go b/api/sse.go index 1cd49ff..c9b0048 100644 --- a/api/sse.go +++ b/api/sse.go @@ -27,45 +27,36 @@ func SSE(c echo.Context) error { // Use the request context, which is cancelled when the client disconnects ctx := c.Request().Context() - // Set headers for SSE + // Standard SSE headers c.Response().Header().Set("Content-Type", "text/event-stream") - c.Response().Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") + c.Response().Header().Set("Cache-Control", "no-cache") c.Response().Header().Set("Connection", "keep-alive") - c.Response().Header().Set("Pragma", "no-cache") - c.Response().Header().Set("Expires", "0") c.Response().Header().Set("X-Accel-Buffering", "no") - // Set CORS headers + // CORS headers origin := c.Request().Header.Get("Origin") if origin == "https://atri.dad" || origin == "http://localhost:3000" { c.Response().Header().Set("Access-Control-Allow-Origin", origin) - c.Response().Header().Set("Access-Control-Allow-Credentials", "true") } else { - // Allow any origin as fallback for testing c.Response().Header().Set("Access-Control-Allow-Origin", "*") } - // Set response status + // Prepare the response c.Response().WriteHeader(http.StatusOK) c.Response().Flush() - // Create a channel to receive messages + // Client channel for SSE messages clientChan := make(chan string) - - // Add the client to the SSEServer lib.SSEServer.AddClient(channel, clientChan) - - // Clean up when the connection is closed defer lib.SSEServer.RemoveClient(channel, clientChan) - // Write the initial message - initialMsg := ": connected\n\n" - if _, err := c.Response().Write([]byte(initialMsg)); err != nil { + // Write initial message + if _, err := c.Response().Write([]byte("data: Connected to SSE server\n\n")); err != nil { return err } c.Response().Flush() - // Create a ticker for keep-alive messages + // Keep-alive ticker ticker := time.NewTicker(15 * time.Second) defer ticker.Stop() @@ -73,7 +64,6 @@ func SSE(c echo.Context) error { for { select { case <-ctx.Done(): - // Client disconnected return nil case <-ticker.C: // Send keep-alive comment @@ -82,7 +72,7 @@ func SSE(c echo.Context) error { } c.Response().Flush() case msg := <-clientChan: - // Format the SSE message + // Format as standard SSE message data := fmt.Sprintf("data: %s\n\n", msg) if _, err := c.Response().Write([]byte(data)); err != nil { return err diff --git a/pages/templates/tools.ssedemo.html b/pages/templates/tools.ssedemo.html index 12db32f..733f322 100644 --- a/pages/templates/tools.ssedemo.html +++ b/pages/templates/tools.ssedemo.html @@ -19,7 +19,7 @@ A demo of my SSE implementation.
This page demonstrates the use of the HTMX SSE Extension to receive Server Sent Events on the "default" channel.
Any events received on the "default" channel will appear below:
-