ably-rest 0.8.6 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/SPEC.md +1049 -1001
  3. data/lib/submodules/ably-ruby/CHANGELOG.md +75 -3
  4. data/lib/submodules/ably-ruby/LICENSE +2 -2
  5. data/lib/submodules/ably-ruby/README.md +81 -20
  6. data/lib/submodules/ably-ruby/SPEC.md +1209 -693
  7. data/lib/submodules/ably-ruby/ably.gemspec +4 -4
  8. data/lib/submodules/ably-ruby/lib/ably/auth.rb +13 -4
  9. data/lib/submodules/ably-ruby/lib/ably/exceptions.rb +10 -1
  10. data/lib/submodules/ably-ruby/lib/ably/logger.rb +3 -1
  11. data/lib/submodules/ably-ruby/lib/ably/models/cipher_params.rb +114 -0
  12. data/lib/submodules/ably-ruby/lib/ably/models/connection_details.rb +10 -7
  13. data/lib/submodules/ably-ruby/lib/ably/models/error_info.rb +3 -3
  14. data/lib/submodules/ably-ruby/lib/ably/models/idiomatic_ruby_wrapper.rb +28 -21
  15. data/lib/submodules/ably-ruby/lib/ably/models/message.rb +19 -17
  16. data/lib/submodules/ably-ruby/lib/ably/models/message_encoders/cipher.rb +10 -9
  17. data/lib/submodules/ably-ruby/lib/ably/models/paginated_result.rb +27 -1
  18. data/lib/submodules/ably-ruby/lib/ably/models/presence_message.rb +20 -18
  19. data/lib/submodules/ably-ruby/lib/ably/models/protocol_message.rb +26 -19
  20. data/lib/submodules/ably-ruby/lib/ably/models/{stat.rb → stats.rb} +21 -19
  21. data/lib/submodules/ably-ruby/lib/ably/models/token_details.rb +14 -12
  22. data/lib/submodules/ably-ruby/lib/ably/models/token_request.rb +16 -14
  23. data/lib/submodules/ably-ruby/lib/ably/modules/async_wrapper.rb +2 -2
  24. data/lib/submodules/ably-ruby/lib/ably/modules/channels_collection.rb +11 -1
  25. data/lib/submodules/ably-ruby/lib/ably/modules/encodeable.rb +10 -10
  26. data/lib/submodules/ably-ruby/lib/ably/modules/enum.rb +18 -2
  27. data/lib/submodules/ably-ruby/lib/ably/modules/event_emitter.rb +3 -3
  28. data/lib/submodules/ably-ruby/lib/ably/modules/model_common.rb +13 -5
  29. data/lib/submodules/ably-ruby/lib/ably/modules/safe_deferrable.rb +1 -1
  30. data/lib/submodules/ably-ruby/lib/ably/modules/safe_yield.rb +2 -2
  31. data/lib/submodules/ably-ruby/lib/ably/modules/state_emitter.rb +8 -8
  32. data/lib/submodules/ably-ruby/lib/ably/modules/statesman_monkey_patch.rb +2 -2
  33. data/lib/submodules/ably-ruby/lib/ably/modules/uses_state_machine.rb +4 -2
  34. data/lib/submodules/ably-ruby/lib/ably/realtime.rb +1 -0
  35. data/lib/submodules/ably-ruby/lib/ably/realtime/auth.rb +6 -2
  36. data/lib/submodules/ably-ruby/lib/ably/realtime/channel.rb +7 -6
  37. data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +7 -1
  38. data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +7 -12
  39. data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +9 -2
  40. data/lib/submodules/ably-ruby/lib/ably/realtime/client/outgoing_message_dispatcher.rb +7 -1
  41. data/lib/submodules/ably-ruby/lib/ably/realtime/connection.rb +19 -8
  42. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +16 -9
  43. data/lib/submodules/ably-ruby/lib/ably/realtime/connection/websocket_transport.rb +12 -3
  44. data/lib/submodules/ably-ruby/lib/ably/realtime/presence.rb +35 -64
  45. data/lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb +23 -9
  46. data/lib/submodules/ably-ruby/lib/ably/rest/channel.rb +9 -10
  47. data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +1 -1
  48. data/lib/submodules/ably-ruby/lib/ably/rest/middleware/exceptions.rb +16 -4
  49. data/lib/submodules/ably-ruby/lib/ably/rest/presence.rb +7 -5
  50. data/lib/submodules/ably-ruby/lib/ably/util/crypto.rb +50 -40
  51. data/lib/submodules/ably-ruby/lib/ably/version.rb +1 -1
  52. data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_history_spec.rb +4 -4
  53. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_failures_spec.rb +2 -4
  54. data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +46 -8
  55. data/lib/submodules/ably-ruby/spec/acceptance/realtime/message_spec.rb +20 -20
  56. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_history_spec.rb +7 -7
  57. data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +114 -111
  58. data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +9 -9
  59. data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +5 -5
  60. data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +1 -1
  61. data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +1 -1
  62. data/lib/submodules/ably-ruby/spec/acceptance/rest/encoders_spec.rb +4 -4
  63. data/lib/submodules/ably-ruby/spec/acceptance/rest/message_spec.rb +15 -15
  64. data/lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb +4 -4
  65. data/lib/submodules/ably-ruby/spec/shared/model_behaviour.rb +7 -7
  66. data/lib/submodules/ably-ruby/spec/shared/safe_deferrable_behaviour.rb +4 -4
  67. data/lib/submodules/ably-ruby/spec/unit/models/cipher_params_spec.rb +140 -0
  68. data/lib/submodules/ably-ruby/spec/unit/models/idiomatic_ruby_wrapper_spec.rb +15 -8
  69. data/lib/submodules/ably-ruby/spec/unit/models/message_encoders/cipher_spec.rb +28 -22
  70. data/lib/submodules/ably-ruby/spec/unit/models/message_encoders/json_spec.rb +24 -0
  71. data/lib/submodules/ably-ruby/spec/unit/models/protocol_message_spec.rb +3 -3
  72. data/lib/submodules/ably-ruby/spec/unit/models/token_details_spec.rb +20 -18
  73. data/lib/submodules/ably-ruby/spec/unit/modules/event_emitter_spec.rb +2 -2
  74. data/lib/submodules/ably-ruby/spec/unit/modules/state_emitter_spec.rb +6 -6
  75. data/lib/submodules/ably-ruby/spec/unit/realtime/channel_spec.rb +4 -4
  76. data/lib/submodules/ably-ruby/spec/unit/realtime/connection_spec.rb +1 -1
  77. data/lib/submodules/ably-ruby/spec/unit/realtime/presence_spec.rb +5 -5
  78. data/lib/submodules/ably-ruby/spec/unit/util/crypto_spec.rb +50 -17
  79. metadata +5 -3
@@ -1,8 +1,8 @@
1
- # Ably Realtime & REST Client Library 0.8.2 Specification
1
+ # Ably Realtime & REST Client Library 0.8.9 Specification
2
2
 
3
3
  ### Ably::Realtime::Auth
4
4
  _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_spec.rb))_
5
- * using JSON and MsgPack protocol
5
+ * using JSON protocol
6
6
  * with basic auth
7
7
  * #authentication_security_requirements_met?
