1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/******************************************************************************
Author: Joaquín Béjar García
Email: jb@taunais.com
Date: 27/1/26
******************************************************************************/
//! # IronFix Session
//!
//! FIX session layer protocol implementation for the IronFix engine.
//!
//! This crate is **pure protocol logic**: it performs no I/O, encodes no bytes
//! and persists nothing. Its only IronFix dependency is `ironfix-core`.
//!
//! This crate provides:
//! - **State machine**: a sealed typestate session FSM
//! (`Disconnected` → `Connecting` → `LogonSent`/`LogonReceived` → `Active` →
//! `Resending`/`LogoutPending`), so illegal transitions do not compile
//! - **Sequence management**: [`SequenceManager`] with checked arithmetic —
//! exhaustion is a typed error, never a silent wrap. Gap *detection*
//! ([`SequenceResult::Gap`]) lives here; the recovery that follows
//! (ResendRequest, SequenceReset, gap fill) is orchestrated by
//! `ironfix-engine`, which owns the socket
//! - **Heartbeat handling**: [`HeartbeatManager`], `Instant`-based timing for
//! heartbeat and TestRequest deadlines and `HeartBtInt` negotiation
//! - **Configuration**: [`SessionConfig`] and its validating
//! [`config::SessionConfigBuilder`]
//!
//! Note that the `Resending` state is only the FSM marker for "a resend is in
//! progress". The actual `ResendRequest` / `SequenceReset` / gap-fill message
//! handling lives in `ironfix-engine`, because it requires the wire layer.
pub use ;
pub use ;
pub use ;
pub use ;