trz-gateway-client 0.2.23

Secure Proxy / Agents implementation in Rust
use std::pin::Pin;
use std::task::Context;
use std::task::Poll;

use pin_project::pin_project;
use tokio::io::AsyncRead;
use tokio::io::AsyncWrite;
use tokio::io::ReadBuf;
use tokio::net::TcpStream;

use crate::p2p::P2pStream;

#[pin_project(project = TransportStreamProj)]
pub enum TransportStream {
    Direct(#[pin] TcpStream),
    WebRtc(#[pin] P2pStream),
}

impl AsyncRead for TransportStream {
    fn poll_read(
        self: Pin<&mut Self>,
        context: &mut Context<'_>,
        buffer: &mut ReadBuf<'_>,
    ) -> Poll<std::io::Result<()>> {
        match self.project() {
            TransportStreamProj::Direct(stream) => stream.poll_read(context, buffer),
            TransportStreamProj::WebRtc(stream) => stream.poll_read(context, buffer),
        }
    }
}

impl AsyncWrite for TransportStream {
    fn poll_write(
        self: Pin<&mut Self>,
        context: &mut Context<'_>,
        buffer: &[u8],
    ) -> Poll<std::io::Result<usize>> {
        match self.project() {
            TransportStreamProj::Direct(stream) => stream.poll_write(context, buffer),
            TransportStreamProj::WebRtc(stream) => stream.poll_write(context, buffer),
        }
    }

    fn poll_flush(self: Pin<&mut Self>, context: &mut Context<'_>) -> Poll<std::io::Result<()>> {
        match self.project() {
            TransportStreamProj::Direct(stream) => stream.poll_flush(context),
            TransportStreamProj::WebRtc(stream) => stream.poll_flush(context),
        }
    }

    fn poll_shutdown(self: Pin<&mut Self>, context: &mut Context<'_>) -> Poll<std::io::Result<()>> {
        match self.project() {
            TransportStreamProj::Direct(stream) => stream.poll_shutdown(context),
            TransportStreamProj::WebRtc(stream) => stream.poll_shutdown(context),
        }
    }
}