use std::{env, error::Error};
use adnl::crypto::{KeyPair, SecretKey};
use adnl::{AdnlAddress, AdnlPeer};
use futures::{SinkExt, StreamExt};
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let addr = env::args()
.nth(1)
.unwrap_or_else(|| "127.0.0.1:8080".to_string());
let private_key_hex = env::var("KEY").unwrap_or_else(|_| {
"f0971651aec4bb0d65ec3861c597687fda9c1e7d2ee8a93acb9a131aa9f3aee7".to_string()
});
let private_key_bytes: [u8; 32] = hex::decode(private_key_hex)?.try_into().unwrap();
let keypair = KeyPair::from(&SecretKey::from_bytes(private_key_bytes));
let listener = TcpListener::bind(&addr).await?;
println!("Listening on: {}", addr);
println!(
"Public key is: {}",
hex::encode(keypair.public_key.as_bytes())
);
println!(
"Address is: {}",
hex::encode(AdnlAddress::from(&keypair.public_key).as_bytes())
);
loop {
let (socket, _) = listener.accept().await?;
let private_key = keypair.clone();
tokio::spawn(async move {
let mut adnl_server = AdnlPeer::handle_handshake(socket, |_| Some(private_key.clone()))
.await
.expect("handshake failed");
while let Some(Ok(packet)) = adnl_server.next().await {
let _ = adnl_server.send(packet).await;
}
});
}
}