message_bus 3.0.0 → 3.1.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 +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
         |