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

> Hesap değişiklikleri, günlükler, slotlar ve imzalar için otomatik yeniden bağlanmalı gerçek zamanlı abonelikler.

## Kurulum

```bash theme={null}
go get github.com/orbitflare/orbitflare-sdk-go
```

```go theme={null}
import "github.com/orbitflare/orbitflare-sdk-go/ws"
```

## İstemciyi oluşturma

```go theme={null}
import (
    "time"

    "github.com/orbitflare/orbitflare-sdk-go/orbitflare"
    "github.com/orbitflare/orbitflare-sdk-go/ws"
)

client, err := ws.NewBuilder().
    URL("ws://ny.rpc.orbitflare.com").
    FallbackURL("ws://fra.rpc.orbitflare.com").
    APIKey("ORBIT-XXXXXX-NNNNNN-NNNNNN").
    Retry(orbitflare.RetryPolicy{
        InitialDelay: 100 * time.Millisecond,
        MaxDelay:     30 * time.Second,
        Multiplier:   2.0,
        MaxAttempts:  0,
    }).
    PingInterval(10 * time.Second).
    MaxMissedPongs(3).
    Build(ctx)
```

Minimal:

```go theme={null}
client, err := ws.NewBuilder().
    URL("ws://ny.rpc.orbitflare.com").
    Build(ctx)
```

`.Build(ctx)`'in, dönmeden önce WebSocket bağlantısını kurduğunu unutmayın - geçirilen context, ilk bağlantıyı yönetir. Bağlantı başarısız olursa hatayı hemen alırsınız. İstemci daha sonra `Close()`'a kadar çalışır.

### Builder yöntemleri

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

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

**`.URLs(urls...)`** - Tek çağrıda birincil + yedekler.

```go theme={null}
.URLs("ws://ny.rpc.orbitflare.com", "ws://fra.rpc.orbitflare.com")
```

**`.FallbackURL(url)` / `.FallbackURLs(urls...)`** - Yedek uç noktalar ekler. Yeniden bağlanırken SDK aralarında döner.

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

**`.APIKey(key)`** - Lisans anahtarı. `ORBITFLARE_LICENSE_KEY` ortam değişkenine düşer. Bağlantı anında URL'ye eklenir, loglara veya hatalara asla yazdırılmaz.

```go theme={null}
.APIKey("ORBIT-XXXXXX-NNNNNN-NNNNNN")
```

**`.Retry(policy)`** - Yeniden bağlanma backoff'u. Varsayılan: 100 ms başlangıç, 30 s maksimum, 2x çarpan, sonsuz deneme.

```go theme={null}
.Retry(orbitflare.RetryPolicy{
    InitialDelay: 200 * time.Millisecond,
    MaxDelay:     15 * time.Second,
    Multiplier:   2.0,
    MaxAttempts:  0,
})
```

**`.PingInterval(duration)`** - SDK'nın WebSocket `Ping` çerçevelerini ne sıklıkta gönderdiği. Varsayılan 10 s.

```go theme={null}
.PingInterval(15 * time.Second)
```

**`.MaxMissedPongs(n)`** - Bağlantı kapatılmadan önce yanıtsız kalabilecek ping sayısı. Varsayılan 3.

```go theme={null}
.MaxMissedPongs(5)
```

**`.Logger(logger)`** - Bağlantı yaşam döngüsü olayları için bir `*slog.Logger`. Ayarlanmazsa `ORBITFLARE_LOG` ile denetlenir.

## Kullanılabilir abonelikler

### `SlotSubscribe(ctx)`

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

```go theme={null}
sub, err := client.SlotSubscribe(ctx)
```

Her olay; `slot`, `parent` ve `root` alanları olan bir JSON'dur:

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

### `AccountSubscribe(ctx, address, commitment)`

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

```go theme={null}
sub, err := client.AccountSubscribe(ctx, "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "confirmed")
```

lamports, owner ve executable bayrağı ile base64 kodlu hesap verisi döndürür.

### `LogsSubscribe(ctx, mentions, commitment)`

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

```go theme={null}
sub, err := client.LogsSubscribe(ctx, []string{"6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"}, "confirmed")
```

Tüm günlükler:

```go theme={null}
sub, err := client.LogsSubscribe(ctx, nil, "confirmed")
```

### `SignatureSubscribe(ctx, signature, commitment)`

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

```go theme={null}
sub, err := client.SignatureSubscribe(ctx, "5K8F2j...", "confirmed")
```

## Olayları okuma

Tüm abonelikler bir `*ws.Subscription` döndürür. Sonraki olayı almak için `Next(ctx)` çağırın:

```go theme={null}
for {
    event, ok := sub.Next(ctx)
    if !ok {
        break // context iptal edildi veya istemci kapandı
    }
    fmt.Println(string(event))
}
```

`Next(ctx)`, `(json.RawMessage, bool)` döndürür. `ok` false olduğunda abonelik sona ermiştir (context iptal edildi veya istemci kapandı).

## Abonelikten çıkma

```go theme={null}
sub.Unsubscribe()
```

Bu, sunucuya bir abonelikten çıkma mesajı gönderir. Bunu çağırmadan bir aboneliği okumayı bırakırsanız, SDK sahipsiz aboneliği tespit eder ve abonelikten çıkmayı otomatik gönderir.

## Birden çok abonelik

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

```go theme={null}
slots, _ := client.SlotSubscribe(ctx)
usdc, _ := client.AccountSubscribe(ctx, "EPjFWdd5...", "confirmed")
logs, _ := client.LogsSubscribe(ctx, []string{"6EF8r..."}, "confirmed")
```

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

## Yeniden bağlanma

Bağlantı koparsa, arka plan goroutine'i üstel backoff ile yeniden bağlanır ve her şeyi otomatik olarak yeniden abone eder. `Next(ctx)` çağrılarınız çalışmaya devam eder - bağlantı geri geldiğinde olaylar kaldığı yerden sürer.

## Tam örnek

Slot güncellemelerine ve USDC hesap değişikliklerine abone olup canlı bir akış yazdıran bir izleme programı.

```go theme={null}
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

    "github.com/orbitflare/orbitflare-sdk-go/ws"
)

func main() {
    ctx := context.Background()

    client, err := ws.NewBuilder().
        URL("ws://ny.rpc.orbitflare.com").
        Build(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    slots, err := client.SlotSubscribe(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer slots.Unsubscribe()

    fmt.Println("watching slots...")
    for {
        event, ok := slots.Next(ctx)
        if !ok {
            return
        }
        var slot struct {
            Slot   uint64 `json:"slot"`
            Parent uint64 `json:"parent"`
        }
        json.Unmarshal(event, &slot)
        fmt.Printf("slot %d (parent %d)\n", slot.Slot, slot.Parent)
    }
}
```
