#![recursion_limit = "1024"]
#[macro_use]
extern crate tracing;
mod buffer;
mod config;
mod global;
mod hole_punching;
mod kad;
mod lan;
mod peer_list;
mod server;
mod session;
mod session_key;
pub mod primitives;
pub mod transports;
pub mod prelude {
pub use chamomile_types::key::Key;
pub use chamomile_types::message::{
DeliveryType, ReceiveMessage, SendMessage, StateRequest, StateResponse, StreamType,
};
pub use chamomile_types::types::{Broadcast, PeerId, TransportType};
pub use chamomile_types::Peer;
use tokio::{
fs::create_dir_all,
io::Result,
sync::mpsc::{self, Receiver, Sender},
};
pub use super::config::Config;
use crate::primitives::STORAGE_NAME;
pub fn new_send_channel() -> (Sender<SendMessage>, Receiver<SendMessage>) {
mpsc::channel(1024)
}
pub fn new_receive_channel() -> (Sender<ReceiveMessage>, Receiver<ReceiveMessage>) {
mpsc::channel(1024)
}
pub async fn start(
mut config: Config,
) -> Result<(PeerId, Sender<SendMessage>, Receiver<ReceiveMessage>)> {
info!("start p2p service...");
let mut new_path = config.db_dir.clone();
new_path.push(STORAGE_NAME);
if !new_path.exists() {
create_dir_all(&new_path).await?;
}
config.db_dir = new_path;
let (send_send, send_recv) = new_send_channel();
let (recv_send, recv_recv) = new_receive_channel();
let peer_id = super::server::start(config, recv_send, send_recv).await?;
info!("start p2p ok.");
Ok((peer_id, send_send, recv_recv))
}
pub async fn start_with_key(
mut config: Config,
key: Key,
) -> Result<(PeerId, Sender<SendMessage>, Receiver<ReceiveMessage>)> {
info!("start p2p service...");
let mut new_path = config.db_dir.clone();
new_path.push(STORAGE_NAME);
if !new_path.exists() {
create_dir_all(&new_path).await?;
}
config.db_dir = new_path;
let (send_send, send_recv) = new_send_channel();
let (recv_send, recv_recv) = new_receive_channel();
let peer_id = super::server::start_with_key(config, recv_send, send_recv, key).await?;
info!("start p2p ok.");
Ok((peer_id, send_send, recv_recv))
}
}