pub mod base;
pub mod data;
pub mod extension;
pub mod handshake;
pub mod connection;
use bytes::{BufMut, BytesMut};
use futures::io::{AsyncRead, AsyncReadExt};
use std::{io, mem::{self, MaybeUninit}, ptr};
pub use connection::{Mode, Receiver, Sender};
pub type BoxedError = Box<dyn std::error::Error + Send + Sync>;
#[derive(Debug, Clone)]
pub enum Parsing<T, N = ()> {
Done {
value: T,
offset: usize
},
NeedMore(N)
}
#[derive(Debug)]
pub enum Storage<'a> {
Shared(&'a [u8]),
Unique(&'a mut [u8]),
Owned(BytesMut)
}
impl AsRef<[u8]> for Storage<'_> {
fn as_ref(&self) -> &[u8] {
match self {
Storage::Shared(d) => d,
Storage::Unique(d) => d,
Storage::Owned(b) => b.as_ref()
}
}
}
#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
const fn as_u64(a: usize) -> u64 {
a as u64
}
#[derive(Debug)]
pub(crate) struct Buffer(BytesMut);
impl Buffer {
pub(crate) fn new() -> Self {
Buffer(BytesMut::new())
}
pub(crate) fn from(b: BytesMut) -> Self {
let mut this = Buffer(b);
this.init_bytes_mut();
this
}
pub(crate) fn len(&self) -> usize {
self.0.len()
}
pub(crate) fn remaining_mut(&self) -> usize {
self.0.capacity() - self.0.len()
}
pub(crate) fn clear(&mut self) {
self.0.clear()
}
pub(crate) fn split_to(&mut self, n: usize) -> Self {
Buffer(self.0.split_to(n))
}
pub(crate) fn take(&mut self) -> Self {
self.split_to(self.0.len())
}
#[cfg(feature = "deflate")]
pub(crate) fn truncate(&mut self, len: usize) {
self.0.truncate(len)
}
pub(crate) fn into_bytes(self) -> BytesMut {
self.0
}
pub(crate) fn extend_from_slice(&mut self, slice: &[u8]) {
self.0.extend_from_slice(slice)
}
pub(crate) fn reserve(&mut self, additional: usize) {
let old = self.0.capacity();
self.0.reserve(additional);
let new = self.0.capacity();
if new > old {
self.init_bytes_mut()
}
}
pub(crate) fn bytes_mut(&mut self) -> &mut [u8] {
let b = self.0.bytes_mut();
unsafe {
mem::transmute::<&mut [MaybeUninit<u8>], &mut [u8]>(b)
}
}
pub(crate) fn advance_mut(&mut self, n: usize) {
assert!(n <= self.remaining_mut(), "{} > {}", n, self.remaining_mut());
unsafe {
self.0.advance_mut(n)
}
}
fn init_bytes_mut(&mut self) {
let b = self.0.bytes_mut();
unsafe {
ptr::write_bytes(b.as_mut_ptr(), 0, b.len())
}
}
pub(crate) async fn read_from<R>(&mut self, reader: &mut R) -> io::Result<()>
where
R: AsyncRead + Unpin
{
let b = self.bytes_mut();
debug_assert!(!b.is_empty());
let n = reader.read(b).await?;
if n == 0 {
return Err(std::io::ErrorKind::UnexpectedEof.into())
}
self.advance_mut(n);
log::trace!("read {} bytes", n);
Ok(())
}
}
impl AsRef<[u8]> for Buffer {
fn as_ref(&self) -> &[u8] {
self.0.as_ref()
}
}
impl AsMut<[u8]> for Buffer {
fn as_mut(&mut self) -> &mut [u8] {
self.0.as_mut()
}
}
pub(crate) fn take(bytes: &mut BytesMut) -> BytesMut {
bytes.split_to(bytes.len())
}