falcon 0.43.0 → 0.45.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -1
  3. data/changes.md +36 -0
  4. data/lib/falcon/command/host.rb +6 -32
  5. data/lib/falcon/command/proxy.rb +20 -15
  6. data/lib/falcon/command/redirect.rb +21 -15
  7. data/lib/falcon/command/serve.rb +44 -65
  8. data/lib/falcon/command/top.rb +1 -1
  9. data/lib/falcon/command/virtual.rb +15 -23
  10. data/lib/falcon/configuration.rb +26 -124
  11. data/lib/falcon/environment/application.rb +60 -0
  12. data/lib/falcon/environment/lets_encrypt_tls.rb +34 -0
  13. data/lib/falcon/environment/proxy.rb +109 -0
  14. data/lib/falcon/environment/rack.rb +20 -0
  15. data/lib/falcon/environment/rackup.rb +26 -0
  16. data/lib/falcon/environment/redirect.rb +50 -0
  17. data/lib/falcon/environment/self_signed_tls.rb +45 -0
  18. data/lib/falcon/environment/server.rb +69 -0
  19. data/lib/falcon/environment/supervisor.rb +40 -0
  20. data/lib/falcon/environment/tls.rb +97 -0
  21. data/lib/falcon/{environments.rb → environment.rb} +3 -4
  22. data/lib/falcon/service/server.rb +84 -0
  23. data/lib/falcon/service/supervisor.rb +4 -3
  24. data/lib/falcon/{controller → service}/virtual.rb +71 -18
  25. data/lib/falcon/version.rb +2 -2
  26. data/license.md +2 -0
  27. data.tar.gz.sig +0 -0
  28. metadata +28 -30
  29. metadata.gz.sig +0 -0
  30. data/lib/.DS_Store +0 -0
  31. data/lib/falcon/controller/host.rb +0 -55
  32. data/lib/falcon/controller/proxy.rb +0 -109
  33. data/lib/falcon/controller/redirect.rb +0 -59
  34. data/lib/falcon/controller/serve.rb +0 -110
  35. data/lib/falcon/environments/application.rb +0 -56
  36. data/lib/falcon/environments/lets_encrypt_tls.rb +0 -30
  37. data/lib/falcon/environments/proxy.rb +0 -22
  38. data/lib/falcon/environments/rack.rb +0 -33
  39. data/lib/falcon/environments/self_signed_tls.rb +0 -38
  40. data/lib/falcon/environments/supervisor.rb +0 -34
  41. data/lib/falcon/environments/tls.rb +0 -86
  42. data/lib/falcon/service/application.rb +0 -99
  43. data/lib/falcon/service/generic.rb +0 -61
  44. data/lib/falcon/service/proxy.rb +0 -49
  45. data/lib/falcon/services.rb +0 -82
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5ddd9c37ee1b6095a034bee5bbc77dde5936b1c474b0a4077cc4488226b81be
4
- data.tar.gz: b436f4b618ccb3ced4f88d2cdfba936c64143b7f3c54953cfcca293b68596363
3
+ metadata.gz: 1d8e9452c5073ac195044198c1b7c4739ddf69e0c506b362c401b99e29f71642
4
+ data.tar.gz: b628ae3f08f08c4493cf053ce6a1b258b0671ae81260e625f13adc2fe289552f
5
5
  SHA512:
