# Responsible for setting up all "out of the box" middleware on a Volt app. require 'rack' require 'volt/server/rack/keep_alive' require 'volt/server/rack/quiet_common_logger' require 'volt/server/rack/opal_files' require 'volt/server/rack/index_files' require 'volt/server/rack/http_resource' require 'volt/server/rack/sprockets_helpers_setup' module Volt class DefaultMiddlewareStack # Setup on the middleware we can setup before booting components def self.preboot_setup(volt_app, rack_app) # Should only be used in production if Volt.config.deflate rack_app.use Rack::Deflater rack_app.use Rack::Chunked end rack_app.use Rack::ContentLength rack_app.use Rack::KeepAlive rack_app.use Rack::ConditionalGet rack_app.use Rack::ETag rack_app.use Rack::Session::Cookie, { :key => 'rack.session', # :domain => 'localhost.com', :path => '/', :expire_after => 2592000, :secret => Volt.config.app_secret } rack_app.use QuietCommonLogger if Volt.env.development? || Volt.env.test? rack_app.use Rack::ShowExceptions end end # Setup the middleware that we need to wait for components to boot before we # can set them up. def self.postboot_setup(volt_app, rack_app) # Serve the opal files opal_files = OpalFiles.new(rack_app, volt_app.app_url, volt_app.app_path, volt_app.component_paths) volt_app.opal_files = opal_files volt_app.sprockets = opal_files.environment Volt::SprocketsHelpersSetup.new(volt_app) # Serve the main html files from public, also figure out # which JS/CSS files to serve. rack_app.use IndexFiles, volt_app, volt_app.component_paths, opal_files rack_app.use HttpResource, volt_app, volt_app.router # serve assets from public rack_app.use Rack::Static, urls: ['/'], root: 'public', index: 'index.html', header_rules: [ [:all, { 'Cache-Control' => 'public, max-age=86400' }] ] rack_app.run lambda { |env| [404, { 'Content-Type' => 'text/html; charset=utf-8' }, ['404 - page not found']] } end end end