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 aLast-Event-ID
header with value equal toid
.
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