1#![recursion_limit = "256"]
8#![deny(missing_docs)]
9#![allow(unknown_lints)]
11
12pub mod config;
14pub mod node_provider;
16
17pub mod client;
19
20mod cross_chain_message_queue;
21mod message;
22#[cfg(with_simple_network)]
24pub mod simple;
25
26pub mod grpc;
28
29#[cfg(feature = "opentelemetry")]
31pub mod propagation;
32
33pub use client::Client;
34pub use message::{RpcMessage, ShardInfo};
35pub use node_provider::{NodeOptions, NodeProvider, DEFAULT_MAX_BACKOFF};
36
37#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
39#[cfg_attr(with_testing, derive(Eq, PartialEq))]
40pub struct HandleLiteCertRequest<'a> {
41 pub certificate: linera_chain::types::LiteCertificate<'a>,
43 pub wait_for_outgoing_messages: bool,
45}
46
47#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
49#[cfg_attr(with_testing, derive(Eq, PartialEq))]
50pub struct HandleConfirmedCertificateRequest {
51 pub certificate: linera_chain::types::ConfirmedBlockCertificate,
53 pub wait_for_outgoing_messages: bool,
55}
56
57#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
59#[cfg_attr(with_testing, derive(Eq, PartialEq))]
60pub struct HandleValidatedCertificateRequest {
61 pub certificate: linera_chain::types::ValidatedBlockCertificate,
63}
64
65#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
67#[cfg_attr(with_testing, derive(Eq, PartialEq))]
68pub struct HandleTimeoutCertificateRequest {
69 pub certificate: linera_chain::types::TimeoutCertificate,
71}
72
73pub const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("file_descriptor_set");
75
76#[cfg(not(target_arch = "wasm32"))]
78pub const CERT_PEM: &str = include_str!(concat!(env!("OUT_DIR"), "/self_signed_cert.pem"));
79#[cfg(not(target_arch = "wasm32"))]
81pub const KEY_PEM: &str = include_str!(concat!(env!("OUT_DIR"), "/private_key.pem"));
82
83pub(crate) fn jittered_backoff_delay(
91 base_delay: std::time::Duration,
92 attempt: u32,
93 max_backoff: std::time::Duration,
94) -> std::time::Duration {
95 use rand::Rng as _;
96 let exponential_delay =
97 base_delay.saturating_mul(1u32.checked_shl(attempt).unwrap_or(u32::MAX));
98 #[expect(
99 clippy::cast_possible_truncation,
100 reason = "delay is capped by max_backoff, which fits in u64 milliseconds"
101 )]
102 let capped_delay_ms = exponential_delay.min(max_backoff).as_millis() as u64;
103 let min_delay_ms = capped_delay_ms * 4 / 5; let max_delay_ms = capped_delay_ms * 6 / 5; std::time::Duration::from_millis(rand::thread_rng().gen_range(min_delay_ms..=max_delay_ms))
106}