Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Sep 15th, 2012  |  syntax: None  |  size: 1.28 KB  |  hits: 6  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. # coding: utf-8
  2. require 'sinatra'
  3. set server: 'thin', connections: []
  4.  
  5. get '/' do
  6.   halt erb(:login) unless params[:user]
  7.   erb :chat, locals: { user: params[:user].gsub(/\W/, '') }
  8. end
  9.  
  10. get '/stream', provides: 'text/event-stream' do
  11.   stream :keep_open do |out|
  12.     settings.connections << out
  13.     out.callback { settings.connections.delete(out) }
  14.   end
  15. end
  16.  
  17. post '/' do
  18.   settings.connections.each { |out| out << "data: #{params[:msg]}\n\n" }
  19.   204 # response without entity body
  20. end
  21.  
  22. __END__
  23.  
  24. @@ layout
  25. <html>
  26.   <head>
  27.     <title>Super Simple Chat with Sinatra</title>
  28.     <meta charset="utf-8" />
  29.     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  30.   </head>
  31.   <body><%= yield %></body>
  32. </html>
  33.  
  34. @@ login
  35. <form action='/'>
  36.   <label for='user'>User Name:</label>
  37.   <input name='user' value='' />
  38.   <input type='submit' value="GO!" />
  39. </form>
  40.  
  41. @@ chat
  42. <pre id='chat'></pre>
  43.  
  44. <script>
  45.   // reading
  46.   var es = new EventSource('/stream');
  47.   es.onmessage = function(e) { $('#chat').append(e.data + "\n") };
  48.  
  49.   // writing
  50.   $("form").live("submit", function(e) {
  51.     $.post('/', {msg: "<%= user %>: " + $('#msg').val()});
  52.     $('#msg').val(''); $('#msg').focus();
  53.     e.preventDefault();
  54.   });
  55. </script>
  56.  
  57. <form>
  58.   <input id='msg' placeholder='type message here...' />
  59. </form>