veilid/veilid-core/src/veilid_api/routing_context.rs

235 lines
7.5 KiB
Rust
Raw Normal View History

use super::*;
2022-11-26 21:17:30 +00:00
///////////////////////////////////////////////////////////////////////////////////////
#[derive(Clone, Debug)]
pub enum Target {
2023-02-26 00:51:14 +00:00
NodeId(PublicKey), // Node by any of its public keys
PrivateRoute(RouteId), // Remote private route by its id
}
pub struct RoutingContextInner {}
pub struct RoutingContextUnlockedInner {
2022-10-22 01:27:07 +00:00
/// Safety routing requirements
safety_selection: SafetySelection,
}
impl Drop for RoutingContextInner {
fn drop(&mut self) {
// self.api
// .borrow_mut()
// .routing_contexts
// //.remove(&self.id);
}
}
#[derive(Clone)]
pub struct RoutingContext {
/// Veilid API handle
api: VeilidAPI,
inner: Arc<Mutex<RoutingContextInner>>,
unlocked_inner: Arc<RoutingContextUnlockedInner>,
}
impl RoutingContext {
////////////////////////////////////////////////////////////////
pub(super) fn new(api: VeilidAPI) -> Self {
Self {
api,
inner: Arc::new(Mutex::new(RoutingContextInner {})),
unlocked_inner: Arc::new(RoutingContextUnlockedInner {
2022-11-26 19:16:02 +00:00
safety_selection: SafetySelection::Unsafe(Sequencing::default()),
}),
}
}
2022-11-26 19:16:02 +00:00
pub fn with_privacy(self) -> Result<Self, VeilidAPIError> {
self.with_custom_privacy(Stability::default())
}
pub fn with_custom_privacy(self, stability: Stability) -> Result<Self, VeilidAPIError> {
2022-10-19 01:53:45 +00:00
let config = self.api.config()?;
let c = config.get();
2022-11-26 19:16:02 +00:00
2022-10-19 01:53:45 +00:00
Ok(Self {
api: self.api.clone(),
inner: Arc::new(Mutex::new(RoutingContextInner {})),
unlocked_inner: Arc::new(RoutingContextUnlockedInner {
2022-10-22 01:27:07 +00:00
safety_selection: SafetySelection::Safe(SafetySpec {
preferred_route: None,
hop_count: c.network.rpc.default_route_hop_count as usize,
2022-11-26 19:16:02 +00:00
stability,
sequencing: self.sequencing(),
2022-10-22 01:27:07 +00:00
}),
}),
2022-10-19 01:53:45 +00:00
})
}
2022-11-26 19:16:02 +00:00
2022-10-22 01:27:07 +00:00
pub fn with_sequencing(self, sequencing: Sequencing) -> Self {
Self {
api: self.api.clone(),
inner: Arc::new(Mutex::new(RoutingContextInner {})),
unlocked_inner: Arc::new(RoutingContextUnlockedInner {
2022-10-22 01:27:07 +00:00
safety_selection: match self.unlocked_inner.safety_selection {
SafetySelection::Unsafe(_) => SafetySelection::Unsafe(sequencing),
SafetySelection::Safe(safety_spec) => SafetySelection::Safe(SafetySpec {
preferred_route: safety_spec.preferred_route,
hop_count: safety_spec.hop_count,
stability: safety_spec.stability,
sequencing,
}),
},
}),
}
}
2022-11-26 19:16:02 +00:00
fn sequencing(&self) -> Sequencing {
2022-10-22 01:27:07 +00:00
match self.unlocked_inner.safety_selection {
SafetySelection::Unsafe(sequencing) => sequencing,
SafetySelection::Safe(safety_spec) => safety_spec.sequencing,
}
}
pub fn api(&self) -> VeilidAPI {
self.api.clone()
}
async fn get_destination(
&self,
target: Target,
) -> Result<rpc_processor::Destination, VeilidAPIError> {
let rpc_processor = self.api.rpc_processor()?;
match target {
Target::NodeId(node_id) => {
// Resolve node
2023-02-08 21:50:07 +00:00
let mut nr = match rpc_processor.resolve_node(node_id).await {
Ok(Some(nr)) => nr,
2023-02-08 21:50:07 +00:00
Ok(None) => apibail_key_not_found!(node_id),
Err(e) => return Err(e.into()),
};
2022-10-22 01:27:07 +00:00
// Apply sequencing to match safety selection
nr.set_sequencing(self.sequencing());
Ok(rpc_processor::Destination::Direct {
target: nr,
2022-10-22 01:27:07 +00:00
safety_selection: self.unlocked_inner.safety_selection,
})
}
2023-02-25 02:02:24 +00:00
Target::PrivateRoute(rsid) => {
2022-11-22 23:26:39 +00:00
// Get remote private route
let rss = self.api.routing_table()?.route_spec_store();
2023-02-26 00:51:14 +00:00
if !rss.is_valid_remote_private_route(&rsid)
2022-11-25 19:21:55 +00:00
else {
2022-11-26 21:17:30 +00:00
apibail_key_not_found!(pr);
2022-11-25 19:21:55 +00:00
};
2022-11-22 23:26:39 +00:00
Ok(rpc_processor::Destination::PrivateRoute {
2023-02-26 00:51:14 +00:00
private_route_id: rsid,
2022-11-22 23:26:39 +00:00
safety_selection: self.unlocked_inner.safety_selection,
})
}
}
}
////////////////////////////////////////////////////////////////
// App-level Messaging
#[instrument(level = "debug", err, skip(self))]
pub async fn app_call(
&self,
target: Target,
request: Vec<u8>,
) -> Result<Vec<u8>, VeilidAPIError> {
let rpc_processor = self.api.rpc_processor()?;
// Get destination
let dest = self.get_destination(target).await?;
// Send app message
let answer = match rpc_processor.rpc_call_app_call(dest, request).await {
Ok(NetworkResult::Value(v)) => v,
2022-11-26 21:17:30 +00:00
Ok(NetworkResult::Timeout) => apibail_timeout!(),
2022-12-16 01:52:24 +00:00
Ok(NetworkResult::ServiceUnavailable) => apibail_try_again!(),
2022-10-04 17:09:03 +00:00
Ok(NetworkResult::NoConnection(e)) | Ok(NetworkResult::AlreadyExists(e)) => {
2022-11-26 21:17:30 +00:00
apibail_no_connection!(e);
}
2022-10-04 17:09:03 +00:00
Ok(NetworkResult::InvalidMessage(message)) => {
2022-11-26 21:17:30 +00:00
apibail_generic!(message);
}
Err(e) => return Err(e.into()),
};
Ok(answer.answer)
}
#[instrument(level = "debug", err, skip(self))]
pub async fn app_message(
&self,
target: Target,
message: Vec<u8>,
) -> Result<(), VeilidAPIError> {
let rpc_processor = self.api.rpc_processor()?;
// Get destination
let dest = self.get_destination(target).await?;
// Send app message
match rpc_processor.rpc_call_app_message(dest, message).await {
Ok(NetworkResult::Value(())) => {}
2022-11-26 21:17:30 +00:00
Ok(NetworkResult::Timeout) => apibail_timeout!(),
2022-12-16 01:52:24 +00:00
Ok(NetworkResult::ServiceUnavailable) => apibail_try_again!(),
2022-10-04 17:09:03 +00:00
Ok(NetworkResult::NoConnection(e)) | Ok(NetworkResult::AlreadyExists(e)) => {
2022-11-26 21:17:30 +00:00
apibail_no_connection!(e);
}
Ok(NetworkResult::InvalidMessage(message)) => {
2022-11-26 21:17:30 +00:00
apibail_generic!(message);
}
Err(e) => return Err(e.into()),
};
Ok(())
}
///////////////////////////////////
/// DHT Values
pub async fn get_value(&self, _value_key: ValueKey) -> Result<Vec<u8>, VeilidAPIError> {
panic!("unimplemented");
}
pub async fn set_value(
&self,
_value_key: ValueKey,
_value: Vec<u8>,
) -> Result<bool, VeilidAPIError> {
panic!("unimplemented");
}
pub async fn watch_value(
&self,
_value_key: ValueKey,
_callback: ValueChangeCallback,
) -> Result<bool, VeilidAPIError> {
panic!("unimplemented");
}
pub async fn cancel_watch_value(&self, _value_key: ValueKey) -> Result<bool, VeilidAPIError> {
panic!("unimplemented");
}
///////////////////////////////////
/// Block Store
2023-02-17 22:47:21 +00:00
pub async fn find_block(&self, _block_id: PublicKey) -> Result<Vec<u8>, VeilidAPIError> {
panic!("unimplemented");
}
2023-02-17 22:47:21 +00:00
pub async fn supply_block(&self, _block_id: PublicKey) -> Result<bool, VeilidAPIError> {
panic!("unimplemented");
}
}