use super::cedar_authorizer::CedarAuthorizer; use super::check_service::CheckService; use envoy_types::ext_authz::v3::pb::AuthorizationServer; use std::sync::Arc; pub struct Server { router: tonic::transport::server::Router, } impl Server { pub fn new() -> Result> { let (_health_reporter, health_service) = tonic_health::server::health_reporter(); let authorization_service = AuthorizationServer::new(CheckService::new(Arc::new(CedarAuthorizer::default()))); Ok(Self::new_with(|mut builder| { builder .add_service(authorization_service) .add_service(health_service) })) } pub fn new_with(f: F) -> Server where F: FnOnce(tonic::transport::Server) -> tonic::transport::server::Router, { let builder = tonic::transport::Server::builder() .trace_fn(|req| { tracing::info_span!( "request", method = %req.method(), path = %req.uri().path(), headers = ?req.headers(), ) }) .timeout(std::time::Duration::from_secs(30)); let router = f(builder); Server { router } } pub async fn serve(self, addr: std::net::SocketAddr) -> Result<(), tonic::transport::Error> { self.router.serve(addr).await } } impl Default for Server { fn default() -> Self { Self::new().unwrap() } }