use super::{connections, RequestHandler, TcpListener};
use openssl::ssl::SslAcceptor;
use std::{future::Future, io, net::SocketAddr, sync::Arc};
pub struct Server {
pub(super) listener: TcpListener,
pub(super) handler: Arc<RequestHandler>,
pub(super) acceptor: Arc<SslAcceptor>,
}
impl Server {
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.listener.local_addr()
}
pub async fn run(self) {
#[cfg(feature = "tokio")]
let shutdown = async {
let _ = tokio::signal::ctrl_c().await;
};
#[cfg(feature = "async-std")]
let shutdown = std::future::pending();
self.run_until(shutdown).await;
}
pub async fn run_until(self, shutdown: impl Future<Output = ()>) {
info!("windmark is listening for connections");
connections::serve(self.listener, self.handler, self.acceptor, shutdown)
.await;
}
}