1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use super::super::{
    concurrency_limits, keepalive_durations, service::NodeService, Channels, GlobalStateR,
    ListenError,
};
use crate::settings::start::network::Listen;
use chain_network::grpc::{self, watch::server::Server as WatchServer};
use tonic::transport::Server;
use tracing::{span, Level};
use tracing_futures::Instrument;

pub async fn run_listen_socket(
    listen: &Listen,
    state: GlobalStateR,
    channels: Channels,
    watch_service: WatchServer<crate::watch_client::WatchClient>,
) -> Result<(), ListenError> {
    let sockaddr = listen.address();
    let span = span!(parent: &state.span, Level::TRACE, "listen_socket", local_addr = %sockaddr.to_string());
    async {
        tracing::info!("listening and accepting gRPC connections");
        let service = grpc::server::Builder::new().build(NodeService::new(channels, state));

        Server::builder()
            .concurrency_limit_per_connection(concurrency_limits::SERVER_REQUESTS)
            .tcp_keepalive(Some(keepalive_durations::TCP))
            .add_service(service)
            .add_service(watch_service)
            .serve(sockaddr)
            .await
            .map_err(|cause| ListenError { cause, sockaddr })
    }
    .instrument(span)
    .await
}