ably 0.8.15 → 1.0.0
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/.travis.yml +6 -4
- data/CHANGELOG.md +6 -2
- data/README.md +5 -1
- data/SPEC.md +1473 -852
- data/ably.gemspec +11 -8
- data/lib/ably/auth.rb +90 -53
- data/lib/ably/exceptions.rb +37 -8
- data/lib/ably/logger.rb +10 -1
- data/lib/ably/models/auth_details.rb +42 -0
- data/lib/ably/models/channel_state_change.rb +18 -4
- data/lib/ably/models/connection_details.rb +6 -3
- data/lib/ably/models/connection_state_change.rb +4 -3
- data/lib/ably/models/error_info.rb +1 -1
- data/lib/ably/models/message.rb +17 -1
- data/lib/ably/models/message_encoders/base.rb +103 -82
- data/lib/ably/models/message_encoders/base64.rb +1 -1
- data/lib/ably/models/presence_message.rb +16 -1
- data/lib/ably/models/protocol_message.rb +20 -3
- data/lib/ably/models/token_details.rb +11 -1
- data/lib/ably/models/token_request.rb +16 -6
- data/lib/ably/modules/async_wrapper.rb +7 -3
- data/lib/ably/modules/encodeable.rb +51 -12
- data/lib/ably/modules/enum.rb +17 -7
- data/lib/ably/modules/event_emitter.rb +29 -14
- data/lib/ably/modules/model_common.rb +13 -21
- data/lib/ably/modules/state_emitter.rb +7 -4
- data/lib/ably/modules/state_machine.rb +2 -4
- data/lib/ably/modules/uses_state_machine.rb +7 -3
- data/lib/ably/realtime.rb +2 -0
- data/lib/ably/realtime/auth.rb +102 -42
- data/lib/ably/realtime/channel.rb +68 -26
- data/lib/ably/realtime/channel/channel_manager.rb +154 -65
- data/lib/ably/realtime/channel/channel_state_machine.rb +14 -15
- data/lib/ably/realtime/client.rb +18 -3
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +38 -29
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +6 -1
- data/lib/ably/realtime/connection.rb +108 -49
- data/lib/ably/realtime/connection/connection_manager.rb +167 -61
- data/lib/ably/realtime/connection/connection_state_machine.rb +22 -3
- data/lib/ably/realtime/connection/websocket_transport.rb +19 -10
- data/lib/ably/realtime/presence.rb +70 -45
- data/lib/ably/realtime/presence/members_map.rb +201 -36
- data/lib/ably/realtime/presence/presence_manager.rb +30 -6
- data/lib/ably/realtime/presence/presence_state_machine.rb +5 -12
- data/lib/ably/rest.rb +2 -2
- data/lib/ably/rest/channel.rb +5 -5
- data/lib/ably/rest/client.rb +31 -27
- data/lib/ably/rest/middleware/exceptions.rb +1 -3
- data/lib/ably/rest/middleware/logger.rb +2 -2
- data/lib/ably/rest/presence.rb +2 -2
- data/lib/ably/util/pub_sub.rb +1 -1
- data/lib/ably/util/safe_deferrable.rb +26 -0
- data/lib/ably/version.rb +2 -2
- data/spec/acceptance/realtime/auth_spec.rb +470 -111
- data/spec/acceptance/realtime/channel_history_spec.rb +5 -3
- data/spec/acceptance/realtime/channel_spec.rb +1017 -168
- data/spec/acceptance/realtime/client_spec.rb +6 -6
- data/spec/acceptance/realtime/connection_failures_spec.rb +458 -27
- data/spec/acceptance/realtime/connection_spec.rb +424 -105
- data/spec/acceptance/realtime/message_spec.rb +52 -23
- data/spec/acceptance/realtime/presence_history_spec.rb +5 -3
- data/spec/acceptance/realtime/presence_spec.rb +1110 -96
- data/spec/acceptance/rest/auth_spec.rb +222 -59
- data/spec/acceptance/rest/base_spec.rb +1 -1
- data/spec/acceptance/rest/channel_spec.rb +1 -2
- data/spec/acceptance/rest/client_spec.rb +104 -48
- data/spec/acceptance/rest/message_spec.rb +42 -15
- data/spec/acceptance/rest/presence_spec.rb +4 -11
- data/spec/rspec_config.rb +2 -1
- data/spec/shared/client_initializer_behaviour.rb +2 -2
- data/spec/shared/safe_deferrable_behaviour.rb +6 -2
- data/spec/spec_helper.rb +4 -2
- data/spec/support/debug_failure_helper.rb +20 -4
- data/spec/support/event_machine_helper.rb +32 -1
- data/spec/unit/auth_spec.rb +4 -11
- data/spec/unit/logger_spec.rb +28 -2
- data/spec/unit/models/auth_details_spec.rb +49 -0
- data/spec/unit/models/channel_state_change_spec.rb +23 -3
- data/spec/unit/models/connection_details_spec.rb +12 -1
- data/spec/unit/models/connection_state_change_spec.rb +15 -4
- data/spec/unit/models/message_encoders/base64_spec.rb +2 -1
- data/spec/unit/models/message_spec.rb +153 -0
- data/spec/unit/models/presence_message_spec.rb +192 -0
- data/spec/unit/models/protocol_message_spec.rb +64 -6
- data/spec/unit/models/token_details_spec.rb +75 -0
- data/spec/unit/models/token_request_spec.rb +74 -0
- data/spec/unit/modules/async_wrapper_spec.rb +2 -1
- data/spec/unit/modules/enum_spec.rb +69 -0
- data/spec/unit/modules/event_emitter_spec.rb +149 -22
- data/spec/unit/modules/state_emitter_spec.rb +9 -3
- data/spec/unit/realtime/client_spec.rb +1 -1
- data/spec/unit/realtime/connection_spec.rb +8 -5
- data/spec/unit/realtime/incoming_message_dispatcher_spec.rb +1 -1
- data/spec/unit/realtime/presence_spec.rb +4 -3
- data/spec/unit/rest/client_spec.rb +1 -1
- data/spec/unit/util/crypto_spec.rb +3 -3
- metadata +22 -19
@@ -269,14 +269,18 @@ describe Ably::Modules::StateEmitter do
|
|
269
269
|
|
270
270
|
context 'success block' do
|
271
271
|
it 'catches exceptions in the provided block, logs the error and continues' do
|
272
|
-
expect(subject.logger).to receive(:error)
|
272
|
+
expect(subject.logger).to receive(:error) do |*args, &block|
|
273
|
+
expect(args.concat([block ? block.call : nil]).join(',')).to match(/Success exception/)
|
274
|
+
end
|
273
275
|
subject.change_state target_state
|
274
276
|
end
|
275
277
|
end
|
276
278
|
|
277
279
|
context 'failure block' do
|
278
280
|
it 'catches exceptions in the provided block, logs the error and continues' do
|
279
|
-
expect(subject.logger).to receive(:error)
|
281
|
+
expect(subject.logger).to receive(:error) do |*args, &block|
|
282
|
+
expect(args.concat([block ? block.call : nil]).join(',')).to match(/Failure exception/)
|
283
|
+
end
|
280
284
|
subject.change_state :connecting
|
281
285
|
end
|
282
286
|
end
|
@@ -343,7 +347,9 @@ describe Ably::Modules::StateEmitter do
|
|
343
347
|
|
344
348
|
it 'catches exceptions in the provided block, logs the error and continues' do
|
345
349
|
subject.once_state_changed { raise 'Intentional exception' }
|
346
|
-
expect(subject.logger).to receive(:error)
|
350
|
+
expect(subject.logger).to receive(:error) do |*args, &block|
|
351
|
+
expect(args.concat([block ? block.call : nil]).join(',')).to match(/Intentional exception/)
|
352
|
+
end
|
347
353
|
subject.change_state :connected
|
348
354
|
end
|
349
355
|
end
|
@@ -14,7 +14,7 @@ describe Ably::Realtime::Client do
|
|
14
14
|
|
15
15
|
it 'passes on the options to the initializer' do
|
16
16
|
rest_client = instance_double('Ably::Rest::Client', auth: instance_double('Ably::Auth'), options: client_options)
|
17
|
-
expect(Ably::Rest::Client).to receive(:new).with(client_options).and_return(rest_client)
|
17
|
+
expect(Ably::Rest::Client).to receive(:new).with(hash_including(client_options)).and_return(rest_client)
|
18
18
|
subject
|
19
19
|
end
|
20
20
|
|
@@ -5,7 +5,10 @@ describe Ably::Realtime::Connection do
|
|
5
5
|
let(:client) { instance_double('Ably::Realtime::Client', logger: double('logger').as_null_object) }
|
6
6
|
|
7
7
|
subject do
|
8
|
-
Ably::Realtime::Connection.new(client, {})
|
8
|
+
Ably::Realtime::Connection.new(client, {}).tap do |connection|
|
9
|
+
connection.__incoming_protocol_msgbus__.unsubscribe
|
10
|
+
connection.__outgoing_protocol_msgbus__.unsubscribe
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
before do
|
@@ -34,10 +37,10 @@ describe Ably::Realtime::Connection do
|
|
34
37
|
describe 'connection resume callbacks', api_private: true do
|
35
38
|
let(:callbacks) { [] }
|
36
39
|
|
37
|
-
describe '#
|
40
|
+
describe '#trigger_resumed' do
|
38
41
|
it 'executes the callbacks' do
|
39
42
|
subject.on_resume { callbacks << true }
|
40
|
-
subject.
|
43
|
+
subject.trigger_resumed
|
41
44
|
expect(callbacks.count).to eql(1)
|
42
45
|
end
|
43
46
|
end
|
@@ -45,7 +48,7 @@ describe Ably::Realtime::Connection do
|
|
45
48
|
describe '#on_resume' do
|
46
49
|
it 'registers a callback' do
|
47
50
|
subject.on_resume { callbacks << true }
|
48
|
-
subject.
|
51
|
+
subject.trigger_resumed
|
49
52
|
expect(callbacks.count).to eql(1)
|
50
53
|
end
|
51
54
|
end
|
@@ -55,7 +58,7 @@ describe Ably::Realtime::Connection do
|
|
55
58
|
subject.on_resume { callbacks << true }
|
56
59
|
additional_proc = proc { raise 'This should not be called' }
|
57
60
|
subject.off_resume(&additional_proc)
|
58
|
-
subject.
|
61
|
+
subject.trigger_resumed
|
59
62
|
expect(callbacks.count).to eql(1)
|
60
63
|
end
|
61
64
|
end
|
@@ -5,7 +5,7 @@ describe Ably::Realtime::Client::IncomingMessageDispatcher, :api_private do
|
|
5
5
|
Ably::Util::PubSub.new
|
6
6
|
end
|
7
7
|
let(:connection) do
|
8
|
-
instance_double('Ably::Realtime::Connection', __incoming_protocol_msgbus__: msgbus, configure_new: true, id: nil)
|
8
|
+
instance_double('Ably::Realtime::Connection', __incoming_protocol_msgbus__: msgbus, configure_new: true, id: nil, set_connection_confirmed_alive: nil)
|
9
9
|
end
|
10
10
|
let(:client) do
|
11
11
|
instance_double('Ably::Realtime::Client', channels: {})
|
@@ -48,14 +48,15 @@ describe Ably::Realtime::Presence do
|
|
48
48
|
context 'subscriptions' do
|
49
49
|
let(:message_history) { Hash.new { |hash, key| hash[key] = 0 } }
|
50
50
|
let(:enter_action) { Ably::Models::PresenceMessage::ACTION.Enter }
|
51
|
+
let(:clone) { instance_double('Ably::Models::PresenceMessage', member_key: random_str, connection_id: random_str) }
|
51
52
|
let(:enter_message) do
|
52
|
-
instance_double('Ably::Models::PresenceMessage', action: enter_action, connection_id: random_str, decode: true, member_key: random_str,
|
53
|
+
instance_double('Ably::Models::PresenceMessage', action: enter_action, connection_id: random_str, decode: true, member_key: random_str, shallow_clone: clone)
|
53
54
|
end
|
54
55
|
let(:leave_message) do
|
55
|
-
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Leave, connection_id: random_str, decode: true, member_key: random_str,
|
56
|
+
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Leave, connection_id: random_str, decode: true, member_key: random_str, shallow_clone: clone)
|
56
57
|
end
|
57
58
|
let(:update_message) do
|
58
|
-
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Update, connection_id: random_str, decode: true, member_key: random_str,
|
59
|
+
instance_double('Ably::Models::PresenceMessage', action: Ably::Models::PresenceMessage::ACTION.Update, connection_id: random_str, decode: true, member_key: random_str, shallow_clone: clone)
|
59
60
|
end
|
60
61
|
|
61
62
|
context '#subscribe' do
|
@@ -14,7 +14,7 @@ describe Ably::Rest::Client do
|
|
14
14
|
context 'disabled' do
|
15
15
|
let(:client_options) { { key: 'appid.keyuid:keysecret', tls: false } }
|
16
16
|
|
17
|
-
it 'fails for any operation with basic auth and attempting to send an API key over a non-secure connection' do
|
17
|
+
it 'fails for any operation with basic auth and attempting to send an API key over a non-secure connection (#RSA1)' do
|
18
18
|
expect { subject.channel('a').publish('event', 'message') }.to raise_error(Ably::Exceptions::InsecureRequest)
|
19
19
|
end
|
20
20
|
end
|
@@ -100,7 +100,7 @@ describe Ably::Util::Crypto do
|
|
100
100
|
let(:encryption_data_128) { JSON.parse(File.read(File.join(resources_root, 'crypto-data-128.json'))) }
|
101
101
|
let(:encryption_data_256) { JSON.parse(File.read(File.join(resources_root, 'crypto-data-256.json'))) }
|
102
102
|
|
103
|
-
shared_examples 'an Ably encrypter and decrypter' do
|
103
|
+
shared_examples 'an Ably encrypter and decrypter (#RTL7d)' do
|
104
104
|
let(:algorithm) { data['algorithm'].upcase }
|
105
105
|
let(:mode) { data['mode'].upcase }
|
106
106
|
let(:key_length) { data['keylength'] }
|
@@ -126,13 +126,13 @@ describe Ably::Util::Crypto do
|
|
126
126
|
context 'with AES-128-CBC' do
|
127
127
|
let(:data) { encryption_data_128 }
|
128
128
|
|
129
|
-
it_behaves_like 'an Ably encrypter and decrypter'
|
129
|
+
it_behaves_like 'an Ably encrypter and decrypter (#RTL7d)'
|
130
130
|
end
|
131
131
|
|
132
132
|
context 'with AES-256-CBC' do
|
133
133
|
let(:data) { encryption_data_256 }
|
134
134
|
|
135
|
-
it_behaves_like 'an Ably encrypter and decrypter'
|
135
|
+
it_behaves_like 'an Ably encrypter and decrypter (#RTL7d)'
|
136
136
|
end
|
137
137
|
end
|
138
138
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ably
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lewis Marshall
|
@@ -141,30 +141,30 @@ dependencies:
|
|
141
141
|
name: rake
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
|
-
- - "
|
144
|
+
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
146
|
+
version: '11.3'
|
147
147
|
type: :development
|
148
148
|
prerelease: false
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
|
-
- - "
|
151
|
+
- - "~>"
|
152
152
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
153
|
+
version: '11.3'
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
155
|
name: redcarpet
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
157
157
|
requirements:
|
158
|
-
- - "
|
158
|
+
- - "~>"
|
159
159
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
160
|
+
version: '3.3'
|
161
161
|
type: :development
|
162
162
|
prerelease: false
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
|
-
- - "
|
165
|
+
- - "~>"
|
166
166
|
- !ruby/object:Gem::Version
|
167
|
-
version: '
|
167
|
+
version: '3.3'
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
169
|
name: rspec
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,44 +183,44 @@ dependencies:
|
|
183
183
|
name: rspec-retry
|
184
184
|
requirement: !ruby/object:Gem::Requirement
|
185
185
|
requirements:
|
186
|
-
- - "
|
186
|
+
- - "~>"
|
187
187
|
- !ruby/object:Gem::Version
|
188
|
-
version: '0'
|
188
|
+
version: '0.4'
|
189
189
|
type: :development
|
190
190
|
prerelease: false
|
191
191
|
version_requirements: !ruby/object:Gem::Requirement
|
192
192
|
requirements:
|
193
|
-
- - "
|
193
|
+
- - "~>"
|
194
194
|
- !ruby/object:Gem::Version
|
195
|
-
version: '0'
|
195
|
+
version: '0.4'
|
196
196
|
- !ruby/object:Gem::Dependency
|
197
197
|
name: yard
|
198
198
|
requirement: !ruby/object:Gem::Requirement
|
199
199
|
requirements:
|
200
|
-
- - "
|
200
|
+
- - "~>"
|
201
201
|
- !ruby/object:Gem::Version
|
202
|
-
version: '0'
|
202
|
+
version: '0.9'
|
203
203
|
type: :development
|
204
204
|
prerelease: false
|
205
205
|
version_requirements: !ruby/object:Gem::Requirement
|
206
206
|
requirements:
|
207
|
-
- - "
|
207
|
+
- - "~>"
|
208
208
|
- !ruby/object:Gem::Version
|
209
|
-
version: '0'
|
209
|
+
version: '0.9'
|
210
210
|
- !ruby/object:Gem::Dependency
|
211
211
|
name: webmock
|
212
212
|
requirement: !ruby/object:Gem::Requirement
|
213
213
|
requirements:
|
214
214
|
- - "~>"
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version: 2.
|
216
|
+
version: '2.2'
|
217
217
|
type: :development
|
218
218
|
prerelease: false
|
219
219
|
version_requirements: !ruby/object:Gem::Requirement
|
220
220
|
requirements:
|
221
221
|
- - "~>"
|
222
222
|
- !ruby/object:Gem::Version
|
223
|
-
version: 2.
|
223
|
+
version: '2.2'
|
224
224
|
- !ruby/object:Gem::Dependency
|
225
225
|
name: coveralls
|
226
226
|
requirement: !ruby/object:Gem::Requirement
|
@@ -286,6 +286,7 @@ files:
|
|
286
286
|
- lib/ably/auth.rb
|
287
287
|
- lib/ably/exceptions.rb
|
288
288
|
- lib/ably/logger.rb
|
289
|
+
- lib/ably/models/auth_details.rb
|
289
290
|
- lib/ably/models/channel_state_change.rb
|
290
291
|
- lib/ably/models/cipher_params.rb
|
291
292
|
- lib/ably/models/connection_details.rb
|
@@ -398,6 +399,7 @@ files:
|
|
398
399
|
- spec/support/test_app.rb
|
399
400
|
- spec/unit/auth_spec.rb
|
400
401
|
- spec/unit/logger_spec.rb
|
402
|
+
- spec/unit/models/auth_details_spec.rb
|
401
403
|
- spec/unit/models/channel_state_change_spec.rb
|
402
404
|
- spec/unit/models/cipher_params_spec.rb
|
403
405
|
- spec/unit/models/connection_details_spec.rb
|
@@ -500,6 +502,7 @@ test_files:
|
|
500
502
|
- spec/support/test_app.rb
|
501
503
|
- spec/unit/auth_spec.rb
|
502
504
|
- spec/unit/logger_spec.rb
|
505
|
+
- spec/unit/models/auth_details_spec.rb
|
503
506
|
- spec/unit/models/channel_state_change_spec.rb
|
504
507
|
- spec/unit/models/cipher_params_spec.rb
|
505
508
|
- spec/unit/models/connection_details_spec.rb
|