6
- metadata.gz: 261381a8fceacb86e4456c2e7abcc39ab544000005e71436e4962c2e0aed26897e9de2366b7710d51c47d92721c6d60072a4da678a7acad28ba8671b46abf318
7
- data.tar.gz: e21ae1cf91c6539ee497c5e37d363d5554c26ef6d0c9d951b65cfd0e3b775a977bb69bc1a2a0775c695db246afe98b1dc6269a645866e39aa6251e8add9f0809
6
+ metadata.gz: aa6ed0e298e9f4ee972d30bdb378c119c691ba9c291c6ceb9fec2b2e6476c931c63042ee88f968d2d1c519d243f6a23196e9ce7f679840e9c01897db30987281
7
+ data.tar.gz: 60000766f699c5002bfb069db4ad4324ca8ae9775133bf9cfc3aef53cea0316bba227dd43c1c125773108dfc7e6b15a41e25abd07ea169877cf296a9e186f625
checksums.yaml.gz.sig CHANGED
@@ -1 +1 @@
1
- /B����
1
+ g��Ѧ=�dٚ?0A��i��o��U��r�� ��:��ơ"�G)4�v�x����W49�JJ]j7�������
data/changes.md ADDED
@@ -0,0 +1,36 @@
1
+ # Changes
2
+
3
+ # v0.45.0
4
+
5
+ ## Compatibility Fixes
6
+
7
+ During the `v0.44.0` release cycle, the workflows for testing older rack releases were accidentally dropped. As such, `v0.44.0` was not compatible with older versions of rack. This release restores compatibility with older versions of rack.
8
+
9
+ Specifically, `protocol-rack` now provides `Protocol::Rack::Adapter.parse_file` to load Rack applications. Rack 2's `Rack::Builder.parse_file` returns both the application and a set of options (multi-value return). Rack 3 changed this to only return the application, as the prior multi-value return was confusing at best. This change allows `protocol-rack` to work with both versions of rack, and `falcon` adopts that interface.
10
+
11
+ In addition, `falcon serve` provides two new options:
12
+
13
+ 1. `--[no]-restart` which controls what happens when `async-container` instances crash. By default, `falcon serve` will restart the container when it crashes. This can be disabled with `--no-restart`.
14
+
15
+ 2. `--graceful-stop [timeout]` which allows you to specify a timeout for graceful shutdown. This is useful when you want to stop the server, but allow existing connections to finish processing before the server stops. This feature is highly experimental and doesn't work correctly in all cases yet, but we are aiming to improve it.
16
+
17
+ # v0.44.0
18
+
19
+ ## Falcon Host
20
+
21
+ `async-service` is a new gem that exposes a generic service interface on top of `async-container`. Previously, `falcon host` used `async-container` directly and `build-environment` for configuration. In order to allow for more generic service definitions and configuration, `async-service` now provides a similar interface to `build-environment` and exposes this in a way that can be used for services other tha falcon. This makes it simpler to integrate multiple services into a single application.
22
+
23
+ The current configuration format uses definitions like this:
24
+
25
+ ```ruby
26
+ rack 'hello.localhost', :self_signed_tls
27
+ ```
28
+
29
+ This changes to:
30
+
31
+ ```ruby
32
+ service 'hello.localhost' do
33
+ include Falcon::Environment::Rack
34
+ include Falcon::Environment::SelfSignedTLS
35
+ end
36
+ ```
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
 
6
- require_relative '../controller/host'
7
- require_relative '../configuration'
6
+ require_relative 'paths'
8
7
  require_relative '../version'
9
8
 
10
9
  require 'samovar'
11
- require 'bundler'
10
+ require 'async/service/controller'
12
11
 
13
12
  module Falcon
14
13
  module Command
@@ -23,28 +22,13 @@ module Falcon
23
22
  # @attribute [Array(String)]
24
23
  many :paths, "Service configuration paths.", default: ["falcon.rb"]
25
24
 
25
+ include Paths
26
+
26
27
  # The container class to use.
27
28
  def container_class
28
29
  Async::Container.best_container_class
29
30
  end
30
31
 
31
- # Generate a configuration based on the specified {paths}.
32
- def configuration
33
- configuration = Configuration.new
34
-
35
- @paths.each do |path|
36
- path = File.expand_path(path)
37
- configuration.load_file(path)
38
- end
39
-
40
- return configuration
41
- end
42
-
43
- # Prepare a new controller for the command.
44
- def controller
45
- Controller::Host.new(self)
46
- end
47
-
48
32
  # Prepare the environment and run the controller.
49
33
  def call
50
34
  Console.logger.info(self) do |buffer|
@@ -54,17 +38,7 @@ module Falcon
54
38
  buffer.puts "- To reload: kill -HUP #{Process.pid}"
55
39
  end
56
40
 
57
- begin
58
- Bundler.require(:preload)
59
- rescue Bundler::GemfileNotFound
60
- # Ignore.
61
- end
62
-
63
- if GC.respond_to?(:compact)
64
- GC.compact
65
- end
66
-
67
- self.controller.run
41
+ Async::Service::Controller.run(self.configuration, container_class: self.container_class)
68
42
  end
69
43
  end
70
44
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative '../controller/proxy'
6
+ require_relative '../environment/proxy'
7
7
  require_relative 'paths'
8
8
 
9
9
  require 'samovar'
@@ -31,20 +31,21 @@ module Falcon
31
31
 
32
32
  include Paths
33
33
 
34
- # Prepare a new controller for the command.
35
- def controller
36
- Controller::Proxy.new(self)
34
+ def environment(**options)
35
+ Async::Service::Environment.new(Falcon::Environment::Proxy).with(
36
+ root: Dir.pwd,
37
+ name: self.class.name,
38
+ verbose: self.parent&.verbose?,
39
+ url: @options[:bind],
40
+ timeout: @options[:timeout],
41
+ **options
42
+ )
37
43
  end
38
44
 
39
- # The container class to use.
40
- def container_class
41
- Async::Container.best_container_class
42
- end
43
-
44
- # Options for the container.
45
- # See {Controller::Serve#setup}.
46
- def container_options
47
- {}
45
+ def configuration
46
+ Configuration.for(
47
+ self.environment(environments: super.environments)
48
+ )
48
49
  end
49
50
 
50
51
  # Prepare the environment and run the controller.
@@ -54,9 +55,13 @@ module Falcon
54
55
  buffer.puts "- Binding to: #{@options[:bind]}"
55
56
  buffer.puts "- To terminate: Ctrl-C or kill #{Process.pid}"
56
57
  buffer.puts "- To reload: kill -HUP #{Process.pid}"
58
+
59
+ self.resolved_paths.each do |path|
60
+ buffer.puts "- Loading configuration from #{path}"
61
+ end
57
62
  end
58
63
 
59
- self.controller.run
64
+ Async::Service::Controller.run(self.configuration)
60
65
  end
61
66
 
62
67
  # The endpoint to bind to.
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
- require_relative '../controller/redirect'
6
+ require_relative '../environment/redirect'
7
7
  require_relative 'paths'
8
8
 
9
9
  require 'samovar'
@@ -29,20 +29,22 @@ module Falcon
29
29
 
30
30
  include Paths
31
31
 
32
- # Prepare a new controller for the command.
33
- def controller
34
- Controller::Redirect.new(self)
32
+ def environment(**options)
33
+ Async::Service::Environment.new(Falcon::Environment::Redirect).with(
34
+ root: Dir.pwd,
35
+ name: self.class.name,
36
+ verbose: self.parent&.verbose?,
37
+ url: @options[:bind],
38
+ redirect_url: @options[:redirect],
39
+ timeout: @options[:timeout],
40
+ **options
41
+ )
35
42
  end
36
43
 
37
- # The container class to use.
38
- def container_class
39
- Async::Container.best_container_class
40
- end
41
-
42
- # Options for the container.
43
- # See {Controller::Serve#setup}.
44
- def container_options
45
- {}
44
+ def configuration
45
+ Configuration.for(
46
+ self.environment(environments: super.environments)
47
+ )
46
48
  end
47
49
 
48
50
  # Prepare the environment and run the controller.
@@ -52,9 +54,13 @@ module Falcon
52
54
  buffer.puts "- Binding to: #{@options[:bind]}"
53
55
  buffer.puts "- To terminate: Ctrl-C or kill #{Process.pid}"
54
56
  buffer.puts "- To reload: kill -HUP #{Process.pid}"
57
+
58
+ self.resolved_paths.each do |path|
59
+ buffer.puts "- Loading configuration from #{path}"
60
+ end
55
61
  end
56
62
 
57
- self.controller.run
63
+ Async::Service::Controller.run(self.configuration)
58
64
  end
59
65
 
60
66
  # The endpoint to bind to.
@@ -1,28 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2018, by Mitsutaka Mimura.
6
6
 
7
7
  require_relative '../server'
8
8
  require_relative '../endpoint'
9
- require_relative '../controller/serve'
9
+ require_relative '../configuration'
10
+ require_relative '../service/server'
11
+ require_relative '../environment/rackup'
10
12
 
11
13
  require 'async/container'
12
-
13
- require 'async/io/trap'
14
- require 'async/io/host_endpoint'
15
- require 'async/io/shared_endpoint'
16
- require 'async/io/ssl_endpoint'
17
-
18
14
  require 'async/http/client'
19
-
20
15
  require 'samovar'
21
16
 
22
- require 'rack/builder'
23
-
24
- require 'bundler'
25
-
26
17
  module Falcon
27
18
  module Command
28
19
  # Implements the `falcon serve` command. Designed for *development*.
@@ -51,6 +42,45 @@ module Falcon
51
42
 
52
43
  option '--forks <count>', "Number of forks (hybrid only).", type: Integer
53
44
  option '--threads <count>', "Number of threads (hybrid only).", type: Integer
45
+
46
+ option '--[no]-restart', "Enable/disable automatic restart.", default: true
47
+ option '--graceful-stop <timeout>', "Duration to wait for graceful stop.", type: Float, default: 1.0
48
+ end
49
+
50
+ def container_options
51
+ @options.slice(:count, :forks, :threads, :restart)
52
+ end
53
+
54
+ def endpoint_options
55
+ @options.slice(:hostname, :port, :timeout)
56
+ end
57
+
58
+ def environment
59
+ Async::Service::Environment.new(Falcon::Environment::Server).with(
60
+ Falcon::Environment::Rackup,
61
+
62
+ root: Dir.pwd,
63
+
64
+ verbose: self.parent&.verbose?,
65
+ cache: @options[:cache],
66
+
67
+ container_options: self.container_options,
68
+ endpoint_options: self.endpoint_options,
69
+
70
+ rackup_path: @options[:config],
71
+ preload: [@options[:preload]].compact,
72
+ url: @options[:bind],
73
+
74
+ name: "server",
75
+
76
+ endpoint: ->{Endpoint.parse(url, **endpoint_options)}
77
+ )
78
+ end
79
+
80
+ def configuration
81
+ Configuration.new.tap do |configuration|
82
+ configuration.add(self.environment)
83
+ end
54
84
  end
55
85
 
56
86
  # The container class to use.
@@ -65,37 +95,6 @@ module Falcon
65
95
  end
66
96
  end
67
97
 
68
- # Whether verbose logging is enabled.
69
- # @returns [Boolean]
70
- def verbose?
71
- @parent&.verbose?
72
- end
73
-
74
- # Whether to enable the application HTTP cache.
75
- # @returns [Boolean]
76
- def cache?
77
- @options[:cache]
78
- end
79
-
80
- # Load the rack application from the specified configuration path.
81
- # @returns [Protocol::HTTP::Middleware]
82
- def load_app
83
- rack_app, _ = Rack::Builder.parse_file(@options[:config])
84
-
85
- return Server.middleware(rack_app, verbose: self.verbose?, cache: self.cache?)
86
- end
87
-
88
- # Options for the container.
89
- # See {Controller::Serve#setup}.
90
- def container_options
91
- @options.slice(:count, :forks, :threads)
92
- end
93
-
94
- # Options for the {endpoint}.
95
- def endpoint_options
96
- @options.slice(:hostname, :port, :reuse_port, :timeout)
97
- end
98
-
99
98
  # The endpoint to bind to.
100
99
  def endpoint
101
100
  Endpoint.parse(@options[:bind], **endpoint_options)
@@ -111,11 +110,6 @@ module Falcon
111
110
  Async::HTTP::Client.new(client_endpoint)
112
111
  end
113
112
 
114
- # Prepare a new controller for the command.
115
- def controller
116
- Controller::Serve.new(self)
117
- end
118
-
119
113
  # Prepare the environment and run the controller.
120
114
  def call
121
115
  Console.logger.info(self) do |buffer|
@@ -125,22 +119,7 @@ module Falcon
125
119
  buffer.puts "- To reload configuration: kill -HUP #{Process.pid}"
126
120
  end
127
121
 
128
- if path = @options[:preload]
129
- full_path = File.expand_path(path)
130
- load(full_path)
131
- end
132
-
133
- begin
134
- Bundler.require(:preload)
135
- rescue Bundler::GemfileNotFound
136
- # Ignore.
137
- end
138
-
139
- if GC.respond_to?(:compact)
140
- GC.compact
141
- end
142
-
143
- self.controller.run
122
+ Async::Service::Controller.run(self.configuration, container_class: self.container_class, graceful_stop: @options[:graceful_stop])
144
123
  end
145
124
  end
146
125
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2023, by Samuel Williams.
4
+ # Copyright, 2020-2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'serve'
7
7
  require_relative 'host'
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require_relative '../controller/virtual'
6
+ require_relative '../service/virtual'
7
7
  require_relative 'paths'
8
8
 
9
9
  require 'samovar'
@@ -30,26 +30,20 @@ module Falcon
30
30
  # @attribute [Array(String)]
31
31
  many :paths
32
32
 
33
- include Paths
34
-
35
- # Prepare a new controller for the command.
36
- def controller
37
- Controller::Virtual.new(self)
38
- end
39
-
40
- # The URI to bind the `HTTPS` -> `falcon host` proxy.
41
- def bind_secure
42
- @options[:bind_secure]
33
+ def environment
34
+ Async::Service::Environment.new(Falcon::Service::Virtual::Environment).with(
35
+ verbose: self.parent&.verbose?,
36
+ configuration_paths: self.paths,
37
+ bind_insecure: @options[:bind_insecure],
38
+ bind_secure: @options[:bind_secure],
39
+ timeout: @options[:timeout],
40
+ )
43
41
  end
44
42
 
45
- # The URI to bind the `HTTP` -> `HTTPS` redirector.
46
- def bind_insecure
47
- @options[:bind_insecure]
48
- end
49
-
50
- # The connection timeout to use for incoming connections.
51
- def timeout
52
- @options[:timeout]
43
+ def configuration
44
+ Async::Service::Configuration.new.tap do |configuration|
45
+ configuration.add(self.environment)
46
+ end
53
47
  end
54
48
 
55
49
  # Prepare the environment and run the controller.
@@ -60,9 +54,7 @@ module Falcon
60
54
  buffer.puts "- To reload all sites: kill -HUP #{Process.pid}"
61
55
  end
62
56
 
63
- ENV['CONSOLE_LEVEL'] = 'debug'
64
-
65
- self.controller.run
57
+ Async::Service::Controller.run(self.configuration)
66
58
  end
67
59
 
68
60
  # The insecure endpoint for connecting to the {Redirect} instance.
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2023, by Samuel Williams.
4
+ # Copyright, 2019-2024, by Samuel Williams.
5
5
  # Copyright, 2019, by Sho Ito.
6
6
 
7
- require 'build/environment'
7
+ require 'async/service'
8
8
 
9
9
  module Falcon
10
10
  # Manages environments which describes how to host a specific application.
@@ -25,177 +25,79 @@ module Falcon
25
25
  # end
26
26
  # ~~~
27
27
  #
28
- class Configuration
29
- # Initialize an empty configuration.
30
- def initialize
31
- @environments = {}
32
- end
33
-
34
- # The map of named environments.
35
- # @attribute [Hash(String, Build::Environment)]
36
- attr :environments
37
-
38
- # Enumerate all environments that have the specified key.
39
- # @parameter key [Symbol] Filter environments that don't have this key.
40
- def each(key = :authority)
41
- return to_enum(key) unless block_given?
42
-
43
- @environments.each do |name, environment|
44
- environment = environment.flatten
45
-
46
- if environment.include?(key)
47
- yield environment
48
- end
49
- end
50
- end
51
-
52
- # Add the named environment to the configuration.
53
- def add(environment)
54
- name = environment.name
55
-
56
- unless name
57
- raise ArgumentError, "Environment name is nil #{environment.inspect}"
58
- end
59
-
60
- environment = environment.flatten
61
-
62
- raise KeyError.new("#{name.inspect} is already set", key: name) if @environments.key?(name)
63
-
64
- @environments[name] = environment
65
- end
66
-
28
+ class Configuration < ::Async::Service::Configuration
67
29
  # Load the specified configuration file. See {Loader#load_file} for more details.
68
30
  def load_file(path)
69
31
  Loader.load_file(self, path)
70
32
  end
71
33
 
72
34
  # The domain specific language for loading configuration files.
73
- class Loader
74
- # Initialize the loader, attached to a specific configuration instance.
75
- # Any environments generated by the loader will be added to the configuration.
76
- # @parameter configuration [Configuration]
77
- # @parameter root [String] The file-system root path for relative path computations.
78
- def initialize(configuration, root = nil)
79
- @loaded = {}
80
- @configuration = configuration
81
- @environments = {}
82
- @root = root
83
- end
84
-
85
- # The file-system root path which is injected into the environments as required.
86
- # @attribute [String]
87
- attr :root
88
-
89
- # The attached configuration instance.
90
- # @attribute [Configuration]
91
- attr :configuration
92
-
93
- # Load the specified file into the given configuration.
94
- # @parameter configuration [Configuration]
95
- # @oaram path [String] The path to the configuration file, e.g. `falcon.rb`.
96
- def self.load_file(configuration, path)
97
- path = File.realpath(path)
98
- root = File.dirname(path)
99
-
100
- loader = self.new(configuration, root)
101
-
102
- loader.instance_eval(File.read(path), path)
103
- end
104
-
35
+ class Loader < ::Async::Service::Loader
105
36
  # Load specific features into the current configuration.
106
37
  #
107
- # Falcon provides default environments for different purposes. These are included in the gem, in the `environments/` directory. This method loads the code in those files into the current configuration.
108
- #
38
+ # @deprecated Use `require` instead.
109
39
  # @parameter features [Array(Symbol)] The features to load.
110
40
  def load(*features)
111
41
  features.each do |feature|
112
- next if @loaded.include?(feature)
113
-
114
42
  case feature
115
43
  when Symbol
116
- relative_path = File.join(__dir__, "environments", "#{feature}.rb")
117
-
118
- self.instance_eval(File.read(relative_path), relative_path)
119
-
120
- @loaded[feature] = relative_path
121
- when Module
122
- feature.load(self)
123
-
124
- @loaded[feature] = feature
44
+ require File.join(__dir__, "environment", "#{feature}.rb")
125
45
  else
126
46
  raise LoadError, "Unsure about how to load #{feature}!"
127
47
  end
128
48
  end
129
49
  end
130
50
 
131
- # Add the named environment, with zero or more parent environments, defined using the specified `block`.
132
- # @parameter name [String] The name of the environment.
133
- # @parameter parents [Array(Symbol)] The names of the parent environments to inherit.
134
- # @yields {...} The block that will generate the environment.
135
- def environment(name, *parents, &block)
136
- raise KeyError.new("#{name} is already set", key: name) if @environments.key?(name)
137
- @environments[name] = merge(name, *parents, &block)
138
- end
139
-
140
51
  # Define a host with the specified name.
141
52
  # Adds `root` and `authority` keys.
53
+ # @deprecated Use `service` and `include Falcon::Environment::Server` instead.
142
54
  # @parameter name [String] The name of the environment, usually a hostname.
143
55
  def host(name, *parents, &block)
144
- environment = merge(name, *parents, &block)
145
-
146
- environment[:root] = @root
147
- environment[:authority] = name
148
-
149
- @configuration.add(environment.flatten)
56
+ @configuration.add(
57
+ merge(*parents, name: name, root: @root, authority: name, &block)
58
+ )
150
59
  end
151
60
 
152
61
  # Define a proxy with the specified name.
153
62
  # Adds `root` and `authority` keys.
63
+ # @deprecated Use `service` and `include Falcon::Environment::Proxy` instead.
154
64
  # @parameter name [String] The name of the environment, usually a hostname.
155
65
  def proxy(name, *parents, &block)
156
- environment = merge(name, :proxy, *parents, &block)
157
-
158
- environment[:root] = @root
159
- environment[:authority] = name
160
-
161
- @configuration.add(environment.flatten)
66
+ @configuration.add(
67
+ merge(:proxy, *parents, name: name, root: @root, authority: name, &block)
68
+ )
162
69
  end
163
70
 
164
71
  # Define a rack application with the specified name.
165
72
  # Adds `root` and `authority` keys.
73
+ # @deprecated Use `service` and `include Falcon::Environment::Rack` instead.
166
74
  # @parameter name [String] The name of the environment, usually a hostname.
167
75
  def rack(name, *parents, &block)
168
- environment = merge(name, :rack, *parents, &block)
169
-
170
- environment[:root] = @root
171
- environment[:authority] = name
172
-
173
- @configuration.add(environment.flatten)
76
+ @configuration.add(
77
+ merge(:rack, *parents, name: name, root: @root, authority: name, &block)
78
+ )
174
79
  end
175
80
 
176
81
  # Define a supervisor instance
177
- # Adds `root` key.
82
+ # @deprecated Use `service` and `include Falcon::Environment::Supervisor` instead.
178
83
  def supervisor(&block)
179
84
  name = File.join(@root, "supervisor")
180
- environment = merge(name, :supervisor, &block)
181
85
 
182
- environment[:root] = @root
183
-
184
- @configuration.add(environment.flatten)
86
+ @configuration.add(
87
+ merge(:supervisor, name: name, root: @root, &block)
88
+ )
185
89
  end
186
90
 
187
91
  private
188
92
 
189
93
  # Build a new environment with the specified name and the given parents.
190
94
  # @parameter name [String]
191
- # @parameter parents [Array(Build::Environment)]
95
+ # @parameter parents [Array(Symbol)]
192
96
  # @yields {...} The block that will generate the environment.
193
- def merge(name, *parents, &block)
194
- environments = parents.map{|name| @environments.fetch(name)}
195
-
196
- parent = Build::Environment.combine(*environments)
97
+ def merge(*parents, **initial, &block)
98
+ facets = parents.map{|parent| Environment::LEGACY_ENVIRONMENTS.fetch(parent)}
197
99
 
198
- Build::Environment.new(parent, name: name, &block)
100
+ ::Async::Service::Environment.build(*facets, **initial, &block)
199
101
  end
200
102
  end
201
103
  end