ably-rest 0.8.15 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/submodules/ably-ruby/CHANGELOG.md +61 -48
- data/lib/submodules/ably-ruby/README.md +0 -6
- data/lib/submodules/ably-ruby/ably.gemspec +1 -1
- data/lib/submodules/ably-ruby/lib/ably/auth.rb +37 -32
- data/lib/submodules/ably-ruby/lib/ably/modules/event_emitter.rb +15 -30
- data/lib/submodules/ably-ruby/lib/ably/modules/model_common.rb +0 -25
- data/lib/submodules/ably-ruby/lib/ably/realtime/auth.rb +30 -18
- data/lib/submodules/ably-ruby/lib/ably/realtime/channel/channel_manager.rb +3 -3
- data/lib/submodules/ably-ruby/lib/ably/realtime/client.rb +0 -3
- data/lib/submodules/ably-ruby/lib/ably/realtime/client/incoming_message_dispatcher.rb +2 -2
- data/lib/submodules/ably-ruby/lib/ably/realtime/connection/connection_manager.rb +3 -3
- data/lib/submodules/ably-ruby/lib/ably/realtime/presence/members_map.rb +3 -3
- data/lib/submodules/ably-ruby/lib/ably/rest/client.rb +6 -6
- data/lib/submodules/ably-ruby/lib/ably/version.rb +2 -2
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/auth_spec.rb +66 -53
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/channel_spec.rb +8 -10
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/client_spec.rb +3 -3
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/connection_spec.rb +12 -48
- data/lib/submodules/ably-ruby/spec/acceptance/realtime/presence_spec.rb +38 -79
- data/lib/submodules/ably-ruby/spec/acceptance/rest/auth_spec.rb +74 -40
- data/lib/submodules/ably-ruby/spec/acceptance/rest/base_spec.rb +1 -1
- data/lib/submodules/ably-ruby/spec/acceptance/rest/channel_spec.rb +4 -2
- data/lib/submodules/ably-ruby/spec/acceptance/rest/client_spec.rb +21 -26
- data/lib/submodules/ably-ruby/spec/acceptance/rest/presence_spec.rb +12 -10
- data/lib/submodules/ably-ruby/spec/unit/modules/event_emitter_spec.rb +51 -109
- data/lib/submodules/ably-ruby/spec/unit/realtime/presence_spec.rb +3 -3
- metadata +4 -3
@@ -50,14 +50,18 @@ module Ably
|
|
50
50
|
#
|
51
51
|
# @return [void]
|
52
52
|
def on(*event_names, &block)
|
53
|
-
|
53
|
+
event_names.each do |event_name|
|
54
|
+
callbacks[callbacks_event_coerced(event_name)] << proc_for_block(block)
|
55
|
+
end
|
54
56
|
end
|
55
57
|
|
56
58
|
# Equivalent of {#on} but any exception raised in a block will bubble up and cause this client library to fail.
|
57
59
|
# This method should only be used internally by the client library.
|
58
60
|
# @api private
|
59
61
|
def unsafe_on(*event_names, &block)
|
60
|
-
|
62
|
+
event_names.each do |event_name|
|
63
|
+
callbacks[callbacks_event_coerced(event_name)] << proc_for_block(block, unsafe: true)
|
64
|
+
end
|
61
65
|
end
|
62
66
|
|
63
67
|
# On receiving an event maching the event_name, call the provided block only once and remove the registered callback
|
@@ -66,20 +70,24 @@ module Ably
|
|
66
70
|
#
|
67
71
|
# @return [void]
|
68
72
|
def once(*event_names, &block)
|
69
|
-
|
73
|
+
event_names.each do |event_name|
|
74
|
+
callbacks[callbacks_event_coerced(event_name)] << proc_for_block(block, delete_once_run: true)
|
75
|
+
end
|
70
76
|
end
|
71
77
|
|
72
78
|
# Equivalent of {#once} but any exception raised in a block will bubble up and cause this client library to fail.
|
73
79
|
# This method should only be used internally by the client library.
|
74
80
|
# @api private
|
75
81
|
def unsafe_once(*event_names, &block)
|
76
|
-
|
82
|
+
event_names.each do |event_name|
|
83
|
+
callbacks[callbacks_event_coerced(event_name)] << proc_for_block(block, delete_once_run: true, unsafe: true)
|
84
|
+
end
|
77
85
|
end
|
78
86
|
|
79
87
|
# Emit an event with event_name that will in turn call all matching callbacks setup with `on`
|
80
88
|
def emit(event_name, *args)
|
81
|
-
|
82
|
-
|
89
|
+
callbacks[callbacks_event_coerced(event_name)].
|
90
|
+
clone.
|
83
91
|
select do |proc_hash|
|
84
92
|
if proc_hash[:unsafe]
|
85
93
|
proc_hash[:emit_proc].call(*args)
|
@@ -87,9 +95,8 @@ module Ably
|
|
87
95
|
safe_yield proc_hash[:emit_proc], *args
|
88
96
|
end
|
89
97
|
end.each do |callback|
|
90
|
-
|
98
|
+
callbacks[callbacks_event_coerced(event_name)].delete callback
|
91
99
|
end
|
92
|
-
end
|
93
100
|
end
|
94
101
|
|
95
102
|
# Remove all callbacks for event_name.
|
@@ -114,14 +121,6 @@ module Ably
|
|
114
121
|
callbacks[callbacks_event_coerced(event_name)].clear
|
115
122
|
end
|
116
123
|
end
|
117
|
-
|
118
|
-
if event_names.empty?
|
119
|
-
if block_given?
|
120
|
-
callbacks_any.delete_if { |proc_hash| proc_hash[:block] == block }
|
121
|
-
else
|
122
|
-
callbacks_any.clear
|
123
|
-
end
|
124
|
-
end
|
125
124
|
end
|
126
125
|
|
127
126
|
private
|
@@ -129,16 +128,6 @@ module Ably
|
|
129
128
|
klass.extend ClassMethods
|
130
129
|
end
|
131
130
|
|
132
|
-
def add_callback(event_names, proc_block)
|
133
|
-
if event_names.empty?
|
134
|
-
callbacks_any << proc_block
|
135
|
-
else
|
136
|
-
event_names.each do |event_name|
|
137
|
-
callbacks[callbacks_event_coerced(event_name)] << proc_block
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
131
|
# Create a Hash with a proc that calls the provided block and returns true if option :delete_once_run is set to true.
|
143
132
|
# #emit automatically deletes any blocks that return true thus allowing a block to be run once
|
144
133
|
def proc_for_block(block, options = {})
|
@@ -156,10 +145,6 @@ module Ably
|
|
156
145
|
@callbacks ||= Hash.new { |hash, key| hash[key] = [] }
|
157
146
|
end
|
158
147
|
|
159
|
-
def callbacks_any
|
160
|
-
@callbacks_any ||= []
|
161
|
-
end
|
162
|
-
|
163
148
|
def callbacks_event_coerced(event_name)
|
164
149
|
if self.class.event_emitter_coerce_proc
|
165
150
|
self.class.event_emitter_coerce_proc.call(event_name)
|
@@ -32,14 +32,6 @@ module Ably::Modules
|
|
32
32
|
as_json.to_json(*args)
|
33
33
|
end
|
34
34
|
|
35
|
-
# Like to_json but encodes all binary fields to hex
|
36
|
-
def to_safe_json(*args)
|
37
|
-
as_json.
|
38
|
-
each_with_object({}) do |(key, val), obj|
|
39
|
-
obj[key] = to_safe_jsonable_val(val)
|
40
|
-
end.to_json(*args)
|
41
|
-
end
|
42
|
-
|
43
35
|
# @!attribute [r] hash
|
44
36
|
# @return [Integer] Compute a hash-code for this hash. Two hashes with the same content will have the same hash code
|
45
37
|
def hash
|
@@ -47,23 +39,6 @@ module Ably::Modules
|
|
47
39
|
end
|
48
40
|
|
49
41
|
private
|
50
|
-
def to_safe_jsonable_val(val)
|
51
|
-
case val
|
52
|
-
when Array
|
53
|
-
val.map { |array_val| to_safe_jsonable_val(array_val) }
|
54
|
-
when Hash
|
55
|
-
val.each_with_object({}) { |(key, hash_val), obj| obj[key] = to_safe_jsonable_val(hash_val) }
|
56
|
-
when String
|
57
|
-
if val.encoding == Encoding::ASCII_8BIT
|
58
|
-
val.unpack("H*").first
|
59
|
-
else
|
60
|
-
val
|
61
|
-
end
|
62
|
-
else
|
63
|
-
val
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
42
|
def ensure_utf8_string_for(attribute, value)
|
68
43
|
if value
|
69
44
|
raise ArgumentError, "#{attribute} must be a String" unless value.kind_of?(String)
|
@@ -54,8 +54,8 @@ module Ably
|
|
54
54
|
#
|
55
55
|
# In the event that a new token request is made, the provided options are used
|
56
56
|
#
|
57
|
-
# @param (see Ably::Auth#
|
58
|
-
# @option (see Ably::Auth#
|
57
|
+
# @param (see Ably::Auth#authorize)
|
58
|
+
# @option (see Ably::Auth#authorize)
|
59
59
|
#
|
60
60
|
# @return [Ably::Util::SafeDeferrable]
|
61
61
|
# @yield [Ably::Models::TokenDetails]
|
@@ -63,13 +63,13 @@ module Ably
|
|
63
63
|
# @example
|
64
64
|
# # will issue a simple token request using basic auth
|
65
65
|
# client = Ably::Rest::Client.new(key: 'key.id:secret')
|
66
|
-
# client.auth.
|
66
|
+
# client.auth.authorize do |token_details|
|
67
67
|
# token_details #=> Ably::Models::TokenDetails
|
68
68
|
# end
|
69
69
|
#
|
70
|
-
def
|
70
|
+
def authorize(token_params = nil, auth_options = nil, &success_callback)
|
71
71
|
async_wrap(success_callback) do
|
72
|
-
auth_sync.
|
72
|
+
auth_sync.authorize(token_params, auth_options, &method(:upgrade_authentication_block).to_proc)
|
73
73
|
end.tap do |deferrable|
|
74
74
|
deferrable.errback do |error|
|
75
75
|
client.connection.transition_state_machine :failed, reason: error if error.kind_of?(Ably::Exceptions::IncompatibleClientId)
|
@@ -77,13 +77,25 @@ module Ably
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
-
#
|
81
|
-
|
82
|
-
|
80
|
+
# @deprecated Use {#authorize} instead
|
81
|
+
def authorise(*args, &block)
|
82
|
+
logger.warn "Auth#authorise is deprecated and will be removed in 1.0. Please use Auth#authorize instead"
|
83
|
+
authorize(*args, &block)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Synchronous version of {#authorize}. See {Ably::Auth#authorize} for method definition
|
87
|
+
# @param (see Ably::Auth#authorize)
|
88
|
+
# @option (see Ably::Auth#authorize)
|
83
89
|
# @return [Ably::Models::TokenDetails]
|
84
90
|
#
|
85
|
-
def
|
86
|
-
auth_sync.
|
91
|
+
def authorize_sync(token_params = nil, auth_options = nil)
|
92
|
+
auth_sync.authorize(token_params, auth_options, &method(:upgrade_authentication_block).to_proc)
|
93
|
+
end
|
94
|
+
|
95
|
+
# @deprecated Use {#authorize_sync} instead
|
96
|
+
def authorise_sync(*args)
|
97
|
+
logger.warn "Auth#authorise_sync is deprecated and will be removed in 1.0. Please use Auth#authorize_sync instead"
|
98
|
+
authorize_sync(*args)
|
87
99
|
end
|
88
100
|
|
89
101
|
# def_delegator :auth_sync, :request_token, :request_token_sync
|
@@ -113,8 +125,8 @@ module Ably
|
|
113
125
|
end
|
114
126
|
|
115
127
|
# Synchronous version of {#request_token}. See {Ably::Auth#request_token} for method definition
|
116
|
-
# @param (see Ably::Auth#
|
117
|
-
# @option (see Ably::Auth#
|
128
|
+
# @param (see Ably::Auth#authorize)
|
129
|
+
# @option (see Ably::Auth#authorize)
|
118
130
|
# @return [Ably::Models::TokenDetails]
|
119
131
|
#
|
120
132
|
def request_token_sync(token_params = {}, auth_options = {})
|
@@ -140,8 +152,8 @@ module Ably
|
|
140
152
|
end
|
141
153
|
|
142
154
|
# Synchronous version of {#create_token_request}. See {Ably::Auth#create_token_request} for method definition
|
143
|
-
# @param (see Ably::Auth#
|
144
|
-
# @option (see Ably::Auth#
|
155
|
+
# @param (see Ably::Auth#authorize)
|
156
|
+
# @option (see Ably::Auth#authorize)
|
145
157
|
# @return [Ably::Models::TokenRequest]
|
146
158
|
#
|
147
159
|
def create_token_request_sync(token_params = {}, auth_options = {})
|
@@ -149,7 +161,7 @@ module Ably
|
|
149
161
|
end
|
150
162
|
|
151
163
|
# Auth header string used in HTTP requests to Ably
|
152
|
-
# Will
|
164
|
+
# Will reauthorize implicitly if required and capable
|
153
165
|
#
|
154
166
|
# @return [Ably::Util::SafeDeferrable]
|
155
167
|
# @yield [String] HTTP authentication value used in HTTP_AUTHORIZATION header
|
@@ -168,7 +180,7 @@ module Ably
|
|
168
180
|
end
|
169
181
|
|
170
182
|
# Auth params used in URI endpoint for Realtime connections
|
171
|
-
# Will
|
183
|
+
# Will reauthorize implicitly if required and capable
|
172
184
|
#
|
173
185
|
# @return [Ably::Util::SafeDeferrable]
|
174
186
|
# @yield [Hash] Auth params for a new Realtime connection
|
@@ -197,12 +209,12 @@ module Ably
|
|
197
209
|
@client
|
198
210
|
end
|
199
211
|
|
200
|
-
# If
|
212
|
+
# If authorize is called with true, this block is executed so that it
|
201
213
|
# can perform the authentication upgrade
|
202
214
|
def upgrade_authentication_block(new_token)
|
203
215
|
# This block is called if the authorisation was forced
|
204
216
|
if client.connection.connected? || client.connection.connecting?
|
205
|
-
logger.debug "Realtime::Auth -
|
217
|
+
logger.debug "Realtime::Auth - authorize was called so forcibly disconnecting transport to initiate auth upgrade"
|
206
218
|
block = Proc.new do
|
207
219
|
if client.connection.transport
|
208
220
|
logger.debug "Realtime::Auth - current transport disconnected"
|
@@ -58,7 +58,7 @@ module Ably::Realtime
|
|
58
58
|
# all messages awaiting an ACK response should fail immediately
|
59
59
|
def fail_messages_awaiting_ack(error)
|
60
60
|
# Allow a short time for other queued operations to complete before failing all messages
|
61
|
-
EventMachine.
|
61
|
+
EventMachine.add_timer(0.1) do
|
62
62
|
error = Ably::Exceptions::MessageDeliveryFailed.new("Channel cannot publish messages whilst state is '#{channel.state}'") unless error
|
63
63
|
fail_messages_in_queue connection.__pending_message_ack_queue__, error
|
64
64
|
fail_messages_in_queue connection.__outgoing_message_queue__, error
|
@@ -76,10 +76,10 @@ module Ably::Realtime
|
|
76
76
|
|
77
77
|
def nack_messages(protocol_message, error)
|
78
78
|
(protocol_message.messages + protocol_message.presence).each do |message|
|
79
|
-
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.
|
79
|
+
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.to_json}, protocol message: #{protocol_message}"
|
80
80
|
message.fail error
|
81
81
|
end
|
82
|
-
logger.debug "Calling NACK failure callbacks for #{protocol_message.class.name} - #{protocol_message.
|
82
|
+
logger.debug "Calling NACK failure callbacks for #{protocol_message.class.name} - #{protocol_message.to_json}"
|
83
83
|
protocol_message.fail error
|
84
84
|
end
|
85
85
|
|
@@ -68,9 +68,6 @@ module Ably
|
|
68
68
|
#
|
69
69
|
# @param (see Ably::Rest::Client#initialize)
|
70
70
|
# @option options (see Ably::Rest::Client#initialize)
|
71
|
-
# @option options [Proc] :auth_callback when provided, the Proc will be called with the token params hash as the first argument, whenever a new token is required.
|
72
|
-
# Whilst the proc is called synchronously, it does not block the EventMachine reactor as it is run in a separate thread.
|
73
|
-
# The Proc should return a token string, {Ably::Models::TokenDetails} or JSON equivalent, {Ably::Models::TokenRequest} or JSON equivalent
|
74
71
|
# @option options [Boolean] :queue_messages If false, this disables the default behaviour whereby the library queues messages on a connection in the disconnected or connecting states
|
75
72
|
# @option options [Boolean] :echo_messages If false, prevents messages originating from this connection being echoed back on the same connection
|
76
73
|
# @option options [String] :recover When a recover option is specified a connection inherits the state of a previous connection that may have existed under a different instance of the Realtime library, please refer to the API documentation for further information on connection state recovery
|
@@ -178,14 +178,14 @@ module Ably::Realtime
|
|
178
178
|
|
179
179
|
def ack_messages(messages)
|
180
180
|
messages.each do |message|
|
181
|
-
logger.debug "Calling ACK success callbacks for #{message.class.name} - #{message.
|
181
|
+
logger.debug "Calling ACK success callbacks for #{message.class.name} - #{message.to_json}"
|
182
182
|
message.succeed message
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
186
|
def nack_messages(messages, protocol_message)
|
187
187
|
messages.each do |message|
|
188
|
-
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.
|
188
|
+
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.to_json}, protocol message: #{protocol_message}"
|
189
189
|
message.fail protocol_message.error
|
190
190
|
end
|
191
191
|
end
|
@@ -402,8 +402,8 @@ module Ably::Realtime
|
|
402
402
|
@renewing_token = true
|
403
403
|
logger.info "ConnectionManager: Token has expired and is renewable, renewing token now"
|
404
404
|
|
405
|
-
client.auth.
|
406
|
-
|
405
|
+
client.auth.authorize.tap do |authorize_deferrable|
|
406
|
+
authorize_deferrable.callback do |token_details|
|
407
407
|
logger.info 'ConnectionManager: Token renewed succesfully following expiration'
|
408
408
|
|
409
409
|
connection.once_state_changed { @renewing_token = false }
|
@@ -415,7 +415,7 @@ module Ably::Realtime
|
|
415
415
|
end
|
416
416
|
end
|
417
417
|
|
418
|
-
|
418
|
+
authorize_deferrable.errback do |auth_error|
|
419
419
|
@renewing_token = false
|
420
420
|
logger.error "ConnectionManager: Error authorising following token expiry: #{auth_error}"
|
421
421
|
connection.transition_state_machine :failed, reason: auth_error
|
@@ -200,7 +200,7 @@ module Ably::Realtime
|
|
200
200
|
return unless ensure_presence_message_is_valid(presence_message)
|
201
201
|
|
202
202
|
unless should_update_member?(presence_message)
|
203
|
-
logger.debug "#{self.class.name}: Skipped presence member #{presence_message.action} on channel #{presence.channel.name}.\n#{presence_message.
|
203
|
+
logger.debug "#{self.class.name}: Skipped presence member #{presence_message.action} on channel #{presence.channel.name}.\n#{presence_message.to_json}"
|
204
204
|
return
|
205
205
|
end
|
206
206
|
|
@@ -239,13 +239,13 @@ module Ably::Realtime
|
|
239
239
|
end
|
240
240
|
|
241
241
|
def add_presence_member(presence_message)
|
242
|
-
logger.debug "#{self.class.name}: Member '#{presence_message.member_key}' for event '#{presence_message.action}' #{members.has_key?(presence_message.member_key) ? 'updated' : 'added'}.\n#{presence_message.
|
242
|
+
logger.debug "#{self.class.name}: Member '#{presence_message.member_key}' for event '#{presence_message.action}' #{members.has_key?(presence_message.member_key) ? 'updated' : 'added'}.\n#{presence_message.to_json}"
|
243
243
|
members[presence_message.member_key] = { present: true, message: presence_message }
|
244
244
|
presence.emit_message presence_message.action, presence_message
|
245
245
|
end
|
246
246
|
|
247
247
|
def remove_presence_member(presence_message)
|
248
|
-
logger.debug "#{self.class.name}: Member '#{presence_message.member_key}' removed.\n#{presence_message.
|
248
|
+
logger.debug "#{self.class.name}: Member '#{presence_message.member_key}' removed.\n#{presence_message.to_json}"
|
249
249
|
|
250
250
|
if in_sync?
|
251
251
|
members.delete presence_message.member_key
|
@@ -285,14 +285,14 @@ module Ably
|
|
285
285
|
|
286
286
|
response = case method.to_sym
|
287
287
|
when :get
|
288
|
-
|
288
|
+
reauthorize_on_authorisation_failure do
|
289
289
|
send_request(method, path, params, headers: headers)
|
290
290
|
end
|
291
291
|
when :post
|
292
292
|
path_with_params = Addressable::URI.new
|
293
293
|
path_with_params.query_values = params || {}
|
294
294
|
query = path_with_params.query
|
295
|
-
|
295
|
+
reauthorize_on_authorisation_failure do
|
296
296
|
send_request(method, "#{path}#{"?#{query}" unless query.nil? || query.empty?}", body, headers: headers)
|
297
297
|
end
|
298
298
|
end
|
@@ -414,10 +414,10 @@ module Ably
|
|
414
414
|
private
|
415
415
|
def raw_request(method, path, params = {}, options = {})
|
416
416
|
options = options.clone
|
417
|
-
if options.delete(:
|
417
|
+
if options.delete(:disable_automatic_reauthorize) == true
|
418
418
|
send_request(method, path, params, options)
|
419
419
|
else
|
420
|
-
|
420
|
+
reauthorize_on_authorisation_failure do
|
421
421
|
send_request(method, path, params, options)
|
422
422
|
end
|
423
423
|
end
|
@@ -464,11 +464,11 @@ module Ably
|
|
464
464
|
end
|
465
465
|
end
|
466
466
|
|
467
|
-
def
|
467
|
+
def reauthorize_on_authorisation_failure
|
468
468
|
yield
|
469
469
|
rescue Ably::Exceptions::TokenExpired => e
|
470
470
|
if auth.token_renewable?
|
471
|
-
auth.
|
471
|
+
auth.authorize
|
472
472
|
yield
|
473
473
|
else
|
474
474
|
raise e
|
@@ -73,7 +73,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
73
73
|
context '#current_token_details' do
|
74
74
|
it 'contains the current token after auth' do
|
75
75
|
expect(auth.current_token_details).to be_nil
|
76
|
-
auth.
|
76
|
+
auth.authorize do
|
77
77
|
expect(auth.current_token_details).to be_a(Ably::Models::TokenDetails)
|
78
78
|
stop_reactor
|
79
79
|
end
|
@@ -93,7 +93,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
93
93
|
let(:client_options) { default_options.merge(auto_connect: false) }
|
94
94
|
|
95
95
|
it 'contains the configured auth options' do
|
96
|
-
auth.
|
96
|
+
auth.authorize({}, auth_url: auth_url, auth_params: auth_params) do
|
97
97
|
expect(auth.options[:auth_url]).to eql(auth_url)
|
98
98
|
stop_reactor
|
99
99
|
end
|
@@ -104,7 +104,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
104
104
|
let(:custom_ttl) { 33 }
|
105
105
|
|
106
106
|
it 'contains the configured auth options' do
|
107
|
-
auth.
|
107
|
+
auth.authorize(ttl: custom_ttl) do
|
108
108
|
expect(auth.token_params[:ttl]).to eql(custom_ttl)
|
109
109
|
stop_reactor
|
110
110
|
end
|
@@ -113,7 +113,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
113
113
|
|
114
114
|
context '#using_basic_auth?' do
|
115
115
|
it 'is false when using Token Auth' do
|
116
|
-
auth.
|
116
|
+
auth.authorize do
|
117
117
|
expect(auth).to_not be_using_basic_auth
|
118
118
|
stop_reactor
|
119
119
|
end
|
@@ -122,7 +122,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
122
122
|
|
123
123
|
context '#using_token_auth?' do
|
124
124
|
it 'is true when using Token Auth' do
|
125
|
-
auth.
|
125
|
+
auth.authorize do
|
126
126
|
expect(auth).to be_using_token_auth
|
127
127
|
stop_reactor
|
128
128
|
end
|
@@ -176,9 +176,9 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
context '#
|
179
|
+
context '#authorize' do
|
180
180
|
it 'returns a token asynchronously' do
|
181
|
-
auth.
|
181
|
+
auth.authorize(ttl: custom_ttl, client_id: custom_client_id) do |token_details|
|
182
182
|
expect(token_details).to be_a(Ably::Models::TokenDetails)
|
183
183
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
184
184
|
expect(token_details.client_id).to eql(custom_client_id)
|
@@ -186,35 +186,6 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
-
context 'with auth_callback blocking' do
|
190
|
-
let(:rest_auth_client) { Ably::Rest::Client.new(default_options.merge(key: api_key)) }
|
191
|
-
let(:client_options) { default_options.merge(auth_callback: auth_callback) }
|
192
|
-
let(:pause) { 5 }
|
193
|
-
|
194
|
-
context 'with a slow auth callback response' do
|
195
|
-
let(:auth_callback) do
|
196
|
-
Proc.new do
|
197
|
-
sleep pause
|
198
|
-
rest_auth_client.auth.request_token
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'asynchronously authenticates' do
|
203
|
-
timers_called = 0
|
204
|
-
block = Proc.new do
|
205
|
-
timers_called += 1
|
206
|
-
EventMachine.add_timer(0.5, &block)
|
207
|
-
end
|
208
|
-
block.call
|
209
|
-
client.connect
|
210
|
-
client.connection.on(:connected) do
|
211
|
-
expect(timers_called).to be >= (pause-1) / 0.5
|
212
|
-
stop_reactor
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
189
|
context 'when implicitly called, with an explicit ClientOptions client_id' do
|
219
190
|
let(:client_id) { random_str }
|
220
191
|
let(:client_options) { default_options.merge(auth_callback: Proc.new { auth_token_object }, client_id: client_id, log_level: :none) }
|
@@ -271,7 +242,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
271
242
|
context 'and an incompatible client_id in a TokenDetails object passed to the auth callback' do
|
272
243
|
it 'rejects a TokenDetails object with an incompatible client_id and raises an exception' do
|
273
244
|
client.connection.once(:connected) do
|
274
|
-
client.auth.
|
245
|
+
client.auth.authorize({})
|
275
246
|
client.connection.on(:error) do |error|
|
276
247
|
expect(error).to be_a(Ably::Exceptions::IncompatibleClientId)
|
277
248
|
EventMachine.add_timer(0.1) do
|
@@ -284,7 +255,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
284
255
|
end
|
285
256
|
end
|
286
257
|
|
287
|
-
context '
|
258
|
+
context 'when already authenticated with a valid token' do
|
288
259
|
let(:rest_client) { Ably::Rest::Client.new(default_options) }
|
289
260
|
let(:client_publisher) { auto_close Ably::Realtime::Client.new(default_options) }
|
290
261
|
let(:basic_capability) { JSON.dump("foo" => ["subscribe"]) }
|
@@ -308,7 +279,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
308
279
|
it 'forces the connection to disconnect and reconnect with a new token when in the CONNECTED state' do
|
309
280
|
client.connection.once(:connected) do
|
310
281
|
existing_token = client.auth.current_token_details
|
311
|
-
client.auth.
|
282
|
+
client.auth.authorize(nil)
|
312
283
|
client.connection.once(:disconnected) do
|
313
284
|
client.connection.once(:connected) do
|
314
285
|
expect(existing_token).to_not eql(client.auth.current_token_details)
|
@@ -321,7 +292,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
321
292
|
it 'forces the connection to disconnect and reconnect with a new token when in the CONNECTING state' do
|
322
293
|
client.connection.once(:connecting) do
|
323
294
|
existing_token = client.auth.current_token_details
|
324
|
-
client.auth.
|
295
|
+
client.auth.authorize(nil)
|
325
296
|
client.connection.once(:disconnected) do
|
326
297
|
client.connection.once(:connected) do
|
327
298
|
expect(existing_token).to_not eql(client.auth.current_token_details)
|
@@ -340,7 +311,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
340
311
|
|
341
312
|
it 'transisitions the connection state to FAILED if the client_id changes' do
|
342
313
|
client.connection.once(:connected) do
|
343
|
-
client.auth.
|
314
|
+
client.auth.authorize(nil, auth_callback: identified_token_cb)
|
344
315
|
client.connection.once(:failed) do
|
345
316
|
expect(client.connection.error_reason.message).to match(/incompatible.*client ID/)
|
346
317
|
stop_reactor
|
@@ -358,7 +329,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
358
329
|
channel.publish('not-allowed').errback do |error|
|
359
330
|
expect(error.code).to eql(40160)
|
360
331
|
expect(error.message).to match(/permission denied/)
|
361
|
-
client.auth.
|
332
|
+
client.auth.authorize(nil, auth_callback: upgraded_token_cb)
|
362
333
|
client.connection.once(:connected) do
|
363
334
|
expect(client.connection.error_reason).to be_nil
|
364
335
|
channel.subscribe('allowed') do |message|
|
@@ -378,7 +349,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
378
349
|
client.connection.once(:connected) do
|
379
350
|
channel = client.channels.get('foo')
|
380
351
|
channel.attach do
|
381
|
-
client.auth.
|
352
|
+
client.auth.authorize(nil, auth_callback: downgraded_token_cb)
|
382
353
|
channel.once(:failed) do
|
383
354
|
expect(channel.error_reason.code).to eql(40160)
|
384
355
|
expect(channel.error_reason.message).to match(/Channel denied access/)
|
@@ -401,7 +372,7 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
401
372
|
publisher_channel.publish('foo') do
|
402
373
|
EventMachine.add_timer(2) do
|
403
374
|
expect(received_messages.length).to eql(1)
|
404
|
-
client.auth.
|
375
|
+
client.auth.authorize(nil)
|
405
376
|
client.connection.once(:disconnected) do
|
406
377
|
publisher_channel.publish('bar') do
|
407
378
|
expect(received_messages.length).to eql(1)
|
@@ -422,9 +393,9 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
422
393
|
it 'does not change the connection state if current connection state is closing' do
|
423
394
|
client.connection.once(:connected) do
|
424
395
|
client.connection.once(:closing) do
|
425
|
-
client.auth.
|
396
|
+
client.auth.authorize(nil)
|
426
397
|
client.connection.once(:connected) do
|
427
|
-
raise "Should not reconnect following
|
398
|
+
raise "Should not reconnect following #authorize"
|
428
399
|
end
|
429
400
|
EventMachine.add_timer(4) do
|
430
401
|
expect(client.connection).to be_closed
|
@@ -438,9 +409,9 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
438
409
|
it 'does not change the connection state if current connection state is closed' do
|
439
410
|
client.connection.once(:connected) do
|
440
411
|
client.connection.once(:closed) do
|
441
|
-
client.auth.
|
412
|
+
client.auth.authorize(nil)
|
442
413
|
client.connection.once(:connected) do
|
443
|
-
raise "Should not reconnect following
|
414
|
+
raise "Should not reconnect following #authorize"
|
444
415
|
end
|
445
416
|
EventMachine.add_timer(4) do
|
446
417
|
expect(client.connection).to be_closed
|
@@ -457,9 +428,9 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
457
428
|
it 'does not change the connection state' do
|
458
429
|
client.connection.once(:connected) do
|
459
430
|
client.connection.once(:failed) do
|
460
|
-
client.auth.
|
431
|
+
client.auth.authorize(nil)
|
461
432
|
client.connection.once(:connected) do
|
462
|
-
raise "Should not reconnect following
|
433
|
+
raise "Should not reconnect following #authorize"
|
463
434
|
end
|
464
435
|
EventMachine.add_timer(4) do
|
465
436
|
expect(client.connection).to be_failed
|
@@ -474,10 +445,10 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
474
445
|
end
|
475
446
|
end
|
476
447
|
|
477
|
-
context '#
|
448
|
+
context '#authorize_async' do
|
478
449
|
it 'returns a token synchronously' do
|
479
|
-
auth.
|
480
|
-
expect(auth.
|
450
|
+
auth.authorize_sync(ttl: custom_ttl, client_id: custom_client_id).tap do |token_details|
|
451
|
+
expect(auth.authorize_sync).to be_a(Ably::Models::TokenDetails)
|
481
452
|
expect(token_details.expires.to_i).to be_within(3).of(Time.now.to_i + custom_ttl)
|
482
453
|
expect(token_details.client_id).to eql(custom_client_id)
|
483
454
|
stop_reactor
|
@@ -696,5 +667,47 @@ describe Ably::Realtime::Auth, :event_machine do
|
|
696
667
|
end
|
697
668
|
end
|
698
669
|
end
|
670
|
+
|
671
|
+
context 'deprecated #authorise' do
|
672
|
+
let(:client_options) { default_options.merge(key: api_key, logger: custom_logger_object) }
|
673
|
+
let(:custom_logger) do
|
674
|
+
Class.new do
|
675
|
+
def initialize
|
676
|
+
@messages = []
|
677
|
+
end
|
678
|
+
|
679
|
+
[:fatal, :error, :warn, :info, :debug].each do |severity|
|
680
|
+
define_method severity do |message|
|
681
|
+
@messages << [severity, message]
|
682
|
+
end
|
683
|
+
end
|
684
|
+
|
685
|
+
def logs
|
686
|
+
@messages
|
687
|
+
end
|
688
|
+
|
689
|
+
def level
|
690
|
+
1
|
691
|
+
end
|
692
|
+
|
693
|
+
def level=(new_level)
|
694
|
+
end
|
695
|
+
end
|
696
|
+
end
|
697
|
+
let(:custom_logger_object) { custom_logger.new }
|
698
|
+
|
699
|
+
it 'logs a deprecation warning (#RSA10l)' do
|
700
|
+
client.auth.authorise
|
701
|
+
expect(custom_logger_object.logs.find { |severity, message| message.match(/authorise.*deprecated/i)} ).to_not be_nil
|
702
|
+
stop_reactor
|
703
|
+
end
|
704
|
+
|
705
|
+
it 'returns a valid token (#RSA10l)' do
|
706
|
+
client.auth.authorise do |response|
|
707
|
+
expect(response).to be_a(Ably::Models::TokenDetails)
|
708
|
+
stop_reactor
|
709
|
+
end
|
710
|
+
end
|
711
|
+
end
|
699
712
|
end
|
700
713
|
end
|