From dbff6fa4e5684d8636fd46ecadfe5874a253bd49 Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Sun, 10 Aug 2025 13:45:11 +0200 Subject: feat(pseudonyms): serve api --- crates/pseudonyms/src/server.rs | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 crates/pseudonyms/src/server.rs (limited to 'crates/pseudonyms/src/server.rs') diff --git a/crates/pseudonyms/src/server.rs b/crates/pseudonyms/src/server.rs new file mode 100644 index 0000000..88c46b4 --- /dev/null +++ b/crates/pseudonyms/src/server.rs @@ -0,0 +1,65 @@ +mod interceptor; +use interceptor::MyInterceptor; +use tokio::signal; +use warden_core::pseudonyms::transaction_relationship::mutate_pseudonym_server::MutatePseudonymServer; + +use tonic::transport::{Server, server::TcpIncoming}; +use tracing::info; + +use crate::state::AppHandle; + +pub async fn serve(state: AppHandle, tx: tokio::sync::oneshot::Sender) -> anyhow::Result<()> { + let listener = tokio::net::TcpListener::bind(state.addr).await?; + + let socket_addr = listener + .local_addr() + .expect("should get socket_addr from listener"); + + tx.send(socket_addr.port()) + .expect("port channel to be open"); + + info!(addr = ?socket_addr, "starting server"); + + Server::builder() + .trace_fn(|_| tracing::info_span!(env!("CARGO_PKG_NAME"))) + // .add_service(QueryUsersServer::new(state.clone())) + .add_service(MutatePseudonymServer::with_interceptor( + state.clone(), + MyInterceptor, + )) + .serve_with_incoming_shutdown(TcpIncoming::from(listener), shutdown_signal(state)) + .await?; + + Ok(()) +} +async fn shutdown_signal(state: AppHandle) { + let ctrl_c = async { + signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => { + if let Some(ref provider) = state.tracer_provider { + let _ = provider.shutdown(); + } + }, + _ = terminate => { + if let Some(ref provider) = state.tracer_provider { + let _ = provider.shutdown(); + } + }, + } +} -- cgit v1.2.3