Documentation Index
Fetch the complete documentation index at: https://docs.orbitflare.com/llms.txt
Use this file to discover all available pages before exploring further.
Установка
cargo add orbitflare-sdk --features ws
Сборка клиента
use orbitflare_sdk::{WsClientBuilder, RetryPolicy, Result};
use std::time::Duration;
let client = WsClientBuilder::new()
.url("ws://ny.rpc.orbitflare.com")
.fallback_url("ws://fra.rpc.orbitflare.com")
.api_key("ORBIT-XXXXXX-NNNNNN-NNNNNN")
.retry(RetryPolicy {
initial_delay: Duration::from_millis(100),
max_delay: Duration::from_secs(30),
multiplier: 2.0,
max_attempts: 0,
})
.ping_interval_secs(10)
.max_missed_pongs(3)
.build()
.await?;
Минимально:
let client = WsClientBuilder::new()
.url("ws://ny.rpc.orbitflare.com")
.build()
.await?;
Обратите внимание: .build() асинхронный — перед возвратом устанавливается WebSocket-соединение. При ошибке подключения вы получите ошибку сразу.
Методы билдера
.url(url) — основной WebSocket-эндпоинт. Резерв: переменная ORBITFLARE_WS_URL.
.url("ws://ny.rpc.orbitflare.com")
.urls(&[...]) — основной и резервные за один вызов.
.urls(&["ws://ny.rpc.orbitflare.com", "ws://fra.rpc.orbitflare.com"])
.fallback_url(url) / .fallback_urls(&[...]) — добавить резерв для failover. При переподключении SDK перебирает их по очереди.
.fallback_url("ws://fra.rpc.orbitflare.com")
.api_key(key) — лицензионный ключ. Резерв: ORBITFLARE_LICENSE_KEY.
.api_key("ORBIT-XXXXXX-NNNNNN-NNNNNN")
.retry(policy) — backoff при переподключении. По умолчанию: 100 мс начальная, 30 с максимум, 2×, бесконечные попытки.
.retry(RetryPolicy {
initial_delay: Duration::from_millis(200),
max_delay: Duration::from_secs(15),
multiplier: 2.0,
max_attempts: 0,
})
.ping_interval_secs(n) — как часто SDK отправляет фреймы WebSocket Ping. По умолчанию: 10.
.max_missed_pongs(n) — сколько ping без ответа перед обрывом соединения. По умолчанию: 3.
Доступные подписки
slot_subscribe()
Срабатывает при обработке, подтверждении или финализации слота.
let mut sub = client.slot_subscribe().await?;
Каждое событие — JSON с полями slot, parent и root:
{"slot": 413014740, "parent": 413014739, "root": 413014708}
account_subscribe(address, commitment)
Срабатывает при изменении данных указанного аккаунта.
let mut sub = client.account_subscribe(
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"confirmed",
).await?;
Возвращает данные аккаунта в base64 вместе с lamports, владельцем и флагом executable.
logs_subscribe(mentions, commitment)
Для транзакций, в которых фигурируют указанные адреса. Пустой срез — все транзакции.
let mut sub = client.logs_subscribe(
&["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
"confirmed",
).await?;
Все логи:
let mut sub = client.logs_subscribe(&[], "confirmed").await?;
signature_subscribe(signature, commitment)
Срабатывает один раз, когда транзакция достигает заданного уровня commitment. Удобно для подтверждения только что отправленной транзакции.
let mut sub = client.signature_subscribe("5K8F2j...", "confirmed").await?;
Чтение событий
Все подписки возвращают WsSubscription. Вызовите .next() для следующего события:
while let Some(event) = sub.next().await {
println!("{event}");
}
.next() возвращает Option<serde_json::Value>. None — подписка закрыта.
Отписка
Отправляет на сервер сообщение об отписке. Если дропнуть подписку без вызова, SDK обнаружит «сироту» и сам отправит отписку.
Несколько подписк
Все подписки идут по одному WebSocket. SDK маршрутизирует уведомления на нужную подписку внутри себя.
let mut slots = client.slot_subscribe().await?;
let mut usdc = client.account_subscribe("EPjFWdd5...", "confirmed").await?;
let mut logs = client.logs_subscribe(&["6EF8r..."], "confirmed").await?;
Новые подписки можно добавлять в любой момент, пока работают существующие.
Переподключение
Если соединение обрывается, фоновая задача переподключается с экспоненциальным backoff и автоматически заново подписывается. Ваши вызовы .next() продолжают работать — события возобновятся после восстановления связи.
Полный пример
Скрипт мониторинга: подписка на слоты и изменения аккаунта USDC, вывод ленты в реальном времени.
use orbitflare_sdk::{WsClientBuilder, Result};
#[tokio::main]
async fn main() -> Result<()> {
let client = WsClientBuilder::new()
.url("ws://ny.rpc.orbitflare.com")
.build()
.await?;
let mut slots = client.slot_subscribe().await?;
let mut usdc = client.account_subscribe(
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"confirmed",
).await?;
println!("watching slots and USDC mint account...");
loop {
tokio::select! {
Some(slot) = slots.next() => {
let s = slot["slot"].as_u64().unwrap_or(0);
let parent = slot["parent"].as_u64().unwrap_or(0);
println!("slot {s} (parent {parent})");
}
Some(acct) = usdc.next() => {
let lamports = acct["lamports"].as_u64().unwrap_or(0);
let data_len = acct["data"][0]
.as_str()
.map(|s| s.len())
.unwrap_or(0);
println!("USDC mint updated: {lamports} lamports, {data_len} bytes");
}
}
}
}