ably 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/ably/auth.rb +23 -19
- data/lib/ably/models/token_details.rb +8 -6
- data/lib/ably/modules/conversions.rb +4 -0
- data/lib/ably/modules/state_emitter.rb +1 -1
- data/lib/ably/modules/uses_state_machine.rb +8 -1
- data/lib/ably/realtime/auth.rb +13 -13
- data/lib/ably/realtime/channel.rb +2 -2
- data/lib/ably/realtime/channel/channel_manager.rb +3 -3
- data/lib/ably/realtime/channel/channel_state_machine.rb +2 -1
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +13 -7
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +6 -0
- data/lib/ably/realtime/connection.rb +4 -4
- data/lib/ably/realtime/connection/connection_manager.rb +9 -3
- data/lib/ably/realtime/connection/connection_state_machine.rb +1 -1
- data/lib/ably/realtime/presence.rb +4 -4
- data/lib/ably/rest/client.rb +2 -2
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/auth_spec.rb +9 -9
- data/spec/acceptance/realtime/channel_history_spec.rb +2 -2
- data/spec/acceptance/realtime/channel_spec.rb +13 -12
- data/spec/acceptance/realtime/channels_spec.rb +6 -2
- data/spec/acceptance/realtime/client_spec.rb +4 -3
- data/spec/acceptance/realtime/connection_failures_spec.rb +21 -15
- data/spec/acceptance/realtime/connection_spec.rb +31 -27
- data/spec/acceptance/realtime/message_spec.rb +31 -24
- data/spec/acceptance/realtime/presence_history_spec.rb +2 -2
- data/spec/acceptance/realtime/presence_spec.rb +10 -11
- data/spec/acceptance/realtime/stats_spec.rb +1 -1
- data/spec/acceptance/realtime/time_spec.rb +1 -1
- data/spec/acceptance/rest/auth_spec.rb +77 -46
- data/spec/acceptance/rest/channel_spec.rb +22 -3
- data/spec/acceptance/rest/client_spec.rb +6 -6
- data/spec/acceptance/rest/presence_spec.rb +9 -7
- data/spec/support/event_machine_helper.rb +30 -4
- data/spec/support/protocol_helper.rb +9 -6
- data/spec/unit/auth_spec.rb +1 -1
- data/spec/unit/models/token_details_spec.rb +8 -0
- data/spec/unit/modules/async_wrapper_spec.rb +1 -1
- metadata +2 -2
@@ -39,7 +39,7 @@ module Ably::Realtime
|
|
39
39
|
|
40
40
|
EventMachine.next_tick do
|
41
41
|
# Connect once Connection object is initialised
|
42
|
-
connection.connect if client.auto_connect
|
42
|
+
connection.connect if client.auto_connect && connection.can_transition_to?(:connecting)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -89,7 +89,7 @@ module Ably::Realtime
|
|
89
89
|
# @api private
|
90
90
|
def connected(protocol_message)
|
91
91
|
if connection.key
|
92
|
-
if protocol_message.connection_key == connection.key
|
92
|
+
if connection_key_shared(protocol_message.connection_key) == connection_key_shared(connection.key)
|
93
93
|
logger.debug "ConnectionManager: Connection resumed successfully - ID #{connection.id} and key #{connection.key}"
|
94
94
|
EventMachine.next_tick { connection.resumed }
|
95
95
|
else
|
@@ -179,7 +179,7 @@ module Ably::Realtime
|
|
179
179
|
#
|
180
180
|
# @api private
|
181
181
|
def respond_to_transport_disconnected_whilst_connected(error)
|
182
|
-
logger.warn "ConnectionManager: Connection to #{connection.transport.url} was disconnected unexpectedly"
|
182
|
+
logger.warn "ConnectionManager: Connection #{"to #{connection.transport.url}" if connection.transport} was disconnected unexpectedly"
|
183
183
|
|
184
184
|
if error.kind_of?(Ably::Models::ErrorInfo) && error.code != RESOLVABLE_ERROR_CODES.fetch(:token_expired)
|
185
185
|
connection.emit :error, error
|
@@ -233,6 +233,12 @@ module Ably::Realtime
|
|
233
233
|
client.channels
|
234
234
|
end
|
235
235
|
|
236
|
+
# Connection key left part is consistent between connection resumes
|
237
|
+
# i.e. wVIsgTHAB1UvXh7z-1991d8586 becomes wVIsgTHAB1UvXh7z-1990d8586 after a resume
|
238
|
+
def connection_key_shared(connection_key)
|
239
|
+
(connection_key || '')[/^\w{5,}-/, 0]
|
240
|
+
end
|
241
|
+
|
236
242
|
# Create a timer that will execute in timeout_in seconds.
|
237
243
|
# If the connection state changes however, cancel the timer
|
238
244
|
def create_timeout_timer_whilst_in_state(timer_id, timeout_in)
|
@@ -57,7 +57,7 @@ module Ably::Realtime
|
|
57
57
|
connection.manager.respond_to_transport_disconnected_when_connecting err
|
58
58
|
end
|
59
59
|
|
60
|
-
after_transition(to: [:disconnected], from: [:connected]) do |connection, current_transition|
|
60
|
+
after_transition(to: [:disconnected, :suspended], from: [:connected]) do |connection, current_transition|
|
61
61
|
err = error_from_state_change(current_transition)
|
62
62
|
connection.manager.respond_to_transport_disconnected_whilst_connected err
|
63
63
|
end
|
@@ -405,7 +405,7 @@ module Ably::Realtime
|
|
405
405
|
deferrable_succeed deferrable, &success_block
|
406
406
|
end
|
407
407
|
|
408
|
-
protocol_message.errback do |
|
408
|
+
protocol_message.errback do |error|
|
409
409
|
change_state failed_state, error if failed_state
|
410
410
|
deferrable_fail deferrable, error
|
411
411
|
end
|
@@ -419,8 +419,8 @@ module Ably::Realtime
|
|
419
419
|
end
|
420
420
|
|
421
421
|
def deferrable_fail(deferrable, *args, &block)
|
422
|
-
safe_yield block,
|
423
|
-
EventMachine.next_tick { deferrable.fail
|
422
|
+
safe_yield block, *args if block_given?
|
423
|
+
EventMachine.next_tick { deferrable.fail *args } # allow errback to be added to the returned Deferrable
|
424
424
|
deferrable
|
425
425
|
end
|
426
426
|
|
@@ -431,7 +431,7 @@ module Ably::Realtime
|
|
431
431
|
ensure_channel_attached(deferrable) do
|
432
432
|
send_presence_protocol_message(action, client_id, options).tap do |protocol_message|
|
433
433
|
protocol_message.callback { |message| deferrable_succeed deferrable, &success_block }
|
434
|
-
protocol_message.errback { |
|
434
|
+
protocol_message.errback { |error| deferrable_fail deferrable, error }
|
435
435
|
end
|
436
436
|
end
|
437
437
|
end
|
data/lib/ably/rest/client.rb
CHANGED
@@ -144,7 +144,7 @@ module Ably
|
|
144
144
|
|
145
145
|
token_params = options.delete(:token_params) || {}
|
146
146
|
@options = options
|
147
|
-
@auth = Auth.new(self,
|
147
|
+
@auth = Auth.new(self, token_params, options)
|
148
148
|
@channels = Ably::Rest::Channels.new(self)
|
149
149
|
@encoders = []
|
150
150
|
|
@@ -358,7 +358,7 @@ module Ably
|
|
358
358
|
yield
|
359
359
|
rescue Ably::Exceptions::TokenExpired => e
|
360
360
|
if auth.token_renewable?
|
361
|
-
auth.authorise force: true
|
361
|
+
auth.authorise({}, force: true)
|
362
362
|
yield
|
363
363
|
else
|
364
364
|
raise e
|
data/lib/ably/version.rb
CHANGED
@@ -8,7 +8,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
8
8
|
vary_by_protocol do
|
9
9
|
let(:default_options) { { key: api_key, environment: environment, protocol: protocol } }
|
10
10
|
let(:client_options) { default_options }
|
11
|
-
let(:client) { Ably::Realtime::Client.new(client_options) }
|
11
|
+
let(:client) { auto_close Ably::Realtime::Client.new(client_options) }
|
12
12
|
let(:auth) { client.auth }
|
13
13
|
|
14
14
|
context 'with basic auth' do
|
@@ -101,7 +101,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
101
101
|
let(:auth_params) { { :body => random_str } }
|
102
102
|
|
103
103
|
it 'contains the configured auth options' do
|
104
|
-
auth.authorise(auth_url: auth_url, auth_params: auth_params) do
|
104
|
+
auth.authorise({}, auth_url: auth_url, auth_params: auth_params) do
|
105
105
|
expect(auth.options[:auth_url]).to eql(auth_url)
|
106
106
|
stop_reactor
|
107
107
|
end
|
@@ -112,7 +112,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
112
112
|
let(:custom_ttl) { 33 }
|
113
113
|
|
114
114
|
it 'contains the configured auth options' do
|
115
|
-
auth.authorise(
|
115
|
+
auth.authorise(ttl: custom_ttl) do
|
116
116
|
expect(auth.token_params[:ttl]).to eql(custom_ttl)
|
117
117
|
stop_reactor
|
118
118
|
end
|
@@ -144,7 +144,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
144
144
|
|
145
145
|
context '#create_token_request' do
|
146
146
|
it 'returns a token request asynchronously' do
|
147
|
-
auth.create_token_request(
|
147
|
+
auth.create_token_request(ttl: custom_ttl) do |token_request|
|
148
148
|
expect(token_request).to be_a(Ably::Models::TokenRequest)
|
149
149
|
expect(token_request.ttl).to eql(custom_ttl)
|
150
150
|
stop_reactor
|
@@ -154,7 +154,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
154
154
|
|
155
155
|
context '#create_token_request_async' do
|
156
156
|
it 'returns a token request synchronously' do
|
157
|
-
auth.create_token_request_sync(
|
157
|
+
auth.create_token_request_sync(ttl: custom_ttl).tap do |token_request|
|
158
158
|
expect(token_request).to be_a(Ably::Models::TokenRequest)
|
159
159
|
expect(token_request.ttl).to eql(custom_ttl)
|
160
160
|
stop_reactor
|
@@ -164,7 +164,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
164
164
|
|
165
165
|
context '#request_token' do
|
166
166
|
it 'returns a token asynchronously' do
|
167
|
-
auth.request_token(
|
167
|
+
auth.request_token(client_id: custom_client_id, ttl: custom_ttl) do |token_details|
|
168
168
|
expect(token_details).to be_a(Ably::Models::TokenDetails)
|
169
169
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
170
170
|
expect(token_details.client_id).to eql(custom_client_id)
|
@@ -175,7 +175,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
175
175
|
|
176
176
|
context '#request_token_async' do
|
177
177
|
it 'returns a token synchronously' do
|
178
|
-
auth.request_token_sync(
|
178
|
+
auth.request_token_sync(ttl: custom_ttl, client_id: custom_client_id).tap do |token_details|
|
179
179
|
expect(token_details).to be_a(Ably::Models::TokenDetails)
|
180
180
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
181
181
|
expect(token_details.client_id).to eql(custom_client_id)
|
@@ -186,7 +186,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
186
186
|
|
187
187
|
context '#authorise' do
|
188
188
|
it 'returns a token asynchronously' do
|
189
|
-
auth.authorise(
|
189
|
+
auth.authorise(ttl: custom_ttl, client_id: custom_client_id) do |token_details|
|
190
190
|
expect(token_details).to be_a(Ably::Models::TokenDetails)
|
191
191
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
192
192
|
expect(token_details.client_id).to eql(custom_client_id)
|
@@ -197,7 +197,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
197
197
|
|
198
198
|
context '#authorise_async' do
|
199
199
|
it 'returns a token synchronously' do
|
200
|
-
auth.authorise_sync(
|
200
|
+
auth.authorise_sync(ttl: custom_ttl, client_id: custom_client_id).tap do |token_details|
|
201
201
|
expect(auth.authorise_sync).to be_a(Ably::Models::TokenDetails)
|
202
202
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
203
203
|
expect(token_details.client_id).to eql(custom_client_id)
|
@@ -5,11 +5,11 @@ describe Ably::Realtime::Channel, '#history', :event_machine do
|
|
5
5
|
vary_by_protocol do
|
6
6
|
let(:default_options) { options.merge(key: api_key, environment: environment, protocol: protocol) }
|
7
7
|
|
8
|
-
let(:client) { Ably::Realtime::Client.new(default_options) }
|
8
|
+
let(:client) { auto_close Ably::Realtime::Client.new(default_options) }
|
9
9
|
let(:channel) { client.channel(channel_name) }
|
10
10
|
let(:rest_channel) { client.rest_client.channel(channel_name) }
|
11
11
|
|
12
|
-
let(:client2) { Ably::Realtime::Client.new(default_options) }
|
12
|
+
let(:client2) { auto_close Ably::Realtime::Client.new(default_options) }
|
13
13
|
let(:channel2) { client2.channel(channel_name) }
|
14
14
|
|
15
15
|
let(:channel_name) { "persisted:#{random_str(2)}" }
|
@@ -6,7 +6,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
6
6
|
let(:default_options) { { key: api_key, environment: environment, protocol: protocol } }
|
7
7
|
let(:client_options) { default_options }
|
8
8
|
|
9
|
-
let(:client) { Ably::Realtime::Client.new(client_options) }
|
9
|
+
let(:client) { auto_close Ably::Realtime::Client.new(client_options) }
|
10
10
|
let(:channel_name) { random_str }
|
11
11
|
let(:payload) { random_str }
|
12
12
|
let(:channel) { client.channel(channel_name) }
|
@@ -15,7 +15,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
15
15
|
describe 'initialization' do
|
16
16
|
context 'with :auto_connect option set to false on connection' do
|
17
17
|
let(:client) do
|
18
|
-
Ably::Realtime::Client.new(default_options.merge(auto_connect: false))
|
18
|
+
auto_close Ably::Realtime::Client.new(default_options.merge(auto_connect: false))
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'remains initialized when accessing a channel' do
|
@@ -80,7 +80,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'calls the SafeDeferrable callback on success' do
|
83
|
-
channel.attach.callback do
|
83
|
+
channel.attach.callback do
|
84
84
|
expect(channel).to be_a(Ably::Realtime::Channel)
|
85
85
|
expect(channel.state).to eq(:attached)
|
86
86
|
stop_reactor
|
@@ -131,7 +131,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
131
131
|
|
132
132
|
it 'attaches all channels', em_timeout: 15 do
|
133
133
|
connection_count.times.map do
|
134
|
-
Ably::Realtime::Client.new(default_options)
|
134
|
+
auto_close Ably::Realtime::Client.new(default_options)
|
135
135
|
end.each do |client|
|
136
136
|
channel_count.times.map do |index|
|
137
137
|
client.channel("channel-#{index}").attach do
|
@@ -148,7 +148,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
148
148
|
|
149
149
|
context 'failure as a result of insufficient key permissions' do
|
150
150
|
let(:restricted_client) do
|
151
|
-
Ably::Realtime::Client.new(default_options.merge(key: restricted_api_key, log_level: :fatal))
|
151
|
+
auto_close Ably::Realtime::Client.new(default_options.merge(key: restricted_api_key, log_level: :fatal))
|
152
152
|
end
|
153
153
|
let(:restricted_channel) { restricted_client.channel("cannot_subscribe") }
|
154
154
|
|
@@ -162,7 +162,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
162
162
|
end
|
163
163
|
|
164
164
|
it 'calls the errback of the returned Deferrable' do
|
165
|
-
restricted_channel.attach.errback do |
|
165
|
+
restricted_channel.attach.errback do |error|
|
166
166
|
expect(restricted_channel.state).to eq(:failed)
|
167
167
|
expect(error.status).to eq(401)
|
168
168
|
stop_reactor
|
@@ -192,7 +192,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
192
192
|
restricted_channel.once(:failed) do
|
193
193
|
restricted_client.close do
|
194
194
|
# A direct call to #authorise is synchronous
|
195
|
-
restricted_client.auth.authorise(key: api_key)
|
195
|
+
restricted_client.auth.authorise({}, key: api_key)
|
196
196
|
|
197
197
|
restricted_client.connect do
|
198
198
|
restricted_channel.once(:attached) do
|
@@ -220,9 +220,10 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
220
220
|
end
|
221
221
|
|
222
222
|
it 'detaches from a channel and calls the provided block' do
|
223
|
-
channel.attach do
|
224
|
-
|
225
|
-
|
223
|
+
channel.attach do
|
224
|
+
expect(channel.state).to eq(:attached)
|
225
|
+
channel.detach do
|
226
|
+
expect(channel.state).to eq(:detached)
|
226
227
|
stop_reactor
|
227
228
|
end
|
228
229
|
end
|
@@ -249,7 +250,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
249
250
|
|
250
251
|
it 'calls the Deferrable callback on success' do
|
251
252
|
channel.attach do
|
252
|
-
channel.detach.callback do
|
253
|
+
channel.detach.callback do
|
253
254
|
expect(channel).to be_a(Ably::Realtime::Channel)
|
254
255
|
expect(channel.state).to eq(:detached)
|
255
256
|
stop_reactor
|
@@ -563,7 +564,7 @@ describe Ably::Realtime::Channel, :event_machine do
|
|
563
564
|
|
564
565
|
it 'publishes all messages, all success callbacks are called, and a history request confirms all messages were published' do
|
565
566
|
connection_count.times.map do
|
566
|
-
Ably::Realtime::Client.new(client_options)
|
567
|
+
auto_close Ably::Realtime::Client.new(client_options)
|
567
568
|
end.each do |client|
|
568
569
|
channel = client.channels.get(channel_name)
|
569
570
|
messages.each do |message|
|
@@ -1,21 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
describe Ably::Realtime::Channels do
|
4
|
+
describe Ably::Realtime::Channels, :event_machine do
|
5
5
|
shared_examples 'a channel' do
|
6
6
|
it 'returns a channel object' do
|
7
7
|
expect(channel).to be_a Ably::Realtime::Channel
|
8
8
|
expect(channel.name).to eql(channel_name)
|
9
|
+
stop_reactor
|
9
10
|
end
|
10
11
|
|
11
12
|
it 'returns channel object and passes the provided options' do
|
12
13
|
expect(channel_with_options.options).to eql(options)
|
14
|
+
stop_reactor
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
vary_by_protocol do
|
17
19
|
let(:client) do
|
18
|
-
Ably::Realtime::Client.new(key: api_key, environment: environment, protocol: protocol)
|
20
|
+
auto_close Ably::Realtime::Client.new(key: api_key, environment: environment, protocol: protocol)
|
19
21
|
end
|
20
22
|
let(:channel_name) { random_str }
|
21
23
|
let(:options) { { key: 'value' } }
|
@@ -41,6 +43,7 @@ describe Ably::Realtime::Channels do
|
|
41
43
|
new_channel = client.channels.get(channel_name, new_channel_options)
|
42
44
|
expect(new_channel).to be_a(Ably::Realtime::Channel)
|
43
45
|
expect(new_channel.options[:encrypted]).to eql(true)
|
46
|
+
stop_reactor
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
@@ -52,6 +55,7 @@ describe Ably::Realtime::Channels do
|
|
52
55
|
new_channel = client.channels.get(channel_name)
|
53
56
|
expect(new_channel).to be_a(Ably::Realtime::Channel)
|
54
57
|
expect(original_channel.options).to eql(options)
|
58
|
+
stop_reactor
|
55
59
|
end
|
56
60
|
end
|
57
61
|
|
@@ -11,7 +11,7 @@ describe Ably::Realtime::Client, :event_machine do
|
|
11
11
|
let(:connection) { subject.connection }
|
12
12
|
let(:auth_params) { subject.auth.auth_params_sync }
|
13
13
|
|
14
|
-
subject { Ably::Realtime::Client.new(client_options) }
|
14
|
+
subject { auto_close Ably::Realtime::Client.new(client_options) }
|
15
15
|
|
16
16
|
context 'initialization' do
|
17
17
|
context 'basic auth' do
|
@@ -44,7 +44,8 @@ describe Ably::Realtime::Client, :event_machine do
|
|
44
44
|
[true, false].each do |tls_enabled|
|
45
45
|
context "with TLS #{tls_enabled ? 'enabled' : 'disabled'}" do
|
46
46
|
let(:capability) { { :foo => ["publish"] } }
|
47
|
-
let(:
|
47
|
+
let(:token_client) { auto_close Ably::Realtime::Client.new(default_options) }
|
48
|
+
let(:token_details) { token_client.auth.request_token_sync(capability: capability) }
|
48
49
|
let(:client_options) { default_options.merge(token: token_details.token) }
|
49
50
|
|
50
51
|
context 'and a pre-generated Token provided with the :token option' do
|
@@ -93,7 +94,7 @@ describe Ably::Realtime::Client, :event_machine do
|
|
93
94
|
let(:auth) { subject.auth }
|
94
95
|
|
95
96
|
subject do
|
96
|
-
Ably::Realtime::Client.new(client_options.merge(auth_callback: Proc.new do
|
97
|
+
auto_close Ably::Realtime::Client.new(client_options.merge(auth_callback: Proc.new do
|
97
98
|
@block_called = true
|
98
99
|
auth.create_token_request_sync(client_id: client_id)
|
99
100
|
end))
|
@@ -11,7 +11,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
11
11
|
|
12
12
|
let(:client_options) { default_options }
|
13
13
|
let(:client) do
|
14
|
-
Ably::Realtime::Client.new(client_options)
|
14
|
+
auto_close Ably::Realtime::Client.new(client_options)
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'authentication failure' do
|
@@ -281,7 +281,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
281
281
|
let(:channel_name) { random_str }
|
282
282
|
let(:channel) { client.channel(channel_name) }
|
283
283
|
let(:publishing_client) do
|
284
|
-
Ably::Realtime::Client.new(client_options)
|
284
|
+
auto_close Ably::Realtime::Client.new(client_options)
|
285
285
|
end
|
286
286
|
let(:publishing_client_channel) { publishing_client.channel(channel_name) }
|
287
287
|
let(:client_options) { default_options.merge(log_level: :none) }
|
@@ -392,7 +392,10 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
392
392
|
connection.transport.close_connection_after_writing
|
393
393
|
|
394
394
|
connection.once(:connected) do
|
395
|
-
|
395
|
+
# Connection key left part should match new connection key left part i.e.
|
396
|
+
# wVIsgTHAB1UvXh7z-1991d8586 becomes wVIsgTHAB1UvXh7z-1990d8586 after resume
|
397
|
+
expect(connection.key[/^\w{5,}-/, 0]).to_not be_nil
|
398
|
+
expect(connection.key[/^\w{5,}-/, 0]).to eql(previous_connection_key[/^\w{5,}-/, 0])
|
396
399
|
expect(connection.id).to eql(previous_connection_id)
|
397
400
|
stop_reactor
|
398
401
|
end
|
@@ -465,9 +468,11 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
465
468
|
|
466
469
|
context 'when failing to resume' do
|
467
470
|
context 'because the connection_key is not or no longer valid' do
|
471
|
+
let(:channel) { client.channel(random_str) }
|
472
|
+
|
468
473
|
def kill_connection_transport_and_prevent_valid_resume
|
469
474
|
connection.transport.close_connection_after_writing
|
470
|
-
connection.configure_new '0123456789abcdef', '
|
475
|
+
connection.configure_new '0123456789abcdef', 'wVIsgTHAB1UvXh7z-1991d8586', -1 # force the resume connection key to be invalid
|
471
476
|
end
|
472
477
|
|
473
478
|
it 'updates the connection_id and connection_key' do
|
@@ -493,7 +498,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
493
498
|
channels.each do |channel|
|
494
499
|
channel.on(:detached) do |channel_state_change|
|
495
500
|
error = channel_state_change.reason
|
496
|
-
expect(error.message).to match(/
|
501
|
+
expect(error.message).to match(/Unable to recover connection/i)
|
497
502
|
detached_channels << channel
|
498
503
|
next unless detached_channels.count == channel_count
|
499
504
|
expect(detached_channels.count).to eql(channel_count)
|
@@ -506,16 +511,16 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
506
511
|
end
|
507
512
|
|
508
513
|
it 'emits an error on the channel and sets the error reason' do
|
509
|
-
|
510
|
-
channel.on(:error) do |error|
|
511
|
-
expect(error.message).to match(/Invalid connection key/i)
|
512
|
-
expect(error.code).to eql(80008)
|
513
|
-
expect(channel.error_reason).to eql(error)
|
514
|
-
stop_reactor
|
515
|
-
end
|
516
|
-
|
514
|
+
channel.attach do
|
517
515
|
kill_connection_transport_and_prevent_valid_resume
|
518
516
|
end
|
517
|
+
|
518
|
+
channel.on(:error) do |error|
|
519
|
+
expect(error.message).to match(/Unable to recover connection/i)
|
520
|
+
expect(error.code).to eql(80008)
|
521
|
+
expect(channel.error_reason).to eql(error)
|
522
|
+
stop_reactor
|
523
|
+
end
|
519
524
|
end
|
520
525
|
end
|
521
526
|
end
|
@@ -624,11 +629,11 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
624
629
|
|
625
630
|
it 'uses a fallback host on every subsequent disconnected attempt until suspended' do
|
626
631
|
request = 0
|
627
|
-
|
632
|
+
# Expect retry attempts + 1 attempt for the next state
|
633
|
+
expect(EventMachine).to receive(:connect).exactly(retry_count_for_one_state + 1).times do |host|
|
628
634
|
if request == 0
|
629
635
|
expect(host).to eql(expected_host)
|
630
636
|
else
|
631
|
-
expect(custom_hosts).to include(host)
|
632
637
|
fallback_hosts_used << host
|
633
638
|
end
|
634
639
|
request += 1
|
@@ -636,6 +641,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
636
641
|
end
|
637
642
|
|
638
643
|
connection.on(:suspended) do
|
644
|
+
fallback_hosts_used.pop # remove suspended attempt host
|
639
645
|
expect(fallback_hosts_used.uniq).to match_array(custom_hosts)
|
640
646
|
stop_reactor
|
641
647
|
end
|