Skip to content

@maccman /juggernaut_channels.rb
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Sinatra Server Side Event streaming with private channels.
# Usage: redis-cli publish message.achannel hello
require 'sinatra'
require 'redis'
conns = Hash.new {|h, k| h[k] = [] }
Thread.abort_on_exception = true
get '/' do
erb :index
end
get '/subscribe/:channel' do
content_type 'text/event-stream'
stream(:keep_open) do |out|
channel = params[:channel]
conns[channel] << out
out.callback do
conns[channel].delete(out)
end
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[channel].each do |out|
out << "data: #{message}\n\n"
end
end
end
end
__END__
@@ index
<article id="log"></article>
<script>
var source = new EventSource('/subscribe/achannel');
source.addEventListener('message', function (event) {
log.innerText += '\n' + event.data;
}, false);
</script>
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.