cztop 1.1.0.pre1 → 1.1.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 +4 -4
- data/.github/workflows/draft_api.yml +2 -2
- data/.github/workflows/stable_api.yml +3 -2
- data/README.md +3 -2
- data/cztop.gemspec +3 -1
- data/examples/async/.gitignore +1 -0
- data/examples/async/Gemfile +5 -0
- data/examples/async/README.md +1 -0
- data/examples/async/async.rb +40 -0
- data/lib/cztop/async.rb +120 -0
- data/lib/cztop/socket/types.rb +18 -14
- data/lib/cztop/version.rb +1 -1
- data/lib/cztop/zsock_options.rb +8 -4
- metadata +39 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a73261e3bc3a15f8302b4e7eca58eb25393cfe301d9b755a7291bf35ef126674
|
4
|
+
data.tar.gz: 5d1f75990a28eba2460cfd61e5825492bcd66604bd7990dbcdf4a74db00c0e7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ebe5b00e21a32e0b645f50a789a8818dddf31d4ed69a74c247b30b443e02cd4cdd05121f3cd2bc286c41e21e09bc6feb0b304fc245d9be6dbaf648e287c0bb8
|
7
|
+
data.tar.gz: cd3c05936f8ce4c0c8c6b8f3774d70bfaf1a7b85d9770e159fb0aed4ae0628f97e74bbaa76742b7518a06d257dd6c22504dc2285a827fcc36b5bb5f59bf51ac8
|
@@ -4,14 +4,14 @@ on: [push,pull_request]
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
build:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-22.04
|
8
8
|
timeout-minutes: 15
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
11
|
- name: Set up Ruby
|
12
12
|
uses: ruby/setup-ruby@v1
|
13
13
|
with:
|
14
|
-
ruby-version: 3.
|
14
|
+
ruby-version: 3.3
|
15
15
|
- name: Install ZMQ and CZMQ
|
16
16
|
run: |
|
17
17
|
export PKG_CONFIG_PATH=$HOME/lib/pkgconfig # custom libs (for linking)
|
@@ -4,13 +4,14 @@ on: [push,pull_request]
|
|
4
4
|
|
5
5
|
jobs:
|
6
6
|
build:
|
7
|
-
runs-on: ubuntu-
|
7
|
+
runs-on: ubuntu-22.04
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
10
|
ruby:
|
11
|
-
- 2.7
|
12
11
|
- 3.0
|
13
12
|
- 3.1
|
13
|
+
- 3.2
|
14
|
+
- 3.3
|
14
15
|
steps:
|
15
16
|
- uses: actions/checkout@v2
|
16
17
|
- name: Set up Ruby ${{ matrix.ruby }}
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ Here's an overview of the core classes:
|
|
18
18
|
|
19
19
|
* [CZTop](http://www.rubydoc.info/gems/cztop/CZTop)
|
20
20
|
* [Actor](http://www.rubydoc.info/gems/cztop/CZTop)
|
21
|
-
* [
|
21
|
+
* [Authenticator](http://www.rubydoc.info/gems/cztop/CZTop/Authenticator)
|
22
22
|
* [Beacon](http://www.rubydoc.info/gems/cztop/CZTop/Beacon)
|
23
23
|
* [Certificate](http://www.rubydoc.info/gems/cztop/CZTop/Certificate)
|
24
24
|
* [CertStore](http://www.rubydoc.info/gems/cztop/CZTop/CertStore)
|
@@ -59,6 +59,7 @@ More information in the [API documentation](http://www.rubydoc.info/github/paddo
|
|
59
59
|
|
60
60
|
### Features
|
61
61
|
|
62
|
+
* compatible with [Async](https://github.com/socketry/async) / [Async::IO](https://github.com/socketry/async-io)
|
62
63
|
* Ruby-like API
|
63
64
|
* method names
|
64
65
|
* sending a message via a socket is done with `Socket#<<`
|
@@ -94,7 +95,7 @@ On macOS using Homebrew, run:
|
|
94
95
|
|
95
96
|
### Supported Rubies
|
96
97
|
|
97
|
-
* MRI (
|
98
|
+
* MRI (3.0, 3.2, 3.3)
|
98
99
|
* Rubinius (HEAD)
|
99
100
|
* JRuby 9000 (HEAD)
|
100
101
|
|
data/cztop.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.summary = %q{CZMQ Ruby binding based on the generated low-level FFI bindings of CZMQ}
|
12
12
|
spec.homepage = "https://rubygems.org/gems/cztop"
|
13
13
|
spec.license = "ISC"
|
14
|
-
spec.required_ruby_version = Gem::Requirement.new(">=
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
17
|
spec.metadata["source_code_uri"] = "https://github.com/paddor/cztop"
|
@@ -32,4 +32,6 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency "pry"
|
33
33
|
spec.add_development_dependency "yard"
|
34
34
|
spec.add_development_dependency "rubocop", "~> 1.36.0"
|
35
|
+
spec.add_development_dependency "async", ">= 2.0.1"
|
36
|
+
spec.add_development_dependency "async-io"
|
35
37
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
/Gemfile.lock
|
@@ -0,0 +1 @@
|
|
1
|
+
Run: `bundle exec ./async.rb`
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'cztop/async'
|
4
|
+
|
5
|
+
Async do |task|
|
6
|
+
task.async do |t|
|
7
|
+
socket = CZTop::Socket::REP.new("ipc:///tmp/req_rep_example")
|
8
|
+
|
9
|
+
# Simply echo every message, with every frame String#upcase'd.
|
10
|
+
socket.options.rcvtimeo = 3
|
11
|
+
io = Async::IO.try_convert socket
|
12
|
+
|
13
|
+
msg = io.receive
|
14
|
+
puts "<<< #{msg.to_a.inspect}"
|
15
|
+
io << msg.to_a.map(&:upcase)
|
16
|
+
|
17
|
+
puts "REP done."
|
18
|
+
end
|
19
|
+
|
20
|
+
task.async do
|
21
|
+
socket = CZTop::Socket::REQ.new("ipc:///tmp/req_rep_example")
|
22
|
+
puts ">>> Socket connected."
|
23
|
+
|
24
|
+
io = Async::IO.try_convert socket
|
25
|
+
# sleep 5
|
26
|
+
io << "foobar"
|
27
|
+
|
28
|
+
socket.options.rcvtimeo = 3
|
29
|
+
msg = io.receive
|
30
|
+
puts ">>> #{msg.to_a.inspect}"
|
31
|
+
puts "REQ done."
|
32
|
+
end
|
33
|
+
|
34
|
+
task.async do
|
35
|
+
6.times do
|
36
|
+
sleep 0.5
|
37
|
+
puts "tick"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/cztop/async.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cztop'
|
4
|
+
require 'async/io'
|
5
|
+
|
6
|
+
module Async
|
7
|
+
module IO
|
8
|
+
|
9
|
+
# Wrapper for CZTop sockets.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# Async do |task|
|
13
|
+
# socket = CZTop::Socket::REP.new("ipc:///tmp/req_rep_example")
|
14
|
+
# socket.options.rcvtimeo = 3
|
15
|
+
# io = Async::IO.try_convert socket
|
16
|
+
# msg = io.receive
|
17
|
+
# io << msg.to_a.map(&:upcase)
|
18
|
+
# end
|
19
|
+
|
20
|
+
class CZTopSocket < Generic
|
21
|
+
wraps ::CZTop::Socket::REQ
|
22
|
+
wraps ::CZTop::Socket::REP
|
23
|
+
wraps ::CZTop::Socket::PAIR
|
24
|
+
wraps ::CZTop::Socket::ROUTER
|
25
|
+
wraps ::CZTop::Socket::DEALER
|
26
|
+
wraps ::CZTop::Socket::PUSH
|
27
|
+
wraps ::CZTop::Socket::PULL
|
28
|
+
wraps ::CZTop::Socket::PUB
|
29
|
+
wraps ::CZTop::Socket::SUB
|
30
|
+
wraps ::CZTop::Socket::XPUB
|
31
|
+
wraps ::CZTop::Socket::XSUB
|
32
|
+
|
33
|
+
|
34
|
+
# @see {CZTop::SendReceiveMethods#receive}
|
35
|
+
def receive
|
36
|
+
wait_readable
|
37
|
+
@io.receive
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# @see {CZTop::SendReceiveMethods#<<}
|
42
|
+
def <<(...)
|
43
|
+
wait_writable
|
44
|
+
@io.<<(...)
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# Waits for socket to become readable.
|
49
|
+
def wait_readable(timeout = read_timeout)
|
50
|
+
@io_fd ||= ::IO.for_fd @io.fd, autoclose: false
|
51
|
+
|
52
|
+
if timeout
|
53
|
+
timeout_at = now + timeout
|
54
|
+
|
55
|
+
while true
|
56
|
+
@io_fd.wait_readable(timeout)
|
57
|
+
break if @io.readable?
|
58
|
+
raise ::IO::TimeoutError if now >= timeout_at
|
59
|
+
end
|
60
|
+
else
|
61
|
+
@io_fd.wait_readable until @io.readable?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
# Waits for socket to become writable.
|
67
|
+
def wait_writable(timeout = write_timeout)
|
68
|
+
@io_fd ||= ::IO.for_fd @io.fd, autoclose: false
|
69
|
+
|
70
|
+
if timeout
|
71
|
+
timeout_at = now + timeout
|
72
|
+
|
73
|
+
while true
|
74
|
+
@io_fd.wait_writable(timeout)
|
75
|
+
break if @io.writable?
|
76
|
+
raise ::IO::TimeoutError if now >= timeout_at
|
77
|
+
end
|
78
|
+
else
|
79
|
+
@io_fd.wait_writable until @io.writable?
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# @return [Float, nil] the timeout in seconds used by {IO#wait_readable}
|
85
|
+
def read_timeout
|
86
|
+
timeout = @io.options.rcvtimeo
|
87
|
+
|
88
|
+
if timeout <= 0
|
89
|
+
timeout = nil
|
90
|
+
else
|
91
|
+
timeout = timeout.to_f / 1000
|
92
|
+
end
|
93
|
+
|
94
|
+
timeout
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
# @return [Float, nil] the timeout in seconds used by {IO#wait_writable}
|
99
|
+
def write_timeout
|
100
|
+
timeout = @io.options.sndtimeo
|
101
|
+
|
102
|
+
if timeout <= 0
|
103
|
+
timeout = nil
|
104
|
+
else
|
105
|
+
timeout = timeout.to_f / 1000
|
106
|
+
end
|
107
|
+
|
108
|
+
timeout
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
|
115
|
+
def now
|
116
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/cztop/socket/types.rb
CHANGED
@@ -7,20 +7,24 @@ module CZTop
|
|
7
7
|
# for the zsock_new() function.
|
8
8
|
module Types
|
9
9
|
|
10
|
-
PAIR
|
11
|
-
PUB
|
12
|
-
SUB
|
13
|
-
REQ
|
14
|
-
REP
|
15
|
-
DEALER
|
16
|
-
ROUTER
|
17
|
-
PULL
|
18
|
-
PUSH
|
19
|
-
XPUB
|
20
|
-
XSUB
|
21
|
-
STREAM
|
22
|
-
SERVER
|
23
|
-
CLIENT
|
10
|
+
PAIR = 0
|
11
|
+
PUB = 1
|
12
|
+
SUB = 2
|
13
|
+
REQ = 3
|
14
|
+
REP = 4
|
15
|
+
DEALER = 5
|
16
|
+
ROUTER = 6
|
17
|
+
PULL = 7
|
18
|
+
PUSH = 8
|
19
|
+
XPUB = 9
|
20
|
+
XSUB = 10
|
21
|
+
STREAM = 11
|
22
|
+
SERVER = 12
|
23
|
+
CLIENT = 13
|
24
|
+
RADIO = 14
|
25
|
+
DISH = 15
|
26
|
+
GATHER = 16
|
27
|
+
SCATTER = 17
|
24
28
|
|
25
29
|
end
|
26
30
|
|
data/lib/cztop/version.rb
CHANGED
data/lib/cztop/zsock_options.rb
CHANGED
@@ -264,29 +264,33 @@ module CZTop
|
|
264
264
|
|
265
265
|
# @!group Send and Receive Timeouts
|
266
266
|
|
267
|
-
# @return [Integer] the timeout when receiving a message
|
267
|
+
# @return [Integer] the timeout in milliseconds when receiving a message
|
268
268
|
# @see Message.receive_from
|
269
|
+
# @note -1 means infinite, 0 means nonblocking
|
269
270
|
def rcvtimeo
|
270
271
|
Zsock.rcvtimeo(@zocket)
|
271
272
|
end
|
272
273
|
|
273
274
|
|
274
|
-
# @param timeout [Integer] new timeout
|
275
|
+
# @param timeout [Integer] new timeout in milliseconds
|
275
276
|
# @see Message.receive_from
|
277
|
+
# @note -1 means infinite, 0 means nonblocking
|
276
278
|
def rcvtimeo=(timeout)
|
277
279
|
Zsock.set_rcvtimeo(@zocket, timeout)
|
278
280
|
end
|
279
281
|
|
280
282
|
|
281
|
-
# @return [Integer] the timeout when sending a message
|
283
|
+
# @return [Integer] the timeout in milliseconds when sending a message
|
282
284
|
# @see Message#send_to
|
285
|
+
# @note -1 means infinite, 0 means nonblocking
|
283
286
|
def sndtimeo
|
284
287
|
Zsock.sndtimeo(@zocket)
|
285
288
|
end
|
286
289
|
|
287
290
|
|
288
|
-
# @param timeout [Integer] new timeout
|
291
|
+
# @param timeout [Integer] new timeout in milliseconds
|
289
292
|
# @see Message#send_to
|
293
|
+
# @note -1 means infinite, 0 means nonblocking
|
290
294
|
def sndtimeo=(timeout)
|
291
295
|
Zsock.set_sndtimeo(@zocket, timeout)
|
292
296
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cztop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrik Wenger
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: czmq-ffi-gen
|
@@ -136,6 +136,34 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 1.36.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: async
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 2.0.1
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.0.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: async-io
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
139
167
|
description:
|
140
168
|
email:
|
141
169
|
- paddor@gmail.com
|
@@ -163,6 +191,10 @@ files:
|
|
163
191
|
- ci/install-libczmq
|
164
192
|
- ci/install-libzmq
|
165
193
|
- cztop.gemspec
|
194
|
+
- examples/async/.gitignore
|
195
|
+
- examples/async/Gemfile
|
196
|
+
- examples/async/README.md
|
197
|
+
- examples/async/async.rb
|
166
198
|
- examples/ruby_actor/actor.rb
|
167
199
|
- examples/simple_req_rep/rep.rb
|
168
200
|
- examples/simple_req_rep/req.rb
|
@@ -181,6 +213,7 @@ files:
|
|
181
213
|
- exe/z85encode
|
182
214
|
- lib/cztop.rb
|
183
215
|
- lib/cztop/actor.rb
|
216
|
+
- lib/cztop/async.rb
|
184
217
|
- lib/cztop/authenticator.rb
|
185
218
|
- lib/cztop/beacon.rb
|
186
219
|
- lib/cztop/cert_store.rb
|
@@ -230,14 +263,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
230
263
|
requirements:
|
231
264
|
- - ">="
|
232
265
|
- !ruby/object:Gem::Version
|
233
|
-
version:
|
266
|
+
version: 3.0.0
|
234
267
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
235
268
|
requirements:
|
236
|
-
- - "
|
269
|
+
- - ">="
|
237
270
|
- !ruby/object:Gem::Version
|
238
|
-
version:
|
271
|
+
version: '0'
|
239
272
|
requirements: []
|
240
|
-
rubygems_version: 3.
|
273
|
+
rubygems_version: 3.5.3
|
241
274
|
signing_key:
|
242
275
|
specification_version: 4
|
243
276
|
summary: CZMQ Ruby binding based on the generated low-level FFI bindings of CZMQ
|