pubnub-ruby 3.3.0.2 → 3.3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pubnub.rb +87 -37
- data/lib/pubnub_request.rb +21 -3
- metadata +3 -3
data/lib/pubnub.rb
CHANGED
@@ -28,6 +28,17 @@ require 'active_support/core_ext/object/blank'
|
|
28
28
|
|
29
29
|
class Pubnub
|
30
30
|
|
31
|
+
SUCCESS_RESPONSE = 200
|
32
|
+
|
33
|
+
TIMEOUT_BAD_RESPONSE_CODE = 1
|
34
|
+
TIMEOUT_BAD_JSON_RESPONSE = 0.5
|
35
|
+
TIMEOUT_GENERAL_ERROR = 1
|
36
|
+
TIMEOUT_SUBSCRIBE = 310
|
37
|
+
TIMEOUT_NON_SUBSCRIBE = 5
|
38
|
+
|
39
|
+
PUBNUB_LOGGER = Logger.new("/tmp/pubnubError.log")
|
40
|
+
PUBNUB_LOGGER.level = Logger::DEBUG
|
41
|
+
|
31
42
|
class PresenceError < RuntimeError;
|
32
43
|
end
|
33
44
|
class PublishError < RuntimeError;
|
@@ -39,10 +50,7 @@ class Pubnub
|
|
39
50
|
|
40
51
|
attr_accessor :publish_key, :subscribe_key, :secret_key, :cipher_key, :ssl, :channel, :origin, :session_uuid
|
41
52
|
|
42
|
-
|
43
|
-
#ORIGINS = %w(newcloud-virginia.pubnub.com newcloud-california.pubnub.com newcloud-ireland.pubnub.com newcloud-tokyo.pubnub.com)
|
44
53
|
ORIGIN_HOST = 'pubsub.pubnub.com'
|
45
|
-
#ORIGIN_HOST = 'newcloud-california.pubnub.com'
|
46
54
|
#ORIGIN_HOST = 'test.pubnub.com'
|
47
55
|
|
48
56
|
def initialize(*args)
|
@@ -85,6 +93,7 @@ class Pubnub
|
|
85
93
|
#TODO: refactor into initializer code on request instantiation
|
86
94
|
|
87
95
|
publish_request.ssl = @ssl
|
96
|
+
publish_request.set_origin(options)
|
88
97
|
publish_request.set_channel(options)
|
89
98
|
publish_request.set_callback(options)
|
90
99
|
publish_request.set_cipher_key(options, self.cipher_key)
|
@@ -109,6 +118,7 @@ class Pubnub
|
|
109
118
|
#TODO: refactor into initializer code on request instantiation
|
110
119
|
|
111
120
|
subscribe_request.ssl = @ssl
|
121
|
+
subscribe_request.set_origin(options)
|
112
122
|
subscribe_request.set_channel(options)
|
113
123
|
subscribe_request.set_callback(options)
|
114
124
|
subscribe_request.set_cipher_key(options, self.cipher_key) unless subscribe_request.operation == "presence"
|
@@ -267,51 +277,25 @@ class Pubnub
|
|
267
277
|
end
|
268
278
|
|
269
279
|
private
|
270
|
-
|
280
|
+
|
271
281
|
def _request(request, is_reactor_running = false)
|
272
282
|
request.format_url!
|
273
|
-
#puts("- Fetching #{request.url}")
|
274
283
|
Thread.new{
|
275
284
|
begin
|
276
285
|
|
277
|
-
|
286
|
+
operation_timeout = %w(subscribe presence).include?(request.operation) ? TIMEOUT_SUBSCRIBE : TIMEOUT_NON_SUBSCRIBE
|
287
|
+
conn = EM::HttpRequest.new(request.url, :inactivity_timeout => operation_timeout) #client times out in 310s unless the server returns or timeout first
|
278
288
|
req = conn.get()
|
279
289
|
|
280
290
|
req.errback{
|
281
|
-
|
282
|
-
puts("#{Time.now}: Reconnecting from timeout.")
|
283
|
-
|
284
|
-
EM::Timer.new(1) do
|
285
|
-
_request(request, is_reactor_running)
|
286
|
-
end
|
287
|
-
else
|
288
|
-
error_message = "Unknown Error: #{req.response.to_s}"
|
289
|
-
puts(error_message)
|
290
|
-
request.callback.call([0, error_message])
|
291
|
-
|
292
|
-
EM.stop unless is_reactor_running
|
293
|
-
end
|
291
|
+
logAndRetryGeneralError(is_reactor_running, req, request)
|
294
292
|
}
|
295
293
|
|
296
294
|
req.callback {
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
only_success_status_is_acceptable = 200
|
301
|
-
|
302
|
-
if (req.response_header.http_status.to_i != only_success_status_is_acceptable)
|
303
|
-
|
304
|
-
error_message = "Server Error, status: #{req.response_header.http_status}, extended info: #{req.response}"
|
305
|
-
puts(error_message)
|
306
|
-
EM.stop unless is_reactor_running
|
295
|
+
if checkForBadJSON(req) == true
|
296
|
+
logAndRetryBadJSON(is_reactor_running, req, request)
|
307
297
|
else
|
308
|
-
|
309
|
-
if %w(subscribe presence).include?(request.operation) && (cycle != false || request.first_request?)
|
310
|
-
_request(request, is_reactor_running)
|
311
|
-
else
|
312
|
-
EM.stop unless is_reactor_running
|
313
|
-
end
|
314
|
-
|
298
|
+
processGoodResponse(is_reactor_running, req, request)
|
315
299
|
end
|
316
300
|
}
|
317
301
|
|
@@ -323,6 +307,72 @@ class Pubnub
|
|
323
307
|
}
|
324
308
|
end
|
325
309
|
|
310
|
+
def checkForBadJSON(req)
|
311
|
+
jsonError = false
|
312
|
+
begin
|
313
|
+
JSON.parse(req.response)
|
314
|
+
rescue => e
|
315
|
+
jsonError = true
|
316
|
+
end
|
317
|
+
jsonError
|
318
|
+
end
|
319
|
+
|
320
|
+
def processGoodResponse(is_reactor_running, req, request)
|
321
|
+
|
322
|
+
if (req.response_header.http_status.to_i != SUCCESS_RESPONSE)
|
323
|
+
logAndRetryBadResponseCode(is_reactor_running, req, request)
|
324
|
+
else
|
326
325
|
|
326
|
+
request.package_response!(req.response)
|
327
|
+
cycle = request.callback.call(request.response)
|
328
|
+
|
329
|
+
if %w(subscribe presence).include?(request.operation) && (cycle != false || request.first_request?)
|
330
|
+
_request(request, is_reactor_running)
|
331
|
+
else
|
332
|
+
EM.stop unless is_reactor_running
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
def logAndRetryGeneralError(is_reactor_running, req, request)
|
338
|
+
errMsg = "#{Time.now}: Network connectivity issue while attempting to reach #{request.url}"
|
339
|
+
logError(errMsg)
|
340
|
+
retryRequest(is_reactor_running, req, request, TIMEOUT_GENERAL_ERROR)
|
341
|
+
end
|
342
|
+
|
343
|
+
def logAndRetryBadJSON(is_reactor_running, req, request)
|
344
|
+
errMsg = "#{Time.now}: Retrying from bad JSON: #{req.response.to_s}"
|
345
|
+
logError(errMsg)
|
346
|
+
retryRequest(is_reactor_running, req, request, TIMEOUT_BAD_JSON_RESPONSE)
|
347
|
+
end
|
348
|
+
|
349
|
+
def logAndRetryBadResponseCode(is_reactor_running, req, request)
|
350
|
+
errMsg = "#{Time.now}: Retrying from bad server response code: (#{req.response_header.http_status.to_i}) #{req.response.to_s}"
|
351
|
+
logError(errMsg)
|
352
|
+
retryRequest(is_reactor_running, req, request, TIMEOUT_BAD_RESPONSE_CODE)
|
353
|
+
end
|
354
|
+
|
355
|
+
def logError(errMsg)
|
356
|
+
PUBNUB_LOGGER.debug(errMsg)
|
357
|
+
end
|
358
|
+
|
359
|
+
def retryRequest(is_reactor_running, req, request, delay)
|
360
|
+
|
361
|
+
if %w(subscribe presence).include?(request.operation)
|
362
|
+
EM::Timer.new(delay) do
|
363
|
+
_request(request, is_reactor_running)
|
364
|
+
end
|
365
|
+
else
|
366
|
+
error_msg = [0, "Request to #{request.url} failed."]
|
367
|
+
|
368
|
+
request.set_error(true)
|
369
|
+
request.callback.call(error_msg)
|
370
|
+
|
371
|
+
PUBNUB_LOGGER.debug(error_msg)
|
372
|
+
|
373
|
+
EM.stop unless is_reactor_running
|
374
|
+
end
|
375
|
+
|
376
|
+
end
|
327
377
|
|
328
|
-
end
|
378
|
+
end
|
data/lib/pubnub_request.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class PubnubRequest
|
2
2
|
attr_accessor :cipher_key, :host, :query, :response, :timetoken, :url, :operation, :callback, :publish_key, :subscribe_key, :secret_key, :channel, :jsonp, :message, :ssl, :port
|
3
|
-
attr_accessor :history_limit, :history_count, :history_start, :history_end, :history_reverse, :session_uuid, :last_timetoken
|
3
|
+
attr_accessor :history_limit, :history_count, :history_start, :history_end, :history_reverse, :session_uuid, :last_timetoken, :origin, :error
|
4
4
|
|
5
5
|
class RequestError < RuntimeError;
|
6
6
|
end
|
@@ -40,6 +40,24 @@ class PubnubRequest
|
|
40
40
|
self.channel == another.channel && self.message == another.message
|
41
41
|
end
|
42
42
|
|
43
|
+
def set_error(options)
|
44
|
+
options = HashWithIndifferentAccess.new(options)
|
45
|
+
|
46
|
+
if options[:error].present?
|
47
|
+
self.error = true
|
48
|
+
end
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_origin(options)
|
53
|
+
options = HashWithIndifferentAccess.new(options)
|
54
|
+
|
55
|
+
if options[:origin].present?
|
56
|
+
self.origin = options[:origin].to_s
|
57
|
+
self
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
43
61
|
def set_channel(options)
|
44
62
|
options = HashWithIndifferentAccess.new(options)
|
45
63
|
|
@@ -186,10 +204,10 @@ class PubnubRequest
|
|
186
204
|
raise(Pubnub::PublishError, "Missing .operation in PubnubRequest object") if self.operation.blank?
|
187
205
|
|
188
206
|
if @ssl.present?
|
189
|
-
origin = 'https://' + Pubnub::ORIGIN_HOST
|
207
|
+
origin = 'https://' + (self.origin.present? ? self.origin : Pubnub::ORIGIN_HOST)
|
190
208
|
@port = 443
|
191
209
|
else
|
192
|
-
origin = 'http://' + Pubnub::ORIGIN_HOST
|
210
|
+
origin = 'http://' + (self.origin.present? ? self.origin : Pubnub::ORIGIN_HOST)
|
193
211
|
@port = 80
|
194
212
|
end
|
195
213
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pubnub-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.0.
|
4
|
+
version: 3.3.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -121,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
121
|
version: '0'
|
122
122
|
requirements: []
|
123
123
|
rubyforge_project:
|
124
|
-
rubygems_version: 1.8.
|
124
|
+
rubygems_version: 1.8.23
|
125
125
|
signing_key:
|
126
126
|
specification_version: 3
|
127
127
|
summary: PubNub Official Ruby gem
|