cztop 1.0.0 → 1.1.0.pre1
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/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
|