Broker 2.2.0
============

- The Python bindings now provide a SafeSubscriber variant of Subscriber as well
  as a new Endpoint.make_safe_subscriber() method. Both avoid potential problems
  when deserializing values that accommodate the Broker data model but not
  Python's. Specifically, Broker allows complex types inside others (e.g., a set
  of tables), but Python does not support unhashable types for indexing, which'd
  be required in this scenario. SafeSubscriber employs immutable (hashable)
  types when translating to Python objects and returns objects that are
  read-only.

  If you haven't encountered problems with the Subscriber class, you don't need
  to change existing code. Broker 3.0 will make this new behavior the default
  and deprecate the new APIs. In the meantime you can replace make_subscriber()
  with make_safe_subscriber() to be on the safe side.

Broker 2.1.0
============

- Broker 2.1.0 now depends on CAF 0.18.4

- The RocksDB data store backend was removed as building with it was previously
  broken/unusable.

- Added the ability to output metrics to Prometheus. This can be enabled by
  setting the BROKER_METRICS_PORT environment variable. Currently the output
  includes a number of CAF-related metrics and per-process CPU and Memory
  metrics.

Broker 2.0.0
============

- Broker 2.0.0 now depends on CAF 0.18.0 with a wire format targeting
  compatibility with Zeek 4.0.x.

- CMake 3.5+ is now required to compiler Broker.

- Support for the optional Python Bindings now requires at least Python 3.5

- For proper resource management/cleanup, the Python API now requires
  using Endpoint, Subscriber, StatusSubscriber, and Store objects within a
  `with` statement or alternatively doing an explicit call to the
  `reset()` method of subscriber/store objects before the associated
  Endpoint's `shutdown()` method.

Broker 1.4.0
============

- Adds a new ``broker::store_event`` API that can be used to observe
  data store modifications.

- Adds support for Windows platform.

- RocksDB support is now opt-in instead of automatically detected and used
  at configuration-time.  Use the ``--enable-rocksdb`` and
  ``--with-rocksdb=`` flags to opt-in.

Broker 1.3.0
============

- A C++17-capable compiler and CMake 3.0+ are now required to compile Broker

- Broker 1.3.0 depends on CAF 0.17.4.  Broker 1.2.x had depended on CAF 0.16.x,
  whose wire format changed and is now incompatible with CAF 0.17.x.
  Zeek 3.0.x shipped with Broker 1.2.x, which means Broker 1.3.x cannot be
  used to communicate with Zeek 3.0.x, only 3.1.x (and possibly later, check
  for updated release notes for compatibility clarifications).

Broker 1.2.0
============

This release contains breaking API changes (for C++ code, not Python)
in order to increase messaging efficiency via reduction of data
copying.  Specifically:

- ``broker::subscriber::get()`` now returns a different, copy-on-write
  type called ``broker::data_message`` rather than an
  ``std::pair<topic, data>``.  For example this old code::

      auto sub = ep.make_subscriber({"/topic/test"});
      auto msg = sub.get();
      auto& topic = msg.first;
      auto& data = msg.second

  can be changed to::

      auto sub = ep.make_subscriber({"/topic/test"});
      auto msg = sub.get();
      auto& topic = broker::get_topic(msg);
      auto& data = broker::get_data(msg);

- ``broker::endpoint::publish(vector)`` now takes a vector of the new
  ``broker::data_message`` type, not ``std::pair<topic, data>``

- Generally, all type aliases within classes, like
  ``value_type = std::pair<topic, data>``, have been changed to use the
  new ``broker::data_message`` type.

- The semantics of message forwarding have changed slightly: the
  first sender of the message is now the one that applies the initial
  TTL value.  Previously, the first receiver would be the one to
  apply the initial TTL.
