centrifuge 0.1.0 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/README.md +144 -12
- data/lib/centrifuge/client.rb +19 -6
- data/lib/centrifuge/version.rb +1 -1
- data/lib/centrifuge.rb +2 -2
- data/spec/client_spec.rb +2 -2
- data/vendor/assets/javascripts/centrifuge.js +1 -1562
- data/vendor/assets/javascripts/sockjs.js +3 -2379
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d24a6b2607907f90eee9fc465ecf5fc59e231c3
|
4
|
+
data.tar.gz: 49908552ac245cbbb3b3d5c773e5b5df35b89e3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5943232807ff2c1dd6329dacf65ae812a110096005c1118713e3138fcd6856253750a73cab5677262fe94cda537ae517d7bc5d8cca12c4e171b737b0206ef94
|
7
|
+
data.tar.gz: 3d4787d2ddff2d82c787dd539648aad42922f27338646d935175ca5e6c59715e27f38a75b3845480dd3befeaa124378f51962db5508c61ba63cb1dff49468290
|
data/CHANGELOG.md
ADDED
File without changes
|
data/README.md
CHANGED
@@ -8,8 +8,8 @@ Ruby gem for [Centrifuge](https://github.com/centrifugal/centrifuge) real-time m
|
|
8
8
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
|
-
```
|
12
|
-
gem 'centrifuge'
|
11
|
+
```ruby
|
12
|
+
gem 'centrifuge'
|
13
13
|
```
|
14
14
|
|
15
15
|
And then execute:
|
@@ -20,39 +20,51 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
$ gem install centrifuge
|
22
22
|
|
23
|
-
|
23
|
+
## Compatibility
|
24
|
+
|
25
|
+
Centrifuge-ruby 1.0.0+ supports only Centrifuge version 1.0.0+ with single project only.
|
26
|
+
If you want to use multiproject Centrifuge, please use centrifuge-ruby 0.1.0
|
24
27
|
|
25
28
|
## Usage
|
26
29
|
|
27
30
|
`Centrifuge::Client` - is main usable class. Start with:
|
28
31
|
|
29
|
-
|
32
|
+
```ruby
|
33
|
+
client = Centrifuge::Client.new(scheme: :http, host: :localhost, port: 80, secret: 'cde')
|
34
|
+
```
|
30
35
|
|
31
|
-
|
36
|
+
Or just:
|
32
37
|
|
38
|
+
```ruby
|
33
39
|
Centrifuge.scheme = :http
|
34
40
|
Centrifuge.host = 'localhost'
|
35
41
|
Centrifuge.port = 8000
|
36
|
-
Centrifuge.project_key = 'abc'
|
37
42
|
Centrifuge.secret = 'def'
|
43
|
+
```
|
38
44
|
|
39
|
-
There are
|
45
|
+
There are six methods available:
|
40
46
|
|
41
47
|
### Publish
|
42
48
|
|
43
49
|
Sends message to all connected users:
|
44
50
|
|
51
|
+
```ruby
|
45
52
|
client.publish('teshchannel', { data: :foo })
|
53
|
+
```
|
46
54
|
|
47
55
|
You can also use class methods if you set all necessary config data:
|
48
56
|
|
57
|
+
```ruby
|
49
58
|
Centrifuge.publish('testchannel', { data: :foo })
|
59
|
+
```
|
50
60
|
|
51
61
|
### Unsubscribe
|
52
62
|
|
53
63
|
Unsubscribes user from channel:
|
54
64
|
|
65
|
+
```ruby
|
55
66
|
client.unsubscribe('testchannel', 'user#23')
|
67
|
+
```
|
56
68
|
|
57
69
|
`user#23` - is string identificator of user.
|
58
70
|
|
@@ -60,29 +72,149 @@ Unsubscribes user from channel:
|
|
60
72
|
|
61
73
|
Disconnects user from Centrifuge:
|
62
74
|
|
75
|
+
```ruby
|
63
76
|
client.disconnect('user#23')
|
64
|
-
|
77
|
+
```
|
65
78
|
### Presence
|
66
79
|
|
67
80
|
Gets presence info of the channel:
|
68
81
|
|
82
|
+
```ruby
|
69
83
|
client.presence('testchannel')
|
70
|
-
|
84
|
+
```
|
71
85
|
### History
|
72
86
|
|
73
87
|
Gets message history of the channel:
|
74
88
|
|
89
|
+
```ruby
|
75
90
|
client.history('test_channel')
|
91
|
+
```
|
92
|
+
|
93
|
+
### Channels
|
94
|
+
|
95
|
+
Get active channels (with one or more subscribers):
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
client.channels()
|
99
|
+
```
|
76
100
|
|
77
101
|
### JS Client token generation
|
78
102
|
|
79
103
|
Generates token for JS client:
|
80
104
|
|
81
|
-
|
105
|
+
```ruby
|
106
|
+
client.token_for('testuser', '1443422448')
|
107
|
+
```
|
108
|
+
Where `1443422448` is UNIX timestamp seconds. You can also add user info as valid json string as third parameter:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
client.token_for('testuser', '1443422448', "{}")
|
112
|
+
```
|
113
|
+
### Channel Sign token generation
|
114
|
+
|
115
|
+
Generates Sign token for a Channel:
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
client.generate_channel_sign(params[:client], params[:channels], "{}")
|
119
|
+
```
|
120
|
+
|
121
|
+
Where ```params[:client]``` is client passed during authentication and ```params[:channels]``` can be an array of channels or a single channel. You can read more here about batching channels here [JS Documentation](https://fzambia.gitbooks.io/centrifugal/content/client/api.html).
|
122
|
+
|
123
|
+
You can also add user info as valid json string as third parameter:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
client.generate_channel_sign(params[:client], params[:channels], "{"name": "John"}")
|
127
|
+
```
|
128
|
+
|
129
|
+
On server side using rails, you can authenticate private channels like so:
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
|
133
|
+
#routes.rb or any router lib
|
134
|
+
post 'sockets/auth'
|
135
|
+
|
136
|
+
# Auth method to authenticate private channels
|
137
|
+
#sockets_controller.rb or anywhere in your app
|
138
|
+
|
139
|
+
# client = Instance of Centrifuge initialized // check Usage section
|
140
|
+
# params[:channels] = single/array of channels
|
141
|
+
def auth
|
142
|
+
if user_signed_in? # Or use a before_filter
|
143
|
+
data = {}
|
144
|
+
sign = client.generate_channel_sign(
|
145
|
+
params[:client], params[:channels], "{}"
|
146
|
+
)
|
147
|
+
data[channel] = {
|
148
|
+
"sign": sign,
|
149
|
+
"info": "{}"
|
150
|
+
}
|
151
|
+
render :json => data
|
152
|
+
else
|
153
|
+
render :text => "Not authorized", :status => '403'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
```
|
157
|
+
On client side initialize Centrifuge like so:
|
158
|
+
|
159
|
+
``` javascript
|
160
|
+
|
161
|
+
// client_info = valid JSON string of user_info
|
162
|
+
// client_token = client.token_for (described above)
|
163
|
+
|
164
|
+
var centrifuge = new Centrifuge({
|
165
|
+
url: "http://localhost:8000/connection",
|
166
|
+
user: window.currentUser.id,
|
167
|
+
timestamp: window.currentUser.current_timestamp,
|
168
|
+
debug: true,
|
169
|
+
info: JSON.stringify(window.client_info),
|
170
|
+
token: window.client_token,
|
171
|
+
refreshEndpoint: "/sockets/refresh",
|
172
|
+
authEndpoint: "/sockets/auth",
|
173
|
+
authHeaders: {
|
174
|
+
'X-Transaction': 'WebSocket Auth',
|
175
|
+
'X-CSRF-Token': window.currentUser.form_authenticity_token
|
176
|
+
},
|
177
|
+
refreshHeaders: {
|
178
|
+
'X-Transaction': 'WebSocket Auth',
|
179
|
+
'X-CSRF-Token': window.currentUser.form_authenticity_token
|
180
|
+
}
|
181
|
+
});
|
182
|
+
|
183
|
+
centrifuge.connect();
|
184
|
+
|
185
|
+
// If you using jbuiler use raw render(template_name) and use a global window object to load the user information.
|
186
|
+
```
|
187
|
+
|
188
|
+
If you want to batch sign channels request to avoid multiple HTTP requests, you can use centrifuge JS client to batch channels ```centrifuge.startBatching(); // your code // centrifuge.stopBatching();``` in one request and on the server iterate through channels and subscribe.
|
189
|
+
|
190
|
+
Read more: [JS client Documentation](https://fzambia.gitbooks.io/centrifugal/content/client/api.html)
|
191
|
+
|
192
|
+
### API request sign
|
193
|
+
|
194
|
+
When you use Centrifugo server API you should sign each request to successfully authorize with the server.
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
|
198
|
+
# For example this is how you would encode a Publish command
|
199
|
+
commands = {
|
200
|
+
"method": "publish",
|
201
|
+
"params": {
|
202
|
+
"channel": "Test",
|
203
|
+
"data": { "name": "John Doe" }
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
encoded_data = MultiJson.dump(commands) # Or use to_json
|
208
|
+
sign = client.sign(encoded_data) #Sign the data
|
209
|
+
|
210
|
+
# Using HTTP party GEM interact with Server API
|
211
|
+
r = HTTParty.post(client.url.to_s, query: {"sign": sign, "data": encoded_data})
|
212
|
+
r.parsed_response
|
213
|
+
|
214
|
+
```
|
82
215
|
|
83
|
-
|
216
|
+
```encoded_data``` is a JSON string with your API command/commands. See all available commands in [Server API](https://fzambia.gitbooks.io/centrifugal/content/server/api.html) chapter.
|
84
217
|
|
85
|
-
client.token_for('testuser', '123123', "{}")
|
86
218
|
|
87
219
|
## Rails assets
|
88
220
|
|
data/lib/centrifuge/client.rb
CHANGED
@@ -9,7 +9,7 @@ module Centrifuge
|
|
9
9
|
host: 'localhost',
|
10
10
|
port: 8000,
|
11
11
|
}
|
12
|
-
attr_accessor :scheme, :host, :port, :
|
12
|
+
attr_accessor :scheme, :host, :port, :secret
|
13
13
|
attr_writer :connect_timeout, :send_timeout, :receive_timeout,
|
14
14
|
:keep_alive_timeout
|
15
15
|
|
@@ -17,8 +17,8 @@ module Centrifuge
|
|
17
17
|
|
18
18
|
def initialize(options = {})
|
19
19
|
options = DEFAULT_OPTIONS.merge(options)
|
20
|
-
@scheme, @host, @port, @
|
21
|
-
:scheme, :host, :port, :
|
20
|
+
@scheme, @host, @port, @secret = options.values_at(
|
21
|
+
:scheme, :host, :port, :secret
|
22
22
|
)
|
23
23
|
set_default_timeouts
|
24
24
|
end
|
@@ -35,7 +35,7 @@ module Centrifuge
|
|
35
35
|
scheme: scheme.to_s,
|
36
36
|
host: host,
|
37
37
|
port: port,
|
38
|
-
path: "/api/#{
|
38
|
+
path: "/api/#{path}"
|
39
39
|
})
|
40
40
|
end
|
41
41
|
|
@@ -59,13 +59,25 @@ module Centrifuge
|
|
59
59
|
Centrifuge::Builder.new('history', { channel: channel }, self).process
|
60
60
|
end
|
61
61
|
|
62
|
+
def channels()
|
63
|
+
Centrifuge::Builder.new('channels', {}, self).process
|
64
|
+
end
|
65
|
+
|
66
|
+
def stats()
|
67
|
+
Centrifuge::Builder.new('stats', {}, self).process
|
68
|
+
end
|
69
|
+
|
62
70
|
def token_for(user, timestamp, user_info = "")
|
63
71
|
sign("#{user}#{timestamp}#{user_info}")
|
64
72
|
end
|
65
73
|
|
74
|
+
def generate_channel_sign(client, channel, user_info="")
|
75
|
+
data = "#{client}#{channel}#{user_info}"
|
76
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, data)
|
77
|
+
end
|
78
|
+
|
66
79
|
def sign(body)
|
67
|
-
|
68
|
-
OpenSSL::HMAC.hexdigest(dig, secret, "#{project_key}#{body}")
|
80
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA256.new, secret, body)
|
69
81
|
end
|
70
82
|
|
71
83
|
def client
|
@@ -78,5 +90,6 @@ module Centrifuge
|
|
78
90
|
end
|
79
91
|
end
|
80
92
|
end
|
93
|
+
|
81
94
|
end
|
82
95
|
end
|
data/lib/centrifuge/version.rb
CHANGED
data/lib/centrifuge.rb
CHANGED
@@ -16,8 +16,8 @@ module Centrifuge
|
|
16
16
|
class << self
|
17
17
|
extend Forwardable
|
18
18
|
|
19
|
-
def_delegators :default_client, :scheme, :host, :port, :
|
20
|
-
def_delegators :default_client, :scheme=, :host=, :port=, :
|
19
|
+
def_delegators :default_client, :scheme, :host, :port, :secret
|
20
|
+
def_delegators :default_client, :scheme=, :host=, :port=, :secret=
|
21
21
|
|
22
22
|
# def_delegators :default_client, :authentication_token, :url
|
23
23
|
# def_delegators :default_client, :encrypted=, :url=
|
data/spec/client_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Centrifuge::Client do
|
4
|
-
let(:options) { { scheme: :https, host: 'centrifugo.herokuapp.com', port: 443,
|
4
|
+
let(:options) { { scheme: :https, host: 'centrifugo-dev.herokuapp.com', port: 443, secret: 'secret' } }
|
5
5
|
let(:client) { Centrifuge::Client.new(options) }
|
6
6
|
let(:data) { { action: :test } }
|
7
7
|
|
8
8
|
it 'generates url' do
|
9
|
-
expect(client.url.to_s).to eq "https://centrifugo.herokuapp.com:443/api
|
9
|
+
expect(client.url.to_s).to eq "https://centrifugo-dev.herokuapp.com:443/api/"
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'publishes data' do
|