pubnub 3.7.5 → 3.7.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pubnub might be problematic. Click here for more details.

@@ -0,0 +1,168 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/subscribe/ds/foo,foo.*/0/0?channel-group=group&pnsdk=PubNub-Ruby/3.7.5&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - '*/*'
14
+ User-Agent:
15
+ - Ruby
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Thu, 23 Jul 2015 15:10:20 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '30'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[[],"14376642203952013","",""]'
42
+ http_version:
43
+ recorded_at: Thu, 23 Jul 2015 15:10:20 GMT
44
+ - request:
45
+ method: get
46
+ uri: https://pubsub.pubnub.com/subscribe/ds/foo,foo.*/0/14376642203952013?channel-group=group&pnsdk=PubNub-Ruby/3.7.5&uuid=rubytests
47
+ body:
48
+ encoding: US-ASCII
49
+ string: ''
50
+ headers:
51
+ Accept-Encoding:
52
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
53
+ Accept:
54
+ - '*/*'
55
+ User-Agent:
56
+ - Ruby
57
+ Connection:
58
+ - keep-alive
59
+ Keep-Alive:
60
+ - 30
61
+ response:
62
+ status:
63
+ code: 200
64
+ message: OK
65
+ headers:
66
+ Date:
67
+ - Thu, 23 Jul 2015 15:10:24 GMT
68
+ Content-Type:
69
+ - text/javascript; charset="UTF-8"
70
+ Content-Length:
71
+ - '56'
72
+ Connection:
73
+ - keep-alive
74
+ Cache-Control:
75
+ - no-cache
76
+ Access-Control-Allow-Origin:
77
+ - '*'
78
+ Access-Control-Allow-Methods:
79
+ - GET
80
+ body:
81
+ encoding: UTF-8
82
+ string: '[[{"text":"hey"}],"14376642242988715","foo.*","foo.foo"]'
83
+ http_version:
84
+ recorded_at: Thu, 23 Jul 2015 15:10:24 GMT
85
+ - request:
86
+ method: get
87
+ uri: https://pubsub.pubnub.com/subscribe/ds/foo,foo.*/0/14376642242988715?channel-group=group&pnsdk=PubNub-Ruby/3.7.5&uuid=rubytests
88
+ body:
89
+ encoding: US-ASCII
90
+ string: ''
91
+ headers:
92
+ Accept-Encoding:
93
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
94
+ Accept:
95
+ - '*/*'
96
+ User-Agent:
97
+ - Ruby
98
+ Connection:
99
+ - keep-alive
100
+ Keep-Alive:
101
+ - 30
102
+ response:
103
+ status:
104
+ code: 200
105
+ message: OK
106
+ headers:
107
+ Date:
108
+ - Thu, 23 Jul 2015 15:10:27 GMT
109
+ Content-Type:
110
+ - text/javascript; charset="UTF-8"
111
+ Content-Length:
112
+ - '157'
113
+ Connection:
114
+ - keep-alive
115
+ Cache-Control:
116
+ - no-cache
117
+ Access-Control-Allow-Origin:
118
+ - '*'
119
+ Access-Control-Allow-Methods:
120
+ - GET
121
+ body:
122
+ encoding: UTF-8
123
+ string: '[[{"action": "leave", "timestamp": 1437664227, "uuid": "c7769435-68b3-48b0-9065-08cafce285df",
124
+ "occupancy": 0}],"14376642278720422","foo.*","foo.foo-pnpres"]'
125
+ http_version:
126
+ recorded_at: Thu, 23 Jul 2015 15:10:28 GMT
127
+ - request:
128
+ method: get
129
+ uri: https://pubsub.pubnub.com/subscribe/ds/foo,foo.*/0/14376642278720422?channel-group=group&pnsdk=PubNub-Ruby/3.7.5&uuid=rubytests
130
+ body:
131
+ encoding: US-ASCII
132
+ string: ''
133
+ headers:
134
+ Accept-Encoding:
135
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
136
+ Accept:
137
+ - '*/*'
138
+ User-Agent:
139
+ - Ruby
140
+ Connection:
141
+ - keep-alive
142
+ Keep-Alive:
143
+ - 30
144
+ response:
145
+ status:
146
+ code: 200
147
+ message: OK
148
+ headers:
149
+ Date:
150
+ - Thu, 23 Jul 2015 15:10:30 GMT
151
+ Content-Type:
152
+ - text/javascript; charset="UTF-8"
153
+ Content-Length:
154
+ - '50'
155
+ Connection:
156
+ - keep-alive
157
+ Cache-Control:
158
+ - no-cache
159
+ Access-Control-Allow-Origin:
160
+ - '*'
161
+ Access-Control-Allow-Methods:
162
+ - GET
163
+ body:
164
+ encoding: UTF-8
165
+ string: '[[{"text":"hey"}],"14376642302336303","foo","foo"]'
166
+ http_version:
167
+ recorded_at: Thu, 23 Jul 2015 15:10:30 GMT
168
+ recorded_with: VCR 2.9.2
@@ -4,6 +4,7 @@ module Pubnub
4
4
  INSTANCE_VARIABLES = [
5
5
  :channel,
6
6
  :channel_group,
7
+ :wildcard_channel,
7
8
  :error,
8
9
  :error_message,
9
10
  :first,
data/lib/pubnub/event.rb CHANGED
@@ -10,13 +10,14 @@ module Pubnub
10
10
  @message = options[:message]
11
11
  @http_sync = options[:http_sync]
12
12
  @callback = options[:callback]
13
- @error_callback = options[:error_callback] || app.env[:error_callback]
14
- @connect_callback = options[:connect_callback] || app.env[:connect_callback]
15
- @ssl = options[:ssl] || app.env[:ssl]
13
+ @error_callback = options[:error_callback] || app.env[:error_callback]
14
+ @presence_callback= options[:presence_callback] || app.env[:presence_callback]
15
+ @connect_callback = options[:connect_callback] || app.env[:connect_callback]
16
+ @ssl = options[:ssl] || app.env[:ssl]
16
17
 
17
18
  @cipher_key = app.env[:cipher_key]
18
19
  @secret_key = app.env[:secret_key]
19
- @auth_key = options[:auth_key] || app.env[:auth_key]
20
+ @auth_key = options[:auth_key] || app.env[:auth_key]
20
21
  @publish_key = app.env[:publish_key]
21
22
  @subscribe_key = app.env[:subscribe_key]
22
23
 
@@ -42,6 +43,7 @@ module Pubnub
42
43
  end
43
44
 
44
45
  def send_request(app)
46
+ Pubnub.logger.debug(:pubnub){'Pubnub::Event#send_request'}
45
47
  if app.disabled_persistent_connection?
46
48
  @response = Net::HTTP.get_response uri(app)
47
49
  else
@@ -51,6 +53,7 @@ module Pubnub
51
53
 
52
54
  def start_event(app, count = 0)
53
55
  begin
56
+ @response = nil
54
57
  if count <= app.env[:max_retries]
55
58
  Pubnub.logger.debug(:pubnub){'Event#start_event | sending request'}
56
59
  Pubnub.logger.debug(:pubnub){"Event#start_event | tt: #{@timetoken}; ctt #{app.env[:timetoken]}"}
@@ -59,7 +62,7 @@ module Pubnub
59
62
 
60
63
  error = response_error(@response, app)
61
64
 
62
- if ![error].flatten.include?(:json) || count > app.env[:max_retries]
65
+ if ![error].flatten.include?(:json) || count > app.env[:max_retries] || app.env[:max_retries] == 0
63
66
  handle_response(@response, app, error)
64
67
  else
65
68
  start_event(app, count + 1)
@@ -331,6 +334,15 @@ module Pubnub
331
334
  end
332
335
  end
333
336
 
337
+ @wildcard_channel.each do |wc|
338
+ if app.env[:subscriptions][@origin].get_wildcard_channels.include?(wc)
339
+ @wildcard_channel.delete(wc)
340
+ Pubnub.logger.error(:pubnub){"Already subscribed to wildcard channel #{wc}, you have to leave that channel first"}
341
+ else
342
+ app.env[:subscriptions][@origin].add_wildcard_channel(wc, app)
343
+ end
344
+ end
345
+
334
346
  if @channel.empty?
335
347
  false
336
348
  else
@@ -340,17 +352,21 @@ module Pubnub
340
352
  end
341
353
 
342
354
  if app.env[:subscriptions][@origin].nil?
343
- app.env[:subscriptions][@origin] = self if app.env[:subscriptions][@origin].nil?
344
- app.env[:callbacks_pool] = Hash.new if app.env[:callbacks_pool].nil?
345
- app.env[:callbacks_pool][:channel] = Hash.new if app.env[:callbacks_pool][:channel].nil?
346
- app.env[:callbacks_pool][:channel_group] = Hash.new if app.env[:callbacks_pool][:channel_group].nil?
347
- app.env[:callbacks_pool][:channel][@origin] = Hash.new if app.env[:callbacks_pool][:channel][@origin].nil?
348
- app.env[:callbacks_pool][:channel_group][@origin] = Hash.new if app.env[:callbacks_pool][:channel_group][@origin].nil?
349
- app.env[:error_callbacks_pool] = Hash.new if app.env[:error_callbacks_pool].nil?
350
- app.env[:error_callbacks_pool][:channel] = Hash.new if app.env[:error_callbacks_pool][:channel].nil?
351
- app.env[:error_callbacks_pool][:channel][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel][@origin].nil?
352
- app.env[:error_callbacks_pool][:channel_group] = Hash.new if app.env[:error_callbacks_pool][:channel_group].nil?
353
- app.env[:error_callbacks_pool][:channel_group][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel_group][@origin].nil?
355
+ app.env[:subscriptions][@origin] = self if app.env[:subscriptions][@origin].nil?
356
+ app.env[:callbacks_pool] = Hash.new if app.env[:callbacks_pool].nil?
357
+ app.env[:callbacks_pool][:channel] = Hash.new if app.env[:callbacks_pool][:channel].nil?
358
+ app.env[:callbacks_pool][:channel_group] = Hash.new if app.env[:callbacks_pool][:channel_group].nil?
359
+ app.env[:callbacks_pool][:wildcard_channel] = Hash.new if app.env[:callbacks_pool][:wildcard_channel].nil?
360
+ app.env[:callbacks_pool][:channel][@origin] = Hash.new if app.env[:callbacks_pool][:channel][@origin].nil?
361
+ app.env[:callbacks_pool][:channel_group][@origin] = Hash.new if app.env[:callbacks_pool][:channel_group][@origin].nil?
362
+ app.env[:callbacks_pool][:wildcard_channel][@origin] = Hash.new if app.env[:callbacks_pool][:wildcard_channel][@origin].nil?
363
+ app.env[:error_callbacks_pool] = Hash.new if app.env[:error_callbacks_pool].nil?
364
+ app.env[:error_callbacks_pool][:channel] = Hash.new if app.env[:error_callbacks_pool][:channel].nil?
365
+ app.env[:error_callbacks_pool][:channel][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel][@origin].nil?
366
+ app.env[:error_callbacks_pool][:channel_group] = Hash.new if app.env[:error_callbacks_pool][:channel_group].nil?
367
+ app.env[:error_callbacks_pool][:channel_group][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel_group][@origin].nil?
368
+ app.env[:error_callbacks_pool][:wildcard_channel] = Hash.new if app.env[:error_callbacks_pool][:wildcard_channel].nil?
369
+ app.env[:error_callbacks_pool][:wildcard_channel][@origin] = @error_callback if app.env[:error_callbacks_pool][:wildcard_channel][@origin].nil?
354
370
 
355
371
  @channel.each do |channel|
356
372
  app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
@@ -362,10 +378,16 @@ module Pubnub
362
378
  app.env[:callbacks_pool][:channel_group][@origin][channel_group][:callback] = @callback unless app.env[:callbacks_pool][:channel_group][@origin][:callback]
363
379
  end
364
380
 
381
+ @wildcard_channel.each do |wildcard_channel|
382
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel] = Hash.new
383
+
384
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:callback] = @callback unless app.env[:callbacks_pool][:wildcard_channel][@origin][:callback]
385
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:presence_callback] = @presence_callback unless app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:presence_callback]
386
+ end
387
+
365
388
  else
