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(authorizer: T) -> Result> { let authorization_service = AuthorizationServer::new(CheckService::new(Arc::new(authorizer))); Ok(Self::new_with(|mut builder| { builder.add_service(authorization_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!("rpc", method = %req.method(), path = %req.uri().path()), ) .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(CedarAuthorizer::default()).unwrap() } }