async-io 1.10.0 → 1.11.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: 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
  - - ">="