use beam::adapters::{OutgoingWebsocketManager, WsServer, WsServerConfig};
use beam::{Config, Node, Value};
use tokio::net::TcpStream;
use tokio::time::{Duration, sleep, timeout};
async fn wait_for_port(port: u16, timeout_ms: u64) {
let deadline = Duration::from_millis(timeout_ms);
let start = tokio::time::Instant::now();
while start.elapsed() < deadline {
if TcpStream::connect(format!("127.0.0.1:{port}"))
.await
.is_ok()
{
return;
}
sleep(Duration::from_millis(50)).await;
}
panic!("port {port} did not become ready within {timeout_ms}ms");
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let port = 9494u16;
let url = format!("ws://localhost:{port}/ws");
let config_a = Config::default();
let ws_server = WsServer::new_with_config(
config_a.clone(),
WsServerConfig {
port,
..WsServerConfig::default()
},
);
let mut node_a = Node::new_with_config(config_a, vec![], vec![Box::new(ws_server.clone())]);
let ws_client = OutgoingWebsocketManager::new(Config::default(), vec![url]);
let mut node_b = Node::new_with_config(Config::default(), vec![], vec![Box::new(ws_client)]);
wait_for_port(port, 5000).await;
println!("Server listening on port {port}");
let start = tokio::time::Instant::now();
while start.elapsed() < Duration::from_secs(5) {
if ws_server.peer_count() >= 1 {
break;
}
sleep(Duration::from_millis(50)).await;
}
assert!(
ws_server.peer_count() >= 1,
"client did not connect within 5s"
);
println!("Client connected to server");
let mut sub_b = node_b.get("message").on();
node_a
.get("message")
.put(Value::Text("Hello from Node A!".into()))
.await?;
println!("Put 'Hello from Node A!' on server");
let received = timeout(Duration::from_secs(10), sub_b.recv())
.await
.expect("timeout: Node B did not receive the message")?;
assert_eq!(received, Value::Text("Hello from Node A!".into()));
println!("Node B received: {}", received.to_string());
println!("Sync complete!");
node_a.stop();
node_b.stop();
Ok(())
}