mosq 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/mosq/Rakefile +9 -3
- data/lib/mosq/client.rb +97 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b296db03c458067273327316bdb11e9e363d671e
|
4
|
+
data.tar.gz: 78c2ba4c4782f25a010398be2823161163b49411
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07a7d0ab55446f767c6a81eba9eae3a1ea08524c55d2fc6f29a32a26e33e192a3bb01cd9e49ca4a9a0bef36b72d96f76c8f78466f1808d9acf7fb68504180a27
|
7
|
+
data.tar.gz: 41e4acb30e8ae4c775864a1f6df4545f4ebde02850a5c02b3bdd0d100fed4dff417f3232ddd29a1140d2001f75484b26f1ab44f595cc342743860388bd5fbe02
|
data/ext/mosq/Rakefile
CHANGED
@@ -36,9 +36,15 @@ file_task 'mosquitto', :download => :download_tarball do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
file_task "libmosquitto.#{::FFI::Platform::LIBSUFFIX}", :build => :download do
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
begin
|
40
|
+
mkflags = "WITH_THREADING=no WITH_SRV=no WITH_UUID=no"
|
41
|
+
cmd "/usr/bin/env sh -c 'cd #{FILES[:download]} && make #{mkflags}'"
|
42
|
+
cmd "cp #{FILES[:download]}/lib/#{FILES[:build]}* ./#{FILES[:build]}"
|
43
|
+
rescue RuntimeError # make won't work on OSX, asking to use cmake instead.
|
44
|
+
cmkflags = "-DWITH_THREADING=OFF -DWITH_SRV=OFF"
|
45
|
+
cmd "/usr/bin/env sh -c 'cd #{FILES[:download]} && cmake . #{cmkflags} && make'"
|
46
|
+
cmd "cp #{FILES[:download]}/lib/#{FILES[:build]} ./#{FILES[:build]}"
|
47
|
+
end
|
42
48
|
end
|
43
49
|
|
44
50
|
task :compact => FILES[:build] do
|
data/lib/mosq/client.rb
CHANGED
@@ -44,7 +44,8 @@ module Mosq
|
|
44
44
|
def heartbeat; @options.fetch(:heartbeat); end
|
45
45
|
|
46
46
|
# The maximum time interval the user application should wait between
|
47
|
-
# yielding control back to the client object by calling
|
47
|
+
# yielding control back to the client object by calling methods like
|
48
|
+
# {#run_loop!} and {#run_immediate!}.
|
48
49
|
def max_poll_interval
|
49
50
|
@options.fetch(:heartbeat) / 2.0
|
50
51
|
end
|
@@ -181,6 +182,70 @@ module Mosq
|
|
181
182
|
self
|
182
183
|
end
|
183
184
|
|
185
|
+
# Subscribe to many topics. This is more performant than many calls
|
186
|
+
# to {#subscribe}, as the transactions occur concurrently.
|
187
|
+
#
|
188
|
+
# @param topics [Array<String>] The topic patterns to subscribe to.
|
189
|
+
# @param qos [Integer] The QoS level to use for all publish transaction.
|
190
|
+
# @return [Client] This client.
|
191
|
+
#
|
192
|
+
def subscribe_many(topics, qos: 0)
|
193
|
+
packet_ids = []
|
194
|
+
topics.each do |topic|
|
195
|
+
Util.error_check "subscribing to many topics",
|
196
|
+
FFI.mosquitto_subscribe(ptr, @packet_id_ptr, topic, qos)
|
197
|
+
|
198
|
+
packet_ids << @packet_id_ptr.read_int
|
199
|
+
end
|
200
|
+
|
201
|
+
fetch_responses(:subscribe, packet_ids)
|
202
|
+
|
203
|
+
self
|
204
|
+
end
|
205
|
+
|
206
|
+
# Unsubscribe from many topics. This is more performant than many calls
|
207
|
+
# to {#unsubscribe}, as the transactions occur concurrently.
|
208
|
+
#
|
209
|
+
# @param topics [Array<String>] The topic patterns to unsubscribe from.
|
210
|
+
# @return [Client] This client.
|
211
|
+
#
|
212
|
+
def unsubscribe_many(topics)
|
213
|
+
packet_ids = []
|
214
|
+
topics.each do |topic|
|
215
|
+
Util.error_check "subscribing to many topics",
|
216
|
+
FFI.mosquitto_unsubscribe(ptr, @packet_id_ptr, topic)
|
217
|
+
|
218
|
+
packet_ids << @packet_id_ptr.read_int
|
219
|
+
end
|
220
|
+
|
221
|
+
fetch_responses(:unsubscribe, packet_ids)
|
222
|
+
|
223
|
+
self
|
224
|
+
end
|
225
|
+
|
226
|
+
# Publish many pairs of topic/payload as messages. This is more performant
|
227
|
+
# than many calls to {#publish}, as the transactions occur concurrently.
|
228
|
+
#
|
229
|
+
# @param pairs [Array<Array(String, String)>] The topic/payload pairs.
|
230
|
+
# @param qos [Integer] The QoS level to use for all publish transaction.
|
231
|
+
# @param retain [Boolean] Whether the broker should retain the messages.
|
232
|
+
# @return [Client] This client.
|
233
|
+
#
|
234
|
+
def publish_many(pairs, qos: 0, retain: false)
|
235
|
+
packet_ids = []
|
236
|
+
pairs.each do |topic, payload|
|
237
|
+
Util.error_check "publishing many messages",
|
238
|
+
FFI.mosquitto_publish(ptr, @packet_id_ptr,
|
239
|
+
topic, payload.bytesize, payload, qos, retain)
|
240
|
+
|
241
|
+
packet_ids << @packet_id_ptr.read_int
|
242
|
+
end
|
243
|
+
|
244
|
+
fetch_responses(:publish, packet_ids)
|
245
|
+
|
246
|
+
self
|
247
|
+
end
|
248
|
+
|
184
249
|
# Fetch and handle events in a loop that blocks the calling thread.
|
185
250
|
# The loop will continue until the {#break!} method is called from within
|
186
251
|
# an event handler, or until the given timeout duration has elapsed.
|
@@ -302,7 +367,8 @@ module Mosq
|
|
302
367
|
end
|
303
368
|
|
304
369
|
# Internal implementation of synchronous responses.
|
305
|
-
def fetch_response(expected_type, expected_packet_id,
|
370
|
+
def fetch_response(expected_type, expected_packet_id,
|
371
|
+
timeout=protocol_timeout, start=Time.now)
|
306
372
|
unwanted_events = []
|
307
373
|
|
308
374
|
while (event = fetch_next_event(timeout, start))
|
@@ -320,5 +386,34 @@ module Mosq
|
|
320
386
|
|
321
387
|
raise FFI::Error::Timeout, "waiting for #{expected_type} response"
|
322
388
|
end
|
389
|
+
|
390
|
+
# Internal implementation of multiple outstanding synchronous responses.
|
391
|
+
def fetch_responses(expected_type, expected_packet_ids,
|
392
|
+
timeout=protocol_timeout, start=Time.now)
|
393
|
+
return [] if expected_packet_ids.empty?
|
394
|
+
unwanted_events = []
|
395
|
+
wanted_events = []
|
396
|
+
|
397
|
+
while (event = fetch_next_event(timeout, start))
|
398
|
+
if (event.fetch(:type) == expected_type) && (
|
399
|
+
expected_packet_ids.include?(event.fetch(:packet_id))
|
400
|
+
)
|
401
|
+
wanted_events.push(event)
|
402
|
+
else
|
403
|
+
unwanted_events.push(event)
|
404
|
+
end
|
405
|
+
|
406
|
+
if wanted_events.size >= expected_packet_ids.size
|
407
|
+
unwanted_events.reverse_each { |e| @bucket.events.unshift(e) }
|
408
|
+
wanted_events.each do |event|
|
409
|
+
handle_incoming_event(event)
|
410
|
+
end
|
411
|
+
|
412
|
+
return wanted_events
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
raise FFI::Error::Timeout, "waiting for #{expected_type} responses"
|
417
|
+
end
|
323
418
|
end
|
324
419
|
end
|