async-io 1.28.0 → 1.31.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async/io/host_endpoint.rb +1 -1
  3. data/lib/async/io/peer.rb +2 -2
  4. data/lib/async/io/socket.rb +2 -2
  5. data/lib/async/io/ssl_socket.rb +2 -4
  6. data/lib/async/io/stream.rb +2 -2
  7. data/lib/async/io/tcp_socket.rb +1 -1
  8. data/{spec/async/io/socket/udp_spec.rb → lib/async/io/threads.rb} +56 -36
  9. data/lib/async/io/trap.rb +8 -3
  10. data/lib/async/io/version.rb +1 -1
  11. metadata +45 -94
  12. data/.editorconfig +0 -6
  13. data/.gitignore +0 -13
  14. data/.rspec +0 -3
  15. data/.travis.yml +0 -26
  16. data/.yardopts +0 -2
  17. data/Gemfile +0 -13
  18. data/README.md +0 -171
  19. data/async-io.gemspec +0 -30
  20. data/examples/allocations/byteslice.rb +0 -29
  21. data/examples/allocations/memory.rb +0 -16
  22. data/examples/allocations/read_chunks.rb +0 -18
  23. data/examples/chat/client.rb +0 -58
  24. data/examples/chat/server.rb +0 -83
  25. data/examples/defer/worker.rb +0 -29
  26. data/examples/echo/client.rb +0 -23
  27. data/examples/echo/server.rb +0 -58
  28. data/examples/issues/broken_ssl.rb +0 -15
  29. data/examples/issues/pipes.rb +0 -34
  30. data/examples/millions/client.rb +0 -44
  31. data/examples/millions/server.rb +0 -41
  32. data/examples/udp/client.rb +0 -14
  33. data/examples/udp/server.rb +0 -16
  34. data/gems/nio4r-2.3.gemfile +0 -3
  35. data/spec/addrinfo.rb +0 -16
  36. data/spec/async/io/buffer_spec.rb +0 -48
  37. data/spec/async/io/c10k_spec.rb +0 -138
  38. data/spec/async/io/echo_spec.rb +0 -75
  39. data/spec/async/io/endpoint_spec.rb +0 -105
  40. data/spec/async/io/generic_examples.rb +0 -73
  41. data/spec/async/io/generic_spec.rb +0 -107
  42. data/spec/async/io/notification_spec.rb +0 -46
  43. data/spec/async/io/protocol/line_spec.rb +0 -81
  44. data/spec/async/io/shared_endpoint/server_spec.rb +0 -72
  45. data/spec/async/io/shared_endpoint_spec.rb +0 -65
  46. data/spec/async/io/socket/tcp_spec.rb +0 -101
  47. data/spec/async/io/socket_spec.rb +0 -149
  48. data/spec/async/io/ssl_server_spec.rb +0 -133
  49. data/spec/async/io/ssl_socket_spec.rb +0 -96
  50. data/spec/async/io/standard_spec.rb +0 -47
  51. data/spec/async/io/stream_context.rb +0 -30
  52. data/spec/async/io/stream_spec.rb +0 -337
  53. data/spec/async/io/tcp_socket_spec.rb +0 -84
  54. data/spec/async/io/trap_spec.rb +0 -52
  55. data/spec/async/io/udp_socket_spec.rb +0 -56
  56. data/spec/async/io/unix_endpoint_spec.rb +0 -106
  57. data/spec/async/io/unix_socket_spec.rb +0 -66
  58. data/spec/async/io/wrap/http_rb_spec.rb +0 -47
  59. data/spec/async/io/wrap/tcp_spec.rb +0 -79
  60. data/spec/spec_helper.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3efc5254f6ca150d428d1a13eeaf36775c9a7f0fe3f3859069eb30db4d6b907
4
- data.tar.gz: 287aa5c3bd8e31304a3d60a7f278bd48307224aa457b67ec766d9c160731a37c
3
+ metadata.gz: a4bd452ecb8105b456fde28d2af79a2d4b360bac0cad9e7e35cc4f71c6c852d1
4
+ data.tar.gz: b629d8aed875e23295b8ab01da8b22c5f02a5fc79775a8afddae032531557d73
5
5
  SHA512:
6
- metadata.gz: e8be3b2eb8024ebcea499eafe4845415684ab56a7a952141ef4cccb0e91fb7cde2f439734cb4a126051e9de3f349eb15ee59e65f55292d8705cd900c6ebfca4e
7
- data.tar.gz: 9b46e1c7eb93a45e72cd5b0698b57213f31b4f8fc23c546f0bf887fd1e0cc17c9978fa03adb52f58cffb8a4b53df87bb16a514d02b676d7913102e57bac11df8
6
+ metadata.gz: b905369d33bf79d557dcaee2a68ad24979295d64a746e7d05ae182a2cd00abba3db1c8d93e86e4eda525468ef3875adeb747cee9d95439e20a0246c49d9255f3
7
+ data.tar.gz: 5dba169bd0668e39aba12df17e53ee2f70a211be0b41e5fc6a9b5a1f0e59336b29ac534b67f40014410c70355753bc92be1951929bd6a36df9a166764e5a9c88
@@ -77,7 +77,7 @@ module Async
77
77
  # @yield [Socket] the bound socket
