paho-mqtt 1.0.7 → 1.0.9

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.
@@ -16,13 +16,13 @@ module PahoMqtt
16
16
  class Sender
17
17
 
18
18
  attr_accessor :last_ping_req
19
-
19
+
20
20
  def initialize(ack_timeout)
21
- @socket = nil
21
+ @socket = nil
22
22
  @writing_queue = []
23
23
  @writing_mutex = Mutex.new
24
24
  @last_ping_req = -1
25
- @ack_timeout = ack_timeout
25
+ @ack_timeout = ack_timeout
26
26
  end
27
27
 
28
28
  def socket=(socket)
@@ -39,52 +39,48 @@ module PahoMqtt
39
39
  end
40
40
  end
41
41
 
42
- def append_to_writing(packet)
43
- @writing_mutex.synchronize {
44
- @writing_queue.push(packet)
45
- }
42
+ def append_to_writing(packet)
43
+ @writing_mutex.synchronize do
44
+ @writing_queue.push(packet) unless @writing_queue.length >= MAX_WRITING
45
+ end
46
46
  MQTT_ERR_SUCCESS
47
47
  end
48
48
 
49
49
  def writing_loop(max_packet)
50
- @writing_mutex.synchronize {
50
+ @writing_mutex.synchronize do
51
51
  cnt = 0
52
52
  while !@writing_queue.empty? && cnt < max_packet do
53
53
  packet = @writing_queue.shift
54
54
  send_packet(packet)
55
55
  cnt += 1
56
56
  end
57
- }
57
+ end
58
58
  MQTT_ERR_SUCCESS
59
59
  end
60
-
60
+
61
61
  def flush_waiting_packet(sending=true)
62
62
  if sending
63
- @writing_mutex.synchronize {
63
+ @writing_mutex.synchronize do
64
64
  @writing_queue.each do |m|
65
65
  send_packet(m)
66
66
  end
67
- }
67
+ end
68
68
  else
69
69
  @writing_queue = []
70
70
  end
71
71
  end
72
-
73
- def check_ack_alive(queue, mutex, max_packet)
74
- mutex.synchronize {
72
+
73
+ def check_ack_alive(queue, mutex)
74
+ mutex.synchronize do
75
75
  now = Time.now
76
- cnt = 0
77
76
  queue.each do |pck|
78
77
  if now >= pck[:timestamp] + @ack_timeout
79
78
  pck[:packet].dup ||= true unless pck[:packet].class == PahoMqtt::Packet::Subscribe || pck[:packet].class == PahoMqtt::Packet::Unsubscribe
80
- unless cnt > max_packet
81
- append_to_writing(pck[:packet])
82
- pck[:timestamp] = now
83
- cnt += 1
84
- end
79
+ append_to_writing(pck[:packet])
80
+ pck[:timestamp] = now
85
81
  end
86
82
  end
87
- }
83
+ end
88
84
  end
89
85
  end
90
86
  end
@@ -18,13 +18,13 @@ module PahoMqtt
18
18
  attr_reader :subscribed_topics
19
19
 
20
20
  def initialize(sender)
21
- @waiting_suback = []
22
- @waiting_unsuback = []
23
- @subscribed_mutex = Mutex.new
21
+ @waiting_suback = []
22
+ @waiting_unsuback = []
23
+ @subscribed_mutex = Mutex.new
24
24
  @subscribed_topics = []
25
- @suback_mutex = Mutex.new
26
- @unsuback_mutex = Mutex.new
27
- @sender = sender
25
+ @suback_mutex = Mutex.new
26
+ @unsuback_mutex = Mutex.new
27
+ @sender = sender
28
28
  end
29
29
 
30
30
  def sender=(sender)
@@ -34,24 +34,28 @@ module PahoMqtt
34
34
  def config_subscription(new_id)
35
35
  unless @subscribed_topics == [] || @subscribed_topics.nil?
36
36
  packet = PahoMqtt::Packet::Subscribe.new(
37
- :id => new_id,
37
+ :id => new_id,
38
38
  :topics => @subscribed_topics
39
39
  )
40
- @subscribed_mutex.synchronize {
40
+ @subscribed_mutex.synchronize do
41
41
  @subscribed_topics = []
42
- }
43
- @suback_mutex.synchronize {
44
- @waiting_suback.push({ :id => new_id, :packet => packet, :timestamp => Time.now })
45
- }
42
+ end
43
+ @suback_mutex.synchronize do
44
+ if @waiting_suback.length >= MAX_SUBACK
45
+ PahoMqtt.logger.error('SUBACK queue is full, could not send subscribe') if PahoMqtt.logger?
46
+ return MQTT_ERR_FAILURE
47
+ end
48
+ @waiting_suback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
49
+ end
46
50
  @sender.send_packet(packet)
47
51
  end
48
52
  MQTT_ERR_SUCCESS
49
53
  end
50
54
 
51
55
  def add_subscription(max_qos, packet_id, adjust_qos)
52
- @suback_mutex.synchronize {
56
+ @suback_mutex.synchronize do
53
57
  adjust_qos, @waiting_suback = @waiting_suback.partition { |pck| pck[:id] == packet_id }
54
- }
58
+ end
55
59
  if adjust_qos.length == 1
56
60
  adjust_qos = adjust_qos.first[:packet].topics
57
61
  adjust_qos.each do |t|
@@ -60,51 +64,54 @@ module PahoMqtt
60
64
  elsif max_qos[0] == 128
61
65
  adjust_qos.delete(t)
62
66
  else
63
-
64
- @logger.error("The qos value is invalid in subscribe.") if PahoMqtt.logger?
65
- raise PacketException
67
+ PahoMqtt.logger.error("The QoS value is invalid in subscribe.") if PahoMqtt.logger?
68
+ raise PacketException.new('Invalid suback QoS value')
66
69
  end
67
70
  end
68
71
  else
69
- @logger.error("The packet id is invalid, already used.") if PahoMqtt.logger?
70
- raise PacketException
72
+ PahoMqtt.logger.error("The packet id is invalid, already used.") if PahoMqtt.logger?
73
+ raise PacketException.new("Invalid suback packet id: #{packet_id}")
71
74
  end
72
- @subscribed_mutex.synchronize {
75
+ @subscribed_mutex.synchronize do
73
76
  @subscribed_topics.concat(adjust_qos)
74
- }
77
+ end
75
78
  return adjust_qos
76
79
  end
77
80
 
78
81
  def remove_subscription(packet_id, to_unsub)
79
- @unsuback_mutex.synchronize {
82
+ @unsuback_mutex.synchronize do
80
83
  to_unsub, @waiting_unsuback = @waiting_unsuback.partition { |pck| pck[:id] == packet_id }
81
- }
82
-
84
+ end
85
+
83
86
  if to_unsub.length == 1
84
87
  to_unsub = to_unsub.first[:packet].topics
85
88
  else
86
- @logger.error("The packet id is invalid, already used.") if PahoMqtt.logger?
87
- raise PacketException
89
+ PahoMqtt.logger.error("The packet id is invalid, already used.") if PahoMqtt.logger?
90
+ raise PacketException.new("Invalid unsuback packet id: #{packet_id}")
88
91
  end
89
92
 
90
- @subscribed_mutex.synchronize {
93
+ @subscribed_mutex.synchronize do
91
94
  to_unsub.each do |filter|
92
95
  @subscribed_topics.delete_if { |topic| PahoMqtt.match_filter(topic.first, filter) }
93
96
  end
94
- }
97
+ end
95
98
  return to_unsub
96
99
  end
97
-
100
+
98
101
  def send_subscribe(topics, new_id)
99
102
  unless valid_topics?(topics) == MQTT_ERR_FAIL
100
103
  packet = PahoMqtt::Packet::Subscribe.new(
101
- :id => new_id,
104
+ :id => new_id,
102
105
  :topics => topics
103
- )
106
+ )
104
107
  @sender.append_to_writing(packet)
105
- @suback_mutex.synchronize {
106
- @waiting_suback.push({ :id => new_id, :packet => packet, :timestamp => Time.now })
107
- }
108
+ @suback_mutex.synchronize do
109
+ if @waiting_suback.length >= MAX_SUBACK
110
+ PahoMqtt.logger.error('SUBACK queue is full, could not send subscribe') if PahoMqtt.logger?
111
+ return MQTT_ERR_FAILURE
112
+ end
113
+ @waiting_suback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
114
+ end
108
115
  MQTT_ERR_SUCCESS
109
116
  else
110
117
  raise ProtocolViolation
@@ -114,14 +121,18 @@ module PahoMqtt
114
121
  def send_unsubscribe(topics, new_id)
115
122
  unless valid_topics?(topics) == MQTT_ERR_FAIL
116
123
  packet = PahoMqtt::Packet::Unsubscribe.new(
117
- :id => new_id,
124
+ :id => new_id,
118
125
  :topics => topics
119
126
  )
120
-
127
+
121
128
  @sender.append_to_writing(packet)
122
- @unsuback_mutex.synchronize {
123
- @waiting_unsuback.push({:id => new_id, :packet => packet, :timestamp => Time.now})
124
- }
129
+ @unsuback_mutex.synchronize do
130
+ if @waiting_suback.length >= MAX_UNSUBACK
131
+ PahoMqtt.logger.error('UNSUBACK queue is full, could not send unbsubscribe') if PahoMqtt.logger?
132
+ return MQTT_ERR_FAIL
133
+ end
134
+ @waiting_unsuback.push(:id => new_id, :packet => packet, :timestamp => Time.now)
135
+ end
125
136
  MQTT_ERR_SUCCESS
126
137
  else
127
138
  raise ProtocolViolation
@@ -129,8 +140,8 @@ module PahoMqtt
129
140
  end
130
141
 
131
142
  def check_waiting_subscriber
132
- @sender.check_ack_alive(@waiting_suback, @suback_mutex, @waiting_suback.length)
133
- @sender.check_ack_alive(@waiting_unsuback, @unsuback_mutex, @waiting_unsuback.length)
143
+ @sender.check_ack_alive(@waiting_suback, @suback_mutex)
144
+ @sender.check_ack_alive(@waiting_unsuback, @unsuback_mutex)
134
145
  end
135
146
 
136
147
  def valid_topics?(topics)
@@ -1,3 +1,3 @@
1
1
  module PahoMqtt
2
- VERSION = "1.0.7"
2
+ VERSION = "1.0.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paho-mqtt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Goudet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-24 00:00:00.000000000 Z
11
+ date: 2018-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,6 +71,7 @@ files:
71
71
  - lib/paho-mqtt.rb
72
72
  - lib/paho_mqtt/client.rb
73
73
  - lib/paho_mqtt/connection_helper.rb
74
+ - lib/paho_mqtt/exception.rb
74
75
  - lib/paho_mqtt/handler.rb
75
76
  - lib/paho_mqtt/packet.rb
76
77
  - lib/paho_mqtt/packet/base.rb