use crate::handler::BoxFuture;
use std::sync::Arc;
use tokio::io::{AsyncRead, AsyncWrite};
pub struct Upgraded {
pub reader: Box<dyn AsyncRead + Send + Unpin>,
pub writer: Box<dyn AsyncWrite + Send + Unpin>,
pub buffered: Vec<u8>,
}
pub trait Upgrade: Send + Sync + 'static {
fn run(&self, connection: Upgraded) -> BoxFuture<()>;
}
impl<F, Fut> Upgrade for F
where
F: Fn(Upgraded) -> Fut + Send + Sync + 'static,
Fut: Future<Output = ()> + Send + 'static,
{
fn run(&self, connection: Upgraded) -> BoxFuture<()> {
Box::pin(self(connection))
}
}
pub type Upgrader = Arc<dyn Upgrade>;