async-io 1.30.0 → 1.32.1
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 +4 -4
- data/lib/async/io/generic.rb +1 -1
- data/lib/async/io/peer.rb +2 -2
- data/lib/async/io/shared_endpoint.rb +4 -4
- data/lib/async/io/socket.rb +2 -2
- data/lib/async/io/ssl_socket.rb +2 -4
- data/lib/async/io/stream.rb +4 -4
- data/lib/async/io/tcp_socket.rb +1 -1
- data/lib/async/io/threads.rb +42 -20
- data/lib/async/io/trap.rb +4 -0
- data/lib/async/io/version.rb +1 -1
- metadata +12 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0eedd48282062fbeed1ef84ec609fc2f380c122ebf33f9035af7a9bbe21fee5e
|
4
|
+
data.tar.gz: 83a33c4964ffd1777ca948dce4c20a3e62cc575793268e70e517f0f2858f9cdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4eb398ef67e38c31feaee2da4d7c2e9b7e8dd49350082d01615c914c2d483ab36e52d42db0b32e4a80adc5a8683e06805bc5814a4a7c9a7a60b9c4aab983522
|
7
|
+
data.tar.gz: 3dc2b05cc064e479da2528860370d51cbff0f332bdef4f3819c8b8ebf92ff59e3f04e737a371b99e74c9d324637903213d56808dab2e3fa2783061086b593a33
|
data/lib/async/io/generic.rb
CHANGED
data/lib/async/io/peer.rb
CHANGED
@@ -59,13 +59,13 @@ module Async
|
|
59
59
|
when 0, IPPROTO_TCP
|
60
60
|
self.setsockopt(IPPROTO_TCP, TCP_NODELAY, value ? 1 : 0)
|
61
61
|
else
|
62
|
-
|
62
|
+
Console.logger.warn(self) {"Unsure how to sync=#{value} for #{self.protocol}!"}
|
63
63
|
end
|
64
64
|
rescue Errno::EINVAL
|
65
65
|
# On Darwin, sometimes occurs when the connection is not yet fully formed. Empirically, TCP_NODELAY is enabled despite this result.
|
66
66
|
rescue Errno::EOPNOTSUPP
|
67
67
|
# Some platforms may simply not support the operation.
|
68
|
-
#
|
68
|
+
# Console.logger.warn(self) {"Unable to set sync=#{value}!"}
|
69
69
|
end
|
70
70
|
|
71
71
|
def sync
|
@@ -27,10 +27,10 @@ module Async
|
|
27
27
|
# Pre-connect and pre-bind sockets so that it can be used between processes.
|
28
28
|
class SharedEndpoint < Endpoint
|
29
29
|
# Create a new `SharedEndpoint` by binding to the given endpoint.
|
30
|
-
def self.bound(endpoint, backlog
|
30
|
+
def self.bound(endpoint, backlog: Socket::SOMAXCONN, close_on_exec: false)
|
31
31
|
wrappers = endpoint.bound do |server|
|
32
32
|
server.listen(backlog)
|
33
|
-
server.close_on_exec =
|
33
|
+
server.close_on_exec = close_on_exec
|
34
34
|
server.reactor = nil
|
35
35
|
end
|
36
36
|
|
@@ -38,10 +38,10 @@ module Async
|
|
38
38
|
end
|
39
39
|
|
40
40
|
# Create a new `SharedEndpoint` by connecting to the given endpoint.
|
41
|
-
def self.connected(endpoint)
|
41
|
+
def self.connected(endpoint, close_on_exec: false)
|
42
42
|
wrapper = endpoint.connect
|
43
43
|
|
44
|
-
wrapper.close_on_exec =
|
44
|
+
wrapper.close_on_exec = close_on_exec
|
45
45
|
wrapper.reactor = nil
|
46
46
|
|
47
47
|
return self.new(endpoint, [wrapper])
|
data/lib/async/io/socket.rb
CHANGED
@@ -116,7 +116,7 @@ module Async
|
|
116
116
|
# @param remote_address [Address] The remote address to connect to.
|
117
117
|
# @option local_address [Address] The local address to bind to before connecting.
|
118
118
|
def self.connect(remote_address, local_address: nil, task: Task.current, **options)
|
119
|
-
|
119
|
+
Console.logger.debug(self) {"Connecting to #{remote_address.inspect}"}
|
120
120
|
|
121
121
|
task.annotate "connecting to #{remote_address.inspect}"
|
122
122
|
|
@@ -154,7 +154,7 @@ module Async
|
|
154
154
|
# @param local_address [Address] The local address to bind to.
|
155
155
|
# @option protocol [Integer] The socket protocol to use.
|
156
156
|
def self.bind(local_address, protocol: 0, task: Task.current, **options, &block)
|
157
|
-
|
157
|
+
Console.logger.debug(self) {"Binding to #{local_address.inspect}"}
|
158
158
|
|
159
159
|
wrapper = build(local_address.afamily, local_address.socktype, protocol, **options) do |socket|
|
160
160
|
socket.bind(local_address.to_sockaddr)
|
data/lib/async/io/ssl_socket.rb
CHANGED
@@ -30,7 +30,7 @@ module Async
|
|
30
30
|
|
31
31
|
# Asynchronous TCP socket wrapper.
|
32
32
|
class SSLSocket < Generic
|
33
|
-
wraps OpenSSL::SSL::SSLSocket, :alpn_protocol, :cert, :cipher, :client_ca, :context, :getsockopt, :hostname, :hostname=, :npn_protocol, :peer_cert, :peer_cert_chain, :pending, :post_connection_check, :setsockopt, :session, :session=, :session_reused?, :ssl_version, :state, :sync_close, :sync_close=, :sysclose, :verify_result, :tmp_key
|
33
|
+
wraps OpenSSL::SSL::SSLSocket, :alpn_protocol, :cert, :cipher, :client_ca, :context, :finished_message, :peer_finished_message, :getsockopt, :hostname, :hostname=, :npn_protocol, :peer_cert, :peer_cert_chain, :pending, :post_connection_check, :setsockopt, :session, :session=, :session_reused?, :ssl_version, :state, :sync_close, :sync_close=, :sysclose, :verify_result, :tmp_key
|
34
34
|
|
35
35
|
wrap_blocking_method :accept, :accept_nonblock
|
36
36
|
wrap_blocking_method :connect, :connect_nonblock
|
@@ -68,6 +68,7 @@ module Async
|
|
68
68
|
super
|
69
69
|
else
|
70
70
|
io = self.class.wrapped_klass.new(socket.to_io, context)
|
71
|
+
super(io, socket.reactor)
|
71
72
|
|
72
73
|
# We detach the socket from the reactor, otherwise it's possible to add the file descriptor to the selector twice, which is bad.
|
73
74
|
socket.reactor = nil
|
@@ -75,10 +76,7 @@ module Async
|
|
75
76
|
# This ensures that when the internal IO is closed, it also closes the internal socket:
|
76
77
|
io.sync_close = true
|
77
78
|
|
78
|
-
# Copy the timeout:
|
79
79
|
@timeout = socket.timeout
|
80
|
-
|
81
|
-
super(io, socket.reactor)
|
82
80
|
end
|
83
81
|
end
|
84
82
|
|
data/lib/async/io/stream.rb
CHANGED
@@ -72,7 +72,7 @@ module Async
|
|
72
72
|
|
73
73
|
# Reads `size` bytes from the stream. If size is not specified, read until end of file.
|
74
74
|
def read(size = nil)
|
75
|
-
return
|
75
|
+
return String.new(encoding: Encoding::BINARY) if size == 0
|
76
76
|
|
77
77
|
if size
|
78
78
|
until @eof or @read_buffer.bytesize >= size
|
@@ -93,7 +93,7 @@ module Async
|
|
93
93
|
|
94
94
|
# Read at most `size` bytes from the stream. Will avoid reading from the underlying stream if possible.
|
95
95
|
def read_partial(size = nil)
|
96
|
-
return
|
96
|
+
return String.new(encoding: Encoding::BINARY) if size == 0
|
97
97
|
|
98
98
|
if !@eof and @read_buffer.empty?
|
99
99
|
fill_read_buffer
|
@@ -259,13 +259,13 @@ module Async
|
|
259
259
|
|
260
260
|
if @read_buffer.empty?
|
261
261
|
if @io.read_nonblock(size, @read_buffer, exception: false)
|
262
|
-
#
|
262
|
+
# Console.logger.debug(self, name: "read") {@read_buffer.inspect}
|
263
263
|
return true
|
264
264
|
end
|
265
265
|
else
|
266
266
|
if chunk = @io.read_nonblock(size, @input_buffer, exception: false)
|
267
267
|
@read_buffer << chunk
|
268
|
-
#
|
268
|
+
# Console.logger.debug(self, name: "read") {@read_buffer.inspect}
|
269
269
|
|
270
270
|
return true
|
271
271
|
end
|
data/lib/async/io/tcp_socket.rb
CHANGED
@@ -40,7 +40,7 @@ module Async
|
|
40
40
|
# We do this unusual dance to avoid leaking an "open" socket instance.
|
41
41
|
socket = Socket.connect(remote_address, local_address: local_address)
|
42
42
|
fd = socket.fcntl(Fcntl::F_DUPFD)
|
43
|
-
|
43
|
+
Console.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"}
|
44
44
|
socket.close
|
45
45
|
|
46
46
|
super(::TCPSocket.for_fd(fd))
|
data/lib/async/io/threads.rb
CHANGED
@@ -29,24 +29,18 @@ module Async
|
|
29
29
|
@parent = parent
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
parent
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
notification.wait
|
45
|
-
|
46
|
-
thread.value
|
47
|
-
ensure
|
48
|
-
if thread&.alive?
|
49
|
-
thread.raise(Stop)
|
32
|
+
if Async::Scheduler.supported?
|
33
|
+
def async(parent: (@parent or Task.current))
|
34
|
+
parent.async do
|
35
|
+
thread = ::Thread.new do
|
36
|
+
yield
|
37
|
+
end
|
38
|
+
|
39
|
+
thread.join
|
40
|
+
rescue Stop
|
41
|
+
if thread&.alive?
|
42
|
+
thread.raise(Stop)
|
43
|
+
end
|
50
44
|
|
51
45
|
begin
|
52
46
|
thread.join
|
@@ -54,8 +48,36 @@ module Async
|
|
54
48
|
# Ignore.
|
55
49
|
end
|
56
50
|
end
|
57
|
-
|
58
|
-
|
51
|
+
end
|
52
|
+
else
|
53
|
+
def async(parent: (@parent or Task.current))
|
54
|
+
parent.async do |task|
|
55
|
+
notification = Async::IO::Notification.new
|
56
|
+
|
57
|
+
thread = ::Thread.new do
|
58
|
+
yield
|
59
|
+
ensure
|
60
|
+
notification.signal
|
61
|
+
end
|
62
|
+
|
63
|
+
task.annotate "Waiting for thread to finish..."
|
64
|
+
|
65
|
+
notification.wait
|
66
|
+
|
67
|
+
thread.value
|
68
|
+
ensure
|
69
|
+
if thread&.alive?
|
70
|
+
thread.raise(Stop)
|
71
|
+
|
72
|
+
begin
|
73
|
+
thread.join
|
74
|
+
rescue Stop
|
75
|
+
# Ignore.
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
notification&.close
|
80
|
+
end
|
59
81
|
end
|
60
82
|
end
|
61
83
|
end
|
data/lib/async/io/trap.rb
CHANGED
@@ -36,6 +36,10 @@ module Async
|
|
36
36
|
@mutex = Mutex.new
|
37
37
|
end
|
38
38
|
|
39
|
+
def to_s
|
40
|
+
"\#<#{self.class} #{@name}>"
|
41
|
+
end
|
42
|
+
|
39
43
|
# Ignore the trap within the current process. Can be invoked before forking and/or invoking `install!` to assert default behaviour.
|
40
44
|
def ignore!
|
41
45
|
Signal.trap(@name, :IGNORE)
|
data/lib/async/io/version.rb
CHANGED
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.32.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -53,49 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: bake-bundler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: bake-modernize
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: bundler
|
56
|
+
name: covered
|
99
57
|
requirement: !ruby/object:Gem::Requirement
|
100
58
|
requirements:
|
101
59
|
- - ">="
|
@@ -109,7 +67,7 @@ dependencies:
|
|
109
67
|
- !ruby/object:Gem::Version
|
110
68
|
version: '0'
|
111
69
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
70
|
+
name: rack-test
|
113
71
|
requirement: !ruby/object:Gem::Requirement
|
114
72
|
requirements:
|
115
73
|
- - ">="
|
@@ -128,16 +86,16 @@ dependencies:
|
|
128
86
|
requirements:
|
129
87
|
- - "~>"
|
130
88
|
- !ruby/object:Gem::Version
|
131
|
-
version: '3.
|
89
|
+
version: '3.6'
|
132
90
|
type: :development
|
133
91
|
prerelease: false
|
134
92
|
version_requirements: !ruby/object:Gem::Requirement
|
135
93
|
requirements:
|
136
94
|
- - "~>"
|
137
95
|
- !ruby/object:Gem::Version
|
138
|
-
version: '3.
|
139
|
-
description:
|
140
|
-
email:
|
96
|
+
version: '3.6'
|
97
|
+
description:
|
98
|
+
email:
|
141
99
|
executables: []
|
142
100
|
extensions: []
|
143
101
|
extra_rdoc_files: []
|
@@ -174,13 +132,13 @@ homepage: https://github.com/socketry/async-io
|
|
174
132
|
licenses:
|
175
133
|
- MIT
|
176
134
|
metadata: {}
|
177
|
-
post_install_message:
|
135
|
+
post_install_message:
|
178
136
|
rdoc_options: []
|
179
137
|
require_paths:
|
180
138
|
- lib
|
181
139
|
required_ruby_version: !ruby/object:Gem::Requirement
|
182
140
|
requirements:
|
183
|
-
- - "
|
141
|
+
- - ">="
|
184
142
|
- !ruby/object:Gem::Version
|
185
143
|
version: '2.5'
|
186
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -190,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
148
|
version: '0'
|
191
149
|
requirements: []
|
192
150
|
rubygems_version: 3.1.2
|
193
|
-
signing_key:
|
151
|
+
signing_key:
|
194
152
|
specification_version: 4
|
195
153
|
summary: Provides support for asynchonous TCP, UDP, UNIX and SSL sockets.
|
196
154
|
test_files: []
|