message_bus 2.2.4 → 3.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.

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