pub(super) use macroonz_harness::descriptor::{NameRefusal, NamespacedName};
pub(super) use macroonz_harness::identity::ContentAddress;
pub(super) use macroonz_harness::network::{
Delivery, DeliveryCopy, Link, LinkDiscipline, LinkFault, NetworkCampaign,
NetworkCampaignRefusal, NetworkSchedule, NetworkScheduleRefusal, NetworkSelectionRefusal,
NodeRef, Replay, ReplayIncomplete, ReproducedReplay, ReproducedReplayRefusal, SendOrdinal,
SendRefusal, SimNet, SimNetRefusal, SimulationReproduction, TRANSCRIPT_FORMAT_VERSION,
TRANSCRIPT_TAG, Tick, Topology, TopologyRefusal, TranscriptEntry, TranscriptPack,
TranscriptRefusal, TranscriptSourceClaim, read_recorded_live, read_simulated, recorded_live,
reproduce, simulated,
};
pub(super) enum LaneFailure {
Name(NameRefusal),
Topology(TopologyRefusal),
Schedule(NetworkScheduleRefusal),
Campaign(NetworkCampaignRefusal),
Selection(NetworkSelectionRefusal),
Sim(SimNetRefusal),
Send(SendRefusal),
Transcript(TranscriptRefusal),
Replay(ReplayIncomplete),
Join(ReproducedReplayRefusal),
Standing,
}
impl core::fmt::Debug for LaneFailure {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Name(refusal) => formatter.debug_tuple("Name").field(refusal).finish(),
Self::Topology(refusal) => formatter.debug_tuple("Topology").field(refusal).finish(),
Self::Schedule(refusal) => formatter.debug_tuple("Schedule").field(refusal).finish(),
Self::Campaign(refusal) => formatter.debug_tuple("Campaign").field(refusal).finish(),
Self::Selection(refusal) => formatter.debug_tuple("Selection").field(refusal).finish(),
Self::Sim(refusal) => formatter.debug_tuple("Sim").field(refusal).finish(),
Self::Send(refusal) => formatter.debug_tuple("Send").field(refusal).finish(),
Self::Transcript(refusal) => {
formatter.debug_tuple("Transcript").field(refusal).finish()
}
Self::Replay(refusal) => formatter.debug_tuple("Replay").field(refusal).finish(),
Self::Join(refusal) => formatter.debug_tuple("Join").field(refusal).finish(),
Self::Standing => formatter.write_str("Standing"),
}
}
}
impl From<NameRefusal> for LaneFailure {
fn from(refusal: NameRefusal) -> Self {
Self::Name(refusal)
}
}
impl From<TopologyRefusal> for LaneFailure {
fn from(refusal: TopologyRefusal) -> Self {
Self::Topology(refusal)
}
}
impl From<NetworkScheduleRefusal> for LaneFailure {
fn from(refusal: NetworkScheduleRefusal) -> Self {
Self::Schedule(refusal)
}
}
impl From<NetworkCampaignRefusal> for LaneFailure {
fn from(refusal: NetworkCampaignRefusal) -> Self {
Self::Campaign(refusal)
}
}
impl From<NetworkSelectionRefusal> for LaneFailure {
fn from(refusal: NetworkSelectionRefusal) -> Self {
Self::Selection(refusal)
}
}
impl From<SimNetRefusal> for LaneFailure {
fn from(refusal: SimNetRefusal) -> Self {
Self::Sim(refusal)
}
}
impl From<SendRefusal> for LaneFailure {
fn from(refusal: SendRefusal) -> Self {
Self::Send(refusal)
}
}
impl From<TranscriptRefusal> for LaneFailure {
fn from(refusal: TranscriptRefusal) -> Self {
Self::Transcript(refusal)
}
}
impl From<ReplayIncomplete> for LaneFailure {
fn from(refusal: ReplayIncomplete) -> Self {
Self::Replay(refusal)
}
}
impl From<ReproducedReplayRefusal> for LaneFailure {
fn from(refusal: ReproducedReplayRefusal) -> Self {
Self::Join(refusal)
}
}
pub(super) fn name(stem: &'static str) -> Result<NamespacedName, NameRefusal> {
NamespacedName::named("lane", stem)
}
pub(super) fn forward() -> Result<Link, NameRefusal> {
Ok(Link::between(
NodeRef::declared(name("client")?),
NodeRef::declared(name("server")?),
))
}
pub(super) fn pair_topology() -> Result<Topology, LaneFailure> {
let client = NodeRef::declared(name("client")?);
let server = NodeRef::declared(name("server")?);
Ok(Topology::declared(
vec![client, server],
vec![Link::between(client, server), Link::between(server, client)],
)?)
}
pub(super) fn duplicate_schedule() -> Result<NetworkSchedule, LaneFailure> {
Ok(NetworkSchedule::declared(
name("duplicate-the-request")?,
vec![LinkDiscipline::declared(
forward()?,
vec![LinkFault::DuplicateAt {
position: SendOrdinal::at(0u32),
}],
)],
)?)
}
pub(super) type DrivenRun = (Vec<Delivery<Vec<u8>>>, SimNet<Vec<u8>>, NetworkSchedule);
pub(super) fn duplicated_run(extra_advances: usize) -> Result<DrivenRun, LaneFailure> {
let schedule = duplicate_schedule()?;
let campaign = NetworkCampaign::declared(vec![schedule.clone()])?;
let mut sim = SimNet::declared(
pair_topology()?,
campaign.select(name("duplicate-the-request")?)?,
)?;
sim.send(forward()?, b"pay".to_vec())?;
let mut deliveries = Vec::new();
while sim.pending() > 0usize {
deliveries.extend(sim.advance());
}
for _ in 0..extra_advances {
deliveries.extend(sim.advance());
}
Ok((deliveries, sim, schedule))
}
pub(super) type PackedRun = (
Vec<Delivery<Vec<u8>>>,
NetworkSchedule,
TranscriptPack,
SimulationReproduction,
);
pub(super) fn packed_run(extra_advances: usize) -> Result<PackedRun, LaneFailure> {
let (deliveries, sim, schedule) = duplicated_run(extra_advances)?;
let (pack, reproduction) = simulated(&sim, Vec::clone)?;
Ok((deliveries, schedule, pack, reproduction))
}
pub(super) fn live_entry(
payload: &[u8],
ordinal: u32,
delivered_at: u64,
) -> Result<TranscriptEntry, LaneFailure> {
Ok(TranscriptEntry::witnessed(
forward()?,
SendOrdinal::at(ordinal),
payload.to_vec(),
Tick::at(delivered_at.saturating_sub(1u64)),
Tick::at(delivered_at),
DeliveryCopy::Original,
))
}
pub(super) fn readdress(encoded: &mut [u8]) -> Result<(), LaneFailure> {
let address_width = ContentAddress::derived(TRANSCRIPT_TAG, &[])
.as_bytes()
.len();
let body = encoded.get(address_width..).ok_or(LaneFailure::Standing)?;
let address = ContentAddress::derived(TRANSCRIPT_TAG, body);
let claim = encoded
.get_mut(0usize..address_width)
.ok_or(LaneFailure::Standing)?;
claim.copy_from_slice(address.as_bytes());
Ok(())
}