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}