lib/volt/volt/app.rb
require 'opal'
# On the server, setup the server env by default
unless RUBY_PLATFORM == 'opal'
ENV['SERVER'] ||= 'true'
end
# on the client, we want to include the main volt.rb file
require 'volt'
require 'volt/models'
require 'volt/controllers/model_controller'
require 'volt/tasks/task'
require 'volt/page/bindings/bindings'
require 'volt/page/template_renderer'
require 'volt/page/string_template_renderer'
require 'volt/page/document_events'
require 'volt/page/sub_context'
require 'volt/page/targets/dom_target'
require 'volt/data_stores/base_adaptor_client'
if RUBY_PLATFORM == 'opal'
require 'volt/page/channel'
else
require 'volt/page/channel_stub'
end
require 'volt/router/routes'
require 'volt/models/url'
require 'volt/page/url_tracker'
require 'volt/benchmark/benchmark'
require 'volt/page/tasks'
require 'volt/volt/repos'
require 'volt/volt/templates'
if RUBY_PLATFORM == 'opal'
require 'volt/volt/client_setup/browser'
else
require 'volt/volt/server_setup/app'
require 'volt/server/template_handlers/view_processor'
end
module Volt
class App
include Volt::Repos
if RUBY_PLATFORM != 'opal'
# Include server app setup
include Volt::ServerSetup::App
end
attr_reader :component_paths, :router, :live_query_pool,
:channel_live_queries, :app_path, :database, :message_bus,
:middleware, :browser
attr_accessor :sprockets, :opal_files
def initialize(app_path=nil)
app_path ||= Dir.pwd
if Volt.server? && !app_path
raise "Volt::App.new requires an app path to boot"
end
# Expand to a full path
app_path = File.expand_path(app_path)
@app_path = app_path
$volt_app = self
# Setup root path
Volt.root = app_path
if RUBY_PLATFORM == 'opal'
setup_browser
end
if RUBY_PLATFORM != 'opal'
# We need to run the root config first so we can setup the Rack::Session
# middleware.
run_config
# Setup all of the middleware we can before we load the users components
# since the users components might want to add middleware during boot.
setup_preboot_middleware
# Setup all app paths
setup_paths
# Require in app and initializers
run_app_and_initializers unless RUBY_PLATFORM == 'opal'
require_components
# abort_on_exception is a useful debugging tool, and in my opinion something
# you probbaly want on. That said you can disable it if you need.
unless RUBY_PLATFORM == 'opal'
Thread.abort_on_exception = Volt.config.abort_on_exception
end
load_app_code
# Load up the main component dependencies. This is needed to load in
# any opal_gem calls in dependencies.rb
# TODO: Needs to support all components
if Dir.exists?(Volt.root + '/app/main')
AssetFiles.from_cache(app_url, 'main', component_paths)
end
reset_query_pool!
# Setup the middleware that we can only setup after all components boot.
setup_postboot_middleware
setup_routes
start_message_bus
end
end
def templates
@templates ||= Templates.new
end
# Called on the client side to add routes
def add_routes(&block)
@router ||= Routes.new
@router.define(&block)
url.router = @router
end
# Callled on the client to add store compiled templates
def add_template(*args)
templates.add_template(*args)
end
def tasks
@tasks ||= Tasks.new(self)
end
def channel
@channel ||= begin
if Volt.client?
Channel.new
else
ChannelStub.new
end
end
end
# Setup a Page instance.
def setup_browser
@browser = Browser.new(self)
end
def inspect
"#<#{self.class.to_s}:#{object_id}>"
end
end
end
if Volt.client?
$volt_app = Volt::App.new
`$(document).ready(function() {`
$volt_app.browser.start
`});`
end