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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -4
  3. data/CHANGELOG.md +6 -2
  4. data/README.md +5 -1
  5. data/SPEC.md +1473 -852
  6. data/ably.gemspec +11 -8
  7. data/lib/ably/auth.rb +90 -53
  8. data/lib/ably/exceptions.rb +37 -8
  9. data/lib/ably/logger.rb +10 -1
  10. data/lib/ably/models/auth_details.rb +42 -0
  11. data/lib/ably/models/channel_state_change.rb +18 -4
  12. data/lib/ably/models/connection_details.rb +6 -3
  13. data/lib/ably/models/connection_state_change.rb +4 -3
  14. data/lib/ably/models/error_info.rb +1 -1
  15. data/lib/ably/models/message.rb +17 -1
  16. data/lib/ably/models/message_encoders/base.rb +103 -82
  17. data/lib/ably/models/message_encoders/base64.rb +1 -1
  18. data/lib/ably/models/presence_message.rb +16 -1
  19. data/lib/ably/models/protocol_message.rb +20 -3
  20. data/lib/ably/models/token_details.rb +11 -1
  21. data/lib/ably/models/token_request.rb +16 -6
  22. data/lib/ably/modules/async_wrapper.rb +7 -3
  23. data/lib/ably/modules/encodeable.rb +51 -12
  24. data/lib/ably/modules/enum.rb +17 -7
  25. data/lib/ably/modules/event_emitter.rb +29 -14
  26. data/lib/ably/modules/model_common.rb +13 -21
  27. data/lib/ably/modules/state_emitter.rb +7 -4
  28. data/lib/ably/modules/state_machine.rb +2 -4
  29. data/lib/ably/modules/uses_state_machine.rb +7 -3
  30. data/lib/ably/realtime.rb +2 -0
  31. data/lib/ably/realtime/auth.rb +102 -42
  32. data/lib/ably/realtime/channel.rb +68 -26
  33. data/lib/ably/realtime/channel/channel_manager.rb +154 -65
  34. data/lib/ably/realtime/channel/channel_state_machine.rb +14 -15
  35. data/lib/ably/realtime/client.rb +18 -3
  36. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +38 -29
  37. data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +6 -1
  38. data/lib/ably/realtime/connection.rb +108 -49
  39. data/lib/ably/realtime/connection/connection_manager.rb +167 -61
  40. data/lib/ably/realtime/connection/connection_state_machine.rb +22 -3
  41. data/lib/ably/realtime/connection/websocket_transport.rb +19 -10
  42. data/lib/ably/realtime/presence.rb +70 -45
  43. data/lib/ably/realtime/presence/members_map.rb +201 -36
  44. data/lib/ably/realtime/presence/presence_manager.rb +30 -6
  45. data/lib/ably/realtime/presence/presence_state_machine.rb +5 -12
  46. data/lib/ably/rest.rb +2 -2
  47. data/lib/ably/rest/channel.rb +5 -5
  48. data/lib/ably/rest/client.rb +31 -27
  49. data/lib/ably/rest/middleware/exceptions.rb +1 -3
  50. data/lib/ably/rest/middleware/logger.rb +2 -2
  51. data/lib/ably/rest/presence.rb +2 -2
  52. data/lib/ably/util/pub_sub.rb +1 -1
  53. data/lib/ably/util/safe_deferrable.rb +26 -0
  54. data/lib/ably/version.rb +2 -2
  55. data/spec/acceptance/realtime/auth_spec.rb +470 -111
  56. data/spec/acceptance/realtime/channel_history_spec.rb +5 -3
  57. data/spec/acceptance/realtime/channel_spec.rb +1017 -168
  58. data/spec/acceptance/realtime/client_spec.rb +6 -6
  59. data/spec/acceptance/realtime/connection_failures_spec.rb +458 -27
  60. data/spec/acceptance/realtime/connection_spec.rb +424 -105
  61. data/spec/acceptance/realtime/message_spec.rb +52 -23
  62. data/spec/acceptance/realtime/presence_history_spec.rb +5 -3
  63. data/spec/acceptance/realtime/presence_spec.rb +1110 -96
  64. data/spec/acceptance/rest/auth_spec.rb +222 -59
  65. data/spec/acceptance/rest/base_spec.rb +1 -1
  66. data/spec/acceptance/rest/channel_spec.rb +1 -2
  67. data/spec/acceptance/rest/client_spec.rb +104 -48
  68. data/spec/acceptance/rest/message_spec.rb +42 -15
  69. data/spec/acceptance/rest/presence_spec.rb +4 -11
  70. data/spec/rspec_config.rb +2 -1
  71. data/spec/shared/client_initializer_behaviour.rb +2 -2
  72. data/spec/shared/safe_deferrable_behaviour.rb +6 -2
  73. data/spec/spec_helper.rb +4 -2
  74. data/spec/support/debug_failure_helper.rb +20 -4
  75. data/spec/support/event_machine_helper.rb +32 -1
  76. data/spec/unit/auth_spec.rb +4 -11
  77. data/spec/unit/logger_spec.rb +28 -2
  78. data/spec/unit/models/auth_details_spec.rb +49 -0
  79. data/spec/unit/models/channel_state_change_spec.rb +23 -3
  80. data/spec/unit/models/connection_details_spec.rb +12 -1
  81. data/spec/unit/models/connection_state_change_spec.rb +15 -4
  82. data/spec/unit/models/message_encoders/base64_spec.rb +2 -1
  83. data/spec/unit/models/message_spec.rb +153 -0
  84. data/spec/unit/models/presence_message_spec.rb +192 -0
  85. data/spec/unit/models/protocol_message_spec.rb +64 -6
  86. data/spec/unit/models/token_details_spec.rb +75 -0
  87. data/spec/unit/models/token_request_spec.rb +74 -0
  88. data/spec/unit/modules/async_wrapper_spec.rb +2 -1
  89. data/spec/unit/modules/enum_spec.rb +69 -0
  90. data/spec/unit/modules/event_emitter_spec.rb +149 -22
  91. data/spec/unit/modules/state_emitter_spec.rb +9 -3
  92. data/spec/unit/realtime/client_spec.rb +1 -1
  93. data/spec/unit/realtime/connection_spec.rb +8 -5
  94. data/spec/unit/realtime/incoming_message_dispatcher_spec.rb +1 -1
  95. data/spec/unit/realtime/presence_spec.rb +4 -3
  96. data/spec/unit/rest/client_spec.rb +1 -1
  97. data/spec/unit/util/crypto_spec.rb +3 -3
  98. 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).with(/Success exception/)
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).with(/Failure exception/)
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).with(/Intentional exception/)
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 '#resumed' do
40
+ describe '#trigger_resumed' do
38
41
  it 'executes the callbacks' do
39
42
  subject.on_resume { callbacks << true }
40
- subject.resumed
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.resumed
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.resumed
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, to_safe_json: true)
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, to_safe_json: true)
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, to_safe_json: true)
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.8.15
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: '0'
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: '0'
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: '0'
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: '0'
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.3.0
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.3.0
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