//! Spin up two bots in-process, connect over iroh, exchange a message. //! //! ```bash //! cargo run --example two_bots //! ``` use erl_iroh::bot::Bot; use erl_iroh::powers::Powers; use erl_iroh::term; use tracing_subscriber::EnvFilter; #[tokio::main] async fn main() -> erl_iroh::Result<()> { tracing_subscriber::fmt() .with_env_filter(EnvFilter::from_default_env().add_directive("erl_iroh=info".parse().unwrap())) .init(); let cookie = "two-bots-cookie"; let alpha = Bot::builder("alpha") .cookie(cookie) .powers(Powers::all()) .build() .await?; alpha.listen_iroh().await?; // Give the accept loop a moment to arm. tokio::time::sleep(std::time::Duration::from_millis(200)).await; let beta = Bot::builder("beta") .cookie(cookie) .powers(Powers::all()) .build() .await?; println!("alpha: {}", alpha.endpoint_id()); println!("beta: {}", beta.endpoint_id()); let handle = beta.connect_iroh(&alpha.endpoint_id_str()).await?; println!( "beta → alpha handshake ok (peer node name: {})", handle.peer_name() ); // Fire a reg_send; alpha has no registered process, but the wire path works. let _ = beta .send( handle.peer_name(), "echo", term::tuple2(term::atom("hi"), term::atom("from_beta")), ) .await; println!("alpha peers: {:?}", alpha.peers().await); println!("beta peers: {:?}", beta.peers().await); println!("success"); beta.shutdown().await; alpha.shutdown().await; Ok(()) }