forked from Orchid/orchid
- interner impls logically separate from API in orchid-base (default host interner still in base for testing) - error reporting, logging, and a variety of other features passed down via context in extension, not yet in host to maintain library-ish profile, should consider options - no global spawn mechanic, the host has a spawn function but extensions only get a stash for enqueuing async work in sync callbacks which is then explicitly, manually, and with strict order popped and awaited - still deadlocks nondeterministically for some ungodly reason
24 lines
804 B
Rust
24 lines
804 B
Rust
use std::io;
|
|
use std::pin::Pin;
|
|
|
|
use futures::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
|
use orchid_api_traits::{Decode, Encode};
|
|
|
|
pub async fn send_msg(mut write: Pin<&mut impl AsyncWrite>, msg: &[u8]) -> io::Result<()> {
|
|
let mut len_buf = vec![];
|
|
let len_prefix = u32::try_from(msg.len()).expect("Message over 4GB not permitted on channel");
|
|
len_prefix.encode_vec(&mut len_buf);
|
|
write.write_all(&len_buf).await?;
|
|
write.write_all(msg).await?;
|
|
write.flush().await
|
|
}
|
|
|
|
pub async fn recv_msg(mut read: Pin<&mut impl AsyncRead>) -> io::Result<Vec<u8>> {
|
|
let mut len_buf = [0u8; (u32::BITS / 8) as usize];
|
|
read.read_exact(&mut len_buf).await?;
|
|
let len = u32::decode(Pin::new(&mut &len_buf[..])).await?;
|
|
let mut msg = vec![0u8; len as usize];
|
|
read.read_exact(&mut msg).await?;
|
|
Ok(msg)
|
|
}
|