# Changelog

## Unreleased

- `FixAlchemy.MessageStore.Dets` stores sent messages in a file per session, so
  a session resuming its sequence numbers can replay the original messages
  instead of gap-filling them.
- NextExpectedMsgSeqNum(789) in Logon, for both roles, behind
  `:next_expected_msg_seq_num`. A counterparty reporting a number behind what
  this session sent is resent the difference without waiting for a
  ResendRequest; one reporting a number beyond it is logged out.
- `FixAlchemy.Engine.session_key/1` names the identity a session's storage is
  keyed by, and the engine passes it to `FixAlchemy.MessageStore.new/1`.

## 0.1.0

Initial release.

### Session protocol

- `FixAlchemy.Engine` runs the session protocol for one connection, independent
  of which side dialed: framing, sequence numbers, heartbeats and TestRequests,
  ResendRequests and replay, and delivery to subscribers.
- `FixAlchemy.Client` initiates: dials, sends the Logon, reconnects with backoff.
- `FixAlchemy.Server` accepts: listens over TCP or TLS, matches each Logon to a
  configured session, and refuses one that matches nothing, fails credentials,
  or names a session already connected.

### Dictionaries

- Generates field, message, and repeating-group parsers from a venue's FIX XML,
  including the `FIXT1.1.xml` and `FIX50SP2.xml` pair a FIX 5.0 session needs.
- `FixAlchemy.Engine.Validation` checks inbound messages against the dictionary
  and answers a bad one with a Reject naming the SessionRejectReason.

### Routing and market data

- `FixAlchemy.Dispatch` routes inbound messages to subscribers by MsgType, by a
  tag equalling a value, or by a predicate over a tag.
- `FixAlchemy.Feed` publishes one price to many sessions through a tree of venue
  transforms, applying each transform once however many sessions sit below it.

### Storage

- `FixAlchemy.MessageStore` retains sent messages for replay; in-memory by
  default.
- `FixAlchemy.SessionStore` carries sequence numbers across connections and
  restarts, keyed by BeginString, SenderCompID and TargetCompID; ETS-backed
  implementation included.
