class Falcon::Service::Application
def initialize(environment)
def initialize(environment) super @bound_endpoint = nil end
def middleware
def middleware # In a multi-threaded container, we don't want to modify the shared evaluator's cache, so we create a new evaluator: @environment.evaluator.middleware end
def preload!
def preload! if scripts = @evaluator.preload scripts.each do |path| Async.logger.info(self) {"Preloading #{path}..."} full_path = File.expand_path(path, self.root) load(full_path) end end end
def setup(container)
def setup(container) protocol = self.protocol scheme = self.scheme container.run(name: self.name, restart: true) do |instance| Async(logger: logger) do |task| Async.logger.info(self) {"Starting application server for #{self.root}..."} server = Server.new(self.middleware, @bound_endpoint, protocol, scheme) server.run instance.ready! task.children.each(&:wait) end end super end
def start
def start Async.logger.info(self) {"Binding to #{self.endpoint}..."} @bound_endpoint = Async::Reactor.run do Async::IO::SharedEndpoint.bound(self.endpoint) end.wait preload! super end
def stop
def stop @bound_endpoint&.close @bound_endpoint = nil super end