use async_std::net::{UdpSocket};
use super::define::*;
use crate::cli::rec_p2p::rec_single_pac;
pub async fn listen(host: &str, handler: &dyn Fn(&Vec<u8>) -> Vec<u8>) -> anyhow::Result<()> {
dbg!("callee listen");
let soc = UdpSocket::bind("0.0.0.0:0").await?;
SOC.set(soc).unwrap();
let socket = SOC.get().unwrap();
let registry = Packet::callee_save_default()?;
loop {
socket.send_to(®istry.pack(), host).await?;
let res = rec_single_pac(Who::Callee).await;
if let Err(_) = res {
continue;
}
let income = res.unwrap();
match income.cmd {
CMD::Open => {
let pac = Packet::p2p_default(income.address);
pac.send_pac(Who::Callee,&vec![]).await?;
}
CMD::P2P => {
dbg!("callee rec p2p");
if income.body_len as i32 > 0 && income.is_done(Who::Callee) {
let msg = income.assembly(Who::Callee)?;
let back = handler(&msg);
dbg!(&income);
income.send_pac(Who::Callee,&back).await?;
}
}
_ => {
dbg!("no cmd match");
}
}
}
}