ppaass-agent 0.1.35

The agent part of the ppaass application
Documentation
use crate::error::AgentServerError;
use bytes::BytesMut;
use ppaass_codec::codec::agent::PpaassAgentMessageEncoder;
use ppaass_codec::codec::proxy::PpaassProxyMessageDecoder;
use ppaass_crypto::crypto::RsaCryptoFetcher;
use ppaass_protocol::message::{PpaassAgentMessage, PpaassProxyMessage};
use tokio_util::codec::{Decoder, Encoder};

pub(crate) struct PpaassProxyEdgeCodec<F>
where
    F: RsaCryptoFetcher,
{
    encoder: PpaassAgentMessageEncoder<F>,
    decoder: PpaassProxyMessageDecoder<F>,
}

impl<F> PpaassProxyEdgeCodec<F>
where
    F: RsaCryptoFetcher + Clone,
{
    pub fn new(compress: bool, rsa_crypto_fetcher: F) -> Self {
        Self {
            encoder: PpaassAgentMessageEncoder::new(compress, rsa_crypto_fetcher.clone()),
            decoder: PpaassProxyMessageDecoder::new(rsa_crypto_fetcher),
        }
    }
}

impl<F> Encoder<PpaassAgentMessage> for PpaassProxyEdgeCodec<F>
where
    F: RsaCryptoFetcher,
{
    type Error = AgentServerError;

    fn encode(&mut self, item: PpaassAgentMessage, dst: &mut BytesMut) -> Result<(), Self::Error> {
        self.encoder
            .encode(item, dst)
            .map_err(AgentServerError::ProxyEdgeCodec)
    }
}

impl<F> Decoder for PpaassProxyEdgeCodec<F>
where
    F: RsaCryptoFetcher,
{
    type Item = PpaassProxyMessage;
    type Error = AgentServerError;

    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
        self.decoder
            .decode(src)
            .map_err(AgentServerError::ProxyEdgeCodec)
    }
}