linera_rpc/grpc/
node_provider.rs

1// Copyright (c) Zefchain Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::str::FromStr as _;
5
6use linera_base::time::Duration;
7use linera_core::node::{NodeError, ValidatorNodeProvider};
8
9use super::GrpcClient;
10use crate::{
11    config::ValidatorPublicNetworkConfig,
12    grpc::{pool::GrpcConnectionPool, transport},
13    node_provider::NodeOptions,
14};
15
16#[derive(Clone)]
17pub struct GrpcNodeProvider {
18    pool: GrpcConnectionPool,
19    retry_delay: Duration,
20    max_retries: u32,
21}
22
23impl GrpcNodeProvider {
24    pub fn new(options: NodeOptions) -> Self {
25        let transport_options = transport::Options::from(&options);
26        let retry_delay = options.retry_delay;
27        let max_retries = options.max_retries;
28        let pool = GrpcConnectionPool::new(transport_options);
29        Self {
30            pool,
31            retry_delay,
32            max_retries,
33        }
34    }
35}
36
37impl ValidatorNodeProvider for GrpcNodeProvider {
38    type Node = GrpcClient;
39
40    fn make_node(&self, address: &str) -> Result<Self::Node, NodeError> {
41        let network = ValidatorPublicNetworkConfig::from_str(address).map_err(|_| {
42            NodeError::CannotResolveValidatorAddress {
43                address: address.to_string(),
44            }
45        })?;
46        let http_address = network.http_address();
47        let channel =
48            self.pool
49                .channel(http_address.clone())
50                .map_err(|error| NodeError::GrpcError {
51                    error: format!("error creating channel: {}", error),
52                })?;
53
54        Ok(GrpcClient::new(
55            http_address,
56            channel,
57            self.retry_delay,
58            self.max_retries,
59        ))
60    }
61}