use std::sync::Arc;
use std::time::Duration;
use net_sdk::dataforts::MeshBlobAdapter;
use net_sdk::deck::{AdminVerifier, DeckClient, OperatorIdentity, OperatorRegistry};
use net_sdk::meshos::{EntityKeypair, MeshOsConfig, MeshOsDaemonSdk, NodeId};
use net_sdk::{Mesh, MeshBuilder};
const MESH_BIND: &str = "127.0.0.1:0";
pub struct Harness {
_sdk: MeshOsDaemonSdk,
#[cfg_attr(not(all(test, feature = "webrtc")), allow(dead_code))]
mesh: Mesh,
deck: Arc<DeckClient>,
blob_adapters: Vec<Arc<MeshBlobAdapter>>,
this_node: NodeId,
}
impl Harness {
pub fn deck(&self) -> Arc<DeckClient> {
Arc::clone(&self.deck)
}
pub fn blob_adapters(&self) -> Vec<Arc<MeshBlobAdapter>> {
self.blob_adapters.clone()
}
pub fn this_node(&self) -> NodeId {
self.this_node
}
#[cfg(all(test, feature = "webrtc"))]
pub fn mesh(&self) -> &Mesh {
&self.mesh
}
}
pub async fn spawn() -> color_eyre::Result<Harness> {
let mut psk = [0u8; 32];
getrandom::fill(&mut psk)
.map_err(|e| color_eyre::eyre::eyre!("no system entropy for the deck's mesh PSK: {e}"))?;
spawn_with_psk(&psk).await
}
pub async fn spawn_with_psk(psk: &[u8; 32]) -> color_eyre::Result<Harness> {
let mesh = MeshBuilder::new(MESH_BIND, psk)
.map_err(|e| color_eyre::eyre::eyre!("the deck's mesh bind address was rejected: {e}"))?
.build()
.await
.map_err(|e| color_eyre::eyre::eyre!("the deck's mesh node failed to start: {e}"))?;
mesh.start();
let this_node = mesh.node_id();
let mut cfg = MeshOsConfig::default();
cfg.this_node = this_node;
cfg.tick_interval = Duration::from_millis(250);
let dispatcher = Arc::new(net_sdk::meshos::LoggingDispatcher::new());
let operator_keypair = EntityKeypair::generate();
let mut registry = OperatorRegistry::new();
registry.register(&operator_keypair);
let verifier = Arc::new(AdminVerifier::new(Arc::new(registry), 1));
let sdk = MeshOsDaemonSdk::start_with_verifier_and_migration_source(
cfg,
dispatcher,
Some(verifier),
None,
);
let identity = OperatorIdentity::from_keypair(operator_keypair);
let deck =
Arc::new(DeckClient::from_runtime(sdk.runtime(), identity).with_mesh(mesh.node_arc()));
Ok(Harness {
_sdk: sdk,
mesh,
deck,
blob_adapters: Vec::new(),
this_node,
})
}