class Falcon::Command::Virtual

def client

def client
	Async::HTTP::Client.new(client_endpoint)
end

def invoke(parent)

def invoke(parent)
	container = run(parent.verbose?)
	
	container.wait
end

def load_app(path, verbose)

def load_app(path, verbose)
	config = File.join(path, CONFIG_RU)
	
	rack_app, options = Rack::Builder.parse_file(config)
	
	return Server.middleware(rack_app, verbose: verbose), options
end

def run(verbose = false)

def run(verbose = false)
	hosts = Falcon::Hosts.new
	root = Dir.pwd
	
	sites.each do |path|
		name = File.basename(path)
		
		hosts.add(name) do |host|
			host.app_root = File.expand_path(path, root)
			
			if @options[:self_signed]
				host.self_signed!(name)
			else
				host.ssl_certificate_path = File.join(path, "ssl", "fullchain.pem")
				host.ssl_key_path = File.join(path, "ssl", "privkey.pem")
			end
		end
	end
	
	controller = Async::Container::Controller.new
	
	hosts.each do |name, host|
		if container = host.start
			controller << container
		end
	end
	
	controller << Async::Container::Forked.new do |task|
		proxy = hosts.proxy
		secure_endpoint = Async::HTTP::URLEndpoint.parse(@options[:bind_secure], ssl_context: hosts.ssl_context)
		
		Process.setproctitle("Falcon Proxy")
		
		proxy_server = Falcon::Server.new(proxy, secure_endpoint)
		
		proxy_server.run
	end
	
	controller << Async::Container::Forked.new do |task|
		redirection = hosts.redirection
		insecure_endpoint = Async::HTTP::URLEndpoint.parse(@options[:bind_insecure])
		
		Process.setproctitle("Falcon Redirector")
		
		redirection_server = Falcon::Server.new(redirection, insecure_endpoint)
		
		redirection_server.run
	end
	
	Process.setproctitle("Falcon Controller")
	
	return controller
end