Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
HTML5 SSE / EventSource demo with Goliath
source :gemcutter
gem 'goliath', :git => 'git://'
gem 'em-synchrony', :git => 'git://'
<!DOCTYPE html>
<h3>Hello SSE!</h3>
var source = new EventSource('/events');
// new connection opened callback
source.addEventListener('open', function(e) {
console.log('connection opened');
}, false);
// subscribe to unnamed messages
source.onmessage = function(e) {
document.body.innerHTML += + '<br />';
// listen for signup events
source.addEventListener('signup', function(e) {
document.body.innerHTML += + '<br />';
}, false);
// connection closed callback
source.addEventListener('error', function(e) {
if (e.eventPhase == EventSource.CLOSED) {
console.log('connection closed');
}, false);
web: bundle exec ruby sse.rb -sv -e prod -p $PORT
require 'goliath'
class SSE < Goliath::API
use Rack::Static, :urls => ["/index.html"], :root => Goliath::Application.app_path("public")
def response(env)
EM.add_periodic_timer(1) { env.stream_send("data:hello ##{rand(100)}\n\n") }
EM.add_periodic_timer(3) do
env.stream_send(["event:signup", "data:signup event ##{rand(100)}\n\n"].join("\n"))
streaming_response(200, {'Content-Type' => 'text/event-stream'})

@igrigorik should index.html be under public/ ? I wanted to run the example locally, had to add public and then move index there.


Yep, just create public directory and it should do the trick


Looks like something went wrong:

sse.rb:17:in class:SSE': undefined methodget' for SSE:Class (NoMethodError)
from sse.rb:14:in `'

If you know the fix, I'll be very much obliged. Thank you.


@danielsz With the release of Goliath 1.0, the router has been extracted to its own gem: postrank-labs/goliath#143

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.