require ‘faye/websocket’ require ‘json’

module <%=config%>

class Backend
  KEEPALIVE_TIME = 15
  def initialize(app)
    @app = app
    @clients = []
  end

  def call(env)
    if Faye::WebSocket.websocket?(env)
      ws = Faye::WebSocket.new(env, nil, ping: KEEPALIVE_TIME)

      ws.on :open do |event|
        p [:open, ws.object_id]
        @clients << ws
        ws.send({ you: ws.object_id }.to_json)
        @clients.each do |client|
          client.send({ count: @clients.size }.to_json)
        end
      end

      ws.on :message do |event|
        p [:message, event.data]
        @clients.each { |client| client.send event.data }
      end

      ws.on :close do |event|
        p [:close, ws.object_id, event.code]
        @clients.delete(ws)
        @clients.each do |client|
          client.send({ count: @clients.size }.to_json)
        end
        ws = nil
      end
      ws.rack_response
    else
      @app.call(env)
    end
  end
end

end