Class: Evinrude::Network
- Inherits:
-
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_address ⇒ Object
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_port ⇒ Object
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_address ⇒ Object
38
39
40
|
# File 'lib/evinrude/network.rb', line 38
def listen_address
@listen[:address]
end
|
#listen_port ⇒ Object
42
43
44
|
# File 'lib/evinrude/network.rb', line 42
def listen_port
@listen[:port] == 0 ? advertised_port : @listen[:port]
end
|
#start ⇒ Object
19
20
21
22
23
|
# File 'lib/evinrude/network.rb', line 19
def start
@socket = @endpoint.bind.first
@socket.listen(Socket::SOMAXCONN)
self
end
|