> ## 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.

# WebSocket İstemcisi

> Yeniden bağlanmada otomatik yeniden abonelik ile hesap değişiklikleri, günlükler, slotlar ve imzalar için gerçek zamanlı abonelikler.

## Kurulum

```bash theme={null}
cargo add orbitflare-sdk --features ws
```

## İstemciyi oluşturma

```rust theme={null}
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?;
```

Minimal:

```rust theme={null}
let client = WsClientBuilder::new()
    .url("ws://ny.rpc.orbitflare.com")
    .build()
    .await?;
```

`.build()` öğesinin eşzamanlı olduğuna dikkat edin — döndürmeden önce WebSocket bağlantısını kurar. Bağlantı başarısız olursa hatayı hemen alırsınız.

### Builder yöntemleri

**`.url(url)`** — Birincil WebSocket uç noktası. `ORBITFLARE_WS_URL` ortam değişkenine düşer.

```rust theme={null}
.url("ws://ny.rpc.orbitflare.com")
```

**`.urls(&[...])`** — Tek çağrıda birincil + yedekler.

```rust theme={null}
.urls(&["ws://ny.rpc.orbitflare.com", "ws://fra.rpc.orbitflare.com"])
```

**`.fallback_url(url)` / `.fallback_urls(&[...])`** — Yedek uç noktalar ekler. Yeniden bağlanırken SDK aralarında döner.

```rust theme={null}
.fallback_url("ws://fra.rpc.orbitflare.com")
```

**`.api_key(key)`** — Lisans anahtarı. `ORBITFLARE_LICENSE_KEY` ortam değişkenine düşer.

```rust theme={null}
.api_key("ORBIT-XXXXXX-NNNNNN-NNNNNN")
```

**`.retry(policy)`** — Yeniden bağlanma geri çekilmesi. Varsayılan: 100 ms başlangıç, 30 sn üst sınır, 2x çarpan, sonsuz deneme.

```rust theme={null}
.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’nın WebSocket `Ping` çerçevelerini gönderme sıklığı. Varsayılan: 10.

```rust theme={null}
.ping_interval_secs(15)
```

**`.max_missed_pongs(n)`** — Bağlantıyı sonlandırmadan önce yanıtsız ping sayısı. Varsayılan: 3.

```rust theme={null}
.max_missed_pongs(5)
```

## Kullanılabilir abonelikler

### `slot_subscribe()`

Bir slot işlendiğinde, onaylandığında veya finalize edildiğinde tetiklenir.

```rust theme={null}
let mut sub = client.slot_subscribe().await?;
```

Her olay `slot`, `parent` ve `root` alanlarına sahip bir JSON değeridir:

```json theme={null}
{"slot": 413014740, "parent": 413014739, "root": 413014708}
```

### `account_subscribe(address, commitment)`

Belirtilen hesabın verisi değiştiğinde tetiklenir.

```rust theme={null}
let mut sub = client.account_subscribe(
    "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "confirmed",
).await?;
```

Lamport, owner ve çalıştırılabilir bayrağı ile base64 kodlanmış hesap verisini döndürür.

### `logs_subscribe(mentions, commitment)`

Verilen adresleri anan işlemler için tetiklenir. Tüm işlemler için boş dilim geçin.

```rust theme={null}
let mut sub = client.logs_subscribe(
    &["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
    "confirmed",
).await?;
```

Tüm günlükler:

```rust theme={null}
let mut sub = client.logs_subscribe(&[], "confirmed").await?;
```

### `signature_subscribe(signature, commitment)`

Bir işlem verilen taahhüt düzeyine ulaştığında bir kez tetiklenir. Az önce gönderdiğiniz bir işlemi onaylamak için kullanışlıdır.

```rust theme={null}
let mut sub = client.signature_subscribe("5K8F2j...", "confirmed").await?;
```

## Olayları okuma

Tüm abonelikler bir `WsSubscription` döndürür. Sonraki olay için `.next()` çağırın:

```rust theme={null}
while let Some(event) = sub.next().await {
    println!("{event}");
}
```

`.next()` `Option<serde_json::Value>` döndürür. `None`, aboneliğin kapatıldığı anlamına gelir.

## Abonelikten çıkma

```rust theme={null}
sub.unsubscribe().await;
```

Sunucuya abonelikten çıkma iletisi gönderir. Bunu çağırmadan aboneliği düşürürseniz SDK yetimi tespit eder ve abonelikten çıkmayı otomatik gönderir.

## Birden çok abonelik

Tüm abonelikler tek WebSocket bağlantısında çalışır. SDK bildirimleri doğru aboneliğe dahili olarak yönlendirir.

```rust theme={null}
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?;
```

Mevcut abonelikler çalışırken istediğiniz zaman yeni abonelik ekleyebilirsiniz.

## Yeniden bağlanma

Bağlantı koparsa arka plan görevi üstel geri çekilme ile yeniden bağlanır ve her şeyi otomatik yeniden abone eder. `.next()` çağrılarınız çalışmaya devam eder — bağlantı geri gelince olaylar sürer.

## Tam örnek

Slot güncellemelerine ve USDC için hesap değişikliklerine abone olan, canlı bir akış yazan bir izleme betiği.

```rust theme={null}
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");
            }
        }
    }
}
```
