pubnub 3.6.10 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pubnub might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.txt +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +144 -10
- data/examples/demo_console.rb +61 -23
- data/fixtures/vcr_cassettes/cg/add-c-as-array.yml +51 -0
- data/fixtures/vcr_cassettes/cg/add-c-as-csv.yml +51 -0
- data/fixtures/vcr_cassettes/cg/add-c-as-string.yml +51 -0
- data/fixtures/vcr_cassettes/cg/add-c-as-symbol.yml +51 -0
- data/fixtures/vcr_cassettes/cg/audit-cg.yml +44 -0
- data/fixtures/vcr_cassettes/cg/audit-ns.yml +44 -0
- data/fixtures/vcr_cassettes/cg/grant-cg.yml +44 -0
- data/fixtures/vcr_cassettes/cg/grant-ns.yml +44 -0
- data/fixtures/vcr_cassettes/cg/here_now-cg.yml +51 -0
- data/fixtures/vcr_cassettes/cg/leave-cg-c.yml +132 -0
- data/fixtures/vcr_cassettes/cg/leave-cg.yml +133 -0
- data/fixtures/vcr_cassettes/cg/list-all-c-in-in-ns-cg.yml +50 -0
- data/fixtures/vcr_cassettes/cg/list-all-c-in-non-ns-cg.yml +51 -0
- data/fixtures/vcr_cassettes/cg/list-all-cg-in-ns.yml +51 -0
- data/fixtures/vcr_cassettes/cg/list-all-namespaces.yml +50 -0
- data/fixtures/vcr_cassettes/cg/list-all-non-namespaced-cg.yml +49 -0
- data/fixtures/vcr_cassettes/cg/remove-c-as-array.yml +51 -0
- data/fixtures/vcr_cassettes/cg/remove-c-as-csv.yml +51 -0
- data/fixtures/vcr_cassettes/cg/remove-c-as-string.yml +51 -0
- data/fixtures/vcr_cassettes/cg/remove-c-as-symbol.yml +51 -0
- data/fixtures/vcr_cassettes/cg/remove-cg-from-ns-csv.yml +51 -0
- data/fixtures/vcr_cassettes/cg/remove-ns-csv.yml +51 -0
- data/fixtures/vcr_cassettes/cg/subscribe-cg-and-channel.yml +85 -0
- data/fixtures/vcr_cassettes/cg/subscribe-cg-only.yml +85 -0
- data/lib/pubnub/client.rb +6 -2
- data/lib/pubnub/envelope.rb +1 -0
- data/lib/pubnub/event.rb +105 -20
- data/lib/pubnub/events/audit.rb +13 -0
- data/lib/pubnub/events/channel_registration.rb +132 -0
- data/lib/pubnub/events/grant.rb +17 -7
- data/lib/pubnub/events/heartbeat.rb +29 -3
- data/lib/pubnub/events/here_now.rb +21 -7
- data/lib/pubnub/events/leave.rb +27 -3
- data/lib/pubnub/events/presence.rb +4 -3
- data/lib/pubnub/events/set_state.rb +16 -3
- data/lib/pubnub/events/state.rb +15 -9
- data/lib/pubnub/events/subscribe.rb +17 -3
- data/lib/pubnub/formatter.rb +31 -7
- data/lib/pubnub/pam.rb +4 -3
- data/lib/pubnub/version.rb +1 -1
- data/spec/lib/integration/channel_groups_spec.rb +120 -0
- data/spec/lib/integration/channel_registration_spec.rb +317 -0
- data/spec/spec_helper.rb +0 -1
- metadata +31 -2
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/v1/channel-registration/sub-key/demo/namespace/foo/channel-group/foo?pnsdk=PubNub-Ruby/3.7.0beta0&remove=one&uuid=7508c869-9965-432e-9c0c-931cb960b628
|
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
|
+
- Tue, 04 Nov 2014 14:19:30 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '79'
|
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
|
+
Accept-Ranges:
|
40
|
+
- bytes
|
41
|
+
Age:
|
42
|
+
- '0'
|
43
|
+
Server:
|
44
|
+
- Pubnub
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"status": 200, "message": "OK", "service": "channel-registry", "error":
|
48
|
+
false}'
|
49
|
+
http_version:
|
50
|
+
recorded_at: Tue, 04 Nov 2014 14:19:30 GMT
|
51
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/v1/channel-registration/sub-key/demo/namespace/foo/channel-group/foo?pnsdk=PubNub-Ruby/3.7.0beta0&remove=one&uuid=9f5732f0-1b41-4247-bbaf-11346ecc1a20
|
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
|
+
- Tue, 04 Nov 2014 14:19:29 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '79'
|
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
|
+
Accept-Ranges:
|
40
|
+
- bytes
|
41
|
+
Age:
|
42
|
+
- '0'
|
43
|
+
Server:
|
44
|
+
- Pubnub
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"status": 200, "message": "OK", "service": "channel-registry", "error":
|
48
|
+
false}'
|
49
|
+
http_version:
|
50
|
+
recorded_at: Tue, 04 Nov 2014 14:19:29 GMT
|
51
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/v1/channel-registration/sub-key/demo/namespace/foo/channel-group/foo/remove?pnsdk=PubNub-Ruby/3.7.0beta0&uuid=908068fb-7415-44df-8dab-805db02eebad
|
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
|
+
- Tue, 04 Nov 2014 15:46:27 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '79'
|
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
|
+
Accept-Ranges:
|
40
|
+
- bytes
|
41
|
+
Age:
|
42
|
+
- '0'
|
43
|
+
Server:
|
44
|
+
- Pubnub
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"status": 200, "message": "OK", "service": "channel-registry", "error":
|
48
|
+
false}'
|
49
|
+
http_version:
|
50
|
+
recorded_at: Tue, 04 Nov 2014 15:46:27 GMT
|
51
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/v1/channel-registration/sub-key/demo/namespace/foo/remove?pnsdk=PubNub-Ruby/3.7.0beta0&uuid=7ce7b2c1-060d-48ae-a669-b13bd7087579
|
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
|
+
- Tue, 04 Nov 2014 15:46:33 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '79'
|
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
|
+
Accept-Ranges:
|
40
|
+
- bytes
|
41
|
+
Age:
|
42
|
+
- '0'
|
43
|
+
Server:
|
44
|
+
- Pubnub
|
45
|
+
body:
|
46
|
+
encoding: UTF-8
|
47
|
+
string: '{"status": 200, "message": "OK", "service": "channel-registry", "error":
|
48
|
+
false}'
|
49
|
+
http_version:
|
50
|
+
recorded_at: Tue, 04 Nov 2014 15:46:33 GMT
|
51
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,85 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/subscribe/demo/bot/0/0?channel-group=foo:foo&pnsdk=PubNub-Ruby/3.7.0beta0&uuid=0a42a66b-0dca-4566-8e36-695125d50c1f
|
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
|
+
- Wed, 05 Nov 2014 11:49:34 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '24'
|
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: '[[],"14151881738727981"]'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Wed, 05 Nov 2014 11:49:39 GMT
|
44
|
+
- request:
|
45
|
+
method: get
|
46
|
+
uri: http://pubsub.pubnub.com/subscribe/demo/bot/0/14151881738727981?channel-group=foo:foo&pnsdk=PubNub-Ruby/3.7.0beta0&uuid=0a42a66b-0dca-4566-8e36-695125d50c1f
|
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
|
+
- Wed, 05 Nov 2014 11:49:35 GMT
|
68
|
+
Content-Type:
|
69
|
+
- text/javascript; charset="UTF-8"
|
70
|
+
Content-Length:
|
71
|
+
- '80'
|
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: '[["*****.......... 3520 - 2014-11-05 03:49:35"],"14151881750508799","bot","bot"]'
|
83
|
+
http_version:
|
84
|
+
recorded_at: Wed, 05 Nov 2014 11:49:40 GMT
|
85
|
+
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,85 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://pubsub.pubnub.com/subscribe/demo/,/0/0?channel-group=foo:foo&pnsdk=PubNub-Ruby/3.7.0beta0&uuid=0a3f303a-6242-434a-a491-f85ee00fab26
|
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
|
+
- Wed, 05 Nov 2014 12:08:46 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/javascript; charset="UTF-8"
|
29
|
+
Content-Length:
|
30
|
+
- '24'
|
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: '[[],"14151893249234255"]'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Wed, 05 Nov 2014 12:08:51 GMT
|
44
|
+
- request:
|
45
|
+
method: get
|
46
|
+
uri: http://pubsub.pubnub.com/subscribe/demo/,/0/14151893249234255?channel-group=foo:foo&pnsdk=PubNub-Ruby/3.7.0beta0&uuid=0a3f303a-6242-434a-a491-f85ee00fab26
|
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
|
+
- Wed, 05 Nov 2014 12:08:46 GMT
|
68
|
+
Content-Type:
|
69
|
+
- text/javascript; charset="UTF-8"
|
70
|
+
Content-Length:
|
71
|
+
- '84'
|
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: '[["*****.......... 4495 - 2014-11-05 04:08:46"],"14151893260958179","foo:foo","bot"]'
|
83
|
+
http_version:
|
84
|
+
recorded_at: Wed, 05 Nov 2014 12:08:51 GMT
|
85
|
+
recorded_with: VCR 2.9.2
|
data/lib/pubnub/client.rb
CHANGED
@@ -16,7 +16,7 @@ module Pubnub
|
|
16
16
|
attr_reader :env
|
17
17
|
attr_accessor :single_event_connections_pool, :subscribe_event_connections_pool, :uuid, :async_events
|
18
18
|
|
19
|
-
EVENTS = %w(publish subscribe presence leave history here_now audit grant revoke time heartbeat where_now state set_state)
|
19
|
+
EVENTS = %w(publish subscribe presence leave history here_now audit grant revoke time heartbeat where_now state set_state channel_registration)
|
20
20
|
VERSION = Pubnub::VERSION
|
21
21
|
|
22
22
|
EVENTS.each do |event_name|
|
@@ -143,7 +143,7 @@ module Pubnub
|
|
143
143
|
@env[:respirator] = EM.add_periodic_timer((@env[:heartbeat].to_i/2) - 1) do
|
144
144
|
@env[:subscriptions].each do |origin, subscribe|
|
145
145
|
$logger.debug('Pubnub'){'Pubnub::Client#start_respirator | BUM'}
|
146
|
-
EM.defer { heartbeat(:channel => subscribe.get_channels){ |e| $logger.debug('Pubnub::Client#start_respirator | bum') } }
|
146
|
+
EM.defer { heartbeat(:channel => subscribe.get_channels, :group => subscribe.get_channel_groups ){ |e| $logger.debug('Pubnub::Client#start_respirator | bum') } }
|
147
147
|
end
|
148
148
|
end unless @env[:respirator]
|
149
149
|
|
@@ -222,6 +222,10 @@ module Pubnub
|
|
222
222
|
alias_method :session_uuid=, :set_uuid
|
223
223
|
alias_method :uuid=, :set_uuid
|
224
224
|
|
225
|
+
def uuid
|
226
|
+
@env[:uuid]
|
227
|
+
end
|
228
|
+
|
225
229
|
def set_auth_key(auth_key)
|
226
230
|
leave_all unless @env[:subscriptions].empty?
|
227
231
|
@env[:auth_key] = auth_key
|
data/lib/pubnub/envelope.rb
CHANGED
data/lib/pubnub/event.rb
CHANGED
@@ -7,6 +7,7 @@ module Pubnub
|
|
7
7
|
@app = app
|
8
8
|
@origin = options[:origin] || app.env[:origin]
|
9
9
|
@channel = options[:channel]
|
10
|
+
@channel_group = options[:group]
|
10
11
|
@message = options[:message]
|
11
12
|
@http_sync = options[:http_sync]
|
12
13
|
@callback = options[:callback]
|
@@ -20,11 +21,16 @@ module Pubnub
|
|
20
21
|
@publish_key = app.env[:publish_key]
|
21
22
|
@subscribe_key = app.env[:subscribe_key]
|
22
23
|
|
24
|
+
@write = options[:write]
|
25
|
+
@read = options[:read]
|
26
|
+
@manage = options[:manage]
|
27
|
+
|
23
28
|
@response = nil
|
24
29
|
@timetoken = app.env[:timetoken] || 0
|
25
30
|
validate!
|
26
|
-
@original_channel = format_channels(@channel, false)
|
27
31
|
@channel = format_channels(@channel)
|
32
|
+
@channel_group = format_channel_group(options[:group], false)
|
33
|
+
@original_channel = format_channels(@channel, false)
|
28
34
|
$logger.debug('Pubnub'){"Event#initialize | Initialized #{self.class.to_s}"}
|
29
35
|
end
|
30
36
|
|
@@ -216,8 +222,8 @@ module Pubnub
|
|
216
222
|
}
|
217
223
|
|
218
224
|
empty_if_blank = {
|
219
|
-
:auth
|
220
|
-
:uuid
|
225
|
+
:auth => @auth_key,
|
226
|
+
:uuid => app.env[:uuid],
|
221
227
|
}
|
222
228
|
|
223
229
|
empty_if_blank.delete_if {|k, v| v.blank? }
|
@@ -271,6 +277,10 @@ module Pubnub
|
|
271
277
|
end
|
272
278
|
|
273
279
|
module SubscribeEvent
|
280
|
+
def initialize(options, app)
|
281
|
+
super
|
282
|
+
end
|
283
|
+
|
274
284
|
def fire(app)
|
275
285
|
begin
|
276
286
|
$logger.debug('Pubnub'){'SubscribeEvent#fire'}
|
@@ -303,6 +313,15 @@ module Pubnub
|
|
303
313
|
app.env[:subscriptions][@origin].add_channel(channel, app)
|
304
314
|
end
|
305
315
|
|
316
|
+
@channel_group.each do |cg|
|
317
|
+
if app.env[:subscriptions][@origin].get_channel_groups.include?(cg)
|
318
|
+
@channel_group.delete(cg)
|
319
|
+
$logger.error('Pubnub'){"Already subscribed to channel group #{cg}, you have to leave that channel first"}
|
320
|
+
else
|
321
|
+
app.env[:subscriptions][@origin].add_channel_group(cg, app)
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
306
325
|
if @channel.empty?
|
307
326
|
false
|
308
327
|
else
|
@@ -312,23 +331,43 @@ module Pubnub
|
|
312
331
|
end
|
313
332
|
|
314
333
|
if app.env[:subscriptions][@origin].nil?
|
315
|
-
app.env[:subscriptions][@origin]
|
316
|
-
app.env[:callbacks_pool]
|
317
|
-
app.env[:
|
334
|
+
app.env[:subscriptions][@origin] = self if app.env[:subscriptions][@origin].nil?
|
335
|
+
app.env[:callbacks_pool] = Hash.new if app.env[:callbacks_pool].nil?
|
336
|
+
app.env[:callbacks_pool][:channel] = Hash.new if app.env[:callbacks_pool][:channel].nil?
|
337
|
+
app.env[:callbacks_pool][:channel_group] = Hash.new if app.env[:callbacks_pool][:channel_group].nil?
|
338
|
+
app.env[:callbacks_pool][:channel][@origin] = Hash.new if app.env[:callbacks_pool][:channel][@origin].nil?
|
339
|
+
app.env[:callbacks_pool][:channel_group][@origin] = Hash.new if app.env[:callbacks_pool][:channel_group][@origin].nil?
|
340
|
+
app.env[:error_callbacks_pool] = Hash.new if app.env[:error_callbacks_pool].nil?
|
341
|
+
app.env[:error_callbacks_pool][:channel] = Hash.new if app.env[:error_callbacks_pool][:channel].nil?
|
342
|
+
app.env[:error_callbacks_pool][:channel][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel][@origin].nil?
|
343
|
+
app.env[:error_callbacks_pool][:channel_group] = Hash.new if app.env[:error_callbacks_pool][:channel_group].nil?
|
344
|
+
app.env[:error_callbacks_pool][:channel_group][@origin] = @error_callback if app.env[:error_callbacks_pool][:channel_group][@origin].nil?
|
318
345
|
|
319
346
|
@channel.each do |channel|
|
320
|
-
app.env[:callbacks_pool][@origin][channel]
|
347
|
+
app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
|
348
|
+
app.env[:callbacks_pool][:channel][@origin][channel][:callback] = @callback unless app.env[:callbacks_pool][:channel][@origin][:callback]
|
349
|
+
end
|
321
350
|
|
322
|
-
|
351
|
+
@channel_group.each do |channel_group|
|
352
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group] = Hash.new
|
353
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group][:callback] = @callback unless app.env[:callbacks_pool][:channel_group][@origin][:callback]
|
323
354
|
end
|
324
355
|
|
325
356
|
else
|
326
357
|
@channel.each do |channel|
|
327
|
-
app.env[:callbacks_pool][@origin][channel] = Hash.new
|
328
|
-
app.env[:callbacks_pool][@origin][channel] = Hash.new
|
358
|
+
app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
|
359
|
+
app.env[:callbacks_pool][:channel][@origin][channel] = Hash.new
|
360
|
+
|
361
|
+
app.env[:callbacks_pool][:channel][@origin][channel][:callback] = @callback unless app.env[:callbacks_pool][:channel][@origin][:callback]
|
362
|
+
app.env[:callbacks_pool][:channel][@origin][channel][:error_callback] = @error_callback unless app.env[:callbacks_pool][:channel][@origin][:error_callback]
|
363
|
+
end
|
364
|
+
|
365
|
+
@channel_group.each do |channel_group|
|
366
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group] = Hash.new
|
367
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group] = Hash.new
|
329
368
|
|
330
|
-
app.env[:callbacks_pool][@origin][
|
331
|
-
app.env[:callbacks_pool][@origin][
|
369
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group][:callback] = @callback unless app.env[:callbacks_pool][:channel_group][@origin][:callback]
|
370
|
+
app.env[:callbacks_pool][:channel_group][@origin][channel_group][:error_callback] = @error_callback unless app.env[:callbacks_pool][:channel_group][@origin][:error_callback]
|
332
371
|
end
|
333
372
|
end
|
334
373
|
|
@@ -344,6 +383,11 @@ module Pubnub
|
|
344
383
|
@timetoken = timetoken
|
345
384
|
end
|
346
385
|
|
386
|
+
def add_channel_group(cg, app)
|
387
|
+
@channel_group << cg
|
388
|
+
$logger.debug('Pubnub'){'SubscribeEvent#add_channel | Added channel'}
|
389
|
+
end
|
390
|
+
|
347
391
|
def add_channel(channel, app)
|
348
392
|
@channel = @channel + format_channels(channel)
|
349
393
|
$logger.debug('Pubnub'){'SubscribeEvent#add_channel | Added channel'}
|
@@ -353,7 +397,18 @@ module Pubnub
|
|
353
397
|
@channel = @channel - format_channels(channel)
|
354
398
|
$logger.debug('Pubnub'){'SubscribeEvent#remove_channel | Removed channel'}
|
355
399
|
begin
|
356
|
-
shutdown_subscribe(app) if @channel.empty?
|
400
|
+
shutdown_subscribe(app) if @channel.empty? && @channel_group.empty?
|
401
|
+
rescue => e
|
402
|
+
$logger.error('Pubnub'){e.message}
|
403
|
+
$logger.error('Pubnub'){e.backtrace}
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
def remove_channel_group(channel_group, app)
|
408
|
+
@channel_group = @channel_group - format_channel_group(channel_group, false)
|
409
|
+
$logger.debug('Pubnub'){'SubscribeEvent#remove_channel | Removed channel'}
|
410
|
+
begin
|
411
|
+
shutdown_subscribe(app) if @channel.empty? && @channel_group.empty?
|
357
412
|
rescue => e
|
358
413
|
$logger.error('Pubnub'){e.message}
|
359
414
|
$logger.error('Pubnub'){e.backtrace}
|
@@ -364,11 +419,16 @@ module Pubnub
|
|
364
419
|
@channel
|
365
420
|
end
|
366
421
|
|
422
|
+
def get_channel_groups
|
423
|
+
@channel_group
|
424
|
+
end
|
425
|
+
|
367
426
|
private
|
368
427
|
|
369
428
|
def parameters(app)
|
370
429
|
parameters = super(app)
|
371
430
|
parameters.merge!({:heartbeat => app.env[:heartbeat]}) if app.env[:heartbeat]
|
431
|
+
parameters.merge!({'channel-group' => format_channel_group(@channel_group, true).join(',')}) unless @channel_group.blank?
|
372
432
|
parameters.merge!({:state => encode_state(app.env[:state][@origin])}) if app.env[:state] && app.env[:state][@origin]
|
373
433
|
parameters
|
374
434
|
end
|
@@ -404,10 +464,16 @@ module Pubnub
|
|
404
464
|
begin
|
405
465
|
$logger.debug('Pubnub'){'Event#fire_callbacks async'}
|
406
466
|
envelopes.each do |envelope|
|
407
|
-
app.env[:callbacks_pool][@origin][envelope.
|
467
|
+
if envelope.channel_group && app.env[:callbacks_pool][:channel_group][@origin][envelope.channel_group]
|
468
|
+
app.env[:callbacks_pool][:channel_group][@origin][envelope.channel_group][:callback].call(envelope) if !envelope.error && !envelope.timetoken_update
|
469
|
+
else
|
470
|
+
app.env[:callbacks_pool][:channel][@origin][envelope.channel][:callback].call(envelope) if !envelope.error && !envelope.timetoken_update
|
471
|
+
end
|
408
472
|
end
|
409
473
|
$logger.debug('Pubnub'){'We can send next request now'}
|
410
|
-
app.env[:error_callbacks_pool][@origin].call(envelopes.first)
|
474
|
+
app.env[:error_callbacks_pool][:channel][@origin].call(envelopes.first) if envelopes.first.error && !envelopes.first.channel_group
|
475
|
+
app.env[:error_callbacks_pool][:channel_group][@origin].call(envelopes.first) if envelopes.first.error && envelopes.first.channel_group
|
476
|
+
|
411
477
|
rescue => error
|
412
478
|
$logger.error('Pubnub'){error}
|
413
479
|
$logger.error('Pubnub'){error.backtrace}
|
@@ -428,10 +494,6 @@ module Pubnub
|
|
428
494
|
app.subscribe_event_connections_pool[@origin]
|
429
495
|
end
|
430
496
|
|
431
|
-
def channels_for_url(channels)
|
432
|
-
channels.join(',')
|
433
|
-
end
|
434
|
-
|
435
497
|
def path(app)
|
436
498
|
path = "/subscribe/#{@subscribe_key}/#{channels_for_url(@channel)}/0/#{@timetoken}".gsub(/\?/,'%3F')
|
437
499
|
end
|
@@ -478,7 +540,7 @@ module Pubnub
|
|
478
540
|
},
|
479
541
|
app
|
480
542
|
)
|
481
|
-
|
543
|
+
elsif parsed_response.length < 4
|
482
544
|
$logger.debug('Pubnub'){'Subscribe#format_envelopes | Not timetoken update'}
|
483
545
|
|
484
546
|
if parsed_response[2]
|
@@ -509,6 +571,29 @@ module Pubnub
|
|
509
571
|
|
510
572
|
$logger.debug('Pubnub'){'Subscribe#format_envelopes | Envelopes created'}
|
511
573
|
|
574
|
+
end
|
575
|
+
else
|
576
|
+
$logger.debug('Pubnub'){'Subscribe#format_envelopes | Not timetoken update'}
|
577
|
+
|
578
|
+
parsed_response[0].size.times do |i|
|
579
|
+
channel = parsed_response[3].split(',')[i]
|
580
|
+
channel_group = parsed_response[2].split(',')[i]
|
581
|
+
|
582
|
+
$logger.debug('Pubnub'){"#{parsed_response}"}
|
583
|
+
|
584
|
+
envelopes << Envelope.new(
|
585
|
+
{
|
586
|
+
:message => message(parsed_response, i, channel, app),
|
587
|
+
:channel => channel,
|
588
|
+
:channel_group => channel_group,
|
589
|
+
:response_message => parsed_response,
|
590
|
+
:timetoken => timetoken(parsed_response)
|
591
|
+
},
|
592
|
+
app
|
593
|
+
)
|
594
|
+
|
595
|
+
$logger.debug('Pubnub'){'Subscribe#format_envelopes | Envelopes created'}
|
596
|
+
|
512
597
|
end
|
513
598
|
end
|
514
599
|
|