cztop 1.0.0 → 1.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/coverage.yml +20 -0
- data/.github/workflows/draft_api.yml +27 -0
- data/.github/workflows/{main.yml → stable_api.yml} +6 -6
- data/.rubocop.yml +175 -0
- data/CHANGES.md +8 -1
- data/Gemfile +5 -0
- data/README.md +3 -1
- data/ci/install-libczmq +22 -0
- data/ci/install-libzmq +22 -0
- data/cztop.gemspec +3 -2
- data/lib/cztop/actor.rb +55 -26
- data/lib/cztop/authenticator.rb +18 -9
- data/lib/cztop/beacon.rb +22 -10
- data/lib/cztop/cert_store.rb +8 -2
- data/lib/cztop/certificate.rb +47 -18
- data/lib/cztop/config/comments.rb +14 -3
- data/lib/cztop/config/serialization.rb +25 -5
- data/lib/cztop/config/traversing.rb +44 -13
- data/lib/cztop/config.rb +23 -9
- data/lib/cztop/frame.rb +23 -10
- data/lib/cztop/has_ffi_delegate.rb +11 -1
- data/lib/cztop/message/frames.rb +16 -2
- data/lib/cztop/message.rb +36 -22
- data/lib/cztop/metadata.rb +35 -24
- data/lib/cztop/monitor.rb +14 -5
- data/lib/cztop/poller/aggregated.rb +31 -15
- data/lib/cztop/poller/zmq.rb +25 -22
- data/lib/cztop/poller/zpoller.rb +18 -6
- data/lib/cztop/poller.rb +43 -18
- data/lib/cztop/polymorphic_zsock_methods.rb +6 -1
- data/lib/cztop/proxy.rb +34 -19
- data/lib/cztop/send_receive_methods.rb +5 -1
- data/lib/cztop/socket/types.rb +128 -22
- data/lib/cztop/socket.rb +23 -18
- data/lib/cztop/version.rb +5 -1
- data/lib/cztop/z85/padded.rb +12 -3
- data/lib/cztop/z85/pipe.rb +40 -17
- data/lib/cztop/z85.rb +17 -6
- data/lib/cztop/zap.rb +57 -32
- data/lib/cztop/zsock_options.rb +155 -122
- data/lib/cztop.rb +2 -1
- metadata +28 -10
- data/.ruby-version +0 -1
data/lib/cztop/poller/zpoller.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module CZTop
|
2
4
|
# This is the trivial poller based on zpoller. It only supports polling
|
3
5
|
# for readability, but it also supports doing that on CLIENT/SERVER sockets,
|
@@ -5,6 +7,7 @@ module CZTop
|
|
5
7
|
#
|
6
8
|
# @see http://api.zeromq.org/czmq3-0:zpoller
|
7
9
|
class Poller::ZPoller
|
10
|
+
|
8
11
|
include HasFFIDelegate
|
9
12
|
extend CZTop::HasFFIDelegate::ClassMethods
|
10
13
|
include ::CZMQ::FFI
|
@@ -14,24 +17,26 @@ module CZTop
|
|
14
17
|
# @param readers [Socket, Actor] any additional sockets to poll for input
|
15
18
|
def initialize(reader, *readers)
|
16
19
|
@sockets = {} # to keep references and return same instances
|
17
|
-
ptr
|
18
|
-
|
19
|
-
|
20
|
+
ptr = Zpoller.new(reader,
|
21
|
+
*readers.flat_map { |r| [:pointer, r] },
|
22
|
+
:pointer, nil)
|
20
23
|
attach_ffi_delegate(ptr)
|
21
24
|
remember_socket(reader)
|
22
25
|
readers.each { |r| remember_socket(r) }
|
23
26
|
end
|
24
27
|
|
28
|
+
|
25
29
|
# Adds another reader socket to the poller.
|
26
30
|
# @param reader [Socket, Actor] socket to poll for input
|
27
31
|
# @return [void]
|
28
32
|
# @raise [SystemCallError] if this fails
|
29
33
|
def add(reader)
|
30
34
|
rc = ffi_delegate.add(reader)
|
31
|
-
raise_zmq_err(
|
35
|
+
raise_zmq_err(format('unable to add socket %p', reader)) if rc == -1
|
32
36
|
remember_socket(reader)
|
33
37
|
end
|
34
38
|
|
39
|
+
|
35
40
|
# Removes a reader socket from the poller.
|
36
41
|
# @param reader [Socket, Actor] socket to remove
|
37
42
|
# @return [void]
|
@@ -40,10 +45,11 @@ module CZTop
|
|
40
45
|
# @raise [SystemCallError] if this fails for another reason
|
41
46
|
def remove(reader)
|
42
47
|
rc = ffi_delegate.remove(reader)
|
43
|
-
raise_zmq_err(
|
48
|
+
raise_zmq_err(format('unable to remove socket %p', reader)) if rc == -1
|
44
49
|
forget_socket(reader)
|
45
50
|
end
|
46
51
|
|
52
|
+
|
47
53
|
# Waits and returns the first socket that becomes readable.
|
48
54
|
# @param timeout [Integer] how long to wait in ms, or 0 to avoid
|
49
55
|
# blocking, or -1 to wait indefinitely
|
@@ -54,11 +60,13 @@ module CZTop
|
|
54
60
|
ptr = ffi_delegate.wait(timeout)
|
55
61
|
if ptr.null?
|
56
62
|
raise Interrupt if ffi_delegate.terminated
|
63
|
+
|
57
64
|
return nil
|
58
65
|
end
|
59
|
-
|
66
|
+
socket_by_ptr(ptr)
|
60
67
|
end
|
61
68
|
|
69
|
+
|
62
70
|
# Tells the zpoller to ignore interrupts. By default, {#wait} will return
|
63
71
|
# immediately if it detects an interrupt (when +zsys_interrupted+ is set
|
64
72
|
# to something other than zero). Calling this method will supress this
|
@@ -68,6 +76,7 @@ module CZTop
|
|
68
76
|
ffi_delegate.ignore_interrupts
|
69
77
|
end
|
70
78
|
|
79
|
+
|
71
80
|
# By default the poller stops if the process receives a SIGINT or SIGTERM
|
72
81
|
# signal. This makes it impossible to shut-down message based architectures
|
73
82
|
# like zactors. This method lets you switch off break handling. The default
|
@@ -91,6 +100,7 @@ module CZTop
|
|
91
100
|
@sockets[socket.to_ptr.to_i] = socket
|
92
101
|
end
|
93
102
|
|
103
|
+
|
94
104
|
# Forgets the socket because it has been removed from the poller.
|
95
105
|
# @param socket [Socket, Actor] the socket instance to forget
|
96
106
|
# @return [void]
|
@@ -98,6 +108,7 @@ module CZTop
|
|
98
108
|
@sockets.delete(socket.to_ptr.to_i)
|
99
109
|
end
|
100
110
|
|
111
|
+
|
101
112
|
# Gets the previously remembered socket associated to the given pointer.
|
102
113
|
# @param ptr [FFI::Pointer] the pointer to a socket
|
103
114
|
# @return [Socket, Actor] the socket associated to the given pointer
|
@@ -109,5 +120,6 @@ module CZTop
|
|
109
120
|
# it ever returns a wrong pointer.
|
110
121
|
raise_zmq_err("no socket known for pointer #{ptr.inspect}")
|
111
122
|
end
|
123
|
+
|
112
124
|
end
|
113
125
|
end
|
data/lib/cztop/poller.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module CZTop
|
2
4
|
# A non-trivial socket poller.
|
3
5
|
#
|
@@ -9,23 +11,25 @@ module CZTop
|
|
9
11
|
# * +zpoller+ can only poll for readability
|
10
12
|
#
|
11
13
|
class Poller
|
14
|
+
|
12
15
|
include ::CZMQ::FFI
|
13
16
|
|
14
17
|
# @param readers [Socket, Actor] sockets to poll for input
|
15
18
|
def initialize(*readers)
|
16
|
-
@sockets
|
17
|
-
@events
|
19
|
+
@sockets = {} # needed to return the same socket objects
|
20
|
+
@events = {} # event masks for each socket
|
18
21
|
@poller_ptr = ZMQ.poller_new
|
19
22
|
ObjectSpace.define_finalizer(@poller_ptr,
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
proc do
|
24
|
+
ptr_ptr = ::FFI::MemoryPointer.new :pointer
|
25
|
+
ptr_ptr.write_pointer(@poller_ptr)
|
26
|
+
ZMQ.poller_destroy(ptr_ptr)
|
27
|
+
end)
|
25
28
|
@event_ptr = FFI::MemoryPointer.new(ZMQ::PollerEvent)
|
26
29
|
readers.each { |r| add_reader(r) }
|
27
30
|
end
|
28
31
|
|
32
|
+
|
29
33
|
# Adds a socket to be polled for readability.
|
30
34
|
# @param socket [Socket, Actor] the socket
|
31
35
|
# @param events [Integer] bitwise-OR'd events you're interested in (see
|
@@ -34,11 +38,12 @@ module CZTop
|
|
34
38
|
# @raise [ArgumentError] if it's not a socket
|
35
39
|
def add(socket, events)
|
36
40
|
ptr = ptr_for_socket(socket)
|
37
|
-
rc
|
41
|
+
rc = ZMQ.poller_add(@poller_ptr, ptr, nil, events)
|
38
42
|
HasFFIDelegate.raise_zmq_err if rc == -1
|
39
43
|
remember_socket(socket, events)
|
40
44
|
end
|
41
45
|
|
46
|
+
|
42
47
|
# Convenience method to register a socket for readability. See {#add}.
|
43
48
|
# @param socket [Socket, Actor] the socket
|
44
49
|
# @return [void]
|
@@ -46,6 +51,7 @@ module CZTop
|
|
46
51
|
add(socket, ZMQ::POLLIN)
|
47
52
|
end
|
48
53
|
|
54
|
+
|
49
55
|
# Convenience method to register a socket for writability. See {#add}.
|
50
56
|
# @param socket [Socket, Actor] the socket
|
51
57
|
# @return [void]
|
@@ -53,6 +59,7 @@ module CZTop
|
|
53
59
|
add(socket, ZMQ::POLLOUT)
|
54
60
|
end
|
55
61
|
|
62
|
+
|
56
63
|
# Modifies the events of interest for the given socket.
|
57
64
|
# @param socket [Socket, Actor] the socket
|
58
65
|
# @param events [Integer] events you're interested in (see constants in
|
@@ -61,11 +68,12 @@ module CZTop
|
|
61
68
|
# @raise [ArgumentError] if it's not a socket
|
62
69
|
def modify(socket, events)
|
63
70
|
ptr = ptr_for_socket(socket)
|
64
|
-
rc
|
71
|
+
rc = ZMQ.poller_modify(@poller_ptr, ptr, events)
|
65
72
|
HasFFIDelegate.raise_zmq_err if rc == -1
|
66
73
|
remember_socket(socket, events)
|
67
74
|
end
|
68
75
|
|
76
|
+
|
69
77
|
# Removes a previously registered socket. Won't raise if you're
|
70
78
|
# trying to remove a socket that's not registered.
|
71
79
|
# @param socket [Socket, Actor] the socket
|
@@ -73,11 +81,12 @@ module CZTop
|
|
73
81
|
# @raise [ArgumentError] if it's not a socket
|
74
82
|
def remove(socket)
|
75
83
|
ptr = ptr_for_socket(socket)
|
76
|
-
rc
|
84
|
+
rc = ZMQ.poller_remove(@poller_ptr, ptr)
|
77
85
|
HasFFIDelegate.raise_zmq_err if rc == -1
|
78
86
|
forget_socket(socket)
|
79
87
|
end
|
80
88
|
|
89
|
+
|
81
90
|
# Removes a reader socket that was registered for readability only.
|
82
91
|
#
|
83
92
|
# @param socket [Socket, Actor] the socket
|
@@ -88,9 +97,10 @@ module CZTop
|
|
88
97
|
remove(socket)
|
89
98
|
return
|
90
99
|
end
|
91
|
-
raise ArgumentError,
|
100
|
+
raise ArgumentError, format('not registered for readability only: %p', socket)
|
92
101
|
end
|
93
102
|
|
103
|
+
|
94
104
|
# Removes a reader socket that was registered for writability only.
|
95
105
|
#
|
96
106
|
# @param socket [Socket, Actor] the socket
|
@@ -101,9 +111,10 @@ module CZTop
|
|
101
111
|
remove(socket)
|
102
112
|
return
|
103
113
|
end
|
104
|
-
raise ArgumentError,
|
114
|
+
raise ArgumentError, format('not registered for writability only: %p', socket)
|
105
115
|
end
|
106
116
|
|
117
|
+
|
107
118
|
# Waits for registered sockets to become readable or writable, depending
|
108
119
|
# on what you're interested in.
|
109
120
|
#
|
@@ -116,7 +127,7 @@ module CZTop
|
|
116
127
|
rc = ZMQ.poller_wait(@poller_ptr, @event_ptr, timeout)
|
117
128
|
if rc == -1
|
118
129
|
case CZMQ::FFI::Errors.errno
|
119
|
-
|
130
|
+
# NOTE: ETIMEDOUT for backwards compatibility, although this API is
|
120
131
|
# still DRAFT.
|
121
132
|
when Errno::EAGAIN::Errno, Errno::ETIMEDOUT::Errno
|
122
133
|
return nil
|
@@ -124,9 +135,10 @@ module CZTop
|
|
124
135
|
HasFFIDelegate.raise_zmq_err
|
125
136
|
end
|
126
137
|
end
|
127
|
-
|
138
|
+
Event.new(self, @event_ptr)
|
128
139
|
end
|
129
140
|
|
141
|
+
|
130
142
|
# Simpler version of {#wait}, which just returns the first socket of
|
131
143
|
# interest, if any. This is useful if you either have only reader sockets,
|
132
144
|
# or only have writer sockets.
|
@@ -140,27 +152,30 @@ module CZTop
|
|
140
152
|
return event.socket if event
|
141
153
|
end
|
142
154
|
|
155
|
+
|
143
156
|
# @param ptr [FFI::Pointer] pointer to the socket
|
144
157
|
# @return [Socket, Actor] socket corresponding to given pointer
|
145
158
|
# @raise [ArgumentError] if pointer is not known
|
146
159
|
def socket_for_ptr(ptr)
|
147
160
|
@sockets[ptr.to_i] or
|
148
|
-
raise ArgumentError,
|
161
|
+
raise ArgumentError, format('no socket known for pointer %p', ptr)
|
149
162
|
end
|
150
163
|
|
164
|
+
|
151
165
|
# @return [Array<CZTop::Socket>] all sockets registered with this poller
|
152
166
|
# @note The actual events registered for each sockets don't matter.
|
153
167
|
def sockets
|
154
168
|
@sockets.values
|
155
169
|
end
|
156
170
|
|
171
|
+
|
157
172
|
# Returns the event mask for the given, registered socket.
|
158
173
|
# @param socket [Socket, Actor] which socket's events to return
|
159
174
|
# @return [Integer] event mask for the given socket
|
160
175
|
# @raise [ArgumentError] if socket is not registered
|
161
176
|
def event_mask_for_socket(socket)
|
162
177
|
@events[socket] or
|
163
|
-
raise ArgumentError,
|
178
|
+
raise ArgumentError, format('no event mask known for socket %p', socket)
|
164
179
|
end
|
165
180
|
|
166
181
|
private
|
@@ -170,17 +185,20 @@ module CZTop
|
|
170
185
|
# @raise [ArgumentError] if argument is not a socket
|
171
186
|
def ptr_for_socket(socket)
|
172
187
|
raise ArgumentError unless socket.is_a?(Socket) || socket.is_a?(Actor)
|
188
|
+
|
173
189
|
Zsock.resolve(socket)
|
174
190
|
end
|
175
191
|
|
192
|
+
|
176
193
|
# Keeps a reference to the given socket, and remembers its event mask.
|
177
194
|
# @param socket [Socket, Actor] the socket
|
178
195
|
# @param events [Integer] the event mask
|
179
196
|
def remember_socket(socket, events)
|
180
197
|
@sockets[ptr_for_socket(socket).to_i] = socket
|
181
|
-
@events[socket]
|
198
|
+
@events[socket] = events
|
182
199
|
end
|
183
200
|
|
201
|
+
|
184
202
|
# Discards the referencel to the given socket, and forgets its event mask.
|
185
203
|
# @param socket [Socket, Actor] the socket
|
186
204
|
def forget_socket(socket)
|
@@ -188,33 +206,40 @@ module CZTop
|
|
188
206
|
@events.delete(socket)
|
189
207
|
end
|
190
208
|
|
209
|
+
|
191
210
|
# Represents an event returned by {CZTop::Poller#wait}. This is useful to
|
192
211
|
# find out whether the associated socket is now readable or writable, in
|
193
212
|
# case you're interested in both. For a simpler variant, check out
|
194
213
|
# {CZTop::Poller#simple_wait}.
|
195
214
|
class Event
|
215
|
+
|
196
216
|
# @param poller [CZTop::Poller] the poller instance
|
197
217
|
# @param event_ptr [FFI::Pointer] pointer to the memory allocated for
|
198
218
|
# the event's data (a +zmq_poller_event_t+)
|
199
219
|
def initialize(poller, event_ptr)
|
200
|
-
@poller
|
220
|
+
@poller = poller
|
201
221
|
@poller_event = ZMQ::PollerEvent.new(event_ptr)
|
202
222
|
end
|
203
223
|
|
224
|
+
|
204
225
|
# @return [Socket, Actor] the associated socket
|
205
226
|
def socket
|
206
227
|
@socket ||= @poller.socket_for_ptr(@poller_event[:socket])
|
207
228
|
end
|
208
229
|
|
230
|
+
|
209
231
|
# @return [Boolean] whether it's readable
|
210
232
|
def readable?
|
211
233
|
@poller_event.readable?
|
212
234
|
end
|
213
235
|
|
236
|
+
|
214
237
|
# @return [Boolean] whether it's writable
|
215
238
|
def writable?
|
216
239
|
@poller_event.writable?
|
217
240
|
end
|
241
|
+
|
218
242
|
end
|
243
|
+
|
219
244
|
end
|
220
245
|
end
|
@@ -1,24 +1,29 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module CZTop
|
3
4
|
# These are methods that can be used on a {Socket} as well as an {Actor}.
|
4
5
|
# @see http://api.zeromq.org/czmq3-0:zsock
|
5
6
|
module PolymorphicZsockMethods
|
7
|
+
|
6
8
|
# Sends a signal.
|
7
9
|
# @param status [Integer] signal (0-255)
|
8
10
|
def signal(status = 0)
|
9
11
|
::CZMQ::FFI::Zsock.signal(ffi_delegate, status)
|
10
12
|
end
|
11
13
|
|
14
|
+
|
12
15
|
# Waits for a signal.
|
13
16
|
# @return [Integer] the received signal
|
14
17
|
def wait
|
15
18
|
::CZMQ::FFI::Zsock.wait(ffi_delegate)
|
16
19
|
end
|
17
20
|
|
21
|
+
|
18
22
|
# Set socket to use unbounded pipes (HWM=0); use this in cases when you are
|
19
23
|
# totally certain the message volume can fit in memory.
|
20
24
|
def set_unbounded
|
21
25
|
::CZMQ::FFI::Zsock.set_unbounded(ffi_delegate)
|
22
26
|
end
|
27
|
+
|
23
28
|
end
|
24
29
|
end
|
data/lib/cztop/proxy.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module CZTop
|
2
4
|
# Steerable proxy which switches messages between a frontend and a backend
|
3
5
|
# socket.
|
@@ -6,11 +8,12 @@ module CZTop
|
|
6
8
|
#
|
7
9
|
# @see http://api.zeromq.org/czmq3-0:zproxy
|
8
10
|
class Proxy
|
11
|
+
|
9
12
|
include ::CZMQ::FFI
|
10
13
|
|
11
14
|
# function pointer to the +zmonitor()+ function
|
12
15
|
ZPROXY_FPTR = ::CZMQ::FFI.ffi_libraries.each do |dl|
|
13
|
-
fptr = dl.find_function(
|
16
|
+
fptr = dl.find_function('zproxy')
|
14
17
|
break fptr if fptr
|
15
18
|
end
|
16
19
|
raise LoadError, "couldn't find zproxy()" if ZPROXY_FPTR.nil?
|
@@ -28,13 +31,15 @@ module CZTop
|
|
28
31
|
@actor.terminate
|
29
32
|
end
|
30
33
|
|
34
|
+
|
31
35
|
# Enable verbose logging of commands and activity.
|
32
36
|
# @return [void]
|
33
37
|
def verbose!
|
34
|
-
@actor <<
|
38
|
+
@actor << 'VERBOSE'
|
35
39
|
@actor.wait
|
36
40
|
end
|
37
41
|
|
42
|
+
|
38
43
|
# Returns a configurator object which you can use to configure the
|
39
44
|
# frontend socket.
|
40
45
|
# @return [Configurator] (memoized) frontend configurator
|
@@ -42,6 +47,7 @@ module CZTop
|
|
42
47
|
@frontend ||= Configurator.new(self, :frontend)
|
43
48
|
end
|
44
49
|
|
50
|
+
|
45
51
|
# Returns a configurator object which you can use to configure the backend
|
46
52
|
# socket.
|
47
53
|
# @return [Configurator] (memoized) backend configurator
|
@@ -49,54 +55,59 @@ module CZTop
|
|
49
55
|
@backend ||= Configurator.new(self, :backend)
|
50
56
|
end
|
51
57
|
|
58
|
+
|
52
59
|
# Captures all proxied messages and delivers them to a PULL socket bound
|
53
60
|
# to the specified endpoint.
|
54
61
|
# @note The PULL socket has to be bound before calling this method.
|
55
62
|
# @param endpoint [String] the endpoint to which the PULL socket is bound to
|
56
63
|
# @return [void]
|
57
64
|
def capture(endpoint)
|
58
|
-
@actor << [
|
65
|
+
@actor << ['CAPTURE', endpoint]
|
59
66
|
@actor.wait
|
60
67
|
end
|
61
68
|
|
69
|
+
|
62
70
|
# Pauses proxying of any messages.
|
63
71
|
# @note This causes any messages to be queued up and potentialy hit the
|
64
72
|
# high-water mark on the frontend or backend socket, causing messages to
|
65
73
|
# be dropped or writing applications to block.
|
66
74
|
# @return [void]
|
67
75
|
def pause
|
68
|
-
@actor <<
|
76
|
+
@actor << 'PAUSE'
|
69
77
|
@actor.wait
|
70
78
|
end
|
71
79
|
|
80
|
+
|
72
81
|
# Resume proxying of messages.
|
73
82
|
# @note This is only needed after a call to {#pause}, not to start the
|
74
83
|
# proxy. Proxying starts as soon as the frontend and backend sockets are
|
75
84
|
# properly attached.
|
76
85
|
# @return [void]
|
77
86
|
def resume
|
78
|
-
@actor <<
|
87
|
+
@actor << 'RESUME'
|
79
88
|
@actor.wait
|
80
89
|
end
|
81
90
|
|
91
|
+
|
82
92
|
# Used to configure the socket on one side of a {Proxy}.
|
83
93
|
class Configurator
|
94
|
+
|
84
95
|
# @return [Array<Symbol>] supported socket types
|
85
96
|
SOCKET_TYPES = %i[
|
86
97
|
PAIR PUB SUB REQ REP
|
87
98
|
DEALER ROUTER PULL PUSH
|
88
99
|
XPUB XSUB
|
89
|
-
]
|
100
|
+
].freeze
|
90
101
|
|
91
102
|
# @param proxy [Proxy] the proxy instance
|
92
103
|
# @param side [Symbol] :frontend or :backend
|
93
104
|
def initialize(proxy, side)
|
94
105
|
@proxy = proxy
|
95
|
-
@side
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
106
|
+
@side = case side
|
107
|
+
when :frontend then 'FRONTEND'
|
108
|
+
when :backend then 'BACKEND'
|
109
|
+
else raise ArgumentError, "invalid side: #{side.inspect}"
|
110
|
+
end
|
100
111
|
end
|
101
112
|
|
102
113
|
# @return [Proxy] the proxy this {Configurator} works on
|
@@ -111,27 +122,29 @@ module CZTop
|
|
111
122
|
# @raise [ArgumentError] if the given socket type is invalid
|
112
123
|
# @return [void]
|
113
124
|
def bind(socket_type, endpoint)
|
114
|
-
unless SOCKET_TYPES.include?(socket_type)
|
115
|
-
|
116
|
-
|
117
|
-
@proxy.actor << [ @side, socket_type.to_s, endpoint ]
|
125
|
+
raise ArgumentError, "invalid socket type: #{socket_type}" unless SOCKET_TYPES.include?(socket_type)
|
126
|
+
|
127
|
+
@proxy.actor << [@side, socket_type.to_s, endpoint]
|
118
128
|
@proxy.actor.wait
|
119
129
|
end
|
120
130
|
|
131
|
+
|
121
132
|
# Set ZAP domain for authentication.
|
122
133
|
# @param domain [String] the ZAP domain
|
123
134
|
def domain=(domain)
|
124
|
-
@proxy.actor << [
|
135
|
+
@proxy.actor << ['DOMAIN', @side, domain]
|
125
136
|
@proxy.actor.wait
|
126
137
|
end
|
127
138
|
|
139
|
+
|
128
140
|
# Configure PLAIN authentication on this socket.
|
129
141
|
# @note You'll have to use a {CZTop::Authenticator}.
|
130
142
|
def PLAIN_server!
|
131
|
-
@proxy.actor << [
|
143
|
+
@proxy.actor << ['PLAIN', @side]
|
132
144
|
@proxy.actor.wait
|
133
145
|
end
|
134
146
|
|
147
|
+
|
135
148
|
# Configure CURVE authentication on this socket.
|
136
149
|
# @note You'll have to use a {CZTop::Authenticator}.
|
137
150
|
# @param cert [Certificate] this server's certificate,
|
@@ -139,11 +152,13 @@ module CZTop
|
|
139
152
|
def CURVE_server!(cert)
|
140
153
|
public_key = cert.public_key
|
141
154
|
secret_key = cert.secret_key or
|
142
|
-
raise ArgumentError,
|
155
|
+
raise ArgumentError, 'no secret key in certificate'
|
143
156
|
|
144
|
-
@proxy.actor << [
|
157
|
+
@proxy.actor << ['CURVE', @side, public_key, secret_key]
|
145
158
|
@proxy.actor.wait
|
146
159
|
end
|
160
|
+
|
147
161
|
end
|
162
|
+
|
148
163
|
end
|
149
164
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module CZTop
|
3
4
|
# These are methods that can be used on a {Socket} as well as an {Actor},
|
4
5
|
# but actually just pass through to methods of {Message} (which take
|
5
6
|
# a polymorphic reference, in Ruby as well as in C).
|
6
7
|
# @see http://api.zeromq.org/czmq3-0:zmsg
|
7
8
|
module SendReceiveMethods
|
9
|
+
|
8
10
|
# Sends a message.
|
9
11
|
#
|
10
12
|
# @param message [Message, String, Array<parts>] the message to send
|
@@ -20,6 +22,7 @@ module CZTop
|
|
20
22
|
self
|
21
23
|
end
|
22
24
|
|
25
|
+
|
23
26
|
# Receives a message.
|
24
27
|
#
|
25
28
|
# @return [Message]
|
@@ -31,5 +34,6 @@ module CZTop
|
|
31
34
|
def receive
|
32
35
|
Message.receive_from(self)
|
33
36
|
end
|
37
|
+
|
34
38
|
end
|
35
39
|
end
|