mod multi_stream;
mod single_stream;
pub mod substream;
mod tests;
use super::yamux;
use alloc::{string::String, vec::Vec};
use core::time::Duration;
pub use multi_stream::{MultiStream, SubstreamFate};
pub use single_stream::{ConnectionPrototype, Error, SingleStream};
pub use substream::{
InboundError, InboundTy, NotificationsInClosedErr, NotificationsOutErr, RequestError,
RespondInRequestError,
};
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SubstreamId(SubstreamIdInner);
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
enum SubstreamIdInner {
SingleStream(yamux::SubstreamId),
MultiStream(u32),
}
impl SubstreamId {
pub const MIN: Self = Self(SubstreamIdInner::SingleStream(yamux::SubstreamId::MIN));
pub const MAX: Self = Self(SubstreamIdInner::MultiStream(u32::MAX));
}
#[must_use]
#[derive(Debug)]
pub enum Event<TSubUd> {
NewOutboundSubstreamsForbidden,
InboundError(InboundError),
InboundNegotiated {
id: SubstreamId,
protocol_name: String,
},
InboundNegotiatedCancel {
id: SubstreamId,
},
InboundAcceptedCancel {
id: SubstreamId,
user_data: TSubUd,
},
RequestIn {
id: SubstreamId,
request: Vec<u8>,
},
Response {
response: Result<Vec<u8>, RequestError>,
id: SubstreamId,
user_data: TSubUd,
},
NotificationsInOpen {
id: SubstreamId,
handshake: Vec<u8>,
},
NotificationsInOpenCancel {
id: SubstreamId,
},
NotificationIn {
id: SubstreamId,
notification: Vec<u8>,
},
NotificationsInClose {
id: SubstreamId,
outcome: Result<(), NotificationsInClosedErr>,
user_data: TSubUd,
},
NotificationsOutResult {
id: SubstreamId,
result: Result<Vec<u8>, (NotificationsOutErr, TSubUd)>,
},
NotificationsOutCloseDemanded {
id: SubstreamId,
},
NotificationsOutReset {
id: SubstreamId,
user_data: TSubUd,
},
PingOutSuccess {
ping_time: Duration,
},
PingOutFailed,
}
#[derive(Debug, Clone)]
pub struct Config<TNow> {
pub max_inbound_substreams: usize,
pub substreams_capacity: usize,
pub max_protocol_name_len: usize,
pub ping_protocol: String,
pub first_out_ping: TNow,
pub ping_interval: Duration,
pub ping_timeout: Duration,
pub randomness_seed: [u8; 32],
}