ably 1.2.1 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/.rspec_parallel +3 -0
  3. data/.github/workflows/check.yml +24 -4
  4. data/.github/workflows/docs.yml +36 -0
  5. data/CHANGELOG.md +26 -0
  6. data/INTRO.md +14 -0
  7. data/ably.gemspec +1 -0
  8. data/lib/ably/auth.rb +26 -23
  9. data/lib/ably/models/auth_details.rb +9 -6
  10. data/lib/ably/models/channel_details.rb +69 -0
  11. data/lib/ably/models/channel_metrics.rb +107 -0
  12. data/lib/ably/models/channel_occupancy.rb +50 -0
  13. data/lib/ably/models/channel_options.rb +26 -3
  14. data/lib/ably/models/channel_state_change.rb +45 -15
  15. data/lib/ably/models/channel_status.rb +63 -0
  16. data/lib/ably/models/cipher_params.rb +36 -13
  17. data/lib/ably/models/connection_details.rb +91 -10
  18. data/lib/ably/models/connection_state_change.rb +54 -15
  19. data/lib/ably/models/delta_extras.rb +6 -7
  20. data/lib/ably/models/device_details.rb +60 -21
  21. data/lib/ably/models/device_push_details.rb +27 -19
  22. data/lib/ably/models/error_info.rb +59 -17
  23. data/lib/ably/models/http_paginated_response.rb +27 -5
  24. data/lib/ably/models/idiomatic_ruby_wrapper.rb +3 -2
  25. data/lib/ably/models/message.rb +64 -24
  26. data/lib/ably/models/message_encoders/base.rb +6 -0
  27. data/lib/ably/models/paginated_result.rb +29 -14
  28. data/lib/ably/models/presence_message.rb +72 -22
  29. data/lib/ably/models/protocol_message.rb +0 -4
  30. data/lib/ably/models/push_channel_subscription.rb +40 -15
  31. data/lib/ably/models/stats.rb +76 -40
  32. data/lib/ably/models/stats_types.rb +16 -40
  33. data/lib/ably/models/token_details.rb +34 -12
  34. data/lib/ably/models/token_request.rb +63 -2
  35. data/lib/ably/modules/async_wrapper.rb +1 -0
  36. data/lib/ably/modules/enum.rb +2 -0
  37. data/lib/ably/modules/event_emitter.rb +14 -1
  38. data/lib/ably/modules/model_common.rb +5 -0
  39. data/lib/ably/modules/state_emitter.rb +2 -0
  40. data/lib/ably/modules/state_machine.rb +4 -0
  41. data/lib/ably/realtime/channel/channel_properties.rb +9 -2
  42. data/lib/ably/realtime/channel/publisher.rb +2 -0
  43. data/lib/ably/realtime/channel/push_channel.rb +17 -10
  44. data/lib/ably/realtime/channel.rb +79 -42
  45. data/lib/ably/realtime/channels.rb +4 -3
  46. data/lib/ably/realtime/client/incoming_message_dispatcher.rb +6 -14
  47. data/lib/ably/realtime/client.rb +53 -32
  48. data/lib/ably/realtime/connection/connection_manager.rb +4 -0
  49. data/lib/ably/realtime/connection/websocket_transport.rb +4 -2
  50. data/lib/ably/realtime/connection.rb +94 -55
  51. data/lib/ably/realtime/presence.rb +61 -36
  52. data/lib/ably/realtime/push/admin.rb +16 -2
  53. data/lib/ably/realtime/push.rb +15 -3
  54. data/lib/ably/rest/channel/push_channel.rb +0 -3
  55. data/lib/ably/rest/channel.rb +33 -18
  56. data/lib/ably/rest/channels.rb +6 -3
  57. data/lib/ably/rest/client.rb +41 -35
  58. data/lib/ably/rest/presence.rb +27 -12
  59. data/lib/ably/rest/push/admin.rb +4 -0
  60. data/lib/ably/rest/push/device_registrations.rb +13 -2
  61. data/lib/ably/rest/push.rb +2 -0
  62. data/lib/ably/util/crypto.rb +14 -10
  63. data/lib/ably/version.rb +1 -1
  64. data/spec/acceptance/realtime/connection_spec.rb +0 -15
  65. data/spec/acceptance/realtime/message_spec.rb +3 -3
  66. data/spec/acceptance/rest/channel_spec.rb +18 -0
  67. data/spec/unit/models/channel_details_spec.rb +30 -0
  68. data/spec/unit/models/channel_metrics_spec.rb +42 -0
  69. data/spec/unit/models/channel_occupancy_spec.rb +17 -0
  70. data/spec/unit/models/channel_status_spec.rb +36 -0
  71. data/spec/unit/models/protocol_message_spec.rb +0 -26
  72. data/spec/unit/realtime/incoming_message_dispatcher_spec.rb +0 -38
  73. metadata +32 -3