366
389
  @channel.each do |channel|
367
390
  app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
368
- app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
369
391
 
370
392
  app.env[:callbacks_pool][:channel][@origin][channel][:callback] = @callback unless app.env[:callbacks_pool][:channel][@origin][:callback]
371
393
  app.env[:callbacks_pool][:channel][@origin][channel][:error_callback] = @error_callback unless app.env[:callbacks_pool][:channel][@origin][:error_callback]
@@ -373,11 +395,18 @@ module Pubnub
373
395
 
374
396
  @channel_group.each do |channel_group|
375
397
  app.env[:callbacks_pool][:channel_group][@origin][channel_group] = Hash.new
376
- app.env[:callbacks_pool][:channel_group][@origin][channel_group] = Hash.new
377
398
 
378
399
  app.env[:callbacks_pool][:channel_group][@origin][channel_group][:callback] = @callback unless app.env[:callbacks_pool][:channel_group][@origin][:callback]
379
400
  app.env[:callbacks_pool][:channel_group][@origin][channel_group][:error_callback] = @error_callback unless app.env[:callbacks_pool][:channel_group][@origin][:error_callback]
380
401
  end
402
+
403
+ @wildcard_channel.each do |wildcard_channel|
404
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel] = Hash.new
405
+
406
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:callback] = @callback unless app.env[:callbacks_pool][:wildcard_channel][@origin][:callback]
407
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:error_callback] = @error_callback unless app.env[:callbacks_pool][:wildcard_channel][@origin][:error_callback]
408
+ app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:presence_callback] = @presence_callback unless app.env[:callbacks_pool][:wildcard_channel][@origin][wildcard_channel][:presence_callback]
409
+ end
381
410
  end
