#!/usr/bin/env node

// Example of using a headers exchange

var amqp = require('../')

amqp.connect().then(function(conn) {
  return conn.createChannel().then(withChannel);
}, console.error);

function withChannel(ch) {
  // NB the type of the exchange is 'headers'
  ch.assertExchange('matching exchange', 'headers').then(function(ex) {
    ch.assertQueue().then(function(q) {
      bindAndConsume(ch, ex, q).then(function() {
        send(ch, ex);
      });
    });
  });
}

function bindAndConsume(ch, ex, q) {
  // When using a headers exchange, the headers to be matched go in
  // the binding arguments. The routing key is ignore, so best left
  // empty.

  // 'x-match' is 'all' or 'any', meaning "all fields must match" or
  // "at least one field must match", respectively. The values to be
  // matched go in subsequent fields.
  ch.bindQueue(q.queue, ex.exchange, '', {'x-match': 'any',
                                          'foo': 'bar',
                                          'baz': 'boo'});
  return ch.consume(q.queue, function(msg) {
    console.log(msg.content.toString());
  }, {noAck: true});
}

function send(ch, ex) {
  // The headers for a message are given as an option to `publish`:
  ch.publish(ex.exchange, '', Buffer.from('hello'), {headers: {baz: 'boo'}});
  ch.publish(ex.exchange, '', Buffer.from('world'), {headers: {foo: 'bar'}});
}