diff --git a/bee-api/bee-rest-api/src/endpoints/mod.rs b/bee-api/bee-rest-api/src/endpoints/mod.rs index 963c79cf46..2abe4c795c 100644 --- a/bee-api/bee-rest-api/src/endpoints/mod.rs +++ b/bee-api/bee-rest-api/src/endpoints/mod.rs @@ -39,7 +39,7 @@ pub(crate) type Bech32Hrp = String; pub(crate) const CONFIRMED_THRESHOLD: u32 = 5; -pub async fn init( +pub async fn init_full_node( rest_api_config: RestApiConfig, protocol_config: ProtocolConfig, network_id: NetworkId, @@ -49,12 +49,13 @@ pub async fn init( where N::Backend: StorageBackend, { - node_builder.with_worker_cfg::((rest_api_config, protocol_config, network_id, bech32_hrp)) + node_builder.with_worker_cfg::((rest_api_config, protocol_config, network_id, bech32_hrp)) } -pub struct ApiWorker; +pub struct ApiWorkerFullNode; + #[async_trait] -impl Worker for ApiWorker +impl Worker for ApiWorkerFullNode where N::Backend: StorageBackend, { @@ -151,3 +152,39 @@ async fn handle_rejection(err: Rejection) -> Result { http_code, )) } + +pub async fn init_entry_node(rest_api_config: RestApiConfig, node_builder: N::Builder) -> N::Builder +where + N::Backend: StorageBackend, +{ + node_builder.with_worker_cfg::(rest_api_config) +} + +pub struct ApiWorkerEntryNode; + +#[async_trait] +impl Worker for ApiWorkerEntryNode +where + N::Backend: StorageBackend, +{ + type Config = RestApiConfig; + type Error = WorkerError; + + async fn start(node: &mut N, config: Self::Config) -> Result { + node.spawn::(|shutdown| async move { + info!("Running."); + + let health = warp::path("health").map(|| StatusCode::OK).recover(handle_rejection); + + let (_, server) = warp::serve(health).bind_with_graceful_shutdown(config.bind_socket_addr(), async { + shutdown.await.ok(); + }); + + server.await; + + info!("Stopped."); + }); + + Ok(Self) + } +} diff --git a/bee-node/src/entrynode/builder.rs b/bee-node/src/entrynode/builder.rs index bf0d0074ff..51d1156929 100644 --- a/bee-node/src/entrynode/builder.rs +++ b/bee-node/src/entrynode/builder.rs @@ -138,6 +138,9 @@ impl NodeBuilder for EntryNodeBuilder { // Initialize autopeering (if enabled). let (autopeering_rx, builder) = initialize_autopeering(builder).await?; + // Initialize the API. + let builder = initialize_api(builder).await; + // Start the version checker. let builder = builder.with_worker::(); @@ -262,6 +265,19 @@ fn create_local_autopeering_entity(keypair: Keypair, config: &EntryNodeConfig) - local } +/// Initializes the API. +async fn initialize_api(builder: EntryNodeBuilder) -> EntryNodeBuilder { + log::info!("Initializing REST API..."); + + let config = builder.config(); + + let rest_api_cfg = config.rest_api_config.clone(); + + let builder = bee_rest_api::endpoints::init_entry_node::(rest_api_cfg, builder).await; + + builder +} + #[derive(Clone)] struct EntryNodeNeighborValidator {} diff --git a/bee-node/src/entrynode/config.rs b/bee-node/src/entrynode/config.rs index 385bb398fc..fe48388295 100644 --- a/bee-node/src/entrynode/config.rs +++ b/bee-node/src/entrynode/config.rs @@ -8,6 +8,7 @@ use crate::{ }; use bee_autopeering::AutopeeringConfig; +use bee_rest_api::endpoints::config::RestApiConfig; use fern_logger::LoggerConfig; @@ -22,6 +23,8 @@ pub struct EntryNodeConfig { pub logger_config: LoggerConfig, /// Autopeering. pub autopeering_config: AutopeeringConfig, + /// REST API. + pub rest_api_config: RestApiConfig, } impl EntryNodeConfig { @@ -44,6 +47,7 @@ impl EntryNodeConfig { network_spec: node_cfg.network_spec, logger_config: node_cfg.logger_config, autopeering_config: node_cfg.autopeering_config, + rest_api_config: node_cfg.rest_api_config, } } } diff --git a/bee-node/src/fullnode/builder.rs b/bee-node/src/fullnode/builder.rs index 0684e6f3ab..1773c44665 100644 --- a/bee-node/src/fullnode/builder.rs +++ b/bee-node/src/fullnode/builder.rs @@ -396,7 +396,8 @@ async fn initialize_api(builder: FullNodeBuilder) -> F let protocol_cfg = config.protocol_config.clone(); let builder = - bee_rest_api::endpoints::init::>(rest_api_cfg, protocol_cfg, network_id, hrp, builder).await; + bee_rest_api::endpoints::init_full_node::>(rest_api_cfg, protocol_cfg, network_id, hrp, builder) + .await; builder }