message_bus 3.0.0 → 3.1.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 +4 -4
- data/CHANGELOG +6 -0
- data/README.md +14 -0
- data/lib/message_bus.rb +20 -0
- data/lib/message_bus/client.rb +18 -1
- data/lib/message_bus/version.rb +1 -1
- data/spec/lib/message_bus/client_spec.rb +33 -0
- data/spec/lib/message_bus_spec.rb +15 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe33cef07b7712b1bbcc2ab444e123fd1121665a5ecf1db7fb24dba190e48b38
|
4
|
+
data.tar.gz: 325300ad20aeb221d468326247c7755022dc8e594e8de1311601dec89b4a2c2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 216a6156aad68865beb14a519bda4f709e10d96bcc8c58fa4bc042ef596fd7563926517f5b5c82d547f4ff26ce7bd3ac0a74998ce9cf7b4b2d66c792f049c602
|
7
|
+
data.tar.gz: fb521cf6b6928586f7ba1f2da19a8def8d3f77acc0d6cb1c417fe03d8a36f0af8a470c29cc26ce400c12ba8648223ded2de43109a4616b5c89b967ed4e6a67aa
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -129,6 +129,20 @@ MessageBus.publish "/channel", "hello", client_ids: ["XXX", "YYY"], user_ids: [1
|
|
129
129
|
|
130
130
|
Passing `nil` or `[]` to either `client_ids`, `user_ids` or `group_ids` is equivalent to allowing all values on each option.
|
131
131
|
|
132
|
+
### Filtering Client Messages
|
133
|
+
|
134
|
+
Custom client message filters can be registered via `MessageBus#register_client_message_filter`. This can be useful for filtering away messages from the client based on the message's payload.
|
135
|
+
|
136
|
+
For example, ensuring that only messages seen by the server in the last 20 seconds are published to the client:
|
137
|
+
|
138
|
+
```
|
139
|
+
MessageBus.register_client_message_filter('/test') do |message|
|
140
|
+
(Time.now.to_i - message.data[:published_at]) <= 20
|
141
|
+
end
|
142
|
+
|
143
|
+
MessageBus.publish('/test/5', { data: "somedata", published_at: Time.now.to_i })
|
144
|
+
```
|
145
|
+
|
132
146
|
### Error handling
|
133
147
|
|
134
148
|
```ruby
|
data/lib/message_bus.rb
CHANGED
@@ -554,6 +554,26 @@ module MessageBus::Implementation
|
|
554
554
|
@config[:keepalive_interval] || 60
|
555
555
|
end
|
556
556
|
|
557
|
+
# Registers a client message filter that allows messages to be filtered from the client.
|
558
|
+
#
|
559
|
+
# @param [String,Regexp] channel_prefix channel prefix to match against a message's channel
|
560
|
+
#
|
561
|
+
# @yieldparam [MessageBus::Message] message published to the channel that matched the prefix provided
|
562
|
+
# @yieldreturn [Boolean] whether the message should be published to the client
|
563
|
+
# @return [void]
|
564
|
+
def register_client_message_filter(channel_prefix, &blk)
|
565
|
+
if blk
|
566
|
+
configure(client_message_filters: []) if !@config[:client_message_filters]
|
567
|
+
@config[:client_message_filters] << [channel_prefix, blk]
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
# @return [Array] returns a hash of message filters that have been registered
|
572
|
+
def client_message_filters
|
573
|
+
configure(client_message_filters: []) if !@config[:client_message_filters]
|
574
|
+
@config[:client_message_filters]
|
575
|
+
end
|
576
|
+
|
557
577
|
private
|
558
578
|
|
559
579
|
ENCODE_SITE_TOKEN = "$|$"
|
data/lib/message_bus/client.rb
CHANGED
@@ -147,7 +147,24 @@ class MessageBus::Client
|
|
147
147
|
).length < msg.group_ids.length
|
148
148
|
end
|
149
149
|
|
150
|
-
client_allowed && (user_allowed || group_allowed || (!has_users && !has_groups))
|
150
|
+
has_permission = client_allowed && (user_allowed || group_allowed || (!has_users && !has_groups))
|
151
|
+
|
152
|
+
return has_permission if !has_permission
|
153
|
+
|
154
|
+
filters_allowed = true
|
155
|
+
|
156
|
+
len = @bus.client_message_filters.length
|
157
|
+
while len > 0
|
158
|
+
len -= 1
|
159
|
+
channel_prefix, blk = @bus.client_message_filters[len]
|
160
|
+
|
161
|
+
if msg.channel.start_with?(channel_prefix)
|
162
|
+
filters_allowed = blk.call(msg)
|
163
|
+
break if !filters_allowed
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
filters_allowed
|
151
168
|
end
|
152
169
|
|
153
170
|
# @return [Array<MessageBus::Message>] the set of messages the client is due
|
data/lib/message_bus/version.rb
CHANGED
@@ -350,6 +350,39 @@ describe MessageBus::Client do
|
|
350
350
|
@client.allowed?(@message).must_equal(false)
|
351
351
|
end
|
352
352
|
end
|
353
|
+
|
354
|
+
describe 'when MessageBus#client_message_filters has been configured' do
|
355
|
+
|
356
|
+
it 'filters messages correctly' do
|
357
|
+
message = MessageBus::Message.new(1, 2, '/test/5', 'hello')
|
358
|
+
@client.allowed?(message).must_equal(true)
|
359
|
+
|
360
|
+
@bus.register_client_message_filter('/test') do |m|
|
361
|
+
m.data != 'hello'
|
362
|
+
end
|
363
|
+
|
364
|
+
@client.allowed?(message).must_equal(false)
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'filters messages correctly when multiple filters have been configured' do
|
368
|
+
|
369
|
+
bob_message = MessageBus::Message.new(1, 2, '/test/5', 'bob')
|
370
|
+
fred_message = MessageBus::Message.new(1, 2, '/test/5', 'fred')
|
371
|
+
random_message = MessageBus::Message.new(1, 2, '/test/77', 'random')
|
372
|
+
|
373
|
+
@bus.register_client_message_filter('/test') do |message|
|
374
|
+
message.data == 'bob' || message.data == 'fred'
|
375
|
+
end
|
376
|
+
|
377
|
+
@bus.register_client_message_filter('/test') do |message|
|
378
|
+
message.data == 'fred'
|
379
|
+
end
|
380
|
+
|
381
|
+
@client.allowed?(fred_message).must_equal(true)
|
382
|
+
@client.allowed?(bob_message).must_equal(false)
|
383
|
+
@client.allowed?(random_message).must_equal(false)
|
384
|
+
end
|
385
|
+
end
|
353
386
|
end
|
354
387
|
end
|
355
388
|
end
|
@@ -292,4 +292,19 @@ describe MessageBus do
|
|
292
292
|
|
293
293
|
data.must_equal(["pre-fork", "from-fork", "continuation"])
|
294
294
|
end
|
295
|
+
|
296
|
+
describe '#register_client_message_filter' do
|
297
|
+
it 'should register the message filter correctly' do
|
298
|
+
@bus.register_client_message_filter('/test')
|
299
|
+
|
300
|
+
@bus.client_message_filters.must_equal([])
|
301
|
+
|
302
|
+
@bus.register_client_message_filter('/test') { puts "hello world" }
|
303
|
+
|
304
|
+
channel, blk = @bus.client_message_filters[0]
|
305
|
+
|
306
|
+
blk.must_respond_to(:call)
|
307
|
+
channel.must_equal('/test')
|
308
|
+
end
|
309
|
+
end
|
295
310
|
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: 3.
|
4
|
+
version: 3.1.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-04-
|
11
|
+
date: 2020-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|