Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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'})

abuiles commented Aug 30, 2011

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


igrigorik commented Aug 31, 2011

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