> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flextell.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Kanallar

> Flextell'in yayınladığı WebSocket kanalları ve abonelik örüntüleri.

Flextell şu anda tek bir realtime kanal grubu yayınlar: **sohbet kanalları**. Tüm sohbet olayları bir tenant'ın kanalına, tek bir adla düşer.

## `chat-log.{tenantId}`

<ParamField path="tenantId" type="integer" required>
  Bu tenant'a bağlı tüm sohbet olaylarını dinlemek için abone olacağınız kanaldaki tenant ID'si. Bu değeri [GET /v1/account/tenants](/authentication/scopes) ile kullanıcının erişebildiği tenant listesinden alırsınız.
</ParamField>

### Kanal özellikleri

| Özellik                 | Değer                                 |
| ----------------------- | ------------------------------------- |
| Kanal tipi              | `private`                             |
| Pusher üzerindeki adı   | `private-chat-log.<tenantId>`         |
| Yayınlanan event sayısı | 3 (aşağıya bakın)                     |
| Yetkilendirme           | Bearer token + tenant erişim kontrolü |

### Yayınlanan event'ler

<CardGroup cols={3}>
  <Card title="ChatLogCreated" icon="message-plus" href="/realtime/events#chatlogcreated">
    Yeni bir mesaj geldi veya gönderildi.
  </Card>

  <Card title="ChatLogDeleted" icon="message-minus" href="/realtime/events#chatlogdeleted">
    Bir mesaj silindi.
  </Card>

  <Card title="ConversationRead" icon="check-double" href="/realtime/events#conversationread">
    Bir kullanıcı görüşmeyi okundu olarak işaretledi.
  </Card>
</CardGroup>

### Event yönü

Her üç event **her iki yönde** de tetiklenir:

* Hasta tarafından gelen mesajlar (WhatsApp, Telegram),
* Panelden (veya API üzerinden) gönderilen mesajlar,
* Panel kullanıcılarının okundu işaretlemesi.

Yani kanalınız, paneldeki mesaj kutusunun canlı görünümü için tek başına yeterlidir — ayrıca "gönderdiğim mesajı güncelle" diye local state tutmanıza gerek kalmaz.

## Abone olma örüntüsü

### Kullanıcı birden fazla tenant'a erişebiliyorsa

Flextell API'leri "aktif tenant" kavramını [X-Tenant header'ı](/tenancy/overview) üzerinden sürdürür. Realtime tarafında ise **her tenant için ayrı kanal** vardır. Bu nedenle:

* Aktif tenant 12 ise `private-chat-log.12` kanalına abone olun.
* Kullanıcı 15'e geçerse: `private-chat-log.12`'den ayrılıp (`pusher.unsubscribe(...)`) `private-chat-log.15`'e abone olun.
* Birden fazla tenant için tek sayfada bildirim istiyorsanız, hepsine eşzamanlı abone olun (Pusher bağlantı başına 100 kanal destekler — bir kullanıcı için bu genelde fazlasıyla yeterlidir).

```js theme={null}
function subscribeTenant(pusher, tenantId, handlers) {
  const channel = pusher.subscribe(`private-chat-log.${tenantId}`);

  channel.bind("App\\Events\\ChatLogCreated", handlers.onCreated);
  channel.bind("App\\Events\\ChatLogDeleted", handlers.onDeleted);
  channel.bind("App\\Events\\ConversationRead", handlers.onRead);

  return () => pusher.unsubscribe(`private-chat-log.${tenantId}`);
}
```

### Bağlantı kurma sırasını doğru kurun

<Warning>
  `pusher.subscribe(...)` çağrısı, hâlihazırda bir bağlantı yoksa **yeni bir bağlantı kurar**. Auth header'ınız (Bearer token) bağlantı kurulduktan sonra değişirse istemci onu tekrar okumayabilir. Uzun ömürlü sayfalarda token'ı yenilediğinizde `pusher.disconnect()` sonrasında yeni bir Pusher örneği oluşturmak daha güvenlidir.
</Warning>

### Hata ayıklama

Subscribe sonrası başarısız olan abonelikleri yakalamak için:

```js theme={null}
channel.bind("pusher:subscription_error", (error) => {
  if (error?.status === 403) {
    console.warn("Bu tenant'a erişim yok:", error);
  } else if (error?.status === 401) {
    console.warn("Bearer token geçersiz; yenilemek gerekli");
  }
});
```

### Disconnected / offline davranışı

Pusher istemcileri ağ bağlantısı koptuğunda otomatik yeniden bağlanır ve kanallara yeniden abone olur. Bu süre zarfında yayınlanan event'ler **geçmişe yönelik olarak teslim edilmez** — yani 10 saniye bağlantınız yoksa, o 10 saniyede gelen mesajlar WebSocket üzerinden size ulaşmaz.

Bu eksiği kapatmak için:

1. Yeniden bağlanır bağlanmaz `GET /v1/conversations?updated_since=...` çağrısı ile kaçan değişiklikleri çekin.
2. Ya da her mesajla birlikte gelen `id` veya `created_at` değerini takip edip "bunun üzerindeki event'leri sorgula" mantığı kurun.

## Gelecek kanallar

Flextell ileride randevu, stok ve AI raporu için de realtime kanallar açmayı değerlendirmektedir. Yeni kanallar eklendiğinde [Changelog](/resources/changelog)'da duyurulur.
