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.

:api: private



44
45
46
47
48
49
50
# File 'lib/merb-core/dispatch/session/memory.rb', line 44

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.

:api: private



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

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.

:api: private



92
93
94
95
96
97
# File 'lib/merb-core/dispatch/session/memory.rb', line 92

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.

:api: private



59
60
61
62
63
64
# File 'lib/merb-core/dispatch/session/memory.rb', line 59

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.

:api: private



102
103
104
105
106
107
108
109
# File 'lib/merb-core/dispatch/session/memory.rb', line 102

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.

:api: private



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

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