use hero_websocket_client::CircleWsClientBuilder; use hero_websocket_server::ServerBuilder; use std::time::Instant; use tokio::signal; use tokio::time::{sleep, timeout, Duration}; const CIRCLE_PUBLIC_KEY: &str = "circle_public_key"; #[tokio::main] async fn main() -> Result<(), Box> { println!("šŸ”— Minimal WebSocket Ping Example"); // Build server let server = match ServerBuilder::new() .host("127.0.0.1") .port(8443) .redis_url("redis://localhost:6379") .worker_id("test") .build() { Ok(server) => { println!("šŸš€ Built server..."); server }, Err(e) => { eprintln!("Failed to build server: {}", e); return Err(e.into()); } }; // Start server println!("šŸš€ Starting server..."); let (server_task, server_handle) = server.spawn_circle_server().map_err(|e| { eprintln!("Failed to start server: {}", e); e })?; // Setup signal handling for clean shutdown let server_handle_clone = server_handle.clone(); tokio::spawn(async move { signal::ctrl_c().await.expect("Failed to listen for Ctrl+C"); println!("\nšŸ”Œ Shutting down..."); server_handle_clone.stop(true).await; std::process::exit(0); }); // Brief pause for server startup sleep(Duration::from_millis(200)).await; // Connect client let mut client = CircleWsClientBuilder::new(format!("ws://localhost:8443/{}", CIRCLE_PUBLIC_KEY)).build(); match client.connect().await { Ok(_) => println!("āœ… Client Connected"), Err(e) => { eprintln!("Failed to connect: {}", e); return Err(e.into()); } } // Send one ping print!("šŸ“¤ Ping... "); let response = client.ping().await; match response { Ok(response) => { println!("šŸ“„ {}", response); } Err(e) => { eprintln!("Failed to ping: {}", e); return Err(e.into()); } } // Clean shutdown client.disconnect().await; server_handle.stop(true).await; println!("āœ… Done"); Ok(()) }