echo_server.rs

 1use futures::{SinkExt, StreamExt};
 2use tokio::{self, io, net::TcpSocket};
 3
 4use tokio_xmpp::rustls;
 5use tokio_xmpp::{
 6    minidom::Element,
 7    parsers::stream_features::StreamFeatures,
 8    xmlstream::{accept_stream, StreamHeader, Timeouts},
 9};
10
11#[tokio::main]
12async fn main() -> Result<(), io::Error> {
13    rustls::crypto::aws_lc_rs::default_provider()
14        .install_default()
15        .expect("failed to install rustls crypto provider");
16
17    // TCP socket
18    let address = "127.0.0.1:5222".parse().unwrap();
19    let socket = TcpSocket::new_v4()?;
20    socket.bind(address)?;
21
22    let listener = socket.listen(1024)?;
23
24    // Main loop, accepts incoming connections
25    loop {
26        let (stream, _addr) = listener.accept().await?;
27        let stream = accept_stream(
28            tokio::io::BufStream::new(stream),
29            tokio_xmpp::parsers::ns::DEFAULT_NS,
30            Timeouts::default(),
31        )
32        .await?;
33        let stream = stream.send_header(StreamHeader::default()).await?;
34        let mut stream = stream
35            .send_features::<Element>(&StreamFeatures::default())
36            .await?;
37
38        tokio::spawn(async move {
39            while let Some(packet) = stream.next().await {
40                match packet {
41                    Ok(packet) => {
42                        println!("Received packet: {:?}", packet);
43                        stream.send(&packet).await.unwrap();
44                    }
45                    Err(e) => {
46                        eprintln!("Error: {:?}", e);
47                    }
48                }
49            }
50        });
51    }
52}