#[cfg(feature = "mock-network")]
mod sync;
#[cfg(feature = "mock-network")]
pub use self::sync::Synchronizer;
use crate::client::core_client::CoreClient;
use crate::client::{Client, COST_OF_PUT};
use crate::network_event::{NetworkEvent, NetworkTx};
use crate::utils::{self};
use crate::CoreError;
use futures::{channel::mpsc, future::Future};
use log::trace;
use safe_nd::{AppFullId, ClientFullId, ClientPublicId, Coins, Keypair};
use std::fmt::Debug;
use tokio::stream::StreamExt;
use unwrap::unwrap;
pub fn gen_bls_keypair() -> Keypair {
let mut rng = rand::thread_rng();
Keypair::new_bls(&mut rng)
}
pub fn gen_client_id() -> ClientFullId {
let mut rng = rand::thread_rng();
ClientFullId::new_bls(&mut rng)
}
pub fn gen_app_id(client_public_id: ClientPublicId) -> AppFullId {
let mut rng = rand::thread_rng();
AppFullId::new_bls(&mut rng, client_public_id)
}
pub fn random_client() -> Result<CoreClient, CoreError>
where
{
let on_network_event = |net_event| trace!("Unexpected NetworkEvent occurred: {:?}", net_event);
let client_creator = |net_tx| {
let acc_locator = unwrap!(utils::generate_random_string(10));
let acc_password = unwrap!(utils::generate_random_string(10));
futures::executor::block_on(CoreClient::new(&acc_locator, &acc_password, net_tx))
};
match setup_client_with_net_obs(&(), client_creator, on_network_event) {
Ok((_receiver, client)) => Ok(client),
Err(error) => Err(error),
}
}
pub fn setup_client<Create, A, C, F>(context: &A, c: Create) -> Result<C, CoreError>
where
Create: FnOnce(NetworkTx) -> Result<C, F>,
A: 'static,
C: Client,
F: Debug,
{
let n = |net_event| trace!("Unexpected NetworkEvent occurred: {:?}", net_event);
match setup_client_with_net_obs(context, c, n) {
Ok((_receiver, client)) => Ok(client),
Err(error) => Err(error),
}
}
pub fn setup_client_with_net_obs<Create, NetObs, A, C, F>(
_context: &A,
client_creator: Create,
mut n: NetObs,
) -> Result<(Box<dyn Future<Output = ()> + 'static + Send>, C), CoreError>
where
Create: FnOnce(NetworkTx) -> Result<C, F>,
NetObs: FnMut(NetworkEvent) + 'static + Send,
A: 'static,
C: Client,
F: Debug,
{
let (net_tx, mut net_rx) = mpsc::unbounded();
let client = unwrap!(client_creator(net_tx));
let net_fut = async move {
while let Some(msg) = net_rx.next().await {
n(msg);
}
};
Ok((Box::new(net_fut), client))
}
pub fn calculate_new_balance(
mut balance: Coins,
mutation_count: Option<u64>,
transferred_coins: Option<Coins>,
) -> Coins {
if let Some(x) = mutation_count {
balance = unwrap!(balance.checked_sub(Coins::from_nano(x * COST_OF_PUT.as_nano())));
}
if let Some(coins) = transferred_coins {
balance = unwrap!(balance.checked_sub(coins));
}
balance
}
pub fn init_log() {
use std::io::Write;
let do_format = move |formatter: &mut env_logger::fmt::Formatter, record: &log::Record<'_>| {
let now = formatter.timestamp();
writeln!(
formatter,
"{} {} [{}:{}] {}",
formatter.default_styled_level(record.level()),
now,
record.file().unwrap_or_default(),
record.line().unwrap_or_default(),
record.args()
)
};
let _ = env_logger::Builder::from_default_env()
.format(do_format)
.is_test(true)
.try_init();
}