public
Last active

Sinatra Server Side Event streaming.

  • Download Gist
juggernaut.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# Usage: redis-cli publish message hello
 
require 'sinatra'
require 'redis'
 
conns = []
 
get '/' do
erb :index
end
 
get '/subscribe' do
content_type 'text/event-stream'
stream(:keep_open) do |out|
conns << out
out.callback { conns.delete(out) }
end
end
 
Thread.new do
redis = Redis.connect
redis.psubscribe('message', 'message.*') do |on|
on.pmessage do |match, channel, message|
channel = channel.sub('message.', '')
 
conns.each do |out|
out << "event: #{channel}\n\n"
out << "data: #{message}\n\n"
end
end
end
end
 
__END__
 
@@ index
<article id="log"></article>
 
<script>
var source = new EventSource('/subscribe');
 
source.addEventListener('message', function (event) {
log.innerText += '\n' + event.data;
}, false);
</script>

Don't you need to set your log variable, i.e. "var log = document.getElementById('log');".

Nope, elements can be referenced from JavaScript by their ID.

OMG I can't believe I just discovered this tip.

mind blown

That's what I said when replying on Twitter... 14 years of JavaScript and then I come across this. Made me feel at little daft :)

try do this without chrome/v8

You should use document.getElementById('log'). Accessing an element by its id in a globally-scoped variable is a relic of ancient versions of Internet Explorer which, for whatever reason; Google decided to implement in V8. It is non-standard and bad practice, though; and won't work in Firefox.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.