require 'safely'

Game.broadcast = EM::Channel.new

module GameServer
  class Backend < Struct.new(:app)

    KEEP_ALIVE_TIME = 15

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

        player = env['warden'].authenticate(:player)
        PlayerConnection.new(player: player, web_socket: web_socket).listen

        # Return async Rack response
        web_socket.rack_response
      else
        app.call(env)
      end
    end

  end
end