#![deny(rust_2018_idioms)] use futures::{SinkExt, StreamExt}; use hyper::service::{make_service_fn, service_fn}; use hyper::Server; use hyper_websocket_lite::{server_upgrade, AsyncClient}; use websocket_codec::{Message, Opcode, Result}; async fn on_client(mut stream_mut: AsyncClient) { let mut stream = loop { let (msg, mut stream) = stream_mut.into_future().await; let msg = match msg { Some(Ok(msg)) => msg, Some(Err(_err)) => { let _ = stream.send(Message::close(None)).await; break stream; } None => { break stream; } }; let _ = match msg.opcode() { Opcode::Text | Opcode::Binary => stream.send(msg).await, Opcode::Ping => stream.send(Message::pong(msg.into_data())).await, Opcode::Close => { break stream; } Opcode::Pong => Ok(()), }; stream_mut = stream; }; let _ = stream.send(Message::close(None)).await; } #[tokio::main] async fn main() -> Result<()> { let addr = ([0, 0, 0, 0], 9001).into(); let make_service = make_service_fn(|_| async { Ok::<_, hyper::Error>(service_fn(|req| server_upgrade(req, on_client))) }); Server::bind(&addr).serve(make_service).await?; Ok(()) }