ably-rest 1.0.6 → 1.1.4.rc

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -1
  3. data/README.md +23 -15
  4. data/ably-rest.gemspec +6 -6
  5. data/lib/submodules/ably-ruby/.editorconfig +14 -0
  6. data/lib/submodules/ably-ruby/.travis.yml +10 -8
  7. data/lib/submodules/ably-ruby/CHANGELOG.md +75 -3
  8. data/lib/submodules/ably-ruby/LICENSE +1 -3
  9. data/lib/submodules/ably-ruby/README.md +12 -7
  10. data/lib/submodules/ably-ruby/Rakefile +32 -0
  11. data/lib/submodules/ably-ruby/SPEC.md +1277 -835
  12. data/lib/submodules/ably-ruby/ably.gemspec +15 -10
  13. data/lib/submodules/ably-ruby/lib/ably/auth.rb +30 -4
  14. data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +10 -4
  15. data/lib/submodules/ably-ruby/lib/ably/logger.rb +7 -1
  16. data/lib/submodules/ably-ruby/lib/ably/models/channel_state_change.rb +1 -1
  17. data/lib/submodules/ably-ruby/lib/ably/models/connection_state_change.rb +1 -1
  18. data/lib/submodules/ably-ruby/lib/ably/models/device_details.rb +87 -0
  19. data/lib/submodules/ably-ruby/lib/ably/models/device_push_details.rb +86 -0
  20. data/lib/submodules/ably-ruby/lib/ably/models/error_info.rb +23 -2
  21. data/lib/submodules/ably-ruby/lib/ably/models/idiomatic_ruby_wrapper.rb +4 -4
  22. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +32 -2
  23. data/lib/submodules/ably-ruby/lib/ably/models/push_channel_subscription.rb +89 -0
  24. data/lib/submodules/ably-ruby/lib/ably/modules/conversions.rb +1 -1
  25. data/lib/submodules/ably-ruby/lib/ably/modules/encodeable.rb +1 -1
  26. data/lib/submodules/ably-ruby/lib/ably/modules/exception_codes.rb +128 -0
  27. data/lib/submodules/ably-ruby/lib/ably/modules/model_common.rb +15 -2
  28. data/lib/submodules/ably-ruby/lib/ably/modules/state_machine.rb +2 -2
  29. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +1 -0
  30. data/lib/submodules/ably-ruby/lib/ably/realtime/auth.rb +1 -1
  31. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +24 -102
  32. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +2 -6
  33. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_state_machine.rb +2 -2
  34. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/publisher.rb +74 -0
  35. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/push_channel.rb +62 -0
  36. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +91 -3
  37. data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +6 -2
  38. data/lib/submodules/ably-ruby/lib/ably/realtime/client/outgoing_message_dispatcher.rb +1 -1
  39. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +34 -20
  40. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +25 -9
  41. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb +1 -1
  42. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +4 -4
  43. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb +3 -3
  44. data/lib/submodules/ably-ruby/lib/ably/realtime/push.rb +40 -0
  45. data/lib/submodules/ably-ruby/lib/ably/realtime/push/admin.rb +61 -0
  46. data/lib/submodules/ably-ruby/lib/ably/realtime/push/channel_subscriptions.rb +108 -0
  47. data/lib/submodules/ably-ruby/lib/ably/realtime/push/device_registrations.rb +105 -0
  48. data/lib/submodules/ably-ruby/lib/ably/rest.rb +1 -0
  49. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +53 -17
  50. data/lib/submodules/ably-ruby/lib/ably/rest/channel/push_channel.rb +62 -0
  51. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +162 -35
  52. data/lib/submodules/ably-ruby/lib/ably/rest/middleware/fail_if_unsupported_mime_type.rb +4 -1
  53. data/lib/submodules/ably-ruby/lib/ably/rest/middleware/parse_message_pack.rb +17 -1
  54. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +1 -0
  55. data/lib/submodules/ably-ruby/lib/ably/rest/push.rb +42 -0
  56. data/lib/submodules/ably-ruby/lib/ably/rest/push/admin.rb +54 -0
  57. data/lib/submodules/ably-ruby/lib/ably/rest/push/channel_subscriptions.rb +121 -0
  58. data/lib/submodules/ably-ruby/lib/ably/rest/push/device_registrations.rb +103 -0
  59. data/lib/submodules/ably-ruby/lib/ably/version.rb +7 -2
  60. data/lib/submodules/ably-ruby/spec/acceptance/realtime/auth_spec.rb +245 -17
  61. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +26 -20
  62. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +177 -59
  63. data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +153 -0
  64. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +72 -6
  65. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +129 -18
  66. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +36 -34
  67. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +201 -167
  68. data/lib/submodules/ably-ruby/spec/acceptance/realtime/push_admin_spec.rb +736 -0
  69. data/lib/submodules/ably-ruby/spec/acceptance/realtime/push_spec.rb +27 -0
  70. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +41 -3
  71. data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +2 -2
  72. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +79 -4
  73. data/lib/submodules/ably-ruby/spec/acceptance/rest/channels_spec.rb +6 -0
  74. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +129 -10
  75. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +158 -6
  76. data/lib/submodules/ably-ruby/spec/acceptance/rest/push_admin_spec.rb +952 -0
  77. data/lib/submodules/ably-ruby/spec/acceptance/rest/push_spec.rb +25 -0
  78. data/lib/submodules/ably-ruby/spec/acceptance/rest/time_spec.rb +1 -1
  79. data/lib/submodules/ably-ruby/spec/run_parallel_tests +33 -0
  80. data/lib/submodules/ably-ruby/spec/spec_helper.rb +1 -1
  81. data/lib/submodules/ably-ruby/spec/support/debug_failure_helper.rb +9 -5
  82. data/lib/submodules/ably-ruby/spec/support/test_app.rb +2 -2
  83. data/lib/submodules/ably-ruby/spec/unit/logger_spec.rb +10 -3
  84. data/lib/submodules/ably-ruby/spec/unit/models/device_details_spec.rb +102 -0
  85. data/lib/submodules/ably-ruby/spec/unit/models/device_push_details_spec.rb +101 -0
  86. data/lib/submodules/ably-ruby/spec/unit/models/error_info_spec.rb +51 -3
  87. data/lib/submodules/ably-ruby/spec/unit/models/message_spec.rb +17 -2
  88. data/lib/submodules/ably-ruby/spec/unit/models/presence_message_spec.rb +1 -1
  89. data/lib/submodules/ably-ruby/spec/unit/models/push_channel_subscription_spec.rb +86 -0
  90. data/lib/submodules/ably-ruby/spec/unit/modules/enum_spec.rb +1 -1
  91. data/lib/submodules/ably-ruby/spec/unit/realtime/client_spec.rb +13 -1
  92. data/lib/submodules/ably-ruby/spec/unit/realtime/connection_spec.rb +1 -1
  93. data/lib/submodules/ably-ruby/spec/unit/realtime/push_channel_spec.rb +36 -0
  94. data/lib/submodules/ably-ruby/spec/unit/rest/channel_spec.rb +8 -1
  95. data/lib/submodules/ably-ruby/spec/unit/rest/client_spec.rb +30 -0
  96. data/lib/submodules/ably-ruby/spec/unit/rest/push_channel_spec.rb +36 -0
  97. metadata +46 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 788db7321c2648d00b09b24ebaecdebe76df46fad41f13a120d101c08f0314fd
4
- data.tar.gz: 86f197d0470558d8448a9f1818b7f35a9a1a4607af59dfdbc4c08913c44b1b26
3
+ metadata.gz: 12d0c3187eec6e03160420f9266a02e4b57017c45cc9792cb701644bd594b8f6
4
+ data.tar.gz: c5c0a1da2d5f750452b3693ea616c58ddb9bf925afc7a6766859668293241adb
5
5
  SHA512:
6
- metadata.gz: f5a7c7178470002b019838c09cb687b23dbacfc7588bedc3cf5fcc24e854ab9a06f987337a5dc5c5a032d309c114672b7cefd6f6adef8d19d3b56c537182ab07
7
- data.tar.gz: '09f2e738b96e28d3c6a3fedc4aca121bc1a65e175280a492efe117964c100f11da4f9d155ebaa8bc84bbd5aeae88a0ea1ae5bdf51a036e5c81562bc2b548b957'
6
+ metadata.gz: f321aa69c45f938136ab02c5fd466cc33b661a6481b5244edf8d4eca1090879c9bb1b568d181794a88df623bb971ac3fd5da879b9df012a110a247ae86807eed
7
+ data.tar.gz: b4df91228d73641db9ce8b9ed3e98420c0ada82cd657d0122dacc471307104932c13be50938d0f8b14b5a68b51e12ae475f962235d5e05097aad811388cb5c3d
@@ -1,3 +1,3 @@
1
1
  # Change Log
2
2
 
3
- See https://github.com/ably/ably-ruby/blob/master/CHANGELOG.md
3
+ See https://github.com/ably/ably-ruby/blob/main/CHANGELOG.md
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
1
  # [Ably](https://www.ably.io)
2
2
 
