class Tina4::SessionHandlers::FileHandler

def cleanup

def cleanup
  return unless Dir.exist?(@dir)
  Dir.glob(File.join(@dir, "sess_*")).each do |file|
    File.delete(file) if File.mtime(file) + @ttl < Time.now
  end
end

def destroy(session_id)

def destroy(session_id)
  path = session_path(session_id)
  File.delete(path) if File.exist?(path)
end

def gc(max_age)

Parameters:
  • max_age (Integer) -- maximum session age in seconds
def gc(max_age)
  return unless Dir.exist?(@dir)
  now = Time.now
  Dir.glob(File.join(@dir, "sess_*")).each do |file|
    File.delete(file) if File.mtime(file) + max_age < now
  rescue StandardError
    # Corrupt or locked file — skip
  end
end

def initialize(options = {})

def initialize(options = {})
  @dir = options[:dir] || File.join(Dir.pwd, "sessions")
  @ttl = options[:ttl] || 86400
  FileUtils.mkdir_p(@dir)
end

def read(session_id)

def read(session_id)
  path = session_path(session_id)
  return nil unless File.exist?(path)
  # Check expiry
  if File.mtime(path) + @ttl < Time.now
    File.delete(path)
    return nil
  end
  data = File.read(path)
  JSON.parse(data)
rescue JSON::ParserError
  nil
end

def session_path(session_id)

def session_path(session_id)
  safe_id = session_id.gsub(/[^a-zA-Z0-9_-]/, "")
  File.join(@dir, "sess_#{safe_id}.json")
end

def write(session_id, data)

def write(session_id, data)
  path = session_path(session_id)
  File.write(path, JSON.generate(data))
end