8
8
  * [returns true](./spec/acceptance/realtime/auth_spec.rb#L20)
@@ -19,45 +19,93 @@ _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_sp
19
19
  * with token auth
20
20
  * #client_id
21
21
  * [contains the ClientOptions client ID](./spec/acceptance/realtime/auth_spec.rb#L67)
22
- * #token
23
- * [contains the current token after auth](./spec/acceptance/realtime/auth_spec.rb#L76)
24
22
  * #current_token_details
25
- * [contains the current token after auth](./spec/acceptance/realtime/auth_spec.rb#L83)
23
+ * [contains the current token after auth](./spec/acceptance/realtime/auth_spec.rb#L74)
26
24
  * #token_renewable?
27
- * [is true when an API key exists](./spec/acceptance/realtime/auth_spec.rb#L93)
25
+ * [is true when an API key exists](./spec/acceptance/realtime/auth_spec.rb#L84)
28
26
  * #options (auth_options)
29
- * [contains the configured auth options](./spec/acceptance/realtime/auth_spec.rb#L103)
27
+ * [contains the configured auth options](./spec/acceptance/realtime/auth_spec.rb#L95)
30
28
  * #token_params
31
- * [contains the configured auth options](./spec/acceptance/realtime/auth_spec.rb#L114)
29
+ * [contains the configured auth options](./spec/acceptance/realtime/auth_spec.rb#L106)
32
30
  * #using_basic_auth?
33
- * [is false when using Token Auth](./spec/acceptance/realtime/auth_spec.rb#L123)
31
+ * [is false when using Token Auth](./spec/acceptance/realtime/auth_spec.rb#L115)
34
32
  * #using_token_auth?
35
- * [is true when using Token Auth](./spec/acceptance/realtime/auth_spec.rb#L132)
33
+ * [is true when using Token Auth](./spec/acceptance/realtime/auth_spec.rb#L124)
36
34
  *
37
35
  * #create_token_request
38
- * [returns a token request asynchronously](./spec/acceptance/realtime/auth_spec.rb#L146)
36
+ * [returns a token request asynchronously](./spec/acceptance/realtime/auth_spec.rb#L138)
39
37
  * #create_token_request_async
40
- * [returns a token request synchronously](./spec/acceptance/realtime/auth_spec.rb#L156)
38
+ * [returns a token request synchronously](./spec/acceptance/realtime/auth_spec.rb#L148)
41
39
  * #request_token
42
- * [returns a token asynchronously](./spec/acceptance/realtime/auth_spec.rb#L166)
40
+ * [returns a token asynchronously](./spec/acceptance/realtime/auth_spec.rb#L158)
43
41
  * #request_token_async
44
- * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L177)
42
+ * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L169)
45
43
  * #authorise
46
- * [returns a token asynchronously](./spec/acceptance/realtime/auth_spec.rb#L188)
44
+ * [returns a token asynchronously](./spec/acceptance/realtime/auth_spec.rb#L180)
45
+ * when implicitly called, with an explicit ClientOptions client_id
46
+ * and an incompatible client_id in a TokenDetails object passed to the auth callback
47
+ * [rejects a TokenDetails object with an incompatible client_id and raises an exception](./spec/acceptance/realtime/auth_spec.rb#L197)
48
+ * and an incompatible client_id in a TokenRequest object passed to the auth callback and raises an exception
49
+ * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/realtime/auth_spec.rb#L212)
50
+ * when explicitly called, with an explicit ClientOptions client_id
51
+ * and an incompatible client_id in a TokenDetails object passed to the auth callback
52
+ * [rejects a TokenDetails object with an incompatible client_id and raises an exception](./spec/acceptance/realtime/auth_spec.rb#L243)
47
53
  * #authorise_async
48
- * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L199)
49
- * #auth_params
50
- * [returns the auth params asynchronously](./spec/acceptance/realtime/auth_spec.rb#L211)
54
+ * [returns a token synchronously](./spec/acceptance/realtime/auth_spec.rb#L260)
51
55
  * #auth_params
52
- * [returns the auth params synchronously](./spec/acceptance/realtime/auth_spec.rb#L220)
53
- * #auth_header
54
- * [returns an auth header asynchronously](./spec/acceptance/realtime/auth_spec.rb#L227)
56
+ * [returns the auth params asynchronously](./spec/acceptance/realtime/auth_spec.rb#L272)
57
+ * #auth_params_sync
58
+ * [returns the auth params synchronously](./spec/acceptance/realtime/auth_spec.rb#L281)
55
59
  * #auth_header
56
- * [returns an auth header synchronously](./spec/acceptance/realtime/auth_spec.rb#L236)
60
+ * [returns an auth header asynchronously](./spec/acceptance/realtime/auth_spec.rb#L288)
61
+ * #auth_header_sync
62
+ * [returns an auth header synchronously](./spec/acceptance/realtime/auth_spec.rb#L297)
63
+ * #client_id_validated?
64
+ * when using basic auth
65
+ * before connected
66
+ * [is false as basic auth users do not have an identity](./spec/acceptance/realtime/auth_spec.rb#L310)
67
+ * once connected
68
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L317)
69
+ * [contains a validated wildcard client_id](./spec/acceptance/realtime/auth_spec.rb#L324)
70
+ * when using a token string
71
+ * with a valid client_id
72
+ * before connected
73
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L338)
74
+ * [#client_id is nil](./spec/acceptance/realtime/auth_spec.rb#L343)
75
+ * once connected
76
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L350)
77
+ * [#client_id is populated](./spec/acceptance/realtime/auth_spec.rb#L357)
78
+ * with no client_id (anonymous)
79
+ * before connected
80
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L370)
81
+ * once connected
82
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L377)
83
+ * with a wildcard client_id (anonymous)
84
+ * before connected
85
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/realtime/auth_spec.rb#L390)
86
+ * once connected
87
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L397)
88
+ * when using a token
89
+ * with a client_id
90
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L411)
91
+ * once connected
92
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L417)
93
+ * with no client_id (anonymous)
94
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L429)
95
+ * once connected
96
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L435)
97
+ * with a wildcard client_id (anonymous)
98
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L447)
99
+ * once connected
100
+ * [is true](./spec/acceptance/realtime/auth_spec.rb#L453)
101
+ * when using a token request with a client_id
102
+ * [is not true as identification is not confirmed until authenticated](./spec/acceptance/realtime/auth_spec.rb#L466)
103
+ * once connected
104
+ * [is true as identification is completed following CONNECTED ProtocolMessage](./spec/acceptance/realtime/auth_spec.rb#L472)
57
105
 
58
106
  ### Ably::Realtime::Channel#history
59
107
  _(see [spec/acceptance/realtime/channel_history_spec.rb](./spec/acceptance/realtime/channel_history_spec.rb))_
60
- * using JSON and MsgPack protocol
108
+ * using JSON protocol
61
109
  * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_history_spec.rb#L21)
62
110
  * with a single client publishing and receiving
63
111
  * [retrieves realtime history](./spec/acceptance/realtime/channel_history_spec.rb#L34)
@@ -74,13 +122,13 @@ _(see [spec/acceptance/realtime/channel_history_spec.rb](./spec/acceptance/realt
74
122
  * [return the same results with unique matching message IDs](./spec/acceptance/realtime/channel_history_spec.rb#L135)
75
123
  * with option until_attach: true
76
124
  * [retrieves all messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L160)
77
- * [raises an exception unless state is attached](./spec/acceptance/realtime/channel_history_spec.rb#L199)
125
+ * [raises an exception unless state is attached](./spec/acceptance/realtime/channel_history_spec.rb#L209)
78
126
  * and two pages of messages
79
127
  * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/channel_history_spec.rb#L175)
80
128
 
81
129
  ### Ably::Realtime::Channel
82
130
  _(see [spec/acceptance/realtime/channel_spec.rb](./spec/acceptance/realtime/channel_spec.rb))_
83
- * using JSON and MsgPack protocol
131
+ * using JSON protocol
84
132
  * initialization
85
133
  * with :auto_connect option set to false on connection
86
134
  * [remains initialized when accessing a channel](./spec/acceptance/realtime/channel_spec.rb#L21)
@@ -108,113 +156,184 @@ _(see [spec/acceptance/realtime/channel_spec.rb](./spec/acceptance/realtime/chan
108
156
  * #detach
109
157
  * [detaches from a channel](./spec/acceptance/realtime/channel_spec.rb#L212)
110
158
  * [detaches from a channel and calls the provided block](./spec/acceptance/realtime/channel_spec.rb#L222)
111
- * [emits :detaching then :detached events](./spec/acceptance/realtime/channel_spec.rb#L231)
112
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L243)
113
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/channel_spec.rb#L250)
159
+ * [emits :detaching then :detached events](./spec/acceptance/realtime/channel_spec.rb#L232)
160
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/channel_spec.rb#L244)
161
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/channel_spec.rb#L251)
114
162
  * when state is :failed
115
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L263)
163
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L264)
116
164
  * when state is :attaching
117
- * [moves straight to :detaching state and skips :attached](./spec/acceptance/realtime/channel_spec.rb#L274)
165
+ * [moves straight to :detaching state and skips :attached](./spec/acceptance/realtime/channel_spec.rb#L275)
118
166
  * when state is :detaching
119
- * [ignores subsequent #detach calls but calls the callback if provided](./spec/acceptance/realtime/channel_spec.rb#L292)
167
+ * [ignores subsequent #detach calls but calls the callback if provided](./spec/acceptance/realtime/channel_spec.rb#L293)
120
168
  * when state is :initialized
121
- * [does nothing as there is no channel to detach](./spec/acceptance/realtime/channel_spec.rb#L309)
122
- * [returns a valid deferrable](./spec/acceptance/realtime/channel_spec.rb#L317)
169
+ * [does nothing as there is no channel to detach](./spec/acceptance/realtime/channel_spec.rb#L310)
170
+ * [returns a valid deferrable](./spec/acceptance/realtime/channel_spec.rb#L318)
123
171
  * channel recovery in :attaching state
124
172
  * the transport is disconnected before the ATTACHED protocol message is received
125
- * PENDING: *[attach times out and fails if not ATTACHED protocol message received](./spec/acceptance/realtime/channel_spec.rb#L329)*
126
- * PENDING: *[channel is ATTACHED if ATTACHED protocol message is later received](./spec/acceptance/realtime/channel_spec.rb#L330)*
127
- * PENDING: *[sends an ATTACH protocol message in response to a channel message being received on the attaching channel](./spec/acceptance/realtime/channel_spec.rb#L331)*
173
+ * PENDING: *[attach times out and fails if not ATTACHED protocol message received](./spec/acceptance/realtime/channel_spec.rb#L330)*
174
+ * PENDING: *[channel is ATTACHED if ATTACHED protocol message is later received](./spec/acceptance/realtime/channel_spec.rb#L331)*
175
+ * PENDING: *[sends an ATTACH protocol message in response to a channel message being received on the attaching channel](./spec/acceptance/realtime/channel_spec.rb#L332)*
128
176
  * #publish
129
177
  * when attached
130
- * [publishes messages](./spec/acceptance/realtime/channel_spec.rb#L340)
178
+ * [publishes messages](./spec/acceptance/realtime/channel_spec.rb#L341)
131
179
  * when not yet attached
132
- * [publishes queued messages once attached](./spec/acceptance/realtime/channel_spec.rb#L352)
133
- * [publishes queued messages within a single protocol message](./spec/acceptance/realtime/channel_spec.rb#L360)
180
+ * [publishes queued messages once attached](./spec/acceptance/realtime/channel_spec.rb#L353)
181
+ * [publishes queued messages within a single protocol message](./spec/acceptance/realtime/channel_spec.rb#L361)
134
182
  * with :queue_messages client option set to false
135
183
  * and connection state initialized
136
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L383)
184
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L384)
137
185
  * and connection state connecting
138
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L391)
186
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L392)
139
187
  * and connection state disconnected
140
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L403)
188
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L404)
141
189
  * and connection state connected
142
- * [publishes the message](./spec/acceptance/realtime/channel_spec.rb#L416)
190
+ * [publishes the message](./spec/acceptance/realtime/channel_spec.rb#L417)
143
191
  * with name and data arguments
144
- * [publishes the message and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L427)
192
+ * [publishes the message and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L428)
193
+ * and additional attributes
194
+ * [publishes the message with the attributes and return true indicating success](./spec/acceptance/realtime/channel_spec.rb#L441)
145
195
  * with an array of Hash objects with :name and :data attributes
146
- * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L445)
196
+ * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L459)
147
197
  * with an array of Message objects
148
- * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L473)
198
+ * [publishes an array of messages in one ProtocolMessage](./spec/acceptance/realtime/channel_spec.rb#L487)
199
+ * nil attributes
200
+ * when name is nil
201
+ * [publishes the message without a name attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L511)
202
+ * when data is nil
203
+ * [publishes the message without a data attribute in the payload](./spec/acceptance/realtime/channel_spec.rb#L534)
204
+ * with neither name or data attributes
205
+ * [publishes the message without any attributes in the payload](./spec/acceptance/realtime/channel_spec.rb#L557)
149
206
  * with two invalid message out of 12
150
- * PENDING: *[calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L501)*
207
+ * before client_id is known (validated)
208
+ * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L581)
209
+ * when client_id is known (validated)
210
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L601)
151
211
  * only invalid messages
152
- * PENDING: *[calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L527)*
212
+ * before client_id is known (validated)
213
+ * [calls the errback once](./spec/acceptance/realtime/channel_spec.rb#L620)
214
+ * when client_id is known (validated)
215
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L639)
153
216
  * with many many messages and many connections simultaneously
154
- * [publishes all messages, all success callbacks are called, and a history request confirms all messages were published](./spec/acceptance/realtime/channel_spec.rb#L551)
217
+ * [publishes all messages, all success callbacks are called, and a history request confirms all messages were published](./spec/acceptance/realtime/channel_spec.rb#L653)
218
+ * identified clients
219
+ * when authenticated with a wildcard client_id
220
+ * with a valid client_id in the message
221
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L681)
222
+ * with a wildcard client_id in the message
223
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L693)
224
+ * with an empty client_id in the message
225
+ * [succeeds and publishes without a client_id](./spec/acceptance/realtime/channel_spec.rb#L700)
226
+ * when authenticated with a Token string with an implicit client_id
227
+ * before the client is CONNECTED and the client's identity has been obtained
228
+ * with a valid client_id in the message
229
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L720)
230
+ * with an invalid client_id in the message
231
+ * [succeeds in the client library but then fails when delivered to Ably](./spec/acceptance/realtime/channel_spec.rb#L733)
232
+ * with an empty client_id in the message
233
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L744)
234
+ * after the client is CONNECTED and the client's identity is known
235
+ * with a valid client_id in the message
236
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L758)
237
+ * with an invalid client_id in the message
238
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L772)
239
+ * with an empty client_id in the message
240
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L781)
241
+ * when authenticated with a valid client_id
242
+ * with a valid client_id
243
+ * [succeeds](./spec/acceptance/realtime/channel_spec.rb#L803)
244
+ * with a wildcard client_id in the message
245
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L815)
246
+ * with an invalid client_id in the message
247
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L822)
248
+ * with an empty client_id in the message
249
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L829)
250
+ * when anonymous and no client_id
251
+ * with a client_id in the message
252
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L848)
253
+ * with a wildcard client_id in the message
254
+ * [throws an exception](./spec/acceptance/realtime/channel_spec.rb#L855)
255
+ * with an empty client_id in the message
256
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/realtime/channel_spec.rb#L862)
155
257
  * #subscribe
156
258
  * with an event argument
157
- * [subscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L574)
259
+ * [subscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L878)
158
260
  * before attach
159
- * [receives messages as soon as attached](./spec/acceptance/realtime/channel_spec.rb#L584)
261
+ * [receives messages as soon as attached](./spec/acceptance/realtime/channel_spec.rb#L888)
160
262
  * with no event argument
161
- * [subscribes for all events](./spec/acceptance/realtime/channel_spec.rb#L598)
263
+ * [subscribes for all events](./spec/acceptance/realtime/channel_spec.rb#L902)
162
264
  * many times with different event names
163
- * [filters events accordingly to each callback](./spec/acceptance/realtime/channel_spec.rb#L608)
265
+ * [filters events accordingly to each callback](./spec/acceptance/realtime/channel_spec.rb#L912)
164
266
  * #unsubscribe
165
267
  * with an event argument
166
- * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L631)
268
+ * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L935)
167
269
  * with no event argument
168
- * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L644)
270
+ * [unsubscribes for a single event](./spec/acceptance/realtime/channel_spec.rb#L948)
169
271
  * when connection state changes to
170
272
  * :failed
171
273
  * an :attached channel
172
- * [transitions state to :failed](./spec/acceptance/realtime/channel_spec.rb#L667)
173
- * [emits an error event on the channel](./spec/acceptance/realtime/channel_spec.rb#L678)
174
- * [updates the channel error_reason](./spec/acceptance/realtime/channel_spec.rb#L689)
274
+ * [transitions state to :failed](./spec/acceptance/realtime/channel_spec.rb#L971)
275
+ * [emits an error event on the channel](./spec/acceptance/realtime/channel_spec.rb#L983)
276
+ * [updates the channel error_reason](./spec/acceptance/realtime/channel_spec.rb#L994)
175
277
  * a :detached channel
176
- * [remains in the :detached state](./spec/acceptance/realtime/channel_spec.rb#L702)
278
+ * [remains in the :detached state](./spec/acceptance/realtime/channel_spec.rb#L1008)
177
279
  * a :failed channel
178
- * [remains in the :failed state and ignores the failure error](./spec/acceptance/realtime/channel_spec.rb#L722)
280
+ * [remains in the :failed state and ignores the failure error](./spec/acceptance/realtime/channel_spec.rb#L1028)
179
281
  * a channel ATTACH request
180
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L743)
282
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1049)
181
283
  * :closed
182
284
  * an :attached channel
183
- * [transitions state to :detached](./spec/acceptance/realtime/channel_spec.rb#L757)
285
+ * [transitions state to :detached](./spec/acceptance/realtime/channel_spec.rb#L1063)
184
286
  * a :detached channel
185
- * [remains in the :detached state](./spec/acceptance/realtime/channel_spec.rb#L768)
287
+ * [remains in the :detached state](./spec/acceptance/realtime/channel_spec.rb#L1074)
186
288
  * a :failed channel
187
- * [remains in the :failed state and retains the error_reason](./spec/acceptance/realtime/channel_spec.rb#L789)
289
+ * [remains in the :failed state and retains the error_reason](./spec/acceptance/realtime/channel_spec.rb#L1095)
188
290
  * a channel ATTACH request when connection CLOSED
189
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L810)
291
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1116)
190
292
  * a channel ATTACH request when connection CLOSING
191
- * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L822)
293
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1128)
294
+ * :suspended
295
+ * an :attached channel
296
+ * [transitions state to :detached](./spec/acceptance/realtime/channel_spec.rb#L1144)
297
+ * a :detached channel
298
+ * [remains in the :detached state](./spec/acceptance/realtime/channel_spec.rb#L1155)
299
+ * a :failed channel
300
+ * [remains in the :failed state and retains the error_reason](./spec/acceptance/realtime/channel_spec.rb#L1176)
301
+ * a channel ATTACH request when connection SUSPENDED
302
+ * [raises an exception](./spec/acceptance/realtime/channel_spec.rb#L1199)
192
303
  * #presence
193
- * [returns a Ably::Realtime::Presence object](./spec/acceptance/realtime/channel_spec.rb#L836)
304
+ * [returns a Ably::Realtime::Presence object](./spec/acceptance/realtime/channel_spec.rb#L1213)
305
+ * channel state change
306
+ * [emits a ChannelStateChange object](./spec/acceptance/realtime/channel_spec.rb#L1220)
307
+ * ChannelStateChange object
308
+ * [has current state](./spec/acceptance/realtime/channel_spec.rb#L1229)
309
+ * [has a previous state](./spec/acceptance/realtime/channel_spec.rb#L1237)
310
+ * [has an empty reason when there is no error](./spec/acceptance/realtime/channel_spec.rb#L1254)
311
+ * on failure
312
+ * [has a reason Error object when there is an error on the channel](./spec/acceptance/realtime/channel_spec.rb#L1267)
194
313
 
195
314
  ### Ably::Realtime::Channels
196
315
  _(see [spec/acceptance/realtime/channels_spec.rb](./spec/acceptance/realtime/channels_spec.rb))_
197
- * using JSON and MsgPack protocol
316
+ * using JSON protocol
198
317
  * using shortcut method #channel on the client object
199
318
  * behaves like a channel
200
319
  * [returns a channel object](./spec/acceptance/realtime/channels_spec.rb#L6)
201
- * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L11)
320
+ * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L12)
202
321
  * using #get method on client#channels
203
322
  * behaves like a channel
204
323
  * [returns a channel object](./spec/acceptance/realtime/channels_spec.rb#L6)
205
- * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L11)
324
+ * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L12)
206
325
  * accessing an existing channel object with different options
207
- * [overrides the existing channel options and returns the channel object](./spec/acceptance/realtime/channels_spec.rb#L39)
326
+ * [overrides the existing channel options and returns the channel object](./spec/acceptance/realtime/channels_spec.rb#L41)
208
327
  * accessing an existing channel object without specifying any channel options
209
- * [returns the existing channel without modifying the channel options](./spec/acceptance/realtime/channels_spec.rb#L50)
328
+ * [returns the existing channel without modifying the channel options](./spec/acceptance/realtime/channels_spec.rb#L53)
210
329
  * using undocumented array accessor [] method on client#channels
211
330
  * behaves like a channel
212
331
  * [returns a channel object](./spec/acceptance/realtime/channels_spec.rb#L6)
213
- * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L11)
332
+ * [returns channel object and passes the provided options](./spec/acceptance/realtime/channels_spec.rb#L12)
214
333
 
215
334
  ### Ably::Realtime::Client
216
335
  _(see [spec/acceptance/realtime/client_spec.rb](./spec/acceptance/realtime/client_spec.rb))_
217
- * using JSON and MsgPack protocol
336
+ * using JSON protocol
218
337
  * initialization
219
338
  * basic auth
220
339
  * [is enabled by default with a provided :key option](./spec/acceptance/realtime/client_spec.rb#L18)
@@ -224,96 +343,117 @@ _(see [spec/acceptance/realtime/client_spec.rb](./spec/acceptance/realtime/clien
224
343
  * token auth
225
344
  * with TLS enabled
226
345
  * and a pre-generated Token provided with the :token option
227
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L51)
346
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L52)
228
347
  * with valid :key and :use_token_auth option set to true
229
- * [automatically authorises on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L64)
348
+ * [automatically authorises on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L65)
230
349
  * with client_id
231
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L77)
350
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L78)
232
351
  * with TLS disabled
233
352
  * and a pre-generated Token provided with the :token option
234
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L51)
353
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L52)
235
354
  * with valid :key and :use_token_auth option set to true
236
- * [automatically authorises on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L64)
355
+ * [automatically authorises on connect and generates a token](./spec/acceptance/realtime/client_spec.rb#L65)
237
356
  * with client_id
238
- * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L77)
357
+ * [connects using token auth](./spec/acceptance/realtime/client_spec.rb#L78)
239
358
  * with a Proc for the :auth_callback option
240
- * [calls the Proc](./spec/acceptance/realtime/client_spec.rb#L102)
241
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/realtime/client_spec.rb#L109)
359
+ * [calls the Proc](./spec/acceptance/realtime/client_spec.rb#L103)
360
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/realtime/client_spec.rb#L110)
361
+ * when the returned token has a client_id
362
+ * [sets Auth#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L118)
363
+ * [sets Client#client_id to the new token's client_id immediately when connecting](./spec/acceptance/realtime/client_spec.rb#L126)
364
+ * with a wildcard client_id token
365
+ * and an explicit client_id in ClientOptions
366
+ * [allows uses the explicit client_id in the connection](./spec/acceptance/realtime/client_spec.rb#L144)
367
+ * and client_id omitted in ClientOptions
368
+ * [uses the token provided clientId in the connection](./spec/acceptance/realtime/client_spec.rb#L160)
369
+ * with an invalid wildcard "*" :client_id
370
+ * [raises an exception](./spec/acceptance/realtime/client_spec.rb#L176)
371
+ * realtime connection settings
372
+ * defaults
373
+ * [disconnected_retry_timeout is 15s](./spec/acceptance/realtime/client_spec.rb#L185)
374
+ * [suspended_retry_timeout is 30s](./spec/acceptance/realtime/client_spec.rb#L190)
375
+ * overriden in ClientOptions
376
+ * [disconnected_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L199)
377
+ * [suspended_retry_timeout is updated](./spec/acceptance/realtime/client_spec.rb#L204)
242
378
  * #connection
243
- * [provides access to the Connection object](./spec/acceptance/realtime/client_spec.rb#L120)
379
+ * [provides access to the Connection object](./spec/acceptance/realtime/client_spec.rb#L213)
244
380
  * #channels
245
- * [provides access to the Channels collection object](./spec/acceptance/realtime/client_spec.rb#L127)
381
+ * [provides access to the Channels collection object](./spec/acceptance/realtime/client_spec.rb#L220)
246
382
  * #auth
247
- * [provides access to the Realtime::Auth object](./spec/acceptance/realtime/client_spec.rb#L134)
383
+ * [provides access to the Realtime::Auth object](./spec/acceptance/realtime/client_spec.rb#L227)
248
384
 
249
385
  ### Ably::Realtime::Connection failures
250
386
  _(see [spec/acceptance/realtime/connection_failures_spec.rb](./spec/acceptance/realtime/connection_failures_spec.rb))_
251
- * using JSON and MsgPack protocol
387
+ * using JSON protocol
252
388
  * authentication failure
253
389
  * when API key is invalid
254
390
  * with invalid app part of the key
255
391
  * [enters the failed state and returns a not found error](./spec/acceptance/realtime/connection_failures_spec.rb#L26)
256
392
  * with invalid key name part of the key
257
- * [enters the failed state and returns an authorization error](./spec/acceptance/realtime/connection_failures_spec.rb#L40)
393
+ * [enters the failed state and returns an authorization error](./spec/acceptance/realtime/connection_failures_spec.rb#L41)
258
394
  * automatic connection retry
259
395
  * with invalid WebSocket host
260
396
  * when disconnected
261
397
  * [enters the suspended state after multiple attempts to connect](./spec/acceptance/realtime/connection_failures_spec.rb#L95)
398
+ * for the first time
399
+ * [reattempts connection immediately and then waits disconnected_retry_timeout for a subsequent attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L116)
262
400
  * #close
263
- * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L112)
401
+ * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L133)
264
402
  * when connection state is :suspended
265
- * [enters the failed state after multiple attempts if the max_time_in_state is set](./spec/acceptance/realtime/connection_failures_spec.rb#L131)
403
+ * [stays in the suspended state after any number of reconnection attempts](./spec/acceptance/realtime/connection_failures_spec.rb#L152)
404
+ * for the first time
405
+ * [waits suspended_retry_timeout before attempting to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L175)
266
406
  * #close
267
- * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L151)
407
+ * [transitions connection state to :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L197)
268
408
  * when connection state is :failed
269
409
  * #close
270
- * [will not transition state to :close and raises a InvalidStateChange exception](./spec/acceptance/realtime/connection_failures_spec.rb#L170)
410
+ * [will not transition state to :close and raises a InvalidStateChange exception](./spec/acceptance/realtime/connection_failures_spec.rb#L216)
271
411
  * #error_reason
272
- * [contains the error when state is disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L184)
273
- * [contains the error when state is suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L184)
274
- * [contains the error when state is failed](./spec/acceptance/realtime/connection_failures_spec.rb#L184)
275
- * [is reset to nil when :connected](./spec/acceptance/realtime/connection_failures_spec.rb#L193)
276
- * [is reset to nil when :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L204)
412
+ * [contains the error when state is disconnected](./spec/acceptance/realtime/connection_failures_spec.rb#L234)
413
+ * [contains the error when state is suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L234)
414
+ * [contains the error when state is failed](./spec/acceptance/realtime/connection_failures_spec.rb#L234)
415
+ * [is reset to nil when :connected](./spec/acceptance/realtime/connection_failures_spec.rb#L248)
416
+ * [is reset to nil when :closed](./spec/acceptance/realtime/connection_failures_spec.rb#L259)
277
417
  * #connect
278
418
  * connection opening times out
279
- * [attempts to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L233)
280
- * [calls the errback of the returned Deferrable object when first connection attempt fails](./spec/acceptance/realtime/connection_failures_spec.rb#L246)
419
+ * [attempts to reconnect](./spec/acceptance/realtime/connection_failures_spec.rb#L290)
281
420
  * when retry intervals are stubbed to attempt reconnection quickly
282
- * [never calls the provided success block](./spec/acceptance/realtime/connection_failures_spec.rb#L263)
421
+ * [never calls the provided success block](./spec/acceptance/realtime/connection_failures_spec.rb#L314)
283
422
  * connection resume
284
423
  * when DISCONNECTED ProtocolMessage received from the server
285
- * [reconnects automatically and immediately](./spec/acceptance/realtime/connection_failures_spec.rb#L292)
424
+ * [reconnects automatically and immediately](./spec/acceptance/realtime/connection_failures_spec.rb#L345)
286
425
  * and subsequently fails to reconnect
287
- * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L322)
426
+ * [retries every 15 seconds](./spec/acceptance/realtime/connection_failures_spec.rb#L377)
288
427
  * when websocket transport is closed
289
- * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L365)
428
+ * [reconnects automatically](./spec/acceptance/realtime/connection_failures_spec.rb#L420)
290
429
  * after successfully reconnecting and resuming
291
- * [retains connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L382)
292
- * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L399)
430
+ * [retains connection_id and updates the connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L437)
431
+ * [emits any error received from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L452)
432
+ * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L483)
293
433
  * when messages were published whilst the client was disconnected
294
- * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L429)
434
+ * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L511)
295
435
  * when failing to resume
296
436
  * because the connection_key is not or no longer valid
297
- * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L470)
298
- * [detaches all channels](./spec/acceptance/realtime/connection_failures_spec.rb#L485)
299
- * [emits an error on the channel and sets the error reason](./spec/acceptance/realtime/connection_failures_spec.rb#L504)
437
+ * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L554)
438
+ * [detaches all channels](./spec/acceptance/realtime/connection_failures_spec.rb#L569)
439
+ * [emits an error on the channel and sets the error reason](./spec/acceptance/realtime/connection_failures_spec.rb#L589)
300
440
  * fallback host feature
301
441
  * with custom realtime websocket host option
302
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L543)
442
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L629)
303
443
  * with custom realtime websocket port option
304
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L559)
444
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L647)
305
445
  * with non-production environment
306
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L576)
446
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L666)
307
447
  * with production environment
308
448
  * when the Internet is down
309
- * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L604)
449
+ * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L696)
310
450
  * when the Internet is up
311
- * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L621)
312
- * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L640)
451
+ * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L716)
452
+ * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L735)
313
453
 
314
454
  ### Ably::Realtime::Connection
315
455
  _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/connection_spec.rb))_
316
- * using JSON and MsgPack protocol
456
+ * using JSON protocol
317
457
  * intialization
318
458
  * [connects automatically](./spec/acceptance/realtime/connection_spec.rb#L23)
319
459
  * with :auto_connect option set to false
@@ -328,128 +468,163 @@ _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/c
328
468
  * [uses the token created by the implicit authorisation](./spec/acceptance/realtime/connection_spec.rb#L76)
329
469
  * that expire
330
470
  * opening a new connection
331
- * with recently expired token
332
- * [renews the token on connect without changing connection state](./spec/acceptance/realtime/connection_spec.rb#L108)
333
- * with immediately expiring token
334
- * [renews the token on connect, and only makes one subsequent attempt to obtain a new token](./spec/acceptance/realtime/connection_spec.rb#L127)
335
- * [uses the primary host for subsequent connection and auth requests](./spec/acceptance/realtime/connection_spec.rb#L137)
471
+ * with almost expired tokens
472
+ * [renews token every time after it expires](./spec/acceptance/realtime/connection_spec.rb#L110)
473
+ * with immediately expired token
474
+ * [renews the token on connect, and makes one immediate subsequent attempt to obtain a new token](./spec/acceptance/realtime/connection_spec.rb#L140)
475
+ * when disconnected_retry_timeout is 0.5 seconds
476
+ * [renews the token on connect, and continues to attempt renew based on the retry schedule](./spec/acceptance/realtime/connection_spec.rb#L155)
477
+ * using implicit token auth
478
+ * [uses the primary host for subsequent connection and auth requests](./spec/acceptance/realtime/connection_spec.rb#L177)
336
479
  * when connected with a valid non-expired token
337
480
  * that then expires following the connection being opened
338
- * PENDING: *[retains connection state](./spec/acceptance/realtime/connection_spec.rb#L193)*
339
- * PENDING: *[changes state to failed if a new token cannot be issued](./spec/acceptance/realtime/connection_spec.rb#L194)*
340
481
  * the server
341
- * [disconnects the client, and the client automatically renews the token and then reconnects](./spec/acceptance/realtime/connection_spec.rb#L164)
482
+ * [disconnects the client, and the client automatically renews the token and then reconnects](./spec/acceptance/realtime/connection_spec.rb#L204)
483
+ * connection state
484
+ * [retains messages published when disconnected twice during authentication](./spec/acceptance/realtime/connection_spec.rb#L273)
485
+ * and subsequent token is invalid
486
+ * [transitions the connection to the failed state](./spec/acceptance/realtime/connection_spec.rb#L302)
342
487
  * for non-renewable tokens
343
488
  * that are expired
344
489
  * opening a new connection
345
- * [transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L214)
490
+ * [transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L331)
346
491
  * when connected
347
- * PENDING: *[transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L227)*
492
+ * PENDING: *[transitions state to failed](./spec/acceptance/realtime/connection_spec.rb#L344)*
493
+ * with opaque token string that contain an implicit client_id
494
+ * string
495
+ * [sets the Client#client_id and Auth#client_id once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L357)
496
+ * that is incompatible with the current client client_id
497
+ * [fails the connection](./spec/acceptance/realtime/connection_spec.rb#L369)
498
+ * wildcard
499
+ * [configures the Client#client_id and Auth#client_id with a wildcard once CONNECTED](./spec/acceptance/realtime/connection_spec.rb#L383)
348
500
  * initialization state changes
349
501
  * with implicit #connect
350
- * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L254)
502
+ * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L415)
351
503
  * with explicit #connect
352
- * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L260)
504
+ * [are emitted in order](./spec/acceptance/realtime/connection_spec.rb#L421)
353
505
  * #connect
354
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L268)
355
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L273)
506
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L429)
507
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L434)
508
+ * [calls the provided block on success even if state changes to disconnected first](./spec/acceptance/realtime/connection_spec.rb#L441)
509
+ * with invalid auth details
510
+ * [calls the Deferrable errback only once on connection failure](./spec/acceptance/realtime/connection_spec.rb#L470)
356
511
  * when already connected
357
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L282)
512
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L486)
358
513
  * connection#id
359
- * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L296)
514
+ * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L500)
360
515
  * connection#key
361
- * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L303)
516
+ * [is null before connecting](./spec/acceptance/realtime/connection_spec.rb#L507)
362
517
  * once connected
363
518
  * connection#id
364
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L313)
365
- * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L320)
366
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L327)
519
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L518)
520
+ * [is unique from the connection#key](./spec/acceptance/realtime/connection_spec.rb#L525)
521
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L532)
367
522
  * connection#key
368
- * [is a string](./spec/acceptance/realtime/connection_spec.rb#L336)
369
- * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L343)
370
- * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L350)
523
+ * [is a string](./spec/acceptance/realtime/connection_spec.rb#L541)
524
+ * [is unique from the connection#id](./spec/acceptance/realtime/connection_spec.rb#L548)
525
+ * [is unique for every connection](./spec/acceptance/realtime/connection_spec.rb#L555)
371
526
  * following a previous connection being opened and closed
372
- * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L360)
527
+ * [reconnects and is provided with a new connection ID and connection key from the server](./spec/acceptance/realtime/connection_spec.rb#L565)
373
528
  * when closing
374
- * [raises an exception before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L377)
529
+ * [raises an exception before the connection is closed](./spec/acceptance/realtime/connection_spec.rb#L582)
375
530
  * #serial connection serial
376
- * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L392)
377
- * [is set to 0 when a message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L413)
378
- * [is set to 1 when the second message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L420)
531
+ * [is set to -1 when a new connection is opened](./spec/acceptance/realtime/connection_spec.rb#L597)
532
+ * [is set to 0 when a message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L618)
533
+ * [is set to 1 when the second message sent ACK is received](./spec/acceptance/realtime/connection_spec.rb#L625)
379
534
  * when a message is sent but the ACK has not yet been received
380
- * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L400)
535
+ * [the sent message msgSerial is 0 but the connection serial remains at -1](./spec/acceptance/realtime/connection_spec.rb#L605)
381
536
  * #close
382
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L431)
383
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L438)
537
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/connection_spec.rb#L636)
538
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/connection_spec.rb#L643)
384
539
  * when already closed
385
- * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L449)
540
+ * [does nothing and no further state changes are emitted](./spec/acceptance/realtime/connection_spec.rb#L654)
386
541
  * when connection state is
387
542
  * :initialized
388
- * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L477)
543
+ * [changes the connection state to :closing and then immediately :closed without sending a ProtocolMessage CLOSE](./spec/acceptance/realtime/connection_spec.rb#L682)
389
544
  * :connected
390
- * [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#L495)
545
+ * [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#L700)
391
546
  * with an unresponsive connection
392
- * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L525)
547
+ * [force closes the connection when a :closed ProtocolMessage response is not received](./spec/acceptance/realtime/connection_spec.rb#L728)
393
548
  * #ping
394
- * [echoes a heart beat](./spec/acceptance/realtime/connection_spec.rb#L548)
549
+ * [echoes a heart beat](./spec/acceptance/realtime/connection_spec.rb#L751)
395
550
  * when not connected
396
- * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L558)
551
+ * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L761)
397
552
  * with a success block that raises an exception
398
- * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L565)
553
+ * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L768)
554
+ * when ping times out
555
+ * [logs a warning](./spec/acceptance/realtime/connection_spec.rb#L781)
556
+ * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L791)
557
+ * #details
558
+ * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L806)
559
+ * [contains the ConnectionDetails object once connected](./spec/acceptance/realtime/connection_spec.rb#L813)
560
+ * [contains the new ConnectionDetails object once a subsequent connection is created](./spec/acceptance/realtime/connection_spec.rb#L822)
399
561
  * recovery
400
562
  * #recovery_key
401
- * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L602)
402
- * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L625)
403
- * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L649)
563
+ * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L864)
564
+ * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L887)
565
+ * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L916)
404
566
  * opening a new connection using a recently disconnected connection's #recovery_key
405
567
  * connection#id and connection#key after recovery
406
- * [remains the same](./spec/acceptance/realtime/connection_spec.rb#L663)
568
+ * [remains the same for id and party for key](./spec/acceptance/realtime/connection_spec.rb#L928)
407
569
  * when messages have been sent whilst the old connection is disconnected
408
570
  * the new connection
409
- * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L704)
571
+ * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L970)
410
572
  * with :recover option
411
573
  * with invalid syntax
412
- * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L729)
574
+ * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L996)
413
575
  * with invalid formatted value sent to server
414
- * [emits a fatal error on the connection object, sets the #error_reason and disconnects](./spec/acceptance/realtime/connection_spec.rb#L738)
576
+ * [emits a fatal error on the connection object, sets the #error_reason and disconnects](./spec/acceptance/realtime/connection_spec.rb#L1005)
415
577
  * with expired (missing) value sent to server
416
- * [emits an error on the connection object, sets the #error_reason, yet will connect anyway](./spec/acceptance/realtime/connection_spec.rb#L753)
578
+ * [emits an error on the connection object, sets the #error_reason, yet will connect anyway](./spec/acceptance/realtime/connection_spec.rb#L1020)
417
579
  * with many connections simultaneously
418
- * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L772)
580
+ * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1039)
419
581
  * when a state transition is unsupported
420
- * [emits a InvalidStateChange](./spec/acceptance/realtime/connection_spec.rb#L792)
582
+ * [emits a InvalidStateChange](./spec/acceptance/realtime/connection_spec.rb#L1059)
421
583
  * protocol failure
422
584
  * receiving an invalid ProtocolMessage
423
- * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L808)
585
+ * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1075)
424
586
  * undocumented method
425
587
  * #internet_up?
426
- * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L824)
588
+ * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1091)
427
589
  * internet up URL protocol
428
590
  * when using TLS for the connection
429
- * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L835)
591
+ * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1102)
430
592
  * when using a non-secured connection
431
- * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L845)
593
+ * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1112)
432
594
  * when the Internet is up
433
- * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L876)
434
- * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L883)
595
+ * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1143)
596
+ * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1150)
435
597
  * with a TLS connection
436
- * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L859)
598
+ * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1126)
437
599
  * with a non-TLS connection
438
- * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L869)
600
+ * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1136)
439
601
  * when the Internet is down
440
- * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L898)
441
- * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L905)
602
+ * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1165)
603
+ * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1172)
442
604
  * state change side effects
443
605
  * when connection enters the :disconnected state
444
- * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L919)
606
+ * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1186)
445
607
  * when connection enters the :suspended state
446
- * [detaches the channels and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L952)
608
+ * [detaches the channels and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1219)
447
609
  * when connection enters the :failed state
448
- * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L973)
610
+ * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1248)
611
+ * connection state change
612
+ * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1259)
613
+ * ConnectionStateChange object
614
+ * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1267)
615
+ * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1274)
616
+ * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1289)
617
+ * on failure
618
+ * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1302)
619
+ * retry_in
620
+ * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1317)
621
+ * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1324)
622
+ * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1334)
623
+ * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1344)
449
624
 
450
625
  ### Ably::Realtime::Channel Message
451
626
  _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/message_spec.rb))_
452
- * using JSON and MsgPack protocol
627
+ * using JSON protocol
453
628
  * [sends a String data payload](./spec/acceptance/realtime/message_spec.rb#L25)
454
629
  * with supported data payload content type
455
630
  * JSON Object (Hash)
@@ -472,444 +647,538 @@ _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/mess
472
647
  * with ASCII_8BIT message name
473
648
  * [is converted into UTF_8](./spec/acceptance/realtime/message_spec.rb#L118)
474
649
  * when the message publisher has a client_id
475
- * PENDING: *[contains a #client_id attribute](./spec/acceptance/realtime/message_spec.rb#L134)*
650
+ * [contains a #client_id attribute](./spec/acceptance/realtime/message_spec.rb#L134)
476
651
  * #connection_id attribute
477
652
  * over realtime
478
- * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L148)
653
+ * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L147)
479
654
  * when retrieved over REST
480
- * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L160)
655
+ * [matches the sender connection#id](./spec/acceptance/realtime/message_spec.rb#L159)
481
656
  * local echo when published
482
- * [is enabled by default](./spec/acceptance/realtime/message_spec.rb#L172)
657
+ * [is enabled by default](./spec/acceptance/realtime/message_spec.rb#L171)
483
658
  * with :echo_messages option set to false
484
- * [will not echo messages to the client but will still broadcast messages to other connected clients](./spec/acceptance/realtime/message_spec.rb#L188)
659
+ * [will not echo messages to the client but will still broadcast messages to other connected clients](./spec/acceptance/realtime/message_spec.rb#L191)
660
+ * [will not echo messages to the client from other REST clients publishing using that connection_key](./spec/acceptance/realtime/message_spec.rb#L210)
661
+ * [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#L223)
485
662
  * publishing lots of messages across two connections
486
- * [sends and receives the messages on both opened connections and calls the success callbacks for each message published](./spec/acceptance/realtime/message_spec.rb#L220)
663
+ * [sends and receives the messages on both opened connections and calls the success callbacks for each message published](./spec/acceptance/realtime/message_spec.rb#L249)
487
664
  * without suitable publishing permissions
488
- * [calls the error callback](./spec/acceptance/realtime/message_spec.rb#L265)
665
+ * [calls the error callback](./spec/acceptance/realtime/message_spec.rb#L294)
489
666
  * server incorrectly resends a message that was already received by the client library
490
- * [discards the message and logs it as an error to the channel](./spec/acceptance/realtime/message_spec.rb#L285)
667
+ * [discards the message and logs it as an error to the channel](./spec/acceptance/realtime/message_spec.rb#L313)
491
668
  * encoding and decoding encrypted messages
492
669
  * with AES-128-CBC using crypto-data-128.json fixtures
493
670
  * item 0 with encrypted encoding utf-8/cipher+aes-128-cbc/base64
494
671
  * behaves like an Ably encrypter and decrypter
495
672
  * with #publish and #subscribe
496
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
497
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
673
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
674
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
498
675
  * item 1 with encrypted encoding cipher+aes-128-cbc/base64
499
676
  * behaves like an Ably encrypter and decrypter
500
677
  * with #publish and #subscribe
501
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
502
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
678
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
679
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
503
680
  * item 2 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
504
681
  * behaves like an Ably encrypter and decrypter
505
682
  * with #publish and #subscribe
506
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
507
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
683
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
684
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
508
685
  * item 3 with encrypted encoding json/utf-8/cipher+aes-128-cbc/base64
509
686
  * behaves like an Ably encrypter and decrypter
510
687
  * with #publish and #subscribe
511
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
512
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
688
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
689
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
513
690
  * with AES-256-CBC using crypto-data-256.json fixtures
514
691
  * item 0 with encrypted encoding utf-8/cipher+aes-256-cbc/base64
515
692
  * behaves like an Ably encrypter and decrypter
516
693
  * with #publish and #subscribe
517
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
518
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
694
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
695
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
519
696
  * item 1 with encrypted encoding cipher+aes-256-cbc/base64
520
697
  * behaves like an Ably encrypter and decrypter
521
698
  * with #publish and #subscribe
522
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
523
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
699
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
700
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
524
701
  * item 2 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
525
702
  * behaves like an Ably encrypter and decrypter
526
703
  * with #publish and #subscribe
527
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
528
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
704
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
705
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
529
706
  * item 3 with encrypted encoding json/utf-8/cipher+aes-256-cbc/base64
530
707
  * behaves like an Ably encrypter and decrypter
531
708
  * with #publish and #subscribe
532
- * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L349)
533
- * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L367)
709
+ * [encrypts message automatically before they are pushed to the server](./spec/acceptance/realtime/message_spec.rb#L377)
710
+ * [sends and receives messages that are encrypted & decrypted by the Ably library](./spec/acceptance/realtime/message_spec.rb#L395)
534
711
  * with multiple sends from one client to another
535
- * [encrypts and decrypts all messages](./spec/acceptance/realtime/message_spec.rb#L406)
712
+ * [encrypts and decrypts all messages](./spec/acceptance/realtime/message_spec.rb#L434)
713
+ * [receives raw messages with the correct encoding](./spec/acceptance/realtime/message_spec.rb#L451)
536
714
  * subscribing with a different transport protocol
537
- * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L449)
538
- * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L449)
539
- * [delivers a Hash payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L449)
715
+ * [delivers a String ASCII-8BIT payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L485)
716
+ * [delivers a String UTF-8 payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L485)
717
+ * [delivers a Hash payload to the receiver](./spec/acceptance/realtime/message_spec.rb#L485)
540
718
  * publishing on an unencrypted channel and subscribing on an encrypted channel with another client
541
- * [does not attempt to decrypt the message](./spec/acceptance/realtime/message_spec.rb#L468)
719
+ * [does not attempt to decrypt the message](./spec/acceptance/realtime/message_spec.rb#L504)
542
720
  * publishing on an encrypted channel and subscribing on an unencrypted channel with another client
543
- * [delivers the message but still encrypted with a value in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L486)
544
- * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L495)
721
+ * [delivers the message but still encrypted with a value in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L522)
722
+ * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L531)
545
723
  * publishing on an encrypted channel and subscribing with a different algorithm on another client
546
- * [delivers the message but still encrypted with the cipher detials in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L517)
547
- * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L526)
724
+ * [delivers the message but still encrypted with the cipher detials in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L553)
725
+ * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L562)
548
726
  * publishing on an encrypted channel and subscribing with a different key on another client
549
- * [delivers the message but still encrypted with the cipher details in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L548)
550
- * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L559)
727
+ * [delivers the message but still encrypted with the cipher details in the #encoding attribute](./spec/acceptance/realtime/message_spec.rb#L584)
728
+ * [emits a Cipher error on the channel](./spec/acceptance/realtime/message_spec.rb#L595)
729
+ * when message is published, the connection disconnects before the ACK is received, and the connection is resumed
730
+ * [publishes the message again, later receives the ACK and only one message is ever received from Ably](./spec/acceptance/realtime/message_spec.rb#L616)
731
+ * when message is published, the connection disconnects before the ACK is received
732
+ * the connection is not resumed
733
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L659)
734
+ * the connection becomes suspended
735
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L685)
736
+ * the connection becomes failed
737
+ * [calls the errback for all messages](./spec/acceptance/realtime/message_spec.rb#L712)
551
738
 
552
739
  ### Ably::Realtime::Presence history
553
740
  _(see [spec/acceptance/realtime/presence_history_spec.rb](./spec/acceptance/realtime/presence_history_spec.rb))_
554
- * using JSON and MsgPack protocol
741
+ * using JSON protocol
555
742
  * [provides up to the moment presence history](./spec/acceptance/realtime/presence_history_spec.rb#L21)
556
743
  * [ensures REST presence history message IDs match ProtocolMessage wrapped message and connection IDs via Realtime](./spec/acceptance/realtime/presence_history_spec.rb#L42)
557
744
  * with option until_attach: true
558
745
  * [retrieves all presence messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L61)
559
- * [raises an exception unless state is attached](./spec/acceptance/realtime/presence_history_spec.rb#L93)
746
+ * [raises an exception unless state is attached](./spec/acceptance/realtime/presence_history_spec.rb#L97)
560
747
  * and two pages of messages
561
- * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L74)
748
+ * [retrieves two pages of messages before channel was attached](./spec/acceptance/realtime/presence_history_spec.rb#L78)
562
749
 
563
750
  ### Ably::Realtime::Presence
564
751
  _(see [spec/acceptance/realtime/presence_spec.rb](./spec/acceptance/realtime/presence_spec.rb))_
565
- * using JSON and MsgPack protocol
752
+ * using JSON protocol
566
753
  * when attached (but not present) on a presence channel with an anonymous client (no client ID)
567
- * [maintains state as other clients enter and leave the channel](./spec/acceptance/realtime/presence_spec.rb#L282)
754
+ * [maintains state as other clients enter and leave the channel](./spec/acceptance/realtime/presence_spec.rb#L412)
568
755
  * #sync_complete?
569
756
  * when attaching to a channel without any members present
570
- * [is true and the presence channel is considered synced immediately](./spec/acceptance/realtime/presence_spec.rb#L358)
757
+ * [is true and the presence channel is considered synced immediately](./spec/acceptance/realtime/presence_spec.rb#L488)
571
758
  * when attaching to a channel with members present
572
- * [is false and the presence channel will subsequently be synced](./spec/acceptance/realtime/presence_spec.rb#L367)
759
+ * [is false and the presence channel will subsequently be synced](./spec/acceptance/realtime/presence_spec.rb#L497)
573
760
  * 250 existing (present) members on a channel (3 SYNC pages)
574
761
  * requires at least 3 SYNC ProtocolMessages
575
762
  * when a client attaches to the presence channel
576
- * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L399)
763
+ * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L533)
577
764
  * and a member leaves before the SYNC operation is complete
578
- * [emits :leave immediately as the member leaves](./spec/acceptance/realtime/presence_spec.rb#L413)
579
- * [ignores presence events with timestamps prior to the current :present event in the MembersMap](./spec/acceptance/realtime/presence_spec.rb#L451)
580
- * [does not emit :present after the :leave event has been emitted, and that member is not included in the list of members via #get with :wait_for_sync](./spec/acceptance/realtime/presence_spec.rb#L490)
765
+ * [emits :leave immediately as the member leaves](./spec/acceptance/realtime/presence_spec.rb#L547)
766
+ * [ignores presence events with timestamps prior to the current :present event in the MembersMap](./spec/acceptance/realtime/presence_spec.rb#L588)
767
+ * [does not emit :present after the :leave event has been emitted, and that member is not included in the list of members via #get with :wait_for_sync](./spec/acceptance/realtime/presence_spec.rb#L630)
581
768
  * #get
582
769
  * with :wait_for_sync option set to true
583
- * [waits until sync is complete](./spec/acceptance/realtime/presence_spec.rb#L537)
770
+ * [waits until sync is complete](./spec/acceptance/realtime/presence_spec.rb#L680)
584
771
  * by default
585
- * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L554)
772
+ * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L699)
586
773
  * state
587
774
  * once opened
588
- * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L578)
775
+ * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L725)
589
776
  * #enter
590
- * [allows client_id to be set on enter for anonymous clients](./spec/acceptance/realtime/presence_spec.rb#L601)
591
- * [raises an exception if client_id is not set](./spec/acceptance/realtime/presence_spec.rb#L648)
592
777
  * data attribute
593
778
  * when provided as argument option to #enter
594
- * [remains intact following #leave](./spec/acceptance/realtime/presence_spec.rb#L612)
779
+ * [changes to value provided in #leave](./spec/acceptance/realtime/presence_spec.rb#L750)
595
780
  * message #connection_id
596
- * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L636)
781
+ * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L774)
597
782
  * without necessary capabilities to join presence
598
- * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L660)
783
+ * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L793)
599
784
  * it should behave like a public presence method
600
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L44)
601
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L44)
602
- * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L55)
603
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
604
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
605
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
606
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
785
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54)
786
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66)
787
+ * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77)
788
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
789
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
790
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
791
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
607
792
  * when :queue_messages client option is false
608
793
  * and connection state initialized
609
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L67)
794
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L89)
610
795
  * and connection state connecting
611
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L75)
796
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L97)
612
797
  * and connection state disconnected
613
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L88)
798
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L110)
614
799
  * and connection state connected
615
- * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L101)
800
+ * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L123)
616
801
  * with supported data payload content type
617
802
  * JSON Object (Hash)
618
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
803
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
619
804
  * JSON Array
620
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
805
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
621
806
  * String
622
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
807
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
623
808
  * Binary
624
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
809
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
625
810
  * with unsupported data payload content type
626
811
  * Integer
627
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
812
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
628
813
  * Float
629
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
814
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
630
815
  * Boolean
631
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
816
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
632
817
  * False
633
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
818
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
634
819
  * if connection fails before success
635
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
820
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
636
821
  * #update
637
- * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L672)
638
- * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L697)
639
- * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L707)
822
+ * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L805)
823
+ * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L830)
824
+ * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L840)
640
825
  * when ENTERED
641
- * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L682)
826
+ * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L815)
642
827
  * it should behave like a public presence method
643
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L44)
644
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L44)
645
- * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L55)
646
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
647
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
648
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
649
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
828
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54)
829
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66)
830
+ * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77)
831
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
832
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
833
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
834
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
650
835
  * when :queue_messages client option is false
651
836
  * and connection state initialized
652
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L67)
837
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L89)
653
838
  * and connection state connecting
654
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L75)
839
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L97)
655
840
  * and connection state disconnected
656
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L88)
841
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L110)
657
842
  * and connection state connected
658
- * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L101)
843
+ * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L123)
659
844
  * with supported data payload content type
660
845
  * JSON Object (Hash)
661
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
846
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
662
847
  * JSON Array
663
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
848
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
664
849
  * String
665
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
850
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
666
851
  * Binary
667
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
852
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
668
853
  * with unsupported data payload content type
669
854
  * Integer
670
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
855
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
671
856
  * Float
672
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
857
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
673
858
  * Boolean
674
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
859
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
675
860
  * False
676
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
861
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
677
862
  * if connection fails before success
678
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
863
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
679
864
  * #leave
680
- * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L781)
865
+ * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L914)
681
866
  * :data option
682
867
  * when set to a string
683
- * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L726)
868
+ * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L859)
684
869
  * when set to nil
685
- * [emits a nil value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L739)
686
- * when not passed as an argument
687
- * [emits the previously defined value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L752)
870
+ * [emits the last value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L872)
871
+ * when not passed as an argument (i.e. nil)
872
+ * [emits the previous value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L885)
688
873
  * and sync is complete
689
- * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L765)
874
+ * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L898)
690
875
  * it should behave like a public presence method
691
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
692
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
693
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
694
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
876
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
877
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
878
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
879
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
695
880
  * with supported data payload content type
696
881
  * JSON Object (Hash)
697
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
882
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
698
883
  * JSON Array
699
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
884
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
700
885
  * String
701
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
886
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
702
887
  * Binary
703
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
888
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
704
889
  * with unsupported data payload content type
705
890
  * Integer
706
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
891
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
707
892
  * Float
708
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
893
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
709
894
  * Boolean
710
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
895
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
711
896
  * False
712
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
897
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
713
898
  * if connection fails before success
714
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
899
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
715
900
  * :left event
716
- * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L790)
717
- * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L801)
901
+ * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L923)
902
+ * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L934)
718
903
  * entering/updating/leaving presence state on behalf of another client_id
719
904
  * #enter_client
720
905
  * multiple times on the same channel with different client_ids
721
- * [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#L822)
722
- * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L836)
906
+ * [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#L957)
907
+ * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L971)
723
908
  * message #connection_id
724
- * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L855)
909
+ * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L990)
910
+ * without necessary capabilities to enter on behalf of another client
911
+ * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1010)
725
912
  * it should behave like a public presence method
726
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L44)
727
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L44)
728
- * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L55)
729
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
730
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
731
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
732
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
913
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54)
914
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66)
915
+ * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77)
916
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
917
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
918
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
919
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
733
920
  * when :queue_messages client option is false
734
921
  * and connection state initialized
735
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L67)
922
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L89)
736
923
  * and connection state connecting
737
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L75)
924
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L97)
738
925
  * and connection state disconnected
739
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L88)
926
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L110)
740
927
  * and connection state connected
741
- * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L101)
928
+ * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L123)
742
929
  * with supported data payload content type
743
930
  * JSON Object (Hash)
744
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
931
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
745
932
  * JSON Array
746
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
933
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
747
934
  * String
748
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
935
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
749
936
  * Binary
750
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
937
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
751
938
  * with unsupported data payload content type
752
939
  * Integer
753
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
940
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
754
941
  * Float
755
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
942
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
756
943
  * Boolean
757
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
944
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
758
945
  * False
759
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
946
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
760
947
  * if connection fails before success
761
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
762
- * without necessary capabilities to enter on behalf of another client
763
- * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L877)
948
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
949
+ * it should behave like a presence on behalf of another client method
950
+ * :enter_client when authenticated with a wildcard client_id
951
+ * and a valid client_id
952
+ * [succeeds](./spec/acceptance/realtime/presence_spec.rb#L302)
953
+ * and a wildcard client_id
954
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L312)
955
+ * and an empty client_id
956
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L319)
957
+ * :enter_client when authenticated with a valid client_id
958
+ * and another invalid client_id
959
+ * before authentication
960
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L335)
961
+ * after authentication
962
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L344)
963
+ * and a wildcard client_id
964
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L354)
965
+ * and an empty client_id
966
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L361)
967
+ * :enter_client when anonymous and no client_id
968
+ * and another invalid client_id
969
+ * before authentication
970
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L377)
971
+ * after authentication
972
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L386)
973
+ * and a wildcard client_id
974
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L396)
975
+ * and an empty client_id
976
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403)
764
977
  * #update_client
765
978
  * multiple times on the same channel with different client_ids
766
- * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L888)
767
- * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L912)
768
- * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L924)
979
+ * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L1024)
980
+ * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L1048)
981
+ * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L1060)
769
982
  * it should behave like a public presence method
770
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L44)
771
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L44)
772
- * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L55)
773
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
774
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
775
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
776
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
983
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54)
984
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66)
985
+ * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77)
986
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
987
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
988
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
989
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
777
990
  * when :queue_messages client option is false
778
991
  * and connection state initialized
779
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L67)
992
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L89)
780
993
  * and connection state connecting
781
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L75)
994
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L97)
782
995
  * and connection state disconnected
