| Crates.io | thorstreamer-grpc-client |
| lib.rs | thorstreamer-grpc-client |
| version | 0.1.3 |
| created_at | 2025-10-02 11:25:32.226715+00 |
| updated_at | 2025-12-12 22:37:17.417818+00 |
| description | Rust client for ThorStreamer gRPC streaming services |
| homepage | https://github.com/thorlabsDev/ThorStreamer/tree/master/sdks/rust |
| repository | https://github.com/thorlabsDev/ThorStreamer |
| max_upload_size | |
| id | 1864241 |
| size | 68,921 |
Official Rust client library for ThorStreamer gRPC services.
Add to your Cargo.toml:
[dependencies]
thorstreamer-grpc-client = "0.1.3"
tokio = { version = "1", features = ["full"] }
use thorstreamer_grpc_client::{ClientConfig, ThorClient, parse_message};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ClientConfig {
server_addr: "http://your-server-address:50051".to_string(),
token: "your-auth-token".to_string(),
..Default::default()
};
let mut client = ThorClient::new(config).await?;
// Subscribe to transactions
let mut stream = client.subscribe_to_transactions().await?;
while let Some(response) = stream.message().await? {
let msg = parse_message(&response.data)?;
use thorstreamer_grpc_client::proto::thor_streamer::types::message_wrapper::EventMessage;
if let Some(EventMessage::Transaction(tx)) = msg.event_message {
println!("Transaction: slot={}", tx.slot);
}
}
Ok(())
}
Using environment variables:
use std::env;
let config = ClientConfig {
server_addr: env::var("SERVER_ADDRESS")
.unwrap_or_else(|_| "http://your-server-address:50051".to_string()),
token: env::var("AUTH_TOKEN")
.expect("AUTH_TOKEN environment variable not set"),
..Default::default()
};
Or create a .env file:
SERVER_ADDRESS=http://your-server:50051
AUTH_TOKEN=your-auth-token
Then load it with the dotenv crate:
[dependencies]
dotenv = "0.15"
use dotenv::dotenv;
dotenv().ok();
let token = std::env::var("AUTH_TOKEN")?;
use thorstreamer_grpc_client::{ClientConfig, ThorClient};
use std::time::Duration;
let config = ClientConfig {
server_addr: "http://your-server-address:50051".to_string(),
token: "your-auth-token".to_string(),
timeout: Duration::from_secs(30),
};
let client = ThorClient::new(config).await?;
use thorstreamer_grpc_client::proto::thor_streamer::types::message_wrapper::EventMessage;
let mut stream = client.subscribe_to_transactions().await?;
while let Some(response) = stream.message().await? {
let msg = parse_message(&response.data)?;
if let Some(EventMessage::Transaction(tx)) = msg.event_message {
let sig_hex = tx.signature.iter()
.take(8)
.map(|b| format!("{:02x}", b))
.collect::<Vec<_>>()
.join("");
println!("Transaction: slot={}, signature={}", tx.slot, sig_hex);
}
}
let mut stream = client.subscribe_to_slot_status().await?;
while let Some(response) = stream.message().await? {
let msg = parse_message(&response.data)?;
if let Some(EventMessage::Slot(slot)) = msg.event_message {
println!("Slot: slot={}, status={}, height={}",
slot.slot, slot.status, slot.block_height);
}
}
Track account state changes with optional owner filtering:
let accounts = vec!["account1...".to_string(), "account2...".to_string()];
let owners = vec!["owner1...".to_string()];
let mut stream = client.subscribe_to_account_updates(accounts, owners).await?;
while let Some(response) = stream.message().await? {
let msg = parse_message(&response.data)?;
if let Some(EventMessage::AccountUpdate(update)) = msg.event_message {
let pubkey_hex = update.pubkey.iter()
.take(8)
.map(|b| format!("{:02x}", b))
.collect::<Vec<_>>()
.join("");
println!("Account: pubkey={}, lamports={}",
pubkey_hex, update.lamports);
}
}
use tonic::Status;
match stream.message().await {
Ok(Some(response)) => {
// Process message
}
Ok(None) => {
// Stream ended normally
println!("Stream closed");
}
Err(status) => {
// Handle gRPC error
eprintln!("Stream error: {:?}", status);
}
}
See the examples directory for complete working examples:
cargo run --example subscribe
# Clone repository
git clone https://github.com/thorlabsDev/ThorStreamer.git
cd ThorStreamer/sdks/rust
# Build the library
cargo build --release
# Run tests
cargo test
# Run example
cargo run --example subscribe
[package]
name = "thorstreamer-grpc-client"
version = "0.1.3"
edition = "2021"
[dependencies]
tonic = "0.12.3"
prost = "0.13.5"
tokio = { version = "1", features = ["full"] }
prost-types = "0.13.5"
[build-dependencies]
tonic-build = "0.12.3"
The SDK uses tonic-build to generate Rust code from protobuf definitions at compile time. Proto files are located in the proto/ directory:
events.proto - ThorStreamer message typespublisher.proto - EventPublisher service definitionsv0.1.3 - Updated README documentationv0.1.2 - Simplified proto schema, removed deprecated typesv0.1.1 - Fixed repository link in crate metadatav0.1.0 - Initial releaseContributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.