io-endpoint 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c519269d1e8459a607159be713100765c2e424f199a08cce97e1ba6c877b5b6a
4
- data.tar.gz: ee2e142c5320d9412395c80098e669971b8956b43ad58252d52a85e2a97a5a97
3
+ metadata.gz: 10203d535af830bf9ff71034262b5851ec323024a9de4db527f061cb1cd76102
4
+ data.tar.gz: b150061a0414c379afb7fb5f2c142767afc5ed1822e5b106b78ece023d1cf459
5
5
  SHA512:
6
- metadata.gz: 67ce6a415b998cd1d072a1faee146803f30de818666278846cbdf69f8f72fd8c30d0df371ec44747a2ea74a1fdd0d86f100e187ba15d17275ffbb335d29e6df5
7
- data.tar.gz: 360a4f1ee5e162e71be467b0090e54eade25f141abde4452f6ba0e389def1398eaabfe5f76aaed4cbf333ba0c40334e014029d7fb76e13d09ff60f428ac63d9f
6
+ metadata.gz: 82930d72359dee91627b19c771f79c9f2c6cc43dc93b9514a372a4568d1fb92c653ff2da1403c8519eddc4470dc14ef2356abe41cd202fba80bc35ba10e2d053
7
+ data.tar.gz: 556e87a95eb514e643a3e6bb40468ac851cceea5da6fb6f72db37767dca18882bb9b63e61e05d2e69629a1e4eef1859c3a2b3e0797b36e0e4eb1202684f8d44c
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,27 @@
1
+ require 'socket'
2
+
3
+ class IO
4
+ def connected?
5
+ !closed?
6
+ end
7
+ end
8
+
9
+ class Socket
10
+ def connected?
11
+ # Is it likely that the socket is still connected?
12
+ # May return false positive, but won't return false negative.
13
+ return false unless super
14
+
15
+ # If we can wait for the socket to become readable, we know that the socket may still be open.
16
+ result = to_io.recv_nonblock(1, MSG_PEEK, exception: false)
17
+
18
+ # No data was available - newer Ruby can return nil instead of empty string:
19
+ return false if result.nil?
20
+
21
+ # Either there was some data available, or we can wait to see if there is data avaialble.
22
+ return !result.empty? || result == :wait_readable
23
+ rescue Errno::ECONNRESET
24
+ # This might be thrown by recv_nonblock.
25
+ return false
26
+ end
27
+ end
@@ -18,12 +18,12 @@ module IO::Endpoint
18
18
  end
19
19
  end
20
20
 
21
- def connect(&block)
21
+ def connect(wrapper = Wrapper.default, &block)
22
22
  last_error = nil
23
23
 
24
24
  @endpoints.each do |endpoint|
25
25
  begin
26
- return endpoint.connect(&block)
26
+ return endpoint.connect(wrapper, &block)
27
27
  rescue => last_error
28
28
  end
29
29
  end
@@ -31,7 +31,7 @@ module IO::Endpoint
31
31
  raise last_error
32
32
  end
33
33
 
34
- def bind(&block)
34
+ def bind(wrapper = Wrapper.default, &block)
35
35
  if block_given?
36
36
  @endpoints.each do |endpoint|
37
37
  endpoint.bind(&block)
@@ -69,21 +69,13 @@ module IO::Endpoint
69
69
 
70
70
  # Accept connections from the specified endpoint.
71
71
  # @param backlog [Integer] the number of connections to listen for.
72
- def accept(backlog: Socket::SOMAXCONN, &block)
73
- bind do |server|
74
- server.listen(backlog) if backlog
75
-
76
- while true
77
- socket, address = server.accept
78
-
79
- Fiber.schedule do
80
- yield socket, address
81
- end
82
- end
72
+ def accept(wrapper = Wrapper.default, *arguments, **options, &block)
73
+ bind(wrapper, *arguments, **options) do |server|
74
+ wrapper.accept(server, &block)
83
75
  end
84
76
  end
85
77
 
86
- # Create an Endpoint instance by URI scheme. The host and port of the URI will be passed to the Endpoint factory method, along with any options.\
78
+ # Create an Endpoint instance by URI scheme. The host and port of the URI will be passed to the Endpoint factory method, along with any options.
87
79
  #
88
80
  # You should not use untrusted input as it may execute arbitrary code.
89
81
  #
@@ -32,11 +32,11 @@ module IO::Endpoint
32
32
 
33
33
  # Create a new `SharedEndpoint` by connecting to the given endpoint.
34
34
  def self.connected(endpoint, close_on_exec: false)
35
- wrapper = endpoint.connect
35
+ socket = endpoint.connect
36
36
 
37
- wrapper.close_on_exec = close_on_exec
37
+ socket.close_on_exec = close_on_exec
38
38
 
39
- return self.new(endpoint, [wrapper])
39
+ return self.new(endpoint, [socket])
40
40
  end
41
41
 
42
42
  def initialize(endpoint, sockets, **options)
@@ -53,18 +53,18 @@ module IO::Endpoint
53
53
 
54
54
  def local_address_endpoint(**options)
55
55
  endpoints = @sockets.map do |wrapper|