@@ -6,6 +6,7 @@ module Ably::Modules
6
6
  # @param push_channel_subscription [Ably::Models::PushChannelSubscription,Hash,nil] A device details object
7
7
  #
8
8
  # @return [Ably::Models::PushChannelSubscription]
9
+ #
9
10
  def PushChannelSubscription(push_channel_subscription)
10
11
  case push_channel_subscription
11
12
  when Ably::Models::PushChannelSubscription
@@ -18,20 +19,14 @@ module Ably::Modules
18
19
  end
19
20
 
20
21
  module Ably::Models
21
- # An object representing a devices details, used currently for push notifications
22
- #
23
- # @!attribute [r] channel
24
- # @return [String] The realtime pub/sub channel this subscription is registered to
25
- # @!attribute [r] client_id
26
- # @return [String] Client ID that is assigned to one or more registered push devices
27
- # @!attribute [r] device_id
28
- # @return [String] Unique device identifier assigned to the push device
22
+ # Contains the subscriptions of a device, or a group of devices sharing the same clientId,
23
+ # has to a channel in order to receive push notifications.
29
24
  #
30
25
  class PushChannelSubscription < Ably::Exceptions::BaseAblyException
31
26
  include Ably::Modules::ModelCommon
32
27
 
33
28
  # @param hash_object [Hash,nil] Device detail attributes
34
- #a
29
+ #
35
30
  def initialize(hash_object = {})
36
31
  @raw_hash_object = hash_object || {}
37
32
  @hash_object = IdiomaticRubyWrapper(hash_object)
@@ -47,7 +42,9 @@ module Ably::Models
47
42
  end
48
43
  end
49
44
 
50
- # Constructor for channel subscription by device ID
45
+ # A static factory method to create a PushChannelSubscription object for a channel and single device.
46
+ #
47
+ # @spec PSC5
51
48
  #
52
49
  # @param channel [String] the realtime pub/sub channel this subscription is registered to
53
50
  # @param device_id [String] Unique device identifier assigned to the push device
@@ -58,7 +55,9 @@ module Ably::Models
58
55
  PushChannelSubscription.new(channel: channel, device_id: device_id)
59
56
  end
60
57
 
61
- # Constructor for channel subscription by client ID
58
+ # A static factory method to create a PushChannelSubscription object for a channel and group of devices sharing the same clientId.
59
+ #
60
+ # @spec PSC5
62
61
  #
63
62
  # @param channel [String] the realtime pub/sub channel this subscription is registered to
64
63
  # @param client_id [String] Client ID that is assigned to one or more registered push devices
@@ -69,11 +68,37 @@ module Ably::Models
69
68
  PushChannelSubscription.new(channel: channel, client_id: client_id)
70
69
  end
71
70
 
72
- %w(channel client_id device_id).each do |attribute|
73
- define_method attribute do
74
- attributes[attribute.to_sym]
75
- end
71
+ # The channel the push notification subscription is for.
72
+ #
73
+ # @spec PCS4
74
+ #
75
+ # @return [String]
76
+ #
77
+ def channel
78
+ attributes[:channel]
79
+ end
76
80
 
81
+ # The ID of the client the device, or devices are associated to.
82
+ #
83
+ # @spec PCS3, PCS6
84
+ #
85
+ # @return [String]
86
+ #
87
+ def client_id
88
+ attributes[:client_id]
89
+ end
90
+
91
+ # The unique ID of the device.
92
+ #
93
+ # @spec PCS2, PCS5, PCS6
94
+ #
95
+ # @return [String]
96
+ #
97
+ def device_id
98
+ attributes[:device_id]
99
+ end
100
+
101
+ %w(channel client_id device_id).each do |attribute|
77
102
  define_method "#{attribute}=" do |val|
