Jump To …

rocket_user.rb

This is the class that deals with connected clients. This should probably be renamed to client rather than user.

class Rocket
  

Stores all connected clients in a hash with their ID as the key.

  @@connected_users = {}
  

Adds a client to the hash.

  def add_local_user(id, user)
    @@connected_users[id.to_s.to_sym] = user
  end
  

Removes a client from the hash.

  def remove_local_user(id)
    @@connected_users.delete id.to_s.to_sym
  end
  

Finds a local user.

  def get_local_user(id)
    @@connected_users[id.to_s.to_sym]
  end
  
  class RocketUser
    
    attr_accessor :server, :id, :web_socket, :web_socket_id
    

Determines whether or not this server is the one managing a given client’s connection.

    def local?
      ROCKET.server_id.to_s == @server.to_s
    end
    

Creates a new client taking a hash of attributes. The valid attributes are: * server * id * websocket * websocket_id

    def initialize(args = {})
      args.each_pair do |k, v|
        send "#{k}=", v
      end
    end
    

Allows you to call RocketUser.find(client_id)

    def self.find(id)
      r = ROCKET.redis.hget("rocket_users", id)
      r = JSON.parse(r)
      user = self.new(r.merge id: id, server: r.delete("server_id"), web_socket_id: r.delete("websocket_id"))
      user = Rocket.get_local_user(user.web_socket_id) if user.local?
    end
    
    def self.create(socket)
      @id = ROCKET.redis.incr "user_ids"
      @server = ROCKET.server_id
      ROCKET.add_local_user(socket.signature, RocketUser.new(server: @server, id: @id, web_socket: socket, web_socket_id: socket.signature))
      ROCKET.redis.hset "rocket_users", @id.to_s, {server_id: @server, websocket_id: socket.signature}.to_json
    end
    
    def transmit(args = {})
      puts "Calling RocketUser.transmit"
      if local?
        puts "User is local"
        @web_socket.send args.to_json
      else
        puts "User is remote"
        args.merge! :rocket_user_id => @id
        ROCKET.redis.rpush("message_queue_#{ROCKET.server_id}", args.to_json)
      end
    end
    
  end
end