async-io 1.14.0 → 1.15.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: '08ed02b9fabc43bcd20e61f50473ee0606a821b7e655710805da340164cb7c2d'
4
- data.tar.gz: 2275335c17c84fb21fdd70275c6108a184c513e4eeb92d0fbd1140b683112f10
3
+ metadata.gz: 6d4d9a66fb4be7f89c7dda8e08e7e10fdc2145d52eb5310b7b0d5bf0aa657fd7
4
+ data.tar.gz: ba85706fcee621d8f23b01a67389c084c8772f759c301e6c22a165b94a2f5686
5
5
  SHA512:
6
- metadata.gz: 944f73030f9c9134b8a209eda2fdd8afb9b438c2c8a52085c250a8a695c9e546cbe65447b96c09caa8b7699a0c0a742b24fdabb574d1b56b37fee323a59a3017
7
- data.tar.gz: c7b5d911865071df5a711269547388d13e2dcdd0ad5fd685b1545ff334d7d0d18d6a93efec111eac7203eca0fb58a5349f44a5aa1bd3123bc27f3b947dcdefe4
6
+ metadata.gz: f2f682fdde7cd37a7836233bd194c7a1fca1a5f25e4f1f1bb424e95075b40a3b6d46c83ca2a92c57557e038515bb425989a11397067bf7afb2c8128ce532b514
7
+ data.tar.gz: c7fa044f6140fc47e040188d0fa66848812ea1b187935fb9fbbdc46efdff7f553037af77089e955481779c1c605396851b6aa9b1fc280a2497fd64f995304a61
@@ -38,10 +38,15 @@ module Async
38
38
  attr :address
39
39
  attr :options
40
40
 
41
+ # Bind a socket to the given address. If a block is given, the socket will be automatically closed when the block exits.
42
+ # @yield [Socket] the bound socket
43
+ # @return [Socket] the bound socket
41
44
  def bind(&block)
42
45
  Socket.bind(@address, **@options, &block)
43
46
  end
44
47
 
48
+ # Connects a socket to the given address. If a block is given, the socket will be automatically closed when the block exits.
49
+ # @return [Socket] the connected socket
45
50
  def connect(&block)
46
51
  Socket.connect(@address, **@options, &block)
47
52
  end
@@ -25,6 +25,7 @@ require 'uri'
25
25
 
26
26
  module Async
27
27
  module IO
28
+ # Endpoints represent a way of connecting or binding to an address.
28
29
  class Endpoint
29
30
  def initialize(**options)
30
31
  @options = options
@@ -37,10 +37,14 @@ module Async
37
37
  @specification.first
38
38
  end
39
39
 
40
+ # Try to connect to the given host by connecting to each address in sequence until a connection is made.
41
+ # @yield [Socket] the socket which is being connected, may be invoked more than once
42
+ # @return [Socket] the connected socket
43
+ # @raise if no connection could complete successfully
40
44
  def connect(&block)
41
45
  last_error = nil
42
46
 
43
- Addrinfo.foreach(*@specification).each do |address|
47
+ Addrinfo.foreach(*@specification) do |address|
44
48
  begin
45
49
  return Socket.connect(address, **@options, &block)
46
50
  rescue
@@ -51,16 +55,20 @@ module Async
51
55
  raise last_error
52
56
  end
53
57
 
58
+ # Invokes the given block for every address which can be bound to.
59
+ # @yield [Socket] the bound socket
60
+ # @return [Array<Socket>] an array of bound sockets
54
61
  def bind(&block)
55
- Addrinfo.foreach(*@specification) do |address|
62
+ Addrinfo.foreach(*@specification).collect do |address|
56
63
  Socket.bind(address, **@options, &block)
57
64
  end
58
65
  end
59
66
 
67
+ # @yield [AddressEndpoint] address endpoints by resolving the given host specification
60
68
  def each
61
69
  return to_enum unless block_given?
62
70
 
63
- Addrinfo.foreach(*@specification).each do |address|
71
+ Addrinfo.foreach(*@specification) do |address|
64
72
  yield AddressEndpoint.new(address, **@options)
65
73
  end
66
74
  end
@@ -50,10 +50,13 @@ module Async
50
50
  end