382
411
 
383
412
  app.start_subscribe
@@ -394,7 +423,7 @@ module Pubnub
394
423
 
395
424
  def add_channel_group(cg, app)
396
425
  @channel_group << cg
397
- Pubnub.logger.debug(:pubnub){'SubscribeEvent#add_channel | Added channel'}
426
+ Pubnub.logger.debug(:pubnub){'SubscribeEvent#add_channel_group | Added channel'}
398
427
  end
399
428
 
400
429
  def add_channel(channel, app)
@@ -402,11 +431,16 @@ module Pubnub
402
431
  Pubnub.logger.debug(:pubnub){'SubscribeEvent#add_channel | Added channel'}
403
432
  end
404
433
 
434
+ def add_wildcard_channel(wc, app)
435
+ @wildcard_channel << wc
436
+ Pubnub.logger.debug(:pubnub){'SubscribeEvent#add_wildcard_channel | Added channel'}
437
+ end
438
+
405
439
  def remove_channel(channel, app)
406
440
  @channel = @channel - format_channels(channel)
407
441
  Pubnub.logger.debug(:pubnub){'SubscribeEvent#remove_channel | Removed channel'}
408
442
  begin
409
- shutdown_subscribe(app) if @channel.empty? && @channel_group.empty?
443
+ shutdown_subscribe(app) if @channel.empty? && @channel_group.empty? && @wildcard_channel.empty?
410
444
  rescue => e
