diff options
author | hozan23 <hozan23@proton.me> | 2023-11-09 11:38:19 +0300 |
---|---|---|
committer | hozan23 <hozan23@proton.me> | 2023-11-09 11:38:19 +0300 |
commit | 849d827486c75b2ab223d7b0e638dbb5b74d4d1d (patch) | |
tree | 41cd3babc37147ec4a40cab8ce8ae31c91cce33b /karyons_p2p/examples/chat.rs | |
parent | de1354525895ffbad18f90a5246fd65157f7449e (diff) |
rename crates
Diffstat (limited to 'karyons_p2p/examples/chat.rs')
-rw-r--r-- | karyons_p2p/examples/chat.rs | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/karyons_p2p/examples/chat.rs b/karyons_p2p/examples/chat.rs deleted file mode 100644 index 4358362..0000000 --- a/karyons_p2p/examples/chat.rs +++ /dev/null @@ -1,141 +0,0 @@ -use std::sync::Arc; - -use async_std::io; -use async_trait::async_trait; -use clap::Parser; -use smol::{channel, future, Executor}; - -use karyons_net::{Endpoint, Port}; - -use karyons_p2p::{ - protocol::{ArcProtocol, Protocol, ProtocolEvent, ProtocolID}, - ArcPeer, Backend, Config, P2pError, PeerID, Version, -}; - -#[derive(Parser)] -#[command(author, version, about, long_about = None)] -struct Cli { - /// Optional list of bootstrap peers to start the seeding process. - #[arg(short)] - bootstrap_peers: Vec<Endpoint>, - - /// Optional list of peer endpoints for manual connections. - #[arg(short)] - peer_endpoints: Vec<Endpoint>, - - /// Optional endpoint for accepting incoming connections. - #[arg(short)] - listen_endpoint: Option<Endpoint>, - - /// Optional TCP/UDP port for the discovery service. - #[arg(short)] - discovery_port: Option<Port>, - - /// Username - #[arg(long)] - username: String, -} - -pub struct ChatProtocol { - username: String, - peer: ArcPeer, -} - -impl ChatProtocol { - fn new(username: &str, peer: ArcPeer) -> ArcProtocol { - Arc::new(Self { - peer, - username: username.to_string(), - }) - } -} - -#[async_trait] -impl Protocol for ChatProtocol { - async fn start(self: Arc<Self>, ex: Arc<Executor<'_>>) -> Result<(), P2pError> { - let selfc = self.clone(); - let stdin = io::stdin(); - let task = ex.spawn(async move { - loop { - let mut input = String::new(); - stdin.read_line(&mut input).await.unwrap(); - let msg = format!("> {}: {}", selfc.username, input.trim()); - selfc.peer.broadcast(&Self::id(), &msg).await; - } - }); - - let listener = self.peer.register_listener::<Self>().await; - loop { - let event = listener.recv().await.unwrap(); - - match event { - ProtocolEvent::Message(msg) => { - let msg = String::from_utf8(msg).unwrap(); - println!("{msg}"); - } - ProtocolEvent::Shutdown => { - break; - } - } - } - - task.cancel().await; - listener.cancel().await; - Ok(()) - } - - fn version() -> Result<Version, P2pError> { - "0.1.0, 0.1.0".parse() - } - - fn id() -> ProtocolID { - "CHAT".into() - } -} - -fn main() { - env_logger::init(); - let cli = Cli::parse(); - - // Create a PeerID based on the username. - let peer_id = PeerID::new(cli.username.as_bytes()); - - // Create the configuration for the backend. - let config = Config { - listen_endpoint: cli.listen_endpoint, - peer_endpoints: cli.peer_endpoints, - bootstrap_peers: cli.bootstrap_peers, - discovery_port: cli.discovery_port.unwrap_or(0), - ..Default::default() - }; - - // Create a new Backend - let backend = Backend::new(peer_id, config); - - let (ctrlc_s, ctrlc_r) = channel::unbounded(); - let handle = move || ctrlc_s.try_send(()).unwrap(); - ctrlc::set_handler(handle).unwrap(); - - // Create a new Executor - let ex = Arc::new(Executor::new()); - - let ex_cloned = ex.clone(); - let task = ex.spawn(async { - let username = cli.username; - - // Attach the ChatProtocol - let c = move |peer| ChatProtocol::new(&username, peer); - backend.attach_protocol::<ChatProtocol>(c).await.unwrap(); - - // Run the backend - backend.run(ex_cloned).await.unwrap(); - - // Wait for ctrlc signal - ctrlc_r.recv().await.unwrap(); - - // Shutdown the backend - backend.shutdown().await; - }); - - future::block_on(ex.run(task)); -} |