ably-rest 1.1.2 → 1.2.2
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 +3 -0
- data/CHANGELOG.md +1 -1
- data/MAINTAINERS.md +1 -0
- data/README.md +4 -2
- data/ably-rest.gemspec +15 -18
- data/lib/ably-rest.rb +2 -0
- data/lib/submodules/ably-ruby/.github/workflows/check.yml +50 -0
- data/lib/submodules/ably-ruby/CHANGELOG.md +200 -0
- data/lib/submodules/ably-ruby/COPYRIGHT +1 -0
- data/lib/submodules/ably-ruby/LICENSE +172 -11
- data/lib/submodules/ably-ruby/MAINTAINERS.md +1 -0
- data/lib/submodules/ably-ruby/README.md +24 -22
- data/lib/submodules/ably-ruby/SPEC.md +1020 -929
- data/lib/submodules/ably-ruby/UPDATING.md +30 -0
- data/lib/submodules/ably-ruby/ably.gemspec +16 -23
- data/lib/submodules/ably-ruby/lib/ably/agent.rb +3 -0
- data/lib/submodules/ably-ruby/lib/ably/auth.rb +20 -10
- data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +8 -2
- data/lib/submodules/ably-ruby/lib/ably/logger.rb +4 -4
- data/lib/submodules/ably-ruby/lib/ably/models/channel_details.rb +59 -0
- data/lib/submodules/ably-ruby/lib/ably/models/channel_metrics.rb +84 -0
- data/lib/submodules/ably-ruby/lib/ably/models/channel_occupancy.rb +43 -0
- data/lib/submodules/ably-ruby/lib/ably/models/channel_options.rb +97 -0
- data/lib/submodules/ably-ruby/lib/ably/models/channel_status.rb +53 -0
- data/lib/submodules/ably-ruby/lib/ably/models/connection_details.rb +8 -0
- data/lib/submodules/ably-ruby/lib/ably/models/delta_extras.rb +29 -0
- data/lib/submodules/ably-ruby/lib/ably/models/device_details.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/models/error_info.rb +6 -2
- data/lib/submodules/ably-ruby/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -0
- data/lib/submodules/ably-ruby/lib/ably/models/message.rb +28 -3
- data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +14 -0
- data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +31 -14
- data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +7 -2
- data/lib/submodules/ably-ruby/lib/ably/models/token_request.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/modules/ably.rb +11 -1
- data/lib/submodules/ably-ruby/lib/ably/modules/channels_collection.rb +22 -2
- data/lib/submodules/ably-ruby/lib/ably/modules/conversions.rb +34 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/auth.rb +2 -2
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +19 -7
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_properties.rb +24 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_state_machine.rb +10 -1
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/publisher.rb +6 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +56 -28
- data/lib/submodules/ably-ruby/lib/ably/realtime/channels.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +14 -6
- data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +9 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +13 -4
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_state_machine.rb +4 -0
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb +67 -1
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +6 -5
- data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +0 -14
- data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +44 -29
- data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +60 -29
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/encoder.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/exceptions.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/external_exceptions.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb +5 -2
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/logger.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/parse_json.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/rest/middleware/parse_message_pack.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/util/crypto.rb +1 -1
- data/lib/submodules/ably-ruby/lib/ably/version.rb +2 -14
- data/lib/submodules/ably-ruby/lib/ably.rb +1 -0
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/auth_spec.rb +4 -4
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +25 -0
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +476 -21
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channels_spec.rb +59 -7
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +72 -16
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +85 -13
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +301 -34
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +77 -0
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +3 -59
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +84 -158
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/push_admin_spec.rb +3 -19
- data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +24 -75
- data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +8 -4
- data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +141 -10
- data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +23 -6
- data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +146 -47
- data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +61 -3
- data/lib/submodules/ably-ruby/spec/acceptance/rest/push_admin_spec.rb +3 -19
- data/lib/submodules/ably-ruby/spec/lib/unit/models/channel_options_spec.rb +52 -0
- data/lib/submodules/ably-ruby/spec/run_parallel_tests +2 -7
- data/lib/submodules/ably-ruby/spec/shared/client_initializer_behaviour.rb +131 -8
- data/lib/submodules/ably-ruby/spec/shared/model_behaviour.rb +1 -1
- data/lib/submodules/ably-ruby/spec/spec_helper.rb +12 -2
- data/lib/submodules/ably-ruby/spec/support/serialization_helper.rb +21 -0
- data/lib/submodules/ably-ruby/spec/support/test_app.rb +3 -3
- data/lib/submodules/ably-ruby/spec/unit/logger_spec.rb +6 -14
- data/lib/submodules/ably-ruby/spec/unit/models/channel_details_spec.rb +30 -0
- data/lib/submodules/ably-ruby/spec/unit/models/channel_metrics_spec.rb +42 -0
- data/lib/submodules/ably-ruby/spec/unit/models/channel_occupancy_spec.rb +17 -0
- data/lib/submodules/ably-ruby/spec/unit/models/channel_status_spec.rb +36 -0
- data/lib/submodules/ably-ruby/spec/unit/models/delta_extras_spec.rb +14 -0
- data/lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb +17 -1
- data/lib/submodules/ably-ruby/spec/unit/models/message_spec.rb +97 -0
- data/lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb +49 -0
- data/lib/submodules/ably-ruby/spec/unit/models/protocol_message_spec.rb +125 -27
- data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +14 -0
- data/lib/submodules/ably-ruby/spec/unit/realtime/channel_spec.rb +3 -2
- data/lib/submodules/ably-ruby/spec/unit/realtime/channels_spec.rb +53 -15
- data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +19 -6
- data/lib/submodules/ably-ruby/spec/unit/realtime/incoming_message_dispatcher_spec.rb +38 -0
- data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +44 -1
- data/lib/submodules/ably-ruby/spec/unit/rest/channels_spec.rb +81 -14
- data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +47 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/unit/client_spec.rb +30 -0
- metadata +88 -25
- data/lib/submodules/ably-ruby/.travis.yml +0 -19
|
@@ -87,22 +87,6 @@ describe Ably::Realtime::Client, :event_machine do
|
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
|
-
|
|
91
|
-
context 'with client_id' do
|
|
92
|
-
let(:client_options) do
|
|
93
|
-
default_options.merge(client_id: random_str)
|
|
94
|
-
end
|
|
95
|
-
it 'connects using token auth' do
|
|
96
|
-
run_reactor do
|
|
97
|
-
connection.on(:connected) do
|
|
98
|
-
expect(connection.state).to eq(:connected)
|
|
99
|
-
expect(auth_params[:access_token]).to_not be_nil
|
|
100
|
-
expect(auth_params[:key]).to be_nil
|
|
101
|
-
stop_reactor
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
90
|
end
|
|
107
91
|
end
|
|
108
92
|
|
|
@@ -249,6 +233,8 @@ describe Ably::Realtime::Client, :event_machine do
|
|
|
249
233
|
|
|
250
234
|
context '#request (#RSC19*)' do
|
|
251
235
|
let(:client_options) { default_options.merge(key: api_key) }
|
|
236
|
+
let(:device_id) { random_str }
|
|
237
|
+
let(:endpoint) { subject.rest_client.endpoint }
|
|
252
238
|
|
|
253
239
|
context 'get' do
|
|
254
240
|
it 'returns an HttpPaginatedResponse object' do
|
|
@@ -297,6 +283,76 @@ describe Ably::Realtime::Client, :event_machine do
|
|
|
297
283
|
end
|
|
298
284
|
end
|
|
299
285
|
end
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
context 'post', :webmock do
|
|
289
|
+
before do
|
|
290
|
+
stub_request(:delete, "#{endpoint}/push/deviceRegistrations/#{device_id}/resetUpdateToken").
|
|
291
|
+
to_return(status: 200, body: '{}', headers: { 'Content-Type' => 'application/json' })
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
it 'supports post' do
|
|
295
|
+
subject.request(:delete, "push/deviceRegistrations/#{device_id}/resetUpdateToken").callback do |response|
|
|
296
|
+
expect(response).to be_success
|
|
297
|
+
stop_reactor
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context 'delete', :webmock do
|
|
303
|
+
before do
|
|
304
|
+
stub_request(:delete, "#{endpoint}/push/channelSubscriptions?deviceId=#{device_id}").
|
|
305
|
+
to_return(status: 200, body: '{}', headers: { 'Content-Type' => 'application/json' })
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it 'supports delete' do
|
|
309
|
+
subject.request(:delete, "/push/channelSubscriptions", { deviceId: device_id}).callback do |response|
|
|
310
|
+
expect(response).to be_success
|
|
311
|
+
stop_reactor
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
context 'patch', :webmock do
|
|
317
|
+
let(:body_params) { { 'metadata' => { 'key' => 'value' } } }
|
|
318
|
+
|
|
319
|
+
before do
|
|
320
|
+
stub_request(:patch, "#{endpoint}/push/deviceRegistrations/#{device_id}")
|
|
321
|
+
.with(body: serialize_body(body_params, protocol))
|
|
322
|
+
.to_return(status: 200, body: '{}', headers: { 'Content-Type' => 'application/json' })
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
it 'supports patch' do
|
|
326
|
+
subject.request(:patch, "/push/deviceRegistrations/#{device_id}", {}, body_params).callback do |response|
|
|
327
|
+
expect(response).to be_success
|
|
328
|
+
stop_reactor
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
context 'put', :webmock do
|
|
334
|
+
let(:body_params) do
|
|
335
|
+
{
|
|
336
|
+
'id' => random_str,
|
|
337
|
+
'platform' => 'ios',
|
|
338
|
+
'formFactor' => 'phone',
|
|
339
|
+
'metadata' => { 'key' => 'value' }
|
|
340
|
+
}
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
before do
|
|
344
|
+
stub_request(:put, "#{endpoint}/push/deviceRegistrations/#{device_id}")
|
|
345
|
+
.with(body: serialize_body(body_params, protocol))
|
|
346
|
+
.to_return(status: 200, body: '{}', headers: { 'Content-Type' => 'application/json' })
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it 'supports put' do
|
|
350
|
+
subject.request(:put, "/push/deviceRegistrations/#{device_id}", {}, body_params).callback do |response|
|
|
351
|
+
expect(response).to be_success
|
|
352
|
+
stop_reactor
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
end
|
|
300
356
|
end
|
|
301
357
|
|
|
302
358
|
context '#publish (#TBC)' do
|
|
@@ -156,10 +156,20 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
156
156
|
|
|
157
157
|
stub_request(:get, auth_url).
|
|
158
158
|
to_return do |request|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
sleep Ably::Rest::Client::HTTP_DEFAULTS.fetch(:request_timeout)
|
|
160
|
+
{ status: [500, "Internal Server Error"] }
|
|
161
|
+
end.then.
|
|
162
|
+
to_return(:status => 201, :body => token_response.to_json, :headers => { 'Content-Type' => 'application/json' })
|
|
163
|
+
|
|
164
|
+
stub_request(:get, 'https://internet-up.ably-realtime.com/is-the-internet-up.txt')
|
|
165
|
+
.with(
|
|
166
|
+
headers: {
|
|
167
|
+
'Accept-Encoding' => 'gzip, compressed',
|
|
168
|
+
'Connection' => 'close',
|
|
169
|
+
'Host' => 'internet-up.ably-realtime.com',
|
|
170
|
+
'User-Agent' => 'EventMachine HttpClient'
|
|
171
|
+
}
|
|
172
|
+
).to_return(status: 200, body: 'yes\n', headers: { 'Content-Type' => 'text/plain' })
|
|
163
173
|
end
|
|
164
174
|
|
|
165
175
|
specify 'the connection moves to the disconnected state and tries again, returning again to the disconnected state (#RSA4c, #RSA4c1, #RSA4c2)' do
|
|
@@ -560,7 +570,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
560
570
|
end
|
|
561
571
|
|
|
562
572
|
context 'when DISCONNECTED ProtocolMessage received from the server' do
|
|
563
|
-
it 'reconnects automatically and immediately' do
|
|
573
|
+
it 'reconnects automatically and immediately (#RTN15a)' do
|
|
564
574
|
fail_if_suspended_or_failed
|
|
565
575
|
|
|
566
576
|
connection.once(:connected) do
|
|
@@ -580,6 +590,61 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
580
590
|
end
|
|
581
591
|
end
|
|
582
592
|
|
|
593
|
+
context 'when protocolMessage contains token error' do
|
|
594
|
+
context "library does not have a means to renew the token (#RTN15h1)" do
|
|
595
|
+
let(:auth_url) { 'https://echo.ably.io/createJWT' }
|
|
596
|
+
let(:token) { Faraday.get("#{auth_url}?keyName=#{key_name}&keySecret=#{key_secret}").body }
|
|
597
|
+
let(:client_options) { default_options.merge(token: token, log_level: :none) }
|
|
598
|
+
|
|
599
|
+
let(:error_message) { 'error_message' }
|
|
600
|
+
|
|
601
|
+
it 'moves connection state to failed' do
|
|
602
|
+
connection.on(:failed) do |connection_state_change|
|
|
603
|
+
expect(connection.error_reason.message).to eq(error_message)
|
|
604
|
+
stop_reactor
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
connection.on(:connected) do
|
|
608
|
+
protocol_message = Ably::Models::ProtocolMessage.new(action: Ably::Models::ProtocolMessage::ACTION.Disconnected.to_i, error: { code: 40140, message: error_message })
|
|
609
|
+
connection.__incoming_protocol_msgbus__.publish :protocol_message, protocol_message
|
|
610
|
+
end
|
|
611
|
+
|
|
612
|
+
connection.connect
|
|
613
|
+
end
|
|
614
|
+
end
|
|
615
|
+
|
|
616
|
+
context "library have a means to renew the token (#RTN15h2)" do
|
|
617
|
+
let(:client_options) { default_options.merge(log_level: :none) }
|
|
618
|
+
let(:error_message) { 'error_message' }
|
|
619
|
+
|
|
620
|
+
def send_disconnect_message
|
|
621
|
+
protocol_message = Ably::Models::ProtocolMessage.new(action: Ably::Models::ProtocolMessage::ACTION.Disconnected.to_i, error: { code: 40140, message: error_message })
|
|
622
|
+
connection.__incoming_protocol_msgbus__.publish :protocol_message, protocol_message
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
it 'attempts to reconnect' do
|
|
626
|
+
connection.on(:failed) do |connection_state_change|
|
|
627
|
+
raise "Connection shouldn't be failed"
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
connection.on(:connected) do
|
|
631
|
+
connection.once(:connecting) do
|
|
632
|
+
connection.once(:disconnected) do
|
|
633
|
+
expect(connection.error_reason.message).to eq(error_message)
|
|
634
|
+
stop_reactor
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
send_disconnect_message
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
send_disconnect_message
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
connection.connect
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
|
|
583
648
|
context 'connection state freshness is monitored' do
|
|
584
649
|
it 'resumes connections when disconnected within the connection_state_ttl period (#RTN15g)' do
|
|
585
650
|
connection.once(:connected) do
|
|
@@ -1310,7 +1375,9 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
1310
1375
|
end)
|
|
1311
1376
|
end
|
|
1312
1377
|
|
|
1313
|
-
|
|
1378
|
+
xit 'triggers a re-authentication and then resumes the connection' do
|
|
1379
|
+
# [PENDING] After sandbox env update connection isn't found and a new connection is created. Spec fails
|
|
1380
|
+
#
|
|
1314
1381
|
connection.once(:connected) do
|
|
1315
1382
|
connection_id = connection.id
|
|
1316
1383
|
|
|
@@ -1423,14 +1490,19 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
1423
1490
|
let(:expected_host) { "#{environment}-#{Ably::Realtime::Client::DOMAIN}" }
|
|
1424
1491
|
let(:client_options) { timeout_options.merge(environment: environment) }
|
|
1425
1492
|
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1493
|
+
context ':fallback_hosts_use_default is unset' do
|
|
1494
|
+
let(:max_time_in_state_for_tests) { 8 }
|
|
1495
|
+
let(:expected_hosts) { Ably::CUSTOM_ENVIRONMENT_FALLBACKS_SUFFIXES.map { |suffix| "#{environment}#{suffix}" } + [expected_host] }
|
|
1496
|
+
let(:fallback_hosts_used) { Array.new }
|
|
1497
|
+
|
|
1498
|
+
it 'uses fallback hosts by default' do
|
|
1499
|
+
allow(connection).to receive(:create_transport) do |host|
|
|
1500
|
+
fallback_hosts_used << host
|
|
1501
|
+
raise EventMachine::ConnectionError
|
|
1502
|
+
end
|
|
1431
1503
|
|
|
1432
|
-
connection.once(:suspended) do
|
|
1433
1504
|
connection.once(:suspended) do
|
|
1505
|
+
expect(fallback_hosts_used.uniq).to match_array(expected_hosts)
|
|
1434
1506
|
stop_reactor
|
|
1435
1507
|
end
|
|
1436
1508
|
end
|
|
@@ -1508,7 +1580,7 @@ describe Ably::Realtime::Connection, 'failures', :event_machine do
|
|
|
1508
1580
|
end
|
|
1509
1581
|
|
|
1510
1582
|
context 'with production environment' do
|
|
1511
|
-
let(:custom_hosts) { %w(
|
|
1583
|
+
let(:custom_hosts) { %w(a.ably-realtime.com b.ably-realtime.com) }
|
|
1512
1584
|
before do
|
|
1513
1585
|
stub_const 'Ably::FALLBACK_HOSTS', custom_hosts
|
|
1514
1586
|
end
|