uflow 0.7.1

Provides ordered, mixed-reliability, and congestion-controlled data transfer over UDP
Documentation

pub mod serial;

#[derive(Clone,Debug,PartialEq)]
pub struct HandshakeSynFrame {
    pub version: u8,
    pub nonce: u32,
    pub max_receive_rate: u32,
    pub max_packet_size: u32,
    pub max_receive_alloc: u32,
}

#[derive(Clone,Debug,PartialEq)]
pub struct HandshakeSynAckFrame {
    pub nonce_ack: u32,
    pub nonce: u32,
    pub max_receive_rate: u32,
    pub max_packet_size: u32,
    pub max_receive_alloc: u32,
}

#[derive(Clone,Debug,PartialEq)]
pub struct HandshakeAckFrame {
    pub nonce_ack: u32,
}

#[derive(Clone,Debug,PartialEq)]
pub enum HandshakeErrorType {
    Version,
    Config,
    ServerFull,
}

#[derive(Clone,Debug,PartialEq)]
pub struct HandshakeErrorFrame {
    pub nonce_ack: u32,
    pub error: HandshakeErrorType,
}

#[derive(Clone,Debug,PartialEq)]
pub struct InfoRequestFrame {
    pub version: u8,
}

#[derive(Clone,Debug,PartialEq)]
pub struct InfoReplyFrame {
    pub peer_count: u32,
    pub max_peer_count: u32,
    pub name: String,
}

#[derive(Clone,Debug,PartialEq)]
pub struct DisconnectFrame {
}

#[derive(Clone,Debug,PartialEq)]
pub struct DisconnectAckFrame {
}

#[derive(Clone,Debug,PartialEq)]
pub struct Datagram {
    pub sequence_id: u32,
    pub channel_id: u8,
    pub window_parent_lead: u16,
    pub channel_parent_lead: u16,
    pub fragment_id: u16,
    pub fragment_id_last: u16,
    pub data: Box<[u8]>,
}

#[derive(Debug,PartialEq)]
pub struct DatagramRef<'a> {
    pub sequence_id: u32,
    pub channel_id: u8,
    pub window_parent_lead: u16,
    pub channel_parent_lead: u16,
    pub fragment_id: u16,
    pub fragment_id_last: u16,
    pub data: &'a [u8],
}

impl<'a> From<&'a Datagram> for DatagramRef<'a> {
    fn from(obj: &'a Datagram) -> Self {
        Self {
            sequence_id: obj.sequence_id,
            channel_id: obj.channel_id,
            window_parent_lead: obj.window_parent_lead,
            channel_parent_lead: obj.channel_parent_lead,
            fragment_id: obj.fragment_id,
            fragment_id_last: obj.fragment_id_last,
            data: &obj.data,
        }
    }
}

impl<'a> From<DatagramRef<'a>> for Datagram {
    fn from(obj: DatagramRef<'a>) -> Self {
        Self {
            sequence_id: obj.sequence_id,
            channel_id: obj.channel_id,
            window_parent_lead: obj.window_parent_lead,
            channel_parent_lead: obj.channel_parent_lead,
            fragment_id: obj.fragment_id,
            fragment_id_last: obj.fragment_id_last,
            data: obj.data.into(),
        }
    }
}

#[derive(Clone,Debug,PartialEq)]
pub struct DataFrame {
    pub sequence_id: u32,
    pub nonce: bool,
    pub datagrams: Vec<Datagram>,
}

#[derive(Clone,Debug,PartialEq)]
pub struct SyncFrame {
    pub next_frame_id: Option<u32>,
    pub next_packet_id: Option<u32>,
}

#[derive(Clone,Debug,PartialEq)]
pub struct AckGroup {
    pub base_id: u32,
    pub bitfield: u32,
    pub nonce: bool,
}

#[derive(Clone,Debug,PartialEq)]
pub struct AckFrame {
    pub frame_window_base_id: u32,
    pub packet_window_base_id: u32,
    pub frame_acks: Vec<AckGroup>,
}

#[derive(Clone,Debug,PartialEq)]
pub enum Frame {
    HandshakeSynFrame(HandshakeSynFrame),
    HandshakeSynAckFrame(HandshakeSynAckFrame),
    HandshakeAckFrame(HandshakeAckFrame),
    HandshakeErrorFrame(HandshakeErrorFrame),
    DisconnectFrame(DisconnectFrame),
    DisconnectAckFrame(DisconnectAckFrame),
    DataFrame(DataFrame),
    SyncFrame(SyncFrame),
    AckFrame(AckFrame),
}