sol_parser_sdk/grpc/
geyser_connect.rs1use std::time::Duration;
4
5use yellowstone_grpc_client::{ClientTlsConfig, GeyserGrpcClient, Interceptor};
6
7#[derive(Debug, Clone)]
9pub struct GeyserConnectConfig {
10 pub connect_timeout: Duration,
11 pub max_decoding_message_size: usize,
12 pub x_token: Option<String>,
13}
14
15impl Default for GeyserConnectConfig {
16 fn default() -> Self {
17 Self {
18 connect_timeout: Duration::from_secs(8),
19 max_decoding_message_size: 1024 * 1024 * 1024,
20 x_token: None,
21 }
22 }
23}
24
25pub async fn connect_yellowstone_geyser(
27 endpoint: &str,
28 config: GeyserConnectConfig,
29) -> Result<GeyserGrpcClient<impl Interceptor>, String> {
30 let _ = rustls::crypto::ring::default_provider().install_default();
31
32 let mut builder = GeyserGrpcClient::build_from_shared(endpoint.to_string())
33 .map_err(|e| e.to_string())?
34 .connect_timeout(config.connect_timeout)
35 .max_decoding_message_size(config.max_decoding_message_size);
36
37 if let Some(ref t) = config.x_token {
38 builder = builder.x_token(Some(t.as_str())).map_err(|e| e.to_string())?;
39 }
40
41 if endpoint.starts_with("https://") {
42 builder = builder
43 .tls_config(ClientTlsConfig::new().with_native_roots())
44 .map_err(|e| e.to_string())?;
45 }
46
47 builder.connect().await.map_err(|e| e.to_string())
48}