Skip to content

Instantly share code, notes, and snippets.

@davidxv
Forked from maccman/juggernaut_channels.rb
Created March 3, 2014 10:33

Revisions

  1. @maccman maccman created this gist Jun 26, 2012.
    53 changes: 53 additions & 0 deletions juggernaut_channels.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    # 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>