use super::{RustlsConnection, establish, tls_error};
use crate::tls::TlsAcceptor;
use ::rustls::{ServerConfig, ServerConnection};
use base_scheduler::{
Cancellation, OperationResult, SocketClose, SocketStreamReading, SocketStreamWriting,
};
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct RustlsAcceptor {
config: Arc<ServerConfig>,
}
impl RustlsAcceptor {
pub fn new(config: Arc<ServerConfig>) -> Self {
Self { config }
}
}
impl<S> TlsAcceptor<S, S::Socket> for RustlsAcceptor
where
S: SocketStreamReading + SocketStreamWriting + SocketClose + ?Sized,
S::Socket: 'static,
{
type Connection = RustlsConnection<S::Socket>;
async fn accept(
&self,
scheduler: &S,
connection: S::Socket,
cancellation: &Cancellation,
) -> OperationResult<Self::Connection> {
let state = (|| {
cancellation.check()?;
Ok(ServerConnection::new(self.config.clone())
.map_err(tls_error)?
.into())
})();
establish(scheduler, connection, state, cancellation).await
}
}