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
//! Reference application layer — wires [`crate::core`] into a working chat
//! app with consensus, state machine, peer scoring, and freeze/commit timing.
//!
//! Integrate by constructing a [`crate::app::User`] with your
//! `SessionEvent` / `ConversationLifecycle`, then drive it from a transport
//! receive loop ([`crate::app::User::process_inbound_packet`]) and a
//! periodic poll on each conversation's
//! [`crate::app::SessionRunner::check_member_freeze`] and
//! [`crate::app::SessionRunner::poll_freeze_status`].
//!
//! [`crate::core::ConversationStateMachine`] owns the per-conversation state
//! enum (`PendingJoin → Working → Freezing → Selection → Reelection`);
//! [`crate::app::PhaseTimer`] owns the wall-clock anchor;
//! [`crate::app::SessionRunner`] composes a [`crate::core::ConversationHandle`]
//! with that timer through coordinator methods that update both atomically.
//! State transitions return the new [`crate::core::ConversationState`]; the
//! session-side dispatcher emits a `SessionEvent::PhaseChange` on each one.
//!
//! Use this layer directly for epoch-based steward chat; write a custom app
//! layer if you need a different consensus model, state machine, or epoch
//! timing.
pub use crate;
pub use ;
pub use UserError;
pub use ;
pub use LockExt;
pub use ;
pub use ;