linera_rpc/grpc/
node_provider.rs1use 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}