78
78
  # @return [Array<Socket>] an array of bound sockets
79
79
  def bind(&block)
80
- Addrinfo.foreach(*@specification).collect do |address|
80
+ Addrinfo.foreach(*@specification).map do |address|
81
81
  Socket.bind(address, **@options, &block)
82
82
  end
83
83
  end
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
- Async.logger.warn(self) {"Unsure how to sync=#{value} for #{self.protocol}!"}
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
- # Async.logger.warn(self) {"Unable to set sync=#{value}!"}
68
+ # Console.logger.warn(self) {"Unable to set sync=#{value}!"}
69
69
  end
70
70
 
71
71
  def sync
@@ -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
- Async.logger.debug(self) {"Connecting to #{remote_address.inspect}"}
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
- Async.logger.debug(self) {"Binding to #{local_address.inspect}"}
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)
@@ -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
 
@@ -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
- # Async.logger.debug(self, name: "read") {@read_buffer.inspect}
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
- # Async.logger.debug(self, name: "read") {@read_buffer.inspect}
268
+ # Console.logger.debug(self, name: "read") {@read_buffer.inspect}
269
269
 
270
270
  return true
271
271
  end
@@ -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
- Async.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"}
43
+ Console.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"}
44
44
  socket.close
45
45
 
46
46
  super(::TCPSocket.for_fd(fd))
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
3
+ # Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the "Software"), to deal
@@ -20,44 +20,64 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
21
  # THE SOFTWARE.
22
22
 
23
- require 'async/io/udp_socket'
23
+ require_relative 'notification'
24
24
 
25
- RSpec.describe Async::IO::Socket do
26
- include_context Async::RSpec::Reactor
27
-
28
- # Shared port for localhost network tests.
29
- let(:server_address) {Async::IO::Address.udp("127.0.0.1", 6778)}
30
- let(:data) {"The quick brown fox jumped over the lazy dog."}
31
-
32
- let!(:server_task) do
33
- reactor.async do
34
- Async::IO::Socket.bind(server_address) do |server|
35
- packet, address = server.recvfrom(512)
36
-
37
- server.send(packet, 0, address)
25
+ module Async
26
+ module IO
27
+ class Threads
28
+ def initialize(parent: nil)
29
+ @parent = parent
38
30
  end
39
- end
40
- end
41
-
42
- describe 'basic udp server' do
43
- it "should echo data back to peer" do
44
- reactor.async do
45
- Async::IO::Socket.connect(server_address) do |client|
46
- client.send(data)
47
- response = client.recv(512)
48
-
49
- expect(response).to be == data
31
+
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
44
+
45
+ begin
46
+ thread.join
47
+ rescue Stop
48
+ # Ignore.
49
+ end
50
+ end
50
51
  end
51
- end
52
- end
53
-
54
- it "should use unconnected socket" do
55
- reactor.async do
56
- Async::IO::UDPSocket.wrap(server_address.afamily) do |client|
57
- client.send(data, 0, server_address)
58
- response, address = client.recvfrom(512)
59
-
60
- expect(response).to be == data
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
61
81
  end
62
82
  end
63
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)
@@ -87,9 +91,10 @@ module Async
87
91
  # Deprecated.
88
92
  alias trap wait
89
93
 
90
- def async(parent: Task.current, &block)
91
- parent.async do |task|
92
- self.trap(task: task, &block)
94
+ # In order to avoid blocking the reactor, specify `transient: true` as an option.
95
+ def async(parent: Task.current, **options, &block)
96
+ parent.async(**options) do |task|
97
+ self.wait(task: task, &block)
93
98
  end
94
99
  end
95
100
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Async
24
24
  module IO
25
- VERSION = "1.28.0"
25
+ VERSION = "1.31.0"
26
26
  end
27
27
  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.28.0
4
+ version: 1.31.0
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: 2020-03-31 00:00:00.000000000 Z
11
+ date: 2021-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: async-container
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.15'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: async-rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +53,35 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.10'
41
55
  - !ruby/object:Gem::Dependency
42
- name: async-container
56
+ name: bake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '0.15'
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '0.15'
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: covered
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
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
@@ -81,7 +109,7 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: bake-bundler
112
+ name: covered
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
@@ -108,36 +136,12 @@ dependencies:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
138
  version: '3.0'
111
- description:
139
+ description:
112
140
  email:
113
- - samuel.williams@oriontransfer.co.nz
114
141
  executables: []
115
142
  extensions: []
116
143
  extra_rdoc_files: []
117
144
  files:
118
- - ".editorconfig"
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".travis.yml"
122
- - ".yardopts"
123
- - Gemfile
124
- - README.md
125
- - async-io.gemspec
126
- - examples/allocations/byteslice.rb
127
- - examples/allocations/memory.rb
128
- - examples/allocations/read_chunks.rb
129
- - examples/chat/client.rb
130
- - examples/chat/server.rb
131
- - examples/defer/worker.rb
132
- - examples/echo/client.rb
133
- - examples/echo/server.rb
134
- - examples/issues/broken_ssl.rb
135
- - examples/issues/pipes.rb
136
- - examples/millions/client.rb
137
- - examples/millions/server.rb
138
- - examples/udp/client.rb
139
- - examples/udp/server.rb
140
- - gems/nio4r-2.3.gemfile
141
145
  - lib/async/io.rb
142
146
  - lib/async/io/address.rb
143
147
  - lib/async/io/address_endpoint.rb
@@ -160,49 +164,23 @@ files:
160
164
  - lib/async/io/standard.rb
161
165
  - lib/async/io/stream.rb
162
166
  - lib/async/io/tcp_socket.rb
167
+ - lib/async/io/threads.rb
163
168
  - lib/async/io/trap.rb
164
169
  - lib/async/io/udp_socket.rb
165
170
  - lib/async/io/unix_endpoint.rb
166
171
  - lib/async/io/unix_socket.rb
167
172
  - lib/async/io/version.rb
168
- - spec/addrinfo.rb
169
- - spec/async/io/buffer_spec.rb
170
- - spec/async/io/c10k_spec.rb
171
- - spec/async/io/echo_spec.rb
172
- - spec/async/io/endpoint_spec.rb
173
- - spec/async/io/generic_examples.rb
174
- - spec/async/io/generic_spec.rb
175
- - spec/async/io/notification_spec.rb
176
- - spec/async/io/protocol/line_spec.rb
177
- - spec/async/io/shared_endpoint/server_spec.rb
178
- - spec/async/io/shared_endpoint_spec.rb
179
- - spec/async/io/socket/tcp_spec.rb
180
- - spec/async/io/socket/udp_spec.rb
181
- - spec/async/io/socket_spec.rb
182
- - spec/async/io/ssl_server_spec.rb
183
- - spec/async/io/ssl_socket_spec.rb
184
- - spec/async/io/standard_spec.rb
185
- - spec/async/io/stream_context.rb
186
- - spec/async/io/stream_spec.rb
187
- - spec/async/io/tcp_socket_spec.rb
188
- - spec/async/io/trap_spec.rb
189
- - spec/async/io/udp_socket_spec.rb
190
- - spec/async/io/unix_endpoint_spec.rb
191
- - spec/async/io/unix_socket_spec.rb
192
- - spec/async/io/wrap/http_rb_spec.rb
193
- - spec/async/io/wrap/tcp_spec.rb
194
- - spec/spec_helper.rb
195
173
  homepage: https://github.com/socketry/async-io
196
174
  licenses:
197
175
  - MIT
198
176
  metadata: {}
199
- post_install_message:
177
+ post_install_message:
200
178
  rdoc_options: []
201
179
  require_paths:
202
180
  - lib
203
181
  required_ruby_version: !ruby/object:Gem::Requirement
204
182
  requirements:
205
- - - "~>"
183
+ - - ">="
206
184
  - !ruby/object:Gem::Version
207
185
  version: '2.5'
208
186
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -211,35 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
189
  - !ruby/object:Gem::Version
212
190
  version: '0'
213
191
  requirements: []
214
- rubygems_version: 3.1.2
215
- signing_key:
192
+ rubygems_version: 3.2.3
193
+ signing_key:
216
194
  specification_version: 4
217
195
  summary: Provides support for asynchonous TCP, UDP, UNIX and SSL sockets.
218
- test_files:
219
- - spec/addrinfo.rb
220
- - spec/async/io/buffer_spec.rb
221
- - spec/async/io/c10k_spec.rb
222
- - spec/async/io/echo_spec.rb
223
- - spec/async/io/endpoint_spec.rb
224
- - spec/async/io/generic_examples.rb
225
- - spec/async/io/generic_spec.rb
226
- - spec/async/io/notification_spec.rb
227
- - spec/async/io/protocol/line_spec.rb
228
- - spec/async/io/shared_endpoint/server_spec.rb
229
- - spec/async/io/shared_endpoint_spec.rb
230
- - spec/async/io/socket/tcp_spec.rb
231
- - spec/async/io/socket/udp_spec.rb
232
- - spec/async/io/socket_spec.rb
233
- - spec/async/io/ssl_server_spec.rb
234
- - spec/async/io/ssl_socket_spec.rb
235
- - spec/async/io/standard_spec.rb
236
- - spec/async/io/stream_context.rb
237
- - spec/async/io/stream_spec.rb
238
- - spec/async/io/tcp_socket_spec.rb
239
- - spec/async/io/trap_spec.rb
240
- - spec/async/io/udp_socket_spec.rb
241
- - spec/async/io/unix_endpoint_spec.rb
242
- - spec/async/io/unix_socket_spec.rb
243
- - spec/async/io/wrap/http_rb_spec.rb
244
- - spec/async/io/wrap/tcp_spec.rb
245
- - spec/spec_helper.rb
196
+ test_files: []