class Radical::App

Public Class Methods

app() click to toggle source
# File lib/radical/app.rb, line 80
def app
  router = @routes.router
  env = self.env
  assets = @assets
  serve_assets = @serve_assets
  security_headers = @security_headers || {}
  session = @session || self.session

  @app ||= Rack::Builder.app do
    use Rack::CommonLogger
    use Rack::ShowExceptions if env.development?
    use Rack::Runtime
    use Rack::MethodOverride
    use Rack::ContentLength
    use Rack::ETag
    use Rack::Deflater
    use Rack::Head
    use Rack::ConditionalGet
    use Rack::ContentType
    use Rack::Session::Cookie, session
    use Rack::Csrf, raise: env.development?, skip: router.routes.values.flatten.select { |a| a.is_a?(Class) }.uniq.map(&:skip_csrf_actions).flatten(1)
    use Flash
    use SecurityHeaders, security_headers

    if serve_assets || env.development?
      use Rack::Static, urls: ['/assets', '/public'],
                        header_rules: [
                          [/\.(?:css\.gz)$/, { 'Content-Type' => 'text/css', 'Content-Encoding' => 'gzip' }],
                          [/\.(?:js\.gz)$/, { 'Content-Type' => 'application/javascript', 'Content-Encoding' => 'gzip' }],
                          [/\.(?:css\.br)$/, { 'Content-Type' => 'text/css', 'Content-Encoding' => 'br' }],
                          [/\.(?:js\.br)$/, { 'Content-Type' => 'application/javascript', 'Content-Encoding' => 'br' }]
                        ]
    end

    run lambda { |rack_env|
      begin
        router.route(Rack::Request.new(rack_env), options: { assets: assets }).finish
      rescue ModelNotFound
        raise unless env.production?

        Rack::Response.new('404 Not Found', 404).finish
      end
    }
  end
end
assets(&block) click to toggle source
# File lib/radical/app.rb, line 45
def assets(&block)
  @assets = Assets.new

  block.call(@assets)
end
call(env) click to toggle source
# File lib/radical/app.rb, line 126
def call(env)
  app.call(env)
end
compile_assets() click to toggle source
# File lib/radical/app.rb, line 51
def compile_assets
  @assets.compile
end
env() click to toggle source
# File lib/radical/app.rb, line 76
def env
  Env
end
routes(route_class) click to toggle source
# File lib/radical/app.rb, line 41
def routes(route_class)
  @routes = route_class
end
security_headers(headers = {}) click to toggle source
# File lib/radical/app.rb, line 59
def security_headers(headers = {})
  @security_headers = headers
end
serve_assets() click to toggle source
# File lib/radical/app.rb, line 55
def serve_assets
  @serve_assets = true
end
session(options = {}) click to toggle source
# File lib/radical/app.rb, line 63
def session(options = {})
  defaults = {
    path: '/',
    secret: session_secret,
    http_only: true,
    same_site: :lax,
    secure: env.production?,
    expire_after: 2_592_000 # 30 days
  }

  @session = defaults.merge(options)
end

Private Class Methods

session_secret() click to toggle source
# File lib/radical/app.rb, line 132
def session_secret
  @session_secret ||= (ENV['SESSION_SECRET'] || SecureRandom.hex(32))
end