ably 1.1.7 → 1.2.1

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/check.yml +1 -1
  3. data/CHANGELOG.md +99 -0
  4. data/COPYRIGHT +1 -1
  5. data/README.md +2 -2
  6. data/SPEC.md +0 -7
  7. data/UPDATING.md +30 -0
  8. data/ably.gemspec +11 -24
  9. data/lib/ably/auth.rb +8 -8
  10. data/lib/ably/logger.rb +4 -4
  11. data/lib/ably/models/channel_options.rb +97 -0
  12. data/lib/ably/models/connection_details.rb +8 -2
  13. data/lib/ably/models/delta_extras.rb +29 -0
  14. data/lib/ably/models/device_details.rb +1 -1
  15. data/lib/ably/models/error_info.rb +6 -2
  16. data/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -0
  17. data/lib/ably/models/message.rb +14 -3
  18. data/lib/ably/models/protocol_message.rb +23 -14
  19. data/lib/ably/models/token_details.rb +7 -2
  20. data/lib/ably/models/token_request.rb +1 -1
  21. data/lib/ably/modules/ably.rb +1 -1
  22. data/lib/ably/modules/channels_collection.rb +22 -2
  23. data/lib/ably/modules/conversions.rb +34 -0
  24. data/lib/ably/realtime/auth.rb +2 -2
  25. data/lib/ably/realtime/channel/channel_manager.rb +16 -4
  26. data/lib/ably/realtime/channel/channel_state_machine.rb +10 -1
  27. data/lib/ably/realtime/channel/publisher.rb +3 -2
  28. data/lib/ably/realtime/channel.rb +54 -22
  29. data/lib/ably/realtime/channels.rb +1 -1
  30. data/lib/ably/realtime/connection/connection_manager.rb +13 -4
  31. data/lib/ably/realtime/connection/connection_state_machine.rb +4 -0
  32. data/lib/ably/realtime/connection.rb +0 -3
  33. data/lib/ably/rest/channel.rb +28 -35
  34. data/lib/ably/rest/client.rb +23 -8
  35. data/lib/ably/rest/middleware/encoder.rb +1 -1
  36. data/lib/ably/rest/middleware/exceptions.rb +1 -1
  37. data/lib/ably/rest/middleware/external_exceptions.rb +1 -1
  38. data/lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb +1 -1
  39. data/lib/ably/rest/middleware/logger.rb +1 -1
  40. data/lib/ably/rest/middleware/parse_json.rb +1 -1
  41. data/lib/ably/rest/middleware/parse_message_pack.rb +1 -1
  42. data/lib/ably/util/crypto.rb +1 -1
  43. data/lib/ably/version.rb +2 -2
  44. data/spec/acceptance/realtime/channel_spec.rb +458 -27
  45. data/spec/acceptance/realtime/channels_spec.rb +59 -7
  46. data/spec/acceptance/realtime/connection_failures_spec.rb +56 -1
  47. data/spec/acceptance/realtime/connection_spec.rb +270 -1
  48. data/spec/acceptance/realtime/message_spec.rb +77 -0
  49. data/spec/acceptance/realtime/presence_spec.rb +18 -1
  50. data/spec/acceptance/rest/auth_spec.rb +18 -0
  51. data/spec/acceptance/rest/channel_spec.rb +73 -11
  52. data/spec/acceptance/rest/channels_spec.rb +23 -6
  53. data/spec/acceptance/rest/client_spec.rb +3 -3
  54. data/spec/acceptance/rest/message_spec.rb +61 -3
  55. data/spec/lib/unit/models/channel_options_spec.rb +52 -0
  56. data/spec/run_parallel_tests +2 -7
  57. data/spec/support/test_app.rb +1 -1
  58. data/spec/unit/logger_spec.rb +6 -14
  59. data/spec/unit/models/delta_extras_spec.rb +14 -0
  60. data/spec/unit/models/error_info_spec.rb +17 -1
  61. data/spec/unit/models/message_spec.rb +38 -0
  62. data/spec/unit/models/protocol_message_spec.rb +77 -27
  63. data/spec/unit/models/token_details_spec.rb +14 -0
  64. data/spec/unit/realtime/channel_spec.rb +2 -1
  65. data/spec/unit/realtime/channels_spec.rb +53 -15
  66. data/spec/unit/rest/channel_spec.rb +40 -7
  67. data/spec/unit/rest/channels_spec.rb +81 -14
  68. data/spec/unit/rest/client_spec.rb +27 -0
  69. metadata +46 -11
@@ -7,17 +7,14 @@ describe Ably::Rest::Channel do
7
7
  'Ably::Rest::Client',
