Skip to main content

miden_note_transport_node/node/
mod.rs

1use std::sync::Arc;
2
3use tracing::{error, info};
4
5use self::grpc::{GrpcServer, GrpcServerConfig};
6use crate::Result;
7use crate::database::{Database, DatabaseConfig, DatabaseMaintenance};
8use crate::metrics::Metrics;
9
10/// gRPC server
11pub mod grpc;
12
13/// Miden Note Transport Node
14pub struct Node {
15    /// Serve client requests
16    grpc: GrpcServer,
17    /// Database maintenance
18    maintenance: DatabaseMaintenance,
19    /// Metrics
20    _metrics: Metrics,
21
22    // To be used in other services, .e.g. P2P
23    _database: Arc<Database>,
24}
25
26/// Node configuration
27#[derive(Debug, Default, Clone)]
28pub struct NodeConfig {
29    /// gRPC server configuration
30    pub grpc: GrpcServerConfig,
31    /// Database configuration
32    pub database: DatabaseConfig,
33}
34
35impl Node {
36    /// Node constructor
37    pub async fn init(config: NodeConfig) -> Result<Self> {
38        let metrics = Metrics::default();
39        let database =
40            Arc::new(Database::connect(config.database.clone(), metrics.db.clone()).await?);
41
42        let grpc = GrpcServer::new(database.clone(), config.grpc, metrics.grpc.clone());
43        let maintenance =
44            DatabaseMaintenance::new(database.clone(), config.database, metrics.db.clone());
45
46        Ok(Self {
47            grpc,
48            maintenance,
49            _metrics: metrics,
50            _database: database,
51        })
52    }
53
54    /// Node running-task
55    pub async fn entrypoint(self) {
56        info!("Starting Miden Transport Node");
57        tokio::spawn(self.maintenance.entrypoint());
58
59        if let Err(e) = self.grpc.serve().await {
60            error!("Server error: {e}");
61        }
62    }
63}