SPEC.md in ably-0.8.8 vs SPEC.md in ably-0.8.9

- old
+ new

@@ -1,6 +1,6 @@ -# Ably Realtime & REST Client Library 0.8.6 Specification +# Ably Realtime & REST Client Library 0.8.9 Specification ### Ably::Realtime::Auth _(see [spec/acceptance/realtime/auth_spec.rb](./spec/acceptance/realtime/auth_spec.rb))_ * using JSON protocol * with basic auth @@ -429,29 +429,29 @@ * after successfully reconnecting and resuming * [retains connection_id and updates the connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L437) * [emits any error received from Ably but leaves the channels attached](./spec/acceptance/realtime/connection_failures_spec.rb#L452) * [retains channel subscription state](./spec/acceptance/realtime/connection_failures_spec.rb#L483) * when messages were published whilst the client was disconnected - * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L513) + * [receives the messages published whilst offline](./spec/acceptance/realtime/connection_failures_spec.rb#L511) * when failing to resume * because the connection_key is not or no longer valid - * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L556) - * [detaches all channels](./spec/acceptance/realtime/connection_failures_spec.rb#L571) - * [emits an error on the channel and sets the error reason](./spec/acceptance/realtime/connection_failures_spec.rb#L591) + * [updates the connection_id and connection_key](./spec/acceptance/realtime/connection_failures_spec.rb#L554) + * [detaches all channels](./spec/acceptance/realtime/connection_failures_spec.rb#L569) + * [emits an error on the channel and sets the error reason](./spec/acceptance/realtime/connection_failures_spec.rb#L589) * fallback host feature * with custom realtime websocket host option - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L631) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L629) * with custom realtime websocket port option - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L649) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L647) * with non-production environment - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L668) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L666) * with production environment * when the Internet is down - * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L698) + * [never uses a fallback host](./spec/acceptance/realtime/connection_failures_spec.rb#L696) * when the Internet is up - * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L717) - * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L736) + * [uses a fallback host on every subsequent disconnected attempt until suspended](./spec/acceptance/realtime/connection_failures_spec.rb#L716) + * [uses the primary host when suspended, and a fallback host on every subsequent suspended attempt](./spec/acceptance/realtime/connection_failures_spec.rb#L735) ### Ably::Realtime::Connection _(see [spec/acceptance/realtime/connection_spec.rb](./spec/acceptance/realtime/connection_spec.rb))_ * using JSON protocol * intialization @@ -552,73 +552,77 @@ * with a success block that raises an exception * [catches the exception and logs the error](./spec/acceptance/realtime/connection_spec.rb#L768) * when ping times out * [logs a warning](./spec/acceptance/realtime/connection_spec.rb#L781) * [yields to the block with a nil value](./spec/acceptance/realtime/connection_spec.rb#L791) + * #details + * [is nil before connected](./spec/acceptance/realtime/connection_spec.rb#L806) + * [contains the ConnectionDetails object once connected](./spec/acceptance/realtime/connection_spec.rb#L813) + * [contains the new ConnectionDetails object once a subsequent connection is created](./spec/acceptance/realtime/connection_spec.rb#L822) * recovery * #recovery_key - * [is composed of connection key and serial that is kept up to date with each message ACK received](./spec/acceptance/realtime/connection_spec.rb#L828) - * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L851) - * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L880) + * [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) + * [is available when connection is in one of the states: connecting, connected, disconnected, suspended, failed](./spec/acceptance/realtime/connection_spec.rb#L887) + * [is nil when connection is explicitly CLOSED](./spec/acceptance/realtime/connection_spec.rb#L916) * opening a new connection using a recently disconnected connection's #recovery_key * connection#id and connection#key after recovery - * [remains the same](./spec/acceptance/realtime/connection_spec.rb#L892) + * [remains the same for id and party for key](./spec/acceptance/realtime/connection_spec.rb#L928) * when messages have been sent whilst the old connection is disconnected * the new connection - * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L932) + * [recovers server-side queued messages](./spec/acceptance/realtime/connection_spec.rb#L970) * with :recover option * with invalid syntax - * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L958) + * [raises an exception](./spec/acceptance/realtime/connection_spec.rb#L996) * with invalid formatted value sent to server - * [emits a fatal error on the connection object, sets the #error_reason and disconnects](./spec/acceptance/realtime/connection_spec.rb#L967) + * [emits a fatal error on the connection object, sets the #error_reason and disconnects](./spec/acceptance/realtime/connection_spec.rb#L1005) * with expired (missing) value sent to server - * [emits an error on the connection object, sets the #error_reason, yet will connect anyway](./spec/acceptance/realtime/connection_spec.rb#L982) + * [emits an error on the connection object, sets the #error_reason, yet will connect anyway](./spec/acceptance/realtime/connection_spec.rb#L1020) * with many connections simultaneously - * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1001) + * [opens each with a unique connection#id and connection#key](./spec/acceptance/realtime/connection_spec.rb#L1039) * when a state transition is unsupported - * [emits a InvalidStateChange](./spec/acceptance/realtime/connection_spec.rb#L1021) + * [emits a InvalidStateChange](./spec/acceptance/realtime/connection_spec.rb#L1059) * protocol failure * receiving an invalid ProtocolMessage - * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1037) + * [emits an error on the connection and logs a fatal error message](./spec/acceptance/realtime/connection_spec.rb#L1075) * undocumented method * #internet_up? - * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1053) + * [returns a Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1091) * internet up URL protocol * when using TLS for the connection - * [uses TLS for the Internet check to https://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1064) + * [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) * when using a non-secured connection - * [uses TLS for the Internet check to http://internet-up.ably-realtime.com/is-the-internet-up.txt](./spec/acceptance/realtime/connection_spec.rb#L1074) + * [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) * when the Internet is up - * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1105) - * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1112) + * [calls the block with true](./spec/acceptance/realtime/connection_spec.rb#L1143) + * [calls the success callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1150) * with a TLS connection - * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1088) + * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1126) * with a non-TLS connection - * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1098) + * [checks the Internet up URL over TLS](./spec/acceptance/realtime/connection_spec.rb#L1136) * when the Internet is down - * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1127) - * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1134) + * [calls the block with false](./spec/acceptance/realtime/connection_spec.rb#L1165) + * [calls the failure callback of the Deferrable](./spec/acceptance/realtime/connection_spec.rb#L1172) * state change side effects * when connection enters the :disconnected state - * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1148) + * [queues messages to be sent and all channels remain attached](./spec/acceptance/realtime/connection_spec.rb#L1186) * when connection enters the :suspended state - * [detaches the channels and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1181) + * [detaches the channels and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1219) * when connection enters the :failed state - * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1210) + * [sets all channels to failed and prevents publishing of messages on those channels](./spec/acceptance/realtime/connection_spec.rb#L1248) * connection state change - * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1221) + * [emits a ConnectionStateChange object](./spec/acceptance/realtime/connection_spec.rb#L1259) * ConnectionStateChange object - * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1229) - * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1236) - * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1251) + * [has current state](./spec/acceptance/realtime/connection_spec.rb#L1267) + * [has a previous state](./spec/acceptance/realtime/connection_spec.rb#L1274) + * [has an empty reason when there is no error](./spec/acceptance/realtime/connection_spec.rb#L1289) * on failure - * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1264) + * [has a reason Error object when there is an error on the connection](./spec/acceptance/realtime/connection_spec.rb#L1302) * retry_in - * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1279) - * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1286) - * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1296) - * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1306) + * [is nil when a retry is not required](./spec/acceptance/realtime/connection_spec.rb#L1317) + * [is 0 when first attempt to connect fails](./spec/acceptance/realtime/connection_spec.rb#L1324) + * [is 0 when an immediate reconnect will occur](./spec/acceptance/realtime/connection_spec.rb#L1334) + * [contains the next retry period when an immediate reconnect will not occur](./spec/acceptance/realtime/connection_spec.rb#L1344) ### Ably::Realtime::Channel Message _(see [spec/acceptance/realtime/message_spec.rb](./spec/acceptance/realtime/message_spec.rb))_ * using JSON protocol * [sends a String data payload](./spec/acceptance/realtime/message_spec.rb#L25) @@ -754,33 +758,31 @@ * when attaching to a channel with members present * [is false and the presence channel will subsequently be synced](./spec/acceptance/realtime/presence_spec.rb#L497) * 250 existing (present) members on a channel (3 SYNC pages) * requires at least 3 SYNC ProtocolMessages * when a client attaches to the presence channel - * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L530) + * [emits :present for each member](./spec/acceptance/realtime/presence_spec.rb#L533) * and a member leaves before the SYNC operation is complete - * [emits :leave immediately as the member leaves](./spec/acceptance/realtime/presence_spec.rb#L544) - * [ignores presence events with timestamps prior to the current :present event in the MembersMap](./spec/acceptance/realtime/presence_spec.rb#L585) - * [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#L627) + * [emits :leave immediately as the member leaves](./spec/acceptance/realtime/presence_spec.rb#L547) + * [ignores presence events with timestamps prior to the current :present event in the MembersMap](./spec/acceptance/realtime/presence_spec.rb#L588) + * [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) * #get * with :wait_for_sync option set to true - * [waits until sync is complete](./spec/acceptance/realtime/presence_spec.rb#L677) + * [waits until sync is complete](./spec/acceptance/realtime/presence_spec.rb#L680) * by default - * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L694) + * [it does not wait for sync](./spec/acceptance/realtime/presence_spec.rb#L699) * state * once opened - * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L718) + * [once opened, enters the :left state if the channel detaches](./spec/acceptance/realtime/presence_spec.rb#L725) * #enter - * [allows client_id to be set on enter for anonymous clients](./spec/acceptance/realtime/presence_spec.rb#L741) - * [raises an exception if client_id is not set](./spec/acceptance/realtime/presence_spec.rb#L788) * data attribute * when provided as argument option to #enter - * [remains intact following #leave](./spec/acceptance/realtime/presence_spec.rb#L752) + * [changes to value provided in #leave](./spec/acceptance/realtime/presence_spec.rb#L750) * message #connection_id - * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L776) + * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L774) * without necessary capabilities to join presence - * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L800) + * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L793) * it should behave like a public presence method * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54) * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66) * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77) * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) @@ -815,15 +817,15 @@ * False * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227) * if connection fails before success * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271) * #update - * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L812) - * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L837) - * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L847) + * [without previous #enter automatically enters](./spec/acceptance/realtime/presence_spec.rb#L805) + * [updates the data if :data argument provided](./spec/acceptance/realtime/presence_spec.rb#L830) + * [updates the data to nil if :data argument is not provided (assumes nil value)](./spec/acceptance/realtime/presence_spec.rb#L840) * when ENTERED - * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L822) + * [has no effect on the state](./spec/acceptance/realtime/presence_spec.rb#L815) * it should behave like a public presence method * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54) * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66) * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77) * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) @@ -858,20 +860,20 @@ * False * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227) * if connection fails before success * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271) * #leave - * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L921) + * [raises an exception if not entered](./spec/acceptance/realtime/presence_spec.rb#L914) * :data option * when set to a string - * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L866) + * [emits the new data for the leave event](./spec/acceptance/realtime/presence_spec.rb#L859) * when set to nil - * [emits a nil value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L879) - * when not passed as an argument - * [emits the previously defined value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L892) + * [emits the last value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L872) + * when not passed as an argument (i.e. nil) + * [emits the previous value for the data attribute when leaving](./spec/acceptance/realtime/presence_spec.rb#L885) * and sync is complete - * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L905) + * [does not cache members that have left](./spec/acceptance/realtime/presence_spec.rb#L898) * it should behave like a public presence method * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) * [allows a block to be passed in that is executed upon success](./spec/acceptance/realtime/presence_spec.rb#L241) * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L249) * [catches exceptions in the provided method block and logs them to the logger](./spec/acceptance/realtime/presence_spec.rb#L259) @@ -894,21 +896,21 @@ * False * [raises an UnsupportedDataType 40011 exception](./spec/acceptance/realtime/presence_spec.rb#L227) * if connection fails before success * [calls the Deferrable errback if channel is detached](./spec/acceptance/realtime/presence_spec.rb#L271) * :left event - * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L930) - * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L941) + * [emits the data defined in enter](./spec/acceptance/realtime/presence_spec.rb#L923) + * [emits the data defined in update](./spec/acceptance/realtime/presence_spec.rb#L934) * entering/updating/leaving presence state on behalf of another client_id * #enter_client * multiple times on the same channel with different client_ids - * [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#L964) - * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L978) + * [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) + * [enters a channel and sets the data based on the provided :data option](./spec/acceptance/realtime/presence_spec.rb#L971) * message #connection_id - * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L997) + * [matches the current client connection_id](./spec/acceptance/realtime/presence_spec.rb#L990) * without necessary capabilities to enter on behalf of another client - * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1017) + * [calls the Deferrable errback on capabilities failure](./spec/acceptance/realtime/presence_spec.rb#L1010) * it should behave like a public presence method * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54) * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66) * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77) * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) @@ -972,13 +974,13 @@ * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L396) * and an empty client_id * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403) * #update_client * multiple times on the same channel with different client_ids - * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L1031) - * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L1055) - * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L1067) + * [updates the data attribute for the member when :data option provided](./spec/acceptance/realtime/presence_spec.rb#L1024) + * [updates the data attribute to null for the member when :data option is not provided (assumed null)](./spec/acceptance/realtime/presence_spec.rb#L1048) + * [enters if not already entered](./spec/acceptance/realtime/presence_spec.rb#L1060) * it should behave like a public presence method * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54) * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66) * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77) * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) @@ -1043,18 +1045,18 @@ * and an empty client_id * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403) * #leave_client * leaves a channel * multiple times on the same channel with different client_ids - * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L1097) - * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L1121) + * [emits the :leave event for each client_id](./spec/acceptance/realtime/presence_spec.rb#L1090) + * [succeeds if that client_id has not previously entered the channel](./spec/acceptance/realtime/presence_spec.rb#L1114) * with a new value in :data option - * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1145) + * [emits the leave event with the new data value](./spec/acceptance/realtime/presence_spec.rb#L1138) * with a nil value in :data option - * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1158) + * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1151) * with no :data option - * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1171) + * [emits the leave event with the previous value as a convenience](./spec/acceptance/realtime/presence_spec.rb#L1164) * it should behave like a public presence method * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L54) * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L66) * [implicitly attaches the channel](./spec/acceptance/realtime/presence_spec.rb#L77) * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L234) @@ -1117,64 +1119,64 @@ * and a wildcard client_id * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L396) * and an empty client_id * [throws an exception](./spec/acceptance/realtime/presence_spec.rb#L403) * #get - * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1190) - * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1195) - * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1202) - * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1209) - * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L1219) - * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L1291) - * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1306) - * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1328) - * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L1352) + * [returns a SafeDeferrable that catches exceptions in callbacks and logs them](./spec/acceptance/realtime/presence_spec.rb#L1183) + * [calls the Deferrable callback on success](./spec/acceptance/realtime/presence_spec.rb#L1188) + * [catches exceptions in the provided method block](./spec/acceptance/realtime/presence_spec.rb#L1195) + * [raise an exception if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1202) + * [raise an exception if the channel is failed](./spec/acceptance/realtime/presence_spec.rb#L1212) + * [returns the current members on the channel](./spec/acceptance/realtime/presence_spec.rb#L1292) + * [filters by connection_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1307) + * [filters by client_id option if provided](./spec/acceptance/realtime/presence_spec.rb#L1329) + * [does not wait for SYNC to complete if :wait_for_sync option is false](./spec/acceptance/realtime/presence_spec.rb#L1353) * during a sync * when :wait_for_sync is true - * [fails if the connection fails](./spec/acceptance/realtime/presence_spec.rb#L1242) - * [fails if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1265) + * [fails if the connection fails](./spec/acceptance/realtime/presence_spec.rb#L1243) + * [fails if the channel is detached](./spec/acceptance/realtime/presence_spec.rb#L1266) * when a member enters and then leaves - * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1362) + * [has no members](./spec/acceptance/realtime/presence_spec.rb#L1363) * with lots of members on different clients - * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1381) + * [returns a complete list of members on all clients](./spec/acceptance/realtime/presence_spec.rb#L1382) * #subscribe - * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1456) + * [implicitly attaches](./spec/acceptance/realtime/presence_spec.rb#L1457) * with no arguments - * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1417) + * [calls the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1418) * with event name - * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1437) + * [calls the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1438) * #unsubscribe * with no arguments - * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1469) + * [removes the callback for all presence events](./spec/acceptance/realtime/presence_spec.rb#L1470) * with event name - * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1487) + * [removes the callback for specified presence event](./spec/acceptance/realtime/presence_spec.rb#L1488) * REST #get - * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1506) - * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1519) + * [returns current members](./spec/acceptance/realtime/presence_spec.rb#L1507) + * [returns no members once left](./spec/acceptance/realtime/presence_spec.rb#L1520) * client_id with ASCII_8BIT * in connection set up - * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1536) + * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1537) * in channel options - * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1549) + * [is converted into UTF_8](./spec/acceptance/realtime/presence_spec.rb#L1550) * encoding and decoding of presence message data - * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1573) + * [encrypts presence message data](./spec/acceptance/realtime/presence_spec.rb#L1576) * #subscribe - * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L1592) - * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L1604) - * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L1618) + * [emits decrypted enter events](./spec/acceptance/realtime/presence_spec.rb#L1595) + * [emits decrypted update events](./spec/acceptance/realtime/presence_spec.rb#L1607) + * [emits previously set data for leave events](./spec/acceptance/realtime/presence_spec.rb#L1621) * #get - * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1634) + * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1637) * REST #get - * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1647) + * [returns a list of members with decrypted data](./spec/acceptance/realtime/presence_spec.rb#L1650) * when cipher settings do not match publisher - * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L1662) - * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L1675) + * [delivers an unencoded presence message left with encoding value](./spec/acceptance/realtime/presence_spec.rb#L1665) + * [emits an error when cipher does not match and presence data cannot be decoded](./spec/acceptance/realtime/presence_spec.rb#L1678) * leaving - * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L1692) - * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L1702) + * [expect :left event once underlying connection is closed](./spec/acceptance/realtime/presence_spec.rb#L1695) + * [expect :left event with client data from enter event](./spec/acceptance/realtime/presence_spec.rb#L1705) * connection failure mid-way through a large member sync - * [resumes the SYNC operation](./spec/acceptance/realtime/presence_spec.rb#L1721) + * [resumes the SYNC operation](./spec/acceptance/realtime/presence_spec.rb#L1724) ### Ably::Realtime::Client#stats _(see [spec/acceptance/realtime/stats_spec.rb](./spec/acceptance/realtime/stats_spec.rb))_ * using JSON protocol * fetching stats @@ -1864,10 +1866,49 @@ * [is not required](./spec/unit/models/channel_state_change_spec.rb#L30) * [is an attribute](./spec/unit/models/channel_state_change_spec.rb#L34) * invalid attributes * [raises an argument error](./spec/unit/models/channel_state_change_spec.rb#L40) +### Ably::Models::CipherParams +_(see [spec/unit/models/cipher_params_spec.rb](./spec/unit/models/cipher_params_spec.rb))_ + * :key missing from constructor + * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L8) + * #key + * with :key in constructor + * as nil + * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L20) + * as a base64 encoded string + * [is a binary representation of the base64 encoded string](./spec/unit/models/cipher_params_spec.rb#L29) + * as a URL safe base64 encoded string + * [is a binary representation of the URL safe base64 encoded string](./spec/unit/models/cipher_params_spec.rb#L40) + * as a binary encoded string + * [contains the binary string](./spec/unit/models/cipher_params_spec.rb#L48) + * with an incompatible :key_length constructor param + * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L58) + * with an unsupported :key_length for aes-cbc encryption + * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L67) + * with an invalid type + * [raises an exception](./spec/unit/models/cipher_params_spec.rb#L76) + * with specified params in the constructor + * #cipher_type + * [contains the complete algorithm string as an upper case string](./spec/unit/models/cipher_params_spec.rb#L88) + * #mode + * [contains the mode](./spec/unit/models/cipher_params_spec.rb#L94) + * #algorithm + * [contains the algorithm](./spec/unit/models/cipher_params_spec.rb#L100) + * #key_length + * [contains the key_length](./spec/unit/models/cipher_params_spec.rb#L106) + * with combined param in the constructor + * #cipher_type + * [contains the complete algorithm string as an upper case string](./spec/unit/models/cipher_params_spec.rb#L117) + * #mode + * [contains the mode](./spec/unit/models/cipher_params_spec.rb#L123) + * #algorithm + * [contains the algorithm](./spec/unit/models/cipher_params_spec.rb#L129) + * #key_length + * [contains the key_length](./spec/unit/models/cipher_params_spec.rb#L135) + ### Ably::Models::ConnectionDetails _(see [spec/unit/models/connection_details_spec.rb](./spec/unit/models/connection_details_spec.rb))_ * behaves like a model * attributes * #client_id @@ -1991,82 +2032,89 @@ * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L60) * [returns ASCII_8BIT encoded binary data](./spec/unit/models/message_encoders/cipher_spec.rb#L64) * message with another payload * [leaves the message data intact](./spec/unit/models/message_encoders/cipher_spec.rb#L72) * [leaves the encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L76) - * with invalid channel_option cipher params - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L87) - * without any configured encryption - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L97) + * 256 bit key + * with invalid channel_option cipher params + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L90) + * without any configured encryption + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L100) * with invalid cipher data - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L106) + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L110) * with AES-256-CBC * message with cipher payload - * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L122) - * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L126) + * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L127) + * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L131) * #encode * with channel set up for AES-128-CBC * with encrypted set to true * message with string payload - * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L146) - * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L151) + * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L151) + * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L156) * message with binary payload - * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L159) - * [adds the encoding without utf-8 prefixed](./spec/unit/models/message_encoders/cipher_spec.rb#L164) - * [returns ASCII_8BIT encoded binary data](./spec/unit/models/message_encoders/cipher_spec.rb#L168) + * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L164) + * [adds the encoding without utf-8 prefixed](./spec/unit/models/message_encoders/cipher_spec.rb#L169) + * [returns ASCII_8BIT encoded binary data](./spec/unit/models/message_encoders/cipher_spec.rb#L173) * message with json payload - * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L176) - * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L181) + * [encodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L181) + * [adds the encoding with utf-8](./spec/unit/models/message_encoders/cipher_spec.rb#L186) * message with existing cipher encoding before - * [leaves message intact as it is already encrypted](./spec/unit/models/message_encoders/cipher_spec.rb#L189) - * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L193) + * [leaves message intact as it is already encrypted](./spec/unit/models/message_encoders/cipher_spec.rb#L194) + * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L198) * with encryption set to to false - * [leaves message intact as encryption is not enable](./spec/unit/models/message_encoders/cipher_spec.rb#L202) - * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L206) + * [leaves message intact as encryption is not enable](./spec/unit/models/message_encoders/cipher_spec.rb#L207) + * [leaves encoding intact](./spec/unit/models/message_encoders/cipher_spec.rb#L211) * channel_option cipher params * have invalid key length - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L218) + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L223) * have invalid algorithm - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L225) + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L230) * have missing key - * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L232) + * [raise an exception](./spec/unit/models/message_encoders/cipher_spec.rb#L237) * with AES-256-CBC * message with cipher payload - * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L249) - * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L254) + * [decodes cipher](./spec/unit/models/message_encoders/cipher_spec.rb#L255) + * [strips the encoding](./spec/unit/models/message_encoders/cipher_spec.rb#L260) ### Ably::Models::MessageEncoders::Json _(see [spec/unit/models/message_encoders/json_spec.rb](./spec/unit/models/message_encoders/json_spec.rb))_ * #decode * message with json payload * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L24) * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L28) - * message with json payload before other payloads + * message with json payload in camelCase * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L36) * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L40) + * message with json payload before other payloads + * [decodes json](./spec/unit/models/message_encoders/json_spec.rb#L48) + * [strips the encoding](./spec/unit/models/message_encoders/json_spec.rb#L52) * message with another payload - * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L48) - * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L52) + * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L60) + * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L64) * #encode * message with hash payload - * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L66) - * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L70) - * already encoded message with hash payload * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L78) * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L82) - * message with Array payload - * [encodes Array payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L90) + * message with hash payload and underscore case keys + * [encodes hash payload data as json and leaves underscore case in tact](./spec/unit/models/message_encoders/json_spec.rb#L90) * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L94) + * already encoded message with hash payload + * [encodes hash payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L102) + * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L106) + * message with Array payload + * [encodes Array payload data as json](./spec/unit/models/message_encoders/json_spec.rb#L114) + * [adds the encoding](./spec/unit/models/message_encoders/json_spec.rb#L118) * message with UTF-8 payload - * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L102) - * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L106) - * message with nil payload - * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L114) - * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L118) - * message with no data payload * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L126) * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L130) + * message with nil payload + * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L138) + * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L142) + * message with no data payload + * [leaves the message data intact](./spec/unit/models/message_encoders/json_spec.rb#L150) + * [leaves the encoding intact](./spec/unit/models/message_encoders/json_spec.rb#L154) ### Ably::Models::MessageEncoders::Utf8 _(see [spec/unit/models/message_encoders/utf8_spec.rb](./spec/unit/models/message_encoders/utf8_spec.rb))_ * #decode * message with utf8 payload @@ -2510,33 +2558,34 @@ * [prevents changes](./spec/shared/model_behaviour.rb#L76) * [dups options](./spec/shared/model_behaviour.rb#L80) * attributes * #capability * [retrieves attribute :capability as parsed JSON](./spec/unit/models/token_details_spec.rb#L21) - * #issued with :issued option as milliseconds in constructor - * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L31) - * #issued with :issued option as a Time in constructor - * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L40) - * #issued when converted to JSON - * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L49) - * #expires with :expires option as milliseconds in constructor - * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L31) - * #expires with :expires option as a Time in constructor - * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L40) - * #expires when converted to JSON - * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L49) + * + * #issued with :issued option as milliseconds in constructor + * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L32) + * #issued with :issued option as a Time in constructor + * [retrieves attribute :issued as Time](./spec/unit/models/token_details_spec.rb#L41) + * #issued when converted to JSON + * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L50) + * #expires with :expires option as milliseconds in constructor + * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L32) + * #expires with :expires option as a Time in constructor + * [retrieves attribute :expires as Time](./spec/unit/models/token_details_spec.rb#L41) + * #expires when converted to JSON + * [is in milliseconds](./spec/unit/models/token_details_spec.rb#L50) * #expired? * once grace period buffer has passed - * [is true](./spec/unit/models/token_details_spec.rb#L61) + * [is true](./spec/unit/models/token_details_spec.rb#L63) * within grace period buffer - * [is false](./spec/unit/models/token_details_spec.rb#L69) + * [is false](./spec/unit/models/token_details_spec.rb#L71) * when expires is not available (i.e. string tokens) - * [is always false](./spec/unit/models/token_details_spec.rb#L77) + * [is always false](./spec/unit/models/token_details_spec.rb#L79) * == - * [is true when attributes are the same](./spec/unit/models/token_details_spec.rb#L87) - * [is false when attributes are not the same](./spec/unit/models/token_details_spec.rb#L92) - * [is false when class type differs](./spec/unit/models/token_details_spec.rb#L96) + * [is true when attributes are the same](./spec/unit/models/token_details_spec.rb#L89) + * [is false when attributes are not the same](./spec/unit/models/token_details_spec.rb#L94) + * [is false when class type differs](./spec/unit/models/token_details_spec.rb#L98) ### Ably::Models::TokenRequest _(see [spec/unit/models/token_request_spec.rb](./spec/unit/models/token_request_spec.rb))_ * behaves like a model * attributes @@ -2958,30 +3007,38 @@ * [constructor returns an Ably::Rest::Client](./spec/unit/rest/rest_spec.rb#L7) ### Ably::Util::Crypto _(see [spec/unit/util/crypto_spec.rb](./spec/unit/util/crypto_spec.rb))_ * defaults - * [match other client libraries](./spec/unit/util/crypto_spec.rb#L18) + * [match other client libraries](./spec/unit/util/crypto_spec.rb#L19) * get_default_params - * [uses the defaults and generates a key if not provided](./spec/unit/util/crypto_spec.rb#L25) - * [uses the defaults and sets the key size when key is provided](./spec/unit/util/crypto_spec.rb#L32) + * with just a :key param + * [uses the defaults](./spec/unit/util/crypto_spec.rb#L29) + * [contains the provided key](./spec/unit/util/crypto_spec.rb#L35) + * [returns a CipherParams object](./spec/unit/util/crypto_spec.rb#L39) + * without a :key param + * [raises an exception](./spec/unit/util/crypto_spec.rb#L47) + * with a base64-encoded :key param + * [converts the key to binary](./spec/unit/util/crypto_spec.rb#L55) + * with provided params + * [overrides the defaults](./spec/unit/util/crypto_spec.rb#L67) * encrypts & decrypt - * [#encrypt encrypts a string](./spec/unit/util/crypto_spec.rb#L46) - * [#decrypt decrypts a string](./spec/unit/util/crypto_spec.rb#L51) + * [#encrypt encrypts a string](./spec/unit/util/crypto_spec.rb#L79) + * [#decrypt decrypts a string](./spec/unit/util/crypto_spec.rb#L84) * encrypting an empty string - * [raises an ArgumentError](./spec/unit/util/crypto_spec.rb#L60) + * [raises an ArgumentError](./spec/unit/util/crypto_spec.rb#L93) * using shared client lib fixture data * with AES-128-CBC * behaves like an Ably encrypter and decrypter * text payload - * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L83) - * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L87) + * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L116) + * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L120) * with AES-256-CBC * behaves like an Ably encrypter and decrypter * text payload - * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L83) - * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L87) + * [encrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L116) + * [decrypts exactly the same binary data as other client libraries](./spec/unit/util/crypto_spec.rb#L120) ### Ably::Util::PubSub _(see [spec/unit/util/pub_sub_spec.rb](./spec/unit/util/pub_sub_spec.rb))_ * event fan out * [#publish allows publishing to more than on subscriber](./spec/unit/util/pub_sub_spec.rb#L11) @@ -2993,8 +3050,8 @@ ------- ## Test summary - * Passing tests: 1467 + * Passing tests: 1492 * Pending tests: 6 * Failing tests: 0