78
103
  unless val.nil? || val.kind_of?(String)
79
104
  raise ArgumentError, "#{attribute} must be nil or a string value"
@@ -17,27 +17,17 @@ module Ably::Models
17
17
 
18
18
  # A class representing an individual statistic for a specified {#interval_id}
19
19
  #
20
- # @!attribute [r] all
21
- # @return [Stats::MessageTypes] Breakdown of summary stats for all message types
22
- # @!attribute [r] inbound
23
- # @return [Stats::MessageTraffic] Breakdown of summary stats for traffic over various transport types for all inbound messages
24
- # @!attribute [r] outbound
25
- # @return [Stats::MessageTraffic] Breakdown of summary stats for traffic over various transport types for all outbound messages
26
- # @!attribute [r] persisted
27
- # @return [Stats::MessageTypes] Breakdown of summary stats for all persisted messages
28
- # @!attribute [r] connections
29
- # @return [Stats::ConnectionTypes] A breakdown of summary stats data for different (TLS vs non-TLS) connection types.
30
- # @!attribute [r] channels
31
- # @return [Stats::ResourceCount] Aggregate data for usage of Channels
32
- # @!attribute [r] api_requests
33
- # @return [Stats::RequestCount] Aggregate data for numbers of API requests
34
- # @!attribute [r] token_requests
35
- # @return [Stats::RequestCount] Aggregate data for numbers of Token requests
36
- #
37
20
  class Stats
38
21
  include Ably::Modules::ModelCommon
39
22
  extend Ably::Modules::Enum
40
23
 
