Class Wee::Application
In: lib/wee/application.rb
Parent: Object

A Wee::Application manages all Session‘s of a single application. It dispatches the request to the correct handler by examining the request.

Methods

Classes and Modules

Class Wee::Application::SessionCache

Public Class methods

Creates a new application. The block, when called, must return a new Session instance.

  Wee::Application.new { Wee::Session.new(root_component) }

[Source]

# File lib/wee/application.rb, line 25
    def initialize(max_sessions=10_000, &block)
      @session_factory = block || raise(ArgumentError)
      @session_ids ||= Wee::IdGenerator::Secure.new
      @sessions = SessionCache.new(max_sessions)
      @mutex = Mutex.new
    end

Public Instance methods

Handles a web request

[Source]

# File lib/wee/application.rb, line 42
    def call(env)
      request = Wee::Request.new(env)

      if request.session_id
        session = @mutex.synchronize { @sessions[request.session_id] }
        if session and session.alive?
          session.call(env)
        else
          url = request.build_url(:session_id => nil, :page_id => nil)
          Wee::RefreshResponse.new("Invalid or expired session", url).finish
        end
      else
        session = new_session()
        url = request.build_url(:session_id => session.id, :page_id => nil)
        Wee::RedirectResponse.new(url).finish
      end
    end

Garbage collect dead sessions

[Source]

# File lib/wee/application.rb, line 35
    def cleanup_sessions
      @mutex.synchronize { @sessions.garbage_collect }
    end

Protected Instance methods

[Source]

# File lib/wee/application.rb, line 69
    def insert_session(session, retries=3)
      retries.times do
        @mutex.synchronize {
          id = @session_ids.next
          if @sessions[id].nil?
            @sessions[id] = session 
            session.id = id
            return
          end
        }
      end
      raise
    end

[Source]

# File lib/wee/application.rb, line 62
    def new_session
      session = @session_factory.call
      session.application = self
      insert_session(session)
      return session
    end

[Validate]