use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
use tokio::net::TcpStream;
use tokio::sync::mpsc;
use crate::pipe::{Direction, Pipe, ShortCircuit};
use fern_masking::{DataMaskingHandler, PassthroughHandler, SQLHandlerConfig};
use fern_protocol_postgresql::codec::{backend, frontend};
#[derive(Debug)]
pub struct Connection {
pub forward_pipe: Pipe<
OwnedReadHalf,
OwnedWriteHalf,
frontend::Codec,
frontend::Message,
backend::Message,
PassthroughHandler<frontend::Message>,
>,
pub backward_pipe: Pipe<
OwnedReadHalf,
OwnedWriteHalf,
backend::Codec,
backend::Message,
frontend::Message,
DataMaskingHandler,
>,
}
impl Connection {
#[rustfmt::skip]
pub async fn new(client_socket: TcpStream, server_socket: TcpStream, config: &SQLHandlerConfig) -> Connection {
let (client_rx, client_tx) = client_socket.into_split();
let (server_rx, server_tx) = server_socket.into_split();
let (forward_tx, forward_rx) = mpsc::channel::<backend::Message>(128);
let (backward_tx, backward_rx) = mpsc::channel::<frontend::Message>(128);
let forward_short = ShortCircuit::new(forward_tx, backward_rx);
let backward_short = ShortCircuit::new(backward_tx, forward_rx);
let forward_pipe = Pipe::new(
Direction::ClientServer,
client_rx,
server_tx,
forward_short,
config,
);
let backward_pipe = Pipe::new(
Direction::ServerClient,
server_rx,
client_tx,
backward_short,
config,
);
Connection {
forward_pipe,
backward_pipe,
}
}
}