24
+ # Describes the interval unit over which statistics are gathered.
25
+ #
26
+ # MINUTE Interval unit over which statistics are gathered as minutes.
27
+ # HOUR Interval unit over which statistics are gathered as hours.
28
+ # DAY Interval unit over which statistics are gathered as days.
29
+ # MONTH Interval unit over which statistics are gathered as months.
30
+ #
41
31
  GRANULARITY = ruby_enum('GRANULARITY',
42
32
  :minute,
43
33
  :hour,
@@ -88,13 +78,13 @@ module Ably::Models
88
78
  Time.strptime("#{interval_id} +0000", "#{format} %z").utc
89
79
  end
90
80
 
91
- # Returns the {GRANULARITY} determined from the interval_id
81
+ # Returns the {Symbol} determined from the interval_id
92
82
  # @example
93
83
  # Stats.granularity_from_interval_id('2015-01-01:10') # => :hour
94
84
  #
95
85
  # @param interval_id [String]
96
86
  #
97
- # @return [GRANULARITY] Granularity Enum for the interval_id
87
+ # @return [Symbol]
98
88
  #
99
89
  def granularity_from_interval_id(interval_id)
100
90
  raise ArgumentError, 'Interval ID must be a string' unless interval_id.kind_of?(String)
@@ -120,68 +110,114 @@ module Ably::Models
120
110
  set_attributes_object hash_object
121
111
  end
122
112
 
123
- # Aggregates inbound and outbound messages
124
- # @return {Stats::MessageTypes}
113
+ # A {Ably::Models::Stats::MessageTypes} object containing the aggregate count of all message stats.
114
+ #
115
+ # @spec TS12e
116
+ #
117
+ # @return [Stats::MessageTypes]
118
+ #
125
119
  def all
126
120
  @all ||= Stats::MessageTypes.new(attributes[:all])
127
121
  end
128
122
 
129
- # All inbound messages i.e. received by Ably from clients
130
- # @return {Stats::MessageTraffic}
123
+ # A {Ably::Models::Stats::MessageTraffic} object containing the aggregate count of inbound message stats.
124
+ #
125
+ # @spec TS12f
126
+ #
127
+ # @return [Ably::Models::Stats::MessageTraffic]
128
+ #
131
129
  def inbound
132
130
  @inbound ||= Stats::MessageTraffic.new(attributes[:inbound])
133
131
  end
134
132
 
135
- # All outbound messages i.e. sent from Ably to clients
136
- # @return {Stats::MessageTraffic}
133
+ # A {Ably::Models::Stats::MessageTraffic} object containing the aggregate count of outbound message stats.
134
+ #
135
+ # @spec TS12g
136
+ #
137
+ # @return [Ably::Models::Stats::MessageTraffic]
138
+ #
137
139
  def outbound
138
140
  @outbound ||= Stats::MessageTraffic.new(attributes[:outbound])
139
141
  end
140
142
 
141
- # Messages persisted for later retrieval via the history API
142
- # @return {Stats::MessageTypes}
143
+ # A {Ably::Models::Stats::MessageTraffic} object containing the aggregate count of persisted message stats.
144
+ #
145
+ # @spec TS12h
146
+ #
147
+ # @return [Ably::Models::Stats::MessageTraffic]
148
+ #
143
149
  def persisted
144
150
  @persisted ||= Stats::MessageTypes.new(attributes[:persisted])
145
151
  end
146
152
 
147
- # Breakdown of connection stats data for different (TLS vs non-TLS) connection types
148
- # @return {Stats::ConnectionTypes}
153
+ # A {Ably::Models::Stats::ConnectionTypes} object containing a breakdown of connection related stats, such as min, mean and peak connections.
154
+ #
155
+ # @spec TS12i
156
+ #
157
+ # @return [Ably::Models::Stats::ConnectionTypes]
158
+ #
149
159
  def connections
150
160
  @connections ||= Stats::ConnectionTypes.new(attributes[:connections])
151
161
  end
152
162
 
153
- # Breakdown of channels stats
154
- # @return {Stats::ResourceCount}
163
+ # A {Ably::Models::Stats::ResourceCount} object containing a breakdown of connection related stats, such as min, mean and peak connections.
164
+ #
165
+ # @spec TS12j
166
+ #
167
+ # @return [Ably::Models::Stats::ResourceCount]
168
+ #
155
169
  def channels
156
170
  @channels ||= Stats::ResourceCount.new(attributes[:channels])
157
171
  end
158
172
 
159
- # Breakdown of API requests received via the REST API
160
- # @return {Stats::RequestCount}
173
+ # A {Ably::Models::Stats::RequestCount} object containing a breakdown of API Requests.
174
+ #
175
+ # @spec TS12k
176
+ #
177
+ # @return [Ably::Models::Stats::RequestCount]
178
+ #
161
179
  def api_requests
162
180
  @api_requests ||= Stats::RequestCount.new(attributes[:api_requests])
163
181
  end
164
182
 
165
- # Breakdown of Token requests received via the REST API
166
- # @return {Stats::RequestCount}
183
+ # A {Ably::Models::Stats::RequestCount} object containing a breakdown of Ably Token requests.
184
+ #
185
+ # @spec TS12l
186
+ #
187
+ # @return [Ably::Models::Stats::RequestCount]
188
+ #
167
189
  def token_requests
168
190
  @token_requests ||= Stats::RequestCount.new(attributes[:token_requests])
169
191
  end
170
192
 
171
- # @!attribute [r] interval_id
172
- # @return [String] The interval that this statistic applies to, see {GRANULARITY} and {INTERVAL_FORMAT_STRING}
193
+ # The UTC time at which the time period covered begins. If unit is set to minute this will be in
194
+ # the format YYYY-mm-dd:HH:MM, if hour it will be YYYY-mm-dd:HH, if day it will be YYYY-mm-dd:00
195
+ # and if month it will be YYYY-mm-01:00.
196
+ #
197
+ # @spec TS12a
198
+ #
199
+ # @return [String]
200
+ #
173
201
  def interval_id
174
202
  attributes.fetch(:interval_id)
175
203
  end
176
204
 
177
- # @!attribute [r] interval_time
178
- # @return [Time] A Time object representing the start of the interval
205
+ # Represents the intervalId as a time object.
206
+ #
207
+ # @spec TS12b
208
+ #
209
+ # @return [Time]
210
+ #
179
211
  def interval_time
180
212
  self.class.from_interval_id(interval_id)
181
213
  end
182
214
 
183
- # @!attribute [r] interval_granularity
215
+ # The length of the interval the stats span. Values will be a [StatsIntervalGranularity]{@link StatsIntervalGranularity}.
216
+ #
217
+ # @spec TS12c
218
+ #
184
219
  # @return [GRANULARITY] The granularity of the interval for the stat such as :day, :hour, :minute, see {GRANULARITY}
220
+ #
185
221
  def interval_granularity
186
222
  self.class.granularity_from_interval_id(interval_id)
187
223
  end
@@ -59,71 +59,47 @@ module Ably::Models
59
59
  end
60
60
 
61
61
  # MessageCount contains aggregate counts for messages and data transferred
62
- # @!attribute [r] count
63
- # @return [Integer] count of all messages
64
- # @!attribute [r] data
65
- # @return [Integer] total data transferred for all messages in bytes
62
+ #
63
+ # @spec TS5a, TS5b
64
+ #
66
65
  class MessageCount < StatsStruct
67
66
  coerce_attributes :count, :data, into: IntegerDefaultZero
68
67
  end
69
68
 
70
69
  # RequestCount contains aggregate counts for requests made
71
- # @!attribute [r] succeeded
72
- # @return [Integer] requests succeeded
73
- # @!attribute [r] failed
74
- # @return [Integer] requests failed
75
- # @!attribute [r] refused
76
- # @return [Integer] requests refused typically as a result of permissions or a limit being exceeded
70
+ #
71
+ # @spec TS8a, TS8b, TS8c
72
+ #
77
73
  class RequestCount < StatsStruct
78
74
  coerce_attributes :succeeded, :failed, :refused, into: IntegerDefaultZero
79
75
  end
80
76
 
81
77
  # ResourceCount contains aggregate data for usage of a resource in a specific scope
82
- # @!attribute [r] opened
83
- # @return [Integer] total resources of this type opened
84
- # @!attribute [r] peak
85
- # @return [Integer] peak resources of this type used for this period
86
- # @!attribute [r] mean
87
- # @return [Integer] average resources of this type used for this period
88
- # @!attribute [r] min
89
- # @return [Integer] minimum total resources of this type used for this period
90
- # @!attribute [r] refused
91
- # @return [Integer] resource requests refused within this period
78
+ #
92
79
  class ResourceCount < StatsStruct
93
80
  coerce_attributes :opened, :peak, :mean, :min, :refused, into: IntegerDefaultZero
94
81
  end
95
82
 
96
83
  # ConnectionTypes contains a breakdown of summary stats data for different (TLS vs non-TLS) connection types
97
- # @!attribute [r] tls
98
- # @return [ResourceCount] TLS connection count
99
- # @!attribute [r] plain
100
- # @return [ResourceCount] non-TLS connection count (unencrypted)
101
- # @!attribute [r] all
102
- # @return [ResourceCount] all connection count (includes both TLS & non-TLS connections)
84
+ #
85
+ # @spec TS4a, TS4b, TS4c
86
+ #
103
87
  class ConnectionTypes < StatsStruct
104
88
  coerce_attributes :tls, :plain, :all, into: ResourceCount
105
89
  end
106
90
 
107
91
  # MessageTypes contains a breakdown of summary stats data for different (message vs presence) message types
108
- # @!attribute [r] messages
109
- # @return [MessageCount] count of channel messages
110
- # @!attribute [r] presence
111
- # @return [MessageCount] count of presence messages
112
- # @!attribute [r] all
113
- # @return [MessageCount] all messages count (includes both presence & messages)
92
+ #
93
+ # @spec TS6a, TS6b, TS6c
94
+ #
114
95
  class MessageTypes < StatsStruct
115
96
  coerce_attributes :messages, :presence, :all, into: MessageCount
116
97
  end
117
98
 
118
99
  # MessageTraffic contains a breakdown of summary stats data for traffic over various transport types
119
- # @!attribute [r] realtime
120
- # @return [MessageTypes] count of messages transferred over a realtime transport such as WebSockets
121
- # @!attribute [r] rest
122
- # @return [MessageTypes] count of messages transferred using REST
123
- # @!attribute [r] webhook
124
- # @return [MessageTypes] count of messages delivered using WebHooks
125
- # @!attribute [r] all
126
- # @return [MessageTypes] all messages count (includes realtime, rest and webhook messages)
100
+ #
101
+ # @spec TS7a, TS7b, TS7c, TS7d
102
+ #
127
103
  class MessageTraffic < StatsStruct
128
104
  coerce_attributes :realtime, :rest, :webhook, :all, into: MessageTypes
129
105
  end
@@ -4,6 +4,7 @@ module Ably::Models
4
4
  # @param attributes (see #initialize)
5
5
  #
6
6
  # @return [TokenDetails]
7
+ #
7
8
  def self.TokenDetails(attributes)
8
9
  case attributes
9
10
  when TokenDetails
@@ -13,11 +14,7 @@ module Ably::Models
13
14
  end
14
15
  end
15
16
 
16
- # TokenDetails is a class providing details of the token string and the token's associated metadata,
17
- # constructed from the response from Ably when request in a token via the REST API.
18
- #
19
- # Ruby {http://ruby-doc.org/core/Time.html Time} objects are supported in place of Ably ms since epoch time fields. However, if a numeric is provided
20
- # it must always be expressed in milliseconds as the Ably API always uses milliseconds for time fields.
17
+ # Contains an Ably Token and its associated metadata.
21
18
  #
22
19
  class TokenDetails
23
20
  include Ably::Modules::ModelCommon
@@ -46,31 +43,39 @@ module Ably::Models
46
43
  self.attributes.freeze
47
44
  end
48
45
 
49
- # @!attribute [r] token
46
+ # The Ably Token itself. A typical Ably Token string appears with the form xVLyHw.A-pwh7wicf3afTfgiw4k2Ku33kcnSA7z6y8FjuYpe3QaNRTEo4.
47
+ #
48
+ # @spec TD2
49
+ #
50
50
  # @return [String] Token used to authenticate requests
51
+ #
51
52
  def token
52
53
  attributes[:token]
53
54
  end
54
55
 
55
- # @!attribute [r] key_name
56
56
  # @return [String] API key name used to create this token. An API key is made up of an API key name and secret delimited by a +:+
57
+ #
57
58
  def key_name
58
59
  attributes[:key_name]
59
60
  end
60
61
 
61
- # @!attribute [r] issued
62
+ # The timestamp at which this token was issued as milliseconds since the Unix epoch.
63
+ # @spec TD4
62
64
  # @return [Time] Time the token was issued
63
65
  def issued
64
66
  as_time_from_epoch(attributes[:issued], granularity: :ms, allow_nil: :true)
65
67
  end
66
68
 
67
- # @!attribute [r] expires
69
+ # The timestamp at which this token expires as milliseconds since the Unix epoch.
70
+ # @spec TD3
68
71
  # @return [Time] Time the token expires
69
72
  def expires
70
73
  as_time_from_epoch(attributes[:expires], granularity: :ms, allow_nil: :true)
71
74
  end
72
75
 
73
- # @!attribute [r] capability
76
+ # The capabilities associated with this Ably Token. The capabilities value is a JSON-encoded representation of the
77
+ # resource paths and associated operations. Read more about capabilities in the capabilities docs.
78
+ # @spec TD5
74
79
  # @return [Hash] Capabilities assigned to this token
75
80
  def capability
76
81
  if attributes.has_key?(:capability)
@@ -86,7 +91,10 @@ module Ably::Models
86
91
  end
87
92
  end
88
93
 
89
- # @!attribute [r] client_id
94
+ # The client ID, if any, bound to this Ably Token. If a client ID is included, then the Ably Token authenticates its
95
+ # bearer as that client ID, and the Ably Token may only be used to perform operations on behalf of that client ID.
96
+ # The client is then considered to be an identified client.
97
+ # @spec TD6
90
98
  # @return [String] Optional client ID assigned to this token
91
99
  def client_id
92
100
  attributes[:client_id]
@@ -113,8 +121,8 @@ module Ably::Models
113
121
  attributes.keys == [:token]
114
122
  end
115
123
 
116
- # @!attribute [r] attributes
117
124
  # @return [Hash] Access the token details Hash object ruby'fied to use symbolized keys
125
+ #
118
126
  def attributes
119
127
  @hash_object
120
128
  end
@@ -122,5 +130,19 @@ module Ably::Models
122
130
  def to_s
123
131
  "<TokenDetails token=#{token} client_id=#{client_id} key_name=#{key_name} issued=#{issued} expires=#{expires} capability=#{capability} expired?=#{expired?}>"
124
132
  end
133
+
134
+ # A static factory method to create a {Ably::Models::TokenDetails} object from a deserialized {Ably::Models::TokenDetails}-like
135
+ # object or a JSON stringified TokenDetails object. This method is provided to minimize bugs as a result of differing
136
+ # types by platform for fields such as timestamp or ttl. For example, in Ruby ttl in the {Ably::Models::TokenDetails}
137
+ # object is exposed in seconds as that is idiomatic for the language, yet when serialized to JSON using to_json it
138
+ # is automatically converted to the Ably standard which is milliseconds. By using the fromJson() method when constructing
139
+ # a {Ably::Models::TokenDetails} object, Ably ensures that all fields are consistently serialized and deserialized across platforms.
140
+ #
141
+ # @overload from_json(json_like_object)
142
+ # @spec TD7
143
+ # @param json_like_object [Hash, String] A deserialized TokenDetails-like object or a JSON stringified TokenDetails object.
144
+ #
145
+ # @return [Ably::Models::TokenDetails] An Ably authentication token.
146
+ #
125
147
  end
126
148
  end
@@ -4,6 +4,7 @@ module Ably::Models
4
4
  # @param attributes (see #initialize)
5
5
  #
6
6
  # @return [TokenRequest]
7
+ #
7
8
  def self.TokenRequest(attributes)
8
9
  case attributes
9
10
  when TokenRequest
@@ -14,7 +15,8 @@ module Ably::Models
14
15
  end
15
16
 
16
17
 
17
- # TokenRequest is a class that stores the attributes of a token request
18
+ # Contains the properties of a request for a token to Ably.
19
+ # Tokens are generated using {Ably::Auth#requestToken}.
18
20
  #
19
21
  # Ruby {http://ruby-doc.org/core/Time.html Time} objects are supported in place of Ably ms since epoch time fields. However, if a numeric is provided
20
22
  # it must always be expressed in milliseconds as the Ably API always uses milliseconds for time fields.
@@ -39,13 +41,26 @@ module Ably::Models
39
41
  self.attributes.freeze
40
42
  end
41
43
 
44
+ # The name of the key against which this request is made. The key name is public, whereas the key secret is private.
45
+ #
42
46
  # @!attribute [r] key_name
47
+ #
48
+ # @spec TE2
49
+ #
43
50
  # @return [String] API key name of the key against which this request is made. An API key is made up of an API key name and secret delimited by a +:+
51
+ #
44
52
  def key_name
45
53
  attributes.fetch(:key_name) { raise Ably::Exceptions::InvalidTokenRequest, 'Key name is missing' }
46
54
  end
47
55
 
56
+ # Requested time to live for the Ably Token in milliseconds. If the Ably TokenRequest is successful, the TTL of the
57
+ # returned Ably Token is less than or equal to this value, depending on application settings and the attributes of
58
+ # the issuing key. The default is 60 minutes.
59
+ #
48
60
  # @!attribute [r] ttl
61
+ #
62
+ # @spec TE4
63
+ #
49
64
  # @return [Integer] requested time to live for the token in seconds. If the token request is successful,
50
65
  # the TTL of the returned token will be less than or equal to this value depending on application
51
66
  # settings and the attributes of the issuing key.
@@ -54,7 +69,15 @@ module Ably::Models
54
69
  attributes.fetch(:ttl) / 1000
55
70
  end
56
71
 
72
+ # Capability of the requested Ably Token. If the Ably TokenRequest is successful, the capability of the returned
73
+ # Ably Token will be the intersection of this capability with the capability of the issuing key. The capabilities
74
+ # value is a JSON-encoded representation of the resource paths and associated operations. Read more about
75
+ # capabilities in the capabilities docs.
76
+ #
57
77
  # @!attribute [r] capability
78
+ #
79
+ # @spec TE3
80
+ #
58
81
  # @return [Hash] capability of the token. If the token request is successful,
59
82
  # the capability of the returned token will be the intersection of
60
83
  # this capability with the capability of the issuing key.
@@ -71,14 +94,25 @@ module Ably::Models
71
94
  end
72
95
  end
73
96
 
97
+ # The client ID to associate with the requested Ably Token. When provided, the Ably Token may only be used to
98
+ # perform operations on behalf of that client ID.
99
+ #
74
100
  # @!attribute [r] client_id
101
+ #
102
+ # @spec TE2
103
+ #
75
104
  # @return [String] the client ID to associate with this token. The generated token
76
105
  # may be used to authenticate as this clientId.
77
106
  def client_id
78
107
  attributes[:client_id]
79
108
  end
80
109
 
110
+ # The timestamp of this request as milliseconds since the Unix epoch.
111
+ #
81
112
  # @!attribute [r] timestamp
113
+ #
114
+ # @spec TE5
115
+ #
82
116
  # @return [Time] the timestamp of this request.
83
117
  # Timestamps, in conjunction with the nonce, are used to prevent
84
118
  # token requests from being replayed.
@@ -88,7 +122,12 @@ module Ably::Models
88
122
  as_time_from_epoch(timestamp_val, granularity: :ms)
89
123
  end
90
124
 
125
+ # A cryptographically secure random string of at least 16 characters, used to ensure the TokenRequest cannot be reused.
126
+ #
91
127
  # @!attribute [r] nonce
128
+ #
129
+ # @spec TE2
130
+ #
92
131
  # @return [String] an opaque nonce string of at least 16 characters to ensure
93
132
  # uniqueness of this request. Any subsequent request using the
94
133
  # same nonce will be rejected.
@@ -96,14 +135,20 @@ module Ably::Models
96
135
  attributes.fetch(:nonce) { raise Ably::Exceptions::InvalidTokenRequest, 'Nonce is missing' }
97
136
  end
98
137
 
138
+ # The Message Authentication Code for this request.
139
+ #
99
140
  # @!attribute [r] mac
141
+ #
142
+ # @spec TE2
143
+ #
100
144
  # @return [String] the Message Authentication Code for this request. See the
101
- # {https://www.ably.com/docs Ably Authentication documentation} for more details.
145
+ #
102
146
  def mac
103
147
  attributes.fetch(:mac) { raise Ably::Exceptions::InvalidTokenRequest, 'MAC is missing' }
104
148
  end
105
149
 
106
150
  # Requests that the token is always persisted
151
+ #
107
152
  # @api private
108
153
  #
109
154
  def persisted
@@ -111,9 +156,25 @@ module Ably::Models
111
156
  end
112
157
 
113
158
  # @!attribute [r] attributes
159
+ #
114
160
  # @return [Hash] the token request Hash object ruby'fied to use symbolized keys
161
+ #
115
162
  def attributes
116
163
  @hash_object
117
164
  end
165
+
166
+ # A static factory method to create a TokenRequest object from a deserialized TokenRequest-like object or a JSON
167
+ # stringified TokenRequest object. This method is provided to minimize bugs as a result of differing types by platform
168
+ # for fields such as timestamp or ttl. For example, in Ruby ttl in the TokenRequest object is exposed in seconds as
169
+ # that is idiomatic for the language, yet when serialized to JSON using to_json it is automatically converted to
170
+ # the Ably standard which is milliseconds. By using the fromJson() method when constructing a TokenRequest object,
171
+ # Ably ensures that all fields are consistently serialized and deserialized across platforms.
172
+ #
173
+ # @overload from_json(json_like_object)
174
+ # @spec TE6
175
+ # @param json_like_object [Hash, String] A deserialized TokenRequest-like object or a JSON stringified TokenRequest object to create a TokenRequest.
176
+ #
177
+ # @return [Ably::Models::TokenRequest] An Ably token request object.
178
+ #
118
179
  end
119
180
  end
@@ -36,6 +36,7 @@ module Ably::Modules
36
36
  # Will yield the provided block in a new thread and return an {Ably::Util::SafeDeferrable}
37
37
  #
38
38
  # @yield [Object] operation block that is run in a thread
39
+ #
39
40
  # @return [Ably::Util::SafeDeferrable]
40
41
  #
41
42
  def async_wrap(success_callback = nil, custom_error_handling = nil)
@@ -90,7 +90,9 @@ module Ably::Modules
90
90
  end
91
91
 
92
92
  # Array of Enum values as symbols
93
+ #
93
94
  # @return [Array<Symbol>]
95
+ #
94
96
  def to_sym_arr
95
97
  @by_symbol.keys
96
98
  end