wtransport 0.7.1

Implementation of the WebTransport (over HTTP3) protocol
Documentation
use crate::driver::streams::uniremote::StreamUniRemoteH3;
use crate::driver::DriverError;
use crate::error::StreamReadError;
use crate::error::StreamReadExactError;
use std::future::pending;
use wtransport_proto::error::ErrorCode;
use wtransport_proto::stream_header::StreamKind;

pub struct RemoteQPackEncStream {
    stream: Option<StreamUniRemoteH3>,
    buffer: Box<[u8]>,
}

impl RemoteQPackEncStream {
    pub fn empty() -> Self {
        let buffer = vec![0; 64].into_boxed_slice();

        Self {
            stream: None,
            buffer,
        }
    }

    pub fn is_empty(&self) -> bool {
        self.stream.is_none()
    }

    pub fn set_stream(&mut self, stream: StreamUniRemoteH3) {
        assert!(matches!(stream.kind(), StreamKind::QPackEncoder));
        self.stream = Some(stream);
    }

    pub async fn run(&mut self) -> DriverError {
        let stream = match self.stream.as_mut() {
            Some(stream) => stream,
            None => pending().await,
        };

        loop {
            match stream.stream_mut().read_exact(&mut self.buffer).await {
                Ok(()) => {}
                Err(StreamReadExactError::FinishedEarly(_)) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
                Err(StreamReadExactError::Read(StreamReadError::NotConnected)) => {
                    return DriverError::NotConnected;
                }
                Err(StreamReadExactError::Read(StreamReadError::Reset(_))) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
                Err(StreamReadExactError::Read(StreamReadError::QuicProto)) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
            }
        }
    }
}

pub struct RemoteQPackDecStream {
    stream: Option<StreamUniRemoteH3>,
    buffer: Box<[u8]>,
}

impl RemoteQPackDecStream {
    pub fn empty() -> Self {
        let buffer = vec![0; 64].into_boxed_slice();
        Self {
            stream: None,
            buffer,
        }
    }

    pub fn is_empty(&self) -> bool {
        self.stream.is_none()
    }

    pub fn set_stream(&mut self, stream: StreamUniRemoteH3) {
        assert!(matches!(stream.kind(), StreamKind::QPackDecoder));
        self.stream = Some(stream);
    }

    pub async fn run(&mut self) -> DriverError {
        let stream = match self.stream.as_mut() {
            Some(stream) => stream,
            None => pending().await,
        };

        loop {
            match stream.stream_mut().read_exact(&mut self.buffer).await {
                Ok(()) => {}
                Err(StreamReadExactError::FinishedEarly(_)) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
                Err(StreamReadExactError::Read(StreamReadError::NotConnected)) => {
                    return DriverError::NotConnected;
                }
                Err(StreamReadExactError::Read(StreamReadError::Reset(_))) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
                Err(StreamReadExactError::Read(StreamReadError::QuicProto)) => {
                    return DriverError::Proto(ErrorCode::ClosedCriticalStream);
                }
            }
        }
    }
}