Class: Falcon::Command::Serve

Inherits:
Samovar::Command
  • Object
show all
Defined in:
lib/falcon/command/serve.rb

Overview

Implements the `falcon serve` command. Designed for development.

Manages a Falcon::Controller::Serve instance which is responsible for running applications in a development environment.

Instance Method Summary collapse

Instance Method Details

#cache?Boolean

Whether to enable the application HTTP cache.

Returns:

  • (Boolean)


91
92
93
# File 'lib/falcon/command/serve.rb', line 91

def cache?
	@options[:cache]
end

#callObject

Prepare the environment and run the controller.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/falcon/command/serve.rb', line 135

def call
	Console.logger.info(self) do |buffer|
		buffer.puts "Falcon v#{VERSION} taking flight! Using #{self.container_class} #{self.container_options}."
		buffer.puts "- Binding to: #{self.endpoint}"
		buffer.puts "- To terminate: Ctrl-C or kill #{Process.pid}"
		buffer.puts "- To reload configuration: kill -HUP #{Process.pid}"
	end
	
	if path = @options[:preload]
		full_path = File.expand_path(path)
		load(full_path)
	end
	
	begin
		Bundler.require(:preload)
	rescue Bundler::GemfileNotFound
		# Ignore.
	end
	
	if GC.respond_to?(:compact)
		GC.compact
	end
	
	self.controller.run
end

#clientObject

Create a new client suitable for accessing the application.



125
126
127
# File 'lib/falcon/command/serve.rb', line 125

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

#client_endpointObject

The endpoint suitable for a client to connect.



120
121
122
# File 'lib/falcon/command/serve.rb', line 120

def client_endpoint
	Async::HTTP::Endpoint.parse(@options[:bind], **endpoint_options)
end

#container_classObject

The container class to use.



72
73
74
75
76
77
78
79
80
81
# File 'lib/falcon/command/serve.rb', line 72

def container_class
	case @options[:container]
	when :threaded
		return Async::Container::Threaded
	when :forked
		return Async::Container::Forked
	when :hybrid
		return Async::Container::Hybrid
	end
end

#container_optionsObject

Options for the container. See Falcon::Controller::Serve#setup.



105
106
107
# File 'lib/falcon/command/serve.rb', line 105

def container_options
	@options.slice(:count, :forks, :threads)
end

#controllerObject

Prepare a new controller for the command.



130
131
132
# File 'lib/falcon/command/serve.rb', line 130

def controller
	Controller::Serve.new(self)
end

#endpointObject

The endpoint to bind to.



115
116
117
# File 'lib/falcon/command/serve.rb', line 115

def endpoint
	Endpoint.parse(@options[:bind], **endpoint_options)
end

#endpoint_optionsObject

Options for the #endpoint.



110
111
112
# File 'lib/falcon/command/serve.rb', line 110

def endpoint_options
	@options.slice(:hostname, :port, :reuse_port, :timeout)
end

#load_appObject

Load the rack application from the specified configuration path.



97
98
99
100
101
# File 'lib/falcon/command/serve.rb', line 97

def load_app
	rack_app, _ = Rack::Builder.parse_file(@options[:config])
	
	return Server.middleware(rack_app, verbose: self.verbose?, cache: self.cache?)
end

#verbose?Boolean

Whether verbose logging is enabled.

Returns:

  • (Boolean)


85
86
87
# File 'lib/falcon/command/serve.rb', line 85

def verbose?
	@parent&.verbose?
end