Action Controller Live Server Sent Events

This class provides the ability to write an SSE (Server Sent Event) to an IO stream. The class is initialized with a stream and can be used to either write a JSON string or an object which can be converted to JSON.

Writing an object will convert it into standard SSE format with whatever options you have configured. You may choose to set the following options:

:event

If specified, an event with this name will be dispatched on the browser.

:retry

The reconnection time in milliseconds used when attempting to send the event.

:id

If the connection dies while sending an SSE to the browser, then the server will receive a Last-Event-ID header with value equal to id.

After setting an option in the constructor of the SSE object, all future SSEs sent across the stream will use those options unless overridden.

Example Usage:

class MyController < ActionController::Base
  include ActionController::Live

  def index
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream, retry: 300, event: "event-name")
    sse.write({ name: 'John'})
    sse.write({ name: 'John'}, id: 10)
    sse.write({ name: 'John'}, id: 10, event: "other-event")
    sse.write({ name: 'John'}, id: 10, event: "other-event", retry: 500)
  ensure
    sse.close
  end
end

Note: SSEs are not currently supported by IE. However, they are supported by Chrome, Firefox, Opera, and Safari.

Methods

Constants

PERMITTED_OPTIONS = %w( retry event id )

Class Public methods

new(stream, options = {})

📝 Source code
# File actionpack/lib/action_controller/metal/live.rb, line 115
      def initialize(stream, options = {})
        @stream = stream
        @options = options
      end
🔎 See on GitHub

Instance Public methods

close()

📝 Source code
# File actionpack/lib/action_controller/metal/live.rb, line 120
      def close
        @stream.close
      end
🔎 See on GitHub

write(object, options = {})

📝 Source code
# File actionpack/lib/action_controller/metal/live.rb, line 124
      def write(object, options = {})
        case object
        when String
          perform_write(object, options)
        else
          perform_write(ActiveSupport::JSON.encode(object), options)
        end
      end
🔎 See on GitHub