#![recursion_limit = "256"]
#![doc(
html_logo_url = "https://github.com/maidsafe/QA/raw/master/Images/maidsafe_logo.png",
html_favicon_url = "https://maidsafe.net/img/favicon.ico",
test(attr(deny(warnings)))
)]
#![warn(missing_docs, unreachable_pub, unused_results, clippy::unwrap_used)]
#![allow(clippy::large_enum_variant)]
#![allow(clippy::result_large_err)]
#[macro_use]
extern crate tracing;
mod error;
mod event;
mod log_markers;
#[cfg(feature = "open-metrics")]
mod metrics;
mod node;
mod put_validation;
#[cfg(feature = "extension-module")]
mod python;
mod quote;
mod replication;
#[allow(missing_docs)]
pub mod spawn;
#[allow(missing_docs)]
pub mod utils;
pub use self::{
error::{Error, PutValidationError},
event::{NodeEvent, NodeEventsChannel, NodeEventsReceiver},
log_markers::Marker,
node::{NodeBuilder, PERIODIC_REPLICATION_INTERVAL_MAX_S},
};
use crate::error::Result;
use ant_evm::RewardsAddress;
use ant_networking::{Network, SwarmLocalState};
use ant_protocol::{get_port_from_multiaddr, NetworkAddress};
use libp2p::{Multiaddr, PeerId};
use std::{
collections::{BTreeMap, HashSet},
path::PathBuf,
};
use tokio::sync::watch;
#[derive(Clone)]
pub struct RunningNode {
shutdown_sender: watch::Sender<bool>,
network: Network,
node_events_channel: NodeEventsChannel,
root_dir_path: PathBuf,
rewards_address: RewardsAddress,
}
impl RunningNode {
pub fn peer_id(&self) -> PeerId {
self.network.peer_id()
}
#[expect(rustdoc::invalid_html_tags)]
pub fn root_dir_path(&self) -> PathBuf {
self.root_dir_path.clone()
}
pub async fn get_swarm_local_state(&self) -> Result<SwarmLocalState> {
let state = self.network.get_swarm_local_state().await?;
Ok(state)
}
pub async fn get_listen_addrs(&self) -> Result<Vec<Multiaddr>> {
let listeners = self.network.get_swarm_local_state().await?.listeners;
Ok(listeners)
}
pub async fn get_listen_addrs_with_peer_id(&self) -> Result<Vec<Multiaddr>> {
let listeners = self.get_listen_addrs().await?;
let multi_addrs: Vec<Multiaddr> = listeners
.into_iter()
.filter_map(|listen_addr| listen_addr.with_p2p(self.peer_id()).ok())
.collect();
Ok(multi_addrs)
}
pub async fn get_node_listening_port(&self) -> Result<u16> {
let listen_addrs = self.network.get_swarm_local_state().await?.listeners;
for addr in listen_addrs {
if let Some(port) = get_port_from_multiaddr(&addr) {
return Ok(port);
}
}
Err(Error::FailedToGetNodePort)
}
pub fn node_events_channel(&self) -> &NodeEventsChannel {
&self.node_events_channel
}
pub async fn get_all_record_addresses(&self) -> Result<HashSet<NetworkAddress>> {
#[allow(clippy::mutable_key_type)] let addresses: HashSet<_> = self
.network
.get_all_local_record_addresses()
.await?
.keys()
.cloned()
.collect();
Ok(addresses)
}
pub async fn get_kbuckets(&self) -> Result<BTreeMap<u32, Vec<PeerId>>> {
let kbuckets = self.network.get_kbuckets().await?;
Ok(kbuckets)
}
pub fn reward_address(&self) -> &RewardsAddress {
&self.rewards_address
}
pub fn shutdown(self) {
let _ = self.shutdown_sender.send(true);
}
}