Class: Merb::MemorySessionStore

Inherits:
Object
  • Object
show all
Defined in:
lib/merb-core/dispatch/session/memory.rb

Overview

Used for handling multiple sessions stored in memory.

Instance Method Summary collapse

Constructor Details

#initialize(ttl = nil) ⇒ MemorySessionStore

Parameters

ttl<Fixnum>

Session validity time in seconds. Defaults to 1 hour.



40
41
42
43
44
45
46
# File 'lib/merb-core/dispatch/session/memory.rb', line 40

def initialize(ttl=nil)
  @sessions = Hash.new
  @timestamps = Hash.new
  @mutex = Mutex.new
  @session_ttl = ttl || Merb::Const::HOUR # defaults 1 hour
  start_timer
end

Instance Method Details

#delete_session(session_id) ⇒ Object

Parameters

session_id<String>

ID of the session to delete.



72
73
74
75
76
77
# File 'lib/merb-core/dispatch/session/memory.rb', line 72

def delete_session(session_id)
  @mutex.synchronize {
    @timestamps.delete(session_id)
    @sessions.delete(session_id)
  }
end

#reap_expired_sessionsObject

Deletes any sessions that have reached their maximum validity.



80
81
82
83
84
85
# File 'lib/merb-core/dispatch/session/memory.rb', line 80

def reap_expired_sessions
  @timestamps.each do |session_id,stamp|
    delete_session(session_id) if (stamp + @session_ttl) < Time.now 
  end
  GC.start
end

#retrieve_session(session_id) ⇒ Object

Parameters

session_id<String>

ID of the session to retrieve.

Returns

ContainerSession

The session corresponding to the ID.



53
54
55
56
57
58
# File 'lib/merb-core/dispatch/session/memory.rb', line 53

def retrieve_session(session_id)
  @mutex.synchronize {
    @timestamps[session_id] = Time.now
    @sessions[session_id]
  }
end

#start_timerObject

Starts the timer that will eventually reap outdated sessions.



88
89
90
91
92
93
94
95
# File 'lib/merb-core/dispatch/session/memory.rb', line 88

def start_timer
  Thread.new do
    loop {
      sleep @session_ttl
      reap_expired_sessions
    } 
  end  
end

#store_session(session_id, data) ⇒ Object

Parameters

session_id<String>

ID of the session to set.

data<ContainerSession>

The session to set.



63
64
65
66
67
68
# File 'lib/merb-core/dispatch/session/memory.rb', line 63

def store_session(session_id, data)
  @mutex.synchronize {
    @timestamps[session_id] = Time.now
    @sessions[session_id] = data
  }
end