lib/async/http/mock/endpoint.rb



# frozen_string_literal: true

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

require_relative '../protocol'

require 'async/queue'

module Async
	module HTTP
		module Mock
			# This is an endpoint which bridges a client with a local server.
			class Endpoint
				def initialize(protocol = Protocol::HTTP2, scheme = "http", authority = "localhost", queue: Queue.new)
					@protocol = protocol
					@scheme = scheme
					@authority = authority
					
					@queue = queue
				end
				
				attr :protocol
				attr :scheme
				attr :authority
				
				# Processing incoming connections
				# @yield [::HTTP::Protocol::Request] the requests as they come in.
				def run(parent: Task.current, &block)
					while peer = @queue.dequeue
						server = @protocol.server(peer)
						
						parent.async do
							server.each(&block)
						end
					end
				end
				
				def connect
					local, remote = ::Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM)
					
					@queue.enqueue(remote)
					
					return local
				end
				
				def wrap(endpoint)
					self.class.new(@protocol, endpoint.scheme, endpoint.authority, queue: @queue)
				end
			end
		end
	end
end