ably 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/lib/ably/auth.rb +23 -19
- data/lib/ably/models/token_details.rb +8 -6
- data/lib/ably/modules/conversions.rb +4 -0
- data/lib/ably/modules/state_emitter.rb +1 -1
- data/lib/ably/modules/uses_state_machine.rb +8 -1
- data/lib/ably/realtime/auth.rb +13 -13
- data/lib/ably/realtime/channel.rb +2 -2
- data/lib/ably/realtime/channel/channel_manager.rb +3 -3
- data/lib/ably/realtime/channel/channel_state_machine.rb +2 -1
- data/lib/ably/realtime/client/incoming_message_dispatcher.rb +13 -7
- data/lib/ably/realtime/client/outgoing_message_dispatcher.rb +6 -0
- data/lib/ably/realtime/connection.rb +4 -4
- data/lib/ably/realtime/connection/connection_manager.rb +9 -3
- data/lib/ably/realtime/connection/connection_state_machine.rb +1 -1
- data/lib/ably/realtime/presence.rb +4 -4
- data/lib/ably/rest/client.rb +2 -2
- data/lib/ably/version.rb +1 -1
- data/spec/acceptance/realtime/auth_spec.rb +9 -9
- data/spec/acceptance/realtime/channel_history_spec.rb +2 -2
- data/spec/acceptance/realtime/channel_spec.rb +13 -12
- data/spec/acceptance/realtime/channels_spec.rb +6 -2
- data/spec/acceptance/realtime/client_spec.rb +4 -3
- data/spec/acceptance/realtime/connection_failures_spec.rb +21 -15
- data/spec/acceptance/realtime/connection_spec.rb +31 -27
- data/spec/acceptance/realtime/message_spec.rb +31 -24
- data/spec/acceptance/realtime/presence_history_spec.rb +2 -2
- data/spec/acceptance/realtime/presence_spec.rb +10 -11
- data/spec/acceptance/realtime/stats_spec.rb +1 -1
- data/spec/acceptance/realtime/time_spec.rb +1 -1
- data/spec/acceptance/rest/auth_spec.rb +77 -46
- data/spec/acceptance/rest/channel_spec.rb +22 -3
- data/spec/acceptance/rest/client_spec.rb +6 -6
- data/spec/acceptance/rest/presence_spec.rb +9 -7
- data/spec/support/event_machine_helper.rb +30 -4
- data/spec/support/protocol_helper.rb +9 -6
- data/spec/unit/auth_spec.rb +1 -1
- data/spec/unit/models/token_details_spec.rb +8 -0
- data/spec/unit/modules/async_wrapper_spec.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb69100f880e16767da5cad8178d7ed8ec8202a
|
4
|
+
data.tar.gz: f9c6e5b632f1992657178b118c80e4b828de051c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d725527fdd9e8c517233bebdc87f3bd8775234c1cbf9f44a8ff7ce8c28de744fe4037f67fbdae26caae83428c7785116056f4289c60c342d9b7df7a533913b07
|
7
|
+
data.tar.gz: d2b8f496227bf4122e167426380213de6473f89c02385eadabd82d268fbe01b347fd9cf9b973f1dbce86b2b2e8beab0670221d8657367cef1ada68783367673e
|
data/README.md
CHANGED
@@ -187,7 +187,7 @@ token_details = client.auth.request_token
|
|
187
187
|
token_details.token # => "xVLyHw.CLchevH3hF....MDh9ZC_Q"
|
188
188
|
client = Ably::Rest.new(token: token_details.token)
|
189
189
|
|
190
|
-
token = client.auth.create_token_request(
|
190
|
+
token = client.auth.create_token_request(ttl: 3600)
|
191
191
|
# => {"id"=>...,
|
192
192
|
# "clientId"=>nil,
|
193
193
|
# "ttl"=>3600,
|
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
namespace :doc do
|
17
17
|
desc 'Generate Markdown Specification from the RSpec public API tests'
|
18
18
|
task :spec do
|
19
|
-
ENV['
|
19
|
+
ENV['PROTOCOL'] = 'json'
|
20
20
|
|
21
21
|
rspec_task.rspec_opts = %w(
|
22
22
|
--require ./spec/support/markdown_spec_formatter
|
data/lib/ably/auth.rb
CHANGED
@@ -43,11 +43,11 @@ module Ably
|
|
43
43
|
# Creates an Auth object
|
44
44
|
#
|
45
45
|
# @param [Ably::Rest::Client] client {Ably::Rest::Client} this Auth object uses
|
46
|
-
# @param [Hash] auth_options the authentication options used as a default future token requests
|
47
46
|
# @param [Hash] token_params the token params used as a default for future token requests
|
47
|
+
# @param [Hash] auth_options the authentication options used as a default future token requests
|
48
48
|
# @option (see #request_token)
|
49
49
|
#
|
50
|
-
def initialize(client,
|
50
|
+
def initialize(client, token_params, auth_options)
|
51
51
|
unless auth_options.kind_of?(Hash)
|
52
52
|
raise ArgumentError, 'Expected auth_options to be a Hash'
|
53
53
|
end
|
@@ -87,8 +87,8 @@ module Ably
|
|
87
87
|
#
|
88
88
|
# In the event that a new token request is made, the provided options are used.
|
89
89
|
#
|
90
|
-
# @param [Hash] auth_options the authentication options used for future token requests
|
91
90
|
# @param [Hash] token_params the token params used for future token requests
|
91
|
+
# @param [Hash] auth_options the authentication options used for future token requests
|
92
92
|
# @option auth_options [Boolean] :force obtains a new token even if the current token is valid
|
93
93
|
# @option (see #request_token)
|
94
94
|
#
|
@@ -100,12 +100,12 @@ module Ably
|
|
100
100
|
# token_details = client.auth.authorise
|
101
101
|
#
|
102
102
|
# # will use token request from block to authorise if not already authorised
|
103
|
-
# token_details = client.auth.authorise auth_callback: Proc.new do
|
103
|
+
# token_details = client.auth.authorise {}, auth_callback: Proc.new do
|
104
104
|
# # create token_request object
|
105
105
|
# token_request
|
106
106
|
# end
|
107
107
|
#
|
108
|
-
def authorise(
|
108
|
+
def authorise(token_params = {}, auth_options = {})
|
109
109
|
ensure_valid_auth_attributes auth_options
|
110
110
|
|
111
111
|
auth_options = auth_options.clone
|
@@ -120,7 +120,7 @@ module Ably
|
|
120
120
|
token_params = (auth_options.delete(:token_params) || {}).merge(token_params)
|
121
121
|
@token_params = @token_params.merge(token_params) # update defaults
|
122
122
|
|
123
|
-
@current_token_details = request_token(
|
123
|
+
@current_token_details = request_token(token_params, auth_options)
|
124
124
|
end
|
125
125
|
|
126
126
|
# Request a {Ably::Models::TokenDetails} which can be used to make authenticated token based requests
|
@@ -143,15 +143,15 @@ module Ably
|
|
143
143
|
# token_details = client.auth.request_token
|
144
144
|
#
|
145
145
|
# # token request with token params
|
146
|
-
# client.auth.request_token
|
146
|
+
# client.auth.request_token ttl: 1.hour
|
147
147
|
#
|
148
148
|
# # token request using auth block
|
149
|
-
# token_details = client.auth.request_token auth_callback: Proc.new do
|
149
|
+
# token_details = client.auth.request_token {}, auth_callback: Proc.new do
|
150
150
|
# # create token_request object
|
151
151
|
# token_request
|
152
152
|
# end
|
153
153
|
#
|
154
|
-
def request_token(
|
154
|
+
def request_token(token_params = {}, auth_options = {})
|
155
155
|
ensure_valid_auth_attributes auth_options
|
156
156
|
|
157
157
|
token_params = (auth_options[:token_params] || {}).merge(token_params)
|
@@ -163,7 +163,7 @@ module Ably
|
|
163
163
|
elsif auth_url = auth_options.delete(:auth_url)
|
164
164
|
token_request_from_auth_url(auth_url, auth_options)
|
165
165
|
else
|
166
|
-
create_token_request(
|
166
|
+
create_token_request(token_params, auth_options)
|
167
167
|
end
|
168
168
|
|
169
169
|
case token_request
|
@@ -186,12 +186,6 @@ module Ably
|
|
186
186
|
|
187
187
|
# Creates and signs a token request that can then subsequently be used by any client to request a token
|
188
188
|
#
|
189
|
-
# @param [Hash] auth_options the authentication options for the token request
|
190
|
-
# @option auth_options [String] :key API key comprising the key name and key secret in a single string
|
191
|
-
# @option auth_options [String] :client_id client ID identifying this connection to other clients (will use +client_id+ specified when library was instanced if provided)
|
192
|
-
# @option auth_options [Boolean] :query_time when true will query the {https://www.ably.io Ably} system for the current time instead of using the local time
|
193
|
-
# @option auth_options [Hash] :token_params convenience to pass in +token_params+ within the +auth_options+ argument, this helps avoid the following +authorise({key: key}, {ttl: 23})+ by allowing +authorise(key:key,token_params:{ttl:23})+
|
194
|
-
#
|
195
189
|
# @param [Hash] token_params the token params used in the token request
|
196
190
|
# @option token_params [String] :client_id A client ID to associate with this token. The generated token may be used to authenticate as this +client_id+
|
197
191
|
# @option token_params [Integer] :ttl validity time in seconds for the requested {Ably::Models::TokenDetails}. Limits may apply, see {https://www.ably.io/documentation/other/authentication}
|
@@ -199,10 +193,16 @@ module Ably
|
|
199
193
|
# @option token_params [Time] :timestamp the time of the request
|
200
194
|
# @option token_params [String] :nonce an unquoted, unescaped random string of at least 16 characters
|
201
195
|
#
|
196
|
+
# @param [Hash] auth_options the authentication options for the token request
|
197
|
+
# @option auth_options [String] :key API key comprising the key name and key secret in a single string
|
198
|
+
# @option auth_options [String] :client_id client ID identifying this connection to other clients (will use +client_id+ specified when library was instanced if provided)
|
199
|
+
# @option auth_options [Boolean] :query_time when true will query the {https://www.ably.io Ably} system for the current time instead of using the local time
|
200
|
+
# @option auth_options [Hash] :token_params convenience to pass in +token_params+ within the +auth_options+ argument, especially useful when setting default token_params in the client constructor
|
201
|
+
#
|
202
202
|
# @return [Models::TokenRequest]
|
203
203
|
#
|
204
204
|
# @example
|
205
|
-
# client.auth.create_token_request(id: 'asd.asd'
|
205
|
+
# client.auth.create_token_request({ ttl: 3600 }, { id: 'asd.asd' })
|
206
206
|
# #<Ably::Models::TokenRequest:0x007fd5d919df78
|
207
207
|
# # @hash={
|
208
208
|
# # :id=>"asds.adsa",
|
@@ -214,7 +214,7 @@ module Ably
|
|
214
214
|
# # :mac=>"881oZHeFo6oMim7....uE56a8gUxHw="
|
215
215
|
# # }
|
216
216
|
# #>>
|
217
|
-
def create_token_request(
|
217
|
+
def create_token_request(token_params = {}, auth_options = {})
|
218
218
|
ensure_valid_auth_attributes auth_options
|
219
219
|
|
220
220
|
auth_options = auth_options.clone
|
@@ -401,7 +401,11 @@ module Ably
|
|
401
401
|
|
402
402
|
# Returns the current token if it exists or authorises and retrieves a token
|
403
403
|
def token_auth_string
|
404
|
-
|
404
|
+
# If a TokenDetails object has been issued by this library
|
405
|
+
# then that Token will take precedence
|
406
|
+
if @current_token_details
|
407
|
+
authorise.token
|
408
|
+
elsif token # token string was configured in the options
|
405
409
|
token
|
406
410
|
else
|
407
411
|
authorise.token
|
@@ -34,7 +34,7 @@ module Ably::Models
|
|
34
34
|
# @param attributes
|
35
35
|
# @option attributes [String] :token token used to authenticate requests
|
36
36
|
# @option attributes [String] :key_name API key name used to create this token
|
37
|
-
# @option attributes [Time,Integer] :issued
|
37
|
+
# @option attributes [Time,Integer] :issued Time the token was issued as Time or Integer in milliseconds
|
38
38
|
# @option attributes [Time,Integer] :expires Time the token expires as Time or Integer in milliseconds
|
39
39
|
# @option attributes [String] :capability JSON stringified capabilities assigned to this token
|
40
40
|
# @option attributes [String] :client_id client ID assigned to this token
|
@@ -52,31 +52,31 @@ module Ably::Models
|
|
52
52
|
# @!attribute [r] token
|
53
53
|
# @return [String] Token used to authenticate requests
|
54
54
|
def token
|
55
|
-
hash
|
55
|
+
hash[:token]
|
56
56
|
end
|
57
57
|
|
58
58
|
# @!attribute [r] key_name
|
59
59
|
# @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 +:+
|
60
60
|
def key_name
|
61
|
-
hash
|
61
|
+
hash[:key_name]
|
62
62
|
end
|
63
63
|
|
64
64
|
# @!attribute [r] issued
|
65
65
|
# @return [Time] Time the token was issued
|
66
66
|
def issued
|
67
|
-
as_time_from_epoch(hash
|
67
|
+
as_time_from_epoch(hash[:issued], granularity: :ms, allow_nil: :true)
|
68
68
|
end
|
69
69
|
|
70
70
|
# @!attribute [r] expires
|
71
71
|
# @return [Time] Time the token expires
|
72
72
|
def expires
|
73
|
-
as_time_from_epoch(hash
|
73
|
+
as_time_from_epoch(hash[:expires], granularity: :ms, allow_nil: :true)
|
74
74
|
end
|
75
75
|
|
76
76
|
# @!attribute [r] capability
|
77
77
|
# @return [Hash] Capabilities assigned to this token
|
78
78
|
def capability
|
79
|
-
JSON.parse(hash.fetch(:capability))
|
79
|
+
JSON.parse(hash.fetch(:capability)) if hash.fetch(:capability)
|
80
80
|
end
|
81
81
|
|
82
82
|
# @!attribute [r] client_id
|
@@ -86,9 +86,11 @@ module Ably::Models
|
|
86
86
|
end
|
87
87
|
|
88
88
|
# Returns true if token is expired or about to expire
|
89
|
+
# For tokens that have not got an explicit expires attribute expired? will always return true
|
89
90
|
#
|
90
91
|
# @return [Boolean]
|
91
92
|
def expired?
|
93
|
+
return false if !expires
|
92
94
|
expires < Time.now + TOKEN_EXPIRY_BUFFER
|
93
95
|
end
|
94
96
|
|
@@ -6,6 +6,8 @@ module Ably::Modules
|
|
6
6
|
|
7
7
|
private
|
8
8
|
def as_since_epoch(time, options = {})
|
9
|
+
return nil if options[:allow_nil] && !time
|
10
|
+
|
9
11
|
granularity = options.fetch(:granularity, :ms)
|
10
12
|
|
11
13
|
case time
|
@@ -19,6 +21,8 @@ module Ably::Modules
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def as_time_from_epoch(time, options = {})
|
24
|
+
return nil if options[:allow_nil] && !time
|
25
|
+
|
22
26
|
granularity = options.fetch(:granularity, :ms)
|
23
27
|
|
24
28
|
case time
|
@@ -142,7 +142,7 @@ module Ably::Modules
|
|
142
142
|
def deferrable_for_state_change_to(target_state)
|
143
143
|
Ably::Util::SafeDeferrable.new(logger).tap do |deferrable|
|
144
144
|
fail_proc = Proc.new do |state_change|
|
145
|
-
deferrable.fail
|
145
|
+
deferrable.fail state_change.reason
|
146
146
|
end
|
147
147
|
once_or_if(target_state, else: fail_proc) do
|
148
148
|
yield self if block_given?
|
@@ -86,13 +86,20 @@ module Ably::Modules
|
|
86
86
|
module ClassMethods
|
87
87
|
def emits_klass
|
88
88
|
@emits_klass ||= if @emits_klass_name
|
89
|
-
|
89
|
+
get_const(@emits_klass_name)
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
def ensure_state_machine_emits(klass)
|
94
94
|
@emits_klass_name = klass
|
95
95
|
end
|
96
|
+
|
97
|
+
def get_const(klass_name)
|
98
|
+
klass_names = klass_name.split('::')
|
99
|
+
klass_names.inject(Kernel) do |klass, name|
|
100
|
+
klass.const_get(name)
|
101
|
+
end
|
102
|
+
end
|
96
103
|
end
|
97
104
|
end
|
98
105
|
end
|
data/lib/ably/realtime/auth.rb
CHANGED
@@ -65,9 +65,9 @@ module Ably
|
|
65
65
|
# token_details #=> Ably::Models::TokenDetails
|
66
66
|
# end
|
67
67
|
#
|
68
|
-
def authorise(
|
68
|
+
def authorise(token_params = {}, auth_options = {}, &success_callback)
|
69
69
|
async_wrap(success_callback) do
|
70
|
-
auth_sync.authorise(
|
70
|
+
auth_sync.authorise(token_params, auth_options)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -76,8 +76,8 @@ module Ably
|
|
76
76
|
# @option (see Ably::Auth#authorise)
|
77
77
|
# @return [Ably::Models::TokenDetails]
|
78
78
|
#
|
79
|
-
def authorise_sync(
|
80
|
-
auth_sync.authorise(
|
79
|
+
def authorise_sync(token_params = {}, auth_options = {})
|
80
|
+
auth_sync.authorise(token_params, auth_options)
|
81
81
|
end
|
82
82
|
|
83
83
|
# def_delegator :auth_sync, :request_token, :request_token_sync
|
@@ -100,9 +100,9 @@ module Ably
|
|
100
100
|
# token_details #=> Ably::Models::TokenDetails
|
101
101
|
# end
|
102
102
|
#
|
103
|
-
def request_token(
|
103
|
+
def request_token(token_params = {}, auth_options = {}, &success_callback)
|
104
104
|
async_wrap(success_callback) do
|
105
|
-
request_token_sync(
|
105
|
+
request_token_sync(token_params, auth_options)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
@@ -111,8 +111,8 @@ module Ably
|
|
111
111
|
# @option (see Ably::Auth#authorise)
|
112
112
|
# @return [Ably::Models::TokenDetails]
|
113
113
|
#
|
114
|
-
def request_token_sync(
|
115
|
-
auth_sync.request_token(
|
114
|
+
def request_token_sync(token_params = {}, auth_options = {})
|
115
|
+
auth_sync.request_token(token_params, auth_options)
|
116
116
|
end
|
117
117
|
|
118
118
|
# Creates and signs a token request that can then subsequently be used by any client to request a token
|
@@ -124,12 +124,12 @@ module Ably
|
|
124
124
|
# @yield [Models::TokenRequest]
|
125
125
|
#
|
126
126
|
# @example
|
127
|
-
# client.auth.create_token_request(id: 'asd.asd'
|
127
|
+
# client.auth.create_token_request({ ttl: 3600 }, id: 'asd.asd') do |token_request|
|
128
128
|
# token_request #=> Ably::Models::TokenRequest
|
129
129
|
# end
|
130
|
-
def create_token_request(
|
130
|
+
def create_token_request(token_params = {}, auth_options = {}, &success_callback)
|
131
131
|
async_wrap(success_callback) do
|
132
|
-
create_token_request_sync(
|
132
|
+
create_token_request_sync(token_params, auth_options)
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
@@ -138,8 +138,8 @@ module Ably
|
|
138
138
|
# @option (see Ably::Auth#authorise)
|
139
139
|
# @return [Ably::Models::TokenRequest]
|
140
140
|
#
|
141
|
-
def create_token_request_sync(
|
142
|
-
auth_sync.create_token_request(
|
141
|
+
def create_token_request_sync(token_params = {}, auth_options = {})
|
142
|
+
auth_sync.create_token_request(token_params, auth_options)
|
143
143
|
end
|
144
144
|
|
145
145
|
# Auth header string used in HTTP requests to Ably
|
@@ -134,7 +134,7 @@ module Ably
|
|
134
134
|
# puts "#{message.name} event received with #{message.data}"
|
135
135
|
# end
|
136
136
|
#
|
137
|
-
# channel.publish('click', 'body').errback do |
|
137
|
+
# channel.publish('click', 'body').errback do |error, message|
|
138
138
|
# puts "#{message.name} was not received, error #{error.message}"
|
139
139
|
# end
|
140
140
|
#
|
@@ -155,7 +155,7 @@ module Ably
|
|
155
155
|
end
|
156
156
|
|
157
157
|
queue_messages(messages).tap do |deferrable|
|
158
|
-
deferrable.callback
|
158
|
+
deferrable.callback(&success_block) if block_given?
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
@@ -77,10 +77,10 @@ module Ably::Realtime
|
|
77
77
|
def nack_messages(protocol_message, error)
|
78
78
|
(protocol_message.messages + protocol_message.presence).each do |message|
|
79
79
|
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.to_json}, protocol message: #{protocol_message}"
|
80
|
-
message.fail
|
80
|
+
message.fail error
|
81
81
|
end
|
82
82
|
logger.debug "Calling NACK failure callbacks for #{protocol_message.class.name} - #{protocol_message.to_json}"
|
83
|
-
protocol_message.fail
|
83
|
+
protocol_message.fail error
|
84
84
|
end
|
85
85
|
|
86
86
|
def drop_pending_queue_from_ack(ack_protocol_message)
|
@@ -146,7 +146,7 @@ module Ably::Realtime
|
|
146
146
|
end
|
147
147
|
|
148
148
|
connection.unsafe_on(:failed) do |error|
|
149
|
-
if can_transition_to?(:failed)
|
149
|
+
if can_transition_to?(:failed) && !channel.detached?
|
150
150
|
channel.transition_state_machine :failed, reason: Ably::Exceptions::ConnectionFailed.new('Connection failed', nil, 80002, error)
|
151
151
|
end
|
152
152
|
end
|
@@ -22,8 +22,9 @@ module Ably::Realtime
|
|
22
22
|
|
23
23
|
transition :from => :initialized, :to => [:attaching]
|
24
24
|
transition :from => :attaching, :to => [:attached, :detaching, :failed]
|
25
|
-
transition :from => :attached, :to => [:detaching, :failed]
|
25
|
+
transition :from => :attached, :to => [:detaching, :detached, :failed]
|
26
26
|
transition :from => :detaching, :to => [:detached, :attaching, :failed]
|
27
|
+
transition :from => :detached, :to => [:attaching, :attached, :failed]
|
27
28
|
transition :from => :failed, :to => [:attaching]
|
28
29
|
|
29
30
|
after_transition do |channel, transition|
|
@@ -68,7 +68,13 @@ module Ably::Realtime
|
|
68
68
|
|
69
69
|
when ACTION.Connect
|
70
70
|
when ACTION.Connected
|
71
|
-
connection.
|
71
|
+
if connection.disconnected? || connection.closing? || connection.closed? || connection.failed?
|
72
|
+
logger.debug "Incoming CONNECTED ProtocolMessage discarded as connection has moved on and is in state: #{connection.state}"
|
73
|
+
elsif connection.connected?
|
74
|
+
logger.error "CONNECTED ProtocolMessage should not have been received when the connection is in the CONNECTED state"
|
75
|
+
else
|
76
|
+
connection.transition_state_machine :connected, reason: protocol_message.error, protocol_message: protocol_message
|
77
|
+
end
|
72
78
|
|
73
79
|
when ACTION.Disconnect, ACTION.Disconnected
|
74
80
|
connection.transition_state_machine :disconnected, reason: protocol_message.error unless connection.disconnected?
|
@@ -163,17 +169,17 @@ module Ably::Realtime
|
|
163
169
|
def nack_messages(messages, protocol_message)
|
164
170
|
messages.each do |message|
|
165
171
|
logger.debug "Calling NACK failure callbacks for #{message.class.name} - #{message.to_json}, protocol message: #{protocol_message}"
|
166
|
-
message.fail
|
172
|
+
message.fail protocol_message.error
|
167
173
|
end
|
168
174
|
end
|
169
175
|
|
170
176
|
def drop_pending_queue_from_ack(ack_protocol_message)
|
171
177
|
message_serial_up_to = ack_protocol_message.message_serial + ack_protocol_message.count - 1
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
178
|
+
|
179
|
+
while !connection.__pending_message_ack_queue__.empty?
|
180
|
+
next_message = connection.__pending_message_ack_queue__.first
|
181
|
+
return if next_message.message_serial > message_serial_up_to
|
182
|
+
yield connection.__pending_message_ack_queue__.shift
|
177
183
|
end
|
178
184
|
end
|
179
185
|
|
@@ -44,6 +44,12 @@ module Ably::Realtime
|
|
44
44
|
|
45
45
|
non_blocking_loop_while(condition) do
|
46
46
|
protocol_message = outgoing_queue.shift
|
47
|
+
|
48
|
+
if (!connection.transport)
|
49
|
+
protocol_message.fail Ably::Exceptions::TransportClosed.new('Transport disconnected unexpectedly', nil, 80003)
|
50
|
+
next
|
51
|
+
end
|
52
|
+
|
47
53
|
current_transport_outgoing_message_bus.publish :protocol_message, protocol_message
|
48
54
|
|
49
55
|
if protocol_message.ack_required?
|
@@ -119,7 +119,7 @@ module Ably
|
|
119
119
|
# the failed state. Once closed, the library will not attempt to re-establish the
|
120
120
|
# connection without a call to {Connection#connect}.
|
121
121
|
#
|
122
|
-
# @yield
|
122
|
+
# @yield block is called as soon as this connection is in the Closed state
|
123
123
|
#
|
124
124
|
# @return [EventMachine::Deferrable]
|
125
125
|
#
|
@@ -134,7 +134,7 @@ module Ably
|
|
134
134
|
# Causes the library to attempt connection. If it was previously explicitly
|
135
135
|
# closed by the user, or was closed as a result of an unrecoverable error, a new connection will be opened.
|
136
136
|
#
|
137
|
-
# @yield
|
137
|
+
# @yield block is called as soon as this connection is in the Connected state
|
138
138
|
#
|
139
139
|
# @return [EventMachine::Deferrable]
|
140
140
|
#
|
@@ -190,7 +190,7 @@ module Ably
|
|
190
190
|
EventMachine::HttpRequest.new(url).get.tap do |http|
|
191
191
|
http.errback do
|
192
192
|
yield false if block_given?
|
193
|
-
deferrable.fail "Unable to connect to #{url}"
|
193
|
+
deferrable.fail Ably::Exceptions::ConnectionFailed.new("Unable to connect to #{url}", nil, 80000)
|
194
194
|
end
|
195
195
|
http.callback do
|
196
196
|
EventMachine.next_tick do
|
@@ -199,7 +199,7 @@ module Ably
|
|
199
199
|
if result
|
200
200
|
deferrable.succeed
|
201
201
|
else
|
202
|
-
deferrable.fail "Unexpected response from #{url} (#{http.response_header.status})"
|
202
|
+
deferrable.fail Ably::Exceptions::ConnectionFailed.new("Unexpected response from #{url} (#{http.response_header.status})", 400, 40000)
|
203
203
|
end
|
204
204
|
end
|
205
205
|
end
|