56
- AddressEndpoint.new(wrapper.to_io.local_address)
56
+ AddressEndpoint.new(wrapper.to_io.local_address, **options)
57
57
  end
58
58
 
59
- return CompositeEndpoint.new(endpoints, **options)
59
+ return CompositeEndpoint.new(endpoints)
60
60
  end
61
61
 
62
62
  def remote_address_endpoint(**options)
63
63
  endpoints = @sockets.map do |wrapper|
64
- AddressEndpoint.new(wrapper.to_io.remote_address)
64
+ AddressEndpoint.new(wrapper.to_io.remote_address, **options)
65
65
  end
66
66
 
67
- return CompositeEndpoint.new(endpoints, **options)
67
+ return CompositeEndpoint.new(endpoints)
68
68
  end
69
69
 
70
70
  # Close all the internal sockets.
@@ -113,9 +113,9 @@ module IO::Endpoint
113
113
  end
114
114
  end
115
115
 
116
- def accept(**options, &block)
117
- bind do |server|
118
- server.accept(&block)
116
+ def accept(wrapper = Wrapper.default, &block)
117
+ bind(wrapper) do |server|
118
+ wrapper.accept(server, &block)
119
119
  end
120
120
  end
121
121
 
@@ -91,14 +91,14 @@ module IO::Endpoint
91
91
  # Connect to the underlying endpoint and establish a SSL connection.
92
92
  # @yield [Socket] the socket which is being connected
93
93
  # @return [Socket] the connected socket
94
- def bind
94
+ def bind(*arguments, **options, &block)
95
95
  if block_given?
96
- @endpoint.bind do |server|
97
- yield ::OpenSSL::SSL::SSLServer.new(server, context)
96
+ @endpoint.bind(*arguments, **options) do |server|
97
+ yield ::OpenSSL::SSL::SSLServer.new(server, self.context)
98
98
  end
99
99
  else
100
- @endpoint.bind.map do |server|
101
- ::OpenSSL::SSL::SSLServer.new(server, context)
100
+ @endpoint.bind(*arguments, **options).map do |server|
101
+ ::OpenSSL::SSL::SSLServer.new(server, self.context)
102
102
  end
103
103
  end
104
104
  end
@@ -107,7 +107,7 @@ module IO::Endpoint
107
107
  # @yield [Socket] the socket which is being connected
108
108
  # @return [Socket] the connected socket
109
109
  def connect(&block)
110
- socket = ::OpenSSL::SSL::SSLSocket.new(@endpoint.connect, context)
110
+ socket = ::OpenSSL::SSL::SSLSocket.new(@endpoint.connect, self.context)
111
111
 
112
112
  if hostname = self.hostname
113
113
  socket.hostname = hostname
@@ -5,6 +5,6 @@
5
5
 
6
6
  class IO
7
7
  module Endpoint
8
- VERSION = "0.3.0"
8
+ VERSION = "0.4.0"
9
9
  end
10
10
  end
@@ -30,7 +30,6 @@ module IO::Endpoint
30
30
  # On Darwin, sometimes occurs when the connection is not yet fully formed. Empirically, TCP_NODELAY is enabled despite this result.
31
31
  rescue Errno::EOPNOTSUPP
32
32
  # Some platforms may simply not support the operation.
33
- # Console.logger.warn(self) {"Unable to set sync=#{value}!"}
34
33
  rescue Errno::ENOPROTOOPT
35
34
  # It may not be supported by the protocol (e.g. UDP). ¯\_(ツ)_/¯
36
35
  end
@@ -131,14 +130,14 @@ module IO::Endpoint
131
130
  end
132
131
 
133
132
  # Bind to a local address and accept connections in a loop.
134
- def accept(*arguments, backlog: SOMAXCONN, **options, &block)
135
- bind(*arguments, **options) do |server|
136
- server.listen(backlog) if backlog
133
+ def accept(server, timeout: server.timeout, &block)
134
+ while true
135
+ socket, address = server.accept
136
+
137
+ socket.timeout = timeout if timeout != false
137
138
 
138
139
  async do
139
- while true
140
- server.accept(&block)
141
- end
140
+ yield socket, address
142
141
  end
143
142
  end
144
143
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: io-endpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -37,7 +37,7 @@ cert_chain:
37
37
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
38
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
39
  -----END CERTIFICATE-----
40
- date: 2023-12-28 00:00:00.000000000 Z
40
+ date: 2024-01-01 00:00:00.000000000 Z
41
41
  dependencies: []
42
42
  description:
43
43
  email:
@@ -45,6 +45,7 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - lib/io/connected.rb
48
49
  - lib/io/endpoint.rb
49
50
  - lib/io/endpoint/address_endpoint.rb
50
51
  - lib/io/endpoint/composite_endpoint.rb
@@ -78,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
79
  - !ruby/object:Gem::Version
79
80
  version: '0'
80
81
  requirements: []
81
- rubygems_version: 3.5.3
82
+ rubygems_version: 3.4.10
82
83
  signing_key:
83
84
  specification_version: 4
84
85
  summary: Provides a separation of concerns interface for IO endpoints.
metadata.gz.sig CHANGED
Binary file