Sha256: 0ced347cc49c53f07d69ea3eb0ed86c121852ab25ccdb3ec93c697f0b95f7acb

Contents?: true

Size: 1.43 KB

Versions: 2

Compression:

Stored size: 1.43 KB

Contents

require 'rubygems'
require 'bundler/setup'
require 'reel'

Connections = []
Body = DATA.read
app = Rack::Builder.new do
  map '/' do
    run lambda { |env|
      [200, {'Content-Type' => 'text/html'}, [Body]]
    }
  end

  map '/subscribe' do
    run lambda { |env|
      if socket = env['rack.websocket']
      
        socket.on_message do |m|
          begin
            socket << 'Server got "%s" message' % m
          rescue => SocketError
            Connections.delete(socket)
          end
        end
        
        Connections << socket
        socket.read_every 1
      end
      [200, {}, []]
    }
  end

  map '/wall' do
    run lambda { |env|
      msg = env['PATH_INFO'].gsub(/\/+/, '').strip
      msg = Time.now if msg.empty?
      
      Connections.each do |s|
        begin
          s << msg
        rescue => SocketError
          Connections.delete(s)
        end
      end
      
      [200, {'Content-Type' => 'text/html'}, ["Sent \"#{msg}\" to #{Connections.size} clients"]]
    }
  end
end.to_app

Rack::Handler::Reel.run app, Port: 9292

__END__
<!doctype html>
<html lang="en">
<body>
  <input type="button" onClick="ws.send(Math.random());" value="Send a message to server">
  <div id="content"></div>
</body>
<script type="text/javascript">
ws = new WebSocket('ws://' + window.location.host + '/subscribe');
ws.onmessage = function(e) {
  document.getElementById('content').innerHTML += e.data + '<br>';
}
</script>
</html>

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
reel-0.4.0.pre2 examples/websocket-wall.rb
reel-0.4.0.pre examples/websocket-wall.rb