783
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L88)
996
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L110)
784
997
  * and connection state connected
785
- * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L101)
998
+ * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L123)
786
999
  * with supported data payload content type
787
1000
  * JSON Object (Hash)
788
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
1001
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
789
1002
  * JSON Array
790
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
1003
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
791
1004
  * String
792
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
1005
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
793
1006
  * Binary
794
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
1007
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
795
1008
  * with unsupported data payload content type
796
1009
  * Integer
797
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
1010
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
798
1011
  * Float
799
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
1012
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
800
1013
  * Boolean
801
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
1014
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
802
1015
  * False
803
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
1016
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
804
1017
  * if connection fails before success
805
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
1018
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
1019
+ * it should behave like a presence on behalf of another client method
1020
+ * :update_client when authenticated with a wildcard client_id
1021
+ * and a valid client_id
1022
+ * [succeeds](./spec/acceptance/realtime/presence_spec.rb#L302)
1023
+ * and a wildcard client_id
1024
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L312)
1025
+ * and an empty client_id
1026
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L319)
1027
+ * :update_client when authenticated with a valid client_id
1028
+ * and another invalid client_id
1029
+ * before authentication
1030
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L335)
1031
+ * after authentication
1032
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L344)
1033
+ * and a wildcard client_id
1034
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L354)
1035
+ * and an empty client_id
1036
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L361)
1037
+ * :update_client when anonymous and no client_id
1038
+ * and another invalid client_id
1039
+ * before authentication
1040
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L377)
1041
+ * after authentication
1042
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L386)
1043
+ * and a wildcard client_id
1044
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L396)
1045
+ * and an empty client_id
1046
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403)
806
1047
  * #leave_client
