async-io 1.10.0 → 1.11.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: c16b3fc4731d433938fa0e1e17dfc6f9adf6d04e5be969490d48393c0c1e88c8
4
- data.tar.gz: ce83e964e7bac569a90fc6c53130b0fbfe6ef8f331ecd8e070711237dc36e170
3
+ metadata.gz: 20fb916388ff09f81a73c5933c6c73661162004bf7e03d5cffe2df2bd532160d
4
+ data.tar.gz: f1fb4209db5a4ec83ef34d24119d5b84e448e8eb2409a9e0443878e0bc1acc38
5
5
  SHA512:
6
- metadata.gz: c75b738875dab6744261a409eda31b33356fe0350fbf1baa61103294ef5166ba93f70b73428ba41c2077976b69aa6b755c71f8221b74ed913b7a13ad7bb0b7bb
7
- data.tar.gz: 6e9f04ae63f63698bdfc611e67af677a293f103561de4cfb163de5e92aa3573ac89623d642e25419e5a4abc3436aae4d91d990c294852c6bcbca26ab269c039f
6
+ metadata.gz: 42480fc1ba98ce7693186a1b07fe3648294de99dc407d5f777043a08bba73aef2df2b6e61e3bd35e2dbe77ef132b0746f58000397a268c50eb55c61c93bf0214
7
+ data.tar.gz: e0fbfc6080bfc4310b9a3092936d0be65d6e9a0566403ec90566229575ba2e51380625623482e0c029f827d230c6818cda0ac4bcde832ad02c6bafcb7762408a
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.add_dependency "async", "~> 1.3"
20
20
  spec.add_development_dependency "async-rspec", "~> 1.4"
21
21
 
22
+ spec.required_ruby_version = '~> 2.3'
23
+
22
24
  spec.add_development_dependency "bundler", "~> 1.3"
23
25
  spec.add_development_dependency "rake", "~> 10.0"
24
26
  spec.add_development_dependency "rspec", "~> 3.0"
@@ -117,70 +117,23 @@ module Async
117
117
  true
118
118
  end
119
119
 
120
+ def connected?
121
+ !@io.closed?
122
+ end
123
+
120
124
  protected
121
125
 
122
- if RUBY_ENGINE == "ruby" and RUBY_VERSION >= "2.3"
123
- def async_send(*args)
124
- async do
125
- @io.__send__(*args, exception: false)
126
- end
127
- rescue Errno::EPROTOTYPE
128
- raise Errno::EPIPE
129
- end
130
-
131
- def async
132
- while true
133
- result = yield
134
-
135
- case result
136
- when :wait_readable
137
- wait_readable
138
- when :wait_writable
139
- wait_writable
140
- else
141
- return result
142
- end
143
- end
144
- end
145
- elsif RUBY_ENGINE == "ruby" and RUBY_VERSION >= "2.1"
146
- def async_send(*args)
147
- async do
148
- @io.__send__(*args)
149
- end
150
- end
151
-
152
- def async
153
- while true
154
- begin
155
- return yield
156
- rescue ::IO::WaitReadable, ::IO::EAGAINWaitReadable
157
- wait_readable
158
- rescue ::IO::WaitWritable, ::IO::EAGAINWaitWritable
159
- wait_writable
160
- rescue Errno::EPROTOTYPE
161
- raise Errno::EPIPE
162
- end
163
- end
164
- end
165
- else
166
- # This is also correct for Rubinius.
167
- def async_send(*args)
168
- async do
169
- @io.__send__(*args)
170
- end
171
- end
172
-
173
- def async
174
- while true
175
- begin
176
- return yield
177
- rescue ::IO::WaitReadable
178
- wait_readable
179
- rescue ::IO::WaitWritable
180
- wait_writable
181
- rescue Errno::EPROTOTYPE
182
- raise Errno::EPIPE
183
- end
126
+ def async_send(*args)
127
+ while true
128
+ result = @io.__send__(*args, exception: false)
129
+
130
+ case result
131
+ when :wait_readable
132
+ wait_readable
133
+ when :wait_writable
134
+ wait_writable
135
+ else
136
+ return result
184
137
  end
185
138
  end
186
139
  end
@@ -23,6 +23,20 @@ require_relative 'generic'
23
23
 
24
24
  module Async
25
25
  module IO
26
+ module Peer
27
+ # Is it likely that the socket is still connected?
28
+ # May return false positive, but won't return false negative.
29
+ def connected?
30
+ return false if @io.closed?
31
+
32
+ # If we can wait for the socket to become readable, we know that the socket may still be open.
33
+ result = to_io.recv_nonblock(1, Socket::MSG_PEEK, exception: false)
34
+
35
+ # Either there was some data available, or we can wait to see if there is data avaialble.
36
+ return !result.empty? || result == :wait_readable
37
+ end
38
+ end
39
+
26
40
  class BasicSocket < Generic
27
41
  wraps ::BasicSocket, :setsockopt, :connect_address, :close_read, :close_write, :local_address, :remote_address, :do_not_reverse_lookup, :do_not_reverse_lookup=, :shutdown, :getsockopt, :getsockname, :getpeername, :getpeereid
28
42
 
@@ -35,6 +49,8 @@ module Async
35
49
  def type
36
50
  self.local_address.socktype
37
51
  end
52
+
53
+ include Peer
38
54
  end
39
55
 
40
56
  module Server
@@ -36,8 +36,6 @@ module Async
36
36
  alias syswrite write
37
37
  alias sysread read
38
38
 
39
- # It's hard to know what #to_io / #io should do. So, they are omitted.
40
-
41
39
  def self.connect(socket, context, hostname = nil, &block)
42
40
  client = self.wrap(socket, context)
43
41
 
@@ -72,6 +70,8 @@ module Async
72
70
  @io.to_io.remote_address
73
71
  end
74
72
 
73
+ include Peer
74
+
75
75
  def self.wrap(socket, context)
76
76
  io = @wrapped_klass.new(socket.to_io, context)
77
77
 
@@ -137,7 +137,11 @@ module Async
137
137
 
138
138
  flush
139
139
  end
140
-
140
+
141
+ def connected?
142
+ @io.connected?
143
+ end
144
+
141
145
  def closed?
142
146
  @io.closed?
143
147
  end
@@ -53,6 +53,8 @@ module Async
53
53
  alias open new
54
54
  end
55
55
 
56
+ include Peer
57
+
56
58
  attr :buffer
57
59
 
58
60
  def_delegators :@buffer, :gets, :puts, :flush
@@ -25,6 +25,8 @@ module Async
25
25
  class UNIXSocket < BasicSocket
26
26
  # `send_io`, `recv_io` and `recvfrom` may block but no non-blocking implementation available.
27
27
  wraps ::UNIXSocket, :path, :addr, :peeraddr, :send_io, :recv_io, :recvfrom
28
+
29
+ include Peer
28
30
  end
29
31
 
30
32
  class UNIXServer < UNIXSocket
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module IO
23
- VERSION = "1.10.0"
23
+ VERSION = "1.11.0"
24
24
  end
25
25
  end
@@ -63,6 +63,18 @@ RSpec.describe Async::IO::Socket do
63
63
  expect(s2.recv(32)).to be == "Hello World"
64
64
  s2.close
65
65
  end
66
+
67
+ it "should be connected" do
68
+ s1, s2 = *subject
69
+
70
+ expect(s1).to be_connected
71
+
72
+ s1.close
73
+
74
+ expect(s2).to_not be_connected
75
+
76
+ s2.close
77
+ end
66
78
  end
67
79
  end
68
80
 
@@ -63,6 +63,8 @@ RSpec.describe Async::IO::SSLSocket do
63
63
 
64
64
  reactor.async do
65
65
  client_endpoint.connect do |client|
66
+ expect(client).to be_connected
67
+
66
68
  client.write(data)
67
69
 
68
70
  expect(client.read(512)).to be == data
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.10.0
4
+ version: 1.11.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-05-02 00:00:00.000000000 Z
11
+ date: 2018-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -146,9 +146,9 @@ require_paths:
146
146
  - lib
147
147
  required_ruby_version: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - ">="
149
+ - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: '0'
151
+ version: '2.3'
152
152
  required_rubygems_version: !ruby/object:Gem::Requirement
153
153
  requirements:
154
154
  - - ">="