use crate::engine::RatchetPolicy;
use crate::identity::in_memory::InMemoryNodeIdentity;
use crate::identity::{IdentitySigner, Zeroizing, IDENTITY_SECRET_KEY_LEN};
use crate::routing::announce::{
derive_destination_hash, derive_plain_destination_hash, expand_name, ExpandNameError,
};
use crate::routing::links::resources::ResourceStrategy;
use crate::routing::{LinkRequestPolicy, ProofStrategy};
use crate::units::ByteLimit;
use crate::wire::DestinationHash;
use super::super::PrnsEvent;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ServeMyRequestEndpoints {
No,
Yes,
}
pub enum PreConfiguredDestination<'a> {
Plain {
app_name: &'a str,
aspects: &'a [&'a str],
},
Single {
app_name: &'a str,
aspects: &'a [&'a str],
identity: Zeroizing<[u8; IDENTITY_SECRET_KEY_LEN]>,
announce_app_data: &'a [u8],
proof: ProofStrategy,
link_requests: LinkRequestPolicy,
ratchet: RatchetPolicy,
resource_strategy: ResourceStrategy,
maximum_request_bytes: ByteLimit,
request_endpoints: ServeMyRequestEndpoints,
},
}
impl PreConfiguredDestination<'_> {
pub fn destination_hash(&self) -> Result<DestinationHash, ExpandNameError> {
match self {
PreConfiguredDestination::Plain { app_name, aspects } => Ok(
derive_plain_destination_hash(&expand_name(app_name, aspects)?),
),
PreConfiguredDestination::Single {
app_name,
aspects,
identity,
..
} => {
let signer = InMemoryNodeIdentity::from_secret_key_bytes(identity);
Ok(derive_destination_hash(
&signer.identity_hash(),
&expand_name(app_name, aspects)?,
))
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ManuallyAttached;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NoPersistence;
pub struct PrnsNodeRecipe<
Destinations,
AppState,
RequestEndpoints,
OnEvent,
Interfaces,
Storage,
Persistence = NoPersistence,
> where
OnEvent: FnMut(PrnsEvent<'_>, &AppState),
{
pub transport_identity: Option<Zeroizing<[u8; IDENTITY_SECRET_KEY_LEN]>>,
pub pre_configured_destinations: Destinations,
pub app_state: AppState,
pub storage: Storage,
pub request_endpoints: RequestEndpoints,
pub interfaces: Interfaces,
pub persistence: Persistence,
pub on_event: OnEvent,
}