411
445
  Pubnub.logger.error(:pubnub){e.message}
412
446
  Pubnub.logger.error(:pubnub){e.backtrace}
@@ -415,9 +449,20 @@ module Pubnub
415
449
 
416
450
  def remove_channel_group(channel_group, app)
417
451
  @channel_group = @channel_group - format_channel_group(channel_group, false)
418
- Pubnub.logger.debug(:pubnub){'SubscribeEvent#remove_channel | Removed channel'}
452
+ Pubnub.logger.debug(:pubnub){'SubscribeEvent#remove_channel_group | Removed channel'}
453
+ begin
454
+ shutdown_subscribe(app) if @channel.empty? && @channel_group.empty? && @wildcard_channel.empty?
455
+ rescue => e
456
+ Pubnub.logger.error(:pubnub){e.message}
457
+ Pubnub.logger.error(:pubnub){e.backtrace}
458
+ end
459
+ end
460
+
461
+ def remove_wildcard_channel(wc, app)
462
+ @wildcard_channel -= [wc]
463
+ Pubnub.logger.debug(:pubnub){'SubscribeEvent#remove_wildcard_channel | Removed channel'}
419
464
  begin
420
- shutdown_subscribe(app) if @channel.empty? && @channel_group.empty?
465
+ shutdown_subscribe(app) if @channel.empty? && @channel_group.empty? && @wildcard_channel.empty?
421
466
  rescue => e
422
467
  Pubnub.logger.error(:pubnub){e.message}
423
468
  Pubnub.logger.error(:pubnub){e.backtrace}
@@ -432,6 +477,10 @@ module Pubnub
432
477
  @channel_group
433
478
  end
434
479
 
480
+ def get_wildcard_channels
481
+ @wildcard_channel
482
+ end
483
+
435
484
  private
436
485
 
437
486
  def parameters(app)
@@ -473,10 +522,14 @@ module Pubnub
473
522
  begin
474
523
  Pubnub.logger.debug(:pubnub){'Event#fire_callbacks async'}
475
524
  envelopes.each do |envelope|
476
- if envelope.channel_group && app.env[:callbacks_pool][:channel_group][@origin][envelope.channel_group]
525
+ if group_envelope?(envelope, app) # WITH GROUP
477
526
  app.env[:callbacks_pool][:channel_group][@origin][envelope.channel_group][:callback].call(envelope) if !envelope.error && !envelope.timetoken_update
