Skip to content

Instantly share code, notes, and snippets.

@elcuervo
Created January 3, 2012 11:57
Show Gist options
  • Save elcuervo/1554646 to your computer and use it in GitHub Desktop.
Save elcuervo/1554646 to your computer and use it in GitHub Desktop.
require 'cuba'
require 'rack/async'
queue = Queue.new
class Async
def initialize(queue)
@queue = queue
end
def wait_for_messages
Thread.new do
message = @queue.pop
yield(message) if message
end
end
def call(env)
wait_for_messages do |message|
env['async.callback'].call [200, {"Content-type" => "text/event-stream"}, "data: #{message}\n\n"]
end
throw :async
end
end
Cuba.define do
on "sse" do
run Async.new(queue)
end
on "" do
res.write "
<html>
<head></head>
<body>
<h1>Messages</h1>
<div id='message'></div>
</body>
<script type='text/javascript'>
var sse = new EventSource('/sse');
sse.addEventListener('message', function(e){
var list = document.getElementById('message');
var item = document.createElement('li');
item.textContent = e.data;
list.appendChild(item);
});
</script>
</html>
"
end
on "surculus/:msg" do |msg|
queue.push msg
end
end
run Cuba
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment