Sha256: 7d7d7c42dcdf9659a634518dea883f4f590abe0223bade7a67bc9b723a37e875

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2023, by Samuel Williams.

require 'rackup/handler'

require_relative '../../falcon'

require 'kernel/sync'
require 'io/endpoint/host_endpoint'

module Falcon
	module Rackup
		# The falcon adaptor for the `rackup` executable.
		class Handler
			# The default scheme.
			SCHEME = "http"
			
			# Generate an endpoint for the given `rackup` options.
			# @returns [::IO::Endpoint::HostEndpoint]
			def self.endpoint_for(**options)
				host = options[:Host] || 'localhost'
				port = Integer(options[:Port] || 9292)
				
				return ::IO::Endpoint.tcp(host, port)
			end
			
			# Run the specified app using the given options:
			# @parameter app [Object] The rack middleware.
			def self.run(app, **options)
				app = ::Protocol::Rack::Adapter.new(app)
				
				Sync do |task|
					endpoint = endpoint_for(**options)
					server = ::Falcon::Server.new(app, endpoint, protocol: Async::HTTP::Protocol::HTTP1, scheme: SCHEME)
					
					server_task = server.run
					
					wrapper = self.new(server, task)
					
					yield wrapper if block_given?
					
					server_task.wait
				ensure
					server_task.stop
					wrapper.close
				end
			end
			
			def initialize(server, task)
				@server = server
				@task = task
				
				@notification = Thread::Queue.new
				
				@waiter = @task.async(transient: true) do
					@notification.pop
					
					@task&.stop
					@task = nil
				end
			end
			
			def stop
				@notification&.push(true)
			end
			
			def close
				@notification&.close
				@notification = nil
				
				@waiter&.stop
				@waiter = nil
			end
		end
	end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
falcon-0.47.1 lib/falcon/rackup/handler.rb