class Falcon::Controller::Serve

def create_container

def create_container
	@command.container_class.new
end

def endpoint

def endpoint
	@command.endpoint
end

def initialize(command, **options)

def initialize(command, **options)
	@command = command
	
	@endpoint = nil
	@bound_endpoint = nil
	@debug_trap = Async::IO::Trap.new(:USR1)
	
	super(**options)
end

def load_app

def load_app
	@command.load_app
end

def name

def name
	"Falcon Server"
end

def setup(container)

def setup(container)
	container.run(name: self.name, restart: true, **@command.container_options) do |instance|
		Async do |task|
			# Load one app instance per container:
			app = self.load_app
			
			task.async do
				if @debug_trap.install!
					Async.logger.info(instance) do
						"- Per-process status: kill -USR1 #{Process.pid}"
					end
				end
				
				@debug_trap.trap do
					Async.logger.info(self) do |buffer|
						task.reactor.print_hierarchy(buffer)
					end
				end
			end
			
			server = Falcon::Server.new(app, @bound_endpoint, @endpoint.protocol, @endpoint.scheme)
			
			server.run
			
			instance.ready!
			
			task.children.each(&:wait)
		end
	end
end

def start

def start
	@endpoint ||= self.endpoint
	
	@bound_endpoint = Async::Reactor.run do
		Async::IO::SharedEndpoint.bound(@endpoint)
	end.wait
	
	@debug_trap.ignore!
	
	super
end

def stop(*)

def stop(*)
	@bound_endpoint&.close
	
	@debug_trap.default!
	
	super
end