use std::sync::Arc;
use tracing::{error, info};
use self::grpc::{GrpcServer, GrpcServerConfig};
use crate::Result;
use crate::database::{Database, DatabaseConfig, DatabaseMaintenance};
use crate::metrics::Metrics;
pub mod grpc;
pub struct Node {
grpc: GrpcServer,
maintenance: DatabaseMaintenance,
_metrics: Metrics,
_database: Arc<Database>,
}
#[derive(Debug, Default, Clone)]
pub struct NodeConfig {
pub grpc: GrpcServerConfig,
pub database: DatabaseConfig,
}
impl Node {
pub async fn init(config: NodeConfig) -> Result<Self> {
let metrics = Metrics::default();
let database =
Arc::new(Database::connect(config.database.clone(), metrics.db.clone()).await?);
let grpc = GrpcServer::new(database.clone(), config.grpc, metrics.grpc.clone());
let maintenance =
DatabaseMaintenance::new(database.clone(), config.database, metrics.db.clone());
Ok(Self {
grpc,
maintenance,
_metrics: metrics,
_database: database,
})
}
pub async fn entrypoint(self) {
info!("Starting Miden Transport Node");
tokio::spawn(self.maintenance.entrypoint());
if let Err(e) = self.grpc.serve().await {
error!("Server error: {e}");
}
}
}