dope-tls 0.19.0

TCP TLS streams for dope runtime, shin-backed
Documentation
use crate::error;
use crate::tls::{self, connection, endpoints, roles};
use crate::{state, transmissions};

pub(super) struct Open<'a, 'd, R: roles::Protocol, const ID: u8> {
    runtime: &'a mut endpoints::Runtime<'d, R, ID>,
}

impl<'a, 'd, R: roles::Protocol, const ID: u8> Open<'a, 'd, R, ID> {
    pub(super) fn new(runtime: &'a mut endpoints::Runtime<'d, R, ID>) -> Self {
        Self { runtime }
    }

    pub(super) fn try_take(
        self,
    ) -> Result<Option<(tls::Connection<'d, R, ID>, tls::SendState<'d>)>, error::Error> {
        let tls = R::open::<ID>(
            &mut self.runtime.role,
            &self.runtime.buffers.recv,
            &self.runtime.buffers.send,
        )?;
        Ok(tls.map(|mut tls| {
            let mut send = tls::SendState::new();
            state::Internals::swap_pending_buffer(&mut tls, &mut send.buffer);
            let _ = transmissions::SendBuffer::release_if_empty(&mut send);
            (
                tls::Connection {
                    state: connection::ConnectionState::new(tls),
                    send_inflight: false,
                },
                send,
            )
        }))
    }
}