Class: ActionController::Live::SSE

Inherits:
Object
  • Object
show all
Defined in:
actionpack/lib/action_controller/metal/live.rb

Overview

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:

1) Event. If specified, an event with this name will be dispatched on
the browser.
2) Retry. The reconnection time in milliseconds used when attempting
to send the event.
3) 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.

Constant Summary collapse

PERMITTED_OPTIONS =
%w( retry event id )

Instance Method Summary collapse

Constructor Details

#initialize(stream, options = {}) ⇒ SSE

Returns a new instance of SSE.



110
111
112
113
# File 'actionpack/lib/action_controller/metal/live.rb', line 110

def initialize(stream, options = {})
  @stream = stream
  @options = options
end

Instance Method Details

#closeObject



115
116
117
# File 'actionpack/lib/action_controller/metal/live.rb', line 115

def close
  @stream.close
end

#write(object, options = {}) ⇒ Object



119
120
121
122
123
124
125
126
# File 'actionpack/lib/action_controller/metal/live.rb', line 119

def write(object, options = {})
  case object
  when String
    perform_write(object, options)
  else
    perform_write(ActiveSupport::JSON.encode(object), options)
  end
end