Expand description
chamomile
is a crate for building a solid and efficient p2p network.
Example Use
We running a p2p peer, and if others add, we will get the info.
ⓘ
use std::env::args;
use std::net::SocketAddr;
use std::path::PathBuf;
use chamomile::prelude::{start, Config, Peer, ReceiveMessage, SendMessage};
#[tokio::main]
async fn main() {
let addr_str = args().nth(1).expect("missing path");
let self_addr: SocketAddr = addr_str.parse().expect("invalid addr");
println!("START A INDEPENDENT P2P RELAY SERVER. : {}", self_addr);
let mut config = Config::default(Peer::socket(self_addr));
config.permission = false;
config.only_stable_data = true;
config.db_dir = std::path::PathBuf::from("./");
let (peer_id, send, mut recv) = start(config).await.unwrap();
println!("peer id: {}", peer_id.to_hex());
if args().nth(2).is_some() {
let remote_addr: SocketAddr = args().nth(2).unwrap().parse().expect("invalid addr");
println!("start DHT connect to remote: {}", remote_addr);
send.send(SendMessage::Connect(Peer::socket(remote_addr)))
.await
.expect("channel failure");
}
while let Some(message) = recv.recv().await {
match message {
ReceiveMessage::Data(..) => {}
ReceiveMessage::Stream(..) => {}
ReceiveMessage::StableConnect(from, ..) => {
let _ = send
.send(SendMessage::StableResult(0, from, false, false, vec![]))
.await;
}
ReceiveMessage::ResultConnect(from, ..) => {
let _ = send
.send(SendMessage::StableResult(0, from, false, false, vec![]))
.await;
}
ReceiveMessage::StableLeave(..) => {}
ReceiveMessage::StableResult(..) => {}
ReceiveMessage::Delivery(..) => {}
ReceiveMessage::NetworkLost => {}
}
}
}
Features
- Support build a robust stable connection between two peers on the p2p network.
- Support permissionless network.
- Support permissioned network (distributed network).
- DHT-based & Relay connection.
- Diff transports: QUIC(default) / TCP / UDP-Based Special Protocol.