use pmcp::server::transport::{EnhancedWebSocketConfig, EnhancedWebSocketServer};
use std::time::Duration;
use tracing::{info, Level};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt().with_max_level(Level::INFO).init();
info!("🚀 Starting Enhanced WebSocket Server Example");
let config = EnhancedWebSocketConfig {
bind_addr: "127.0.0.1:9001".parse()?,
max_connections: 100,
connection_timeout: Duration::from_secs(60),
heartbeat_interval: Duration::from_secs(15),
max_frame_size: Some(10 * 1024 * 1024), max_message_size: Some(10 * 1024 * 1024), enable_pooling: true,
enable_broadcast: true, };
let mut server = EnhancedWebSocketServer::new(config);
server.start().await?;
info!("✅ Server started on ws://127.0.0.1:9001");
info!("Features enabled:");
info!(" • Multi-client support (max 100 connections)");
info!(" • Connection pooling");
info!(" • Broadcast messaging");
info!(" • Heartbeat monitoring (15s interval)");
info!(" • Automatic stale connection cleanup");
let server_clone = std::sync::Arc::new(tokio::sync::RwLock::new(server));
let stats_server = server_clone.clone();
tokio::spawn(async move {
let mut interval = tokio::time::interval(Duration::from_secs(10));
loop {
interval.tick().await;
let server = stats_server.read().await;
let client_count = server.client_count().await;
info!("📊 Connected clients: {}", client_count);
if client_count > 0 {
let clients = server.get_connected_clients().await;
info!(" Client IDs: {:?}", clients);
}
}
});
let server = server_clone.clone();
loop {
let server_read = server.read().await;
match tokio::time::timeout(Duration::from_secs(1), server_read.receive_from_any()).await {
Ok(Ok((client_id, message))) => {
info!("📨 Received from client {}: {:?}", client_id, message);
if let Err(e) = server_read.send_to_client(client_id, message.clone()).await {
info!("Failed to echo to client: {}", e);
}
if server_read.client_count().await > 1 {
info!("📢 Broadcasting to all clients");
if let Err(e) = server_read.broadcast(message).await {
info!("Broadcast failed: {}", e);
}
}
},
Ok(Err(e)) => {
if !e.to_string().contains("No messages available") {
info!("Receive error: {}", e);
}
},
Err(_) => {
},
}
if tokio::signal::ctrl_c().await.is_ok() {
info!("🛑 Shutdown signal received");
break;
}
}
let mut server_write = server_clone.write().await;
server_write.shutdown().await?;
info!("👋 Server shut down gracefully");
Ok(())
}