SSE - how to correctly write responses? added by arthurmaciel on Mon Jun 23 05:21:35 2014

(use awful spiffy extras data-structures)

(enable-sxml #t)

(define-page "/test"
  (lambda ()
    (add-javascript
     "var source = new EventSource('/sse');
      source.onmessage = function (event) {
          document.body.innerHTML = event.data;
      };")
    ""))

(define (send-sse-headers)
  (let ((resp (update-response (current-response)
                               code: 200
                               reason: "OK"
                               headers: (headers '((content-type text/event-stream)
                                                   (cache-control no-cache)
                                                   (connection keep-alive)
                                                   (transfer-encoding chunked))
                                                 (response-headers (current-response))))))
    (parameterize ((current-response resp))
      (write-logged-response))))

(define (send-sse-data data)
  (display (conc "data: " data "\n\n")
           (response-port (current-response)))
  (finish-response-body (current-response)))

(define-page "/sse"
  (lambda ()
    (send-sse-headers)
    (let loop ()
      (send-sse-data (random 10))
      (thread-sleep! 5)
      (loop))))