message_bus 2.2.4 → 3.0.0

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

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93e3bc28f1411da6037721acabab32fa504542bb68238afe6671f10bfccfa194
4
- data.tar.gz: b25d3013be8f3a0efa180db29de0ac6a55e5ce08ea87f80c912f046b9548c821
3
+ metadata.gz: caef3d7766089e6196e8a42f2829edf6aebbd7bf70ef38210db050007edcd865
4
+ data.tar.gz: da3fd2dd2e2111802ddeffb4d8a0981f62fb4fdd8fd3fe249a36acbbd66298a1
5
5
  SHA512:
6
- metadata.gz: c74493de8f9f2dc5305457696988d7f07dce56642a8796d3757a0e5bf4e14f6e9b011ed8bd9255e0d3dc197c290bbdafedcf47e2519f09ca085ec86f33848508
7
- data.tar.gz: e4778edb5d540ef011ad29916dd8e4a374b04fb5dcd57ef80542b9f0b0985f5887609bf67b071455ebd15e59386eb0abc30698d015a4585f66a4d7afd217fc05
6
+ metadata.gz: 6a3e6b63fe2448577ab4e099ba0135130b14731f017f669f28fa720e00412e14997dca92091ab5b84faaefa3443aa87f8cc0159d21b454199d287156e267c998
7
+ data.tar.gz: fb65941d890beb25a2a0a2e743d9d2176a2ec7f7d26609ccab4aacc3aefc6f783c5de5b498c69fedb4c774e329506d638038dc21cde77107b6bade4efd90aa76
@@ -1 +1,9 @@
1
- inherit_from: https://raw.githubusercontent.com/discourse/discourse/master/.rubocop.yml
1
+ inherit_gem:
2
+ rubocop-discourse: .rubocop.yml
3
+
4
+ AllCops:
5
+ Exclude:
6
+ - 'examples/**/*'
7
+
8
+ RSpec:
9
+ Enabled: false
@@ -1,9 +1,9 @@
1
1
  before_install: gem install bundler
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3
5
4
  - 2.4
6
5
  - 2.5
6
+ - 2.6
7
7
  gemfile:
8
8
  - Gemfile
9
9
  addons:
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 27-04-2020
2
+
3
+ - Version 3.0.0
4
+
5
+ - Drop support for Ruby 2.3
6
+ - FIX: Don't publish message to intersection of `user_ids` and `group_ids` - instead use the union, this is a behavior change, hence a new major release.
7
+
1
8
  26-03-2020
2
9
 
3
10
  - Version 2.2.4
data/Gemfile CHANGED
@@ -20,8 +20,11 @@ group :test, :development do
20
20
  gem 'byebug'
21
21
  end
22
22
 
23
+ group :development do
24
+ gem 'yard'
25
+ gem 'rubocop-discourse', require: false
26
+ gem 'rubocop-rspec', require: false
27
+ end
28
+
23
29
  gem 'rack'
24
30
  gem 'concurrent-ruby' # for distributed-cache
25
-
26
- gem 'rubocop'
27
- gem 'yard'
data/README.md CHANGED
@@ -74,32 +74,40 @@ id = MessageBus.last_id("/channel")
74
74
  MessageBus.backlog "/channel", id
75
75
  ```
76
76
 
77
- ```ruby
78
- # messages can be targetted at particular users or groups
79
- MessageBus.publish "/channel", "hello", user_ids: [1,2,3], group_ids: [4,5,6]
77
+ ### Targetted messages
80
78
 
81
- # messages can be targetted at particular clients (using MessageBus.clientId)
82
- MessageBus.publish "/channel", "hello", client_ids: ["XXX","YYY"]
79
+ Messages can be targetted to particular clients by supplying the `client_ids` option when publishing a message.
83
80
 
84
- # message bus determines the user ids and groups based on env
81
+ ```ruby
82
+ MessageBus.publish "/channel", "hello", client_ids: ["XXX", "YYY"] # (using MessageBus.clientId)
83
+ ```
85
84
 
