use tokio::net::{tcp::OwnedReadHalf, tcp::OwnedWriteHalf};
pub use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
main as async_main,
net::TcpStream,
task::spawn as async_spawn_local,
task::yield_now as async_yield_now,
test as async_test,
time::{sleep as async_sleep, timeout as async_timeout},
};
#[cfg(feature = "profiling")]
pub fn async_spawn<T>(future: T) -> tokio::task::JoinHandle<T::Output>
where
T: futures::Future + Send + 'static,
T::Output: Send + 'static,
{
let async_span = tracing::error_span!("Task Root", tsk_id = tracing::field::Empty);
let join_handle = tokio::task::spawn(tracing::Instrument::instrument(
async { future.await },
async_span.clone(),
));
async_span.record("tsk_id", tracing::field::display(join_handle.id()));
join_handle
}
#[cfg(not(feature = "profiling"))]
pub use tokio::spawn as async_spawn;
pub fn async_block_on_with_runtime<F, T>(future: F) -> T
where
F: std::future::Future<Output = T>,
{
tokio::runtime::Runtime::new().unwrap().block_on(future)
}
pub mod stream {
pub mod to {
pub use tokio_stream::Timeout;
}
}
pub mod future {
pub mod to {
pub use tokio::time::error::Elapsed as TimeoutError;
pub use tokio::time::Timeout;
pub type Result<T> = std::result::Result<T, tokio::time::error::Elapsed>;
}
}
use tokio::runtime::Handle;
pub fn async_block_on<F, T>(future: F) -> T
where
F: std::future::Future<Output = T>,
{
tokio::task::block_in_place(move || Handle::current().block_on(future))
}
#[must_use]
pub fn split_stream(stream: TcpStream) -> (OwnedReadHalf, OwnedWriteHalf) {
stream.into_split()
}