478
- else
527
+ elsif channel_envelope?(envelope, app) # CHANNEL SUBSCRIBE
479
528
  app.env[:callbacks_pool][:channel][@origin][encode_channel(envelope.channel)][:callback].call(envelope) if !envelope.error && !envelope.timetoken_update
529
+ elsif wc_pnpres_envelope(envelope, app) # wildcard pnpres
530
+ app.env[:callbacks_pool][:wildcard_channel][@origin][encode_channel(envelope.wildcard_channel)][:presence_callback].call(envelope) if !envelope.error && !envelope.timetoken_update
531
+ elsif wc_envelope?(envelope, app) # wildcard
532
+ app.env[:callbacks_pool][:wildcard_channel][@origin][encode_channel(envelope.wildcard_channel)][:callback].call(envelope) if !envelope.error && !envelope.timetoken_update
480
533
  end
481
534
  end
482
535
  Pubnub.logger.debug(:pubnub){'We can send next request now'}
@@ -491,6 +544,30 @@ module Pubnub
491
544
 
492
545
  end
493
546
 
547
+ def group_envelope?(envelope, app)
548
+ envelope.channel_group && app.env[:callbacks_pool][:channel_group][@origin][envelope.channel_group]
549
+ rescue
550
+ false
551
+ end
552
+
553
+ def channel_envelope?(envelope, app)
554
+ app.env[:callbacks_pool][:channel][@origin][encode_channel(envelope.channel)]
555
+ rescue
556
+ false
557
+ end
558
+
559
+ def wc_pnpres_envelope(envelope, app)
560
+ app.env[:callbacks_pool][:wildcard_channel][@origin][envelope.wildcard_channel][:presence_callback] && (envelope.channel.index('-pnpres') || envelope.wildcard_channel.index('-pnpres'))
561
+ rescue
562
+ false
563
+ end
564
+
565
+ def wc_envelope?(envelope, app)
566
+ app.env[:callbacks_pool][:wildcard_channel][@origin][envelope.wildcard_channel][:callback]
567
+ rescue
568
+ false
569
+ end
570
+
494
571
  def setup_connection(app)
495
572
  app.subscribe_event_connections_pool[@origin] = new_connection(app)
496
573
  end
@@ -504,7 +581,7 @@ module Pubnub
504
581
  end
505
582
 
506
583
  def path(app)
507
- path = "/subscribe/#{@subscribe_key}/#{channels_for_url(@channel)}/0/#{@timetoken}".gsub(/\?/,'%3F')
584
+ path = "/subscribe/#{@subscribe_key}/#{channels_for_url(@channel + @wildcard_channel)}/0/#{@timetoken}".gsub(/\?/,'%3F')
508
585
  end
509
586
 
510
587
  def timetoken(parsed_response)
@@ -534,6 +611,7 @@ module Pubnub
534
611
  envelopes << Envelope.new(
535
612
  {
536
613
  :channel => @channel,
614
+ :parsed_response => parsed_response,
537
615
  :timetoken => timetoken(parsed_response)
538
616
  },
539
617
  app
@@ -544,6 +622,7 @@ module Pubnub
544
622
  {
545
623
  :channel => @channel.first,
546
624
  :response_message => parsed_response,
625
+ :parsed_response => parsed_response,
547
626
  :timetoken => timetoken(parsed_response),
548
627
  :timetoken_update => true
549
628
  },
@@ -573,6 +652,7 @@ module Pubnub
573
652
  :message => message(parsed_response, i, channel, app),
574
653
  :channel => channel,
575
654
  :response_message => parsed_response,
655
+ :parsed_response => parsed_response,
576
656
  :timetoken => timetoken(parsed_response)
577
657
  },
578
658
  app
@@ -588,6 +668,11 @@ module Pubnub
588
668
  channel = parsed_response[3].split(',')[i]
589
669
  channel_group = parsed_response[2].split(',')[i]
590
670
 
671
+ if channel_group.index('.*')
672
+ wildcard_channel = channel_group
673
+ channel_group = nil
674
+ end
675
+
591
676
  Pubnub.logger.debug(:pubnub){"#{parsed_response}"}
592
677
 
593
678
  envelopes << Envelope.new(
@@ -595,7 +680,9 @@ module Pubnub
595
680
  :message => message(parsed_response, i, channel, app),
596
681
  :channel => channel,
597
682
  :channel_group => channel_group,
683
+ :wildcard_channel => wildcard_channel,
598
684
  :response_message => parsed_response,
685
+ :parsed_response => parsed_response,
599
686
  :timetoken => timetoken(parsed_response)
600
687
  },
601
688
  app