#!/usr/bin/env ruby -I ../lib -I lib # frozen_string_literal: true # This example does *not* work properly with WEBrick or other # servers that buffer output. To shut down the server, close any # open browser tabs that are connected to the chat server. require 'sinatra' set :server, :puma connections = Set.new get '/' do halt erb(:login) unless params[:user] erb :chat, locals: { user: params[:user].gsub(/\W/, '') } end get '/stream', provides: 'text/event-stream' do stream :keep_open do |out| if connections.add?(out) out.callback { connections.delete(out) } end out << "heartbeat:\n" sleep 1 rescue out.close end end post '/' do connections.each do |out| out << "data: #{params[:msg]}\n\n" rescue out.close end 204 # response without entity body end __END__ @@ layout Super Simple Chat with Sinatra <%= yield %> @@ login
@@ chat