class Server
Definitions
def preload!
Preload any resources specified by the environment.
Implementation
def preload!
root = @evaluator.root
if scripts = @evaluator.preload
scripts = Array(scripts)
scripts.each do |path|
Console.logger.info(self) {"Preloading #{path}..."}
full_path = File.expand_path(path, root)
load(full_path)
end
end
end
def start
Prepare the bound endpoint for the server.
Implementation
def start
@endpoint = @evaluator.endpoint
Sync do
@bound_endpoint = @endpoint.bound
end
preload!
Console.logger.info(self) {"Starting #{self.name} on #{@endpoint}"}
super
end
def setup(container)
Setup the container with the application instance.
Signature
-
parameter
container
Async::Container::Generic
Implementation
def setup(container)
container_options = @evaluator.container_options
health_check_timeout = container_options[:health_check_timeout]
container.run(name: self.name, **container_options) do |instance|
evaluator = @environment.evaluator
Async do |task|
if @environment.implements?(Async::Container::Supervisor::Supervised)
evaluator.make_supervised_worker(instance).run
end
server = evaluator.make_server(@bound_endpoint)
server.run
instance.ready!
if health_check_timeout
Async(transient: true) do
while true
# We only update this if the health check is enabled. Maybe we should always update it?
instance.name = "#{self.name} (#{server.statistics_string} L=#{Fiber.scheduler.load.round(3)})"
sleep(health_check_timeout / 2)
instance.ready!
end
end
end
task.children.each(&:wait)
end
end
end
def stop(...)
Close the bound endpoint.
Implementation
def stop(...)
if @bound_endpoint
@bound_endpoint.close
@bound_endpoint = nil
end
@endpoint = nil
super
end