807
1048
  * leaves a channel
808
1049
  * multiple times on the same channel with different client_ids
809
- * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L953)
810
- * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L977)
1050
+ * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L1090)
1051
+ * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L1114)
811
1052
  * with a new value in :data option
812
- * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1001)
1053
+ * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1138)
813
1054
  * with a nil value in :data option
814
- * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1014)
1055
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1151)
815
1056
  * with no :data option
816
- * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1027)
1057
+ * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1164)
817
1058
  * it should behave like a public presence method
818
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L44)
819
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L44)
820
- * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L55)
821
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L212)
822
- * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L219)
823
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L227)
824
- * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L237)
1059
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54)
1060
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66)
1061
+ * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77)
1062
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234)
1063
+ * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241)
1064
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249)
1065
+ * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259)
825
1066
  * when :queue_messages client option is false
826
1067
  * and connection state initialized
827
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L67)
1068
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L89)
828
1069
  * and connection state connecting
829
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L75)
1070
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L97)
830
1071
  * and connection state disconnected
831
- * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L88)
1072
+ * [raises an exception](./spec/acceptance/realtime/presence_spec.rb#L110)
832
1073
  * and connection state connected
833
- * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L101)
1074
+ * [publishes the message](./spec/acceptance/realtime/presence_spec.rb#L123)
834
1075
  * with supported data payload content type
835
1076
  * JSON Object (Hash)
836
- * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L128)
1077
+ * [is encoded and decoded to the same hash](./spec/acceptance/realtime/presence_spec.rb#L150)
837
1078
  * JSON Array
838
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L138)
1079
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L160)
839
1080
  * String
840
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L148)
1081
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L170)
841
1082
  * Binary
842
- * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L158)
1083
+ * [is encoded and decoded to the same Array](./spec/acceptance/realtime/presence_spec.rb#L180)
843
1084
  * with unsupported data payload content type
844
1085
  * Integer
845
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L178)
1086
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L200)
846
1087
  * Float
847
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L187)
1088
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L209)
848
1089
  * Boolean
849
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L196)
1090
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L218)
850
1091
  * False
851
- * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L205)
1092
+ * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227)
852
1093
  * if connection fails before success
853
- * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L258)
1094
+ * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271)
1095
+ * it should behave like a presence on behalf of another client method
1096
+ * :leave_client when authenticated with a wildcard client_id
1097
+ * and a valid client_id
1098
+ * [succeeds](./spec/acceptance/realtime/presence_spec.rb#L302)
1099
+ * and a wildcard client_id
1100
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L312)
1101
+ * and an empty client_id
1102
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L319)
1103
+ * :leave_client when authenticated with a valid client_id
1104
+ * and another invalid client_id
1105
+ * before authentication
1106
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L335)
1107
+ * after authentication
1108
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L344)
1109
+ * and a wildcard client_id
1110
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L354)
1111
+ * and an empty client_id
1112
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L361)
1113
+ * :leave_client when anonymous and no client_id
1114
+ * and another invalid client_id
1115
+ * before authentication
1116
+ * [allows the operation and then Ably rejects the operation](./spec/acceptance/realtime/presence_spec.rb#L377)
1117
+ * after authentication
1118
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L386)
1119
+ * and a wildcard client_id
1120
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L396)
1121
+ * and an empty client_id
1122
+ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403)
854
1123
  * #get
855
- * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1045)
856
- * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1050)
857
- * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1057)
858
- * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1065)
859
- * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L1065)
860
- * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L1142)
861
- * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1157)
862
- * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1179)
863
- * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L1203)
1124
+ * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1183)
1125
+ * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1188)
1126
+ * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1195)
1127
+ * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1202)
1128
+ * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L1212)
1129
+ * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L1292)
1130
+ * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1307)
1131
+ * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1329)
1132
+ * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L1353)
864
1133
  * during a sync
865
1134
  * when :wait_for_sync is true
866
- * [fails if the connection fails](./spec/acceptance/realtime/presence_spec.rb#L1096)
867
- * [fails if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1116)
1135
+ * [fails if the connection fails](./spec/acceptance/realtime/presence_spec.rb#L1243)
1136
+ * [fails if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1266)
868
1137
  * when a member enters and then leaves
869
- * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1213)
1138
+ * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1363)
870
1139
  * with lots of members on different clients
871
- * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1230)
1140
+ * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1382)
872
1141
  * #subscribe
873
- * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1305)
1142
+ * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1457)
874
1143
  * with no arguments
875
- * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1266)
1144
+ * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1418)
876
1145
  * with event name
877
- * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1286)
1146
+ * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1438)
878
1147
  * #unsubscribe
879
1148
  * with no arguments
880
- * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1318)
1149
+ * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1470)
881
1150
  * with event name
882
- * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1336)
1151
+ * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1488)
883
1152
  * REST #get
884
- * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1355)
885
- * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1368)
1153
+ * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1507)
1154
+ * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1520)
886
1155
  * client_id with ASCII_8BIT
887
1156
  * in connection set up
888
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1385)
1157
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1537)
889
1158
  * in channel options
890
- * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1398)
1159
+ * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1550)
891
1160
  * encoding and decoding of presence message data
892
- * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1422)
1161
+ * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1576)
893
1162
  * #subscribe
894
- * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L1441)
895
- * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L1453)
896
- * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L1467)
1163
+ * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L1595)
1164
+ * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L1607)
1165
+ * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L1621)
897
1166
  * #get
898
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1483)
1167
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1637)
899
1168
  * REST #get
900
- * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1496)
1169
+ * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1650)
901
1170
  * when cipher settings do not match publisher
902
- * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L1511)
903
- * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L1524)
1171
+ * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L1665)
1172
+ * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L1678)
904
1173
  * leaving
905
- * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L1541)
906
- * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L1551)
1174
+ * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L1695)
1175
+ * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L1705)
907
1176
  * connection failure mid-way through a large member sync
