Skip to content

Instantly share code, notes, and snippets.

@igrigorik
Created August 26, 2011 06:33
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save igrigorik/1172837 to your computer and use it in GitHub Desktop.
Save igrigorik/1172837 to your computer and use it in GitHub Desktop.
HTML5 SSE / EventSource demo with Goliath
source :gemcutter
gem 'goliath', :git => 'git://github.com/postrank-labs/goliath.git'
gem 'em-synchrony', :git => 'git://github.com/igrigorik/em-synchrony.git'
<!DOCTYPE html>
<html>
<body>
<h3>Hello SSE!</h3>
<script>
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) {
console.log(e);
document.body.innerHTML += e.data + '<br />';
};
// listen for signup events
source.addEventListener('signup', function(e) {
console.log(e);
document.body.innerHTML += e.data + '<br />';
}, false);
// connection closed callback
source.addEventListener('error', function(e) {
if (e.eventPhase == EventSource.CLOSED) {
console.log('connection closed');
}
}, false);
</script>
</body>
</html>
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"))
end
streaming_response(200, {'Content-Type' => 'text/event-stream'})
end
end
@abuiles
Copy link

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
Copy link
Author

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

@danielsz
Copy link

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.

@TheKidCoder
Copy link

@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