diff --git a/README.md b/README.md index eda7740..7f84267 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,11 @@ The message heading specify the `content-encoding` indicating the compression al freddy.deliver(destination, message, compress: 'zlib') ``` +#### Metadata through headers + +Send a message with arbitrary message metadata included in the message headers +freddy.deliver(destination, message, headers: {'my-key' => 'my-value'}) + ### Request delivery #### Expiring messages diff --git a/lib/freddy.rb b/lib/freddy.rb index 5cb7540..3edf38f 100644 --- a/lib/freddy.rb +++ b/lib/freddy.rb @@ -166,6 +166,8 @@ def tap_into(pattern_or_patterns, options = {}, &callback) # won't be discarded if timeout it set to 0 (default). # @option options [String] :compress (nil) # - 'zlib' - compresses the payload with zlib + # @option options [Hash] :headers (nil) + # Arbitrary headers to add as message metadata # @return [void] # # @example @@ -176,6 +178,7 @@ def deliver(destination, payload, options = {}) opts = {} opts[:expiration] = (timeout * 1000).to_i if timeout.positive? opts[:content_encoding] = compression_algorithm if compression_algorithm + opts[:headers] = options[:headers] if options[:headers] @send_and_forget_producer.produce(destination, payload, opts) end diff --git a/spec/freddy/freddy_spec.rb b/spec/freddy/freddy_spec.rb index 811ddca..e66b191 100644 --- a/spec/freddy/freddy_spec.rb +++ b/spec/freddy/freddy_spec.rb @@ -7,6 +7,13 @@ let(:destination2) { random_destination } let(:payload) { { pay: 'load' } } + before do + @bunny = Bunny.new(config) + @bunny.start() + end + + after { @bunny.close } + after { freddy.close } def respond_to(&block) @@ -72,6 +79,23 @@ def respond_to(&block) expect(@tapped_message).to eq(payload) end end + + it 'accepts custom headers' do + queue = exclusive_subscribe do |_info, metadata, _payload| + @metadata = metadata + end + freddy.deliver(queue, payload, headers: {'foo' => 'bar'}) + + wait_for { @metadata } + expect(@metadata[:headers]).to include({'foo' => 'bar'}) + end + end + + def exclusive_subscribe(&block) + channel = @bunny.create_channel + queue = channel.queue('', exclusive: true) + queue.subscribe(&block) + queue.name end context 'when making a synchronized request' do