908
- * [resumes the SYNC operation](./spec/acceptance/realtime/presence_spec.rb#L1569)
1177
+ * [resumes the SYNC operation](./spec/acceptance/realtime/presence_spec.rb#L1724)
909
1178
 
910
1179
  ### Ably::Realtime::Client#stats
911
1180
  _(see [spec/acceptance/realtime/stats_spec.rb](./spec/acceptance/realtime/stats_spec.rb))_
912
- * using JSON and MsgPack protocol
1181
+ * using JSON protocol
913
1182
  * fetching stats
914
1183
  * [returns a PaginatedResult](./spec/acceptance/realtime/stats_spec.rb#L10)
915
1184
  * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/stats_spec.rb#L29)
@@ -918,14 +1187,16 @@ _(see [spec/acceptance/realtime/stats_spec.rb](./spec/acceptance/realtime/stats_
918
1187
 
919
1188
  ### Ably::Realtime::Client#time
920
1189
  _(see [spec/acceptance/realtime/time_spec.rb](./spec/acceptance/realtime/time_spec.rb))_
921
- * using JSON and MsgPack protocol
1190
+ * using JSON protocol
922
1191
  * fetching the service time
923
1192
  * [should return the service time as a Time object](./spec/acceptance/realtime/time_spec.rb#L10)
924
1193
  * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/time_spec.rb#L19)
1194
+ * with reconfigured HTTP timeout
1195
+ * [should raise a timeout exception](./spec/acceptance/realtime/time_spec.rb#L31)
925
1196
 
926
1197
  ### Ably::Auth
927
1198
  _(see [spec/acceptance/rest/auth_spec.rb](./spec/acceptance/rest/auth_spec.rb))_
928
- * using JSON and MsgPack protocol
1199
+ * using JSON protocol
929
1200
  * [has immutable options](./spec/acceptance/rest/auth_spec.rb#L60)
930
1201
  * #request_token
931
1202
  * [creates a TokenRequest automatically and sends it to Ably to obtain a token](./spec/acceptance/rest/auth_spec.rb#L75)
@@ -948,110 +1219,158 @@ _(see [spec/acceptance/rest/auth_spec.rb](./spec/acceptance/rest/auth_spec.rb))_
948
1219
  * [queries the server for the time](./spec/acceptance/rest/auth_spec.rb#L185)
949
1220
  * without :query_time option
950
1221
  * [does not query the server for the time](./spec/acceptance/rest/auth_spec.rb#L194)
1222
+ * with :auth_url option merging
1223
+ * with existing configured auth options
1224
+ * using unspecified :auth_method
1225
+ * [requests a token using a GET request with provided headers, and merges client_id into auth_params](./spec/acceptance/rest/auth_spec.rb#L234)
1226
+ * with provided token_params
1227
+ * [merges provided token_params with existing auth_params and client_id](./spec/acceptance/rest/auth_spec.rb#L242)
1228
+ * with provided auth option auth_params and auth_headers
1229
+ * [replaces any preconfigured auth_params](./spec/acceptance/rest/auth_spec.rb#L250)
1230
+ * using :get :auth_method and query params in the URL
1231
+ * [requests a token using a GET request with provided headers, and merges client_id into auth_params and existing URL querystring into new URL querystring](./spec/acceptance/rest/auth_spec.rb#L261)
1232
+ * using :post :auth_method
1233
+ * [requests a token using a POST request with provided headers, and merges client_id into auth_params as form-encoded post data](./spec/acceptance/rest/auth_spec.rb#L271)
951
1234
  * with :auth_url option
952
1235
  * when response from :auth_url is a valid token request
953
- * [requests a token from :auth_url using an HTTP GET request](./spec/acceptance/rest/auth_spec.rb#L242)
954
- * [returns a valid token generated from the token request](./spec/acceptance/rest/auth_spec.rb#L247)
1236
+ * [requests a token from :auth_url using an HTTP GET request](./spec/acceptance/rest/auth_spec.rb#L321)
1237
+ * [returns a valid token generated from the token request](./spec/acceptance/rest/auth_spec.rb#L326)
955
1238
  * with :query_params
956
- * [requests a token from :auth_url with the :query_params](./spec/acceptance/rest/auth_spec.rb#L254)
1239
+ * [requests a token from :auth_url with the :query_params](./spec/acceptance/rest/auth_spec.rb#L333)
957
1240
  * with :headers
958
- * [requests a token from :auth_url with the HTTP headers set](./spec/acceptance/rest/auth_spec.rb#L262)
1241
+ * [requests a token from :auth_url with the HTTP headers set](./spec/acceptance/rest/auth_spec.rb#L341)
959
1242
  * with POST
960
- * [requests a token from :auth_url using an HTTP POST instead of the default GET](./spec/acceptance/rest/auth_spec.rb#L270)
1243
+ * [requests a token from :auth_url using an HTTP POST instead of the default GET](./spec/acceptance/rest/auth_spec.rb#L349)
961
1244
  * when response from :auth_url is a token details object
962
- * [returns TokenDetails created from the token JSON](./spec/acceptance/rest/auth_spec.rb#L295)
1245
+ * [returns TokenDetails created from the token JSON](./spec/acceptance/rest/auth_spec.rb#L374)
963
1246
  * when response from :auth_url is text/plain content type and a token string
964
- * [returns TokenDetails created from the token JSON](./spec/acceptance/rest/auth_spec.rb#L313)
1247
+ * [returns TokenDetails created from the token JSON](./spec/acceptance/rest/auth_spec.rb#L392)
965
1248
  * when response is invalid
966
1249
  * 500
967
- * [raises ServerError](./spec/acceptance/rest/auth_spec.rb#L327)
1250
+ * [raises ServerError](./spec/acceptance/rest/auth_spec.rb#L406)
968
1251
  * XML
969
- * [raises InvalidResponseBody](./spec/acceptance/rest/auth_spec.rb#L338)
1252
+ * [raises InvalidResponseBody](./spec/acceptance/rest/auth_spec.rb#L417)
970
1253
  * with a Proc for the :auth_callback option
971
1254
  * that returns a TokenRequest
972
- * [calls the Proc with token_params when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L361)
973
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L365)
1255
+ * [calls the Proc with token_params when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L440)
1256
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L444)
1257
+ * when authorised
1258
+ * [sets Auth#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L451)
1259
+ * [sets Client#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L455)
974
1260
  * that returns a TokenDetails JSON object
975
- * [calls the Proc when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L394)
976
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L399)
1261
+ * [calls the Proc when authenticating to obtain the request token](./spec/acceptance/rest/auth_spec.rb#L489)
1262
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L494)
1263
+ * when authorised
1264
+ * [sets Auth#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L506)
1265
+ * [sets Client#client_id to the new token's client_id](./spec/acceptance/rest/auth_spec.rb#L510)
977
1266
  * that returns a TokenDetails object
978
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L420)
1267
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L525)
979
1268
  * that returns a Token string
980
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L436)
1269
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L541)
981
1270
  * with auth_option :client_id
982
- * [returns a token with the client_id](./spec/acceptance/rest/auth_spec.rb#L467)
1271
+ * [returns a token with the client_id](./spec/acceptance/rest/auth_spec.rb#L571)
983
1272
  * with token_param :client_id
984
- * [returns a token with the client_id](./spec/acceptance/rest/auth_spec.rb#L476)
1273
+ * [returns a token with the client_id](./spec/acceptance/rest/auth_spec.rb#L580)
985
1274
  * before #authorise has been called
986
- * [has no current_token_details](./spec/acceptance/rest/auth_spec.rb#L483)
1275
+ * [has no current_token_details](./spec/acceptance/rest/auth_spec.rb#L587)
987
1276
  * #authorise
988
- * [updates the persisted auth options that are then used for subsequent authorise requests](./spec/acceptance/rest/auth_spec.rb#L533)
1277
+ * [updates the persisted token params that are then used for subsequent authorise requests](./spec/acceptance/rest/auth_spec.rb#L637)
1278
+ * [updates the persisted token params that are then used for subsequent authorise requests](./spec/acceptance/rest/auth_spec.rb#L643)
989
1279
  * when called for the first time since the client has been instantiated
990
- * [passes all auth_options and token_params to #request_token](./spec/acceptance/rest/auth_spec.rb#L497)
991
- * [returns a valid token](./spec/acceptance/rest/auth_spec.rb#L502)
992
- * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L506)
1280
+ * [passes all auth_options and token_params to #request_token](./spec/acceptance/rest/auth_spec.rb#L601)
1281
+ * [returns a valid token](./spec/acceptance/rest/auth_spec.rb#L606)
1282
+ * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L610)
993
1283
  * with previous authorisation
994
- * [does not request a token if current_token_details has not expired](./spec/acceptance/rest/auth_spec.rb#L517)
995
- * [requests a new token if token is expired](./spec/acceptance/rest/auth_spec.rb#L522)
996
- * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L528)
1284
+ * [does not request a token if current_token_details has not expired](./spec/acceptance/rest/auth_spec.rb#L621)
1285
+ * [requests a new token if token is expired](./spec/acceptance/rest/auth_spec.rb#L626)
1286
+ * [issues a new token if option :force => true](./spec/acceptance/rest/auth_spec.rb#L632)
997
1287
  * with a Proc for the :auth_callback option
998
- * [calls the Proc](./spec/acceptance/rest/auth_spec.rb#L549)
999
- * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L553)
1288
+ * [calls the Proc](./spec/acceptance/rest/auth_spec.rb#L659)
1289
+ * [uses the token request returned from the callback when requesting a new token](./spec/acceptance/rest/auth_spec.rb#L663)
1000
1290
  * for every subsequent #request_token
1001
1291
  * without a :auth_callback Proc
1002
- * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L559)
1292
+ * [calls the originally provided block](./spec/acceptance/rest/auth_spec.rb#L669)
1003
1293
  * with a provided block
1004
- * [does not call the originally provided Proc and calls the new #request_token :auth_callback Proc](./spec/acceptance/rest/auth_spec.rb#L566)
1294
+ * [does not call the originally provided Proc and calls the new #request_token :auth_callback Proc](./spec/acceptance/rest/auth_spec.rb#L676)
1295
+ * with an explicit token string that expires
1296
+ * and a Proc for the :auth_callback option to provide a means to renew the token
1297
+ * [calls the Proc once the token has expired and the new token is used](./spec/acceptance/rest/auth_spec.rb#L703)
1298
+ * with an explicit ClientOptions client_id
1299
+ * and an incompatible client_id in a TokenDetails object passed to the auth callback
1300
+ * [rejects a TokenDetails object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L721)
1301
+ * and an incompatible client_id in a TokenRequest object passed to the auth callback and raises an exception
1302
+ * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L729)
1303
+ * and a token string without any retrievable client_id
1304
+ * [rejects a TokenRequests object with an incompatible client_id and raises an exception](./spec/acceptance/rest/auth_spec.rb#L737)
1005
1305
  * #create_token_request
1006
- * [returns a TokenRequest object](./spec/acceptance/rest/auth_spec.rb#L583)
1007
- * [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#L587)
1008
- * [uses the key name from the client](./spec/acceptance/rest/auth_spec.rb#L594)
1009
- * [uses the default TTL](./spec/acceptance/rest/auth_spec.rb#L598)
1010
- * [uses the default capability](./spec/acceptance/rest/auth_spec.rb#L611)
1306
+ * [returns a TokenRequest object](./spec/acceptance/rest/auth_spec.rb#L752)
1307
+ * [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#L756)
1308
+ * [uses the key name from the client](./spec/acceptance/rest/auth_spec.rb#L763)
1309
+ * [uses the default TTL](./spec/acceptance/rest/auth_spec.rb#L767)
1310
+ * [uses the default capability](./spec/acceptance/rest/auth_spec.rb#L780)
1011
1311
  * with a :ttl option below the Token expiry buffer that ensures tokens are renewed 15s before they expire as they are considered expired
1012
- * [uses the Token expiry buffer default + 10s to allow for a token request in flight](./spec/acceptance/rest/auth_spec.rb#L605)
1312
+ * [uses the Token expiry buffer default + 10s to allow for a token request in flight](./spec/acceptance/rest/auth_spec.rb#L774)
1013
1313
  * the nonce
1014
- * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L616)
1015
- * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L621)
1314
+ * [is unique for every request](./spec/acceptance/rest/auth_spec.rb#L785)
1315
+ * [is at least 16 characters](./spec/acceptance/rest/auth_spec.rb#L790)
1016
1316
  * with token param :ttl
1017
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L632)
1317
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L801)
1018
1318
  * with token param :nonce
1019
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L632)
1319
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L801)
1020
1320
  * with token param :client_id
1021
- * [overrides default](./spec/acceptance/rest/auth_spec.rb#L632)
1321
+ * [overrides default](./spec/acceptance/rest/auth_spec.rb#L801)
1022
1322
  * when specifying capability
1023
- * [overrides the default](./spec/acceptance/rest/auth_spec.rb#L643)
1024
- * [uses these capabilities when Ably issues an actual token](./spec/acceptance/rest/auth_spec.rb#L647)
1323
+ * [overrides the default](./spec/acceptance/rest/auth_spec.rb#L812)
1324
+ * [uses these capabilities when Ably issues an actual token](./spec/acceptance/rest/auth_spec.rb#L816)
1025
1325
  * with additional invalid attributes
1026
- * [are ignored](./spec/acceptance/rest/auth_spec.rb#L657)
1326
+ * [are ignored](./spec/acceptance/rest/auth_spec.rb#L826)
1027
1327
  * when required fields are missing
1028
- * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L668)
1029
- * [should raise an exception if key name is missing](./spec/acceptance/rest/auth_spec.rb#L672)
1328
+ * [should raise an exception if key secret is missing](./spec/acceptance/rest/auth_spec.rb#L837)
1329
+ * [should raise an exception if key name is missing](./spec/acceptance/rest/auth_spec.rb#L841)
1030
1330
  * timestamp attribute
1031
- * [is a Time object in Ruby and is set to the local time](./spec/acceptance/rest/auth_spec.rb#L699)
1331
+ * [is a Time object in Ruby and is set to the local time](./spec/acceptance/rest/auth_spec.rb#L868)
1032
1332
  * with :query_time auth_option
1033
- * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L684)
1333
+ * [queries the server for the timestamp](./spec/acceptance/rest/auth_spec.rb#L853)
1034
1334
  * with :timestamp option
1035
- * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L694)
1335
+ * [uses the provided timestamp in the token request](./spec/acceptance/rest/auth_spec.rb#L863)
1036
1336
  * signing
1037
- * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L723)
1337
+ * [generates a valid HMAC](./spec/acceptance/rest/auth_spec.rb#L892)
1038
1338
  * using token authentication
1039
1339
  * with :token option
1040
- * [authenticates successfully using the provided :token](./spec/acceptance/rest/auth_spec.rb#L746)
1041
- * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L750)
1042
- * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L758)
1043
- * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L766)
1044
- * when implicit as a result of using :client id
1340
+ * [authenticates successfully using the provided :token](./spec/acceptance/rest/auth_spec.rb#L915)
1341
+ * [disallows publishing on unspecified capability channels](./spec/acceptance/rest/auth_spec.rb#L919)
1342
+ * [fails if timestamp is invalid](./spec/acceptance/rest/auth_spec.rb#L927)
1343
+ * [cannot be renewed automatically](./spec/acceptance/rest/auth_spec.rb#L935)
1344
+ * when implicit as a result of using :client_id
1045
1345
  * and requests to the Ably server are mocked
1046
- * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L794)
1346
+ * [will send a token request to the server](./spec/acceptance/rest/auth_spec.rb#L963)
1047
1347
  * a token is created
1048
- * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L803)
1049
- * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L807)
1050
- * [with capability and TTL defaults](./spec/acceptance/rest/auth_spec.rb#L811)
1051
- * when using an :key and basic auth
1052
- * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L826)
1053
- * [#key attribute contains the key string](./spec/acceptance/rest/auth_spec.rb#L830)
1054
- * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L834)
1348
+ * [before a request is made](./spec/acceptance/rest/auth_spec.rb#L972)
1349
+ * [when a message is published](./spec/acceptance/rest/auth_spec.rb#L976)
1350
+ * [with capability and TTL defaults](./spec/acceptance/rest/auth_spec.rb#L980)
1351
+ * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L991)
1352
+ * when :client_id is provided in a token
1353
+ * [#client_id contains the client_id](./spec/acceptance/rest/auth_spec.rb#L1006)
1354
+ * #client_id_validated?
1355
+ * when using basic auth
1356
+ * [is false as basic auth users do not have an identity](./spec/acceptance/rest/auth_spec.rb#L1018)
1357
+ * when using a token auth string for a token with a client_id
1358
+ * [is false as identification is not possible from an opaque token string](./spec/acceptance/rest/auth_spec.rb#L1026)
1359
+ * when using a token
1360
+ * with a client_id
1361
+ * [is true](./spec/acceptance/rest/auth_spec.rb#L1035)
1362
+ * with no client_id (anonymous)
1363
+ * [is true](./spec/acceptance/rest/auth_spec.rb#L1043)
1364
+ * with a wildcard client_id (anonymous)
1365
+ * [is false](./spec/acceptance/rest/auth_spec.rb#L1051)
1366
+ * when using a token request with a client_id
1367
+ * [is not true as identification is not confirmed until authenticated](./spec/acceptance/rest/auth_spec.rb#L1060)
1368
+ * after authentication
1369
+ * [is true as identification is completed during implicit authentication](./spec/acceptance/rest/auth_spec.rb#L1067)
1370
+ * when using a :key and basic auth
1371
+ * [#using_token_auth? is false](./spec/acceptance/rest/auth_spec.rb#L1075)
1372
+ * [#key attribute contains the key string](./spec/acceptance/rest/auth_spec.rb#L1079)
1373
+ * [#using_basic_auth? is true](./spec/acceptance/rest/auth_spec.rb#L1083)
1055
1374
 
1056
1375
  ### Ably::Rest
1057
1376
  _(see [spec/acceptance/rest/base_spec.rb](./spec/acceptance/rest/base_spec.rb))_
@@ -1066,7 +1385,7 @@ _(see [spec/acceptance/rest/base_spec.rb](./spec/acceptance/rest/base_spec.rb))_
1066
1385
  * [uses MsgPack](./spec/acceptance/rest/base_spec.rb#L60)
1067
1386
  * when option {:use_binary_protocol=>true} is used
1068
1387
  * [uses MsgPack](./spec/acceptance/rest/base_spec.rb#L60)
1069
- * using JSON and MsgPack protocol
1388
+ * using JSON protocol
1070
1389
  * failed requests
1071
1390
  * due to invalid Auth
1072
1391
  * [should raise an InvalidRequest exception with a valid error message and code](./spec/acceptance/rest/base_spec.rb#L75)
@@ -1082,55 +1401,92 @@ _(see [spec/acceptance/rest/base_spec.rb](./spec/acceptance/rest/base_spec.rb))_
1082
1401
 
1083
1402
  ### Ably::Rest::Channel
1084
1403
  _(see [spec/acceptance/rest/channel_spec.rb](./spec/acceptance/rest/channel_spec.rb))_
1085
- * using JSON and MsgPack protocol
1404
+ * using JSON protocol
1086
1405
  * #publish
1087
1406
  * with name and data arguments
1088
- * [publishes the message and return true indicating success](./spec/acceptance/rest/channel_spec.rb#L20)
1407
+ * [publishes the message and return true indicating success](./spec/acceptance/rest/channel_spec.rb#L21)
1408
+ * and additional attributes
1409
+ * [publishes the message with the attributes and return true indicating success](./spec/acceptance/rest/channel_spec.rb#L30)
1410
+ * with a client_id configured in the ClientOptions
1411
+ * [publishes the message without a client_id](./spec/acceptance/rest/channel_spec.rb#L41)
1412
+ * [expects a client_id to be added by the realtime service](./spec/acceptance/rest/channel_spec.rb#L49)
1089
1413
  * with an array of Hash objects with :name and :data attributes
1090
- * [publishes an array of messages in one HTTP request](./spec/acceptance/rest/channel_spec.rb#L34)
1414
+ * [publishes an array of messages in one HTTP request](./spec/acceptance/rest/channel_spec.rb#L62)
1091
1415
  * with an array of Message objects
1092
- * [publishes an array of messages in one HTTP request](./spec/acceptance/rest/channel_spec.rb#L49)
1416
+ * [publishes an array of messages in one HTTP request](./spec/acceptance/rest/channel_spec.rb#L77)
1093
1417
  * without adequate permissions on the channel
1094
- * [raises a permission error when publishing](./spec/acceptance/rest/channel_spec.rb#L61)
1418
+ * [raises a permission error when publishing](./spec/acceptance/rest/channel_spec.rb#L89)
1095
1419
  * null attributes
1096
1420
  * when name is null
1097
- * [publishes the message without a name attribute in the payload](./spec/acceptance/rest/channel_spec.rb#L70)
1421
+ * [publishes the message without a name attribute in the payload](./spec/acceptance/rest/channel_spec.rb#L98)
1098
1422
  * when data is null
1099
- * [publishes the message without a data attribute in the payload](./spec/acceptance/rest/channel_spec.rb#L81)
1423
+ * [publishes the message without a data attribute in the payload](./spec/acceptance/rest/channel_spec.rb#L109)
1100
1424
  * with neither name or data attributes
1101
- * [publishes the message without any attributes in the payload](./spec/acceptance/rest/channel_spec.rb#L92)
1425
+ * [publishes the message without any attributes in the payload](./spec/acceptance/rest/channel_spec.rb#L120)
1426
+ * identified clients
1427
+ * when authenticated with a wildcard client_id
1428
+ * with a valid client_id in the message
1429
+ * [succeeds](./spec/acceptance/rest/channel_spec.rb#L137)
1430
+ * with a wildcard client_id in the message
1431
+ * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L146)
1432
+ * with an empty client_id in the message
1433
+ * [succeeds and publishes without a client_id](./spec/acceptance/rest/channel_spec.rb#L152)
1434
+ * when authenticated with a Token string with an implicit client_id
1435
+ * without having a confirmed identity
1436
+ * with a valid client_id in the message
1437
+ * [succeeds](./spec/acceptance/rest/channel_spec.rb#L169)
1438
+ * with an invalid client_id in the message
1439
+ * [succeeds in the client library but then fails when published to Ably](./spec/acceptance/rest/channel_spec.rb#L178)
1440
+ * with an empty client_id in the message
1441
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/rest/channel_spec.rb#L184)
1442
+ * when authenticated with TokenDetails with a valid client_id
1443
+ * with a valid client_id in the message
1444
+ * [succeeds](./spec/acceptance/rest/channel_spec.rb#L201)
1445
+ * with a wildcard client_id in the message
1446
+ * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L210)
1447
+ * with an invalid client_id in the message
1448
+ * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L216)
1449
+ * with an empty client_id in the message
1450
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/rest/channel_spec.rb#L222)
1451
+ * when anonymous and no client_id
1452
+ * with a client_id in the message
1453
+ * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L238)
1454
+ * with a wildcard client_id in the message
1455
+ * [throws an exception](./spec/acceptance/rest/channel_spec.rb#L244)
1456
+ * with an empty client_id in the message
1457
+ * [succeeds and publishes with an implicit client_id](./spec/acceptance/rest/channel_spec.rb#L250)
1102
1458
  * #history
1103
- * [returns a PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L119)
1104
- * [returns the current message history for the channel](./spec/acceptance/rest/channel_spec.rb#L123)
1105
- * [returns paged history using the PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L151)
1459
+ * [returns a PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L278)
1460
+ * [returns the current message history for the channel](./spec/acceptance/rest/channel_spec.rb#L282)
1461
+ * [returns paged history using the PaginatedResult model](./spec/acceptance/rest/channel_spec.rb#L310)
1106
1462
  * message timestamps
1107
- * [are after the messages were published](./spec/acceptance/rest/channel_spec.rb#L136)
1463
+ * [are after the messages were published](./spec/acceptance/rest/channel_spec.rb#L295)
1108
1464
  * message IDs
1109
- * [is unique](./spec/acceptance/rest/channel_spec.rb#L144)
1465
+ * [is unique](./spec/acceptance/rest/channel_spec.rb#L303)
1110
1466
  * direction
1111
- * [returns paged history backwards by default](./spec/acceptance/rest/channel_spec.rb#L172)
1112
- * [returns history forward if specified in the options](./spec/acceptance/rest/channel_spec.rb#L178)
1467
+ * [returns paged history backwards by default](./spec/acceptance/rest/channel_spec.rb#L331)
1468
+ * [returns history forward if specified in the options](./spec/acceptance/rest/channel_spec.rb#L337)
1113
1469
  * limit
1114
- * [defaults to 100](./spec/acceptance/rest/channel_spec.rb#L190)
1470
+ * [defaults to 100](./spec/acceptance/rest/channel_spec.rb#L349)
1115
1471
  * #history option
1116
1472
  * :start
1117
1473
  * with milliseconds since epoch value
1118
- * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L233)
1474
+ * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L392)
1119
1475
  * with a Time object value
1120
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L243)
1476
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L402)
1121
1477
  * :end
1122
1478
  * with milliseconds since epoch value
1123
- * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L233)
1479
+ * [uses this value in the history request](./spec/acceptance/rest/channel_spec.rb#L392)
1124
1480
  * with a Time object value
1125
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L243)
1481
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/channel_spec.rb#L402)
1126
1482
  * when argument start is after end
1127
- * [should raise an exception](./spec/acceptance/rest/channel_spec.rb#L253)
1483
+ * [should raise an exception](./spec/acceptance/rest/channel_spec.rb#L412)
1128
1484
  * #presence
1129
- * [returns a REST Presence object](./spec/acceptance/rest/channel_spec.rb#L263)
1485
+ * [returns a REST Presence object](./spec/acceptance/rest/channel_spec.rb#L422)
1130
1486
 
1131
1487
  ### Ably::Rest::Channels
1132
1488
  _(see [spec/acceptance/rest/channels_spec.rb](./spec/acceptance/rest/channels_spec.rb))_
1133
- * using JSON and MsgPack protocol
1489
+ * using JSON protocol
1134
1490
  * using shortcut method #channel on the client object
1135
1491
  * behaves like a channel
1136
1492
  * [returns a channel object](./spec/acceptance/rest/channels_spec.rb#L6)
@@ -1150,7 +1506,7 @@ _(see [spec/acceptance/rest/channels_spec.rb](./spec/acceptance/rest/channels_sp
1150
1506
 
1151
1507
  ### Ably::Rest::Client
1152
1508
  _(see [spec/acceptance/rest/client_spec.rb](./spec/acceptance/rest/client_spec.rb))_
1153
- * using JSON and MsgPack protocol
1509
+ * using JSON protocol
1154
1510
  * #initialize
1155
1511
  * with only an API key
1156
1512
  * [uses basic authentication](./spec/acceptance/rest/client_spec.rb#L24)
@@ -1160,61 +1516,87 @@ _(see [spec/acceptance/rest/client_spec.rb](./spec/acceptance/rest/client_spec.r
1160
1516
  * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L40)
1161
1517
  * with a :client_id configured
1162
1518
  * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L48)
1519
+ * with an invalid wildcard "*" :client_id
1520
+ * [raises an exception](./spec/acceptance/rest/client_spec.rb#L54)
1163
1521
  * with an :auth_callback Proc
1164
- * [calls the auth Proc to get a new token](./spec/acceptance/rest/client_spec.rb#L56)
1165
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L61)
1522
+ * [calls the auth Proc to get a new token](./spec/acceptance/rest/client_spec.rb#L62)
1523
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L67)
1524
+ * with an :auth_callback Proc (clientId provided in library options instead of as a token_request param)
1525
+ * [correctly sets the clientId on the token](./spec/acceptance/rest/client_spec.rb#L76)
1166
1526
  * with an auth URL
1167
- * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L70)
1527
+ * [uses token authentication](./spec/acceptance/rest/client_spec.rb#L86)
1168
1528
  * before any REST request
1169
- * [sends an HTTP request to the provided auth URL to get a new token](./spec/acceptance/rest/client_spec.rb#L81)
1529
+ * [sends an HTTP request to the provided auth URL to get a new token](./spec/acceptance/rest/client_spec.rb#L97)
1170
1530
  * auth headers
1171
1531
  * with basic auth
1172
- * [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#L101)
1532
+ * [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#L117)
1173
1533
  * with token auth
1174
1534
  * without specifying protocol
1175
- * [sends the token string over HTTPS in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L120)
1535
+ * [sends the token string over HTTPS in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L136)
1176
1536
  * when setting constructor ClientOption :tls to false
1177
- * [sends the token string over HTTP in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L130)
1537
+ * [sends the token string over HTTP in the Authorization Bearer header with Base64 encoding](./spec/acceptance/rest/client_spec.rb#L146)
1178
1538
  * using tokens
1179
1539
  * when expired
1180
- * [creates a new token automatically when the old token expires](./spec/acceptance/rest/client_spec.rb#L161)
1540
+ * [creates a new token automatically when the old token expires](./spec/acceptance/rest/client_spec.rb#L179)
1541
+ * with a different client_id in the subsequent token
1542
+ * [fails to authenticate and raises an exception](./spec/acceptance/rest/client_spec.rb#L192)
1181
1543
  * when token has not expired
1182
- * [reuses the existing token for every request](./spec/acceptance/rest/client_spec.rb#L175)
1544
+ * [reuses the existing token for every request](./spec/acceptance/rest/client_spec.rb#L203)
1183
1545
  * connection transport
1184
- * for default host
1185
- * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L191)
1186
- * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L195)
1187
- * for the fallback hosts
1188
- * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L201)
1189
- * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L205)
1546
+ * defaults
1547
+ * for default host
1548
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L220)
1549
+ * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L224)
1550
+ * for the fallback hosts
1551
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L230)
1552
+ * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L234)
1553
+ * with custom http_open_timeout and http_request_timeout options
1554
+ * for default host
1555
+ * [is configured to use custom open timeout](./spec/acceptance/rest/client_spec.rb#L246)
1556
+ * [is configured to use custom request timeout](./spec/acceptance/rest/client_spec.rb#L250)
1557
+ * for the fallback hosts
1558
+ * [is configured to timeout connection opening in 4 seconds](./spec/acceptance/rest/client_spec.rb#L256)
1559
+ * [is configured to timeout connection requests in 15 seconds](./spec/acceptance/rest/client_spec.rb#L260)
1190
1560
  * fallback hosts
1191
1561
  * configured
1192
- * [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](./spec/acceptance/rest/client_spec.rb#L218)
1562
+ * [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](./spec/acceptance/rest/client_spec.rb#L274)
1193
1563
  * when environment is NOT production
1194
- * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L235)
1564
+ * [does not retry failed requests with fallback hosts when there is a connection error](./spec/acceptance/rest/client_spec.rb#L291)
1195
1565
  * when environment is production
1196
1566
  * and connection times out
1197
- * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L272)
1567
+ * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L329)
1198
1568
  * and the total request time exeeds 10 seconds
1199
- * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L287)
1569
+ * [makes no further attempts to any fallback hosts](./spec/acceptance/rest/client_spec.rb#L344)
1200
1570
  * and connection fails
1201
- * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L303)
1571
+ * [tries fallback hosts 3 times](./spec/acceptance/rest/client_spec.rb#L360)
1202
1572
  * and basic authentication fails
1203
- * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L327)
1573
+ * [does not attempt the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L384)
1204
1574
  * and server returns a 50x error
1205
- * [attempts the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L349)
1575
+ * [attempts the fallback hosts as this is an authentication failure](./spec/acceptance/rest/client_spec.rb#L406)
1206
1576
  * with a custom host
1207
1577
  * that does not exist
1208
- * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L365)
1578
+ * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L422)
1209
1579
  * fallback hosts
1210
- * [are never used](./spec/acceptance/rest/client_spec.rb#L386)
1580
+ * [are never used](./spec/acceptance/rest/client_spec.rb#L443)
1211
1581
  * that times out
1212
- * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L401)
1582
+ * [fails immediately and raises a Faraday Error](./spec/acceptance/rest/client_spec.rb#L458)
1213
1583
  * fallback hosts
1214
- * [are never used](./spec/acceptance/rest/client_spec.rb#L414)
1584
+ * [are never used](./spec/acceptance/rest/client_spec.rb#L471)
1585
+ * HTTP configuration options
1586
+ * [is frozen](./spec/acceptance/rest/client_spec.rb#L528)
1587
+ * defaults
1588
+ * [#http_open_timeout is 4s](./spec/acceptance/rest/client_spec.rb#L483)
1589
+ * [#http_request_timeout is 15s](./spec/acceptance/rest/client_spec.rb#L487)
1590
+ * [#http_max_retry_count is 3](./spec/acceptance/rest/client_spec.rb#L491)
1591
+ * [#http_max_retry_duration is 10s](./spec/acceptance/rest/client_spec.rb#L495)
1592
+ * configured
1593
+ * [#http_open_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L511)
1594
+ * [#http_request_timeout uses provided value](./spec/acceptance/rest/client_spec.rb#L515)
1595
+ * [#http_max_retry_count uses provided value](./spec/acceptance/rest/client_spec.rb#L519)
1596
+ * [#http_max_retry_duration uses provided value](./spec/acceptance/rest/client_spec.rb#L523)
1215
1597
  * #auth
1216
- * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L428)
1217
- * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L432)
1598
+ * [is provides access to the Auth object](./spec/acceptance/rest/client_spec.rb#L539)
1599
+ * [configures the Auth object with all ClientOptions passed to client in the initializer](./spec/acceptance/rest/client_spec.rb#L543)
1218
1600
 
1219
1601
  ### Ably::Models::MessageEncoders
1220
1602
  _(see [spec/acceptance/rest/encoders_spec.rb](./spec/acceptance/rest/encoders_spec.rb))_
@@ -1251,7 +1633,7 @@ _(see [spec/acceptance/rest/encoders_spec.rb](./spec/acceptance/rest/encoders_sp
1251
1633
 
1252
1634
  ### Ably::Rest::Channel messages
1253
1635
  _(see [spec/acceptance/rest/message_spec.rb](./spec/acceptance/rest/message_spec.rb))_
1254
- * using JSON and MsgPack protocol
1636
+ * using JSON protocol
1255
1637
  * publishing with an ASCII_8BIT message name
1256
1638
  * [is converted into UTF_8](./spec/acceptance/rest/message_spec.rb#L18)
1257
1639
  * with supported data payload content type
@@ -1328,7 +1710,7 @@ _(see [spec/acceptance/rest/message_spec.rb](./spec/acceptance/rest/message_spec
1328
1710
 
1329
1711
  ### Ably::Rest::Presence
1330
1712
  _(see [spec/acceptance/rest/presence_spec.rb](./spec/acceptance/rest/presence_spec.rb))_
1331
- * using JSON and MsgPack protocol
1713
+ * using JSON protocol
1332
1714
  * tested against presence fixture data set up in test app
1333
1715
  * #get
1334
1716
  * [returns current members on the channel with their action set to :present](./spec/acceptance/rest/presence_spec.rb#L41)
@@ -1337,61 +1719,62 @@ _(see [spec/acceptance/rest/presence_spec.rb](./spec/acceptance/rest/presence_sp
1337
1719
  * default :limit
1338
1720
  * [defaults to a limit of 100](./spec/acceptance/rest/presence_spec.rb#L89)
1339
1721
  * with :client_id option
1340
- * PENDING: *[returns a list members filtered by the provided client ID](./spec/acceptance/rest/presence_spec.rb#L98)*
1722
+ * [returns a list members filtered by the provided client ID](./spec/acceptance/rest/presence_spec.rb#L98)
1341
1723
  * with :connection_id option
1342
- * PENDING: *[returns a list members filtered by the provided connection ID](./spec/acceptance/rest/presence_spec.rb#L109)*
1724
+ * [returns a list members filtered by the provided connection ID](./spec/acceptance/rest/presence_spec.rb#L109)
1725
+ * [returns a list members filtered by the provided connection ID](./spec/acceptance/rest/presence_spec.rb#L113)
1343
1726
  * #history
1344
- * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L120)
1727
+ * [returns recent presence activity](./spec/acceptance/rest/presence_spec.rb#L122)
1345
1728
  * default behaviour
1346
- * [uses backwards direction](./spec/acceptance/rest/presence_spec.rb#L135)
1729
+ * [uses backwards direction](./spec/acceptance/rest/presence_spec.rb#L137)
1347
1730
  * with options
1348
1731
  * direction: :forwards
1349
- * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L147)
1732
+ * [returns recent presence activity forwards with most recent history last](./spec/acceptance/rest/presence_spec.rb#L149)
1350
1733
  * direction: :backwards
1351
- * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L162)
1734
+ * [returns recent presence activity backwards with most recent history first](./spec/acceptance/rest/presence_spec.rb#L164)
1352
1735
  * #history
1353
1736
  * with options
1354
1737
  * limit options
1355
1738
  * default
1356
- * [is set to 100](./spec/acceptance/rest/presence_spec.rb#L210)
1739
+ * [is set to 100](./spec/acceptance/rest/presence_spec.rb#L212)
1357
1740
  * set to 1000
1358
- * [is passes the limit query param value 1000](./spec/acceptance/rest/presence_spec.rb#L223)
1741
+ * [is passes the limit query param value 1000](./spec/acceptance/rest/presence_spec.rb#L225)
1359
1742
  * with time range options
1360
1743
  * :start
1361
1744
  * with milliseconds since epoch value
1362
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L253)
1745
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L255)
1363
1746
  * with Time object value
1364
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L263)
1747
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L265)
1365
1748
  * :end
1366
1749
  * with milliseconds since epoch value
1367
- * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L253)
1750
+ * [uses this value in the history request](./spec/acceptance/rest/presence_spec.rb#L255)
1368
1751
  * with Time object value
1369
- * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L263)
1752
+ * [converts the value to milliseconds since epoch in the hisotry request](./spec/acceptance/rest/presence_spec.rb#L265)
1370
1753
  * when argument start is after end
1371
- * [should raise an exception](./spec/acceptance/rest/presence_spec.rb#L274)
1754
+ * [should raise an exception](./spec/acceptance/rest/presence_spec.rb#L276)
1372
1755
  * decoding
1373
1756
  * with encoded fixture data
1374
1757
  * #history
1375
- * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L293)
1758
+ * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L295)
1376
1759
  * #get
1377
- * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L300)
1760
+ * [decodes encoded and encryped presence fixture data automatically](./spec/acceptance/rest/presence_spec.rb#L302)
1378
1761
  * decoding permutations using mocked #history
1379
1762
  * valid decodeable content
1380
1763
  * #get
1381
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L356)
1764
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L358)
1382
1765
  * #history
1383
- * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L373)
1766
+ * [automaticaly decodes presence messages](./spec/acceptance/rest/presence_spec.rb#L375)
1384
1767
  * invalid data
1385
1768
  * #get
1386
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L404)
1387
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L408)
1769
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L406)
1770
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L410)
1388
1771
  * #history
1389
- * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L428)
1390
- * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L432)
1772
+ * [returns the messages still encoded](./spec/acceptance/rest/presence_spec.rb#L430)
1773
+ * [logs a cipher error](./spec/acceptance/rest/presence_spec.rb#L434)
1391
1774
 
1392
1775
  ### Ably::Rest::Client#stats
1393
1776
  _(see [spec/acceptance/rest/stats_spec.rb](./spec/acceptance/rest/stats_spec.rb))_
1394
- * using JSON and MsgPack protocol
1777
+ * using JSON protocol
1395
1778
  * fetching application stats
1396
1779
  * [returns a PaginatedResult object](./spec/acceptance/rest/stats_spec.rb#L54)
1397
1780
  * by minute
@@ -1435,9 +1818,11 @@ _(see [spec/acceptance/rest/stats_spec.rb](./spec/acceptance/rest/stats_spec.rb)
1435
1818
 
1436
1819
  ### Ably::Rest::Client#time
1437
1820
  _(see [spec/acceptance/rest/time_spec.rb](./spec/acceptance/rest/time_spec.rb))_
1438
- * using JSON and MsgPack protocol
1821
+ * using JSON protocol
1439
1822
  * fetching the service time
1440
1823
  * [should return the service time as a Time object](./spec/acceptance/rest/time_spec.rb#L10)
1824
+ * with reconfigured HTTP timeout
1825
+ * [should raise a timeout exception](./spec/acceptance/rest/time_spec.rb#L19)
1441
1826
 
1442
1827
  ### Ably::Auth
1443
1828
  _(see [spec/unit/auth_spec.rb](./spec/unit/auth_spec.rb))_
@@ -1469,6 +1854,105 @@ _(see [spec/unit/logger_spec.rb](./spec/unit/logger_spec.rb))_
1469
1854
  * with a valid interface
1470
1855
  * [is used](./spec/unit/logger_spec.rb#L135)
1471
1856
 
1857
+ ### Ably::Models::ChannelStateChange
1858
+ _(see [spec/unit/models/channel_state_change_spec.rb](./spec/unit/models/channel_state_change_spec.rb))_
1859
+ * #current
1860
+ * [is required](./spec/unit/models/channel_state_change_spec.rb#L10)
1861
+ * [is an attribute](./spec/unit/models/channel_state_change_spec.rb#L14)
1862
+ * #previous
1863
+ * [is required](./spec/unit/models/channel_state_change_spec.rb#L20)
1864
+ * [is an attribute](./spec/unit/models/channel_state_change_spec.rb#L24)
1865
+ * #reason
1866
+ * [is not required](./spec/unit/models/channel_state_change_spec.rb#L30)
1867
+ * [is an attribute](./spec/unit/models/channel_state_change_spec.rb#L34)
1868
+ * invalid attributes
1869
+ * [raises an argument error](./spec/unit/models/channel_state_change_spec.rb#L40)
1870
+
1871
+ ### Ably::Models::CipherParams
1872
+ _(see [spec/unit/models/cipher_params_spec.rb](./spec/unit/models/cipher_params_spec.rb))_
1873
+ * :key missing from constructor
1874
+ * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L8)
1875
+ * #key
1876
+ * with :key in constructor
1877
+ * as nil
1878
+ * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L20)
1879
+ * as a base64 encoded string
1880
+ * [is a binary representation of the base64 encoded string](./spec/unit/models/cipher_params_spec.rb#L29)
1881
+ * as a URL safe base64 encoded string
1882
+ * [is a binary representation of the URL safe base64 encoded string](./spec/unit/models/cipher_params_spec.rb#L40)
1883
+ * as a binary encoded string
1884
+ * [contains the binary string](./spec/unit/models/cipher_params_spec.rb#L48)
1885
+ * with an incompatible :key_length constructor param
1886
+ * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L58)
1887
+ * with an unsupported :key_length for aes-cbc encryption
1888
+ * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L67)
1889
+ * with an invalid type
1890
+ * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L76)
1891
+ * with specified params in the constructor
1892
+ * #cipher_type
1893
+ * [contains the complete algorithm string as an upper case string](./spec/unit/models/cipher_params_spec.rb#L88)
1894
+ * #mode
1895
+ * [contains the mode](./spec/unit/models/cipher_params_spec.rb#L94)
1896
+ * #algorithm
1897
+ * [contains the algorithm](./spec/unit/models/cipher_params_spec.rb#L100)
1898
+ * #key_length
1899
+ * [contains the key_length](./spec/unit/models/cipher_params_spec.rb#L106)
1900
+ * with combined param in the constructor
1901
+ * #cipher_type
1902
+ * [contains the complete algorithm string as an upper case string](./spec/unit/models/cipher_params_spec.rb#L117)
1903
+ * #mode
1904
+ * [contains the mode](./spec/unit/models/cipher_params_spec.rb#L123)
1905
+ * #algorithm
1906
+ * [contains the algorithm](./spec/unit/models/cipher_params_spec.rb#L129)
1907
+ * #key_length
1908
+ * [contains the key_length](./spec/unit/models/cipher_params_spec.rb#L135)
1909
+
1910
+ ### Ably::Models::ConnectionDetails
1911
+ _(see [spec/unit/models/connection_details_spec.rb](./spec/unit/models/connection_details_spec.rb))_
1912
+ * behaves like a model
1913
+ * attributes
1914
+ * #client_id
1915
+ * [retrieves attribute :client_id](./spec/shared/model_behaviour.rb#L15)
1916
+ * #connection_key
1917
+ * [retrieves attribute :connection_key](./spec/shared/model_behaviour.rb#L15)
1918
+ * #max_message_size
1919
+ * [retrieves attribute :max_message_size](./spec/shared/model_behaviour.rb#L15)
1920
+ * #max_frame_size
1921
+ * [retrieves attribute :max_frame_size](./spec/shared/model_behaviour.rb#L15)
1922
+ * #max_inbound_rate
1923
+ * [retrieves attribute :max_inbound_rate](./spec/shared/model_behaviour.rb#L15)
1924
+ * #==
1925
+ * [is true when attributes are the same](./spec/shared/model_behaviour.rb#L41)
1926
+ * [is false when attributes are not the same](./spec/shared/model_behaviour.rb#L46)
1927
+ * [is false when class type differs](./spec/shared/model_behaviour.rb#L50)
1928
+ * is immutable
1929
+ * [prevents changes](./spec/shared/model_behaviour.rb#L76)
1930
+ * [dups options](./spec/shared/model_behaviour.rb#L80)
1931
+ * attributes
1932
+ * #connection_state_ttl
1933
+ * [retrieves attribute :connection_state_ttl and converts it from ms to s](./spec/unit/models/connection_details_spec.rb#L19)
1934
+ * ==
1935
+ * [is true when attributes are the same](./spec/unit/models/connection_details_spec.rb#L28)
1936
+ * [is false when attributes are not the same](./spec/unit/models/connection_details_spec.rb#L33)
1937
+ * [is false when class type differs](./spec/unit/models/connection_details_spec.rb#L37)
1938
+
1939
+ ### Ably::Models::ConnectionStateChange
1940
+ _(see [spec/unit/models/connection_state_change_spec.rb](./spec/unit/models/connection_state_change_spec.rb))_
1941
+ * #current
1942
+ * [is required](./spec/unit/models/connection_state_change_spec.rb#L10)
1943
+ * [is an attribute](./spec/unit/models/connection_state_change_spec.rb#L14)
1944
+ * #previous
1945
+ * [is required](./spec/unit/models/connection_state_change_spec.rb#L20)
1946
+ * [is an attribute](./spec/unit/models/connection_state_change_spec.rb#L24)
1947
+ * #retry_in
1948
+ * [is not required](./spec/unit/models/connection_state_change_spec.rb#L30)
1949
+ * [is an attribute](./spec/unit/models/connection_state_change_spec.rb#L34)
1950
+ * #reason
1951
+ * [is not required](./spec/unit/models/connection_state_change_spec.rb#L40)
1952
+ * [is an attribute](./spec/unit/models/connection_state_change_spec.rb#L44)
1953
+ * invalid attributes
1954
+ * [raises an argument error](./spec/unit/models/connection_state_change_spec.rb#L50)
1955
+
1472
1956
  ### Ably::Models::ErrorInfo
1473
1957
  _(see [spec/unit/models/error_info_spec.rb](./spec/unit/models/error_info_spec.rb))_
1474
1958
  * behaves like a model
@@ -1550,46 +2034,47 @@ _(see [spec/unit/models/message_encoders/cipher_spec.rb](./spec/unit/models/mess
1550
2034
  * message with another payload
1551
2035
  * [leaves the message data intact](./spec/unit/models/message_encoders/cipher_spec.rb#L72)
1552
2036
  * [leaves the encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L76)
1553
- * with invalid channel_option cipher params
1554
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L87)
1555
- * without any configured encryption
1556
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L97)
2037
+ * 256 bit key
2038
+ * with invalid channel_option cipher params
2039
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L90)
2040
+ * without any configured encryption
2041
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L100)
1557
2042
  * with invalid cipher data
1558
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L106)
2043
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L110)
1559
2044
  * with AES-256-CBC
1560
2045
  * message with cipher payload
1561
- * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L122)
1562
- * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L126)
2046
+ * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L127)
2047
+ * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L131)
1563
2048
  * #encode
1564
2049
  * with channel set up for AES-128-CBC
1565
2050
  * with encrypted set to true
1566
2051
  * message with string payload
1567
- * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L146)
1568
- * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L151)
2052
+ * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L151)
2053
+ * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L156)
1569
2054
  * message with binary payload
1570
- * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L159)
1571
- * [adds the encoding without utf-8 prefixed](./spec/unit/models/message_encoders/cipher_spec.rb#L164)
1572
- * [returns ASCII_8BIT encoded binary data](./spec/unit/models/message_encoders/cipher_spec.rb#L168)
2055
+ * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L164)
2056
+ * [adds the encoding without utf-8 prefixed](./spec/unit/models/message_encoders/cipher_spec.rb#L169)
2057
+ * [returns ASCII_8BIT encoded binary data](./spec/unit/models/message_encoders/cipher_spec.rb#L173)
1573
2058
  * message with json payload
1574
- * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L176)
1575
- * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L181)
2059
+ * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L181)
2060
+ * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L186)
1576
2061
  * message with existing cipher encoding before
1577
- * [leaves message intact as it is already encrypted](./spec/unit/models/message_encoders/cipher_spec.rb#L189)
1578
- * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L193)
2062
+ * [leaves message intact as it is already encrypted](./spec/unit/models/message_encoders/cipher_spec.rb#L194)
2063
+ * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L198)
1579
2064
  * with encryption set to to false
1580
- * [leaves message intact as encryption is not enable](./spec/unit/models/message_encoders/cipher_spec.rb#L202)
1581
- * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L206)
2065
+ * [leaves message intact as encryption is not enable](./spec/unit/models/message_encoders/cipher_spec.rb#L207)
2066
+ * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L211)
1582
2067
  * channel_option cipher params
1583
2068
  * have invalid key length
1584
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L218)
2069
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L223)
1585
2070
  * have invalid algorithm
1586
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L225)
2071
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L230)
1587
2072
  * have missing key
1588
- * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L232)
2073
+ * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L237)
1589
2074
  * with AES-256-CBC
1590
2075
  * message with cipher payload
1591
- * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L249)
1592
- * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L254)
2076
+ * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L255)
2077
+ * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L260)
1593
2078
 
1594
2079
  ### Ably::Models::MessageEncoders::Json
1595
2080
  _(see [spec/unit/models/message_encoders/json_spec.rb](./spec/unit/models/message_encoders/json_spec.rb))_
@@ -1597,31 +2082,37 @@ _(see [spec/unit/models/message_encoders/json_spec.rb](./spec/unit/models/messag
1597
2082
  * message with json payload
1598
2083
  * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L24)
1599
2084
  * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L28)
1600
- * message with json payload before other payloads
2085
+ * message with json payload in camelCase
1601
2086
  * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L36)
1602
2087
  * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L40)
2088
+ * message with json payload before other payloads
2089
+ * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L48)
2090
+ * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L52)
1603
2091
  * message with another payload
1604
- * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L48)
1605
- * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L52)
2092
+ * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L60)
2093
+ * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L64)
1606
2094
  * #encode
1607
2095
  * message with hash payload
1608
- * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L66)
1609
- * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L70)
1610
- * already encoded message with hash payload
1611
2096
  * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L78)
1612
2097
  * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L82)
1613
- * message with Array payload
1614
- * [encodes Array payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L90)
2098
+ * message with hash payload and underscore case keys
2099
+ * [encodes hash payload data as json and leaves underscore case in tact](./spec/unit/models/message_encoders/json_spec.rb#L90)
1615
2100
  * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L94)
2101
+ * already encoded message with hash payload
2102
+ * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L102)
2103
+ * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L106)
2104
+ * message with Array payload
2105
+ * [encodes Array payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L114)
2106
+ * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L118)
1616
2107
  * message with UTF-8 payload
1617
- * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L102)
1618
- * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L106)
1619
- * message with nil payload
1620
- * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L114)
1621
- * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L118)
1622
- * message with no data payload
1623
2108
  * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L126)
1624
2109
  * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L130)
2110
+ * message with nil payload
2111
+ * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L138)
2112
+ * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L142)
2113
+ * message with no data payload
2114
+ * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L150)
2115
+ * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L154)
1625
2116
 
1626
2117
  ### Ably::Models::MessageEncoders::Utf8
1627
2118
  _(see [spec/unit/models/message_encoders/utf8_spec.rb](./spec/unit/models/message_encoders/utf8_spec.rb))_
@@ -1907,6 +2398,17 @@ _(see [spec/unit/models/protocol_message_spec.rb](./spec/unit/models/protocol_me
1907
2398
  * [contains Message objects](./spec/unit/models/protocol_message_spec.rb#L271)
1908
2399
  * #presence
1909
2400
  * [contains PresenceMessage objects](./spec/unit/models/protocol_message_spec.rb#L281)
2401
+ * #connection_details
2402
+ * with a JSON value
2403
+ * [contains a ConnectionDetails object](./spec/unit/models/protocol_message_spec.rb#L294)
2404
+ * [contains the attributes from the JSON connectionDetails](./spec/unit/models/protocol_message_spec.rb#L298)
2405
+ * without a JSON value
2406
+ * [contains an empty ConnectionDetails object](./spec/unit/models/protocol_message_spec.rb#L307)
2407
+ * #connection_key
2408
+ * existing only in #connection_details.connection_key
2409
+ * [is returned](./spec/unit/models/protocol_message_spec.rb#L319)
2410
+ * existing in both #connection_key and #connection_details.connection_key
2411
+ * [returns #connection_details.connection_key as #connection_key will be deprecated > 0.8](./spec/unit/models/protocol_message_spec.rb#L327)
1910
2412
 
1911
2413
  ### Ably::Models::Stats
1912
2414
  _(see [spec/unit/models/stats_spec.rb](./spec/unit/models/stats_spec.rb))_
@@ -2058,27 +2560,30 @@ _(see [spec/unit/models/token_details_spec.rb](./spec/unit/models/token_details_
2058
2560
  * attributes
2059
2561
  * #capability
2060
2562
  * [retrieves attribute :capability as parsed JSON](./spec/unit/models/token_details_spec.rb#L21)
2061
- * #issued with :issued option as milliseconds in constructor
2062
- * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L31)
2063
- * #issued with :issued option as a Time in constructor
2064
- * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L40)
2065
- * #issued when converted to JSON
2066
- * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L49)
2067
- * #expires with :expires option as milliseconds in constructor
2068
- * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L31)
2069
- * #expires with :expires option as a Time in constructor
2070
- * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L40)
2071
- * #expires when converted to JSON
2072
- * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L49)
2563
+ *
2564
+ * #issued with :issued option as milliseconds in constructor
2565
+ * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L32)
2566
+ * #issued with :issued option as a Time in constructor
2567
+ * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L41)
2568
+ * #issued when converted to JSON
2569
+ * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L50)
2570
+ * #expires with :expires option as milliseconds in constructor
2571
+ * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L32)
2572
+ * #expires with :expires option as a Time in constructor
2573
+ * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L41)
2574
+ * #expires when converted to JSON
2575
+ * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L50)
2073
2576
  * #expired?
2074
2577
  * once grace period buffer has passed
2075
- * [is true](./spec/unit/models/token_details_spec.rb#L61)
2578
+ * [is true](./spec/unit/models/token_details_spec.rb#L63)
2076
2579
  * within grace period buffer
2077
- * [is false](./spec/unit/models/token_details_spec.rb#L69)
2580
+ * [is false](./spec/unit/models/token_details_spec.rb#L71)
2581
+ * when expires is not available (i.e. string tokens)
2582
+ * [is always false](./spec/unit/models/token_details_spec.rb#L79)
2078
2583
  * ==
2079
- * [is true when attributes are the same](./spec/unit/models/token_details_spec.rb#L79)
2080
- * [is false when attributes are not the same](./spec/unit/models/token_details_spec.rb#L84)
2081
- * [is false when class type differs](./spec/unit/models/token_details_spec.rb#L88)
2584
+ * [is true when attributes are the same](./spec/unit/models/token_details_spec.rb#L89)
2585
+ * [is false when attributes are not the same](./spec/unit/models/token_details_spec.rb#L94)
2586
+ * [is false when class type differs](./spec/unit/models/token_details_spec.rb#L98)
2082
2587
 
2083
2588
  ### Ably::Models::TokenRequest
2084
2589
  _(see [spec/unit/models/token_request_spec.rb](./spec/unit/models/token_request_spec.rb))_
@@ -2122,35 +2627,35 @@ _(see [spec/unit/models/token_request_spec.rb](./spec/unit/models/token_request_
2122
2627
  ### Ably::Modules::EventEmitter
2123
2628
  _(see [spec/unit/modules/event_emitter_spec.rb](./spec/unit/modules/event_emitter_spec.rb))_
2124
2629
  * #emit event fan out
2125
- * [should emit an event for any number of subscribers](./spec/unit/modules/event_emitter_spec.rb#L19)
2126
- * [sends only messages to matching event names](./spec/unit/modules/event_emitter_spec.rb#L28)
2630
+ * [should emit an event for any number of subscribers](./spec/unit/modules/event_emitter_spec.rb#L21)
2631
+ * [sends only messages to matching event names](./spec/unit/modules/event_emitter_spec.rb#L30)
2127
2632
  * #on subscribe to multiple events
2128
- * [with the same block](./spec/unit/modules/event_emitter_spec.rb#L60)
2633
+ * [with the same block](./spec/unit/modules/event_emitter_spec.rb#L62)
2129
2634
  * event callback changes within the callback block
2130
2635
  * when new event callbacks are added
2131
- * [is unaffected and processes the prior event callbacks once](./spec/unit/modules/event_emitter_spec.rb#L84)
2132
- * [adds them for the next emitted event](./spec/unit/modules/event_emitter_spec.rb#L90)
2636
+ * [is unaffected and processes the prior event callbacks once](./spec/unit/modules/event_emitter_spec.rb#L86)
2637
+ * [adds them for the next emitted event](./spec/unit/modules/event_emitter_spec.rb#L92)
2133
2638
  * when callbacks are removed
2134
- * [is unaffected and processes the prior event callbacks once](./spec/unit/modules/event_emitter_spec.rb#L111)
2135
- * [removes them for the next emitted event](./spec/unit/modules/event_emitter_spec.rb#L116)
2639
+ * [is unaffected and processes the prior event callbacks once](./spec/unit/modules/event_emitter_spec.rb#L113)
2640
+ * [removes them for the next emitted event](./spec/unit/modules/event_emitter_spec.rb#L118)
2136
2641
  * #on
2137
- * [calls the block every time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L129)
2138
- * [catches exceptions in the provided block, logs the error and continues](./spec/unit/modules/event_emitter_spec.rb#L136)
2642
+ * [calls the block every time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L131)
2643
+ * [catches exceptions in the provided block, logs the error and continues](./spec/unit/modules/event_emitter_spec.rb#L138)
2139
2644
  * #once
2140
- * [calls the block the first time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L158)
2141
- * [does not remove other blocks after it is called](./spec/unit/modules/event_emitter_spec.rb#L165)
2142
- * [catches exceptions in the provided block, logs the error and continues](./spec/unit/modules/event_emitter_spec.rb#L173)
2645
+ * [calls the block the first time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L160)
2646
+ * [does not remove other blocks after it is called](./spec/unit/modules/event_emitter_spec.rb#L167)
2647
+ * [catches exceptions in the provided block, logs the error and continues](./spec/unit/modules/event_emitter_spec.rb#L175)
2143
2648
  * #unsafe_once
2144
- * [calls the block the first time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L181)
2145
- * [does not catch exceptions in provided blocks](./spec/unit/modules/event_emitter_spec.rb#L188)
2649
+ * [calls the block the first time an event is emitted only](./spec/unit/modules/event_emitter_spec.rb#L183)
2650
+ * [does not catch exceptions in provided blocks](./spec/unit/modules/event_emitter_spec.rb#L190)
2146
2651
  * #off
2147
2652
  * with event names as arguments
2148
- * [deletes matching callbacks](./spec/unit/modules/event_emitter_spec.rb#L206)
2149
- * [deletes all callbacks if not block given](./spec/unit/modules/event_emitter_spec.rb#L211)
2150
- * [continues if the block does not exist](./spec/unit/modules/event_emitter_spec.rb#L216)
2653
+ * [deletes matching callbacks](./spec/unit/modules/event_emitter_spec.rb#L208)
2654
+ * [deletes all callbacks if not block given](./spec/unit/modules/event_emitter_spec.rb#L213)
2655
+ * [continues if the block does not exist](./spec/unit/modules/event_emitter_spec.rb#L218)
2151
2656
  * without any event names
2152
- * [deletes all matching callbacks](./spec/unit/modules/event_emitter_spec.rb#L223)
2153
- * [deletes all callbacks if not block given](./spec/unit/modules/event_emitter_spec.rb#L228)
2657
+ * [deletes all matching callbacks](./spec/unit/modules/event_emitter_spec.rb#L225)
2658
+ * [deletes all callbacks if not block given](./spec/unit/modules/event_emitter_spec.rb#L230)
2154
2659
 
2155
2660
  ### Ably::Modules::StateEmitter
2156
2661
  _(see [spec/unit/modules/state_emitter_spec.rb](./spec/unit/modules/state_emitter_spec.rb))_
@@ -2184,31 +2689,31 @@ _(see [spec/unit/realtime/channel_spec.rb](./spec/unit/realtime/channel_spec.rb)
2184
2689
  * [raises an argument error](./spec/unit/realtime/channel_spec.rb#L63)
2185
2690
  * #publish name argument
2186
2691
  * as UTF_8 string
2187
- * [is permitted](./spec/unit/realtime/channel_spec.rb#L80)
2692
+ * [is permitted](./spec/unit/realtime/channel_spec.rb#L81)
2188
2693
  * as SHIFT_JIS string
2189
- * [is permitted](./spec/unit/realtime/channel_spec.rb#L88)
2694
+ * [is permitted](./spec/unit/realtime/channel_spec.rb#L89)
2190
2695
  * as ASCII_8BIT string
2191
- * [is permitted](./spec/unit/realtime/channel_spec.rb#L96)
2696
+ * [is permitted](./spec/unit/realtime/channel_spec.rb#L97)
2192
2697
  * as Integer
2193
- * [raises an argument error](./spec/unit/realtime/channel_spec.rb#L104)
2698
+ * [raises an argument error](./spec/unit/realtime/channel_spec.rb#L105)
2194
2699
  * as Nil
2195
- * [is permitted](./spec/unit/realtime/channel_spec.rb#L112)
2700
+ * [is permitted](./spec/unit/realtime/channel_spec.rb#L113)
2196
2701
  * callbacks
2197
- * [are supported for valid STATE events](./spec/unit/realtime/channel_spec.rb#L119)
2198
- * [fail with unacceptable STATE event names](./spec/unit/realtime/channel_spec.rb#L125)
2702
+ * [are supported for valid STATE events](./spec/unit/realtime/channel_spec.rb#L120)
2703
+ * [fail with unacceptable STATE event names](./spec/unit/realtime/channel_spec.rb#L126)
2199
2704
  * subscriptions
2200
2705
  * #subscribe
2201
- * [without a block raises an invalid ArgumentError](./spec/unit/realtime/channel_spec.rb#L167)
2202
- * [with no event name specified subscribes the provided block to all events](./spec/unit/realtime/channel_spec.rb#L171)
2203
- * [with a single event name subscribes that block to matching events](./spec/unit/realtime/channel_spec.rb#L177)
2204
- * [with a multiple event name arguments subscribes that block to all of those event names](./spec/unit/realtime/channel_spec.rb#L184)
2205
- * [with a multiple duplicate event name arguments subscribes that block to all of those unique event names once](./spec/unit/realtime/channel_spec.rb#L196)
2706
+ * [without a block raises an invalid ArgumentError](./spec/unit/realtime/channel_spec.rb#L168)
2707
+ * [with no event name specified subscribes the provided block to all events](./spec/unit/realtime/channel_spec.rb#L172)
2708
+ * [with a single event name subscribes that block to matching events](./spec/unit/realtime/channel_spec.rb#L178)
2709
+ * [with a multiple event name arguments subscribes that block to all of those event names](./spec/unit/realtime/channel_spec.rb#L185)
2710
+ * [with a multiple duplicate event name arguments subscribes that block to all of those unique event names once](./spec/unit/realtime/channel_spec.rb#L197)
2206
2711
  * #unsubscribe
2207
- * [with no event name specified unsubscribes that block from all events](./spec/unit/realtime/channel_spec.rb#L213)
2208
- * [with a single event name argument unsubscribes the provided block with the matching event name](./spec/unit/realtime/channel_spec.rb#L219)
2209
- * [with multiple event name arguments unsubscribes each of those matching event names with the provided block](./spec/unit/realtime/channel_spec.rb#L225)
2210
- * [with a non-matching event name argument has no effect](./spec/unit/realtime/channel_spec.rb#L231)
2211
- * [with no block argument unsubscribes all blocks for the event name argument](./spec/unit/realtime/channel_spec.rb#L237)
2712
+ * [with no event name specified unsubscribes that block from all events](./spec/unit/realtime/channel_spec.rb#L214)
2713
+ * [with a single event name argument unsubscribes the provided block with the matching event name](./spec/unit/realtime/channel_spec.rb#L220)
2714
+ * [with multiple event name arguments unsubscribes each of those matching event names with the provided block](./spec/unit/realtime/channel_spec.rb#L226)
2715
+ * [with a non-matching event name argument has no effect](./spec/unit/realtime/channel_spec.rb#L232)
2716
+ * [with no block argument unsubscribes all blocks for the event name argument](./spec/unit/realtime/channel_spec.rb#L238)
2212
2717
 
2213
2718
  ### Ably::Realtime::Channels
2214
2719
  _(see [spec/unit/realtime/channels_spec.rb](./spec/unit/realtime/channels_spec.rb))_
@@ -2255,47 +2760,47 @@ _(see [spec/unit/realtime/client_spec.rb](./spec/unit/realtime/client_spec.rb))_
2255
2760
  * [connects to the Ably service](./spec/shared/client_initializer_behaviour.rb#L87)
2256
2761
  * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L91)
2257
2762
  * with a string key instead of options hash
2258
- * [sets the key](./spec/shared/client_initializer_behaviour.rb#L107)
2259
- * [sets the key_name](./spec/shared/client_initializer_behaviour.rb#L111)
2260
- * [sets the key_secret](./spec/shared/client_initializer_behaviour.rb#L115)
2261
- * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L119)
2763
+ * [sets the key](./spec/shared/client_initializer_behaviour.rb#L111)
2764
+ * [sets the key_name](./spec/shared/client_initializer_behaviour.rb#L115)
2765
+ * [sets the key_secret](./spec/shared/client_initializer_behaviour.rb#L119)
2766
+ * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L123)
2262
2767
  * with a string token key instead of options hash
2263
- * [sets the token](./spec/shared/client_initializer_behaviour.rb#L127)
2264
- * with token
2265
2768
  * [sets the token](./spec/shared/client_initializer_behaviour.rb#L135)
2266
- * with token_details
2769
+ * with token
2267
2770
  * [sets the token](./spec/shared/client_initializer_behaviour.rb#L143)
2771
+ * with token_details
2772
+ * [sets the token](./spec/shared/client_initializer_behaviour.rb#L151)
2268
2773
  * with token_params
2269
- * [configures the default token_params](./spec/shared/client_initializer_behaviour.rb#L151)
2774
+ * [configures the default token_params](./spec/shared/client_initializer_behaviour.rb#L159)
2270
2775
  * endpoint
2271
- * [defaults to production](./spec/shared/client_initializer_behaviour.rb#L158)
2776
+ * [defaults to production](./spec/shared/client_initializer_behaviour.rb#L170)
2272
2777
  * with environment option
2273
- * [uses an alternate endpoint](./spec/shared/client_initializer_behaviour.rb#L165)
2778
+ * [uses an alternate endpoint](./spec/shared/client_initializer_behaviour.rb#L177)
2274
2779
  * with rest_host option
2275
- * PENDING: *[uses an alternate endpoint for REST clients](./spec/shared/client_initializer_behaviour.rb#L173)*
2780
+ * PENDING: *[uses an alternate endpoint for REST clients](./spec/shared/client_initializer_behaviour.rb#L185)*
2276
2781
  * with realtime_host option
2277
- * [uses an alternate endpoint for Realtime clients](./spec/shared/client_initializer_behaviour.rb#L182)
2782
+ * [uses an alternate endpoint for Realtime clients](./spec/shared/client_initializer_behaviour.rb#L194)
2278
2783
  * with port option and non-TLS connections
2279
- * [uses the custom port for non-TLS requests](./spec/shared/client_initializer_behaviour.rb#L191)
2784
+ * [uses the custom port for non-TLS requests](./spec/shared/client_initializer_behaviour.rb#L203)
2280
2785
  * with tls_port option and a TLS connection
2281
- * [uses the custom port for TLS requests](./spec/shared/client_initializer_behaviour.rb#L199)
2786
+ * [uses the custom port for TLS requests](./spec/shared/client_initializer_behaviour.rb#L211)
2282
2787
  * tls
2283
- * [defaults to TLS](./spec/shared/client_initializer_behaviour.rb#L218)
2788
+ * [defaults to TLS](./spec/shared/client_initializer_behaviour.rb#L234)
2284
2789
  * set to false
2285
- * [uses plain text](./spec/shared/client_initializer_behaviour.rb#L209)
2286
- * [uses HTTP](./spec/shared/client_initializer_behaviour.rb#L213)
2790
+ * [uses plain text](./spec/shared/client_initializer_behaviour.rb#L225)
2791
+ * [uses HTTP](./spec/shared/client_initializer_behaviour.rb#L229)
2287
2792
  * logger
2288
2793
  * default
2289
- * [uses Ruby Logger](./spec/shared/client_initializer_behaviour.rb#L225)
2290
- * [specifies Logger::WARN log level](./spec/shared/client_initializer_behaviour.rb#L229)
2794
+ * [uses Ruby Logger](./spec/shared/client_initializer_behaviour.rb#L245)
2795
+ * [specifies Logger::WARN log level](./spec/shared/client_initializer_behaviour.rb#L249)
2291
2796
  * with log_level :none
2292
- * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L237)
2797
+ * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L257)
2293
2798
  * with custom logger and log_level
2294
- * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L255)
2295
- * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L259)
2799
+ * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L275)
2800
+ * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L279)
2296
2801
  * delegators
2297
- * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L269)
2298
- * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L274)
2802
+ * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L293)
2803
+ * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L298)
2299
2804
  * delegation to the REST Client
2300
2805
  * [passes on the options to the initializer](./spec/unit/realtime/client_spec.rb#L15)
2301
2806
  * for attribute
@@ -2442,47 +2947,47 @@ _(see [spec/unit/rest/client_spec.rb](./spec/unit/rest/client_spec.rb))_
2442
2947
  * [connects to the Ably service](./spec/shared/client_initializer_behaviour.rb#L87)
2443
2948
  * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L91)
2444
2949
  * with a string key instead of options hash
2445
- * [sets the key](./spec/shared/client_initializer_behaviour.rb#L107)
2446
- * [sets the key_name](./spec/shared/client_initializer_behaviour.rb#L111)
2447
- * [sets the key_secret](./spec/shared/client_initializer_behaviour.rb#L115)
2448
- * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L119)
2950
+ * [sets the key](./spec/shared/client_initializer_behaviour.rb#L111)
2951
+ * [sets the key_name](./spec/shared/client_initializer_behaviour.rb#L115)
2952
+ * [sets the key_secret](./spec/shared/client_initializer_behaviour.rb#L119)
2953
+ * [uses basic auth](./spec/shared/client_initializer_behaviour.rb#L123)
2449
2954
  * with a string token key instead of options hash
2450
- * [sets the token](./spec/shared/client_initializer_behaviour.rb#L127)
2451
- * with token
2452
2955
  * [sets the token](./spec/shared/client_initializer_behaviour.rb#L135)
2453
- * with token_details
2956
+ * with token
2454
2957
  * [sets the token](./spec/shared/client_initializer_behaviour.rb#L143)
2958
+ * with token_details
2959
+ * [sets the token](./spec/shared/client_initializer_behaviour.rb#L151)
2455
2960
  * with token_params
2456
- * [configures the default token_params](./spec/shared/client_initializer_behaviour.rb#L151)
2961
+ * [configures the default token_params](./spec/shared/client_initializer_behaviour.rb#L159)
2457
2962
  * endpoint
2458
- * [defaults to production](./spec/shared/client_initializer_behaviour.rb#L158)
2963
+ * [defaults to production](./spec/shared/client_initializer_behaviour.rb#L170)
2459
2964
  * with environment option
2460
- * [uses an alternate endpoint](./spec/shared/client_initializer_behaviour.rb#L165)
2965
+ * [uses an alternate endpoint](./spec/shared/client_initializer_behaviour.rb#L177)
2461
2966
  * with rest_host option
2462
- * [uses an alternate endpoint for REST clients](./spec/shared/client_initializer_behaviour.rb#L173)
2967
+ * [uses an alternate endpoint for REST clients](./spec/shared/client_initializer_behaviour.rb#L185)
2463
2968
  * with realtime_host option
2464
- * PENDING: *[uses an alternate endpoint for Realtime clients](./spec/shared/client_initializer_behaviour.rb#L182)*
2969
+ * PENDING: *[uses an alternate endpoint for Realtime clients](./spec/shared/client_initializer_behaviour.rb#L194)*
2465
2970
  * with port option and non-TLS connections
2466
- * [uses the custom port for non-TLS requests](./spec/shared/client_initializer_behaviour.rb#L191)
2971
+ * [uses the custom port for non-TLS requests](./spec/shared/client_initializer_behaviour.rb#L203)
2467
2972
  * with tls_port option and a TLS connection
2468
- * [uses the custom port for TLS requests](./spec/shared/client_initializer_behaviour.rb#L199)
2973
+ * [uses the custom port for TLS requests](./spec/shared/client_initializer_behaviour.rb#L211)
2469
2974
  * tls
2470
- * [defaults to TLS](./spec/shared/client_initializer_behaviour.rb#L218)
2975
+ * [defaults to TLS](./spec/shared/client_initializer_behaviour.rb#L234)
2471
2976
  * set to false
2472
- * [uses plain text](./spec/shared/client_initializer_behaviour.rb#L209)
2473
- * [uses HTTP](./spec/shared/client_initializer_behaviour.rb#L213)
2977
+ * [uses plain text](./spec/shared/client_initializer_behaviour.rb#L225)
2978
+ * [uses HTTP](./spec/shared/client_initializer_behaviour.rb#L229)
2474
2979
  * logger
2475
2980
  * default
2476
- * [uses Ruby Logger](./spec/shared/client_initializer_behaviour.rb#L225)
2477
- * [specifies Logger::WARN log level](./spec/shared/client_initializer_behaviour.rb#L229)
2981
+ * [uses Ruby Logger](./spec/shared/client_initializer_behaviour.rb#L245)
2982
+ * [specifies Logger::WARN log level](./spec/shared/client_initializer_behaviour.rb#L249)
2478
2983
  * with log_level :none
2479
- * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L237)
2984
+ * [silences all logging with a NilLogger](./spec/shared/client_initializer_behaviour.rb#L257)
2480
2985
  * with custom logger and log_level
2481
- * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L255)
2482
- * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L259)
2986
+ * [uses the custom logger](./spec/shared/client_initializer_behaviour.rb#L275)
2987
+ * [sets the custom log level](./spec/shared/client_initializer_behaviour.rb#L279)
2483
2988
  * delegators
2484
- * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L269)
2485
- * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L274)
2989
+ * [delegates :client_id to .auth](./spec/shared/client_initializer_behaviour.rb#L293)
2990
+ * [delegates :auth_options to .auth](./spec/shared/client_initializer_behaviour.rb#L298)
2486
2991
  * initializer options
2487
2992
  * TLS
2488
2993
  * disabled
@@ -2504,23 +3009,34 @@ _(see [spec/unit/rest/rest_spec.rb](./spec/unit/rest/rest_spec.rb))_
2504
3009
  ### Ably::Util::Crypto
2505
3010
  _(see [spec/unit/util/crypto_spec.rb](./spec/unit/util/crypto_spec.rb))_
2506
3011
  * defaults
2507
- * [match other client libraries](./spec/unit/util/crypto_spec.rb#L18)
3012
+ * [match other client libraries](./spec/unit/util/crypto_spec.rb#L19)
3013
+ * get_default_params
3014
+ * with just a :key param
3015
+ * [uses the defaults](./spec/unit/util/crypto_spec.rb#L29)
3016
+ * [contains the provided key](./spec/unit/util/crypto_spec.rb#L35)
3017
+ * [returns a CipherParams object](./spec/unit/util/crypto_spec.rb#L39)
3018
+ * without a :key param
3019
+ * [raises an exception](./spec/unit/util/crypto_spec.rb#L47)
3020
+ * with a base64-encoded :key param
3021
+ * [converts the key to binary](./spec/unit/util/crypto_spec.rb#L55)
3022
+ * with provided params
3023
+ * [overrides the defaults](./spec/unit/util/crypto_spec.rb#L67)
2508
3024
  * encrypts & decrypt
2509
- * [#encrypt encrypts a string](./spec/unit/util/crypto_spec.rb#L28)
2510
- * [#decrypt decrypts a string](./spec/unit/util/crypto_spec.rb#L33)
3025
+ * [#encrypt encrypts a string](./spec/unit/util/crypto_spec.rb#L79)
3026
+ * [#decrypt decrypts a string](./spec/unit/util/crypto_spec.rb#L84)
2511
3027
  * encrypting an empty string
2512
- * [raises an ArgumentError](./spec/unit/util/crypto_spec.rb#L42)
3028
+ * [raises an ArgumentError](./spec/unit/util/crypto_spec.rb#L93)
2513
3029
  * using shared client lib fixture data
2514
3030
  * with AES-128-CBC
2515
3031
  * behaves like an Ably encrypter and decrypter
2516
3032
  * text payload
2517
- * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L65)
2518
- * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L69)
3033
+ * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L116)
3034
+ * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L120)
2519
3035
  * with AES-256-CBC
2520
3036
  * behaves like an Ably encrypter and decrypter
2521
3037
  * text payload
2522
- * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L65)
2523
- * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L69)
3038
+ * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L116)
3039
+ * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L120)
2524
3040
 
2525
3041
  ### Ably::Util::PubSub
2526
3042
  _(see [spec/unit/util/pub_sub_spec.rb](./spec/unit/util/pub_sub_spec.rb))_
@@ -2536,6 +3052,6 @@ _(see [spec/unit/util/pub_sub_spec.rb](./spec/unit/util/pub_sub_spec.rb))_
2536
3052
 
2537
3053
  ## Test summary
2538
3054
 
2539
- * Passing tests: 1244
2540
- * Pending tests: 13
3055
+ * Passing tests: 1492
3056
+ * Pending tests: 6
2541
3057
  * Failing tests: 0