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 +4 -4
- data/async-io.gemspec +2 -0
- data/lib/async/io/generic.rb +15 -62
- data/lib/async/io/socket.rb +16 -0
- data/lib/async/io/ssl_socket.rb +2 -2
- data/lib/async/io/stream.rb +5 -1
- data/lib/async/io/tcp_socket.rb +2 -0
- data/lib/async/io/unix_socket.rb +2 -0
- data/lib/async/io/version.rb +1 -1
- data/spec/async/io/socket_spec.rb +12 -0
- data/spec/async/io/ssl_socket_spec.rb +2 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20fb916388ff09f81a73c5933c6c73661162004bf7e03d5cffe2df2bd532160d
|
4
|
+
data.tar.gz: f1fb4209db5a4ec83ef34d24119d5b84e448e8eb2409a9e0443878e0bc1acc38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42480fc1ba98ce7693186a1b07fe3648294de99dc407d5f777043a08bba73aef2df2b6e61e3bd35e2dbe77ef132b0746f58000397a268c50eb55c61c93bf0214
|
7
|
+
data.tar.gz: e0fbfc6080bfc4310b9a3092936d0be65d6e9a0566403ec90566229575ba2e51380625623482e0c029f827d230c6818cda0ac4bcde832ad02c6bafcb7762408a
|
data/async-io.gemspec
CHANGED
@@ -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"
|
data/lib/async/io/generic.rb
CHANGED
@@ -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
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
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
|
data/lib/async/io/socket.rb
CHANGED
@@ -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
|
data/lib/async/io/ssl_socket.rb
CHANGED
@@ -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
|
|
data/lib/async/io/stream.rb
CHANGED
data/lib/async/io/tcp_socket.rb
CHANGED
data/lib/async/io/unix_socket.rb
CHANGED
@@ -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
|
data/lib/async/io/version.rb
CHANGED
@@ -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
|
|
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.
|
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-
|
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: '
|
151
|
+
version: '2.3'
|
152
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
153
|
requirements:
|
154
154
|
- - ">="
|