io-endpoint 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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