Class: Evinrude::Network

Inherits:
Object
  • Object
show all
Includes:
LoggingHelpers
Defined in:
lib/evinrude/network.rb,
lib/evinrude/network/protocol.rb,
lib/evinrude/network/connection.rb

Defined Under Namespace

Modules: Protocol Classes: Connection, ConnectionTimeoutError

Instance Method Summary collapse

Constructor Details

#initialize(keys:, logger:, metrics:, listen:, advertise:) ⇒ Network

Returns a new instance of Network.



13
14
15
16
17
# File 'lib/evinrude/network.rb', line 13

def initialize(keys:, logger:, metrics:, listen:, advertise:)
	@keys, @logger, @metrics, @advertise, @listen = keys, logger, metrics, advertise, listen

	@endpoint = Async::IO::Endpoint.tcp(@listen[:address], @listen[:port])
end

Instance Method Details

#advertised_addressObject



25
26
27
28
29
30
31
# File 'lib/evinrude/network.rb', line 25

def advertised_address
	@advertise[:address] ||
	(
		Socket.ip_address_list.select { |a| a.ipv6? && !a.ipv6_loopback? && !a.ipv6_linklocal? }.first ||
		Socket.ip_address_list.select { |a| a.ipv4? && !a.ipv4_loopback? }.first
	).ip_address
end

#advertised_portObject



33
34
35
36
# File 'lib/evinrude/network.rb', line 33

def advertised_port
	@advertise[:port] ||
	@socket&.instance_variable_get(:@io)&.local_address&.ip_port
end

#connect(address:, port:) ⇒ Object



62
63
64
65
66
67
# File 'lib/evinrude/network.rb', line 62

def connect(address:, port:)
	Connection.connect(address: address, port: port, keys: @keys, logger: logger, metrics: @metrics).tap do |conn|
		logger.debug(logloc) { "New connection #{conn} to #{address}:#{port}" }
		yield conn if block_given?
	end
end

#each_message(&blk) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/evinrude/network.rb', line 46

def each_message(&blk)
	unless @socket
		bind
	end

	@socket.listen(Socket::SOMAXCONN)

	@socket.accept_each do |sock|
		conn = Network::Connection.new(socket: sock, keys: @keys, logger: logger, metrics: @metrics)

		conn.each_message do |msg|
			blk.call(msg, conn)
		end
	end
end

#listen_addressObject



38
39
40
# File 'lib/evinrude/network.rb', line 38

def listen_address
	@listen[:address]
end

#listen_portObject



42
43
44
# File 'lib/evinrude/network.rb', line 42

def listen_port
	@listen[:port] == 0 ? advertised_port : @listen[:port]
end

#startObject



19
20
21
22
23
# File 'lib/evinrude/network.rb', line 19

def start
	@socket = @endpoint.bind.first
	@socket.listen(Socket::SOMAXCONN)
	self
end