51
51
 
52
52
  def initialize(endpoint, wrappers)
53
- @wrappers = wrappers
54
53
  @endpoint = endpoint
54
+ @wrappers = wrappers
55
55
  end
56
56
 
57
+ attr :endpoint
58
+ attr :wrappers
59
+
57
60
  def close
58
61
  @wrappers.each(&:close)
59
62
  end
@@ -62,12 +62,22 @@ module Async
62
62
  return context
63
63
  end
64
64
 
65
+ # Connect to the underlying endpoint and establish a SSL connection.
66
+ # @yield [Socket] the socket which is being connected
67
+ # @return [Socket] the connected socket
65
68
  def bind
66
- @endpoint.bind do |server|
67
- yield SSLServer.new(server, context)
69
+ if block_given?
70
+ @endpoint.bind do |server|
71
+ yield SSLServer.new(server, context)
72
+ end
73
+ else
74
+ return SSLServer.new(@endpoint.bind, context)
68
75
  end
69
76
  end
70
77
 
78
+ # Connect to the underlying endpoint and establish a SSL connection.
79
+ # @yield [Socket] the socket which is being connected
80
+ # @return [Socket] the connected socket
71
81
  def connect(&block)
72
82
  SSLSocket.connect(@endpoint.connect, context, hostname, &block)
73
83
  end
@@ -94,7 +94,7 @@ module Async
94
94
  @context = context
95
95
  end
96
96
 
97
- def_delegators :@server, :local_address, :setsockopt, :getsockopt, :close
97
+ def_delegators :@server, :local_address, :setsockopt, :getsockopt, :close, :close_on_exec=, :reactor=
98
98
 
99
99
  attr :server
100
100
  attr :context
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module IO
23
- VERSION = "1.14.0"
23
+ VERSION = "1.15.0"
24
24
  end
25
25
  end
@@ -0,0 +1,52 @@
1
+ # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'async/io/host_endpoint'
22
+ require 'async/io/shared_endpoint'
23
+
24
+ RSpec.describe Async::IO::SharedEndpoint do
25
+ include_context Async::RSpec::Reactor
26
+
27
+ describe '#bound' do
28
+ let(:endpoint) {Async::IO::Endpoint.tcp("localhost", 5123)}
29
+
30
+ it "can bind to shared endpoint" do
31
+ bound_endpoint = described_class.bound(endpoint)
32
+
33
+ expect(bound_endpoint.wrappers).to_not be_empty
34
+ expect(bound_endpoint.wrappers.first).to be_a Async::IO::Socket
35
+
36
+ bound_endpoint.close
37
+ end
38
+ end
39
+
40
+ describe '#connected' do
41
+ let(:endpoint) {Async::IO::Endpoint.tcp("www.google.com", 80)}
42
+
43
+ it "can connect to shared endpoint" do
44
+ connected_endpoint = described_class.connected(endpoint)
45
+
46
+ expect(connected_endpoint.wrappers).to_not be_empty
47
+ expect(connected_endpoint.wrappers.first).to be_a Async::IO::Socket
48
+
49
+ connected_endpoint.close
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-io
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.0
4
+ version: 1.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-31 00:00:00.000000000 Z
11
+ date: 2018-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -133,6 +133,7 @@ files:
133
133
  - spec/async/io/generic_spec.rb
134
134
  - spec/async/io/notification_spec.rb
135
135
  - spec/async/io/protocol/line_spec.rb
136
+ - spec/async/io/shared_endpoint_spec.rb
136
137
  - spec/async/io/socket/tcp_spec.rb
137
138
  - spec/async/io/socket/udp_spec.rb
138
139
  - spec/async/io/socket_spec.rb
@@ -178,6 +179,7 @@ test_files:
178
179
  - spec/async/io/generic_spec.rb
179
180
  - spec/async/io/notification_spec.rb
180
181
  - spec/async/io/protocol/line_spec.rb
182
+ - spec/async/io/shared_endpoint_spec.rb
181
183
  - spec/async/io/socket/tcp_spec.rb
182
184
  - spec/async/io/socket/udp_spec.rb
183
185
  - spec/async/io/socket_spec.rb