use std::sync::Arc;
use tokio::{
io::{AsyncRead, AsyncWrite},
sync::{mpsc::{Sender, channel}, RwLock},
};
use crate::{ProtFrame, TransStream, ProxyError, ProtCreate, MappingConfig};
pub struct TransTcp {
sender: Sender<ProtFrame>,
sender_work: Sender<(ProtCreate, Sender<ProtFrame>)>,
sock_map: u64,
mappings: Arc<RwLock<Vec<MappingConfig>>>,
}
impl TransTcp {
pub fn new(
sender: Sender<ProtFrame>,
sender_work: Sender<(ProtCreate, Sender<ProtFrame>)>,
sock_map: u64,
mappings: Arc<RwLock<Vec<MappingConfig>>>,
) -> Self {
Self {
sender,
sender_work,
sock_map,
mappings,
}
}
pub async fn process<T>(self, inbound: T, mode: &str) -> Result<(), ProxyError<T>>
where
T: AsyncRead + AsyncWrite + Unpin,
{
let domain = {
let mut is_find = false;
let read = self.mappings.read().await;
let mut doamin = String::new();
for v in &*read {
if v.mode == mode {
is_find = true;
doamin = v.name.clone();
}
}
if !is_find {
log::warn!("未找到正确的tcp商户端映射");
return Ok(());
}
doamin
};
let create = ProtCreate::new(self.sock_map, Some(domain));
let (stream_sender, stream_receiver) = channel::<ProtFrame>(10);
let _ = self.sender_work.send((create, stream_sender)).await;
let trans = TransStream::new(inbound, self.sock_map, self.sender, stream_receiver);
trans.copy_wait().await?;
Ok(())
}
}