class Colossus::Engine::Memory

The Memory Engine is a non-distributed, in process, non-threadsafe engine. Based on EventMachine in order to provide the ttl to disconnect clients.

Attributes

client_sessions[R]
ttl[R]

Public Class Methods

new(ttl) click to toggle source

@param [Integer/Float] ttl TTL in seconds

# File lib/colossus/engines/memory/memory.rb, line 12
def initialize(ttl)
  @client_sessions = Hash.new do |hash, key|
    hash[key] = Colossus::Engine::Memory::ClientSessionStore.new
  end
  @ttl     = ttl
end

Public Instance Methods

delete(user_id) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 62
def delete(user_id)
  client_sessions.delete(user_id)
end
delete_expired_users(user_ids) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 93
def delete_expired_users(user_ids)
  user_ids.each do |user_id|
    delete(user_id)
    user_changed(user_id, DISCONNECTED)
  end
end
gc_ttl() click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 77
def gc_ttl
  user_ids_to_delete = []

  client_sessions.each_pair do |user_id, session_store|
    session_store.sessions.delete_if do |session_id, session|
      (session.last_seen + ttl) < Time.now
    end

    if (session_store.last_seen + ttl) < Time.now
      user_ids_to_delete << user_id
    end
  end

  delete_expired_users(user_ids_to_delete)
end
get(user_id) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 42
def get(user_id)
  if client_sessions.has_key?(user_id)
    { user_id => client_sessions[user_id].status }
  else
    { user_id => DISCONNECTED }
  end
end
get_all() click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 54
def get_all
  statuses = {}
  client_sessions.each_pair do |user_id, session_store|
    statuses[user_id] = session_store.status
  end
  statuses
end
get_multi(*user_ids) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 50
def get_multi(*user_ids)
  user_ids.inject({}) { |memo, user_id| memo.merge!(get(user_id)) }
end
new_periodic_ttl() click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 72
def new_periodic_ttl
  secs_ttl = Colossus.config.seconds_before_ttl_check
  @periodic_ttl = EM::Synchrony.add_periodic_timer(secs_ttl, &method(:gc_ttl))
end
reset!() click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 66
def reset!
  @client_sessions = Hash.new do |hash, key|
    hash[key] = Colossus::Engine::Memory::ClientSessionStore.new
  end
end
set(user_id, client_id, given_status) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 24
def set(user_id, client_id, given_status)
  if given_status == DISCONNECTED
    client_sessions[user_id].delete(client_id)
  else
    client_sessions[user_id][client_id] = given_status
  end

  if client_sessions[user_id].sessions.empty? ||
      client_sessions[user_id].status_changed?
    status = client_sessions[user_id].status
    delete(user_id) if status == DISCONNECTED
    user_changed(user_id, status)
    return true
  end

  false
end
user_changed(user_id, status) click to toggle source
# File lib/colossus/engines/memory/memory.rb, line 19
def user_changed(user_id, status)
  changed
  notify_observers(user_id, status)
end