| Crates.io | runbeam-sdk |
| lib.rs | runbeam-sdk |
| version | 0.11.0 |
| created_at | 2025-10-26 12:35:19.352096+00 |
| updated_at | 2026-01-08 00:55:22.793343+00 |
| description | Rust SDK for integrating with the Runbeam Cloud API, providing JWT validation, API client, and generic secure token storage |
| homepage | https://runbeam.io |
| repository | https://github.com/aurabx/runbeam-sdk-rs |
| max_upload_size | |
| id | 1901356 |
| size | 525,065 |
A Rust library for integrating with the Runbeam Cloud API.
Add to your Cargo.toml:
[dependencies]
runbeam-sdk = "0.10.0"
use runbeam_sdk::{
RunbeamClient,
validate_jwt_token,
save_token,
load_token,
MachineToken,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Validate user JWT token
let user_token = "eyJhbGci...";
let claims = validate_jwt_token(user_token, 24).await?;
// Create API client
let client = RunbeamClient::new(claims.api_base_url());
// Authorize gateway and get machine token
let response = client.authorize_gateway(
user_token,
"gateway-123",
None,
None
).await?;
// Save machine token securely (automatic storage selection)
let instance_id = "my-gateway"; // Unique identifier for this instance
let machine_token = MachineToken::new(
response.machine_token,
response.expires_at,
response.gateway.id,
response.gateway.code,
response.abilities,
);
save_token(instance_id, &machine_token).await?;
// Load token later
if let Some(token) = load_token(instance_id).await? {
if token.is_valid() {
println!("Token valid until: {}", token.expires_at);
}
}
Ok(())
}
use runbeam_sdk::{
RunbeamClient,
save_token,
load_token,
MachineToken,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create API client with base URL
let client = RunbeamClient::new("https://api.runbeam.io");
// Authorize gateway with Sanctum token (no validation needed)
// Sanctum tokens have the format: {id}|{plaintext_token}
let sanctum_token = "1|abc123def456...";
let response = client.authorize_gateway(
sanctum_token,
"gateway-123",
None,
None
).await?;
// Save machine token securely (automatic storage selection)
let instance_id = "my-gateway"; // Unique identifier for this instance
let machine_token = MachineToken::new(
response.machine_token,
response.expires_at,
response.gateway.id,
response.gateway.code,
response.abilities,
);
save_token(instance_id, &machine_token).await?;
Ok(())
}
The SDK supports two authentication methods:
JWT tokens are validated locally using RS256 signature verification with JWKS endpoint discovery.
Use JWT tokens when:
Authorization Flow:
Sanctum tokens (format: {id}|{token}) are passed directly to the server for validation.
Use Sanctum tokens when:
Authorization Flow:
Note: All API methods accept both JWT and Sanctum tokens interchangeably.
The SDK automatically manages secure token storage with no configuration required.
When you call save_token(), load_token(), or clear_token(), the SDK automatically:
Each instance gets its own isolated storage using an instance_id:
use runbeam_sdk::{save_token, load_token, clear_token, MachineToken};
// Each instance_id gets separate storage at ~/.runbeam/<instance_id>/
let instance_id = "harmony-production";
// Save token
save_token(instance_id, &token).await?;
// Load token
if let Some(token) = load_token(instance_id).await? {
println!("Loaded token for gateway: {}", token.gateway_code);
}
// Clear token
clear_token(instance_id).await?;
When using encrypted filesystem storage (fallback), keys are sourced from:
RUNBEAM_ENCRYPTION_KEY environment variable (production/containers)
export RUNBEAM_ENCRYPTION_KEY=$(age-keygen | base64 -w 0)
Auto-generated key at ~/.runbeam/<instance_id>/encryption.key (development)
✅ Tokens are NEVER stored unencrypted on disk ✅ Automatic keyring use when available ✅ age X25519 encryption for filesystem storage ✅ Instance isolation - multiple instances can coexist ✅ Thread-safe for concurrent access
cargo build
cargo build --release
cargo test # Run all tests
cargo test --lib # Run only library tests
cargo clippy
cargo clippy -- -D warnings
cargo doc --open
All API methods accept JWT tokens, Sanctum tokens, or machine tokens for authentication.
use runbeam_sdk::RunbeamClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = RunbeamClient::new("https://runbeam.example.com");
// Works with JWT tokens, Sanctum tokens, or machine tokens
let token = "your_token_here";
// List all gateways
let gateways = client.list_gateways(token).await?;
for gateway in gateways.data {
println!("Gateway: {} ({})", gateway.name, gateway.code);
}
// Get specific gateway
let gateway = client.get_gateway(token, "gateway-123").await?;
println!("Gateway enabled: {}", gateway.data.enabled);
Ok(())
}
use runbeam_sdk::RunbeamClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = RunbeamClient::new("https://runbeam.example.com");
let token = "your_token_here";
// List all services
let services = client.list_services(token).await?;
for service in services.data {
println!("Service: {} on gateway {}", service.name, service.gateway_id);
}
// Get specific service
let service = client.get_service(token, "service-456").await?;
println!("Service type: {}", service.data.service_type);
Ok(())
}
use runbeam_sdk::RunbeamClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = RunbeamClient::new("https://runbeam.example.com");
let token = "your_token_here";
// Fetch all configuration resources
let endpoints = client.list_endpoints(token).await?;
let backends = client.list_backends(token).await?;
let pipelines = client.list_pipelines(token).await?;
// Use the data to configure harmony-proxy
println!("Endpoints: {}", endpoints.data.len());
println!("Backends: {}", backends.data.len());
println!("Pipelines: {}", pipelines.data.len());
Ok(())
}
runbeam_api/client.rs - HTTP client for Runbeam Cloud APIrunbeam_api/jwt.rs - JWT validation with JWKS cachingrunbeam_api/resources.rs - API resource types (Gateway, Service, etc.)runbeam_api/token_storage.rs - Token persistence operationsrunbeam_api/types.rs - Error types and API structuresstorage/mod.rs - Storage backend trait and implementationsPart of the Runbeam project.