use std::sync::Arc;
use tokio::time::Instant;
use zakura_chain::block;
use zakura_header_chain::{AuxDelivery, Frontier, HeaderWorkAuthority, SourceId};
pub use zakura_header_chain::{
AlarmSet as HeaderChainAlarmSet, BodyUnavailableSummary as HeaderChainBodyUnavailableSummary,
ChainScore as HeaderChainScore, EngineMode as HeaderChainMode,
EngineSnapshot as HeaderChainSnapshot, Frontier as HeaderChainFrontier,
FrontierSet as HeaderChainFrontierSet, HeaderGeneration as HeaderChainGeneration,
StateVersion as HeaderChainStateVersion, SuffixWork as HeaderChainSuffixWork,
VerifiedGeneration as HeaderChainVerifiedGeneration,
};
pub const MAX_RETAINED_PATH_LEASES: usize = zakura_header_chain::MAX_STAGED_TARGETS_V1;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RetainedPathLease {
pub lease_id: u64,
pub peer: SourceId,
pub session_id: u64,
pub target: Frontier,
pub common_ancestor: Frontier,
pub scope: HeaderWorkAuthority,
pub idle_deadline: Instant,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum RetainedPathLeaseOutcome {
Acquired(Box<RetainedPathLease>),
TargetNotRetained,
NoLocatorIntersection,
HistoryPruned,
Busy,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RetainedPathPage {
pub lease_id: u64,
pub common_ancestor: Frontier,
pub target: Frontier,
pub scope: HeaderWorkAuthority,
pub headers: Vec<Arc<block::Header>>,
pub aux_deliveries: Vec<Vec<AuxDelivery>>,
pub complete: bool,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum RetainedPathReadOutcome {
Page(Box<RetainedPathPage>),
Unavailable,
}