dope-tls 0.19.0

TCP TLS streams for dope runtime, shin-backed
Documentation
use crate::error;
use crate::state::Internals as _;
use crate::state::{self, direct, sessions, staged};

pub trait Client<'d> {
    fn read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> Result<(), error::Error>;

    #[doc(hidden)]
    fn read_tcp_in_place<'a>(&mut self, bytes: &'a mut [u8]) -> direct::WireRead<'a>;

    #[doc(hidden)]
    fn read_staged_wire(&mut self, bytes: &[u8]) -> staged::WireRead<'d>;

    fn try_read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> bool;
}

pub trait Server<'d> {
    fn read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> Result<(), error::Error>;

    #[doc(hidden)]
    fn read_tcp_in_place<'a>(&mut self, bytes: &'a mut [u8]) -> direct::WireRead<'a>;

    #[doc(hidden)]
    fn read_staged_wire(&mut self, bytes: &[u8]) -> staged::WireRead<'d>;

    fn try_read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> bool;
}

impl<'d, S: sessions::ClientPeer> Client<'d> for state::State<'d, S> {
    fn read_tcp(
        &mut self,
        bytes: &[u8],
        mut receive: impl FnMut(&[u8]),
    ) -> Result<(), error::Error> {
        let read = staged::Reader::new(self).read(
            bytes,
            &mut |session, epoch, data, events| session.read_into(epoch, data, events),
            &mut receive,
        );
        let drained = self.drain_pending_control();
        read?;
        drained
    }

    fn read_tcp_in_place<'a>(&mut self, bytes: &'a mut [u8]) -> direct::WireRead<'a> {
        let mut read = direct::Reader::new(self)
            .read_in_place(bytes, &mut |session, epoch, data, events| {
                session.read_into(epoch, data, events)
            });
        if self.drain_pending_control().is_err() {
            read.fail();
        }
        read
    }

    fn read_staged_wire(&mut self, bytes: &[u8]) -> staged::WireRead<'d> {
        let mut read = staged::Reader::new(self)
            .read_one_wire(bytes, &mut |session, epoch, data, events| {
                session.read_into(epoch, data, events)
            });
        if self.drain_pending_control().is_err() {
            read.fail();
        }
        read
    }

    fn try_read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> bool {
        bytes.is_empty() || Client::read_tcp(self, bytes, receive).is_ok()
    }
}

impl<'d, S: sessions::ServerPeer> Server<'d> for state::State<'d, S> {
    fn read_tcp(
        &mut self,
        bytes: &[u8],
        mut receive: impl FnMut(&[u8]),
    ) -> Result<(), error::Error> {
        let read = staged::Reader::new(self).read(
            bytes,
            &mut |session, epoch, data, events| session.read_into(epoch, data, events),
            &mut receive,
        );
        let drained = self.drain_pending_control();
        read?;
        drained
    }

    fn read_tcp_in_place<'a>(&mut self, bytes: &'a mut [u8]) -> direct::WireRead<'a> {
        let mut read = direct::Reader::new(self)
            .read_in_place(bytes, &mut |session, epoch, data, events| {
                session.read_into(epoch, data, events)
            });
        if self.drain_pending_control().is_err() {
            read.fail();
        }
        read
    }

    fn read_staged_wire(&mut self, bytes: &[u8]) -> staged::WireRead<'d> {
        let mut read = staged::Reader::new(self)
            .read_one_wire(bytes, &mut |session, epoch, data, events| {
                session.read_into(epoch, data, events)
            });
        if self.drain_pending_control().is_err() {
            read.fail();
        }
        read
    }

    fn try_read_tcp(&mut self, bytes: &[u8], receive: impl FnMut(&[u8])) -> bool {
        bytes.is_empty() || Server::read_tcp(self, bytes, receive).is_ok()
    }
}