8
8
  encoders: [],
9
9
  post: instance_double('Faraday::Response', status: 201),
10
- idempotent_rest_publishing: false,
10
+ idempotent_rest_publishing: false, max_message_size: max_message_size
11
11
  )
12
12
  end
13
13
  let(:channel_name) { 'unique' }
14
+ let(:max_message_size) { nil }
14
15
 
15
16
  subject { Ably::Rest::Channel.new(client, channel_name) }
16
17
 
17
- it 'should return Ably::Rest::Channel::MAX_MESSAGE_SIZE equal 65536 (TO3l8)' do
18
- expect(Ably::Rest::Channel::MAX_MESSAGE_SIZE).to eq(65536)
19
- end
20
-
21
18
  describe '#initializer' do
22
19
  let(:channel_name) { random_str.encode(encoding) }
23
20
 
@@ -132,8 +129,44 @@ describe Ably::Rest::Channel do
132
129
  end
133
130
 
134
131
  context 'max message size exceeded' do
135
- it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
136
- expect { subject.publish('x' * 65537, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
132
+ context 'when max_message_size is nil' do
133
+ context 'and a message size is 65537 bytes' do
134
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
135
+ expect { subject.publish('x' * 65537, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when max_message_size is 65536 bytes' do
141
+ let(:max_message_size) { 65536 }
142
+
143
+ context 'and a message size is 65537 bytes' do
144
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
145
+ expect { subject.publish('x' * 65537, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
146
+ end
147
+ end
148
+
149
+ context 'and a message size is 10 bytes' do
150
+ it 'should send a message' do
151
+ expect(subject.publish('x' * 10, 'data')).to eq(true)
152
+ end
153
+ end
154
+ end
155
+
156
+ context 'when max_message_size is 10 bytes' do
157
+ let(:max_message_size) { 10 }
158
+
159
+ context 'and a message size is 11 bytes' do
160
+ it 'should raise Ably::Exceptions::MaxMessageSizeExceeded' do
161
+ expect { subject.publish('x' * 11, 'data') }.to raise_error Ably::Exceptions::MaxMessageSizeExceeded
162
+ end
163
+ end
164
+
165
+ context 'and a message size is 2 bytes' do
166
+ it 'should send a message' do
167
+ expect(subject.publish('x' * 2, 'data')).to eq(true)
168
+ end
169
+ end
137
170
  end
138
171
  end
139
172
  end
@@ -2,30 +2,97 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Ably::Rest::Channels do
5
- let(:client) { instance_double('Ably::Rest::Client') }
5
+ let(:client) { instance_double('Ably::Rest::Client', logger: double('logger').as_null_object) }
6
6
  let(:channel_name) { 'unique'.encode(Encoding::UTF_8) }
7
- let(:options) { { 'bizarre' => 'value' } }
7
+ let(:options) do
8
+ { params: { 'bizarre' => 'value' } }
9
+ end
8
10
 
9
11
  subject { Ably::Rest::Channels.new(client) }
10
12
 
11
- context 'creating channels' do
12
- it '#get creates a channel' do
13
- expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
14
- subject.get(channel_name, options)
15
- end
13
+ describe '#get' do
14
+ context "when channel doesn't exist" do
15
+ shared_examples 'creates a channel' do
16
+ it 'creates a channel (RSN3a)' do
17
+ expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
18
+ subject.get(channel_name, options)
19
+ end
20
+ end
16
21
 
17
- it '#get will reuse the channel object' do
18
- channel = subject.get(channel_name, options)
19
- expect(channel).to be_a(Ably::Rest::Channel)
20
- expect(subject.get(channel_name, options).object_id).to eql(channel.object_id)
22
+ describe 'hash' do
23
+ let(:channel_options) { options }
24
+ it { expect(channel_options).to be_a(Hash) }
25
+
26
+ include_examples 'creates a channel'
27
+ end
28
+
29
+ describe 'ChannelOptions object' do
30
+ let(:channel_options) { Ably::Models::ChannelOptions.new(options) }
31
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
32
+
33
+ include_examples 'creates a channel'
34
+ end
21
35
  end
22
36
 
23
- it '[] creates a channel' do
24
- expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
25
- subject.get(channel_name, options)
37
+ context 'when an existing channel exists' do
38
+ shared_examples 'reuse a channel object if it exists' do
39
+ it 'will reuse a channel object if it exists (RSN3a)' do
40
+ channel = subject.get(channel_name, channel_options)
41
+ expect(channel).to be_a(Ably::Rest::Channel)
42
+ expect(subject.get(channel_name, channel_options).object_id).to eql(channel.object_id)
43
+ end
44
+ end
45
+
46
+ describe 'hash' do
47
+ let(:channel_options) { options }
48
+ it { expect(channel_options).to be_a(Hash) }
49
+
50
+ include_examples 'reuse a channel object if it exists'
51
+ end
52
+
53
+ describe 'ChannelOptions object' do
54
+ let(:channel_options) { Ably::Models::ChannelOptions.new(options) }
55
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
56
+
57
+ include_examples 'reuse a channel object if it exists'
58
+ end
59
+
60
+ context 'with new channel_options modes' do
61
+ shared_examples 'update channel with provided options :modes' do
62
+ it 'will update channel with provided options modes (RSN3c)' do
63
+ channel = subject.get(channel_name, channel_options)
64
+ expect(channel.options.modes).to eq(modes)
65
+
66
+ subject.get(channel_name, channel_options)
67
+ expect(channel.options.modes).to eq(modes)
68
+ end
69
+ end
70
+
71
+ let(:modes) { %i[subscribe] }
72
+ let(:new_options) { { modes: modes } }
73
+
74
+ describe 'hash' do
75
+ let(:channel_options) { new_options }
76
+ it { expect(channel_options).to be_a(Hash) }
77
+
78
+ include_examples 'update channel with provided options :modes'
79
+ end
80
+
81
+ describe 'ChannelOptions object' do
82
+ let(:channel_options) { Ably::Models::ChannelOptions.new(new_options) }
83
+ it { expect(channel_options).to be_a(Ably::Models::ChannelOptions) }
84
+
85
+ include_examples 'update channel with provided options :modes'
86
+ end
87
+ end
26
88
  end
27
89
  end
28
90
 
91
+ it '[] creates a channel' do
92
+ expect(Ably::Rest::Channel).to receive(:new).with(client, channel_name, options)
93
+ subject.get(channel_name, options)
94
+ end
95
+
29
96
  context '#fetch' do
30
97
  it 'retrieves a channel if it exists' do
31
98
  channel = subject.get(channel_name, options)
@@ -87,6 +87,33 @@ describe Ably::Rest::Client do
87
87
  end
88
88
  end
89
89
  end
90
+
91
+ context 'max_message_size' do
92
+ context 'is not present' do
93
+ let(:client_options) { { key: 'appid.keyuid:keysecret' } }
94
+
95
+ it 'should return default 65536 (#TO3l8)' do
96
+ expect(subject.max_message_size).to eq(Ably::Rest::Client::MAX_MESSAGE_SIZE)
97
+ end
98
+ end
99
+
100
+ context 'is nil' do
101
+ let(:client_options) { { key: 'appid.keyuid:keysecret', max_message_size: nil } }
102
+
103
+ it 'should return default 65536 (#TO3l8)' do
104
+ expect(Ably::Rest::Client::MAX_MESSAGE_SIZE).to eq(65536)
105
+ expect(subject.max_message_size).to eq(Ably::Rest::Client::MAX_MESSAGE_SIZE)
106
+ end
107
+ end
108
+
109
+ context 'is customized 131072 bytes' do
110
+ let(:client_options) { { key: 'appid.keyuid:keysecret', max_message_size: 131072 } }
111
+
112
+ it 'should return 131072' do
113
+ expect(subject.max_message_size).to eq(131072)
114
+ end
115
+ end
116
+ end
90
117
  end
91
118
 
92
119
  context 'request_id generation' do
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: 1.1.7
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lewis Marshall
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-08-03 00:00:00.000000000 Z
12
+ date: 2022-05-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -45,28 +45,42 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '8.0'
48
+ version: '9.0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '8.0'
55
+ version: '9.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: faraday
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '1.0'
62
+ version: '2.2'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '1.0'
69
+ version: '2.2'
70
+ - !ruby/object:Gem::Dependency
71
+ name: faraday-typhoeus
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.2.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.2.0
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: typhoeus
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -171,14 +185,14 @@ dependencies:
171
185
  requirements:
172
186
  - - "~>"
173
187
  - !ruby/object:Gem::Version
174
- version: 3.3.0
188
+ version: 3.11.0
175
189
  type: :development
176
190
  prerelease: false
177
191
  version_requirements: !ruby/object:Gem::Requirement
178
192
  requirements:
179
193
  - - "~>"
180
194
  - !ruby/object:Gem::Version
181
- version: 3.3.0
195
+ version: 3.11.0
182
196
  - !ruby/object:Gem::Dependency
183
197
  name: rspec-retry
184
198
  requirement: !ruby/object:Gem::Requirement
@@ -283,14 +297,14 @@ dependencies:
283
297
  requirements:
284
298
  - - "~>"
285
299
  - !ruby/object:Gem::Version
286
- version: '3.7'
300
+ version: '3.8'
287
301
  type: :development
288
302
  prerelease: false
289
303
  version_requirements: !ruby/object:Gem::Requirement
290
304
  requirements:
291
305
  - - "~>"
292
306
  - !ruby/object:Gem::Version
293
- version: '3.7'
307
+ version: '3.8'
294
308
  - !ruby/object:Gem::Dependency
295
309
  name: pry
296
310
  requirement: !ruby/object:Gem::Requirement
@@ -319,6 +333,20 @@ dependencies:
319
333
  - - "~>"
320
334
  - !ruby/object:Gem::Version
321
335
  version: 3.8.0
336
+ - !ruby/object:Gem::Dependency
337
+ name: webrick
338
+ requirement: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - "~>"
341
+ - !ruby/object:Gem::Version
342
+ version: 1.7.0
343
+ type: :development
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - "~>"
348
+ - !ruby/object:Gem::Version
349
+ version: 1.7.0
322
350
  description: A Ruby client library for ably.io realtime messaging
323
351
  email:
324
352
  - lewis@lmars.net
@@ -340,6 +368,7 @@ files:
340
368
  - README.md
341
369
  - Rakefile
342
370
  - SPEC.md
371
+ - UPDATING.md
343
372
  - ably.gemspec
344
373
  - lib/ably.rb
345
374
  - lib/ably/agent.rb
@@ -347,10 +376,12 @@ files:
347
376
  - lib/ably/exceptions.rb
348
377
  - lib/ably/logger.rb
349
378
  - lib/ably/models/auth_details.rb
379
+ - lib/ably/models/channel_options.rb
350
380
  - lib/ably/models/channel_state_change.rb
351
381
  - lib/ably/models/cipher_params.rb
352
382
  - lib/ably/models/connection_details.rb
353
383
  - lib/ably/models/connection_state_change.rb
384
+ - lib/ably/models/delta_extras.rb
354
385
  - lib/ably/models/device_details.rb
355
386
  - lib/ably/models/device_push_details.rb
356
387
  - lib/ably/models/error_info.rb
@@ -462,6 +493,7 @@ files:
462
493
  - spec/acceptance/rest/push_spec.rb
463
494
  - spec/acceptance/rest/stats_spec.rb
464
495
  - spec/acceptance/rest/time_spec.rb
496
+ - spec/lib/unit/models/channel_options_spec.rb
465
497
  - spec/rspec_config.rb
466
498
  - spec/run_parallel_tests
467
499
  - spec/shared/client_initializer_behaviour.rb
@@ -488,6 +520,7 @@ files:
488
520
  - spec/unit/models/cipher_params_spec.rb
489
521
  - spec/unit/models/connection_details_spec.rb
490
522
  - spec/unit/models/connection_state_change_spec.rb
523
+ - spec/unit/models/delta_extras_spec.rb
491
524
  - spec/unit/models/device_details_spec.rb
492
525
  - spec/unit/models/device_push_details_spec.rb
493
526
  - spec/unit/models/error_info_spec.rb
@@ -546,7 +579,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
546
579
  - !ruby/object:Gem::Version
547
580
  version: '0'
548
581
  requirements: []
549
- rubygems_version: 3.0.3
582
+ rubygems_version: 3.3.14
550
583
  signing_key:
551
584
  specification_version: 4
552
585
  summary: A Ruby client library for ably.io realtime messaging implemented using EventMachine
@@ -577,6 +610,7 @@ test_files:
577
610
  - spec/acceptance/rest/push_spec.rb
578
611
  - spec/acceptance/rest/stats_spec.rb
579
612
  - spec/acceptance/rest/time_spec.rb
613
+ - spec/lib/unit/models/channel_options_spec.rb
580
614
  - spec/rspec_config.rb
581
615
  - spec/run_parallel_tests
582
616
  - spec/shared/client_initializer_behaviour.rb
@@ -603,6 +637,7 @@ test_files:
603
637
  - spec/unit/models/cipher_params_spec.rb
604
638
  - spec/unit/models/connection_details_spec.rb
605
639
  - spec/unit/models/connection_state_change_spec.rb
640
+ - spec/unit/models/delta_extras_spec.rb
606
641
  - spec/unit/models/device_details_spec.rb
607
642
  - spec/unit/models/device_push_details_spec.rb
608
643
  - spec/unit/models/error_info_spec.rb