3
- [![Build Status](https://travis-ci.org/ably/ably-ruby-rest.png)](https://travis-ci.org/ably/ably-ruby-rest)
4
3
  [![Gem Version](https://badge.fury.io/rb/ably-rest.svg)](http://badge.fury.io/rb/ably-rest)
5
4
 
6
- A Ruby REST client library for [www.ably.io](https://www.ably.io), the realtime messaging service.
5
+ A Ruby REST client library for [www.ably.io](https://www.ably.io), the realtime messaging service. This library currently targets the [Ably 1.1 client library specification](https://www.ably.io/documentation/client-lib-development-guide/features/). You can jump to the '[Known Limitations](#known-limitations)' section to see the features this client library does not yet support or [view our client library SDKs feature support matrix](https://www.ably.io/download/sdk-feature-support-matrix) to see the list of all the available features.
7
6
 
8
7
  ## Documentation
9
8
 
@@ -15,6 +14,14 @@ This REST only library was created for developers who do not want EventMachine a
15
14
 
16
15
  If however you need to use a realtime library that offers an asynchronous evented AP, then we recommended you [take a look at the combined REST & Realtime gem](https://rubygems.org/gems/ably).
17
16
 
17
+ ## Known Limitations
18
+
19
+ This client library is currently *not compatible* with some of the Ably features:
20
+
21
+ | Feature |
22
+ | :--- |
23
+ | [Custom transportParams](https://www.ably.io/documentation/realtime/connection#client-options) |
24
+
18
25
  ## Installation
19
26
 
20
27
  The client library is available as a [gem from RubyGems.org](https://rubygems.org/gems/ably-rest).
@@ -142,22 +149,23 @@ To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANG
142
149
  Please note that the bulk of this repo is in fact a submodule of the [Ably Ruby REST & Realtime library](https://github.com/ably/ably-ruby). If you want to issue a PR, it is likely you should be looking in that repo to add features or make contributions.
143
150
 
144
151
  1. Fork it
145
- 2. Create your feature branch (`git checkout -b my-new-feature`)
146
- 3. Commit your changes (`git commit -am 'Add some feature'`)
147
- 4. Ensure you have added suitable tests and the test suite is passing(`bundle exec rspec`)
148
- 4. Push to the branch (`git push origin my-new-feature`)
149
- 5. Create a new Pull Request
152
+ 2. When pulling to local, make sure to also pull submodules (git submodule init && git submodule update)
153
+ 3. Create your feature branch (`git checkout -b my-new-feature`)
154
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
155
+ 5. Ensure you have added suitable tests and the test suite is passing(`bundle exec rspec`)
156
+ 6. Push to the branch (`git push origin my-new-feature`)
157
+ 7. Create a new Pull Request
150
158
 
151
159
  ## Release Process
152
160
 
153
- 1. `cd` into the [`lib/submodules/ably-ruby`](./lib/submodules/ably-ruby) folder.
154
- 1. Fetch the latest from origin and checkout the [latest `ably-ruby` release tag](https://github.com/ably/ably-ruby/releases) - `git fetch origin && git checkout v1.0.0`
155
- 1. Return the root folder.
156
- 1. Replicate any changes made in [.ably-rest.gemspec](./.ably-rest.gemspec), [.travis.yaml](./.travis.yml) or [spec_helper.rb][./spec/spec_helper.rb] file if applicable and commit those changes.
157
- 1. Run `rake doc:spec` to generate a new [spec file](./SPEC.md).
158
- 1. Commit these changes.
159
- 1. Add a tag and push to origin such as `git tag v1.0.0 && git push origin v1.0.0`
160
- 1. Run `rake release` to publish the gem to [Rubygems](https://rubygems.org/gems/ably-rest)
161
+ 1. From the `main` branch, `cd lib/submodules/ably-ruby`
162
+ 2. `git fetch origin && git fetch --tags`
163
+ 3. Reset to the tagged version released in ably-ruby, e.g. `git reset v1.0.5 --hard`
164
+ 4. Ensure submodules of this submodule are up to date (`git submodule update`)
165
+ 5. cd to `ably-ruby-rest`
166
+ 6. Stage changes `git add .`
167
+ 7. Commit version upgrade (`git commit -m "Version upgrade to v1.0.5"`)
168
+ 8. Run `rake release`
161
169
 
162
170
  See the [Ably Ruby release process notes](https://github.com/ably/ably-ruby#release-process).
163
171
 
@@ -31,8 +31,8 @@ Gem::Specification.new do |spec|
31
31
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
32
32
  spec.require_paths = ['lib']
33
33
 
34
- spec.add_runtime_dependency 'faraday', '~> 0.12'
35
- spec.add_runtime_dependency 'excon', '~> 0.55'
34
+ spec.add_runtime_dependency 'faraday', '~> 1.0'
35
+ spec.add_runtime_dependency 'typhoeus', '~> 1.4'
36
36
 
37
37
  if RUBY_VERSION.match(/^1/)
38
38
  spec.add_runtime_dependency 'json', '< 2.0'
@@ -42,11 +42,11 @@ Gem::Specification.new do |spec|
42
42
  spec.add_runtime_dependency 'msgpack', '>= 0.6.2'
43
43
  spec.add_runtime_dependency 'addressable', '>= 2.0.0'
44
44
 
45
- spec.add_development_dependency 'bundler', '~> 1.3'
46
- spec.add_development_dependency 'rake', '~> 11.3'
45
+ spec.add_development_dependency 'rake', '~> 13.0'
46
+ spec.add_development_dependency 'bundler', '~> 2.2.1'
47
47
  spec.add_development_dependency 'redcarpet', '~> 3.3'
48
- spec.add_development_dependency 'rspec', '~> 3.2.0'
49
- spec.add_development_dependency 'rspec-retry', '~> 0.4'
48
+ spec.add_development_dependency 'rspec', '~> 3.10.0'
49
+ spec.add_development_dependency 'rspec-retry', '~> 0.6'
50
50
  spec.add_development_dependency 'yard', '~> 0.9'
51
51
 
52
52
  if RUBY_VERSION.match(/^1/)
@@ -0,0 +1,14 @@
1
+ # http://EditorConfig.org
2
+ root = true
3
+
4
+ # Unix-style newlines with a newline ending every file
5
+ [*]
6
+ end_of_line = lf
7
+ insert_final_newline = true
8
+ trim_trailing_whitespace = true
9
+ indent_style = space
10
+ indent-size = 2
11
+ charset = utf-8
12
+
13
+ [*.md]
14
+ trim_trailing_whitespace = false
@@ -1,16 +1,18 @@
1
- sudo: false
2
1
  env:
3
- - RSPEC_RETRY=true PROTOCOL=json
4
- - RSPEC_RETRY=true PROTOCOL=msgpack
2
+ - RSPEC_RETRY=true PARALLEL_TEST_PROCESSORS=2 PROTOCOL=json
3
+ - RSPEC_RETRY=true PARALLEL_TEST_PROCESSORS=2 PROTOCOL=msgpack
5
4
  language: ruby
6
5
  rvm:
7
6
  - 1.9.3
8
- - 2.0.0
9
7
  - 2.1.10
10
- - 2.2.0
11
- - 2.3.6
12
- - 2.4.1
13
- script: bundle exec rspec
8
+ - 2.2.10
9
+ - 2.3.8
10
+ - 2.5.5
11
+ - 2.6.0
12
+ - 2.6.1
13
+ - 2.6.2
14
+ - 2.6.3
15
+ script: spec/run_parallel_tests
14
16
  notifications:
15
17
  slack:
16
18
  secure: Xe8MwDcV2C8XLGk6O6Co31LpQiRSxsmS7Toy5vM7rHds5fnVRBNn5iX6Q5mXMdLOlnsMhjKLt7zl4fsBOZv+siQ+Us0omZSIYpXCYSCIj8nofReF0Lj8M4oa6lFSL5OuygO7PH+wLKTRxQURGZ6Pi1nHU+RE5izRmsewQHkhtY0=
@@ -1,7 +1,78 @@
1
1
  # Change Log
2
2
 
3
- ## [v1.0.6](https://github.com/ably/ably-ruby/tree/v1.0.6)
3
+ ## [v1.1.3](https://github.com/ably/ably-ruby/tree/v1.1.3)
4
4
 
5
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.1.2...v1.1.3)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - RestChannel#publish: implement params (RSL1l) [\#210](https://github.com/ably/ably-ruby/pull/210) ([simonwoolf](https://github.com/simonwoolf))
10
+
11
+ ## [v1.1.2](https://github.com/ably/ably-ruby/tree/v1.1.2)
12
+
13
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.1.1...v1.1.2)
14
+
15
+ **Merged pull requests:**
16
+
17
+ - Remove legacy skipped tests and upgrade MsgPack [\#184](https://github.com/ably/ably-ruby/pull/184) ([mattheworiordan](https://github.com/mattheworiordan))
18
+
19
+ ## [v1.1.1](https://github.com/ably/ably-ruby/tree/v1.1.1) (2019-05-06)
20
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.1.0...v1.1.1)
21
+
22
+ **Implemented enhancements:**
23
+
24
+ - Support transient publishes as part of 1.1 spec [\#164](https://github.com/ably/ably-ruby/issues/164)
25
+
26
+ **Fixed bugs:**
27
+
28
+ - RTN16b recovery not fully implemented [\#180](https://github.com/ably/ably-ruby/issues/180)
29
+ - Publishing a high number of messages before connected results in lost messages [\#179](https://github.com/ably/ably-ruby/issues/179)
30
+
31
+ **Merged pull requests:**
32
+
33
+ - msgSerial fixes including connection recovery fix [\#181](https://github.com/ably/ably-ruby/pull/181) ([mattheworiordan](https://github.com/mattheworiordan))
34
+ - Known limitations section in README [\#177](https://github.com/ably/ably-ruby/pull/177) ([Srushtika](https://github.com/Srushtika))
35
+
36
+ ## [v1.1.0](https://github.com/ably/ably-ruby/tree/v1.1.0) (2019-02-06)
37
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.0.7...v1.1.0)
38
+
39
+ **Fixed bugs:**
40
+
41
+ - MessagePack::UnknownExtTypeError: unexpected extension type [\#167](https://github.com/ably/ably-ruby/issues/167)
42
+ - Ably::Modules::StateMachine produces confusing error code [\#158](https://github.com/ably/ably-ruby/issues/158)
43
+ - Transition state failure [\#125](https://github.com/ably/ably-ruby/issues/125)
44
+
45
+ **Merged pull requests:**
46
+
47
+ - V1.1 release [\#173](https://github.com/ably/ably-ruby/pull/173) ([mattheworiordan](https://github.com/mattheworiordan))
48
+ - Rsc15f remember fallback [\#172](https://github.com/ably/ably-ruby/pull/172) ([mattheworiordan](https://github.com/mattheworiordan))
49
+ - Generate error codes [\#171](https://github.com/ably/ably-ruby/pull/171) ([mattheworiordan](https://github.com/mattheworiordan))
50
+ - Parallel tests [\#169](https://github.com/ably/ably-ruby/pull/169) ([mattheworiordan](https://github.com/mattheworiordan))
51
+ - Transient publishing for \#164 [\#166](https://github.com/ably/ably-ruby/pull/166) ([mattheworiordan](https://github.com/mattheworiordan))
52
+ - Idempotent publishing [\#165](https://github.com/ably/ably-ruby/pull/165) ([mattheworiordan](https://github.com/mattheworiordan))
53
+ - Release 1.0.7 [\#162](https://github.com/ably/ably-ruby/pull/162) ([funkyboy](https://github.com/funkyboy))
54
+ - Minor test fixes [\#123](https://github.com/ably/ably-ruby/pull/123) ([SimonWoolf](https://github.com/SimonWoolf))
55
+ - Push notifications [\#115](https://github.com/ably/ably-ruby/pull/115) ([mattheworiordan](https://github.com/mattheworiordan))
56
+
57
+ ## [v1.0.7](https://github.com/ably/ably-ruby/tree/v1.0.7) (2018-06-18)
58
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.0.6...v1.0.7)
59
+
60
+ **Implemented enhancements:**
61
+
62
+ - Add JWT test [\#136](https://github.com/ably/ably-ruby/issues/136)
63
+
64
+ **Fixed bugs:**
65
+
66
+ - Is this sequence correct? [\#155](https://github.com/ably/ably-ruby/issues/155)
67
+ - Documentation for add\_request\_ids [\#152](https://github.com/ably/ably-ruby/issues/152)
68
+
69
+ **Merged pull requests:**
70
+
71
+ - Fix auth\_method-\>auth\_params [\#157](https://github.com/ably/ably-ruby/pull/157) ([SimonWoolf](https://github.com/SimonWoolf))
72
+ - Add request\_id attribute documentation [\#156](https://github.com/ably/ably-ruby/pull/156) ([funkyboy](https://github.com/funkyboy))
73
+ - Add JWT tests [\#137](https://github.com/ably/ably-ruby/pull/137) ([funkyboy](https://github.com/funkyboy))
74
+
75
+ ## [v1.0.6](https://github.com/ably/ably-ruby/tree/v1.0.6) (2018-05-01)
5
76
  [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.0.5...v1.0.6)
6
77
 
7
78
  **Fixed bugs:**
@@ -11,17 +82,18 @@
11
82
  **Closed issues:**
12
83
 
13
84
  - Passing a frozen channel name or name gives an error on the REST client \[Reopen\] [\#145](https://github.com/ably/ably-ruby/issues/145)
14
- - Passing a frozen channel name or name gives an error on the REST client [\#132](https://github.com/ably/ably-ruby/issues/132)
15
85
 
16
86
  **Merged pull requests:**
17
87
 
18
88
  - Add request id fix for bulk publishes [\#154](https://github.com/ably/ably-ruby/pull/154) ([mattheworiordan](https://github.com/mattheworiordan))
19
89
  - Fix race condition in EventMachine [\#153](https://github.com/ably/ably-ruby/pull/153) ([mattheworiordan](https://github.com/mattheworiordan))
20
90
  - Add support for WebSocket native heartbeats [\#151](https://github.com/ably/ably-ruby/pull/151) ([mattheworiordan](https://github.com/mattheworiordan))
91
+ - Add .editorconfig for basic IDE configuration settings [\#150](https://github.com/ably/ably-ruby/pull/150) ([mattheworiordan](https://github.com/mattheworiordan))
21
92
  - RSC15d test fixes; add \(failing\) tests for GET as well as POST [\#148](https://github.com/ably/ably-ruby/pull/148) ([SimonWoolf](https://github.com/SimonWoolf))
22
93
  - Do not encode strings in-place [\#147](https://github.com/ably/ably-ruby/pull/147) ([mattheworiordan](https://github.com/mattheworiordan))
23
94
  - Only resume if connection is fresh \(RTN15g\*\) [\#146](https://github.com/ably/ably-ruby/pull/146) ([mattheworiordan](https://github.com/mattheworiordan))
24
95
  - Fix channel history pagination test [\#143](https://github.com/ably/ably-ruby/pull/143) ([funkyboy](https://github.com/funkyboy))
96
+ - New release v1.0.5 [\#142](https://github.com/ably/ably-ruby/pull/142) ([funkyboy](https://github.com/funkyboy))
25
97
  - Fix presence history test [\#141](https://github.com/ably/ably-ruby/pull/141) ([funkyboy](https://github.com/funkyboy))
26
98
  - Do not encode strings in-place [\#140](https://github.com/ably/ably-ruby/pull/140) ([aschuster3](https://github.com/aschuster3))
27
99
 
@@ -65,7 +137,7 @@
65
137
  - Channel name encoding error for REST requests [\#119](https://github.com/ably/ably-ruby/pull/119) ([mattheworiordan](https://github.com/mattheworiordan))
66
138
 
67
139
  ## [v1.0.1](https://github.com/ably/ably-ruby/tree/v1.0.1) (2017-05-11)
68
- [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.0.0...v1.0.1)
140
+ [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.1.0-beta.push.1...v1.0.1)
69
141
 
70
142
  ## [v1.1.0-beta.push.1](https://github.com/ably/ably-ruby/tree/v1.1.0-beta.push.1) (2017-04-25)
71
143
  [Full Changelog](https://github.com/ably/ably-ruby/compare/v1.0.0...v1.1.0-beta.push.1)
@@ -1,6 +1,4 @@
1
- Copyright (c) 2015-2017 Ably
2
-
3
- Copyright 2015-2017 Ably Real-time Ltd
1
+ Copyright 2015-2020 Ably Real-time Ltd (ably.com)
4
2
 
5
3
  Licensed under the Apache License, Version 2.0 (the "License");
6
4
  you may not use this file except in compliance with the License.
@@ -3,7 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/ably.svg)](http://badge.fury.io/rb/ably)
4
4
  [![Coverage Status](https://coveralls.io/repos/ably/ably-ruby/badge.svg)](https://coveralls.io/r/ably/ably-ruby)
5
5
 
6
- A Ruby client library for [ably.io](https://www.ably.io), the realtime messaging service.
6
+ A Ruby client library for [ably.io](https://www.ably.io), the realtime messaging service. This library currently targets the [Ably 1.1 client library specification](https://www.ably.io/documentation/client-lib-development-guide/features/). You can jump to the '[Known Limitations](#known-limitations)' section to see the features this client library does not yet support or [view our client library SDKs feature support matrix](https://www.ably.io/download/sdk-feature-support-matrix) to see the list of all the available features.
7
7
 
8
8
  ## Supported platforms
9
9
 
@@ -13,6 +13,14 @@ We regression-test the SDK against a selection of Ruby versions (which we update
13
13
 
14
14
  If you find any compatibility issues, please [do raise an issue](https://github.com/ably/ably-ruby/issues/new) in this repository or [contact Ably customer support](https://support.ably.io/) for advice.
15
15
 
16
+ ## Known Limitations
17
+
18
+ This client library is currently *not compatible* with some of the Ably features:
19
+
20
+ | Feature |
21
+ | :--- |
22
+ | [Custom transportParams](https://www.ably.io/documentation/realtime/connection#client-options) |
23
+
16
24
  ## Documentation
17
25
 
18
26
  Visit https://www.ably.io/documentation for a complete API reference and more examples.
@@ -316,11 +324,8 @@ To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANG
316
324
  This library uses [semantic versioning](http://semver.org/). For each release, the following needs to be done:
317
325
 
318
326
  * Update the version number in [version.rb](./lib/ably/version.rb) and commit the change.
319
- * Run [`github_changelog_generator`](https://github.com/skywinder/Github-Changelog-Generator) to automate the update of the [CHANGELOG](./CHANGELOG.md). Once the `CHANGELOG` update has completed, manually change the `Unreleased` heading and link with the current version number such as `v1.0.0`. Also ensure that the `Full Changelog` link points to the new version tag instead of the `HEAD`. Commit this change.
327
+ * Run [`github_changelog_generator`](https://github.com/skywinder/Github-Changelog-Generator) to automate the update of the [CHANGELOG](./CHANGELOG.md). Once the `CHANGELOG` update has completed, manually change the `Unreleased` heading and link with the current version number such as `v1.0.0`. Also ensure that the `Full Changelog` link points to the new version tag instead of the `HEAD`. Ideally, run `rake doc:spec` to generate a new [spec file](./SPEC.md). Then commit these changes.
320
328
  * Add a tag and push to origin such as `git tag v1.0.0 && git push origin v1.0.0`
321
329
  * Visit [https://github.com/ably/ably-ruby/tags](https://github.com/ably/ably-ruby/tags) and `Add release notes` for the release including links to the changelog entry.
322
- * Run `rake release` to publish the gem to [Rubygems](http://www.rubydoc.info/gems/ably)
323
-
324
- ## License
325
-
326
- Copyright (c) 2017 Ably Real-time Ltd, Licensed under the Apache License, Version 2.0. Refer to [LICENSE](LICENSE) for the license terms.
330
+ * Run `rake release` to publish the gem to [Rubygems](https://rubygems.org/gems/ably)
331
+ * Release the [REST-only library `ably-ruby-rest`](https://github.com/ably/ably-ruby-rest#release-process)
@@ -29,6 +29,38 @@ begin
29
29
  Rake::Task[:spec].invoke
30
30
  end
31
31
  end
32
+
33
+ desc 'Generate error code constants from ably-common: https://github.com/ably/ably-common/issues/32'
34
+ task :generate_error_codes do
35
+ errors_json_path = File.join(File.dirname(__FILE__), 'lib/submodules/ably-common/protocol/errors.json')
36
+ module_path = File.join(File.dirname(__FILE__), 'lib/ably/modules/exception_codes.rb')
37
+ max_length = 0
38
+
39
+ errors = JSON.parse(File.read(errors_json_path)).each_with_object({}) do |(key, val), hash|
40
+ hash[key] = val.split(/\s+/).map { |d| d.upcase.gsub(/[^a-zA-Z]+/, '') }.join('_')
41
+ end.each do |code, const_name|
42
+ max_length = [const_name.length, max_length].max
43
+ end.map do |code, const_name|
44
+ " #{const_name.ljust(max_length, ' ')} = #{code}"
45
+ end.join("\n")
46
+ module_content = <<-EOF
47
+ # This file is generated by running `rake :generate_error_codes`
48
+ # Do not manually modify this file
49
+ # Generated at: #{Time.now.utc}
50
+ #
51
+ module Ably
52
+ module Exceptions
53
+ module Codes
54
+ #{errors}
55
+ end
56
+ end
57
+ end
58
+ EOF
59
+ File.open(module_path, 'w') { |file| file.write module_content }
60
+
61
+ puts "Error code constants have been generated into #{module_path}"
62
+ puts "Warning: Search for any constants referenced in this library if their name has changed as a result of this constant generation!"
63
+ end
32
64
  rescue LoadError
33
65
  # RSpec not available
34
66
  end
@@ -1,4 +1,4 @@
1
- # Ably Realtime & REST Client Library 0.9.0-pre.1 Specification
1
+ # Ably Realtime & REST Client Library 1.1.0 Specification
2
2
 
3
3
  ### Ably::Realtime::Auth
4
4
  _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_spec.rb))_
@@ -55,7 +55,7 @@ _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_sp
55
55
  * and an incompatible client_id in a TokenDetails object passed to the auth callback
56
56
  * [rejects a TokenDetails object with an incompatible client_id and fails with an exception](./spec/acceptance/realtime/auth_spec.rb#L287)
57
57
  * when already authenticated with a valid token
58
- * [ensures message delivery continuity whilst upgrading (#RTC8a1)](./spec/acceptance/realtime/auth_spec.rb#L700)
58
+ * [ensures message delivery continuity whilst upgrading (#RTC8a1)](./spec/acceptance/realtime/auth_spec.rb#L701)
59
59
  * when INITIALIZED
60
60
  * [obtains a token and connects to Ably (#RTC8c, #RTC8b1)](./spec/acceptance/realtime/auth_spec.rb#L328)
61
61
  * when CONNECTING
@@ -76,73 +76,99 @@ _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_sp
76
76
  * when client is identified
77
77
  * [transitions the connection state to FAILED if the client_id changes (#RSA15c, #RTC8a2)](./spec/acceptance/realtime/auth_spec.rb#L596)
78
78
  * when auth fails
79
- * [transitions the connection state to the FAILED state (#RSA15c, #RTC8a2, #RTC8a3)](./spec/acceptance/realtime/auth_spec.rb#L611)
79
+ * [transitions the connection state to the FAILED state (#RSA15c, #RTC8a2, #RTC8a3)](./spec/acceptance/realtime/auth_spec.rb#L612)
80
80
  * when the authCallback fails
81
- * [calls the error callback of authorize and leaves the connection intact (#RSA4c3)](./spec/acceptance/realtime/auth_spec.rb#L639)
81
+ * [calls the error callback of authorize and leaves the connection intact (#RSA4c3)](./spec/acceptance/realtime/auth_spec.rb#L640)
82
82
  * when upgrading capabilities
83
- * [is allowed (#RTC8a1)](./spec/acceptance/realtime/auth_spec.rb#L658)
83
+ * [is allowed (#RTC8a1)](./spec/acceptance/realtime/auth_spec.rb#L659)
84
84
  * when downgrading capabilities (#RTC8a1)
85
- * [is allowed and channels are detached](./spec/acceptance/realtime/auth_spec.rb#L683)
85
+ * [is allowed and channels are detached](./spec/acceptance/realtime/auth_spec.rb#L684)
86
86
  * #authorize_async
87
- * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L734)
87
+ * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L735)
88
88
  * server initiated AUTH ProtocolMessage
89
89
  * when received
90
- * [should immediately start a new authentication process (#RTN22)](./spec/acceptance/realtime/auth_spec.rb#L758)
90
+ * [should immediately start a new authentication process (#RTN22)](./spec/acceptance/realtime/auth_spec.rb#L756)
91
91
  * when not received
92
- * [should expect the connection to be disconnected by the server but should resume automatically (#RTN22a)](./spec/acceptance/realtime/auth_spec.rb#L781)
92
+ * [should expect the connection to be disconnected by the server but should resume automatically (#RTN22a)](./spec/acceptance/realtime/auth_spec.rb#L779)
93
93
  * #auth_params
94
- * [returns the auth params asynchronously](./spec/acceptance/realtime/auth_spec.rb#L807)
94
+ * [returns the auth params asynchronously](./spec/acceptance/realtime/auth_spec.rb#L805)
95
95
  * #auth_params_sync
96
- * [returns the auth params synchronously](./spec/acceptance/realtime/auth_spec.rb#L816)
96
+ * [returns the auth params synchronously](./spec/acceptance/realtime/auth_spec.rb#L814)
97
97
  * #auth_header
98
- * [returns an auth header asynchronously](./spec/acceptance/realtime/auth_spec.rb#L823)
98
+ * [returns an auth header asynchronously](./spec/acceptance/realtime/auth_spec.rb#L821)
99
99
  * #auth_header_sync
100
- * [returns an auth header synchronously](./spec/acceptance/realtime/auth_spec.rb#L832)
100
+ * [returns an auth header synchronously](./spec/acceptance/realtime/auth_spec.rb#L830)
101
101
  * #client_id_validated?
102
102
  * when using basic auth
103
103
  * before connected
104
- * [is false as basic auth users do not have an identity](./spec/acceptance/realtime/auth_spec.rb#L845)
104
+ * [is false as basic auth users do not have an identity](./spec/acceptance/realtime/auth_spec.rb#L843)
105
105
  * once connected
106
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L852)
107
- * [contains a validated wildcard client_id](./spec/acceptance/realtime/auth_spec.rb#L859)
106
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L850)
107
+ * [contains a validated wildcard client_id](./spec/acceptance/realtime/auth_spec.rb#L857)
108
108
  * when using a token string
109
109
  * with a valid client_id
110
110
  * before connected
111
- * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L873)
112
- * [#client_id is nil](./spec/acceptance/realtime/auth_spec.rb#L878)
111
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L871)
112
+ * [#client_id is nil](./spec/acceptance/realtime/auth_spec.rb#L876)
113
113
  * once connected
114
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L885)
115
- * [#client_id is populated](./spec/acceptance/realtime/auth_spec.rb#L892)
114
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L883)
115
+ * [#client_id is populated](./spec/acceptance/realtime/auth_spec.rb#L890)
116
116
  * with no client_id (anonymous)
117
117
  * before connected
118
- * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L905)
118
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L903)
119
119
  * once connected
120
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L912)
120
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L910)
121
121
  * with a wildcard client_id (anonymous)
122
122
  * before connected
123
- * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L925)
123
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L923)
124
124
  * once connected
125
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L932)
125
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L930)
126
126
  * when using a token
127
127
  * with a client_id
128
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L946)
128
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L944)
129
129
  * once connected
130
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L952)
130
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L950)
131
131
  * with no client_id (anonymous)
132
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L964)
132
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L962)
133
133
  * once connected
134
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L970)
134
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L968)
135
135
  * with a wildcard client_id (anonymous)
136
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L982)
136
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L980)
137
137
  * once connected
138
- * [is true](./spec/acceptance/realtime/auth_spec.rb#L988)
138
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L986)
139
139
  * when using a token request with a client_id
140
- * [is not true as identification is not confirmed until authenticated](./spec/acceptance/realtime/auth_spec.rb#L1001)
140
+ * [is not true as identification is not confirmed until authenticated](./spec/acceptance/realtime/auth_spec.rb#L999)
141
141
  * once connected
142
- * [is true as identification is completed following CONNECTED ProtocolMessage](./spec/acceptance/realtime/auth_spec.rb#L1007)
142
+ * [is true as identification is completed following CONNECTED ProtocolMessage](./spec/acceptance/realtime/auth_spec.rb#L1005)
143
143
  * deprecated #authorise
144
- * [logs a deprecation warning (#RSA10l)](./spec/acceptance/realtime/auth_spec.rb#L1045)
145
- * [returns a valid token (#RSA10l)](./spec/acceptance/realtime/auth_spec.rb#L1051)
144
+ * [logs a deprecation warning (#RSA10l)](./spec/acceptance/realtime/auth_spec.rb#L1019)
145
+ * [returns a valid token (#RSA10l)](./spec/acceptance/realtime/auth_spec.rb#L1025)
146
+ * when using JWT
147
+ * when using auth_url
148
+ * when credentials are valid
149
+ * [client successfully fetches a channel and publishes a message](./spec/acceptance/realtime/auth_spec.rb#L1044)
150
+ * when credentials are wrong
151
+ * [disconnected includes and invalid signature message](./spec/acceptance/realtime/auth_spec.rb#L1057)
152
+ * when token is expired
153
+ * [receives a 40142 error from the server](./spec/acceptance/realtime/auth_spec.rb#L1070)
154
+ * when using auth_callback
155
+ * when credentials are valid
156
+ * [authentication succeeds and client can post a message](./spec/acceptance/realtime/auth_spec.rb#L1095)
157
+ * when credentials are invalid
158
+ * [authentication fails and reason for disconnection is invalid signature](./spec/acceptance/realtime/auth_spec.rb#L1110)
159
+ * when the client is initialized with ClientOptions and the token is a JWT token
160
+ * when credentials are valid
161
+ * [posts successfully to a channel](./spec/acceptance/realtime/auth_spec.rb#L1127)
162
+ * when credentials are invalid
163
+ * [fails with an invalid signature error](./spec/acceptance/realtime/auth_spec.rb#L1141)
164
+ * when JWT token expires
165
+ * [client disconnects, a new token is requested via auth_callback and the client gets reconnected](./spec/acceptance/realtime/auth_spec.rb#L1168)
166
+ * and an AUTH procol message is received
167
+ * [client reauths correctly without going through a disconnection](./spec/acceptance/realtime/auth_spec.rb#L1196)
168
+ * when the JWT token request includes a client_id
169
+ * [the client_id is the same that was specified in the auth_callback that generated the JWT token](./spec/acceptance/realtime/auth_spec.rb#L1224)
170
+ * when the JWT token request includes a subscribe-only capability
171
+ * [client fails to publish to a channel with subscribe-only capability and publishes successfully on a channel with permissions](./spec/acceptance/realtime/auth_spec.rb#L1242)
146
172
 
147
173
  ### Ably::Realtime::Channel#history
148
174
  _(see [spec/acceptance/realtime/channel_history_spec.rb](./spec/acceptance/realtime/channel_history_spec.rb))_
@@ -154,295 +180,307 @@ _(see [spec/acceptance/realtime/channel_history_spec.rb](./spec/acceptance/realt
154
180
  * [retrieves realtime history on both channels](./spec/acceptance/realtime/channel_history_spec.rb#L46)
155
181
  * with lots of messages published with a single client and channel
156
182
  * as one ProtocolMessage
157
- * [retrieves history forwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L88)
158
- * [retrieves history backwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L97)
183
+ * [retrieves history forwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L94)
184
+ * [retrieves history backwards with pagination through :limit option](./spec/acceptance/realtime/channel_history_spec.rb#L103)
159
185
  * in multiple ProtocolMessages
160
- * [retrieves limited history forwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L108)
161
- * [retrieves limited history backwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L119)
186
+ * FAILED: ~~[retrieves limited history forwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L114)~~
187
+ * FAILED: ~~[retrieves limited history backwards with pagination](./spec/acceptance/realtime/channel_history_spec.rb#L125)~~
162
188
  * and REST history
163
- * [return the same results with unique matching message IDs](./spec/acceptance/realtime/channel_history_spec.rb#L135)
189
+ * [return the same results with unique matching message IDs](./spec/acceptance/realtime/channel_history_spec.rb#L141)
164
190
  * with option until_attach: true
165
- * [retrieves all messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L160)
166
- * [fails the deferrable unless the state is attached](./spec/acceptance/realtime/channel_history_spec.rb#L209)
191
+ * [retrieves all messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L166)
192
+ * [fails the deferrable unless the state is attached](./spec/acceptance/realtime/channel_history_spec.rb#L215)
167
193
  * and two pages of messages
168
- * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L175)
194
+ * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L181)
169
195
 
170
196
  ### Ably::Realtime::Channel
171
197
  _(see [spec/acceptance/realtime/channel_spec.rb](./spec/acceptance/realtime/channel_spec.rb))_
172
198
  * using JSON protocol
173
199
  * initialization
174
200
  * with :auto_connect option set to false on connection
175
- * [remains initialized when accessing a channel](./spec/acceptance/realtime/channel_spec.rb#L26)
176
- * [opens a connection implicitly on #attach](./spec/acceptance/realtime/channel_spec.rb#L34)
201
+ * [remains initialized when accessing a channel](./spec/acceptance/realtime/channel_spec.rb#L29)
202
+ * [opens a connection implicitly on #attach](./spec/acceptance/realtime/channel_spec.rb#L37)
177
203
  * #attach
178
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L139)
179
- * [calls the SafeDeferrable callback on success (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L144)
204
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L142)
205
+ * [calls the SafeDeferrable callback on success (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L147)
180
206
  * when initialized
181
- * [emits attaching then attached events](./spec/acceptance/realtime/channel_spec.rb#L45)
182
- * [ignores subsequent #attach calls but calls the success callback if provided](./spec/acceptance/realtime/channel_spec.rb#L55)
183
- * [attaches to a channel](./spec/acceptance/realtime/channel_spec.rb#L68)
184
- * [attaches to a channel and calls the provided block (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L76)
185
- * [sends an ATTACH and waits for an ATTACHED (#RTL4c)](./spec/acceptance/realtime/channel_spec.rb#L83)
186
- * [implicitly attaches the channel (#RTL7c)](./spec/acceptance/realtime/channel_spec.rb#L107)
207
+ * [emits attaching then attached events](./spec/acceptance/realtime/channel_spec.rb#L48)
208
+ * [ignores subsequent #attach calls but calls the success callback if provided](./spec/acceptance/realtime/channel_spec.rb#L58)
209
+ * [attaches to a channel](./spec/acceptance/realtime/channel_spec.rb#L71)
210
+ * [attaches to a channel and calls the provided block (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L79)
211
+ * [sends an ATTACH and waits for an ATTACHED (#RTL4c)](./spec/acceptance/realtime/channel_spec.rb#L86)
212
+ * [implicitly attaches the channel (#RTL7c)](./spec/acceptance/realtime/channel_spec.rb#L110)
187
213
  * when the implicit channel attach fails
188
- * [registers the listener anyway (#RTL7c)](./spec/acceptance/realtime/channel_spec.rb#L124)
214
+ * [registers the listener anyway (#RTL7c)](./spec/acceptance/realtime/channel_spec.rb#L127)
189
215
  * when an ATTACHED acknowledge is not received on the current connection
190
- * [sends another ATTACH each time the connection becomes connected](./spec/acceptance/realtime/channel_spec.rb#L155)
216
+ * [sends another ATTACH each time the connection becomes connected](./spec/acceptance/realtime/channel_spec.rb#L158)
191
217
  * when state is :attached
192
- * [does nothing (#RTL4a)](./spec/acceptance/realtime/channel_spec.rb#L193)
218
+ * [does nothing (#RTL4a)](./spec/acceptance/realtime/channel_spec.rb#L196)
193
219
  * when state is :failed
194
- * [reattaches and sets the errorReason to nil (#RTL4g)](./spec/acceptance/realtime/channel_spec.rb#L213)
220
+ * [reattaches and sets the errorReason to nil (#RTL4g)](./spec/acceptance/realtime/channel_spec.rb#L216)
195
221
  * when state is :detaching
196
- * [does the attach operation after the completion of the pending request (#RTL4h)](./spec/acceptance/realtime/channel_spec.rb#L228)
222
+ * [does the attach operation after the completion of the pending request (#RTL4h)](./spec/acceptance/realtime/channel_spec.rb#L231)
197
223
  * with many connections and many channels on each simultaneously
198
- * [attaches all channels](./spec/acceptance/realtime/channel_spec.rb#L256)
224
+ * [attaches all channels](./spec/acceptance/realtime/channel_spec.rb#L259)
199
225
  * failure as a result of insufficient key permissions
200
- * [emits failed event (#RTL4e)](./spec/acceptance/realtime/channel_spec.rb#L288)
201
- * [calls the errback of the returned Deferrable (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L297)
202
- * [updates the error_reason](./spec/acceptance/realtime/channel_spec.rb#L305)
226
+ * [emits failed event (#RTL4e)](./spec/acceptance/realtime/channel_spec.rb#L291)
227
+ * [calls the errback of the returned Deferrable (#RTL4d)](./spec/acceptance/realtime/channel_spec.rb#L300)
228
+ * [updates the error_reason](./spec/acceptance/realtime/channel_spec.rb#L308)
203
229
  * and subsequent authorisation with suitable permissions
204
- * [attaches to the channel successfully and resets the channel error_reason](./spec/acceptance/realtime/channel_spec.rb#L314)
230
+ * [attaches to the channel successfully and resets the channel error_reason](./spec/acceptance/realtime/channel_spec.rb#L317)
205
231
  * with connection state
206
- * [is initialized (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L333)
207
- * [is connecting (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L340)
208
- * [is disconnected (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L348)
232
+ * [is initialized (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L336)
233
+ * [is connecting (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L343)
234
+ * [is disconnected (#RTL4i)](./spec/acceptance/realtime/channel_spec.rb#L351)
209
235
  * #detach
210
236
  * when state is :attached
211
- * [it detaches from a channel (#RTL5d)](./spec/acceptance/realtime/channel_spec.rb#L363)
212
- * [detaches from a channel and calls the provided block (#RTL5d, #RTL5e)](./spec/acceptance/realtime/channel_spec.rb#L373)
213
- * [emits :detaching then :detached events](./spec/acceptance/realtime/channel_spec.rb#L383)
214
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L395)
215
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/channel_spec.rb#L402)
237
+ * [it detaches from a channel (#RTL5d)](./spec/acceptance/realtime/channel_spec.rb#L366)
238
+ * [detaches from a channel and calls the provided block (#RTL5d, #RTL5e)](./spec/acceptance/realtime/channel_spec.rb#L376)
239
+ * [emits :detaching then :detached events](./spec/acceptance/realtime/channel_spec.rb#L386)
240
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L398)
241
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/channel_spec.rb#L405)
216
242
  * and DETACHED message is not received within realtime request timeout
217
- * [fails the deferrable and returns to the previous state (#RTL5f, #RTL5e)](./spec/acceptance/realtime/channel_spec.rb#L416)
243
+ * [fails the deferrable and returns to the previous state (#RTL5f, #RTL5e)](./spec/acceptance/realtime/channel_spec.rb#L419)
218
244
  * when state is :failed
219
- * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L436)
245
+ * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L439)
220
246
  * when state is :attaching
221
- * [waits for the attach to complete and then moves to detached](./spec/acceptance/realtime/channel_spec.rb#L449)
247
+ * [waits for the attach to complete and then moves to detached](./spec/acceptance/realtime/channel_spec.rb#L452)
222
248
  * when state is :detaching
223
- * [ignores subsequent #detach calls but calls the callback if provided (#RTL5i)](./spec/acceptance/realtime/channel_spec.rb#L466)
249
+ * [ignores subsequent #detach calls but calls the callback if provided (#RTL5i)](./spec/acceptance/realtime/channel_spec.rb#L469)
224
250
  * when state is :suspended
225
- * [moves the channel state immediately to DETACHED state (#RTL5j)](./spec/acceptance/realtime/channel_spec.rb#L483)
251
+ * [moves the channel state immediately to DETACHED state (#RTL5j)](./spec/acceptance/realtime/channel_spec.rb#L486)
226
252
  * when state is :initialized
227
- * [does nothing as there is no channel to detach (#RTL5a)](./spec/acceptance/realtime/channel_spec.rb#L503)
228
- * [returns a valid deferrable](./spec/acceptance/realtime/channel_spec.rb#L511)
253
+ * [does nothing as there is no channel to detach (#RTL5a)](./spec/acceptance/realtime/channel_spec.rb#L506)
254
+ * [returns a valid deferrable](./spec/acceptance/realtime/channel_spec.rb#L514)
229
255
  * when state is :detached
230
- * [does nothing as the channel is detached (#RTL5a)](./spec/acceptance/realtime/channel_spec.rb#L521)
256
+ * [does nothing as the channel is detached (#RTL5a)](./spec/acceptance/realtime/channel_spec.rb#L524)
231
257
  * when connection state is
232
258
  * closing
233
- * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L538)
259
+ * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L541)
234
260
  * failed and channel is failed
235
- * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L558)
261
+ * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L561)
236
262
  * failed and channel is detached
237
- * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L580)
263
+ * [fails the deferrable (#RTL5b)](./spec/acceptance/realtime/channel_spec.rb#L583)
238
264
  * initialized
239
- * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L600)
265
+ * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L603)
240
266
  * connecting
241
- * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L615)
267
+ * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L618)
242
268
  * disconnected
243
- * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L634)
269
+ * [does the detach operation once the connection state is connected (#RTL5h)](./spec/acceptance/realtime/channel_spec.rb#L637)
244
270
  * automatic channel recovery
245
271
  * when an ATTACH request times out
246
- * [moves to the SUSPENDED state (#RTL4f)](./spec/acceptance/realtime/channel_spec.rb#L661)
272
+ * [moves to the SUSPENDED state (#RTL4f)](./spec/acceptance/realtime/channel_spec.rb#L664)
247
273
  * if a subsequent ATTACHED is received on an ATTACHED channel
248
- * [ignores the additional ATTACHED if resumed is true (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L675)
249
- * [emits an UPDATE only when resumed is true (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L689)
250
- * [emits an UPDATE when resumed is true and includes the reason error from the ProtocolMessage (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L705)
274
+ * [ignores the additional ATTACHED if resumed is true (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L678)
275
+ * [emits an UPDATE only when resumed is true (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L692)
276
+ * [emits an UPDATE when resumed is true and includes the reason error from the ProtocolMessage (#RTL12)](./spec/acceptance/realtime/channel_spec.rb#L708)
251
277
  * #publish
252
- * when attached
253
- * [publishes messages](./spec/acceptance/realtime/channel_spec.rb#L730)
254
- * when not yet attached
255
- * [publishes queued messages once attached](./spec/acceptance/realtime/channel_spec.rb#L742)
256
- * [publishes queued messages within a single protocol message](./spec/acceptance/realtime/channel_spec.rb#L750)
257
- * with :queue_messages client option set to false
258
- * and connection state initialized
259
- * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L773)
260
- * and connection state connecting
261
- * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L783)
262
- * and connection state disconnected
263
- * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L797)
264
- * and connection state connected
265
- * [publishes the message](./spec/acceptance/realtime/channel_spec.rb#L812)
278
+ * when channel is attached (#RTL6c1)
279
+ * [publishes messages](./spec/acceptance/realtime/channel_spec.rb#L733)
280
+ * when channel is not attached in state Initializing (#RTL6c1)
281
+ * [publishes messages immediately and does not implicitly attach (#RTL6c1)](./spec/acceptance/realtime/channel_spec.rb#L745)
282
+ * when channel is Attaching (#RTL6c1)
283
+ * [publishes messages immediately (#RTL6c1)](./spec/acceptance/realtime/channel_spec.rb#L762)
284
+ * when channel is Detaching (#RTL6c1)
285
+ * [publishes messages immediately (#RTL6c1)](./spec/acceptance/realtime/channel_spec.rb#L787)
286
+ * when channel is Detached (#RTL6c1)
287
+ * [publishes messages immediately (#RTL6c1)](./spec/acceptance/realtime/channel_spec.rb#L814)
288
+ * with :queue_messages client option set to false (#RTL6c4)
289
+ * and connection state connected (#RTL6c4)
290
+ * [publishes the message](./spec/acceptance/realtime/channel_spec.rb#L845)
291
+ * and connection state initialized (#RTL6c4)
292
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L854)
293
+ * and connection state connecting (#RTL6c4)
294
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L864)
295
+ * and connection state disconnected (#RTL6c4)
296
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L879)
297
+ * and connection state suspended (#RTL6c4)
298
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L879)
299
+ * and connection state closing (#RTL6c4)
300
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L879)
301
+ * and connection state closed (#RTL6c4)
302
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L879)
303
+ * and the channel state is failed (#RTL6c4)
304
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L900)
266
305
  * with name and data arguments
267
- * [publishes the message and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L823)
306
+ * [publishes the message and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L918)
268
307
  * and additional attributes
269
- * [publishes the message with the attributes and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L836)
308
+ * [publishes the message with the attributes and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L931)
270
309
  * and additional invalid attributes
271
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L849)
310
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L944)
272
311
  * with an array of Hash objects with :name and :data attributes
273
- * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L863)
312
+ * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L958)
274
313
  * with an array of Message objects
275
- * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L891)
314
+ * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L986)
276
315
  * nil attributes
277
316
  * when name is nil
278
- * [publishes the message without a name attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L915)
317
+ * [publishes the message without a name attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L1010)
279
318
  * when data is nil
280
- * [publishes the message without a data attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L938)
319
+ * [publishes the message without a data attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L1033)
281
320
  * with neither name or data attributes
282
- * [publishes the message without any attributes in the payload](./spec/acceptance/realtime/channel_spec.rb#L961)
321
+ * [publishes the message without any attributes in the payload](./spec/acceptance/realtime/channel_spec.rb#L1056)
283
322
  * with two invalid message out of 12
284
323
  * before client_id is known (validated)
285
- * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L985)
324
+ * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L1080)
286
325
  * when client_id is known (validated)
287
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1005)
326
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1100)
288
327
  * only invalid messages
289
328
  * before client_id is known (validated)
290
- * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L1024)
329
+ * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L1119)
291
330
  * when client_id is known (validated)
292
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1043)
331
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1138)
293
332
  * with many many messages and many connections simultaneously
294
- * [publishes all messages, all success callbacks are called, and a history request confirms all messages were published](./spec/acceptance/realtime/channel_spec.rb#L1057)
333
+ * [publishes all messages, all success callbacks are called, and a history request confirms all messages were published](./spec/acceptance/realtime/channel_spec.rb#L1152)
334
+ * with more than allowed messages in a single publish
335
+ * [rejects the publish](./spec/acceptance/realtime/channel_spec.rb#L1175)
295
336
  * identified clients
296
337
  * when authenticated with a wildcard client_id
297
338
  * with a valid client_id in the message
298
- * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1085)
339
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1195)
299
340
  * with a wildcard client_id in the message
300
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1097)
341
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1207)
301
342
  * with a non-String client_id in the message
302
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1104)
343
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1214)
303
344
  * with an empty client_id in the message
304
- * [succeeds and publishes without a client_id](./spec/acceptance/realtime/channel_spec.rb#L1111)
345
+ * [succeeds and publishes without a client_id](./spec/acceptance/realtime/channel_spec.rb#L1221)
305
346
  * when authenticated with a Token string with an implicit client_id
306
347
  * before the client is CONNECTED and the client's identity has been obtained
307
348
  * with a valid client_id in the message
308
- * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1131)
349
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1241)
309
350
  * with an invalid client_id in the message
310
- * [succeeds in the client library but then fails when delivered to Ably](./spec/acceptance/realtime/channel_spec.rb#L1144)
351
+ * [succeeds in the client library but then fails when delivered to Ably](./spec/acceptance/realtime/channel_spec.rb#L1254)
311
352
  * with an empty client_id in the message
312
- * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1155)
353
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1265)
313
354
  * after the client is CONNECTED and the client's identity is known
314
355
  * with a valid client_id in the message
315
- * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1169)
356
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1279)
316
357
  * with an invalid client_id in the message
317
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1183)
358
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1293)
318
359
  * with an empty client_id in the message
319
- * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1192)
360
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1302)
320
361
  * when authenticated with a valid client_id
321
362
  * with a valid client_id
322
- * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1214)
363
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L1324)
323
364
  * with a wildcard client_id in the message
324
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1226)
365
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1336)
325
366
  * with an invalid client_id in the message
326
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1233)
367
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1343)
327
368
  * with an empty client_id in the message
328
- * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1240)
369
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1350)
329
370
  * when anonymous and no client_id
330
371
  * with a client_id in the message
331
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1259)
372
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1369)
332
373
  * with a wildcard client_id in the message
333
- * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1266)
374
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L1376)
334
375
  * with an empty client_id in the message
335
- * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1273)
376
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L1383)
336
377
  * #subscribe
337
378
  * with an event argument
338
- * [subscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1289)
379
+ * [subscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1399)
339
380
  * before attach
340
- * [receives messages as soon as attached](./spec/acceptance/realtime/channel_spec.rb#L1299)
381
+ * [receives messages as soon as attached](./spec/acceptance/realtime/channel_spec.rb#L1409)
341
382
  * with no event argument
342
- * [subscribes for all events](./spec/acceptance/realtime/channel_spec.rb#L1313)
383
+ * [subscribes for all events](./spec/acceptance/realtime/channel_spec.rb#L1423)
343
384
  * with a callback that raises an exception
344
- * [logs the error and continues](./spec/acceptance/realtime/channel_spec.rb#L1325)
385
+ * [logs the error and continues](./spec/acceptance/realtime/channel_spec.rb#L1435)
345
386
  * many times with different event names
346
- * [filters events accordingly to each callback](./spec/acceptance/realtime/channel_spec.rb#L1344)
387
+ * [filters events accordingly to each callback](./spec/acceptance/realtime/channel_spec.rb#L1454)
347
388
  * #unsubscribe
348
389
  * with an event argument
349
- * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1367)
390
+ * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1477)
350
391
  * with no event argument
351
- * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1380)
392
+ * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L1490)
352
393
  * when connection state changes to
353
394
  * :failed
354
395
  * an :attaching channel
355
- * [transitions state to :failed (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1403)
396
+ * [transitions state to :failed (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1513)
356
397
  * an :attached channel
357
- * [transitions state to :failed (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1420)
358
- * [updates the channel error_reason (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1432)
398
+ * [transitions state to :failed (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1530)
399
+ * [updates the channel error_reason (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1542)
359
400
  * a :detached channel
360
- * [remains in the :detached state (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1446)
401
+ * [remains in the :detached state (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1556)
361
402
  * a :failed channel
362
- * [remains in the :failed state and ignores the failure error (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1465)
403
+ * [remains in the :failed state and ignores the failure error (#RTL3a)](./spec/acceptance/realtime/channel_spec.rb#L1575)
363
404
  * a channel ATTACH request
364
- * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1485)
405
+ * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1595)
365
406
  * :closed
366
407
  * an :attached channel
367
- * [transitions state to :detached (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1501)
408
+ * [transitions state to :detached (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1611)
368
409
  * an :attaching channel (#RTL3b)
369
- * [transitions state to :detached](./spec/acceptance/realtime/channel_spec.rb#L1512)
410
+ * [transitions state to :detached](./spec/acceptance/realtime/channel_spec.rb#L1622)
370
411
  * a :detached channel
371
- * [remains in the :detached state (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1527)
412
+ * [remains in the :detached state (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1637)
372
413
  * a :failed channel
373
- * [remains in the :failed state and retains the error_reason (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1547)
414
+ * [remains in the :failed state and retains the error_reason (#RTL3b)](./spec/acceptance/realtime/channel_spec.rb#L1657)
374
415
  * a channel ATTACH request when connection CLOSED
375
- * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1567)
416
+ * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1677)
376
417
  * a channel ATTACH request when connection CLOSING
377
- * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1581)
418
+ * [fails the deferrable (#RTL4b)](./spec/acceptance/realtime/channel_spec.rb#L1691)
378
419
  * :suspended
379
420
  * an :attaching channel
380
- * [transitions state to :suspended (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1597)
421
+ * [transitions state to :suspended (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1707)
381
422
  * an :attached channel
382
- * [transitions state to :suspended (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1611)
383
- * [transitions state automatically to :attaching once the connection is re-established (#RTN15c3)](./spec/acceptance/realtime/channel_spec.rb#L1620)
423
+ * [transitions state to :suspended (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1721)
424
+ * [transitions state automatically to :attaching once the connection is re-established (#RTN15c3)](./spec/acceptance/realtime/channel_spec.rb#L1730)
384
425
  * a :detached channel
385
- * [remains in the :detached state (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1634)
426
+ * [remains in the :detached state (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1744)
386
427
  * a :failed channel
387
- * [remains in the :failed state and retains the error_reason (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1654)
428
+ * [remains in the :failed state and retains the error_reason (#RTL3c)](./spec/acceptance/realtime/channel_spec.rb#L1764)
388
429
  * a channel ATTACH request when connection SUSPENDED (#RTL4b)
389
- * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L1676)
430
+ * [fails the deferrable](./spec/acceptance/realtime/channel_spec.rb#L1786)
390
431
  * :connected
391
432
  * a :suspended channel
392
- * [is automatically reattached (#RTL3d)](./spec/acceptance/realtime/channel_spec.rb#L1692)
433
+ * [is automatically reattached (#RTL3d)](./spec/acceptance/realtime/channel_spec.rb#L1802)
393
434
  * when re-attach attempt fails
394
- * [returns to a suspended state (#RTL3d)](./spec/acceptance/realtime/channel_spec.rb#L1709)
435
+ * [returns to a suspended state (#RTL3d)](./spec/acceptance/realtime/channel_spec.rb#L1819)
395
436
  * :disconnected
396
437
  * with an initialized channel
397
- * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1735)
438
+ * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1845)
398
439
  * with an attaching channel
399
- * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1748)
440
+ * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1858)
400
441
  * with an attached channel
401
- * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1763)
442
+ * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1873)
402
443
  * with a detached channel
403
- * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1775)
444
+ * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1885)
404
445
  * with a failed channel
405
- * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1797)
446
+ * [has no effect on the channel states (#RTL3e)](./spec/acceptance/realtime/channel_spec.rb#L1907)
406
447
  * #presence
407
- * [returns a Ably::Realtime::Presence object](./spec/acceptance/realtime/channel_spec.rb#L1812)
448
+ * [returns a Ably::Realtime::Presence object](./spec/acceptance/realtime/channel_spec.rb#L1922)
408
449
  * channel state change
409
- * [emits a ChannelStateChange object](./spec/acceptance/realtime/channel_spec.rb#L1819)
450
+ * [emits a ChannelStateChange object](./spec/acceptance/realtime/channel_spec.rb#L1929)
410
451
  * ChannelStateChange object
411
- * [has current state](./spec/acceptance/realtime/channel_spec.rb#L1828)
412
- * [has a previous state](./spec/acceptance/realtime/channel_spec.rb#L1837)
413
- * [has the event that generated the state change (#TA5)](./spec/acceptance/realtime/channel_spec.rb#L1846)
414
- * [has an empty reason when there is no error](./spec/acceptance/realtime/channel_spec.rb#L1864)
452
+ * [has current state](./spec/acceptance/realtime/channel_spec.rb#L1938)
453
+ * [has a previous state](./spec/acceptance/realtime/channel_spec.rb#L1947)
454
+ * [has the event that generated the state change (#TA5)](./spec/acceptance/realtime/channel_spec.rb#L1956)
455
+ * [has an empty reason when there is no error](./spec/acceptance/realtime/channel_spec.rb#L1974)
415
456
  * on failure
416
- * [has a reason Error object when there is an error on the channel](./spec/acceptance/realtime/channel_spec.rb#L1877)
457
+ * [has a reason Error object when there is an error on the channel](./spec/acceptance/realtime/channel_spec.rb#L1987)
417
458
  * #resume (#RTL2f)
418
- * [is false when a channel first attaches](./spec/acceptance/realtime/channel_spec.rb#L1890)
419
- * PENDING: *[is true when a connection is recovered and the channel is attached](./spec/acceptance/realtime/channel_spec.rb#L1898)*
420
- * [is false when a connection fails to recover and the channel is attached](./spec/acceptance/realtime/channel_spec.rb#L1919)
459
+ * [is false when a channel first attaches](./spec/acceptance/realtime/channel_spec.rb#L2000)
460
+ * [is true when a connection is recovered and the channel is attached](./spec/acceptance/realtime/channel_spec.rb#L2008)
461
+ * [is false when a connection fails to recover and the channel is attached](./spec/acceptance/realtime/channel_spec.rb#L2027)
421
462
  * when a resume fails
422
- * [is false when a resume fails to recover and the channel is automatically re-attached](./spec/acceptance/realtime/channel_spec.rb#L1941)
463
+ * [is false when a resume fails to recover and the channel is automatically re-attached](./spec/acceptance/realtime/channel_spec.rb#L2049)
423
464
  * moves to
424
465
  * suspended
425
- * [all queued messages fail with NACK (#RTL11)](./spec/acceptance/realtime/channel_spec.rb#L1960)
426
- * [all published messages awaiting an ACK do nothing (#RTL11a)](./spec/acceptance/realtime/channel_spec.rb#L1983)
427
- * detached
428
- * [all queued messages fail with NACK (#RTL11)](./spec/acceptance/realtime/channel_spec.rb#L1960)
429
- * [all published messages awaiting an ACK do nothing (#RTL11a)](./spec/acceptance/realtime/channel_spec.rb#L1983)
466
+ * [all queued messages fail with NACK (#RTL11)](./spec/acceptance/realtime/channel_spec.rb#L2072)
467
+ * [all published messages awaiting an ACK do nothing (#RTL11a)](./spec/acceptance/realtime/channel_spec.rb#L2095)
430
468
  * failed
431
- * [all queued messages fail with NACK (#RTL11)](./spec/acceptance/realtime/channel_spec.rb#L1960)
432
- * [all published messages awaiting an ACK do nothing (#RTL11a)](./spec/acceptance/realtime/channel_spec.rb#L1983)
469
+ * [all queued messages fail with NACK (#RTL11)](./spec/acceptance/realtime/channel_spec.rb#L2072)
470
+ * [all published messages awaiting an ACK do nothing (#RTL11a)](./spec/acceptance/realtime/channel_spec.rb#L2095)
433
471
  * when it receives a server-initiated DETACHED (#RTL13)
434
472
  * and channel is initialized (#RTL13)
435
- * [does nothing](./spec/acceptance/realtime/channel_spec.rb#L2017)
473
+ * [does nothing](./spec/acceptance/realtime/channel_spec.rb#L2130)
436
474
  * and channel is failed
437
- * [does nothing (#RTL13)](./spec/acceptance/realtime/channel_spec.rb#L2038)
475
+ * [does nothing (#RTL13)](./spec/acceptance/realtime/channel_spec.rb#L2151)
438
476
  * and channel is attached
439
- * [reattaches immediately (#RTL13a)](./spec/acceptance/realtime/channel_spec.rb#L2054)
477
+ * [reattaches immediately (#RTL13a)](./spec/acceptance/realtime/channel_spec.rb#L2167)
440
478
  * and channel is suspended
441
- * [reattaches immediately (#RTL13a)](./spec/acceptance/realtime/channel_spec.rb#L2070)
479
+ * [reattaches immediately (#RTL13a)](./spec/acceptance/realtime/channel_spec.rb#L2183)
442
480
  * and channel is attaching
443
- * [will move to the SUSPENDED state and then attempt to ATTACH with the ATTACHING state (#RTL13b)](./spec/acceptance/realtime/channel_spec.rb#L2092)
481
+ * [will move to the SUSPENDED state and then attempt to ATTACH with the ATTACHING state (#RTL13b)](./spec/acceptance/realtime/channel_spec.rb#L2205)
444
482
  * when it receives an ERROR ProtocolMessage
445
- * [should transition to the failed state and the error_reason should be set (#RTL14)](./spec/acceptance/realtime/channel_spec.rb#L2140)
483
+ * [should transition to the failed state and the error_reason should be set (#RTL14)](./spec/acceptance/realtime/channel_spec.rb#L2253)
446
484
 
447
485
  ### Ably::Realtime::Channels
448
486
  _(see [spec/acceptance/realtime/channels_spec.rb](./spec/acceptance/realtime/channels_spec.rb))_
@@ -469,58 +507,75 @@ _(see [spec/acceptance/realtime/client_spec.rb](./spec/acceptance/realtime/clien
469
507
  * using JSON protocol
470
508
  * initialization
471
509
  * basic auth
472
- * [is enabled by default with a provided :key option](./spec/acceptance/realtime/client_spec.rb#L18)
510
+ * [is enabled by default with a provided :key option](./spec/acceptance/realtime/client_spec.rb#L19)
511
+ * with an invalid API key
512
+ * [logs an entry with a help href url matching the code #TI5](./spec/acceptance/realtime/client_spec.rb#L32)
473
513
  * :tls option
474
514
  * set to false to force a plain-text connection
475
- * [fails to connect because a private key cannot be sent over a non-secure connection](./spec/acceptance/realtime/client_spec.rb#L31)
515
+ * [fails to connect because a private key cannot be sent over a non-secure connection](./spec/acceptance/realtime/client_spec.rb#L48)
476
516
  * token auth
477
517
  * with TLS enabled
478
518
  * and a pre-generated Token provided with the :token option
479
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L52)
519
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L69)
480
520
  * with valid :key and :use_token_auth option set to true
481
- * [automatically authorizes on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L65)
521
+ * [automatically authorizes on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L82)
482
522
  * with client_id
483
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L78)
523
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L95)
484
524
  * with TLS disabled
485
525
  * and a pre-generated Token provided with the :token option
486
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L52)
526
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L69)
487
527
  * with valid :key and :use_token_auth option set to true
488
- * [automatically authorizes on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L65)
528
+ * [automatically authorizes on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L82)
489
529
  * with client_id
490
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L78)
530
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L95)
491
531
  * with a Proc for the :auth_callback option
492
- * [calls the Proc](./spec/acceptance/realtime/client_spec.rb#L103)
493
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/realtime/client_spec.rb#L110)
532
+ * [calls the Proc](./spec/acceptance/realtime/client_spec.rb#L120)
533
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/realtime/client_spec.rb#L127)
494
534
  * when the returned token has a client_id
495
- * [sets Auth#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L118)
496
- * [sets Client#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L126)
535
+ * [sets Auth#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L135)
536
+ * [sets Client#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L143)
497
537
  * with a wildcard client_id token
498
538
  * and an explicit client_id in ClientOptions
499
- * [allows uses the explicit client_id in the connection](./spec/acceptance/realtime/client_spec.rb#L144)
539
+ * [allows uses the explicit client_id in the connection](./spec/acceptance/realtime/client_spec.rb#L161)
500
540
  * and client_id omitted in ClientOptions
501
- * [uses the token provided clientId in the connection](./spec/acceptance/realtime/client_spec.rb#L160)
541
+ * [uses the token provided clientId in the connection](./spec/acceptance/realtime/client_spec.rb#L177)
502
542
  * with an invalid wildcard "*" :client_id
503
- * [raises an exception](./spec/acceptance/realtime/client_spec.rb#L176)
543
+ * [raises an exception](./spec/acceptance/realtime/client_spec.rb#L193)
504
544
  * realtime connection settings
505
545
  * defaults
506
- * [disconnected_retry_timeout is 15s](./spec/acceptance/realtime/client_spec.rb#L185)
507
- * [suspended_retry_timeout is 30s](./spec/acceptance/realtime/client_spec.rb#L190)
546
+ * [disconnected_retry_timeout is 15s](./spec/acceptance/realtime/client_spec.rb#L202)
547
+ * [suspended_retry_timeout is 30s](./spec/acceptance/realtime/client_spec.rb#L207)
508
548
  * overriden in ClientOptions
509
- * [disconnected_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L199)
510
- * [suspended_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L204)
549
+ * [disconnected_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L216)
550
+ * [suspended_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L221)
511
551
  * #connection
512
- * [provides access to the Connection object](./spec/acceptance/realtime/client_spec.rb#L213)
552
+ * [provides access to the Connection object](./spec/acceptance/realtime/client_spec.rb#L230)
513
553
  * #channels
514
- * [provides access to the Channels collection object](./spec/acceptance/realtime/client_spec.rb#L220)
554
+ * [provides access to the Channels collection object](./spec/acceptance/realtime/client_spec.rb#L237)
515
555
  * #auth
516
- * [provides access to the Realtime::Auth object](./spec/acceptance/realtime/client_spec.rb#L227)
556
+ * [provides access to the Realtime::Auth object](./spec/acceptance/realtime/client_spec.rb#L244)
517
557
  * #request (#RSC19*)
518
558
  * get
519
- * [returns an HttpPaginatedResponse object](./spec/acceptance/realtime/client_spec.rb#L237)
559
+ * [returns an HttpPaginatedResponse object](./spec/acceptance/realtime/client_spec.rb#L254)
520
560
  * 404 request to invalid URL
521
- * [returns an object with 404 status code and error message](./spec/acceptance/realtime/client_spec.rb#L246)
561
+ * [returns an object with 404 status code and error message](./spec/acceptance/realtime/client_spec.rb#L263)
522
562
  * paged results
523
- * [provides paging](./spec/acceptance/realtime/client_spec.rb#L260)
563
+ * [provides paging](./spec/acceptance/realtime/client_spec.rb#L277)
564
+ * #publish (#TBC)
565
+ * [publishing a message implicity connects and publishes the message successfully on the provided channel](./spec/acceptance/realtime/client_spec.rb#L311)
566
+ * [publishing does not result in a channel being created](./spec/acceptance/realtime/client_spec.rb#L322)
567
+ * [publishing supports an array of Message objects](./spec/acceptance/realtime/client_spec.rb#L349)
568
+ * [publishing supports an array of Hash objects](./spec/acceptance/realtime/client_spec.rb#L360)
569
+ * [publishing on a closed connection fails](./spec/acceptance/realtime/client_spec.rb#L371)
570
+ * with extras
571
+ * [publishing supports extras](./spec/acceptance/realtime/client_spec.rb#L338)
572
+ * queue_messages ClientOption
573
+ * when true
574
+ * [will queue messages whilst connecting and publish once connected](./spec/acceptance/realtime/client_spec.rb#L387)
575
+ * when false
576
+ * [will reject messages on an initializing connection](./spec/acceptance/realtime/client_spec.rb#L404)
577
+ * with more than allowed messages in a single publish
578
+ * [rejects the publish](./spec/acceptance/realtime/client_spec.rb#L421)
524
579
 
525
580
  ### Ably::Realtime::Connection failures
526
581
  _(see [spec/acceptance/realtime/connection_failures_spec.rb](./spec/acceptance/realtime/connection_failures_spec.rb))_
@@ -578,71 +633,81 @@ _(see [spec/acceptance/realtime/connection_failures_spec.rb](./spec/acceptance/r
578
633
  * connection resume
579
634
  * when DISCONNECTED ProtocolMessage received from the server
580
635
  * [reconnects automatically and immediately](./spec/acceptance/realtime/connection_failures_spec.rb#L497)
636
+ * connection state freshness is monitored
637
+ * [resumes connections when disconnected within the connection_state_ttl period (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L518)
638
+ * when connection_state_ttl period has passed since being disconnected
639
+ * [clears the local connection state and uses a new connection when the connection_state_ttl period has passed (#RTN15g)](./spec/acceptance/realtime/connection_failures_spec.rb#L558)
640
+ * when connection_state_ttl period has passed since last activity on the connection
641
+ * [does not clear the local connection state when the connection_state_ttl period has passed since last activity, but the idle timeout has not passed (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L611)
642
+ * [clears the local connection state and uses a new connection when the connection_state_ttl + max_idle_interval period has passed since last activity (#RTN15g1, #RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L645)
643
+ * [still reattaches the channels automatically following a new connection being established (#RTN15g2)](./spec/acceptance/realtime/connection_failures_spec.rb#L680)
581
644
  * and subsequently fails to reconnect
582
- * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L529)
645
+ * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L739)
583
646
  * when websocket transport is abruptly disconnected
584
- * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L572)
647
+ * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L782)
585
648
  * hosts used
586
- * [reconnects with the default host](./spec/acceptance/realtime/connection_failures_spec.rb#L588)
649
+ * [reconnects with the default host](./spec/acceptance/realtime/connection_failures_spec.rb#L798)
587
650
  * after successfully reconnecting and resuming
588
- * [retains connection_id and updates the connection_key (#RTN15e, #RTN16d)](./spec/acceptance/realtime/connection_failures_spec.rb#L612)
589
- * [includes the error received in the connection state change from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L627)
590
- * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L653)
591
- * [retains the client_serial (#RTN15c2, #RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L714)
651
+ * [retains connection_id and updates the connection_key (#RTN15e, #RTN16d)](./spec/acceptance/realtime/connection_failures_spec.rb#L822)
652
+ * [includes the error received in the connection state change from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L837)
653
+ * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L863)
654
+ * [retains the client_serial (#RTN15c2, #RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L924)
592
655
  * when messages were published whilst the client was disconnected
593
- * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L681)
656
+ * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L891)
594
657
  * when failing to resume
595
658
  * because the connection_key is not or no longer valid
596
- * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L754)
597
- * [issue a reattach for all attached channels and fail all message awaiting an ACK (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L769)
598
- * [issue a reattach for all attaching channels and fail all queued messages (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L807)
599
- * [issue a attach for all suspended channels (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L843)
600
- * [sets the error reason on each channel](./spec/acceptance/realtime/connection_failures_spec.rb#L881)
601
- * [resets the client_serial (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L896)
659
+ * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L964)
660
+ * [issue a reattach for all attached channels and fail all message awaiting an ACK (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L979)
661
+ * [issue a reattach for all attaching channels and fail all queued messages (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1017)
662
+ * [issue a attach for all suspended channels (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1053)
663
+ * [sets the error reason on each channel](./spec/acceptance/realtime/connection_failures_spec.rb#L1091)
664
+ * [resets the client_serial (#RTN15c3)](./spec/acceptance/realtime/connection_failures_spec.rb#L1106)
602
665
  * as the DISCONNECTED window to resume has passed
603
- * [starts a new connection automatically and does not try and resume](./spec/acceptance/realtime/connection_failures_spec.rb#L933)
666
+ * [starts a new connection automatically and does not try and resume](./spec/acceptance/realtime/connection_failures_spec.rb#L1143)
604
667
  * when an ERROR protocol message is received
605
668
  * whilst connecting
606
669
  * with a token error code in the range 40140 <= code < 40150 (#RTN14b)
607
- * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L960)
670
+ * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1174)
608
671
  * with an error code indicating an error other than a token failure (#RTN14g, #RTN15i)
609
- * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L976)
672
+ * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1190)
610
673
  * with no error code indicating an error other than a token failure (#RTN14g, #RTN15i)
611
- * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L989)
674
+ * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1203)
612
675
  * whilst connected
613
676
  * with a token error code in the range 40140 <= code < 40150 (#RTN14b)
614
- * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L960)
677
+ * [triggers a re-authentication](./spec/acceptance/realtime/connection_failures_spec.rb#L1174)
615
678
  * with an error code indicating an error other than a token failure (#RTN14g, #RTN15i)
616
- * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L976)
679
+ * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1190)
617
680
  * with no error code indicating an error other than a token failure (#RTN14g, #RTN15i)
618
- * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L989)
681
+ * [causes the connection to fail](./spec/acceptance/realtime/connection_failures_spec.rb#L1203)
619
682
  * whilst resuming
620
683
  * with a token error code in the region 40140 <= code < 40150 (RTN15c5)
621
- * [triggers a re-authentication and then resumes the connection](./spec/acceptance/realtime/connection_failures_spec.rb#L1033)
684
+ * [triggers a re-authentication and then resumes the connection](./spec/acceptance/realtime/connection_failures_spec.rb#L1247)
622
685
  * with any other error (#RTN15c4)
623
- * [moves the connection to the failed state](./spec/acceptance/realtime/connection_failures_spec.rb#L1065)
686
+ * [moves the connection to the failed state](./spec/acceptance/realtime/connection_failures_spec.rb#L1279)
624
687
  * fallback host feature
625
688
  * with custom realtime websocket host option
626
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1109)
689
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1323)
627
690
  * with custom realtime websocket port option
628
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1127)
691
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1341)
629
692
  * with non-production environment
630
- * [does not use a fallback host by default](./spec/acceptance/realtime/connection_failures_spec.rb#L1146)
693
+ * [does not use a fallback host by default](./spec/acceptance/realtime/connection_failures_spec.rb#L1360)
631
694
  * :fallback_hosts_use_default is true
632
- * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k7)](./spec/acceptance/realtime/connection_failures_spec.rb#L1164)
695
+ * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k7)](./spec/acceptance/realtime/connection_failures_spec.rb#L1378)
696
+ * [does not use a fallback host if the connection connects on the default host and then later becomes disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L1396)
633
697
  * :fallback_hosts array is provided
634
- * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1189)
698
+ * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1424)
635
699
  * with production environment
636
700
  * when the Internet is down
637
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1225)
701
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L1460)
638
702
  * when the Internet is up
639
703
  * and default options
640
- * [uses a fallback host + the original host once on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L1248)
641
- * [uses the primary host when suspended, and then every fallback host and the primary host again on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L1267)
704
+ * [uses a fallback host + the original host once on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L1483)
705
+ * [uses the primary host when suspended, and then every fallback host and the primary host again on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L1502)
706
+ * [uses the correct host name for the WebSocket requests to the fallback hosts](./spec/acceptance/realtime/connection_failures_spec.rb#L1525)
642
707
  * :fallback_hosts array is provided by an empty array
643
- * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1297)
708
+ * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1555)
644
709
  * :fallback_hosts array is provided
645
- * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1317)
710
+ * [uses a fallback host on every subsequent disconnected attempt until suspended (#RTN17b, #TO3k6)](./spec/acceptance/realtime/connection_failures_spec.rb#L1575)
646
711
 
647
712
  ### Ably::Realtime::Connection
648
713
  _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/connection_spec.rb))_
@@ -672,186 +737,186 @@ _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/c
672
737
  * when connected with a valid non-expired token
673
738
  * that then expires following the connection being opened
674
739
  * the server
675
- * [disconnects the client, and the client automatically renews the token and then reconnects](./spec/acceptance/realtime/connection_spec.rb#L213)
740
+ * [disconnects the client, and the client automatically renews the token and then reconnects](./spec/acceptance/realtime/connection_spec.rb#L217)
676
741
  * connection state
677
- * PENDING: *[retains messages published when disconnected three times during authentication](./spec/acceptance/realtime/connection_spec.rb#L273)*
742
+ * [retains messages published when disconnected three times during authentication](./spec/acceptance/realtime/connection_spec.rb#L277)
678
743
  * and subsequent token is invalid
679
- * [transitions the connection to the failed state](./spec/acceptance/realtime/connection_spec.rb#L309)
744
+ * [transitions the connection to the failed state](./spec/acceptance/realtime/connection_spec.rb#L312)
680
745
  * for non-renewable tokens
681
746
  * that are expired
682
747
  * opening a new connection
683
- * [transitions state to failed (#RSA4a)](./spec/acceptance/realtime/connection_spec.rb#L339)
748
+ * [transitions state to failed (#RSA4a)](./spec/acceptance/realtime/connection_spec.rb#L342)
684
749
  * when connected
685
- * [transitions state to failed (#RSA4a)](./spec/acceptance/realtime/connection_spec.rb#L355)
750
+ * [transitions state to failed (#RSA4a)](./spec/acceptance/realtime/connection_spec.rb#L358)
686
751
  * with opaque token string that contain an implicit client_id
687
752
  * string
688
- * [sets the Client#client_id and Auth#client_id once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L375)
753
+ * [sets the Client#client_id and Auth#client_id once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L378)
689
754
  * that is incompatible with the current client client_id
690
- * [fails the connection](./spec/acceptance/realtime/connection_spec.rb#L387)
755
+ * [fails the connection](./spec/acceptance/realtime/connection_spec.rb#L390)
691
756
  * wildcard
692
- * [configures the Client#client_id and Auth#client_id with a wildcard once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L401)
757
+ * [configures the Client#client_id and Auth#client_id with a wildcard once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L404)
693
758
  * initialization state changes
694
759
  * with implicit #connect
695
- * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L433)
760
+ * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L436)
696
761
  * with explicit #connect
697
- * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L439)
762
+ * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L442)
698
763
  * #connect
699
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L447)
700
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L452)
701
- * [calls the provided block on success even if state changes to disconnected first](./spec/acceptance/realtime/connection_spec.rb#L459)
764
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L450)
765
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L455)
766
+ * [calls the provided block on success even if state changes to disconnected first](./spec/acceptance/realtime/connection_spec.rb#L462)
702
767
  * with invalid auth details
703
- * [calls the Deferrable errback only once on connection failure](./spec/acceptance/realtime/connection_spec.rb#L488)
768
+ * [calls the Deferrable errback only once on connection failure](./spec/acceptance/realtime/connection_spec.rb#L491)
704
769
  * when already connected
705
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L504)
770
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L507)
706
771
  * connection#id
707
- * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L518)
772
+ * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L521)
708
773
  * connection#key
709
- * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L525)
774
+ * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L528)
710
775
  * once connected
711
776
  * connection#id
712
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L536)
713
- * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L543)
714
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L550)
777
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L539)
778
+ * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L546)
779
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L553)
715
780
  * connection#key
716
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L559)
717
- * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L566)
718
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L573)
781
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L562)
782
+ * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L569)
783
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L576)
719
784
  * following a previous connection being opened and closed
720
- * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L583)
785
+ * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L586)
721
786
  * when closing
722
- * [fails the deferrable before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L600)
787
+ * [fails the deferrable before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L603)
723
788
  * #serial connection serial
724
- * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L617)
725
- * [is set to 0 when a message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L640)
726
- * [is set to 1 when the second message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L647)
789
+ * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L620)
790
+ * [is set to 0 when a message is received back](./spec/acceptance/realtime/connection_spec.rb#L643)
791
+ * [is set to 1 when the second message is received](./spec/acceptance/realtime/connection_spec.rb#L651)
727
792
  * when a message is sent but the ACK has not yet been received
728
- * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L625)
793
+ * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L628)
729
794
  * #close
730
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L658)
731
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L665)
795
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L668)
796
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L675)
732
797
  * when already closed
733
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L676)
798
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L686)
734
799
  * when connection state is
735
800
  * :initialized
736
- * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L703)
801
+ * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L713)
737
802
  * :connected
738
- * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L720)
803
+ * [changes the connection state to :closing and waits for the server to confirm connection is :closed with a ProtocolMessage](./spec/acceptance/realtime/connection_spec.rb#L730)
739
804
  * with an unresponsive connection
740
- * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L747)
805
+ * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L757)
741
806
  * #ping
742
- * [echoes a heart beat (#RTN13a)](./spec/acceptance/realtime/connection_spec.rb#L769)
743
- * [sends a unique ID in each protocol message (#RTN13e)](./spec/acceptance/realtime/connection_spec.rb#L779)
744
- * [waits until the connection becomes CONNECTED when in the CONNETING state](./spec/acceptance/realtime/connection_spec.rb#L803)
807
+ * [echoes a heart beat (#RTN13a)](./spec/acceptance/realtime/connection_spec.rb#L779)
808
+ * [sends a unique ID in each protocol message (#RTN13e)](./spec/acceptance/realtime/connection_spec.rb#L789)
809
+ * [waits until the connection becomes CONNECTED when in the CONNETING state](./spec/acceptance/realtime/connection_spec.rb#L813)
745
810
  * with incompatible states
746
811
  * when not connected
747
- * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L816)
812
+ * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L826)
748
813
  * when suspended
749
- * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L825)
814
+ * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L835)
750
815
  * when failed
751
- * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L837)
816
+ * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L847)
752
817
  * when closed
753
- * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L849)
818
+ * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L859)
754
819
  * when it becomes closed
755
- * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L863)
820
+ * [fails the deferrable (#RTN13b)](./spec/acceptance/realtime/connection_spec.rb#L873)
756
821
  * with a success block that raises an exception
757
- * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L876)
822
+ * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L886)
758
823
  * when ping times out
759
- * [fails the deferrable logs a warning (#RTN13a, #RTN13c)](./spec/acceptance/realtime/connection_spec.rb#L890)
760
- * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L909)
824
+ * [fails the deferrable logs a warning (#RTN13a, #RTN13c)](./spec/acceptance/realtime/connection_spec.rb#L900)
825
+ * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L919)
761
826
  * Heartbeats (#RTN23)
762
827
  * heartbeat interval
763
828
  * when reduced artificially
764
- * [is the sum of the max_idle_interval and realtime_request_timeout (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L936)
765
- * [disconnects the transport if no heartbeat received since connected (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L946)
766
- * [disconnects the transport if no heartbeat received since last event received (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L957)
829
+ * [is the sum of the max_idle_interval and realtime_request_timeout (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L946)
830
+ * [disconnects the transport if no heartbeat received since connected (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L956)
831
+ * [disconnects the transport if no heartbeat received since last event received (#RTN23a)](./spec/acceptance/realtime/connection_spec.rb#L967)
767
832
  * transport-level heartbeats are supported in the websocket transport
768
- * [provides the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L972)
769
- * PENDING: *[receives websocket heartbeat messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L981)*
833
+ * [provides the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L982)
834
+ * [receives websocket heartbeat messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L991)
770
835
  * with websocket heartbeats disabled (undocumented)
771
- * [does not provide the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1000)
772
- * [receives websocket protocol messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1009)
836
+ * PENDING: *[does not provide the heartbeats argument in the websocket connection params (#RTN23b)](./spec/acceptance/realtime/connection_spec.rb#L1007)*
837
+ * [receives websocket protocol messages (#RTN23b) [slow test as need to wait for heartbeat]](./spec/acceptance/realtime/connection_spec.rb#L1017)
773
838
  * #details
774
- * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L1026)
775
- * [contains the ConnectionDetails object once connected (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1033)
776
- * [contains the new ConnectionDetails object once a subsequent connection is created (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1042)
839
+ * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L1035)
840
+ * [contains the ConnectionDetails object once connected (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1042)
841
+ * [contains the new ConnectionDetails object once a subsequent connection is created (#RTN21)](./spec/acceptance/realtime/connection_spec.rb#L1051)
777
842
  * with a different default connection_state_ttl
778
- * [updates the private Connection#connection_state_ttl when received from Ably in ConnectionDetails](./spec/acceptance/realtime/connection_spec.rb#L1063)
843
+ * [updates the private Connection#connection_state_ttl when received from Ably in ConnectionDetails](./spec/acceptance/realtime/connection_spec.rb#L1072)
779
844
  * recovery
780
845
  * #recovery_key
781
- * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L1100)
782
- * [is available when connection is in one of the states: connecting, connected, disconnected](./spec/acceptance/realtime/connection_spec.rb#L1123)
783
- * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L1152)
846
+ * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L1109)
847
+ * [is available when connection is in one of the states: connecting, connected, disconnected](./spec/acceptance/realtime/connection_spec.rb#L1137)
848
+ * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L1166)
784
849
  * opening a new connection using a recently disconnected connection's #recovery_key
785
- * connection#id and connection#key after recovery
786
- * [remains the same for id and party for key](./spec/acceptance/realtime/connection_spec.rb#L1164)
850
+ * connection#id after recovery
851
+ * [remains the same](./spec/acceptance/realtime/connection_spec.rb#L1178)
787
852
  * when messages have been sent whilst the old connection is disconnected
788
853
  * the new connection
789
- * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L1206)
854
+ * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L1214)
790
855
  * with :recover option
791
856
  * with invalid syntax
792
- * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L1238)
857
+ * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L1246)
793
858
  * with invalid formatted value sent to server
794
- * [sets the #error_reason and moves the connection to FAILED](./spec/acceptance/realtime/connection_spec.rb#L1247)
859
+ * [sets the #error_reason and moves the connection to FAILED](./spec/acceptance/realtime/connection_spec.rb#L1255)
795
860
  * with expired (missing) value sent to server
796
- * [connects but sets the error reason and includes the reason in the state change](./spec/acceptance/realtime/connection_spec.rb#L1262)
861
+ * [connects but sets the error reason and includes the reason in the state change](./spec/acceptance/realtime/connection_spec.rb#L1270)
797
862
  * with many connections simultaneously
798
- * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1281)
863
+ * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1289)
799
864
  * when a state transition is unsupported
800
- * [logs the invalid state change as fatal](./spec/acceptance/realtime/connection_spec.rb#L1301)
865
+ * [logs the invalid state change as fatal](./spec/acceptance/realtime/connection_spec.rb#L1309)
801
866
  * protocol failure
802
867
  * receiving an invalid ProtocolMessage
803
- * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1317)
868
+ * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1325)
804
869
  * undocumented method
805
870
  * #internet_up?
806
- * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1335)
871
+ * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1343)
807
872
  * internet up URL protocol
808
873
  * when using TLS for the connection
809
- * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1346)
874
+ * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1354)
810
875
  * when using a non-secured connection
811
- * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1356)
876
+ * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1364)
812
877
  * when the Internet is up
813
- * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1387)
814
- * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1394)
878
+ * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1395)
879
+ * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1402)
815
880
  * with a TLS connection
816
- * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1370)
881
+ * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1378)
817
882
  * with a non-TLS connection
818
- * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1380)
883
+ * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1388)
819
884
  * when the Internet is down
820
- * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1409)
821
- * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1416)
885
+ * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1417)
886
+ * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1424)
822
887
  * state change side effects
823
888
  * when connection enters the :disconnected state
824
- * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1430)
889
+ * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1438)
825
890
  * when connection enters the :suspended state
826
- * [moves the channels into the suspended state and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1463)
891
+ * [moves the channels into the suspended state and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1471)
827
892
  * when connection enters the :failed state
828
- * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1494)
893
+ * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1502)
829
894
  * connection state change
830
- * [emits event to all and single subscribers](./spec/acceptance/realtime/connection_spec.rb#L1508)
831
- * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1523)
895
+ * [emits event to all and single subscribers](./spec/acceptance/realtime/connection_spec.rb#L1516)
896
+ * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1531)
832
897
  * ConnectionStateChange object
833
- * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1531)
834
- * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1539)
835
- * [has the event that generated the state change (#TH5)](./spec/acceptance/realtime/connection_spec.rb#L1547)
836
- * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1563)
898
+ * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1539)
899
+ * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1547)
900
+ * [has the event that generated the state change (#TH5)](./spec/acceptance/realtime/connection_spec.rb#L1555)
901
+ * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1571)
837
902
  * on failure
838
- * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1576)
903
+ * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1584)
839
904
  * retry_in
840
- * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1591)
841
- * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1598)
842
- * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1608)
843
- * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1618)
905
+ * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1599)
906
+ * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1606)
907
+ * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1616)
908
+ * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1626)
844
909
  * whilst CONNECTED
845
910
  * when a CONNECTED message is received (#RTN24)
846
- * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1653)
847
- * [updates the ConnectionDetail and Connection attributes (#RTC8a1)](./spec/acceptance/realtime/connection_spec.rb#L1668)
911
+ * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1661)
912
+ * [updates the ConnectionDetail and Connection attributes (#RTC8a1)](./spec/acceptance/realtime/connection_spec.rb#L1676)
848
913
  * when a CONNECTED message with an error is received
849
- * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1703)
914
+ * [emits an UPDATE event](./spec/acceptance/realtime/connection_spec.rb#L1711)
850
915
  * version params
851
- * [sends the protocol version param v (#G4, #RTN2f)](./spec/acceptance/realtime/connection_spec.rb#L1724)
852
- * [sends the lib version param lib (#RTN2g)](./spec/acceptance/realtime/connection_spec.rb#L1733)
916
+ * [sends the protocol version param v (#G4, #RTN2f)](./spec/acceptance/realtime/connection_spec.rb#L1732)
917
+ * [sends the lib version param lib (#RTN2g)](./spec/acceptance/realtime/connection_spec.rb#L1741)
853
918
  * with variant
854
- * [sends the lib version param lib with the variant (#RTN2g + #RSC7b)](./spec/acceptance/realtime/connection_spec.rb#L1753)
919
+ * [sends the lib version param lib with the variant (#RTN2g + #RSC7b)](./spec/acceptance/realtime/connection_spec.rb#L1761)
855
920
 
856
921
  ### Ably::Realtime::Channel Message
857
922
  _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/message_spec.rb))_
@@ -868,154 +933,154 @@ _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/mess
868
933
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/message_spec.rb#L72)
869
934
  * with supported extra payload content type (#RTL6h, #RSL6a2)
870
935
  * JSON Object (Hash)
871
- * PENDING: *[is encoded and decoded to the same hash](./spec/acceptance/realtime/message_spec.rb#L91)*
936
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/message_spec.rb#L93)
872
937
  * JSON Array
873
- * PENDING: *[is encoded and decoded to the same Array](./spec/acceptance/realtime/message_spec.rb#L100)*
938
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/message_spec.rb#L102)
874
939
  * nil
875
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/message_spec.rb#L107)
940
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/message_spec.rb#L108)
876
941
  * with unsupported data payload content type
877
942
  * Integer
878
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/message_spec.rb#L118)
943
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/message_spec.rb#L119)
879
944
  * Float
880
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/message_spec.rb#L127)
945
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/message_spec.rb#L128)
881
946
  * Boolean
882
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/message_spec.rb#L136)
947
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/message_spec.rb#L137)
883
948
  * False
884
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/message_spec.rb#L145)
949
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/message_spec.rb#L146)
885
950
  * with ASCII_8BIT message name
886
- * [is converted into UTF_8](./spec/acceptance/realtime/message_spec.rb#L154)
951
+ * [is converted into UTF_8](./spec/acceptance/realtime/message_spec.rb#L155)
887
952
  * when the message publisher has a client_id
888
- * [contains a #client_id attribute](./spec/acceptance/realtime/message_spec.rb#L170)
953
+ * [contains a #client_id attribute](./spec/acceptance/realtime/message_spec.rb#L171)
889
954
  * #connection_id attribute
890
955
  * over realtime
891
- * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L183)
956
+ * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L184)
892
957
  * when retrieved over REST
893
- * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L195)
958
+ * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L196)
894
959
  * local echo when published
895
- * [is enabled by default](./spec/acceptance/realtime/message_spec.rb#L207)
960
+ * [is enabled by default](./spec/acceptance/realtime/message_spec.rb#L208)
896
961
  * with :echo_messages option set to false
897
- * [will not echo messages to the client but will still broadcast messages to other connected clients](./spec/acceptance/realtime/message_spec.rb#L227)
898
- * [will not echo messages to the client from other REST clients publishing using that connection_key](./spec/acceptance/realtime/message_spec.rb#L246)
899
- * [will echo messages with a valid connection_id to the client from other REST clients publishing using that connection_key](./spec/acceptance/realtime/message_spec.rb#L259)
962
+ * [will not echo messages to the client but will still broadcast messages to other connected clients](./spec/acceptance/realtime/message_spec.rb#L228)
963
+ * [will not echo messages to the client from other REST clients publishing using that connection_key](./spec/acceptance/realtime/message_spec.rb#L247)
964
+ * [will echo messages with a valid connection_id to the client from other REST clients publishing using that connection_key](./spec/acceptance/realtime/message_spec.rb#L260)
900
965
  * publishing lots of messages across two connections
901
- * [sends and receives the messages on both opened connections and calls the success callbacks for each message published](./spec/acceptance/realtime/message_spec.rb#L285)
966
+ * [sends and receives the messages on both opened connections and calls the success callbacks for each message published](./spec/acceptance/realtime/message_spec.rb#L286)
902
967
  * without suitable publishing permissions
903
- * [calls the error callback](./spec/acceptance/realtime/message_spec.rb#L330)
968
+ * [calls the error callback](./spec/acceptance/realtime/message_spec.rb#L331)
904
969
  * server incorrectly resends a message that was already received by the client library
905
- * [discards the message and logs it as an error to the channel](./spec/acceptance/realtime/message_spec.rb#L349)
970
+ * [discards the message and logs it as an error to the channel](./spec/acceptance/realtime/message_spec.rb#L350)
906
971
  * encoding and decoding encrypted messages
907
972
  * with AES-128-CBC using crypto-data-128.json fixtures (#RTL7d)
908
973
  * item 0 with encrypted encoding utf-8/cipher+aes-128-cbc/base64
909
974
  * behaves like an Ably encrypter and decrypter
910
975
  * with #publish and #subscribe
911
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
912
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
976
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
977
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
913
978
  * item 1 with encrypted encoding cipher+aes-128-cbc/base64
914
979
  * behaves like an Ably encrypter and decrypter
915
980
  * with #publish and #subscribe
916
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
917
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
981
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
982
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
918
983
  * item 2 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
919
984
  * behaves like an Ably encrypter and decrypter
920
985
  * with #publish and #subscribe
921
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
922
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
986
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
987
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
923
988
  * item 3 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
924
989
  * behaves like an Ably encrypter and decrypter
925
990
  * with #publish and #subscribe
926
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
927
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
991
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
992
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
928
993
  * with AES-256-CBC using crypto-data-256.json fixtures (#RTL7d)
929
994
  * item 0 with encrypted encoding utf-8/cipher+aes-256-cbc/base64
930
995
  * behaves like an Ably encrypter and decrypter
931
996
  * with #publish and #subscribe
932
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
933
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
997
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
998
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
934
999
  * item 1 with encrypted encoding cipher+aes-256-cbc/base64
935
1000
  * behaves like an Ably encrypter and decrypter
936
1001
  * with #publish and #subscribe
937
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
938
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
1002
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
1003
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
939
1004
  * item 2 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
940
1005
  * behaves like an Ably encrypter and decrypter
941
1006
  * with #publish and #subscribe
942
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
943
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
1007
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
1008
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
944
1009
  * item 3 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
945
1010
  * behaves like an Ably encrypter and decrypter
946
1011
  * with #publish and #subscribe
947
- * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L414)
948
- * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L432)
1012
+ * [encrypts message automatically before they are pushed to the server (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L415)
1013
+ * [sends and receives messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/realtime/message_spec.rb#L435)
949
1014
  * with multiple sends from one client to another
950
- * [encrypts and decrypts all messages](./spec/acceptance/realtime/message_spec.rb#L471)
951
- * [receives raw messages with the correct encoding](./spec/acceptance/realtime/message_spec.rb#L488)
1015
+ * [encrypts and decrypts all messages](./spec/acceptance/realtime/message_spec.rb#L474)
1016
+ * [receives raw messages with the correct encoding](./spec/acceptance/realtime/message_spec.rb#L491)
952
1017
  * subscribing with a different transport protocol
953
- * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L522)
954
- * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L522)
955
- * [delivers a Hash payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L522)
1018
+ * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L525)
1019
+ * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L525)
1020
+ * [delivers a Hash payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L525)
956
1021
  * publishing on an unencrypted channel and subscribing on an encrypted channel with another client
957
- * [does not attempt to decrypt the message](./spec/acceptance/realtime/message_spec.rb#L543)
1022
+ * [does not attempt to decrypt the message](./spec/acceptance/realtime/message_spec.rb#L546)
958
1023
  * publishing on an encrypted channel and subscribing on an unencrypted channel with another client
959
- * [delivers the message but still encrypted with a value in the #encoding attribute (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L561)
960
- * [logs a Cipher error (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L572)
1024
+ * [delivers the message but still encrypted with a value in the #encoding attribute (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L564)
1025
+ * [logs a Cipher error (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L575)
961
1026
  * publishing on an encrypted channel and subscribing with a different algorithm on another client
962
- * [delivers the message but still encrypted with the cipher detials in the #encoding attribute (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L592)
963
- * [emits a Cipher error on the channel (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L601)
1027
+ * [delivers the message but still encrypted with the cipher detials in the #encoding attribute (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L595)
1028
+ * [emits a Cipher error on the channel (#RTL7e)](./spec/acceptance/realtime/message_spec.rb#L604)
964
1029
  * publishing on an encrypted channel and subscribing with a different key on another client
965
- * [delivers the message but still encrypted with the cipher details in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L621)
966
- * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L632)
1030
+ * [delivers the message but still encrypted with the cipher details in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L624)
1031
+ * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L635)
967
1032
  * when message is published, the connection disconnects before the ACK is received, and the connection is resumed
968
- * [publishes the message again, later receives the ACK and only one message is ever received from Ably](./spec/acceptance/realtime/message_spec.rb#L651)
1033
+ * [publishes the message again, later receives the ACK and only one message is ever received from Ably](./spec/acceptance/realtime/message_spec.rb#L654)
969
1034
  * when message is published, the connection disconnects before the ACK is received
970
1035
  * the connection is not resumed
971
- * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L694)
1036
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L697)
972
1037
  * the connection becomes suspended
973
- * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L720)
1038
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L723)
974
1039
  * the connection becomes failed
975
- * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L747)
1040
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L750)
976
1041
  * message encoding interoperability
977
1042
  * over a JSON transport
978
1043
  * when decoding string
979
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L788)
1044
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L791)
980
1045
  * when encoding string
981
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L806)
1046
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L809)
982
1047
  * when decoding string
983
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L788)
1048
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L791)
984
1049
  * when encoding string
985
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L806)
1050
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L809)
986
1051
  * when decoding jsonObject
987
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L788)
1052
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L791)
988
1053
  * when encoding jsonObject
989
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L806)
1054
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L809)
990
1055
  * when decoding jsonArray
991
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L788)
1056
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L791)
992
1057
  * when encoding jsonArray
993
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L806)
1058
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L809)
994
1059
  * when decoding binary
995
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L788)
1060
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L791)
996
1061
  * when encoding binary
997
- * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L806)
1062
+ * [ensures that client libraries have compatible encoding and decoding using common fixtures](./spec/acceptance/realtime/message_spec.rb#L809)
998
1063
  * over a MsgPack transport
999
1064
  * when publishing a string using JSON protocol
1000
- * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L840)
1065
+ * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L843)
1001
1066
  * when retrieving a string using JSON protocol
1002
- * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L868)
1067
+ * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L871)
1003
1068
  * when publishing a string using JSON protocol
1004
- * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L840)
1069
+ * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L843)
1005
1070
  * when retrieving a string using JSON protocol
1006
- * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L868)
1071
+ * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L871)
1007
1072
  * when publishing a jsonObject using JSON protocol
1008
- * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L840)
1073
+ * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L843)
1009
1074
  * when retrieving a jsonObject using JSON protocol
1010
- * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L868)
1075
+ * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L871)
1011
1076
  * when publishing a jsonArray using JSON protocol
1012
- * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L840)
1077
+ * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L843)
1013
1078
  * when retrieving a jsonArray using JSON protocol
1014
- * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L868)
1079
+ * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L871)
1015
1080
  * when publishing a binary using JSON protocol
1016
- * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L840)
1081
+ * [receives the message over MsgPack and the data matches](./spec/acceptance/realtime/message_spec.rb#L843)
1017
1082
  * when retrieving a binary using JSON protocol
1018
- * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L868)
1083
+ * [is compatible with a publishes using MsgPack](./spec/acceptance/realtime/message_spec.rb#L871)
1019
1084
 
1020
1085
  ### Ably::Realtime::Presence history
1021
1086
  _(see [spec/acceptance/realtime/presence_history_spec.rb](./spec/acceptance/realtime/presence_history_spec.rb))_
@@ -1024,9 +1089,9 @@ _(see [spec/acceptance/realtime/presence_history_spec.rb](./spec/acceptance/real
1024
1089
  * [ensures REST presence history message IDs match ProtocolMessage wrapped message and connection IDs via Realtime](./spec/acceptance/realtime/presence_history_spec.rb#L42)
1025
1090
  * with option until_attach: true
1026
1091
  * [retrieves all presence messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L61)
1027
- * [fails with an exception unless state is attached](./spec/acceptance/realtime/presence_history_spec.rb#L97)
1092
+ * [fails with an exception unless state is attached](./spec/acceptance/realtime/presence_history_spec.rb#L106)
1028
1093
  * and two pages of messages
1029
- * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L78)
1094
+ * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L81)
1030
1095
 
1031
1096
  ### Ably::Realtime::Presence
1032
1097
  _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/presence_spec.rb))_
@@ -1035,35 +1100,35 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1035
1100
  * [maintains state as other clients enter and leave the channel (#RTP2e)](./spec/acceptance/realtime/presence_spec.rb#L479)
1036
1101
  * #sync_complete? and SYNC flags (#RTP1)
1037
1102
  * when attaching to a channel without any members present
1038
- * [sync_complete? is true, there is no presence flag, and the presence channel is considered synced immediately (#RTP1)](./spec/acceptance/realtime/presence_spec.rb#L701)
1103
+ * [sync_complete? is true, there is no presence flag, and the presence channel is considered synced immediately (#RTP1)](./spec/acceptance/realtime/presence_spec.rb#L708)
1039
1104
  * when attaching to a channel with members present
1040
- * [sync_complete? is false, there is a presence flag, and the presence channel is subsequently synced (#RTP1)](./spec/acceptance/realtime/presence_spec.rb#L722)
1105
+ * [sync_complete? is false, there is a presence flag, and the presence channel is subsequently synced (#RTP1)](./spec/acceptance/realtime/presence_spec.rb#L729)
1041
1106
  * 101 existing (present) members on a channel (2 SYNC pages)
1042
1107
  * requiring at least 2 SYNC ProtocolMessages
1043
1108
  * when a client attaches to the presence channel
1044
- * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L771)
1109
+ * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L781)
1045
1110
  * and a member enters before the SYNC operation is complete
1046
- * [emits a :enter immediately and the member is :present once the sync is complete (#RTP2g)](./spec/acceptance/realtime/presence_spec.rb#L787)
1111
+ * [emits a :enter immediately and the member is :present once the sync is complete (#RTP2g)](./spec/acceptance/realtime/presence_spec.rb#L797)
1047
1112
  * and a member leaves before the SYNC operation is complete
1048
- * [emits :leave immediately as the member leaves and cleans up the ABSENT member after (#RTP2f, #RTP2g)](./spec/acceptance/realtime/presence_spec.rb#L824)
1049
- * [ignores presence events with timestamps / identifiers prior to the current :present event in the MembersMap (#RTP2c)](./spec/acceptance/realtime/presence_spec.rb#L872)
1050
- * [does not emit :present after the :leave event has been emitted, and that member is not included in the list of members via #get (#RTP2f)](./spec/acceptance/realtime/presence_spec.rb#L917)
1113
+ * [emits :leave immediately as the member leaves and cleans up the ABSENT member after (#RTP2f, #RTP2g)](./spec/acceptance/realtime/presence_spec.rb#L834)
1114
+ * [ignores presence events with timestamps / identifiers prior to the current :present event in the MembersMap (#RTP2c)](./spec/acceptance/realtime/presence_spec.rb#L882)
1115
+ * [does not emit :present after the :leave event has been emitted, and that member is not included in the list of members via #get (#RTP2f)](./spec/acceptance/realtime/presence_spec.rb#L927)
1051
1116
  * #get
1052
1117
  * by default
1053
- * [waits until sync is complete (#RTP11c1)](./spec/acceptance/realtime/presence_spec.rb#L967)
1118
+ * [waits until sync is complete (#RTP11c1)](./spec/acceptance/realtime/presence_spec.rb#L977)
1054
1119
  * with :wait_for_sync option set to false (#RTP11c1)
1055
- * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L986)
1120
+ * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L998)
1056
1121
  * state
1057
1122
  * once opened
1058
- * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L1012)
1123
+ * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L1025)
1059
1124
  * #enter
1060
1125
  * data attribute
1061
1126
  * when provided as argument option to #enter
1062
- * [changes to value provided in #leave](./spec/acceptance/realtime/presence_spec.rb#L1037)
1127
+ * [changes to value provided in #leave](./spec/acceptance/realtime/presence_spec.rb#L1050)
1063
1128
  * message #connection_id
1064
- * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L1061)
1129
+ * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L1074)
1065
1130
  * without necessary capabilities to join presence
1066
- * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1080)
1131
+ * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1093)
1067
1132
  * it should behave like a public presence method
1068
1133
  * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L63)
1069
1134
  * [raise an exception if the channel becomes detached](./spec/acceptance/realtime/presence_spec.rb#L81)
@@ -1094,21 +1159,21 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1094
1159
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1095
1160
  * with unsupported data payload content type
1096
1161
  * Integer
1097
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1162
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1098
1163
  * Float
1099
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1164
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1100
1165
  * Boolean
1101
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1166
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1102
1167
  * False
1103
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1168
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1104
1169
  * if connection fails before success
1105
1170
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1106
1171
  * #update
1107
- * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L1092)
1108
- * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L1117)
1109
- * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L1127)
1172
+ * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L1105)
1173
+ * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L1130)
1174
+ * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L1140)
1110
1175
  * when ENTERED
1111
- * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L1102)
1176
+ * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L1115)
1112
1177
  * it should behave like a public presence method
1113
1178
  * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L63)
1114
1179
  * [raise an exception if the channel becomes detached](./spec/acceptance/realtime/presence_spec.rb#L81)
@@ -1139,26 +1204,26 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1139
1204
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1140
1205
  * with unsupported data payload content type
1141
1206
  * Integer
1142
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1207
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1143
1208
  * Float
1144
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1209
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1145
1210
  * Boolean
1146
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1211
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1147
1212
  * False
1148
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1213
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1149
1214
  * if connection fails before success
1150
1215
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1151
1216
  * #leave
1152
- * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L1201)
1217
+ * [succeeds and does not emit an event (#RTP10d)](./spec/acceptance/realtime/presence_spec.rb#L1224)
1153
1218
  * :data option
1154
1219
  * when set to a string
1155
- * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L1146)
1220
+ * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L1159)
1156
1221
  * when set to nil
1157
- * [emits the last value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L1159)
1222
+ * [emits the last value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L1172)
1158
1223
  * when not passed as an argument (i.e. nil)
1159
- * [emits the previous value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L1172)
1224
+ * [emits the previous value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L1185)
1160
1225
  * and sync is complete
1161
- * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L1185)
1226
+ * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L1198)
1162
1227
  * it should behave like a public presence method
1163
1228
  * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L293)
1164
1229
  * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L300)
@@ -1175,27 +1240,27 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1175
1240
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1176
1241
  * with unsupported data payload content type
1177
1242
  * Integer
1178
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1243
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1179
1244
  * Float
1180
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1245
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1181
1246
  * Boolean
1182
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1247
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1183
1248
  * False
1184
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1249
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1185
1250
  * if connection fails before success
1186
1251
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1187
1252
  * :left event
1188
- * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L1210)
1189
- * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L1221)
1253
+ * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L1240)
1254
+ * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L1251)
1190
1255
  * entering/updating/leaving presence state on behalf of another client_id
1191
1256
  * #enter_client
1192
1257
  * multiple times on the same channel with different client_ids
1193
- * [has no affect on the client's presence state and only enters on behalf of the provided client_id](./spec/acceptance/realtime/presence_spec.rb#L1244)
1194
- * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L1258)
1258
+ * [has no affect on the client's presence state and only enters on behalf of the provided client_id](./spec/acceptance/realtime/presence_spec.rb#L1274)
1259
+ * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L1288)
1195
1260
  * message #connection_id
1196
- * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L1277)
1261
+ * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L1307)
1197
1262
  * without necessary capabilities to enter on behalf of another client
1198
- * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1297)
1263
+ * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1327)
1199
1264
  * it should behave like a public presence method
1200
1265
  * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L63)
1201
1266
  * [raise an exception if the channel becomes detached](./spec/acceptance/realtime/presence_spec.rb#L81)
@@ -1226,13 +1291,13 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1226
1291
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1227
1292
  * with unsupported data payload content type
1228
1293
  * Integer
1229
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1294
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1230
1295
  * Float
1231
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1296
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1232
1297
  * Boolean
1233
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1298
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1234
1299
  * False
1235
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1300
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1236
1301
  * if connection fails before success
1237
1302
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1238
1303
  * it should behave like a presence on behalf of another client method
@@ -1267,9 +1332,9 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1267
1332
  * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L470)
1268
1333
  * #update_client
1269
1334
  * multiple times on the same channel with different client_ids
1270
- * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L1311)
1271
- * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L1335)
1272
- * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L1347)
1335
+ * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L1341)
1336
+ * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L1365)
1337
+ * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L1377)
1273
1338
  * it should behave like a public presence method
1274
1339
  * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L63)
1275
1340
  * [raise an exception if the channel becomes detached](./spec/acceptance/realtime/presence_spec.rb#L81)
@@ -1300,13 +1365,13 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1300
1365
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1301
1366
  * with unsupported data payload content type
1302
1367
  * Integer
1303
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1368
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1304
1369
  * Float
1305
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1370
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1306
1371
  * Boolean
1307
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1372
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1308
1373
  * False
1309
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1374
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1310
1375
  * if connection fails before success
1311
1376
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1312
1377
  * it should behave like a presence on behalf of another client method
@@ -1342,14 +1407,14 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1342
1407
  * #leave_client
1343
1408
  * leaves a channel
1344
1409
  * multiple times on the same channel with different client_ids
1345
- * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L1377)
1346
- * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L1401)
1410
+ * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L1407)
1411
+ * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L1431)
1347
1412
  * with a new value in :data option
1348
- * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1425)
1413
+ * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1455)
1349
1414
  * with a nil value in :data option
1350
- * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1438)
1415
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1468)
1351
1416
  * with no :data option
1352
- * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1451)
1417
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1481)
1353
1418
  * it should behave like a public presence method
1354
1419
  * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L63)
1355
1420
  * [raise an exception if the channel becomes detached](./spec/acceptance/realtime/presence_spec.rb#L81)
@@ -1380,13 +1445,13 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1380
1445
  * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L239)
1381
1446
  * with unsupported data payload content type
1382
1447
  * Integer
1383
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1448
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L259)
1384
1449
  * Float
1385
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1450
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L268)
1386
1451
  * Boolean
1387
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1452
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L277)
1388
1453
  * False
1389
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1454
+ * [raises an UnsupportedDataType 40013 exception](./spec/acceptance/realtime/presence_spec.rb#L286)
1390
1455
  * if connection fails before success
1391
1456
  * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L331)
1392
1457
  * it should behave like a presence on behalf of another client method
@@ -1420,103 +1485,170 @@ _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/pre
1420
1485
  * and an empty client_id
1421
1486
  * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L470)
1422
1487
  * #get
1423
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1470)
1424
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1475)
1425
- * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1482)
1426
- * [implicitly attaches the channel (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1490)
1427
- * [fails if the connection is DETACHED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1524)
1428
- * [fails if the connection is FAILED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1539)
1429
- * [returns the current members on the channel (#RTP11a)](./spec/acceptance/realtime/presence_spec.rb#L1623)
1430
- * [filters by connection_id option if provided (#RTP11c3)](./spec/acceptance/realtime/presence_spec.rb#L1638)
1431
- * [filters by client_id option if provided (#RTP11c2)](./spec/acceptance/realtime/presence_spec.rb#L1660)
1432
- * [does not wait for SYNC to complete if :wait_for_sync option is false (#RTP11c1)](./spec/acceptance/realtime/presence_spec.rb#L1684)
1433
- * [returns the list of members and waits for SYNC to complete by default (#RTP11a)](./spec/acceptance/realtime/presence_spec.rb#L1693)
1488
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1500)
1489
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1505)
1490
+ * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1512)
1491
+ * [implicitly attaches the channel (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1520)
1492
+ * [fails if the connection is DETACHED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1555)
1493
+ * [fails if the connection is FAILED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1570)
1494
+ * [returns the current members on the channel (#RTP11a)](./spec/acceptance/realtime/presence_spec.rb#L1654)
1495
+ * [filters by connection_id option if provided (#RTP11c3)](./spec/acceptance/realtime/presence_spec.rb#L1671)
1496
+ * [filters by client_id option if provided (#RTP11c2)](./spec/acceptance/realtime/presence_spec.rb#L1693)
1497
+ * [does not wait for SYNC to complete if :wait_for_sync option is false (#RTP11c1)](./spec/acceptance/realtime/presence_spec.rb#L1717)
1498
+ * [returns the list of members and waits for SYNC to complete by default (#RTP11a)](./spec/acceptance/realtime/presence_spec.rb#L1729)
1434
1499
  * when the channel is SUSPENDED
1435
1500
  * with wait_for_sync: true
1436
- * [returns the current PresenceMap and does not wait for the channel to change to the ATTACHED state (#RTP11d)](./spec/acceptance/realtime/presence_spec.rb#L1500)
1501
+ * [results in an error with @code@ @91005@ and a @message@ stating that the presence state is out of sync (#RTP11d)](./spec/acceptance/realtime/presence_spec.rb#L1530)
1437
1502
  * with wait_for_sync: false
1438
- * [returns the current PresenceMap and does not wait for the channel to change to the ATTACHED state (#RTP11d)](./spec/acceptance/realtime/presence_spec.rb#L1512)
1503
+ * [returns the current PresenceMap and does not wait for the channel to change to the ATTACHED state (#RTP11d)](./spec/acceptance/realtime/presence_spec.rb#L1543)
1439
1504
  * during a sync
1440
1505
  * when :wait_for_sync is true
1441
- * [fails if the connection becomes FAILED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1576)
1442
- * [fails if the channel becomes detached (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1599)
1506
+ * [fails if the connection becomes FAILED (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1607)
1507
+ * [fails if the channel becomes detached (#RTP11b)](./spec/acceptance/realtime/presence_spec.rb#L1630)
1443
1508
  * when a member enters and then leaves
1444
- * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1703)
1509
+ * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1742)
1445
1510
  * when a member enters and the presence map is updated
1446
- * [adds the member as being :present (#RTP2d)](./spec/acceptance/realtime/presence_spec.rb#L1716)
1511
+ * [adds the member as being :present (#RTP2d)](./spec/acceptance/realtime/presence_spec.rb#L1757)
1447
1512
  * with lots of members on different clients
1448
- * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1734)
1513
+ * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1778)
1449
1514
  * #subscribe
1450
- * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1809)
1515
+ * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1853)
1451
1516
  * with no arguments
1452
- * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1770)
1517
+ * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1814)
1453
1518
  * with event name
1454
- * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1790)
1519
+ * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1834)
1455
1520
  * with a callback that raises an exception
1456
- * [logs the error and continues](./spec/acceptance/realtime/presence_spec.rb#L1822)
1521
+ * [logs the error and continues](./spec/acceptance/realtime/presence_spec.rb#L1866)
1457
1522
  * #unsubscribe
1458
1523
  * with no arguments
1459
- * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1843)
1524
+ * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1887)
1460
1525
  * with event name
1461
- * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1861)
1526
+ * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1905)
1462
1527
  * REST #get
1463
- * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1880)
1464
- * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1893)
1528
+ * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1924)
1529
+ * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1940)
1465
1530
  * client_id with ASCII_8BIT
1466
1531
  * in connection set up
1467
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1910)
1532
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1960)
1468
1533
  * in channel options
1469
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1923)
1534
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1973)
1470
1535
  * encoding and decoding of presence message data
1471
- * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1949)
1536
+ * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1999)
1472
1537
  * #subscribe
1473
- * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L1968)
1474
- * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L1980)
1475
- * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L1994)
1538
+ * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L2018)
1539
+ * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L2030)
1540
+ * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L2044)
1476
1541
  * #get
1477
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L2010)
1542
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L2060)
1478
1543
  * REST #get
1479
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L2023)
1544
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L2074)
1480
1545
  * when cipher settings do not match publisher
1481
- * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L2038)
1482
- * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L2051)
1546
+ * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L2090)
1547
+ * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L2103)
1483
1548
  * leaving
1484
- * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L2067)
1485
- * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L2077)
1549
+ * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L2119)
1550
+ * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L2129)
1486
1551
  * connection failure mid-way through a large member sync
1487
- * [resumes the SYNC operation (#RTP3)](./spec/acceptance/realtime/presence_spec.rb#L2096)
1552
+ * [resumes the SYNC operation (#RTP3)](./spec/acceptance/realtime/presence_spec.rb#L2148)
1488
1553
  * server-initiated sync
1489
1554
  * with multiple SYNC pages
1490
- * [is initiated with a SYNC message and completed with a later SYNC message with no cursor value part of the channelSerial (#RTP18a, #RTP18b) ](./spec/acceptance/realtime/presence_spec.rb#L2134)
1555
+ * [is initiated with a SYNC message and completed with a later SYNC message with no cursor value part of the channelSerial (#RTP18a, #RTP18b) ](./spec/acceptance/realtime/presence_spec.rb#L2186)
1491
1556
  * with a single SYNC page
1492
- * [is initiated and completed with a single SYNC message (and no channelSerial) (#RTP18a, #RTP18c) ](./spec/acceptance/realtime/presence_spec.rb#L2185)
1557
+ * [is initiated and completed with a single SYNC message (and no channelSerial) (#RTP18a, #RTP18c) ](./spec/acceptance/realtime/presence_spec.rb#L2237)
1493
1558
  * when members exist in the PresenceMap before a SYNC completes
1494
- * [removes the members that are no longer present (#RTP19)](./spec/acceptance/realtime/presence_spec.rb#L2233)
1559
+ * [removes the members that are no longer present (#RTP19)](./spec/acceptance/realtime/presence_spec.rb#L2285)
1495
1560
  * when the client does not have presence subscribe privileges but is present on the channel
1496
- * PENDING: *[receives presence updates for all presence events generated by the current connection and the presence map is kept up to date (#RTP17a)](./spec/acceptance/realtime/presence_spec.rb#L2291)*
1561
+ * PENDING: *[receives presence updates for all presence events generated by the current connection and the presence map is kept up to date (#RTP17a)](./spec/acceptance/realtime/presence_spec.rb#L2343)*
1497
1562
  * local PresenceMap for presence members entered by this client
1498
- * [maintains a copy of the member map for any member that shares this connection's connection ID (#RTP17)](./spec/acceptance/realtime/presence_spec.rb#L2328)
1563
+ * [maintains a copy of the member map for any member that shares this connection's connection ID (#RTP17)](./spec/acceptance/realtime/presence_spec.rb#L2393)
1499
1564
  * when a channel becomes attached again
1500
1565
  * and the resume flag is true
1501
1566
  * and the presence flag is false
1502
- * [does not send any presence events as the PresenceMap is in sync (#RTP5c1)](./spec/acceptance/realtime/presence_spec.rb#L2368)
1567
+ * [does not send any presence events as the PresenceMap is in sync (#RTP5c1)](./spec/acceptance/realtime/presence_spec.rb#L2439)
1503
1568
  * and the presence flag is true
1504
1569
  * and following the SYNC all local MemberMap members are present in the PresenceMap
1505
- * [does nothing as MemberMap is in sync (#RTP5c2)](./spec/acceptance/realtime/presence_spec.rb#L2395)
1570
+ * [does nothing as MemberMap is in sync (#RTP5c2)](./spec/acceptance/realtime/presence_spec.rb#L2469)
1506
1571
  * and following the SYNC a local MemberMap member is not present in the PresenceMap
1507
- * [re-enters the missing members automatically (#RTP5c2)](./spec/acceptance/realtime/presence_spec.rb#L2431)
1572
+ * [re-enters the missing members automatically (#RTP5c2)](./spec/acceptance/realtime/presence_spec.rb#L2508)
1508
1573
  * and the resume flag is false
1509
1574
  * and the presence flag is false
1510
- * [immediately resends all local presence members (#RTP5c2, #RTP19a)](./spec/acceptance/realtime/presence_spec.rb#L2511)
1575
+ * [immediately resends all local presence members (#RTP5c2, #RTP19a)](./spec/acceptance/realtime/presence_spec.rb#L2591)
1511
1576
  * when re-entering a client automatically, if the re-enter fails for any reason
1512
- * [should emit an ErrorInfo with error code 91004 (#RTP5c3)](./spec/acceptance/realtime/presence_spec.rb#L2559)
1577
+ * [should emit an ErrorInfo with error code 91004 (#RTP5c3)](./spec/acceptance/realtime/presence_spec.rb#L2642)
1513
1578
  * channel state side effects
1514
1579
  * channel transitions to the FAILED state
1515
- * [clears the PresenceMap and local member map copy and does not emit any presence events (#RTP5a)](./spec/acceptance/realtime/presence_spec.rb#L2616)
1580
+ * [clears the PresenceMap and local member map copy and does not emit any presence events (#RTP5a)](./spec/acceptance/realtime/presence_spec.rb#L2699)
1516
1581
  * channel transitions to the DETACHED state
1517
- * [clears the PresenceMap and local member map copy and does not emit any presence events (#RTP5a)](./spec/acceptance/realtime/presence_spec.rb#L2640)
1582
+ * [clears the PresenceMap and local member map copy and does not emit any presence events (#RTP5a)](./spec/acceptance/realtime/presence_spec.rb#L2726)
1518
1583
  * channel transitions to the SUSPENDED state
1519
- * [maintains the PresenceMap and only publishes presence event changes since the last attached state (#RTP5f)](./spec/acceptance/realtime/presence_spec.rb#L2673)
1584
+ * [maintains the PresenceMap and only publishes presence event changes since the last attached state (#RTP5f)](./spec/acceptance/realtime/presence_spec.rb#L2762)
1585
+
1586
+ ### Ably::Realtime::Push::Admin
1587
+ _(see [spec/acceptance/realtime/push_admin_spec.rb](./spec/acceptance/realtime/push_admin_spec.rb))_
1588
+ * using JSON protocol
1589
+ * #publish
1590
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/push_admin_spec.rb#L35)
1591
+ * [accepts valid push data and recipient](./spec/acceptance/realtime/push_admin_spec.rb#L139)
1592
+ * invalid arguments
1593
+ * [raises an exception with a nil recipient](./spec/acceptance/realtime/push_admin_spec.rb#L44)
1594
+ * [raises an exception with a empty recipient](./spec/acceptance/realtime/push_admin_spec.rb#L49)
1595
+ * [raises an exception with a nil recipient](./spec/acceptance/realtime/push_admin_spec.rb#L54)
1596
+ * [raises an exception with a empty recipient](./spec/acceptance/realtime/push_admin_spec.rb#L59)
1597
+ * invalid recipient
1598
+ * PENDING: *[raises an error after receiving a 40x realtime response](./spec/acceptance/realtime/push_admin_spec.rb#L66)*
1599
+ * invalid push data
1600
+ * PENDING: *[raises an error after receiving a 40x realtime response](./spec/acceptance/realtime/push_admin_spec.rb#L76)*
1601
+ * recipient variable case
1602
+ * [is converted to snakeCase](./spec/acceptance/realtime/push_admin_spec.rb#L131)
1603
+ * using test environment channel recipient (#RSH1a)
1604
+ * [triggers a push notification](./spec/acceptance/realtime/push_admin_spec.rb#L169)
1605
+ * #device_registrations
1606
+ * without permissions
1607
+ * [raises a permissions not authorized exception](./spec/acceptance/realtime/push_admin_spec.rb#L197)
1608
+ * #list
1609
+ * [returns a PaginatedResult object containing DeviceDetails objects](./spec/acceptance/realtime/push_admin_spec.rb#L241)
1610
+ * [supports paging](./spec/acceptance/realtime/push_admin_spec.rb#L249)
1611
+ * [raises an exception if params are invalid](./spec/acceptance/realtime/push_admin_spec.rb#L265)
1612
+ * #get
1613
+ * [returns a DeviceDetails object if a device ID string is provided](./spec/acceptance/realtime/push_admin_spec.rb#L298)
1614
+ * with a failed request
1615
+ * [raises a ResourceMissing exception if device ID does not exist](./spec/acceptance/realtime/push_admin_spec.rb#L315)
1616
+ * #save
1617
+ * [saves the new DeviceDetails Hash object](./spec/acceptance/realtime/push_admin_spec.rb#L358)
1618
+ * with a failed request
1619
+ * [fails if data is invalid](./spec/acceptance/realtime/push_admin_spec.rb#L376)
1620
+ * #remove_where
1621
+ * [removes all matching device registrations by client_id](./spec/acceptance/realtime/push_admin_spec.rb#L408)
1622
+ * #remove
1623
+ * [removes the provided device id string](./spec/acceptance/realtime/push_admin_spec.rb#L441)
1624
+ * #channel_subscriptions
1625
+ * #list
1626
+ * [returns a PaginatedResult object containing DeviceDetails objects](./spec/acceptance/realtime/push_admin_spec.rb#L511)
1627
+ * [supports paging](./spec/acceptance/realtime/push_admin_spec.rb#L519)
1628
+ * [raises an exception if none of the required filters are provided](./spec/acceptance/realtime/push_admin_spec.rb#L535)
1629
+ * #list_channels
1630
+ * [returns a PaginatedResult object containing String objects](./spec/acceptance/realtime/push_admin_spec.rb#L560)
1631
+ * #save
1632
+ * [saves the new client_id PushChannelSubscription Hash object](./spec/acceptance/realtime/push_admin_spec.rb#L575)
1633
+ * [raises an exception for invalid params](./spec/acceptance/realtime/push_admin_spec.rb#L586)
1634
+ * failed requests
1635
+ * [fails for invalid requests](./spec/acceptance/realtime/push_admin_spec.rb#L599)
1636
+ * #remove_where
1637
+ * [removes matching client_ids](./spec/acceptance/realtime/push_admin_spec.rb#L626)
1638
+ * [succeeds on no match](./spec/acceptance/realtime/push_admin_spec.rb#L653)
1639
+ * failed requests
1640
+ * [device_id and client_id filters in the same request are not supported](./spec/acceptance/realtime/push_admin_spec.rb#L645)
1641
+ * #remove
1642
+ * [removes match for Hash object by channel and client_id](./spec/acceptance/realtime/push_admin_spec.rb#L673)
1643
+ * [succeeds even if there is no match](./spec/acceptance/realtime/push_admin_spec.rb#L685)
1644
+
1645
+ ### Ably::Realtime::Push
1646
+ _(see [spec/acceptance/realtime/push_spec.rb](./spec/acceptance/realtime/push_spec.rb))_
1647
+ * using JSON protocol
1648
+ * #activate
1649
+ * [raises an unsupported exception](./spec/acceptance/realtime/push_spec.rb#L14)
1650
+ * #deactivate
1651
+ * [raises an unsupported exception](./spec/acceptance/realtime/push_spec.rb#L21)
1520
1652
 
1521
1653
  ### Ably::Realtime::Client#stats
1522
1654
  _(see [spec/acceptance/realtime/stats_spec.rb](./spec/acceptance/realtime/stats_spec.rb))_
@@ -1600,7 +1732,7 @@ _(see [spec/acceptance/rest/auth_spec.rb](./spec/acceptance/rest/auth_spec.rb))_
1600
1732
  * [sets Auth#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L451)
1601
1733
  * [sets Client#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L455)
1602
1734
  * that returns a TokenDetails JSON object
1603
- * [calls the Proc when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L489)
1735
+ * [calls the lambda when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L489)
1604
1736
  * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L494)
1605
1737
  * when authorized
1606
1738
  * [sets Auth#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L506)
@@ -1640,104 +1772,112 @@ _(see [spec/acceptance/rest/auth_spec.rb](./spec/acceptance/rest/auth_spec.rb))_
1640
1772
  * with previous authorisation
1641
1773
  * [requests a new token if token is expired](./spec/acceptance/rest/auth_spec.rb#L743)
1642
1774
  * [issues a new token every time #authorize is called](./spec/acceptance/rest/auth_spec.rb#L749)
1643
- * with a Proc for the :auth_callback option
1644
- * [calls the Proc](./spec/acceptance/rest/auth_spec.rb#L776)
1645
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L780)
1775
+ * with a lambda for the :auth_callback option
1776
+ * [calls the lambda](./spec/acceptance/rest/auth_spec.rb#L777)
1777
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L781)
1646
1778
  * for every subsequent #request_token
1647
- * without a :auth_callback Proc
1648
- * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L786)
1779
+ * without a :auth_callback lambda
1780
+ * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L787)
1649
1781
  * with a provided block
1650
- * [does not call the originally provided Proc and calls the new #request_token :auth_callback Proc](./spec/acceptance/rest/auth_spec.rb#L793)
1782
+ * [does not call the originally provided lambda and calls the new #request_token :auth_callback lambda](./spec/acceptance/rest/auth_spec.rb#L794)
1651
1783
  * with an explicit token string that expires
1652
- * and a Proc for the :auth_callback option to provide a means to renew the token
1653
- * [calls the Proc once the token has expired and the new token is used](./spec/acceptance/rest/auth_spec.rb#L820)
1784
+ * and a lambda for the :auth_callback option to provide a means to renew the token
1785
+ * [calls the lambda once the token has expired and the new token is used](./spec/acceptance/rest/auth_spec.rb#L821)
1654
1786
  * with an explicit ClientOptions client_id
1655
1787
  * and an incompatible client_id in a TokenDetails object passed to the auth callback
1656
- * [rejects a TokenDetails object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L838)
1788
+ * [rejects a TokenDetails object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L839)
1657
1789
  * and an incompatible client_id in a TokenRequest object passed to the auth callback and raises an exception
1658
- * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L846)
1790
+ * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L847)
1659
1791
  * and a token string without any retrievable client_id
1660
- * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L854)
1792
+ * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L855)
1661
1793
  * #create_token_request
1662
- * [returns a TokenRequest object](./spec/acceptance/rest/auth_spec.rb#L869)
1663
- * [returns a TokenRequest that can be passed to a client that can use it for authentication without an API key](./spec/acceptance/rest/auth_spec.rb#L873)
1664
- * [uses the key name from the client](./spec/acceptance/rest/auth_spec.rb#L880)
1665
- * [uses the default TTL](./spec/acceptance/rest/auth_spec.rb#L884)
1666
- * [uses the default capability](./spec/acceptance/rest/auth_spec.rb#L897)
1794
+ * [returns a TokenRequest object](./spec/acceptance/rest/auth_spec.rb#L870)
1795
+ * [returns a TokenRequest that can be passed to a client that can use it for authentication without an API key](./spec/acceptance/rest/auth_spec.rb#L874)
1796
+ * [uses the key name from the client](./spec/acceptance/rest/auth_spec.rb#L881)
1797
+ * [specifies no TTL (#RSA5)](./spec/acceptance/rest/auth_spec.rb#L885)
1798
+ * [specifies no capability (#RSA6)](./spec/acceptance/rest/auth_spec.rb#L899)
1667
1799
  * with a :ttl option below the Token expiry buffer that ensures tokens are renewed 15s before they expire as they are considered expired
1668
- * [uses the Token expiry buffer default + 10s to allow for a token request in flight](./spec/acceptance/rest/auth_spec.rb#L891)
1800
+ * [uses the Token expiry buffer default + 10s to allow for a token request in flight](./spec/acceptance/rest/auth_spec.rb#L893)
1669
1801
  * the nonce
1670
- * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L902)
1671
- * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L907)
1802
+ * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L904)
1803
+ * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L909)
1672
1804
  * with token param :ttl
1673
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L918)
1805
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L920)
1674
1806
  * with token param :nonce
1675
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L918)
1807
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L920)
1676
1808
  * with token param :client_id
1677
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L918)
1809
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L920)
1678
1810
  * when specifying capability
1679
- * [overrides the default](./spec/acceptance/rest/auth_spec.rb#L929)
1680
- * [uses these capabilities when Ably issues an actual token](./spec/acceptance/rest/auth_spec.rb#L933)
1811
+ * [overrides the default](./spec/acceptance/rest/auth_spec.rb#L931)
1812
+ * [uses these capabilities when Ably issues an actual token](./spec/acceptance/rest/auth_spec.rb#L935)
1681
1813
  * with additional invalid attributes
1682
- * [are ignored](./spec/acceptance/rest/auth_spec.rb#L943)
1814
+ * [are ignored](./spec/acceptance/rest/auth_spec.rb#L945)
1683
1815
  * when required fields are missing
1684
- * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L954)
1685
- * [should raise an exception if key name is missing](./spec/acceptance/rest/auth_spec.rb#L958)
1816
+ * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L956)
1817
+ * [should raise an exception if key name is missing](./spec/acceptance/rest/auth_spec.rb#L960)
1686
1818
  * timestamp attribute
1687
- * [is a Time object in Ruby and is set to the local time](./spec/acceptance/rest/auth_spec.rb#L985)
1819
+ * [is a Time object in Ruby and is set to the local time](./spec/acceptance/rest/auth_spec.rb#L987)
1688
1820
  * with :query_time auth_option
1689
- * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L970)
1821
+ * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L972)
1690
1822
  * with :timestamp option
1691
- * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L980)
1823
+ * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L982)
1692
1824
  * signing
1693
- * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L1009)
1825
+ * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L1011)
1694
1826
  * lexicographic ordering of channels and operations
1695
- * [HMAC is lexicographic ordered and thus the HMAC is identical](./spec/acceptance/rest/auth_spec.rb#L1036)
1696
- * [is valid when used for authentication](./spec/acceptance/rest/auth_spec.rb#L1042)
1827
+ * [HMAC is lexicographic ordered and thus the HMAC is identical](./spec/acceptance/rest/auth_spec.rb#L1038)
1828
+ * [is valid when used for authentication](./spec/acceptance/rest/auth_spec.rb#L1044)
1697
1829
  * using token authentication
1698
1830
  * with :token option
1699
- * [authenticates successfully using the provided :token](./spec/acceptance/rest/auth_spec.rb#L1069)
1700
- * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L1073)
1701
- * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L1081)
1702
- * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L1089)
1831
+ * [authenticates successfully using the provided :token](./spec/acceptance/rest/auth_spec.rb#L1071)
1832
+ * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L1075)
1833
+ * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L1083)
1834
+ * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L1091)
1703
1835
  * and the token expires
1704
- * [should indicate an error and not retry the request (#RSA4a)](./spec/acceptance/rest/auth_spec.rb#L1123)
1836
+ * [should indicate an error and not retry the request (#RSA4a)](./spec/acceptance/rest/auth_spec.rb#L1125)
1705
1837
  * when implicit as a result of using :client_id
1706
1838
  * and requests to the Ably server are mocked
1707
- * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L1153)
1839
+ * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L1155)
1708
1840
  * a token is created
1709
- * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L1162)
1710
- * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L1166)
1711
- * [with capability and TTL defaults](./spec/acceptance/rest/auth_spec.rb#L1170)
1712
- * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L1181)
1841
+ * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L1164)
1842
+ * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L1168)
1843
+ * [with capability and TTL defaults (#TK2a, #TK2b)](./spec/acceptance/rest/auth_spec.rb#L1172)
1844
+ * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L1183)
1713
1845
  * when token expires
1714
- * [automatically renews the token (#RSA4b)](./spec/acceptance/rest/auth_spec.rb#L1210)
1715
- * [fails if the token renewal fails (#RSA4b)](./spec/acceptance/rest/auth_spec.rb#L1220)
1846
+ * [automatically renews the token (#RSA4b)](./spec/acceptance/rest/auth_spec.rb#L1212)
1847
+ * [fails if the token renewal fails (#RSA4b)](./spec/acceptance/rest/auth_spec.rb#L1222)
1716
1848
  * when :client_id is provided in a token
1717
- * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L1244)
1849
+ * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L1246)
1718
1850
  * #client_id_validated?
1719
1851
  * when using basic auth
1720
- * [is false as basic auth users do not have an identity](./spec/acceptance/rest/auth_spec.rb#L1256)
1852
+ * [is false as basic auth users do not have an identity](./spec/acceptance/rest/auth_spec.rb#L1258)
1721
1853
  * when using a token auth string for a token with a client_id
1722
- * [is false as identification is not possible from an opaque token string](./spec/acceptance/rest/auth_spec.rb#L1264)
1854
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/rest/auth_spec.rb#L1266)
1723
1855
  * when using a token
1724
1856
  * with a client_id
1725
- * [is true](./spec/acceptance/rest/auth_spec.rb#L1273)
1857
+ * [is true](./spec/acceptance/rest/auth_spec.rb#L1275)
1726
1858
  * with no client_id (anonymous)
1727
- * [is true](./spec/acceptance/rest/auth_spec.rb#L1281)
1859
+ * [is true](./spec/acceptance/rest/auth_spec.rb#L1283)
1728
1860
  * with a wildcard client_id (anonymous)
1729
- * [is false](./spec/acceptance/rest/auth_spec.rb#L1289)
1861
+ * [is false](./spec/acceptance/rest/auth_spec.rb#L1291)
1730
1862
  * when using a token request with a client_id
1731
- * [is not true as identification is not confirmed until authenticated](./spec/acceptance/rest/auth_spec.rb#L1298)
1863
+ * [is not true as identification is not confirmed until authenticated](./spec/acceptance/rest/auth_spec.rb#L1300)
1732
1864
  * after authentication
1733
- * [is true as identification is completed during implicit authentication](./spec/acceptance/rest/auth_spec.rb#L1305)
1865
+ * [is true as identification is completed during implicit authentication](./spec/acceptance/rest/auth_spec.rb#L1307)
1734
1866
  * when using a :key and basic auth
1735
- * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L1313)
1736
- * [#key attribute contains the key string](./spec/acceptance/rest/auth_spec.rb#L1317)
1737
- * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L1321)
1867
+ * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L1315)
1868
+ * [#key attribute contains the key string](./spec/acceptance/rest/auth_spec.rb#L1319)
1869
+ * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L1323)
1738
1870
  * deprecated #authorise
1739
- * [logs a deprecation warning (#RSA10l)](./spec/acceptance/rest/auth_spec.rb#L1357)
1740
- * [returns a valid token (#RSA10l)](./spec/acceptance/rest/auth_spec.rb#L1362)
1871
+ * [logs a deprecation warning (#RSA10l)](./spec/acceptance/rest/auth_spec.rb#L1332)
1872
+ * [returns a valid token (#RSA10l)](./spec/acceptance/rest/auth_spec.rb#L1337)
1873
+ * when using JWT
1874
+ * [authenticates correctly using the JWT token generated by the echo server](./spec/acceptance/rest/auth_spec.rb#L1349)
1875
+ * when the JWT embeds an Ably token
1876
+ * [authenticates correctly using the embedded token](./spec/acceptance/rest/auth_spec.rb#L1356)
1877
+ * and the requested token is encrypted
1878
+ * [authenticates correctly using the embedded token](./spec/acceptance/rest/auth_spec.rb#L1363)
1879
+ * when the token requested is returned with application/jwt content type
1880
+ * [authenticates correctly and pulls stats](./spec/acceptance/rest/auth_spec.rb#L1374)
1741
1881
 
1742
1882
  ### Ably::Rest
1743
1883
  _(see [spec/acceptance/rest/base_spec.rb](./spec/acceptance/rest/base_spec.rb))_
@@ -1822,34 +1962,37 @@ _(see [spec/acceptance/rest/channel_spec.rb](./spec/acceptance/rest/channel_spec
1822
1962
  * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L244)
1823
1963
  * with an empty client_id in the message
1824
1964
  * [succeeds and publishes with an implicit client_id](./spec/acceptance/rest/channel_spec.rb#L250)
1965
+ * with a non ASCII channel name
1966
+ * stubbed
1967
+ * [correctly encodes the channel name](./spec/acceptance/rest/channel_spec.rb#L272)
1825
1968
  * #history
1826
- * [returns a PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L278)
1827
- * [returns the current message history for the channel](./spec/acceptance/rest/channel_spec.rb#L282)
1828
- * [returns paged history using the PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L310)
1969
+ * [returns a PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L297)
1970
+ * [returns the current message history for the channel](./spec/acceptance/rest/channel_spec.rb#L301)
1971
+ * [returns paged history using the PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L329)
1829
1972
  * message timestamps
1830
- * [are after the messages were published](./spec/acceptance/rest/channel_spec.rb#L295)
1973
+ * [are after the messages were published](./spec/acceptance/rest/channel_spec.rb#L314)
1831
1974
  * message IDs
1832
- * [is unique](./spec/acceptance/rest/channel_spec.rb#L303)
1975
+ * [is unique](./spec/acceptance/rest/channel_spec.rb#L322)
1833
1976
  * direction
1834
- * [returns paged history backwards by default](./spec/acceptance/rest/channel_spec.rb#L331)
1835
- * [returns history forward if specified in the options](./spec/acceptance/rest/channel_spec.rb#L337)
1977
+ * [returns paged history backwards by default](./spec/acceptance/rest/channel_spec.rb#L356)
1978
+ * [returns history forward if specified in the options](./spec/acceptance/rest/channel_spec.rb#L362)
1836
1979
  * limit
1837
- * [defaults to 100](./spec/acceptance/rest/channel_spec.rb#L349)
1980
+ * [defaults to 100](./spec/acceptance/rest/channel_spec.rb#L374)
1838
1981
  * #history option
1839
1982
  * :start
1840
1983
  * with milliseconds since epoch value
1841
- * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L389)
1984
+ * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L414)
1842
1985
  * with a Time object value
1843
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L399)
1986
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L424)
1844
1987
  * :end
1845
1988
  * with milliseconds since epoch value
1846
- * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L389)
1989
+ * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L414)
1847
1990
  * with a Time object value
1848
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L399)
1991
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L424)
1849
1992
  * when argument start is after end
1850
- * [should raise an exception](./spec/acceptance/rest/channel_spec.rb#L409)
1993
+ * [should raise an exception](./spec/acceptance/rest/channel_spec.rb#L434)
1851
1994
  * #presence
1852
- * [returns a REST Presence object](./spec/acceptance/rest/channel_spec.rb#L419)
1995
+ * [returns a REST Presence object](./spec/acceptance/rest/channel_spec.rb#L444)
1853
1996
 
1854
1997
  ### Ably::Rest::Channels
1855
1998
  _(see [spec/acceptance/rest/channels_spec.rb](./spec/acceptance/rest/channels_spec.rb))_
@@ -1877,131 +2020,168 @@ _(see [spec/acceptance/rest/client_spec.rb](./spec/acceptance/rest/client_spec.r
1877
2020
  * #initialize
1878
2021
  * with only an API key
1879
2022
  * [uses basic authentication](./spec/acceptance/rest/client_spec.rb#L25)
2023
+ * with an invalid API key
2024
+ * [logs an entry with a help href url matching the code #TI5](./spec/acceptance/rest/client_spec.rb#L33)
1880
2025
  * with an explicit string :token
1881
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L33)
2026
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L46)
1882
2027
  * with :use_token_auth set to true
1883
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L41)
2028
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L54)
1884
2029
  * with a :client_id configured
1885
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L49)
2030
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L62)
1886
2031
  * with a non string :client_id
1887
- * [raises an ArgumentError](./spec/acceptance/rest/client_spec.rb#L57)
2032
+ * [raises an ArgumentError](./spec/acceptance/rest/client_spec.rb#L70)
1888
2033
  * with an invalid wildcard "*" :client_id
1889
- * [raises an exception](./spec/acceptance/rest/client_spec.rb#L63)
1890
- * with an :auth_callback Proc
1891
- * [calls the auth Proc to get a new token](./spec/acceptance/rest/client_spec.rb#L71)
1892
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L76)
2034
+ * [raises an exception](./spec/acceptance/rest/client_spec.rb#L76)
2035
+ * with an :auth_callback lambda
2036
+ * [calls the auth lambda to get a new token](./spec/acceptance/rest/client_spec.rb#L84)
2037
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L89)
1893
2038
  * with :default_token_params
1894
- * [overides the default token params (#TO3j11)](./spec/acceptance/rest/client_spec.rb#L90)
1895
- * with an :auth_callback Proc (clientId provided in library options instead of as a token_request param)
1896
- * [correctly sets the clientId on the token](./spec/acceptance/rest/client_spec.rb#L100)
2039
+ * [overides the default token params (#TO3j11)](./spec/acceptance/rest/client_spec.rb#L103)
2040
+ * with an :auth_callback lambda (clientId provided in library options instead of as a token_request param)
2041
+ * [correctly sets the clientId on the token](./spec/acceptance/rest/client_spec.rb#L113)
1897
2042
  * with an auth URL
1898
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L110)
2043
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L123)
1899
2044
  * before any REST request
1900
- * [sends an HTTP request to the provided auth URL to get a new token](./spec/acceptance/rest/client_spec.rb#L121)
2045
+ * [sends an HTTP request to the provided auth URL to get a new token](./spec/acceptance/rest/client_spec.rb#L134)
1901
2046
  * auth headers
1902
2047
  * with basic auth
1903
- * [sends the API key in authentication part of the secure URL (the Authorization: Basic header is not used with the Faraday HTTP library by default)](./spec/acceptance/rest/client_spec.rb#L141)
2048
+ * [sends the API key in authentication part of the secure URL (the Authorization: Basic header is not used with the Faraday HTTP library by default)](./spec/acceptance/rest/client_spec.rb#L154)
1904
2049
  * with token auth
1905
2050
  * without specifying protocol
1906
- * [sends the token string over HTTPS in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L160)
2051
+ * [sends the token string over HTTPS in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L173)
1907
2052
  * when setting constructor ClientOption :tls to false
1908
- * [sends the token string over HTTP in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L170)
2053
+ * [sends the token string over HTTP in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L183)
1909
2054
  * using tokens
1910
2055
  * when expired
1911
- * [creates a new token automatically when the old token expires](./spec/acceptance/rest/client_spec.rb#L203)
2056
+ * [creates a new token automatically when the old token expires](./spec/acceptance/rest/client_spec.rb#L216)
1912
2057
  * with a different client_id in the subsequent token
1913
- * [fails to authenticate and raises an exception](./spec/acceptance/rest/client_spec.rb#L216)
2058
+ * [fails to authenticate and raises an exception](./spec/acceptance/rest/client_spec.rb#L229)
1914
2059
  * when token has not expired
1915
- * [reuses the existing token for every request](./spec/acceptance/rest/client_spec.rb#L227)
2060
+ * [reuses the existing token for every request](./spec/acceptance/rest/client_spec.rb#L240)
1916
2061
  * connection transport
1917
2062
  * defaults
1918
2063
  * for default host
1919
- * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L244)
1920
- * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L248)
2064
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L257)
2065
+ * [is configured to timeout connection requests in 10 seconds](./spec/acceptance/rest/client_spec.rb#L261)
1921
2066
  * for the fallback hosts
1922
- * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L254)
1923
- * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L258)
2067
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L267)
2068
+ * [is configured to timeout connection requests in 10 seconds](./spec/acceptance/rest/client_spec.rb#L271)
1924
2069
  * with custom http_open_timeout and http_request_timeout options
1925
2070
  * for default host
1926
- * [is configured to use custom open timeout](./spec/acceptance/rest/client_spec.rb#L270)
1927
- * [is configured to use custom request timeout](./spec/acceptance/rest/client_spec.rb#L274)
2071
+ * [is configured to use custom open timeout](./spec/acceptance/rest/client_spec.rb#L283)
2072
+ * [is configured to use custom request timeout](./spec/acceptance/rest/client_spec.rb#L287)
1928
2073
  * for the fallback hosts
1929
- * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L280)
1930
- * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L284)
2074
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L293)
2075
+ * [is configured to timeout connection requests in 10 seconds](./spec/acceptance/rest/client_spec.rb#L297)
1931
2076
  * fallback hosts
1932
2077
  * configured
1933
- * [should make connection attempts to A.ably-realtime.com, B.ably-realtime.com, C.ably-realtime.com, D.ably-realtime.com, E.ably-realtime.com (#RSC15a)](./spec/acceptance/rest/client_spec.rb#L298)
2078
+ * [should make connection attempts to A.ably-realtime.com, B.ably-realtime.com, C.ably-realtime.com, D.ably-realtime.com, E.ably-realtime.com (#RSC15a)](./spec/acceptance/rest/client_spec.rb#L311)
1934
2079
  * when environment is NOT production (#RSC15b)
1935
- * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L315)
2080
+ * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L328)
1936
2081
  * when environment is production
1937
2082
  * and connection times out
1938
- * [tries fallback hosts 3 times (#RSC15b, #RSC15b)](./spec/acceptance/rest/client_spec.rb#L354)
1939
- * and the total request time exeeds 10 seconds
1940
- * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L369)
2083
+ * [tries fallback hosts 3 times (#RSC15b, #RSC15b)](./spec/acceptance/rest/client_spec.rb#L367)
2084
+ * and the total request time exeeds 15 seconds
2085
+ * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L382)
1941
2086
  * and connection fails
1942
- * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L385)
2087
+ * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L398)
1943
2088
  * and first request to primary endpoint fails
1944
- * [tries a fallback host, and for the next request tries the primary endpoint again (#RSC15e)](./spec/acceptance/rest/client_spec.rb#L419)
2089
+ * [tries a fallback host, and for the next request tries the primary endpoint again (#RSC15e)](./spec/acceptance/rest/client_spec.rb#L432)
1945
2090
  * and basic authentication fails
1946
- * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L446)
2091
+ * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L459)
1947
2092
  * and server returns a 50x error
1948
- * [attempts the fallback hosts as this is an authentication failure (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L468)
2093
+ * [attempts the fallback hosts as this is an authentication failure (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L481)
1949
2094
  * when environment is production and server returns a 50x error
1950
2095
  * with custom fallback hosts provided
1951
- * [attempts the fallback hosts as this is an authentication failure (#RSC15b, #RSC15a, #TO3k6)](./spec/acceptance/rest/client_spec.rb#L517)
2096
+ * [attempts the fallback hosts as this is an authentication failure (#RSC15b, #RSC15a, #TO3k6)](./spec/acceptance/rest/client_spec.rb#L530)
1952
2097
  * with an empty array of fallback hosts provided (#RSC15b, #RSC15a, #TO3k6)
1953
- * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L530)
2098
+ * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L543)
1954
2099
  * using a local web-server
1955
2100
  * and timing out the primary host
1956
- * with request timeout less than max_retry_duration
1957
- * [tries one of the fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L586)
1958
- * with request timeout less than max_retry_duration
1959
- * [tries one of the fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L608)
2101
+ * POST with request timeout less than max_retry_duration
2102
+ * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L607)
2103
+ * GET with request timeout less than max_retry_duration
2104
+ * [tries the primary host, then both fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L630)
2105
+ * POST with request timeout more than max_retry_duration
2106
+ * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L653)
2107
+ * GET with request timeout more than max_retry_duration
2108
+ * [does not try any fallback hosts (#RSC15d)](./spec/acceptance/rest/client_spec.rb#L675)
1960
2109
  * and failing the primary host
1961
- * [tries one of the fallback hosts](./spec/acceptance/rest/client_spec.rb#L652)
2110
+ * [tries one of the fallback hosts](./spec/acceptance/rest/client_spec.rb#L720)
2111
+ * to fail the primary host, allow a fallback to succeed, then later trigger a fallback to the primary host (#RSC15f)
2112
+ * [succeeds and remembers fallback host preferences across requests](./spec/acceptance/rest/client_spec.rb#L776)
2113
+ * with custom :fallback_retry_timeout
2114
+ * [stops using the preferred fallback after this time](./spec/acceptance/rest/client_spec.rb#L813)
1962
2115
  * when environment is not production and server returns a 50x error
1963
2116
  * with custom fallback hosts provided (#RSC15b, #TO3k6)
1964
- * [attempts the fallback hosts as this is not an authentication failure](./spec/acceptance/rest/client_spec.rb#L702)
2117
+ * [attempts the fallback hosts as this is not an authentication failure](./spec/acceptance/rest/client_spec.rb#L874)
1965
2118
  * with an empty array of fallback hosts provided (#RSC15b, #TO3k6)
1966
- * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L715)
2119
+ * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L887)
1967
2120
  * with fallback_hosts_use_default: true (#RSC15b, #TO3k7)
1968
- * [attempts the default fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L740)
2121
+ * [attempts the default fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L912)
1969
2122
  * with a custom host
1970
2123
  * that does not exist
1971
- * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L756)
2124
+ * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L928)
1972
2125
  * fallback hosts
1973
- * [are never used](./spec/acceptance/rest/client_spec.rb#L777)
2126
+ * [are never used](./spec/acceptance/rest/client_spec.rb#L949)
1974
2127
  * that times out
1975
- * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L792)
2128
+ * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L964)
1976
2129
  * fallback hosts
1977
- * [are never used](./spec/acceptance/rest/client_spec.rb#L805)
2130
+ * [are never used](./spec/acceptance/rest/client_spec.rb#L977)
1978
2131
  * HTTP configuration options
1979
- * [is frozen](./spec/acceptance/rest/client_spec.rb#L862)
2132
+ * [is frozen](./spec/acceptance/rest/client_spec.rb#L1034)
1980
2133
  * defaults
1981
- * [#http_open_timeout is 4s](./spec/acceptance/rest/client_spec.rb#L817)
1982
- * [#http_request_timeout is 15s](./spec/acceptance/rest/client_spec.rb#L821)
1983
- * [#http_max_retry_count is 3](./spec/acceptance/rest/client_spec.rb#L825)
1984
- * [#http_max_retry_duration is 10s](./spec/acceptance/rest/client_spec.rb#L829)
2134
+ * [#http_open_timeout is 4s](./spec/acceptance/rest/client_spec.rb#L989)
2135
+ * [#http_request_timeout is 10s](./spec/acceptance/rest/client_spec.rb#L993)
2136
+ * [#http_max_retry_count is 3](./spec/acceptance/rest/client_spec.rb#L997)
2137
+ * [#http_max_retry_duration is 15s](./spec/acceptance/rest/client_spec.rb#L1001)
1985
2138
  * configured
1986
- * [#http_open_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L845)
1987
- * [#http_request_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L849)
1988
- * [#http_max_retry_count uses provided value](./spec/acceptance/rest/client_spec.rb#L853)
1989
- * [#http_max_retry_duration uses provided value](./spec/acceptance/rest/client_spec.rb#L857)
2139
+ * [#http_open_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1017)
2140
+ * [#http_request_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L1021)
2141
+ * [#http_max_retry_count uses provided value](./spec/acceptance/rest/client_spec.rb#L1025)
2142
+ * [#http_max_retry_duration uses provided value](./spec/acceptance/rest/client_spec.rb#L1029)
1990
2143
  * #auth
1991
- * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L873)
1992
- * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L877)
2144
+ * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L1045)
2145
+ * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L1049)
1993
2146
  * version headers
1994
2147
  * with variant none
1995
- * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L911)
2148
+ * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1083)
1996
2149
  * with variant foo
1997
- * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L911)
2150
+ * [sends a protocol version and lib version header (#G4, #RSC7a, #RSC7b)](./spec/acceptance/rest/client_spec.rb#L1083)
1998
2151
  * #request (#RSC19*)
1999
2152
  * get
2000
- * [returns an HttpPaginatedResponse object](./spec/acceptance/rest/client_spec.rb#L924)
2153
+ * [returns an HttpPaginatedResponse object](./spec/acceptance/rest/client_spec.rb#L1096)
2001
2154
  * 404 request to invalid URL
2002
- * [returns an object with 404 status code and error message](./spec/acceptance/rest/client_spec.rb#L931)
2155
+ * [returns an object with 404 status code and error message](./spec/acceptance/rest/client_spec.rb#L1103)
2003
2156
  * paged results
2004
- * [provides paging](./spec/acceptance/rest/client_spec.rb#L943)
2157
+ * [provides paging](./spec/acceptance/rest/client_spec.rb#L1115)
2158
+ * request_id generation
2159
+ * Timeout error
2160
+ * with option add_request_ids: true
2161
+ * [has an error with the same request_id of the request](./spec/acceptance/rest/client_spec.rb#L1150)
2162
+ * with option add_request_ids: true and REST operations with a message body
2163
+ * with mocks to inspect the params
2164
+ * with a single publish
2165
+ * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1172)
2166
+ * with an array publish
2167
+ * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1179)
2168
+ * without mocks to ensure the requests are accepted
2169
+ * with a single publish
2170
+ * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1188)
2171
+ * with an array publish
2172
+ * [succeeds and sends the request_id as a param](./spec/acceptance/rest/client_spec.rb#L1195)
2173
+ * option add_request_ids: true and specified fallback hosts
2174
+ * [request_id is the same across retries](./spec/acceptance/rest/client_spec.rb#L1220)
2175
+ * without request_id
2176
+ * [does not include request_id in ConnectionTimeout error](./spec/acceptance/rest/client_spec.rb#L1232)
2177
+ * UnauthorizedRequest nonce error
2178
+ * [includes request_id in UnauthorizedRequest error due to replayed nonce](./spec/acceptance/rest/client_spec.rb#L1245)
2179
+ * failed request logging
2180
+ * [is absent when requests do not fail](./spec/acceptance/rest/client_spec.rb#L1262)
2181
+ * with the first request failing
2182
+ * [is present with success message when requests do not actually fail](./spec/acceptance/rest/client_spec.rb#L1277)
2183
+ * with all requests failing
2184
+ * [is present when all requests fail](./spec/acceptance/rest/client_spec.rb#L1294)
2005
2185
 
2006
2186
  ### Ably::Models::MessageEncoders
2007
2187
  _(see [spec/acceptance/rest/encoders_spec.rb](./spec/acceptance/rest/encoders_spec.rb))_
@@ -2040,85 +2220,113 @@ _(see [spec/acceptance/rest/encoders_spec.rb](./spec/acceptance/rest/encoders_sp
2040
2220
  _(see [spec/acceptance/rest/message_spec.rb](./spec/acceptance/rest/message_spec.rb))_
2041
2221
  * using JSON protocol
2042
2222
  * publishing with an ASCII_8BIT message name
2043
- * [is converted into UTF_8](./spec/acceptance/rest/message_spec.rb#L18)
2223
+ * [is converted into UTF_8](./spec/acceptance/rest/message_spec.rb#L19)
2044
2224
  * with supported data payload content type
2045
2225
  * JSON Object (Hash)
2046
- * [is encoded and decoded to the same hash](./spec/acceptance/rest/message_spec.rb#L30)
2226
+ * [is encoded and decoded to the same hash](./spec/acceptance/rest/message_spec.rb#L31)
2047
2227
  * JSON Array
2048
- * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L39)
2228
+ * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L40)
2049
2229
  * String
2050
- * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L48)
2230
+ * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L49)
2051
2231
  * Binary
2052
- * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L57)
2232
+ * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L58)
2053
2233
  * with supported extra payload content type (#RSL1h, #RSL6a2)
2054
2234
  * JSON Object (Hash)
2055
- * PENDING: *[is encoded and decoded to the same hash](./spec/acceptance/rest/message_spec.rb#L68)*
2235
+ * [is encoded and decoded to the same hash](./spec/acceptance/rest/message_spec.rb#L71)
2056
2236
  * JSON Array
2057
- * PENDING: *[is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L78)*
2237
+ * [is encoded and decoded to the same deep multi-type object](./spec/acceptance/rest/message_spec.rb#L81)
2058
2238
  * nil
2059
- * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L86)
2239
+ * [is encoded and decoded to the same Array](./spec/acceptance/rest/message_spec.rb#L88)
2240
+ * idempotency (#RSL1k)
2241
+ * [idempotent publishing is disabled by default with 1.1 (#TO3n)](./spec/acceptance/rest/message_spec.rb#L165)
2242
+ * [idempotent publishing is enabled by default with 1.2 (#TO3n)](./spec/acceptance/rest/message_spec.rb#L170)
2243
+ * when ID is not included (#RSL1k2)
2244
+ * with Message object
2245
+ * [publishes the same message three times](./spec/acceptance/rest/message_spec.rb#L104)
2246
+ * with #publish arguments only
2247
+ * [publishes the same message three times](./spec/acceptance/rest/message_spec.rb#L111)
2248
+ * when ID is included (#RSL1k2, #RSL1k5)
2249
+ * [the ID provided is used for the published messages](./spec/acceptance/rest/message_spec.rb#L140)
2250
+ * PENDING: *[for multiple messages in one publish operation (#RSL1k3)](./spec/acceptance/rest/message_spec.rb#L145)*
2251
+ * PENDING: *[for multiple messages in one publish operation with IDs following the required format described in RSL1k1 (#RSL1k3)](./spec/acceptance/rest/message_spec.rb#L154)*
2252
+ * with Message object
2253
+ * PENDING: *[three REST publishes result in only one message being published](./spec/acceptance/rest/message_spec.rb#L122)*
2254
+ * with #publish arguments only
2255
+ * PENDING: *[three REST publishes result in only one message being published](./spec/acceptance/rest/message_spec.rb#L132)*
2256
+ * when idempotent publishing is enabled in the client library ClientOptions (#TO3n)
2257
+ * [the ID is populated with a random ID and serial 0 from this lib (#RSL1k1)](./spec/acceptance/rest/message_spec.rb#L242)
2258
+ * when there is a network failure triggering an automatic retry (#RSL1k4)
2259
+ * PENDING: *[for multiple messages in one publish operation](./spec/acceptance/rest/message_spec.rb#L233)*
2260
+ * with Message object
2261
+ * PENDING: *[two REST publish retries result in only one message being published](./spec/acceptance/rest/message_spec.rb#L197)*
2262
+ * with #publish arguments only
2263
+ * PENDING: *[two REST publish retries result in only one message being published](./spec/acceptance/rest/message_spec.rb#L209)*
2264
+ * with explicitly provided message ID
2265
+ * PENDING: *[two REST publish retries result in only one message being published](./spec/acceptance/rest/message_spec.rb#L223)*
2266
+ * when publishing a batch of messages
2267
+ * PENDING: *[the ID is populated with a single random ID and sequence of serials from this lib (#RSL1k1)](./spec/acceptance/rest/message_spec.rb#L250)*
2060
2268
  * with unsupported data payload content type
2061
2269
  * Integer
2062
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/rest/message_spec.rb#L97)
2270
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/rest/message_spec.rb#L269)
2063
2271
  * Float
2064
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/rest/message_spec.rb#L105)
2272
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/rest/message_spec.rb#L277)
2065
2273
  * Boolean
2066
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/rest/message_spec.rb#L113)
2274
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/rest/message_spec.rb#L285)
2067
2275
  * False
2068
- * [is raises an UnsupportedDataType 40011 exception](./spec/acceptance/rest/message_spec.rb#L121)
2276
+ * [is raises an UnsupportedDataType 40013 exception](./spec/acceptance/rest/message_spec.rb#L293)
2069
2277
  * encryption and encoding
2070
2278
  * with #publish and #history
2071
2279
  * with AES-128-CBC using crypto-data-128.json fixtures (#RTL7d)
2072
2280
  * item 0 with encrypted encoding utf-8/cipher+aes-128-cbc/base64
2073
2281
  * behaves like an Ably encrypter and decrypter
2074
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2075
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2282
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2283
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2076
2284
  * item 1 with encrypted encoding cipher+aes-128-cbc/base64
2077
2285
  * behaves like an Ably encrypter and decrypter
2078
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2079
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2286
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2287
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2080
2288
  * item 2 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
2081
2289
  * behaves like an Ably encrypter and decrypter
2082
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2083
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2290
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2291
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2084
2292
  * item 3 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
2085
2293
  * behaves like an Ably encrypter and decrypter
2086
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2087
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2294
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2295
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2088
2296
  * with AES-256-CBC using crypto-data-256.json fixtures (#RTL7d)
2089
2297
  * item 0 with encrypted encoding utf-8/cipher+aes-256-cbc/base64
2090
2298
  * behaves like an Ably encrypter and decrypter
2091
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2092
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2299
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2300
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2093
2301
  * item 1 with encrypted encoding cipher+aes-256-cbc/base64
2094
2302
  * behaves like an Ably encrypter and decrypter
2095
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2096
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2303
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2304
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2097
2305
  * item 2 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
2098
2306
  * behaves like an Ably encrypter and decrypter
2099
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2100
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2307
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2308
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2101
2309
  * item 3 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
2102
2310
  * behaves like an Ably encrypter and decrypter
2103
- * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L166)
2104
- * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L181)
2311
+ * [encrypts message automatically when published (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L338)
2312
+ * [sends and retrieves messages that are encrypted & decrypted by the Ably library (#RTL7d)](./spec/acceptance/rest/message_spec.rb#L353)
2105
2313
  * when publishing lots of messages
2106
- * [encrypts on #publish and decrypts on #history](./spec/acceptance/rest/message_spec.rb#L214)
2314
+ * [encrypts on #publish and decrypts on #history](./spec/acceptance/rest/message_spec.rb#L386)
2107
2315
  * when retrieving #history with a different protocol
2108
- * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/rest/message_spec.rb#L241)
2109
- * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/rest/message_spec.rb#L241)
2110
- * [delivers a Hash payload to the receiver](./spec/acceptance/rest/message_spec.rb#L241)
2316
+ * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/rest/message_spec.rb#L413)
2317
+ * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/rest/message_spec.rb#L413)
2318
+ * [delivers a Hash payload to the receiver](./spec/acceptance/rest/message_spec.rb#L413)
2111
2319
  * when publishing on an unencrypted channel and retrieving with #history on an encrypted channel
2112
- * [does not attempt to decrypt the message](./spec/acceptance/rest/message_spec.rb#L257)
2320
+ * [does not attempt to decrypt the message](./spec/acceptance/rest/message_spec.rb#L429)
2113
2321
  * when publishing on an encrypted channel and retrieving with #history on an unencrypted channel
2114
- * [retrieves the message that remains encrypted with an encrypted encoding attribute (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L278)
2115
- * [logs a Cipher exception (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L284)
2322
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L450)
2323
+ * [logs a Cipher exception (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L456)
2116
2324
  * publishing on an encrypted channel and retrieving #history with a different algorithm on another client (#RTL7e)
2117
- * [retrieves the message that remains encrypted with an encrypted encoding attribute (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L305)
2118
- * [logs a Cipher exception (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L311)
2325
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L477)
2326
+ * [logs a Cipher exception (#RTL7e)](./spec/acceptance/rest/message_spec.rb#L483)
2119
2327
  * publishing on an encrypted channel and subscribing with a different key on another client
2120
- * [retrieves the message that remains encrypted with an encrypted encoding attribute](./spec/acceptance/rest/message_spec.rb#L332)
2121
- * [logs a Cipher exception](./spec/acceptance/rest/message_spec.rb#L338)
2328
+ * [retrieves the message that remains encrypted with an encrypted encoding attribute](./spec/acceptance/rest/message_spec.rb#L504)
2329
+ * [logs a Cipher exception](./spec/acceptance/rest/message_spec.rb#L510)
2122
2330
 
2123
2331
  ### Ably::Rest::Presence
2124
2332
  _(see [spec/acceptance/rest/presence_spec.rb](./spec/acceptance/rest/presence_spec.rb))_
@@ -2135,54 +2343,148 @@ _(see [spec/acceptance/rest/presence_spec.rb](./spec/acceptance/rest/presence_sp
2135
2343
  * with :connection_id option
2136
2344
  * [returns a list members filtered by the provided connection ID](./spec/acceptance/rest/presence_spec.rb#L106)
2137
2345
  * [returns a list members filtered by the provided connection ID](./spec/acceptance/rest/presence_spec.rb#L110)
2346
+ * with a non ASCII channel name
2347
+ * stubbed
2348
+ * [correctly encodes the channel name](./spec/acceptance/rest/presence_spec.rb#L127)
2138
2349
  * #history
2139
- * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L119)
2350
+ * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L138)
2140
2351
  * default behaviour
2141
- * [uses backwards direction](./spec/acceptance/rest/presence_spec.rb#L134)
2352
+ * [uses backwards direction](./spec/acceptance/rest/presence_spec.rb#L153)
2142
2353
  * with options
2143
2354
  * direction: :forwards
2144
- * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L146)
2355
+ * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L165)
2145
2356
  * direction: :backwards
2146
- * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L161)
2357
+ * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L180)
2147
2358
  * #history
2148
2359
  * with options
2149
2360
  * limit options
2150
2361
  * default
2151
- * [is set to 100](./spec/acceptance/rest/presence_spec.rb#L206)
2362
+ * [is set to 100](./spec/acceptance/rest/presence_spec.rb#L225)
2152
2363
  * set to 1000
2153
- * [is passes the limit query param value 1000](./spec/acceptance/rest/presence_spec.rb#L219)
2364
+ * [is passes the limit query param value 1000](./spec/acceptance/rest/presence_spec.rb#L238)
2154
2365
  * with time range options
2155
2366
  * :start
2156
2367
  * with milliseconds since epoch value
2157
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L249)
2368
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L268)
2158
2369
  * with Time object value
2159
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L259)
2370
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L278)
2160
2371
  * :end
2161
2372
  * with milliseconds since epoch value
2162
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L249)
2373
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L268)
2163
2374
  * with Time object value
2164
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L259)
2375
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L278)
2165
2376
  * when argument start is after end
2166
- * [should raise an exception](./spec/acceptance/rest/presence_spec.rb#L270)
2377
+ * [should raise an exception](./spec/acceptance/rest/presence_spec.rb#L289)
2167
2378
  * decoding
2168
2379
  * with encoded fixture data
2169
2380
  * #history
2170
- * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L289)
2381
+ * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L308)
2171
2382
  * #get
2172
- * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L296)
2383
+ * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L315)
2173
2384
  * decoding permutations using mocked #history
2174
2385
  * valid decodeable content
2175
2386
  * #get
2176
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L349)
2387
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L368)
2177
2388
  * #history
2178
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L366)
2389
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L385)
2179
2390
  * invalid data
2180
2391
  * #get
2181
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L397)
2182
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L401)
2392
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L416)
2393
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L420)
2183
2394
  * #history
2184
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L421)
2185
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L425)
2395
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L440)
2396
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L444)
2397
+
2398
+ ### Ably::Rest::Push::Admin
2399
+ _(see [spec/acceptance/rest/push_admin_spec.rb](./spec/acceptance/rest/push_admin_spec.rb))_
2400
+ * using JSON protocol
2401
+ * #publish
2402
+ * [accepts valid push data and recipient (#RSH1a)](./spec/acceptance/rest/push_admin_spec.rb#L127)
2403
+ * without publish permissions
2404
+ * [raises a permissions issue exception](./spec/acceptance/rest/push_admin_spec.rb#L40)
2405
+ * invalid arguments (#RHS1a)
2406
+ * [raises an exception with a nil recipient](./spec/acceptance/rest/push_admin_spec.rb#L46)
2407
+ * [raises an exception with a empty recipient](./spec/acceptance/rest/push_admin_spec.rb#L50)
2408
+ * [raises an exception with a nil recipient](./spec/acceptance/rest/push_admin_spec.rb#L54)
2409
+ * [raises an exception with a empty recipient](./spec/acceptance/rest/push_admin_spec.rb#L58)
2410
+ * invalid recipient (#RSH1a)
2411
+ * [raises an error after receiving a 40x realtime response](./spec/acceptance/rest/push_admin_spec.rb#L64)
2412
+ * invalid push data (#RSH1a)
2413
+ * [raises an error after receiving a 40x realtime response](./spec/acceptance/rest/push_admin_spec.rb#L70)
2414
+ * recipient variable case
2415
+ * [is converted to snakeCase](./spec/acceptance/rest/push_admin_spec.rb#L121)
2416
+ * using test environment channel recipient (#RSH1a)
2417
+ * [triggers a push notification](./spec/acceptance/rest/push_admin_spec.rb#L152)
2418
+ * #device_registrations (#RSH1b)
2419
+ * without permissions
2420
+ * [raises a permissions not authorized exception](./spec/acceptance/rest/push_admin_spec.rb#L172)
2421
+ * #list (#RSH1b2)
2422
+ * [returns a PaginatedResult object containing DeviceDetails objects](./spec/acceptance/rest/push_admin_spec.rb#L207)
2423
+ * [returns an empty PaginatedResult if not params match](./spec/acceptance/rest/push_admin_spec.rb#L213)
2424
+ * [supports paging](./spec/acceptance/rest/push_admin_spec.rb#L219)
2425
+ * [provides filtering](./spec/acceptance/rest/push_admin_spec.rb#L231)
2426
+ * #get (#RSH1b1)
2427
+ * [returns a DeviceDetails object if a device ID string is provided](./spec/acceptance/rest/push_admin_spec.rb#L270)
2428
+ * [returns a DeviceDetails object if a DeviceDetails object is provided](./spec/acceptance/rest/push_admin_spec.rb#L278)
2429
+ * [raises a ResourceMissing exception if device ID does not exist](./spec/acceptance/rest/push_admin_spec.rb#L286)
2430
+ * #save (#RSH1b3)
2431
+ * [saves the new DeviceDetails Hash object](./spec/acceptance/rest/push_admin_spec.rb#L325)
2432
+ * [saves the associated DevicePushDetails](./spec/acceptance/rest/push_admin_spec.rb#L340)
2433
+ * [does not allow some fields to be configured](./spec/acceptance/rest/push_admin_spec.rb#L394)
2434
+ * [allows device_secret to be configured](./spec/acceptance/rest/push_admin_spec.rb#L407)
2435
+ * [saves the new DeviceDetails object](./spec/acceptance/rest/push_admin_spec.rb#L416)
2436
+ * [allows arbitrary number of subsequent saves](./spec/acceptance/rest/push_admin_spec.rb#L425)
2437
+ * [fails if data is invalid](./spec/acceptance/rest/push_admin_spec.rb#L438)
2438
+ * with GCM target
2439
+ * [saves the associated DevicePushDetails](./spec/acceptance/rest/push_admin_spec.rb#L354)
2440
+ * with web target
2441
+ * [saves the associated DevicePushDetails](./spec/acceptance/rest/push_admin_spec.rb#L375)
2442
+ * #remove_where (#RSH1b5)
2443
+ * [removes all matching device registrations by client_id](./spec/acceptance/rest/push_admin_spec.rb#L484)
2444
+ * [removes device by device_id](./spec/acceptance/rest/push_admin_spec.rb#L489)
2445
+ * [succeeds even if there is no match](./spec/acceptance/rest/push_admin_spec.rb#L494)
2446
+ * #remove (#RSH1b4)
2447
+ * [removes the provided device id string](./spec/acceptance/rest/push_admin_spec.rb#L541)
2448
+ * [removes the provided DeviceDetails](./spec/acceptance/rest/push_admin_spec.rb#L546)
2449
+ * [succeeds if the item does not exist](./spec/acceptance/rest/push_admin_spec.rb#L551)
2450
+ * #channel_subscriptions (#RSH1c)
2451
+ * #list (#RSH1c1)
2452
+ * [returns a PaginatedResult object containing DeviceDetails objects](./spec/acceptance/rest/push_admin_spec.rb#L613)
2453
+ * [returns an empty PaginatedResult if params do not match](./spec/acceptance/rest/push_admin_spec.rb#L619)
2454
+ * [supports paging](./spec/acceptance/rest/push_admin_spec.rb#L625)
2455
+ * [provides filtering](./spec/acceptance/rest/push_admin_spec.rb#L637)
2456
+ * [raises an exception if none of the required filters are provided](./spec/acceptance/rest/push_admin_spec.rb#L665)
2457
+ * #list_channels (#RSH1c2)
2458
+ * [returns a PaginatedResult object containing String objects](./spec/acceptance/rest/push_admin_spec.rb#L689)
2459
+ * PENDING: *[supports paging](./spec/acceptance/rest/push_admin_spec.rb#L696)*
2460
+ * [returns an accurate number of channels after devices are deleted](./spec/acceptance/rest/push_admin_spec.rb#L714)
2461
+ * #save (#RSH1c3)
2462
+ * [saves the new client_id PushChannelSubscription Hash object](./spec/acceptance/rest/push_admin_spec.rb#L733)
2463
+ * [saves the new device_id PushChannelSubscription Hash object](./spec/acceptance/rest/push_admin_spec.rb#L744)
2464
+ * [saves the client_id PushChannelSubscription object](./spec/acceptance/rest/push_admin_spec.rb#L755)
2465
+ * [saves the device_id PushChannelSubscription object](./spec/acceptance/rest/push_admin_spec.rb#L766)
2466
+ * [allows arbitrary number of subsequent saves](./spec/acceptance/rest/push_admin_spec.rb#L777)
2467
+ * [fails if data is invalid](./spec/acceptance/rest/push_admin_spec.rb#L790)
2468
+ * #remove_where (#RSH1c5)
2469
+ * PENDING: *[removes matching channels](./spec/acceptance/rest/push_admin_spec.rb#L817)*
2470
+ * [removes matching client_ids](./spec/acceptance/rest/push_admin_spec.rb#L825)
2471
+ * [removes matching device_ids](./spec/acceptance/rest/push_admin_spec.rb#L831)
2472
+ * [device_id and client_id filters in the same request are not suppoorted](./spec/acceptance/rest/push_admin_spec.rb#L837)
2473
+ * [succeeds on no match](./spec/acceptance/rest/push_admin_spec.rb#L841)
2474
+ * #remove (#RSH1c4)
2475
+ * [removes match for Hash object by channel and client_id](./spec/acceptance/rest/push_admin_spec.rb#L865)
2476
+ * [removes match for PushChannelSubscription object by channel and client_id](./spec/acceptance/rest/push_admin_spec.rb#L870)
2477
+ * [removes match for Hash object by channel and device_id](./spec/acceptance/rest/push_admin_spec.rb#L877)
2478
+ * [removes match for PushChannelSubscription object by channel and client_id](./spec/acceptance/rest/push_admin_spec.rb#L882)
2479
+ * [succeeds even if there is no match](./spec/acceptance/rest/push_admin_spec.rb#L889)
2480
+
2481
+ ### Ably::Rest::Push
2482
+ _(see [spec/acceptance/rest/push_spec.rb](./spec/acceptance/rest/push_spec.rb))_
2483
+ * using JSON protocol
2484
+ * #activate
2485
+ * [raises an unsupported exception](./spec/acceptance/rest/push_spec.rb#L14)
2486
+ * #deactivate
2487
+ * [raises an unsupported exception](./spec/acceptance/rest/push_spec.rb#L20)
2186
2488
 
2187
2489
  ### Ably::Rest::Client#stats
2188
2490
  _(see [spec/acceptance/rest/stats_spec.rb](./spec/acceptance/rest/stats_spec.rb))_
@@ -2253,22 +2555,21 @@ _(see [spec/unit/auth_spec.rb](./spec/unit/auth_spec.rb))_
2253
2555
  * as Integer
2254
2556
  * [raises an argument error](./spec/unit/auth_spec.rb#L64)
2255
2557
  * defaults
2256
- * [should default TTL to 1 hour](./spec/unit/auth_spec.rb#L74)
2257
- * [should default capability to all](./spec/unit/auth_spec.rb#L78)
2258
- * [should have defaults for :ttl and :capability](./spec/unit/auth_spec.rb#L82)
2558
+ * [should have no default TTL](./spec/unit/auth_spec.rb#L71)
2559
+ * [should have no default capability](./spec/unit/auth_spec.rb#L75)
2259
2560
 
2260
2561
  ### Ably::Logger
2261
2562
  _(see [spec/unit/logger_spec.rb](./spec/unit/logger_spec.rb))_
2262
2563
  * [uses the language provided Logger by default](./spec/unit/logger_spec.rb#L15)
2263
2564
  * with a custom Logger
2264
2565
  * with an invalid interface
2265
- * [raises an exception](./spec/unit/logger_spec.rb#L118)
2566
+ * [raises an exception](./spec/unit/logger_spec.rb#L122)
2266
2567
  * with a valid interface
2267
- * [is used](./spec/unit/logger_spec.rb#L137)
2568
+ * [is used](./spec/unit/logger_spec.rb#L133)
2268
2569
  * with blocks
2269
- * [does not call the block unless the log level is met](./spec/unit/logger_spec.rb#L152)
2570
+ * [does not call the block unless the log level is met](./spec/unit/logger_spec.rb#L151)
2270
2571
  * with an exception in the logger block
2271
- * [catches the error and continues](./spec/unit/logger_spec.rb#L167)
2572
+ * [catches the error and continues](./spec/unit/logger_spec.rb#L166)
2272
2573
 
2273
2574
  ### Ably::Models::AuthDetails
2274
2575
  _(see [spec/unit/models/auth_details_spec.rb](./spec/unit/models/auth_details_spec.rb))_
@@ -2398,25 +2699,93 @@ _(see [spec/unit/models/connection_state_change_spec.rb](./spec/unit/models/conn
2398
2699
  * invalid attributes
2399
2700
  * [raises an argument error](./spec/unit/models/connection_state_change_spec.rb#L61)
2400
2701
 
2702
+ ### Ably::Models::DeviceDetails
2703
+ _(see [spec/unit/models/device_details_spec.rb](./spec/unit/models/device_details_spec.rb))_
2704
+ * #id and #id=
2705
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L16)
2706
+ * [setter accepts nil](./spec/unit/models/device_details_spec.rb#L22)
2707
+ * [rejects non string or nil values](./spec/unit/models/device_details_spec.rb#L29)
2708
+ * #platform and #platform=
2709
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L16)
2710
+ * [setter accepts nil](./spec/unit/models/device_details_spec.rb#L22)
2711
+ * [rejects non string or nil values](./spec/unit/models/device_details_spec.rb#L29)
2712
+ * #form_factor and #form_factor=
2713
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L16)
2714
+ * [setter accepts nil](./spec/unit/models/device_details_spec.rb#L22)
2715
+ * [rejects non string or nil values](./spec/unit/models/device_details_spec.rb#L29)
2716
+ * #client_id and #client_id=
2717
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L16)
2718
+ * [setter accepts nil](./spec/unit/models/device_details_spec.rb#L22)
2719
+ * [rejects non string or nil values](./spec/unit/models/device_details_spec.rb#L29)
2720
+ * #device_secret and #device_secret=
2721
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L16)
2722
+ * [setter accepts nil](./spec/unit/models/device_details_spec.rb#L22)
2723
+ * [rejects non string or nil values](./spec/unit/models/device_details_spec.rb#L29)
2724
+ * camelCase constructor attributes
2725
+ * [are rubyfied and exposed as underscore case](./spec/unit/models/device_details_spec.rb#L39)
2726
+ * [are generated when the object is serialised to JSON](./spec/unit/models/device_details_spec.rb#L43)
2727
+ * #metadata and #metadata=
2728
+ * [setter accepts a Hash value and getter returns the new value](./spec/unit/models/device_details_spec.rb#L51)
2729
+ * [setter accepts nil but always returns an empty hash](./spec/unit/models/device_details_spec.rb#L57)
2730
+ * [rejects non Hash or nil values](./spec/unit/models/device_details_spec.rb#L64)
2731
+ * #push and #push=
2732
+ * [setter accepts a DevicePushDetails object and getter returns a DevicePushDetails object](./spec/unit/models/device_details_spec.rb#L74)
2733
+ * [setter accepts a Hash value and getter returns a DevicePushDetails object](./spec/unit/models/device_details_spec.rb#L82)
2734
+ * [setter accepts nil but always returns a DevicePushDetails object](./spec/unit/models/device_details_spec.rb#L90)
2735
+ * [rejects non Hash, DevicePushDetails or nil values](./spec/unit/models/device_details_spec.rb#L98)
2736
+
2737
+ ### Ably::Models::DevicePushDetails
2738
+ _(see [spec/unit/models/device_push_details_spec.rb](./spec/unit/models/device_push_details_spec.rb))_
2739
+ * #state and #state=
2740
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/device_push_details_spec.rb#L16)
2741
+ * [setter accepts nil](./spec/unit/models/device_push_details_spec.rb#L22)
2742
+ * [rejects non string or nil values](./spec/unit/models/device_push_details_spec.rb#L29)
2743
+ * camelCase constructor attributes
2744
+ * [are rubyfied and exposed as underscore case](./spec/unit/models/device_push_details_spec.rb#L39)
2745
+ * [are generated when the object is serialised to JSON](./spec/unit/models/device_push_details_spec.rb#L44)
2746
+ * #recipient and #recipient=
2747
+ * [setter accepts a Hash value and getter returns the new value](./spec/unit/models/device_push_details_spec.rb#L52)
2748
+ * [setter accepts nil but always returns an empty hash](./spec/unit/models/device_push_details_spec.rb#L58)
2749
+ * [rejects non Hash or nil values](./spec/unit/models/device_push_details_spec.rb#L65)
2750
+ * #error_reason and #error_reason=
2751
+ * [setter accepts a ErrorInfo object and getter returns a ErrorInfo object](./spec/unit/models/device_push_details_spec.rb#L74)
2752
+ * [setter accepts a Hash value and getter returns a ErrorInfo object](./spec/unit/models/device_push_details_spec.rb#L82)
2753
+ * [setter accepts nil values](./spec/unit/models/device_push_details_spec.rb#L90)
2754
+ * [rejects non Hash, ErrorInfo or nil values](./spec/unit/models/device_push_details_spec.rb#L97)
2755
+
2401
2756
  ### Ably::Models::ErrorInfo
2402
2757
  _(see [spec/unit/models/error_info_spec.rb](./spec/unit/models/error_info_spec.rb))_
2403
- * behaves like a model
2404
- * attributes
2405
- * #code
2406
- * [retrieves attribute :code](./spec/shared/model_behaviour.rb#L15)
2407
- * #status_code
2408
- * [retrieves attribute :status_code](./spec/shared/model_behaviour.rb#L15)
2409
- * #message
2410
- * [retrieves attribute :message](./spec/shared/model_behaviour.rb#L15)
2411
- * #==
2412
- * [is true when attributes are the same](./spec/shared/model_behaviour.rb#L41)
2413
- * [is false when attributes are not the same](./spec/shared/model_behaviour.rb#L46)
2414
- * [is false when class type differs](./spec/shared/model_behaviour.rb#L50)
2415
- * is immutable
2416
- * [prevents changes](./spec/shared/model_behaviour.rb#L76)
2417
- * [dups options](./spec/shared/model_behaviour.rb#L80)
2418
- * #status
2419
- * [is an alias for #status_code](./spec/unit/models/error_info_spec.rb#L13)
2758
+ * #TI1, #TI4
2759
+ * behaves like a model
2760
+ * attributes
2761
+ * #code
2762
+ * [retrieves attribute :code](./spec/shared/model_behaviour.rb#L15)
2763
+ * #status_code
2764
+ * [retrieves attribute :status_code](./spec/shared/model_behaviour.rb#L15)
2765
+ * #href
2766
+ * [retrieves attribute :href](./spec/shared/model_behaviour.rb#L15)
2767
+ * #message
2768
+ * [retrieves attribute :message](./spec/shared/model_behaviour.rb#L15)
2769
+ * #==
2770
+ * [is true when attributes are the same](./spec/shared/model_behaviour.rb#L41)
2771
+ * [is false when attributes are not the same](./spec/shared/model_behaviour.rb#L46)
2772
+ * [is false when class type differs](./spec/shared/model_behaviour.rb#L50)
2773
+ * is immutable
2774
+ * [prevents changes](./spec/shared/model_behaviour.rb#L76)
2775
+ * [dups options](./spec/shared/model_behaviour.rb#L80)
2776
+ * #status #TI1, #TI2
2777
+ * [is an alias for #status_code](./spec/unit/models/error_info_spec.rb#L15)
2778
+ * log entries container help link #TI5
2779
+ * without an error code
2780
+ * [does not include the help URL](./spec/unit/models/error_info_spec.rb#L25)
2781
+ * with a specified error code
2782
+ * [includes https://help.ably.io/error/[CODE] in the stringified object](./spec/unit/models/error_info_spec.rb#L33)
2783
+ * with an error code and an href attribute
2784
+ * [includes the specified href in the stringified object](./spec/unit/models/error_info_spec.rb#L41)
2785
+ * with an error code and a message with the same error URL
2786
+ * [includes the specified error URL only once in the stringified object](./spec/unit/models/error_info_spec.rb#L50)
2787
+ * with an error code and a message with a different error URL
2788
+ * [includes the specified error URL from the message and the error code URL in the stringified object](./spec/unit/models/error_info_spec.rb#L58)
2420
2789
 
2421
2790
  ### Ably::Models::HttpPaginatedResponse: #HP1 -> #HP8
2422
2791
  _(see [spec/unit/models/http_paginated_result_spec.rb](./spec/unit/models/http_paginated_result_spec.rb))_
@@ -2628,109 +2997,113 @@ _(see [spec/unit/models/message_encoders/utf8_spec.rb](./spec/unit/models/messag
2628
2997
 
2629
2998
  ### Ably::Models::Message
2630
2999
  _(see [spec/unit/models/message_spec.rb](./spec/unit/models/message_spec.rb))_
2631
- * behaves like a model
2632
- * attributes
2633
- * #id
2634
- * [retrieves attribute :id](./spec/shared/model_behaviour.rb#L15)
2635
- * #name
2636
- * [retrieves attribute :name](./spec/shared/model_behaviour.rb#L15)
2637
- * #client_id
2638
- * [retrieves attribute :client_id](./spec/shared/model_behaviour.rb#L15)
2639
- * #data
2640
- * [retrieves attribute :data](./spec/shared/model_behaviour.rb#L15)
2641
- * #encoding
2642
- * [retrieves attribute :encoding](./spec/shared/model_behaviour.rb#L15)
2643
- * #==
2644
- * [is true when attributes are the same](./spec/shared/model_behaviour.rb#L41)
2645
- * [is false when attributes are not the same](./spec/shared/model_behaviour.rb#L46)
2646
- * [is false when class type differs](./spec/shared/model_behaviour.rb#L50)
2647
- * is immutable
2648
- * [prevents changes](./spec/shared/model_behaviour.rb#L76)
2649
- * [dups options](./spec/shared/model_behaviour.rb#L80)
3000
+ * serialization of the Message object (#RSL1j)
3001
+ * behaves like a model
3002
+ * attributes
3003
+ * #id
3004
+ * [retrieves attribute :id](./spec/shared/model_behaviour.rb#L15)
3005
+ * #name
3006
+ * [retrieves attribute :name](./spec/shared/model_behaviour.rb#L15)
3007
+ * #client_id
3008
+ * [retrieves attribute :client_id](./spec/shared/model_behaviour.rb#L15)
3009
+ * #data
3010
+ * [retrieves attribute :data](./spec/shared/model_behaviour.rb#L15)
3011
+ * #encoding
3012
+ * [retrieves attribute :encoding](./spec/shared/model_behaviour.rb#L15)
3013
+ * #==
3014
+ * [is true when attributes are the same](./spec/shared/model_behaviour.rb#L41)
3015
+ * [is false when attributes are not the same](./spec/shared/model_behaviour.rb#L46)
3016
+ * [is false when class type differs](./spec/shared/model_behaviour.rb#L50)
3017
+ * is immutable
3018
+ * [prevents changes](./spec/shared/model_behaviour.rb#L76)
3019
+ * [dups options](./spec/shared/model_behaviour.rb#L80)
3020
+ * #id (#RSL1j)
3021
+ * [exposes the #id attribute](./spec/unit/models/message_spec.rb#L25)
3022
+ * [#as_json exposes the #id attribute](./spec/unit/models/message_spec.rb#L29)
2650
3023
  * #timestamp
2651
- * [retrieves attribute :timestamp as Time object from ProtocolMessage](./spec/unit/models/message_spec.rb#L22)
3024
+ * [retrieves attribute :timestamp as Time object from ProtocolMessage](./spec/unit/models/message_spec.rb#L37)
2652
3025
  * #extras (#TM2i)
2653
3026
  * when missing
2654
- * [is nil](./spec/unit/models/message_spec.rb#L33)
3027
+ * [is nil](./spec/unit/models/message_spec.rb#L48)
2655
3028
  * when a string
2656
- * [raises an exception](./spec/unit/models/message_spec.rb#L40)
3029
+ * [raises an exception](./spec/unit/models/message_spec.rb#L55)
2657
3030
  * when a Hash
2658
- * [contains a Hash Json object](./spec/unit/models/message_spec.rb#L47)
3031
+ * [contains a Hash Json object](./spec/unit/models/message_spec.rb#L62)
2659
3032
  * when a Json Array
2660
- * [contains a Json Array object](./spec/unit/models/message_spec.rb#L54)
3033
+ * [contains a Json Array object](./spec/unit/models/message_spec.rb#L69)
2661
3034
  * #connection_id attribute
2662
3035
  * when this model has a connectionId attribute
2663
3036
  * but no protocol message
2664
- * [uses the model value](./spec/unit/models/message_spec.rb#L69)
3037
+ * [uses the model value](./spec/unit/models/message_spec.rb#L84)
2665
3038
  * with a protocol message with a different connectionId
2666
- * [uses the model value](./spec/unit/models/message_spec.rb#L77)
3039
+ * [uses the model value](./spec/unit/models/message_spec.rb#L92)
2667
3040
  * when this model has no connectionId attribute
2668
3041
  * and no protocol message
2669
- * [uses the model value](./spec/unit/models/message_spec.rb#L87)
3042
+ * [uses the model value](./spec/unit/models/message_spec.rb#L102)
2670
3043
  * with a protocol message with a connectionId
2671
- * [uses the model value](./spec/unit/models/message_spec.rb#L95)
3044
+ * [uses the model value](./spec/unit/models/message_spec.rb#L110)
2672
3045
  * initialized with
2673
3046
  * :name
2674
3047
  * as UTF_8 string
2675
- * [is permitted](./spec/unit/models/message_spec.rb#L122)
2676
- * [remains as UTF-8](./spec/unit/models/message_spec.rb#L126)
3048
+ * [is permitted](./spec/unit/models/message_spec.rb#L137)
3049
+ * [remains as UTF-8](./spec/unit/models/message_spec.rb#L141)
2677
3050
  * as SHIFT_JIS string
2678
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L134)
2679
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L138)
3051
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L149)
3052
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L153)
2680
3053
  * as ASCII_8BIT string
2681
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L146)
2682
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L150)
3054
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L161)
3055
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L165)
2683
3056
  * as Integer
2684
- * [raises an argument error](./spec/unit/models/message_spec.rb#L158)
3057
+ * [raises an argument error](./spec/unit/models/message_spec.rb#L173)
2685
3058
  * as Nil
2686
- * [is permitted](./spec/unit/models/message_spec.rb#L166)
3059
+ * [is permitted](./spec/unit/models/message_spec.rb#L181)
2687
3060
  * :client_id
2688
3061
  * as UTF_8 string
2689
- * [is permitted](./spec/unit/models/message_spec.rb#L122)
2690
- * [remains as UTF-8](./spec/unit/models/message_spec.rb#L126)
3062
+ * [is permitted](./spec/unit/models/message_spec.rb#L137)
3063
+ * [remains as UTF-8](./spec/unit/models/message_spec.rb#L141)
2691
3064
  * as SHIFT_JIS string
2692
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L134)
2693
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L138)
3065
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L149)
3066
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L153)
2694
3067
  * as ASCII_8BIT string
2695
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L146)
2696
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L150)
3068
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L161)
3069
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L165)
2697
3070
  * as Integer
2698
- * [raises an argument error](./spec/unit/models/message_spec.rb#L158)
3071
+ * [raises an argument error](./spec/unit/models/message_spec.rb#L173)
2699
3072
  * as Nil
2700
- * [is permitted](./spec/unit/models/message_spec.rb#L166)
3073
+ * [is permitted](./spec/unit/models/message_spec.rb#L181)
2701
3074
  * :encoding
2702
3075
  * as UTF_8 string
2703
- * [is permitted](./spec/unit/models/message_spec.rb#L122)
2704
- * [remains as UTF-8](./spec/unit/models/message_spec.rb#L126)
3076
+ * [is permitted](./spec/unit/models/message_spec.rb#L137)
3077
+ * [remains as UTF-8](./spec/unit/models/message_spec.rb#L141)
2705
3078
  * as SHIFT_JIS string
2706
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L134)
2707
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L138)
3079
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L149)
3080
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L153)
2708
3081
  * as ASCII_8BIT string
2709
- * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L146)
2710
- * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L150)
3082
+ * [gets converted to UTF-8](./spec/unit/models/message_spec.rb#L161)
3083
+ * [is compatible with original encoding](./spec/unit/models/message_spec.rb#L165)
2711
3084
  * as Integer
2712
- * [raises an argument error](./spec/unit/models/message_spec.rb#L158)
3085
+ * [raises an argument error](./spec/unit/models/message_spec.rb#L173)
2713
3086
  * as Nil
2714
- * [is permitted](./spec/unit/models/message_spec.rb#L166)
3087
+ * [is permitted](./spec/unit/models/message_spec.rb#L181)
2715
3088
  * #from_encoded (#TM3)
2716
3089
  * with no encoding
2717
- * [returns a message object](./spec/unit/models/message_spec.rb#L422)
3090
+ * [returns a message object](./spec/unit/models/message_spec.rb#L437)
2718
3091
  * with a block
2719
- * [does not call the block](./spec/unit/models/message_spec.rb#L430)
3092
+ * [does not call the block](./spec/unit/models/message_spec.rb#L445)
2720
3093
  * with an encoding
2721
- * [returns a message object](./spec/unit/models/message_spec.rb#L447)
3094
+ * [returns a message object](./spec/unit/models/message_spec.rb#L462)
2722
3095
  * with a custom encoding
2723
- * [returns a message object with the residual incompatible transforms left in the encoding property](./spec/unit/models/message_spec.rb#L462)
3096
+ * [returns a message object with the residual incompatible transforms left in the encoding property](./spec/unit/models/message_spec.rb#L477)
2724
3097
  * with a Cipher encoding
2725
- * [returns a message object with the residual incompatible transforms left in the encoding property](./spec/unit/models/message_spec.rb#L481)
3098
+ * [returns a message object with the residual incompatible transforms left in the encoding property](./spec/unit/models/message_spec.rb#L496)
2726
3099
  * with invalid Cipher encoding
2727
3100
  * without a block
2728
- * [raises an exception](./spec/unit/models/message_spec.rb#L499)
3101
+ * [raises an exception](./spec/unit/models/message_spec.rb#L514)
2729
3102
  * with a block
2730
- * [calls the block with the exception](./spec/unit/models/message_spec.rb#L505)
3103
+ * [calls the block with the exception](./spec/unit/models/message_spec.rb#L520)
2731
3104
  * #from_encoded_array (#TM3)
2732
3105
  * with no encoding
2733
- * [returns an Array of message objects](./spec/unit/models/message_spec.rb#L524)
3106
+ * [returns an Array of message objects](./spec/unit/models/message_spec.rb#L539)
2734
3107
 
2735
3108
  ### Ably::Models::PaginatedResult
2736
3109
  _(see [spec/unit/models/paginated_result_spec.rb](./spec/unit/models/paginated_result_spec.rb))_
@@ -2981,6 +3354,31 @@ _(see [spec/unit/models/protocol_message_spec.rb](./spec/unit/models/protocol_me
2981
3354
  * existing in both #connection_key and #connection_details.connection_key
2982
3355
  * [returns #connection_details.connection_key as #connection_key will be deprecated > 0.8](./spec/unit/models/protocol_message_spec.rb#L385)
2983
3356
 
3357
+ ### Ably::Models::PushChannelSubscription
3358
+ _(see [spec/unit/models/push_channel_subscription_spec.rb](./spec/unit/models/push_channel_subscription_spec.rb))_
3359
+ * #channel and #channel=
3360
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/push_channel_subscription_spec.rb#L21)
3361
+ * [setter accepts nil](./spec/unit/models/push_channel_subscription_spec.rb#L27)
3362
+ * [rejects non string or nil values](./spec/unit/models/push_channel_subscription_spec.rb#L34)
3363
+ * #client_id and #client_id=
3364
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/push_channel_subscription_spec.rb#L21)
3365
+ * [setter accepts nil](./spec/unit/models/push_channel_subscription_spec.rb#L27)
3366
+ * [rejects non string or nil values](./spec/unit/models/push_channel_subscription_spec.rb#L34)
3367
+ * #device_id and #device_id=
3368
+ * [setter accepts a string value and getter returns the new value](./spec/unit/models/push_channel_subscription_spec.rb#L21)
3369
+ * [setter accepts nil](./spec/unit/models/push_channel_subscription_spec.rb#L27)
3370
+ * [rejects non string or nil values](./spec/unit/models/push_channel_subscription_spec.rb#L34)
3371
+ * camelCase constructor attributes
3372
+ * [are rubyfied and exposed as underscore case](./spec/unit/models/push_channel_subscription_spec.rb#L44)
3373
+ * [are generated when the object is serialised to JSON](./spec/unit/models/push_channel_subscription_spec.rb#L48)
3374
+ * conversion method PushChannelSubscription
3375
+ * [accepts a PushChannelSubscription object](./spec/unit/models/push_channel_subscription_spec.rb#L57)
3376
+ * #for_client_id constructor
3377
+ * with a valid object
3378
+ * [accepts a Hash object](./spec/unit/models/push_channel_subscription_spec.rb#L70)
3379
+ * with an invalid valid object
3380
+ * [accepts a Hash object](./spec/unit/models/push_channel_subscription_spec.rb#L81)
3381
+
2984
3382
  ### Ably::Models::Stats
2985
3383
  _(see [spec/unit/models/stats_spec.rb](./spec/unit/models/stats_spec.rb))_
2986
3384
  * #all stats
@@ -3417,11 +3815,11 @@ _(see [spec/unit/realtime/client_spec.rb](./spec/unit/realtime/client_spec.rb))_
3417
3815
  * with log_level :none
3418
3816
  * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L257)
3419
3817
  * with custom logger and log_level
3420
- * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L275)
3421
- * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L279)
3818
+ * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L267)
3819
+ * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L271)
3422
3820
  * delegators
3423
- * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L293)
3424
- * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L298)
3821
+ * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L285)
3822
+ * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L290)
3425
3823
  * delegation to the REST Client
3426
3824
  * [passes on the options to the initializer](./spec/unit/realtime/client_spec.rb#L15)
3427
3825
  * for attribute
@@ -3429,6 +3827,9 @@ _(see [spec/unit/realtime/client_spec.rb](./spec/unit/realtime/client_spec.rb))_
3429
3827
  * [#use_tls?](./spec/unit/realtime/client_spec.rb#L23)
3430
3828
  * [#log_level](./spec/unit/realtime/client_spec.rb#L23)
3431
3829
  * [#custom_host](./spec/unit/realtime/client_spec.rb#L23)
3830
+ * push
3831
+ * [#device is not supported and raises an exception](./spec/unit/realtime/client_spec.rb#L34)
3832
+ * [#push returns a Push object](./spec/unit/realtime/client_spec.rb#L38)
3432
3833
 
3433
3834
  ### Ably::Realtime::Connection
3434
3835
  _(see [spec/unit/realtime/connection_spec.rb](./spec/unit/realtime/connection_spec.rb))_
@@ -3455,6 +3856,19 @@ _(see [spec/unit/realtime/presence_spec.rb](./spec/unit/realtime/presence_spec.r
3455
3856
  * [with a non-matching action argument has no effect](./spec/unit/realtime/presence_spec.rb#L125)
3456
3857
  * [with no block argument unsubscribes all blocks for the action argument](./spec/unit/realtime/presence_spec.rb#L131)
3457
3858
 
3859
+ ### Ably::Realtime::Channel::PushChannel
3860
+ _(see [spec/unit/realtime/push_channel_spec.rb](./spec/unit/realtime/push_channel_spec.rb))_
3861
+ * [is constructed with a channel](./spec/unit/realtime/push_channel_spec.rb#L10)
3862
+ * [raises an exception if constructed with an invalid type](./spec/unit/realtime/push_channel_spec.rb#L14)
3863
+ * [exposes the channel as attribute #channel](./spec/unit/realtime/push_channel_spec.rb#L18)
3864
+ * [is available in the #push attribute of the channel](./spec/unit/realtime/push_channel_spec.rb#L22)
3865
+ * methods not implemented as push notifications
3866
+ * [#subscribe_device raises an unsupported exception](./spec/unit/realtime/push_channel_spec.rb#L31)
3867
+ * [#subscribe_client_id raises an unsupported exception](./spec/unit/realtime/push_channel_spec.rb#L31)
3868
+ * [#unsubscribe_device raises an unsupported exception](./spec/unit/realtime/push_channel_spec.rb#L31)
3869
+ * [#unsubscribe_client_id raises an unsupported exception](./spec/unit/realtime/push_channel_spec.rb#L31)
3870
+ * [#get_subscriptions raises an unsupported exception](./spec/unit/realtime/push_channel_spec.rb#L31)
3871
+
3458
3872
  ### Ably::Realtime
3459
3873
  _(see [spec/unit/realtime/realtime_spec.rb](./spec/unit/realtime/realtime_spec.rb))_
3460
3874
  * [constructor returns an Ably::Realtime::Client](./spec/unit/realtime/realtime_spec.rb#L6)
@@ -3505,27 +3919,32 @@ _(see [spec/unit/realtime/safe_deferrable_spec.rb](./spec/unit/realtime/safe_def
3505
3919
  _(see [spec/unit/rest/channel_spec.rb](./spec/unit/rest/channel_spec.rb))_
3506
3920
  * #initializer
3507
3921
  * as UTF_8 string
3508
- * [is permitted](./spec/unit/rest/channel_spec.rb#L16)
3509
- * [remains as UTF-8](./spec/unit/rest/channel_spec.rb#L20)
3922
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L23)
3923
+ * [remains as UTF-8](./spec/unit/rest/channel_spec.rb#L27)
3924
+ * as frozen UTF_8 string
3925
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L36)
3926
+ * [remains as UTF-8](./spec/unit/rest/channel_spec.rb#L40)
3510
3927
  * as SHIFT_JIS string
3511
- * [gets converted to UTF-8](./spec/unit/rest/channel_spec.rb#L28)
3512
- * [is compatible with original encoding](./spec/unit/rest/channel_spec.rb#L32)
3928
+ * [gets converted to UTF-8](./spec/unit/rest/channel_spec.rb#L48)
3929
+ * [is compatible with original encoding](./spec/unit/rest/channel_spec.rb#L52)
3513
3930
  * as ASCII_8BIT string
3514
- * [gets converted to UTF-8](./spec/unit/rest/channel_spec.rb#L40)
3515
- * [is compatible with original encoding](./spec/unit/rest/channel_spec.rb#L44)
3931
+ * [gets converted to UTF-8](./spec/unit/rest/channel_spec.rb#L60)
3932
+ * [is compatible with original encoding](./spec/unit/rest/channel_spec.rb#L64)
3516
3933
  * as Integer
3517
- * [raises an argument error](./spec/unit/rest/channel_spec.rb#L52)
3934
+ * [raises an argument error](./spec/unit/rest/channel_spec.rb#L72)
3518
3935
  * as Nil
3519
- * [raises an argument error](./spec/unit/rest/channel_spec.rb#L60)
3936
+ * [raises an argument error](./spec/unit/rest/channel_spec.rb#L80)
3520
3937
  * #publish name argument
3521
3938
  * as UTF_8 string
3522
- * [is permitted](./spec/unit/rest/channel_spec.rb#L72)
3939
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L92)
3940
+ * as frozen UTF_8 string
3941
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L101)
3523
3942
  * as SHIFT_JIS string
3524
- * [is permitted](./spec/unit/rest/channel_spec.rb#L80)
3943
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L109)
3525
3944
  * as ASCII_8BIT string
3526
- * [is permitted](./spec/unit/rest/channel_spec.rb#L88)
3945
+ * [is permitted](./spec/unit/rest/channel_spec.rb#L117)
3527
3946
  * as Integer
3528
- * [raises an argument error](./spec/unit/rest/channel_spec.rb#L96)
3947
+ * [raises an argument error](./spec/unit/rest/channel_spec.rb#L125)
3529
3948
 
3530
3949
  ### Ably::Rest::Channels
3531
3950
  _(see [spec/unit/rest/channels_spec.rb](./spec/unit/rest/channels_spec.rb))_
@@ -3604,24 +4023,47 @@ _(see [spec/unit/rest/client_spec.rb](./spec/unit/rest/client_spec.rb))_
3604
4023
  * with log_level :none
3605
4024
  * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L257)
3606
4025
  * with custom logger and log_level
3607
- * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L275)
3608
- * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L279)
4026
+ * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L267)
4027
+ * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L271)
3609
4028
  * delegators
3610
- * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L293)
3611
- * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L298)
4029
+ * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L285)
4030
+ * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L290)
3612
4031
  * initializer options
3613
4032
  * TLS
3614
4033
  * disabled
3615
4034
  * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection (#RSA1)](./spec/unit/rest/client_spec.rb#L17)
4035
+ * fallback_retry_timeout (#RSC15f)
4036
+ * default
4037
+ * [is set to 10 minutes](./spec/unit/rest/client_spec.rb#L27)
4038
+ * when provided
4039
+ * [configures a new timeout](./spec/unit/rest/client_spec.rb#L35)
3616
4040
  * :use_token_auth
3617
4041
  * set to false
3618
4042
  * with a key and :tls => false
3619
- * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](./spec/unit/rest/client_spec.rb#L28)
4043
+ * [fails for any operation with basic auth and attempting to send an API key over a non-secure connection](./spec/unit/rest/client_spec.rb#L46)
3620
4044
  * without a key
3621
- * [fails as a key is required if not using token auth](./spec/unit/rest/client_spec.rb#L36)
4045
+ * [fails as a key is required if not using token auth](./spec/unit/rest/client_spec.rb#L54)
3622
4046
  * set to true
3623
4047
  * without a key or token
3624
- * [fails as a key is required to issue tokens](./spec/unit/rest/client_spec.rb#L46)
4048
+ * [fails as a key is required to issue tokens](./spec/unit/rest/client_spec.rb#L64)
4049
+ * request_id generation
4050
+ * [includes request_id in URL](./spec/unit/rest/client_spec.rb#L74)
4051
+ * push
4052
+ * [#device is not supported and raises an exception](./spec/unit/rest/client_spec.rb#L82)
4053
+ * [#push returns a Push object](./spec/unit/rest/client_spec.rb#L86)
4054
+
4055
+ ### Ably::Rest::Channel::PushChannel
4056
+ _(see [spec/unit/rest/push_channel_spec.rb](./spec/unit/rest/push_channel_spec.rb))_
4057
+ * [is constructed with a channel](./spec/unit/rest/push_channel_spec.rb#L10)
4058
+ * [raises an exception if constructed with an invalid type](./spec/unit/rest/push_channel_spec.rb#L14)
4059
+ * [exposes the channel as attribute #channel](./spec/unit/rest/push_channel_spec.rb#L18)
4060
+ * [is available in the #push attribute of the channel](./spec/unit/rest/push_channel_spec.rb#L22)
4061
+ * methods not implemented as push notifications
4062
+ * [#subscribe_device raises an unsupported exception](./spec/unit/rest/push_channel_spec.rb#L31)
4063
+ * [#subscribe_client_id raises an unsupported exception](./spec/unit/rest/push_channel_spec.rb#L31)
4064
+ * [#unsubscribe_device raises an unsupported exception](./spec/unit/rest/push_channel_spec.rb#L31)
4065
+ * [#unsubscribe_client_id raises an unsupported exception](./spec/unit/rest/push_channel_spec.rb#L31)
4066
+ * [#get_subscriptions raises an unsupported exception](./spec/unit/rest/push_channel_spec.rb#L31)
3625
4067
 
3626
4068
  ### Ably::Rest
3627
4069
  _(see [spec/unit/rest/rest_spec.rb](./spec/unit/rest/rest_spec.rb))_
@@ -3673,6 +4115,6 @@ _(see [spec/unit/util/pub_sub_spec.rb](./spec/unit/util/pub_sub_spec.rb))_
3673
4115
 
3674
4116
  ## Test summary
3675
4117
 
3676
- * Passing tests: 1806
3677
- * Pending tests: 12
3678
- * Failing tests: 0
4118
+ * Passing tests: 2045
4119
+ * Pending tests: 19
4120
+ * Failing tests: 2