85
+ By configuring the `user_id_lookup` and `group_ids_lookup` options with a Proc or Lambda which will be called with a [Rack specification environment](https://github.com/rack/rack/blob/master/SPEC.rdoc#the-environment-), messages can be targetted to particular clients users or groups by supplying either the `user_ids` or `group_ids` options when publishing a message.
86
+
87
+ ```ruby
86
88
  MessageBus.configure(user_id_lookup: proc do |env|
87
89
  # this lookup occurs on JS-client poolings, so that server can retrieve backlog
88
90
  # for the client considering/matching/filtering user_ids set on published messages
89
91
  # if user_id is not set on publish time, any user_id returned here will receive the message
90
-
91
92
  # return the user id here
92
93
  end)
93
94
 
95
+ # Target user_ids when publishing a message
96
+ MessageBus.publish "/channel", "hello", user_ids: [1, 2, 3]
97
+
94
98
  MessageBus.configure(group_ids_lookup: proc do |env|
95
99
  # return the group ids the user belongs to
96
100
  # can be nil or []
97
101
  end)
98
102
 
99
- # example of message bus to set user_ids from an initializer in Rails and Devise:
103
+ # Target group_ids when publishing a message
104
+ MessageBus.publish "/channel", "hello", group_ids: [1, 2, 3]
105
+
106
+ # example of MessageBus to set user_ids from an initializer in Rails and Devise:
100
107
  # config/inializers/message_bus.rb
101
108
  MessageBus.user_id_lookup do |env|
102
109
  req = Rack::Request.new(env)
110
+
103
111
  if req.session && req.session["warden.user.user.key"] && req.session["warden.user.user.key"][0][0]
104
112
  user = User.find(req.session["warden.user.user.key"][0][0])
105
113
  user.id
@@ -107,6 +115,22 @@ MessageBus.user_id_lookup do |env|
107
115
  end
108
116
  ```
109
117
 
118
+ If both `user_ids` and `group_ids` options are supplied when publishing a message, the message will be targetted at clients with lookup return values that matches on either the `user_ids` **or** the `group_ids` options.
119
+
120
+ ```ruby
121
+ MessageBus.publish "/channel", "hello", user_ids: [1, 2, 3], group_ids: [1, 2, 3]
122
+ ```
123
+
124
+ If the `client_ids` option is supplied with either the `user_ids` or `group_ids` options when publising a message, the `client_ids` option will be applied unconditionally and messages will be filtered further using `user_id` or `group_id` clauses.
125
+
126
+ ```ruby
127
+ MessageBus.publish "/channel", "hello", client_ids: ["XXX", "YYY"], user_ids: [1, 2, 3], group_ids: [1, 2, 3]
128
+ ```
129
+
130
+ Passing `nil` or `[]` to either `client_ids`, `user_ids` or `group_ids` is equivalent to allowing all values on each option.
131
+
132
+ ### Error handling
133
+
110
134
  ```ruby
111
135
  MessageBus.configure(on_middleware_error: proc do |env, e|
112
136
  # If you wish to add special handling based on error
@@ -128,15 +128,26 @@ class MessageBus::Client
128
128
  # @return [Boolean] whether or not the client has permission to receive the
129
129
  # passed message
130
130
  def allowed?(msg)
131
- allowed = !msg.user_ids || msg.user_ids.include?(self.user_id)
132
- allowed &&= !msg.client_ids || msg.client_ids.include?(self.client_id)
133
- allowed && (
134
- msg.group_ids.nil? ||
135
- msg.group_ids.length == 0 ||
136
- (
137
- msg.group_ids - self.group_ids
131
+ client_allowed = !msg.client_ids || msg.client_ids.length == 0 || msg.client_ids.include?(self.client_id)
132
+
133
+ user_allowed = false
134
+ group_allowed = false
135
+
136
+ # this is an inconsistency we should fix anyway, publishing `user_ids: nil` should work same as groups
137
+ has_users = msg.user_ids && msg.user_ids.length > 0
138
+ has_groups = msg.group_ids && msg.group_ids.length > 0
139
+
140
+ if has_users
141
+ user_allowed = msg.user_ids.include?(self.user_id)
142
+ end
143
+
144
+ if has_groups
145
+ group_allowed = (
146
+ msg.group_ids - (self.group_ids || [])
138
147
  ).length < msg.group_ids.length
139
- )
148
+ end
149
+
150
+ client_allowed && (user_allowed || group_allowed || (!has_users && !has_groups))
140
151
  end
141
152
 
142
153
  # @return [Array<MessageBus::Message>] the set of messages the client is due
@@ -15,7 +15,6 @@ class MessageBus::Diagnostics
15
15
  # process to process comms
16
16
  bus.subscribe('/_diagnostics/hup') do |msg|
17
17
  if Process.pid == msg.data["pid"] && hostname == msg.data["hostname"]
18
- $shutdown = true
19
18
  sleep 4
20
19
  Process.kill("HUP", $$)
21
20
  end
@@ -45,7 +45,7 @@ class MessageBus::Rack::Diagnostics
45
45
  return [200, { 'Content-Type' => 'application/javascript;charset=UTF-8' }, [content]]
46
46
  end
47
47
 
48
- return [404, {}, ['not found']]
48
+ [404, {}, ['not found']]
49
49
  end
50
50
 
51
51
  private
@@ -92,6 +92,7 @@ class MessageBus::Rack::Diagnostics
92
92
  </body>
93
93
  </html>
94
94
  HTML
95
- return [200, { "content-type" => "text/html;" }, [html]]
95
+
96
+ [200, { "content-type" => "text/html;" }, [html]]
96
97
  end
97
98
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MessageBus
4
- VERSION = "2.2.4"
4
+ VERSION = "3.0.0"
5
5
  end
@@ -169,37 +169,187 @@ describe MessageBus::Client do
169
169
  log[0].data.must_equal 'world'
170
170
  end
171
171
 
172
- it "allows only client_id in list if message contains client_ids" do
173
- @message = MessageBus::Message.new(1, 2, '/test', 'hello')
174
- @message.client_ids = ["1", "2"]
175
- @client.client_id = "2"
176
- @client.allowed?(@message).must_equal true
177
-
178
- @client.client_id = "3"
179
- @client.allowed?(@message).must_equal false
180
- end
181
-
182
- describe "targetted at group" do
183
- before do
172
+ describe '#allowed?' do
173
+ it "allows only client_id in list if message contains client_ids" do
184
174
  @message = MessageBus::Message.new(1, 2, '/test', 'hello')
185
- @message.group_ids = [1, 2, 3]
186
- end
175
+ @message.client_ids = ["1", "2"]
176
+ @client.client_id = "2"
177
+ @client.allowed?(@message).must_equal true
187
178
 
188
- it "denies users that are not members of group" do
189
- @client.group_ids = [77, 0, 10]
179
+ @client.client_id = "3"
190
180
  @client.allowed?(@message).must_equal false
191
- end
192
181
 
193
- it "allows users that are members of group" do
194
- @client.group_ids = [1, 2, 3]
182
+ @message.client_ids = []
183
+
184
+ @client.client_id = "3"
195
185
  @client.allowed?(@message).must_equal true
196
- end
197
186
 
198
- it "allows all users if groups not set" do
199
- @message.group_ids = nil
200
- @client.group_ids = [77, 0, 10]
187
+ @message.client_ids = nil
188
+
189
+ @client.client_id = "3"
201
190
  @client.allowed?(@message).must_equal true
202
191
  end
192
+
193
+ describe 'targetted at user' do
194
+ before do
195
+ @message = MessageBus::Message.new(1, 2, '/test', 'hello')
196
+ @message.user_ids = [1, 2, 3]
197
+ end
198
+
199
+ it "allows client with user_id that is included in message's user_ids" do
200
+ @client.user_id = 1
201
+ @client.allowed?(@message).must_equal(true)
202
+ end
203
+
204
+ it "denies client with user_id that is not included in message's user_ids" do
205
+ @client.user_id = 4
206
+ @client.allowed?(@message).must_equal(false)
207
+ end
208
+
209
+ it "denies client with nil user_id" do
210
+ @client.user_id = nil
211
+
212
+ @client.allowed?(@message).must_equal(false)
213
+ end
214
+
215
+ it "allows client if message's user_ids is not set" do
216
+ @message.user_ids = nil
217
+ @client.user_id = 4
218
+ @client.allowed?(@message).must_equal(true)
219
+ end
220
+
221
+ it "allows client if message's user_ids is empty" do
222
+ @message.user_ids = []
223
+ @client.user_id = 4
224
+ @client.allowed?(@message).must_equal(true)
225
+ end
226
+
227
+ it "allows client with client_id that is included in message's client_ids" do
228
+ @message.client_ids = ["1", "2"]
229
+ @client.client_id = "1"
230
+ @client.user_id = 1
231
+
232
+ @client.allowed?(@message).must_equal(true)
233
+ end
234
+
235
+ it "denies client with client_id that is not included in message's client_ids" do
236
+ @message.client_ids = ["1", "2"]
237
+ @client.client_id = "3"
238
+ @client.user_id = 1
239
+
240
+ @client.allowed?(@message).must_equal(false)
241
+ end
242
+ end
243
+
244
+ describe "targetted at group" do
245
+ before do
246
+ @message = MessageBus::Message.new(1, 2, '/test', 'hello')
247
+ @message.group_ids = [1, 2, 3]
248
+ end
249
+
250
+ it "denies client that are not members of group" do
251
+ @client.group_ids = [77, 0, 10]
252
+ @client.allowed?(@message).must_equal false
253
+ end
254
+
255
+ it 'denies client with nil group_ids' do
256
+ @client.group_ids = nil
257
+ @client.allowed?(@message).must_equal false
258
+ end
259
+
260
+ it "allows client that are members of group" do
261
+ @client.group_ids = [1, 2, 3]
262
+ @client.allowed?(@message).must_equal true
263
+ end
264
+
265
+ it "allows any client if message's group_ids is not set" do
266
+ @message.group_ids = nil
267
+ @client.group_ids = [77, 0, 10]
268
+ @client.allowed?(@message).must_equal true
269
+ end
270
+
271
+ it "allows any client if message's group_ids is empty" do
272
+ @message.group_ids = []
273
+ @client.group_ids = [77, 0, 10]
274
+ @client.allowed?(@message).must_equal true
275
+ end
276
+
277
+ it "allows client with client_id that is included in message's client_ids" do
278
+ @message.client_ids = ["1", "2"]
279
+ @client.client_id = "1"
280
+ @client.group_ids = [1]
281
+
282
+ @client.allowed?(@message).must_equal(true)
283
+ end
284
+
285
+ it "denies client with client_id that is not included in message's client_ids" do
286
+ @message.client_ids = ["1", "2"]
287
+ @client.client_id = "3"
288
+ @client.group_ids = [1]
289
+
290
+ @client.allowed?(@message).must_equal(false)
291
+ end
292
+ end
293
+
294
+ describe 'targetted at group and user' do
295
+ before do
296
+ @message = MessageBus::Message.new(1, 2, '/test', 'hello')
297
+ @message.group_ids = [1, 2, 3]
298
+ @message.user_ids = [4, 5, 6]
299
+ end
300
+
301
+ it "allows client with user_id that is included in message's user_ids" do
302
+ @client.user_id = 4
303
+ @client.allowed?(@message).must_equal(true)
304
+ end
305
+
306
+ it "denies client with user_id that is not included in message's user_ids" do
307
+ @client.user_id = 1
308
+ @client.allowed?(@message).must_equal(false)
309
+ end
310
+
311
+ it "allows client with group_ids that is included in message's group_ids" do
312
+ @client.group_ids = [1, 0, 3]
313
+ @client.allowed?(@message).must_equal(true)
314
+ end
315
+
316
+ it "denies client with group_ids that is not included in message's group_ids" do
317
+ @client.group_ids = [8, 9, 10]
318
+ @client.allowed?(@message).must_equal(false)
319
+ end
320
+
321
+ it "allows client with allowed client_id and user_id" do
322
+ @message.client_ids = ["1", "2"]
323
+ @client.user_id = 4
324
+ @client.client_id = "2"
325
+
326
+ @client.allowed?(@message).must_equal(true)
327
+ end
328
+
329
+ it "denies client with allowed client_id but disallowed user_id" do
330
+ @message.client_ids = ["1", "2"]
331
+ @client.user_id = 99
332
+ @client.client_id = "2"
333
+
334
+ @client.allowed?(@message).must_equal(false)
335
+ end
336
+
337
+ it "allows client with allowed client_id and group_id" do
338
+ @message.client_ids = ["1", "2"]
339
+ @client.group_ids = [1]
340
+ @client.client_id = "2"
341
+
342
+ @client.allowed?(@message).must_equal(true)
343
+ end
344
+
345
+ it "denies client with allowed client_id but disallowed group_id" do
346
+ @message.client_ids = ["1", "2"]
347
+ @client.group_ids = [99]
348
+ @client.client_id = "2"
349
+
350
+ @client.allowed?(@message).must_equal(false)
351
+ end
352
+ end
203
353
  end
204
354
  end
205
355
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: message_bus
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.4
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-26 00:00:00.000000000 Z
11
+ date: 2020-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack