ably 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -3
- data/lib/ably/auth.rb +1 -1
- data/lib/ably/exceptions.rb +3 -0
- data/lib/ably/models/channel_state_change.rb +41 -0
- data/lib/ably/models/connection_state_change.rb +43 -0
- data/lib/ably/models/message.rb +1 -1
- data/lib/ably/models/presence_message.rb +1 -1
- data/lib/ably/models/protocol_message.rb +2 -1
- data/lib/ably/modules/state_emitter.rb +4 -1
- data/lib/ably/modules/uses_state_machine.rb +28 -4
- data/lib/ably/realtime/channel.rb +11 -3
- data/lib/ably/realtime/channel/channel_manager.rb +24 -4
- data/lib/ably/realtime/channel/channel_state_machine.rb +20 -11
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +4 -4
- data/lib/ably/realtime/connection.rb +1 -0
- data/lib/ably/realtime/connection/connection_manager.rb +33 -21
- data/lib/ably/realtime/connection/connection_state_machine.rb +24 -16
- data/lib/ably/rest/channel.rb +3 -2
- data/lib/ably/util/crypto.rb +15 -0
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/channel_spec.rb +155 -9
- data/spec/acceptance/realtime/client_spec.rb +2 -2
- data/spec/acceptance/realtime/connection_failures_spec.rb +8 -4
- data/spec/acceptance/realtime/connection_spec.rb +122 -11
- data/spec/acceptance/realtime/message_spec.rb +119 -3
- data/spec/acceptance/realtime/presence_spec.rb +34 -13
- data/spec/acceptance/rest/channel_spec.rb +9 -0
- data/spec/acceptance/rest/client_spec.rb +10 -0
- data/spec/unit/models/channel_state_change_spec.rb +44 -0
- data/spec/unit/models/connection_state_change_spec.rb +54 -0
- data/spec/unit/util/crypto_spec.rb +18 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85089829c198d66df277d8b4c675497c3632ed88
|
4
|
+
data.tar.gz: c6a05542c8c35adce99763b651290cb3e5fbf472
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b13264f6a68b29dcb4ccd0f7bc87af4df57cfb9d685bd7f87ebda5bef3c7679a437dd2ee5f967e0eb2385ab3659588784b32ae6f39520931723e1407d9471b2a
|
7
|
+
data.tar.gz: 5d5f15f00cce1ddced2188d2e3c5a8c3f1b36a719d281b54738eded944db6127e5546df65048118935d35ee6ea8b588ceab2cadb4f8ac66d0998a609e5aaba54
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [Unreleased](https://github.com/ably/ably-ruby/tree/HEAD)
|
4
4
|
|
5
|
-
[Full Changelog](https://github.com/ably/ably-ruby/compare/v0.8.2...
|
5
|
+
[Full Changelog](https://github.com/ably/ably-ruby/compare/v0.8.2...HEAD)
|
6
6
|
|
7
7
|
**Implemented enhancements:**
|
8
8
|
|
9
|
+
- Add compatibility support for default Crypto params [\#53](https://github.com/ably/ably-ruby/issues/53)
|
10
|
+
|
11
|
+
- EventEmitter on connection [\#52](https://github.com/ably/ably-ruby/issues/52)
|
12
|
+
|
13
|
+
- Add test for connectionId attribute for a message sent over REST [\#50](https://github.com/ably/ably-ruby/issues/50)
|
14
|
+
|
9
15
|
- Implement :queue\_messages option [\#36](https://github.com/ably/ably-ruby/issues/36)
|
10
16
|
|
11
17
|
- Check that a non 200-299 status code for REST requests uses fallback hosts [\#35](https://github.com/ably/ably-ruby/issues/35)
|
@@ -32,6 +38,10 @@
|
|
32
38
|
|
33
39
|
**Merged pull requests:**
|
34
40
|
|
41
|
+
- Spec update to fix a number of issues [\#60](https://github.com/ably/ably-ruby/pull/60) ([mattheworiordan](https://github.com/mattheworiordan))
|
42
|
+
|
43
|
+
- Allow clientId to be provided on init if using externally created token [\#58](https://github.com/ably/ably-ruby/pull/58) ([SimonWoolf](https://github.com/SimonWoolf))
|
44
|
+
|
35
45
|
- Separate token params for auth [\#57](https://github.com/ably/ably-ruby/pull/57) ([mattheworiordan](https://github.com/mattheworiordan))
|
36
46
|
|
37
47
|
- Ensure files are required in a consistent order [\#51](https://github.com/ably/ably-ruby/pull/51) ([SimonWoolf](https://github.com/SimonWoolf))
|
@@ -182,4 +192,4 @@
|
|
182
192
|
|
183
193
|
|
184
194
|
|
185
|
-
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
195
|
+
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/lib/ably/auth.rb
CHANGED
@@ -74,7 +74,7 @@ module Ably
|
|
74
74
|
raise ArgumentError, 'key is missing. Either an API key, token, or token auth method must be provided'
|
75
75
|
end
|
76
76
|
|
77
|
-
if has_client_id?
|
77
|
+
if has_client_id? && !token_creatable_externally?
|
78
78
|
raise ArgumentError, 'client_id cannot be provided without a complete API key. Key name & Secret is needed to authenticate with Ably and obtain a token' unless api_key_present?
|
79
79
|
ensure_utf_8 :client_id, client_id
|
80
80
|
end
|
data/lib/ably/exceptions.rb
CHANGED
@@ -58,6 +58,9 @@ module Ably
|
|
58
58
|
# Connection Timeout accessing Realtime or REST service
|
59
59
|
class ConnectionTimeout < ConnectionError; end
|
60
60
|
|
61
|
+
# Transport closed unexpectedly
|
62
|
+
class TransportClosed < ConnectionError; end
|
63
|
+
|
61
64
|
# Connection closed unexpectedly
|
62
65
|
class ConnectionClosed < ConnectionError; end
|
63
66
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Ably::Models
|
2
|
+
# ChannelStateChange is a class that is emitted by the {Ably::Realtime::Channel} object
|
3
|
+
# when a state change occurs
|
4
|
+
#
|
5
|
+
# @!attribute [r] current
|
6
|
+
# @return [Connection::STATE] Current connection state
|
7
|
+
# @!attribute [r] previous
|
8
|
+
# @return [Connection::STATE] Previous connection state
|
9
|
+
# @!attribute [r] reason
|
10
|
+
# @return [Ably::Models::ErrorInfo] Object describing the reason for a state change when not initiated by the consumer of the client library
|
11
|
+
#
|
12
|
+
class ChannelStateChange
|
13
|
+
include Ably::Modules::ModelCommon
|
14
|
+
|
15
|
+
def initialize(hash_object)
|
16
|
+
unless (hash_object.keys - [:current, :previous, :reason, :protocol_message]).empty?
|
17
|
+
raise ArgumentError, 'Invalid attributes, expecting :current, :previous, :reason'
|
18
|
+
end
|
19
|
+
|
20
|
+
@hash_object = {
|
21
|
+
current: hash_object.fetch(:current),
|
22
|
+
previous: hash_object.fetch(:previous),
|
23
|
+
retry_in: hash_object[:retry_in],
|
24
|
+
reason: hash_object[:reason],
|
25
|
+
protocol_message: hash_object[:protocol_message]
|
26
|
+
}
|
27
|
+
rescue KeyError => e
|
28
|
+
raise ArgumentError, e
|
29
|
+
end
|
30
|
+
|
31
|
+
%w(current previous reason protocol_message).each do |attribute|
|
32
|
+
define_method attribute do
|
33
|
+
@hash_object[attribute.to_sym]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"ChannelStateChange: current state #{current}, previous state #{previous}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Ably::Models
|
2
|
+
# ConnectionStateChange is a class that is emitted by the {Ably::Realtime::Connection} object
|
3
|
+
# when a state change occurs
|
4
|
+
#
|
5
|
+
# @!attribute [r] current
|
6
|
+
# @return [Connection::STATE] Current connection state
|
7
|
+
# @!attribute [r] previous
|
8
|
+
# @return [Connection::STATE] Previous connection state
|
9
|
+
# @!attribute [r] retry_in
|
10
|
+
# @return [Integer] Time in seconds until the connection will reattempt to connect when in the +:disconnected+ or +:suspended+ state
|
11
|
+
# @!attribute [r] reason
|
12
|
+
# @return [Ably::Models::ErrorInfo] Object describing the reason for a state change when not initiated by the consumer of the client library
|
13
|
+
#
|
14
|
+
class ConnectionStateChange
|
15
|
+
include Ably::Modules::ModelCommon
|
16
|
+
|
17
|
+
def initialize(hash_object)
|
18
|
+
unless (hash_object.keys - [:current, :previous, :retry_in, :reason, :protocol_message]).empty?
|
19
|
+
raise ArgumentError, 'Invalid attributes, expecting :current, :previous, :retry_in, :reason'
|
20
|
+
end
|
21
|
+
|
22
|
+
@hash_object = {
|
23
|
+
current: hash_object.fetch(:current),
|
24
|
+
previous: hash_object.fetch(:previous),
|
25
|
+
retry_in: hash_object[:retry_in],
|
26
|
+
reason: hash_object[:reason],
|
27
|
+
protocol_message: hash_object[:protocol_message]
|
28
|
+
}
|
29
|
+
rescue KeyError => e
|
30
|
+
raise ArgumentError, e
|
31
|
+
end
|
32
|
+
|
33
|
+
%w(current previous retry_in reason protocol_message).each do |attribute|
|
34
|
+
define_method attribute do
|
35
|
+
@hash_object[attribute.to_sym]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
"ConnectionStateChange: current state #{current}, previous state #{previous}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/ably/models/message.rb
CHANGED
@@ -141,7 +141,10 @@ module Ably::Modules
|
|
141
141
|
#
|
142
142
|
def deferrable_for_state_change_to(target_state)
|
143
143
|
Ably::Util::SafeDeferrable.new(logger).tap do |deferrable|
|
144
|
-
|
144
|
+
fail_proc = Proc.new do |state_change|
|
145
|
+
deferrable.fail self, state_change.reason
|
146
|
+
end
|
147
|
+
once_or_if(target_state, else: fail_proc) do
|
145
148
|
yield self if block_given?
|
146
149
|
deferrable.succeed self
|
147
150
|
end
|
@@ -13,8 +13,8 @@ module Ably::Modules
|
|
13
13
|
#
|
14
14
|
# @return [Boolean] true if new_state can be transitioned to by state machine
|
15
15
|
# @api private
|
16
|
-
def transition_state_machine(new_state,
|
17
|
-
state_machine.transition_state(new_state, emit_object)
|
16
|
+
def transition_state_machine(new_state, emit_params = {})
|
17
|
+
state_machine.transition_state(new_state, emit_object(new_state, emit_params))
|
18
18
|
end
|
19
19
|
|
20
20
|
# Call #transition_to! on the StateMachine
|
@@ -22,8 +22,8 @@ module Ably::Modules
|
|
22
22
|
#
|
23
23
|
# @return [void]
|
24
24
|
# @api private
|
25
|
-
def transition_state_machine!(new_state,
|
26
|
-
state_machine.transition_to!(new_state, emit_object)
|
25
|
+
def transition_state_machine!(new_state, emit_params = {})
|
26
|
+
state_machine.transition_to!(new_state, emit_object(new_state, emit_params))
|
27
27
|
end
|
28
28
|
|
29
29
|
# Provides an internal method for this object's state to match the StateMachine's current state.
|
@@ -70,5 +70,29 @@ module Ably::Modules
|
|
70
70
|
logger.debug "#{self.class.name}: Transitioned to #{state_machine.current_state}"
|
71
71
|
end
|
72
72
|
end
|
73
|
+
|
74
|
+
def emit_object(new_state, emit_params)
|
75
|
+
if self.class.emits_klass
|
76
|
+
self.class.emits_klass.new((emit_params || {}).merge(current: STATE(new_state), previous: STATE(state_machine.current_state)))
|
77
|
+
else
|
78
|
+
emit_params
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.included(base)
|
83
|
+
base.extend(ClassMethods)
|
84
|
+
end
|
85
|
+
|
86
|
+
module ClassMethods
|
87
|
+
def emits_klass
|
88
|
+
@emits_klass ||= if @emits_klass_name
|
89
|
+
Object.const_get @emits_klass_name
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def ensure_state_machine_emits(klass)
|
94
|
+
@emits_klass_name = klass
|
95
|
+
end
|
96
|
+
end
|
73
97
|
end
|
74
98
|
end
|
@@ -46,6 +46,7 @@ module Ably
|
|
46
46
|
)
|
47
47
|
include Ably::Modules::StateEmitter
|
48
48
|
include Ably::Modules::UsesStateMachine
|
49
|
+
ensure_state_machine_emits 'Ably::Models::ChannelStateChange'
|
49
50
|
|
50
51
|
# Max number of messages to bundle in a single ProtocolMessage
|
51
52
|
MAX_PROTOCOL_MESSAGE_BATCH_SIZE = 50
|
@@ -106,6 +107,7 @@ module Ably
|
|
106
107
|
#
|
107
108
|
# @param name [String, Array<Ably::Models::Message|Hash>, nil] The event name of the message to publish, or an Array of [Ably::Model::Message] objects or [Hash] objects with +:name+ and +:data+ pairs
|
108
109
|
# @param data [String, ByteArray, nil] The message payload unless an Array of [Ably::Model::Message] objects passed in the first argument
|
110
|
+
# @param attributes [Hash, nil] Optional additional message attributes such as :client_id or :connection_id, applied when name attribute is nil or a string
|
109
111
|
#
|
110
112
|
# @yield [Ably::Models::Message,Array<Ably::Models::Message>] On success, will call the block with the {Ably::Models::Message} if a single message is publishde, or an Array of {Ably::Models::Message} when multiple messages are published
|
111
113
|
# @return [Ably::Util::SafeDeferrable] Deferrable that supports both success (callback) and failure (errback) callbacks
|
@@ -136,7 +138,7 @@ module Ably
|
|
136
138
|
# puts "#{message.name} was not received, error #{error.message}"
|
137
139
|
# end
|
138
140
|
#
|
139
|
-
def publish(name, data = nil, &success_block)
|
141
|
+
def publish(name, data = nil, attributes = {}, &success_block)
|
140
142
|
raise Ably::Exceptions::ChannelInactive.new('Cannot publish messages on a detached channel') if detached? || detaching?
|
141
143
|
raise Ably::Exceptions::ChannelInactive.new('Cannot publish messages on a failed channel') if failed?
|
142
144
|
|
@@ -149,7 +151,7 @@ module Ably
|
|
149
151
|
else
|
150
152
|
ensure_utf_8 :name, name, allow_nil: true
|
151
153
|
ensure_supported_payload data
|
152
|
-
[{ name: name, data: data }]
|
154
|
+
[{ name: name, data: data }.merge(attributes)]
|
153
155
|
end
|
154
156
|
|
155
157
|
queue_messages(messages).tap do |deferrable|
|
@@ -190,7 +192,9 @@ module Ably
|
|
190
192
|
# @return [Ably::Util::SafeDeferrable] Deferrable that supports both success (callback) and failure (errback) callback
|
191
193
|
#
|
192
194
|
def attach(&success_block)
|
193
|
-
|
195
|
+
if connection.closing? || connection.closed? || connection.suspended? || connection.failed?
|
196
|
+
raise Ably::Exceptions::InvalidStateChange.new("Cannot ATTACH channel when the connection is in a closed, suspended or failed state. Connection state: #{connection.state}")
|
197
|
+
end
|
194
198
|
|
195
199
|
transition_state_machine :attaching if can_transition_to?(:attaching)
|
196
200
|
deferrable_for_state_change_to(STATE.Attached, &success_block)
|
@@ -285,6 +289,10 @@ module Ably
|
|
285
289
|
client.logger
|
286
290
|
end
|
287
291
|
|
292
|
+
# As we are using a state machine, do not allow change_state to be used
|
293
|
+
# #transition_state_machine must be used instead
|
294
|
+
private :change_state
|
295
|
+
|
288
296
|
private
|
289
297
|
attr_reader :queue
|
290
298
|
|
@@ -27,7 +27,7 @@ module Ably::Realtime
|
|
27
27
|
# Commence attachment
|
28
28
|
def detach(error = nil)
|
29
29
|
if connection.closed? || connection.connecting? || connection.suspended?
|
30
|
-
channel.transition_state_machine :detached, error
|
30
|
+
channel.transition_state_machine :detached, reason: error
|
31
31
|
elsif can_transition_to?(:detached)
|
32
32
|
send_detach_protocol_message
|
33
33
|
end
|
@@ -51,7 +51,7 @@ module Ably::Realtime
|
|
51
51
|
|
52
52
|
# Detach a channel as a result of an error
|
53
53
|
def suspend(error)
|
54
|
-
channel.transition_state_machine! :detaching, error
|
54
|
+
channel.transition_state_machine! :detaching, reason: error
|
55
55
|
end
|
56
56
|
|
57
57
|
# When a channel is no longer attached or has failed,
|
@@ -118,6 +118,22 @@ module Ably::Realtime
|
|
118
118
|
)
|
119
119
|
end
|
120
120
|
|
121
|
+
# Any message sent before an ACK/NACK was received on the previous transport
|
122
|
+
# needs to be resent to the Ably service so that a subsequent ACK/NACK is received.
|
123
|
+
# It is up to Ably to ensure that duplicate messages are not retransmitted on the channel
|
124
|
+
# base on the serial numbers
|
125
|
+
#
|
126
|
+
# @api private
|
127
|
+
def resend_pending_message_ack_queue
|
128
|
+
connection.__pending_message_ack_queue__.delete_if do |protocol_message|
|
129
|
+
if protocol_message.channel == channel.name
|
130
|
+
connection.__outgoing_message_queue__ << protocol_message
|
131
|
+
connection.__outgoing_protocol_msgbus__.publish :protocol_message
|
132
|
+
true
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
121
137
|
def setup_connection_event_handlers
|
122
138
|
connection.unsafe_on(:closed) do
|
123
139
|
channel.transition_state_machine :detaching if can_transition_to?(:detaching)
|
@@ -125,15 +141,19 @@ module Ably::Realtime
|
|
125
141
|
|
126
142
|
connection.unsafe_on(:suspended) do |error|
|
127
143
|
if can_transition_to?(:detaching)
|
128
|
-
channel.transition_state_machine :detaching, Ably::Exceptions::ConnectionSuspended.new('Connection suspended', nil, 80002, error)
|
144
|
+
channel.transition_state_machine :detaching, reason: Ably::Exceptions::ConnectionSuspended.new('Connection suspended', nil, 80002, error)
|
129
145
|
end
|
130
146
|
end
|
131
147
|
|
132
148
|
connection.unsafe_on(:failed) do |error|
|
133
149
|
if can_transition_to?(:failed)
|
134
|
-
channel.transition_state_machine :failed, Ably::Exceptions::ConnectionFailed.new('Connection failed', nil, 80002, error)
|
150
|
+
channel.transition_state_machine :failed, reason: Ably::Exceptions::ConnectionFailed.new('Connection failed', nil, 80002, error)
|
135
151
|
end
|
136
152
|
end
|
153
|
+
|
154
|
+
connection.unsafe_on(:connected) do |error|
|
155
|
+
resend_pending_message_ack_queue
|
156
|
+
end
|
137
157
|
end
|
138
158
|
|
139
159
|
def logger
|
@@ -35,39 +35,48 @@ module Ably::Realtime
|
|
35
35
|
end
|
36
36
|
|
37
37
|
before_transition(to: [:attached]) do |channel, current_transition|
|
38
|
-
channel.manager.attached current_transition.metadata
|
38
|
+
channel.manager.attached current_transition.metadata.protocol_message
|
39
39
|
end
|
40
40
|
|
41
41
|
after_transition(to: [:detaching]) do |channel, current_transition|
|
42
|
-
|
42
|
+
err = error_from_state_change(current_transition)
|
43
|
+
channel.manager.detach err
|
43
44
|
end
|
44
45
|
|
45
46
|
after_transition(to: [:detached]) do |channel, current_transition|
|
46
|
-
|
47
|
-
channel.manager.
|
47
|
+
err = error_from_state_change(current_transition)
|
48
|
+
channel.manager.fail_messages_awaiting_ack err
|
49
|
+
channel.manager.emit_error err if err
|
48
50
|
end
|
49
51
|
|
50
52
|
after_transition(to: [:failed]) do |channel, current_transition|
|
51
|
-
|
52
|
-
channel.manager.
|
53
|
+
err = error_from_state_change(current_transition)
|
54
|
+
channel.manager.fail_messages_awaiting_ack err
|
55
|
+
channel.manager.emit_error err if err
|
53
56
|
end
|
54
57
|
|
55
58
|
# Transitions responsible for updating channel#error_reason
|
56
59
|
before_transition(to: [:failed]) do |channel, current_transition|
|
57
|
-
|
60
|
+
err = error_from_state_change(current_transition)
|
61
|
+
channel.set_failed_channel_error_reason err if err
|
58
62
|
end
|
59
63
|
|
60
64
|
before_transition(to: [:attached, :detached]) do |channel, current_transition|
|
61
|
-
|
62
|
-
|
65
|
+
err = error_from_state_change(current_transition)
|
66
|
+
if err
|
67
|
+
channel.set_failed_channel_error_reason err
|
63
68
|
else
|
64
69
|
# Attached & Detached are "healthy" final states so reset the error reason
|
65
70
|
channel.clear_error_reason
|
66
71
|
end
|
67
72
|
end
|
68
73
|
|
69
|
-
def self.
|
70
|
-
|
74
|
+
def self.error_from_state_change(current_transition)
|
75
|
+
# ChannelStateChange object is always passed in current_transition metadata object
|
76
|
+
connection_state_change = current_transition.metadata
|
77
|
+
# Reason attribute contains errors
|
78
|
+
err = connection_state_change && connection_state_change.reason
|
79
|
+
err if is_error_type?(err)
|
71
80
|
end
|
72
81
|
|
73
82
|
private
|
@@ -68,10 +68,10 @@ module Ably::Realtime
|
|
68
68
|
|
69
69
|
when ACTION.Connect
|
70
70
|
when ACTION.Connected
|
71
|
-
connection.transition_state_machine :connected, protocol_message unless connection.connected?
|
71
|
+
connection.transition_state_machine :connected, reason: protocol_message.error, protocol_message: protocol_message unless connection.connected?
|
72
72
|
|
73
73
|
when ACTION.Disconnect, ACTION.Disconnected
|
74
|
-
connection.transition_state_machine :disconnected, protocol_message.error unless connection.disconnected?
|
74
|
+
connection.transition_state_machine :disconnected, reason: protocol_message.error unless connection.disconnected?
|
75
75
|
|
76
76
|
when ACTION.Close
|
77
77
|
when ACTION.Closed
|
@@ -87,7 +87,7 @@ module Ably::Realtime
|
|
87
87
|
when ACTION.Attach
|
88
88
|
when ACTION.Attached
|
89
89
|
get_channel(protocol_message.channel).tap do |channel|
|
90
|
-
channel.transition_state_machine :attached, protocol_message unless channel.attached?
|
90
|
+
channel.transition_state_machine :attached, reason: protocol_message.error, protocol_message: protocol_message unless channel.attached?
|
91
91
|
end
|
92
92
|
|
93
93
|
when ACTION.Detach
|
@@ -125,7 +125,7 @@ module Ably::Realtime
|
|
125
125
|
def dispatch_channel_error(protocol_message)
|
126
126
|
logger.warn "Channel Error message received: #{protocol_message.error}"
|
127
127
|
if !protocol_message.has_message_serial?
|
128
|
-
get_channel(protocol_message.channel).transition_state_machine :failed, protocol_message.error
|
128
|
+
get_channel(protocol_message.channel).transition_state_machine :failed, reason: protocol_message.error
|
129
129
|
else
|
130
130
|
logger.fatal "Cannot process ProtocolMessage as not yet implemented: #{protocol_message}"
|
131
131
|
end
|