signalbird 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +37 -33
  2. package/dist/angular.d.mts +4 -4
  3. package/dist/angular.d.ts +4 -4
  4. package/dist/angular.js +56 -13
  5. package/dist/angular.js.map +1 -1
  6. package/dist/angular.mjs +56 -13
  7. package/dist/angular.mjs.map +1 -1
  8. package/dist/app.d.mts +37 -47
  9. package/dist/app.d.ts +37 -47
  10. package/dist/app.js +55 -12
  11. package/dist/app.js.map +1 -1
  12. package/dist/app.mjs +55 -12
  13. package/dist/app.mjs.map +1 -1
  14. package/dist/browser.d.mts +1 -13
  15. package/dist/browser.d.ts +1 -13
  16. package/dist/browser.js +25 -3
  17. package/dist/browser.js.map +1 -1
  18. package/dist/browser.mjs +25 -3
  19. package/dist/browser.mjs.map +1 -1
  20. package/dist/embed.d.mts +6 -6
  21. package/dist/embed.d.ts +6 -6
  22. package/dist/embed.js +1 -1
  23. package/dist/embed.js.map +1 -1
  24. package/dist/embed.mjs +1 -1
  25. package/dist/embed.mjs.map +1 -1
  26. package/dist/index.d.mts +50 -50
  27. package/dist/index.d.ts +50 -50
  28. package/dist/index.js +48 -22
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +48 -22
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/react-native.d.mts +2 -2
  33. package/dist/react-native.d.ts +2 -2
  34. package/dist/react-native.js +55 -12
  35. package/dist/react-native.js.map +1 -1
  36. package/dist/react-native.mjs +55 -12
  37. package/dist/react-native.mjs.map +1 -1
  38. package/dist/react.d.mts +4 -4
  39. package/dist/react.d.ts +4 -4
  40. package/dist/react.js +55 -12
  41. package/dist/react.js.map +1 -1
  42. package/dist/react.mjs +55 -12
  43. package/dist/react.mjs.map +1 -1
  44. package/dist/signalbird.js +20 -20
  45. package/dist/vue.d.mts +3 -3
  46. package/dist/vue.d.ts +3 -3
  47. package/dist/vue.js +55 -12
  48. package/dist/vue.js.map +1 -1
  49. package/dist/vue.mjs +55 -12
  50. package/dist/vue.mjs.map +1 -1
  51. package/package.json +2 -2
package/README.md CHANGED
@@ -19,17 +19,17 @@ Bir seçenek daha var ve kod yazmaz: hazır sohbet widget'ı
19
19
  | Dil / platform | Telsiz | Gönderim | Yönetim | Uygulama | Kurulum |
20
20
  |---|:--:|:--:|:--:|:--:|---|
21
21
  | Node.js / TypeScript | ✓ | ✓ | ✓ | ✓ | `npm i signalbird` |
22
- | Tarayıcı (düz JS) | ✓ | | | ✓ | `signalbird/browser` · `/app` |
22
+ | Tarayıcı (düz JS) | ✓ | - | - | ✓ | `signalbird/browser` · `/app` |
23
23
  | React / Next.js | ✓ | ✓ | ✓ | ✓ | `signalbird/react` |
24
- | Vue 3 | ✓ | | | ✓ | `signalbird/vue` |
25
- | Angular | ✓ | | | ✓ | `signalbird/angular` |
26
- | React Native / Expo | ✓ | | | ✓ | `signalbird/react-native` |
27
- | PHP / Laravel | ✓ | ✓ | ✓ | | `composer require pariette/signalbird` |
28
- | Python | ✓ | ✓ | ✓ | | `pip install signalbird` |
29
- | Go | ✓ | ✓ | ✓ | | `go get github.com/Pariette-Inc/signalbird.sdk` |
30
- | .NET / ASP.NET Core | ✓ | ✓ | ✓ | | `dotnet add package Signalbird.Sdk` |
31
- | Swift (iOS) | ✓ | | | ✓ | SPM: `Signalbird` |
32
- | Kotlin (Android) | ✓ | | | ✓ | `io.signalbird:signalbird-sdk` |
24
+ | Vue 3 | ✓ | - | - | ✓ | `signalbird/vue` |
25
+ | Angular | ✓ | - | - | ✓ | `signalbird/angular` |
26
+ | React Native / Expo | ✓ | - | - | ✓ | `signalbird/react-native` |
27
+ | PHP / Laravel | ✓ | ✓ | ✓ | - | `composer require pariette/signalbird` |
28
+ | Python | ✓ | ✓ | ✓ | - | `pip install signalbird` |
29
+ | Go | ✓ | ✓ | ✓ | - | `go get github.com/Pariette-Inc/signalbird.sdk` |
30
+ | .NET / ASP.NET Core | ✓ | ✓ | ✓ | - | `dotnet add package Signalbird.Sdk` |
31
+ | Swift (iOS) | ✓ | - | - | ✓ | SPM: `Signalbird` |
32
+ | Kotlin (Android) | ✓ | - | - | ✓ | `io.signalbird:signalbird-sdk` |
33
33
 
34
34
  Metot adları diller arasında **birebir** aynıdır; her dil kendi yazım
35
35
  geleneğini korur (`createRadioProject` / `create_radio_project` /
@@ -65,7 +65,7 @@ SIGNALBIRD_DOMAIN_KEY=sb_secret_live_…
65
65
  Takım anahtarı (`sb_…`) her şeyi kapsar: e-posta, SMS, push, kişi ve kampanya,
66
66
  sohbet, uygulama, domain, Telsiz log yazımı. Ne yapabileceğini anahtarın
67
67
  kapsamları belirler; panelde üretilirken seçersiniz. **Adres yazmanız
68
- gerekmez** üretim kökü paketin içindedir.
68
+ gerekmez** - üretim kökü paketin içindedir.
69
69
 
70
70
  Ayrı anahtar isteğe bağlıdır: bir sunucunun yalnız log yazıp gönderim
71
71
  yapamamasını istiyorsanız o sunucuya dar kapsamlı ikinci bir anahtar verirsiniz.
@@ -80,7 +80,7 @@ ve gizli olmadıkları için ayrı durmak zorundadırlar:
80
80
 
81
81
  Gizli anahtar tarayıcıya **gömülemez**: sunucu, `Origin` başlığı taşıyan bir
82
82
  istekte gizli anahtarı reddeder (`SECRET_KEY_IN_BROWSER`). Bu bir kolaylık
83
- değil, kasıtlı bir duvardır anahtar bir kez istemciye indiğinde herkesindir.
83
+ değil, kasıtlı bir duvardır - anahtar bir kez istemciye indiğinde herkesindir.
84
84
 
85
85
  ## Kurulum
86
86
 
@@ -94,10 +94,10 @@ değil, kasıtlı bir duvardır — anahtar bir kez istemciye indiğinde herkesi
94
94
  | Go | `go get github.com/Pariette-Inc/signalbird.sdk` |
95
95
  | .NET, ASP.NET Core | `dotnet add package Signalbird.Sdk` |
96
96
  | Swift (iOS, macOS) | SPM: `https://github.com/Pariette-Inc/signalbird.sdk` |
97
- | Kotlin (Android) | `implementation("io.signalbird:signalbird-sdk:2.5.0")` |
97
+ | Kotlin (Android) | `implementation("io.signalbird:signalbird-sdk:2.6.0")` |
98
98
  | Canlı sohbet widget'ı (herhangi bir site) | `<script async src="https://signalbird.io/sdk/v1/signalbird.js" data-key="sb_public_live_…" data-channel="destek"></script>` |
99
99
 
100
- > Hepsi **bu repodan** çıkar ve **aynı sürümü** taşır ayrı SDK reposu ya da
100
+ > Hepsi **bu repodan** çıkar ve **aynı sürümü** taşır - ayrı SDK reposu ya da
101
101
  > dil başına sürüm yoktur.
102
102
 
103
103
  ## Node.js / TypeScript
@@ -146,7 +146,7 @@ const result = await signalbird().batch([
146
146
  ### Next.js
147
147
 
148
148
  Sunucu tarafında (route handler, server action, `app/api/**`) doğrudan
149
- `signalbird` kullanılır. **İstemci bileşenlerinde kullanmayın** anahtar
149
+ `signalbird` kullanılır. **İstemci bileşenlerinde kullanmayın** - anahtar
150
150
  paketle birlikte tarayıcıya iner.
151
151
 
152
152
  ```ts
@@ -183,7 +183,7 @@ sb.error('browser', 'sepet güncellenemedi', { cartId })
183
183
  Kayıtlar tek tek değil, **toplu** gider (varsayılan 3 saniyede bir) ve sekme
184
184
  kapanırken `sendBeacon` ile boşaltılır.
185
185
 
186
- **React** `app/providers.tsx` ya da `main.tsx`:
186
+ **React** - `app/providers.tsx` ya da `main.tsx`:
187
187
 
188
188
  ```tsx
189
189
  useEffect(() => {
@@ -192,14 +192,14 @@ useEffect(() => {
192
192
  }, [])
193
193
  ```
194
194
 
195
- **Vue** `main.ts`:
195
+ **Vue** - `main.ts`:
196
196
 
197
197
  ```ts
198
198
  const sb = initSignalbird({ publicKey: import.meta.env.VITE_SIGNALBIRD_DOMAIN_KEY })
199
199
  app.config.errorHandler = (err) => sb.error('browser', String(err))
200
200
  ```
201
201
 
202
- **Angular** `ErrorHandler` sağlayıcısı:
202
+ **Angular** - `ErrorHandler` sağlayıcısı:
203
203
 
204
204
  ```ts
205
205
  @Injectable()
@@ -232,7 +232,7 @@ SIGNALBIRD_DOMAIN_KEY=sb_secret_live_…
232
232
  SIGNALBIRD_SOURCE=api-01
233
233
  ```
234
234
 
235
- **Laravel'in kendi loglarını Telsiz'e bağlamak** `config/logging.php`:
235
+ **Laravel'in kendi loglarını Telsiz'e bağlamak** - `config/logging.php`:
236
236
 
237
237
  ```php
238
238
  'signalbird' => [
@@ -262,17 +262,21 @@ Signalbird::error('api', 'veritabanı bağlantısı koptu');
262
262
  geçerli bir sebep değildir. Geliştirme sırasında `throwOnError: true`.
263
263
  - **Tanımsız kanal düşürülmez.** İlk `log('odeme-hatasi', …)` çağrısında kanal
264
264
  kendiliğinden açılır ve panelde "otomatik açıldı" işaretiyle görünür. Yeni
265
- kanal **sessizdir** kuralı ekip koyar.
265
+ kanal **sessizdir** - kuralı ekip koyar.
266
266
  - **Seviye kanalın varsayılanını ezer.** `level` göndermezseniz kanalın kendi
267
267
  seviyesi geçerlidir.
268
268
  - **Kritik seviye sessiz saatleri deler.** Gece üçte ölen servis sabahı bekleyemez.
269
269
  - **Tekrar bastırma kaydı değil bildirimi susturur.** Aynı mesaj kanalın
270
270
  `dedupe` süresi içinde tekrar gelirse ikinci bildirim gitmez ama kayıt tutulur.
271
+ - **SDK sürümünü bildirir (2.6.0).** Her istek `X-Signalbird-Sdk:
272
+ <platform>/<sürüm>` taşır. Yeni sürüm çıktığında SDK süreç başına **bir kez**
273
+ uyarı yazar; eski sürümdeki anahtarların sahiplerine panel bildirimi gider.
274
+ Uyarı hata değildir, istek sonucu değişmez (CONTRACT §14).
271
275
 
272
276
  ## Gönderim (Messaging)
273
277
 
274
278
  Takım API anahtarı (`sb_…`, panelde **Konsol → API anahtarları**, scope'lu)
275
- ile çalışır. Telsiz anahtarı burada geçmez istemci kurulurken
279
+ ile çalışır. Telsiz anahtarı burada geçmez - istemci kurulurken
276
280
  `WRONG_KEY_TYPE` ile reddeder. Yalnız sunucuda kullanılır.
277
281
 
278
282
  Node:
@@ -370,7 +374,7 @@ import { management } from 'signalbird'
370
374
  // Yeni ortam kurulumu: proje aç, kanalını tanımla, anahtarı sakla
371
375
  const { data } = await management().createRadioProject({ name: 'ödeme-servisi' })
372
376
 
373
- // `secret` YALNIZ burada döner sunucuda yalnız özeti saklanır
377
+ // `secret` YALNIZ burada döner - sunucuda yalnız özeti saklanır
374
378
  await vault.write('SIGNALBIRD_DOMAIN_KEY', data!.secret)
375
379
 
376
380
  await management().createRadioChannel(data!.project.id, {
@@ -405,7 +409,7 @@ const { data } = await management().embedToken({ module: 'chat' })
405
409
  // data.url → 120 saniyelik, TEK KULLANIMLIK adres; doğrudan <iframe>'e verin
406
410
  ```
407
411
 
408
- Anahtar `embed:issue` kapsamı ister jeton 60 dakikalık bir panel oturumuna
412
+ Anahtar `embed:issue` kapsamı ister - jeton 60 dakikalık bir panel oturumuna
409
413
  çevrildiği için bu kapsam bilerek ayrıdır.
410
414
 
411
415
  Aynısı PHP, Python, Go ve .NET'te birebir aynı metot adlarıyla:
@@ -428,7 +432,7 @@ await management.CreateRadioProjectAsync(new { name = "ödeme-servisi" });
428
432
 
429
433
  Tam liste (40 metot): `docs/CONTRACT.md § 10`.
430
434
 
431
- ## Partner müşteri sağlama
435
+ ## Partner - müşteri sağlama
432
436
 
433
437
  Signalbird'ü kendi ürününüzün içinde satıyorsanız (sözleşmeli platform) bu yüzey
434
438
  sizindir: müşteri hesabı açar, domain ekleyip izlemeye alır, uptime okur, ödeme
@@ -439,7 +443,7 @@ import { SignalbirdPartner } from 'signalbird'
439
443
 
440
444
  const partner = new SignalbirdPartner({ domainKey: process.env.SIGNALBIRD_DOMAIN_KEY! })
441
445
 
442
- // Müşteri açıldı idempotent: aynı external_id ikinci kez yeni hesap AÇMAZ
446
+ // Müşteri açıldı - idempotent: aynı external_id ikinci kez yeni hesap AÇMAZ
443
447
  const { data } = await partner.createCompany({
444
448
  external_id: 'sc_9911',
445
449
  name: 'Acme',
@@ -465,7 +469,7 @@ const embed = await partner.createEmbedToken('sc_9911', {
465
469
  })
466
470
  // → <iframe src={embed.data.url} />
467
471
 
468
- // Gönderilen her şeyin durumu kendi panelinizde çizmek için (salt okur)
472
+ // Gönderilen her şeyin durumu - kendi panelinizde çizmek için (salt okur)
469
473
  const log = await partner.listMessages('sc_9911', { channel: 'email', status: 'delivered' })
470
474
  const one = await partner.getMessage('sc_9911', 'm_01J…') // olay zaman çizelgesi
471
475
  const sum = await partner.messageSummary('sc_9911', '7d') // kanal bazlı özet
@@ -479,10 +483,10 @@ PHP'de `Signalbird::partner()->createCompany([...])`.
479
483
  İki kural: **anahtar tarayıcıya inmez** ve **TXT'siz domain kampanya
480
484
  gönderemez** (izleme, sohbet ve push açıktır). Ayrıntı: `docs/CONTRACT.md § 12`.
481
485
 
482
- Mesaj uçları **salt okurdur**: alıcı maskeli döner, gövde hiç dönmez gövde
486
+ Mesaj uçları **salt okurdur**: alıcı maskeli döner, gövde hiç dönmez - gövde
483
487
  zaten saklanmıyor.
484
488
 
485
- ## Gönderim müşterinin kendi sisteminden
489
+ ## Gönderim - müşterinin kendi sisteminden
486
490
 
487
491
  Bir platformun (SubmitCMS, veribenim…) müşterisiyseniz kendi sunucunuzdan da
488
492
  gönderim yapabilirsiniz. Gereken tek şey **kendi takım anahtarınızdır**
@@ -537,7 +541,7 @@ istemiyorsanız ikincisi.
537
541
  3. **Anahtar sunucuda kalır.** Tarayıcıya ya da mobil uygulamaya konmaz;
538
542
  oralar için açık uygulama anahtarı (`sb_public_live_…`) vardır.
539
543
 
540
- ## Uygulama (App) kendi sohbet arayüzünüz
544
+ ## Uygulama (App) - kendi sohbet arayüzünüz
541
545
 
542
546
  Hazır widget yerine kendi arayüzünüzü yazmak, ya da sohbeti **mobil
543
547
  uygulamanıza** koymak istiyorsanız bu yüzey içindir. Açık uygulama anahtarı
@@ -645,10 +649,10 @@ Signalbird.destroy()
645
649
  çalışır, sayfanızın CSS'iyle çakışmaz; < 20 KB gzip. Ayrıntı:
646
650
  `docs/CONTRACT.md § 9` ve https://signalbird.io/sdk/widget.
647
651
 
648
- ## Gömme (embed) Signalbird ekranını kendi panelinizde çalıştırın
652
+ ## Gömme (embed) - Signalbird ekranını kendi panelinizde çalıştırın
649
653
 
650
654
  Partner (veribenim, submitcms, yeni ortaklar) Signalbird modülünü kendi
651
- panelinin içinde gösterir. Ekran kopyalanmaz **çalışan ekranın kendisi**
655
+ panelinin içinde gösterir. Ekran kopyalanmaz - **çalışan ekranın kendisi**
652
656
  gelir; Signalbird'de güncellenen her şey partner panelinde de anında günceldir.
653
657
 
654
658
  ```html
@@ -693,7 +697,7 @@ Sunucu tarafı tek çağrıdır (`Signalbird::partner()->createEmbedToken(...)`,
693
697
  | `CHANNEL_NOT_ALLOWED` | Tarayıcı anahtarı bu kanala yazamaz |
694
698
  | `MODULE_DISABLED` | Paketinizde Telsiz (`logger`) modülü yok |
695
699
  | `LIMIT_REACHED` | Aylık kayıt limitiniz doldu |
696
- | `CHANNEL_DISABLED` | Kanal kapalı kayıt yazılmaz, kota da harcanmaz |
700
+ | `CHANNEL_DISABLED` | Kanal kapalı - kayıt yazılmaz, kota da harcanmaz |
697
701
 
698
702
  Gönderim ve Yönetim istemcilerine özgü: `WRONG_KEY_TYPE` (kurulumda),
699
703
  `API_KEY_INVALID`, `API_KEY_SCOPE` (anahtarda gereken scope yok),
@@ -701,5 +705,5 @@ Gönderim ve Yönetim istemcilerine özgü: `WRONG_KEY_TYPE` (kurulumda),
701
705
  `LIST_NOT_FOUND`, `MODULE_DISABLED`, `NETWORK_ERROR`, `TIMEOUT`, `HTTP_<durum>`.
702
706
 
703
707
  Uygulama yüzeyi ve widget: `VISITOR_INVALID` (yerel kimlik silinir, yeni
704
- oturum açılır), `CHAT_UNAVAILABLE` (kota "sohbet kullanılamıyor" bandı),
708
+ oturum açılır), `CHAT_UNAVAILABLE` (kota - "sohbet kullanılamıyor" bandı),
705
709
  `NOT_INITIALIZED`.
@@ -2,7 +2,7 @@ import { Observable } from 'rxjs';
2
2
  import { SignalbirdApp, AppConfig, ChatState, SessionInput, IdentifyInput, RegisterDeviceInput } from './app.mjs';
3
3
 
4
4
  /**
5
- * `signalbird/angular` Angular servisi ve sağlayıcısı.
5
+ * `signalbird/angular` - Angular servisi ve sağlayıcısı.
6
6
  *
7
7
  * Dekoratör KULLANMAZ: `@Injectable()` yazsaydık paketin derlenmesi Angular
8
8
  * sürümüne bağlanırdı ve her büyük sürümde yeniden yayın gerekirdi. Bunun
@@ -12,7 +12,7 @@ import { SignalbirdApp, AppConfig, ChatState, SessionInput, IdentifyInput, Regis
12
12
  * RxJS bir `peerDependency`'dir (Angular zaten getirir).
13
13
  */
14
14
 
15
- /** DI belirteci Angular'ın `InjectionToken`'ına sarılır (aşağıda). */
15
+ /** DI belirteci - Angular'ın `InjectionToken`'ına sarılır (aşağıda). */
16
16
  declare const SIGNALBIRD_CONFIG = "SIGNALBIRD_CONFIG";
17
17
  /**
18
18
  * Uygulama başına tek örnek (`providedIn: 'root'` karşılığı).
@@ -27,7 +27,7 @@ declare class SignalbirdService {
27
27
  constructor(config: AppConfig);
28
28
  /** Sohbet durumu akışı. İlk abone olduğunda oturum başlar. */
29
29
  chat$(): Observable<ChatState>;
30
- /** Panel açık mı yoklama hızını belirler. */
30
+ /** Panel açık mı - yoklama hızını belirler. */
31
31
  setOpen(open: boolean): void;
32
32
  send(body: string, attachments?: unknown[]): Promise<unknown>;
33
33
  typing(isTyping: boolean): void;
@@ -48,7 +48,7 @@ declare class SignalbirdService {
48
48
  /**
49
49
  * `bootstrapApplication(App, { providers: [provideSignalbird({ publicKey })] })`
50
50
  *
51
- * Dönen nesne Angular'ın `Provider` biçimindedir ama tipi buraya gömülmez
51
+ * Dönen nesne Angular'ın `Provider` biçimindedir ama tipi buraya gömülmez -
52
52
  * paket Angular'a derleme zamanı bağımlılık taşımaz.
53
53
  */
54
54
  declare function provideSignalbird(config: AppConfig): {
package/dist/angular.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Observable } from 'rxjs';
2
2
  import { SignalbirdApp, AppConfig, ChatState, SessionInput, IdentifyInput, RegisterDeviceInput } from './app.js';
3
3
 
4
4
  /**
5
- * `signalbird/angular` Angular servisi ve sağlayıcısı.
5
+ * `signalbird/angular` - Angular servisi ve sağlayıcısı.
6
6
  *
7
7
  * Dekoratör KULLANMAZ: `@Injectable()` yazsaydık paketin derlenmesi Angular
8
8
  * sürümüne bağlanırdı ve her büyük sürümde yeniden yayın gerekirdi. Bunun
@@ -12,7 +12,7 @@ import { SignalbirdApp, AppConfig, ChatState, SessionInput, IdentifyInput, Regis
12
12
  * RxJS bir `peerDependency`'dir (Angular zaten getirir).
13
13
  */
14
14
 
15
- /** DI belirteci Angular'ın `InjectionToken`'ına sarılır (aşağıda). */
15
+ /** DI belirteci - Angular'ın `InjectionToken`'ına sarılır (aşağıda). */
16
16
  declare const SIGNALBIRD_CONFIG = "SIGNALBIRD_CONFIG";
17
17
  /**
18
18
  * Uygulama başına tek örnek (`providedIn: 'root'` karşılığı).
@@ -27,7 +27,7 @@ declare class SignalbirdService {
27
27
  constructor(config: AppConfig);
28
28
  /** Sohbet durumu akışı. İlk abone olduğunda oturum başlar. */
29
29
  chat$(): Observable<ChatState>;
30
- /** Panel açık mı yoklama hızını belirler. */
30
+ /** Panel açık mı - yoklama hızını belirler. */
31
31
  setOpen(open: boolean): void;
32
32
  send(body: string, attachments?: unknown[]): Promise<unknown>;
33
33
  typing(isTyping: boolean): void;
@@ -48,7 +48,7 @@ declare class SignalbirdService {
48
48
  /**
49
49
  * `bootstrapApplication(App, { providers: [provideSignalbird({ publicKey })] })`
50
50
  *
51
- * Dönen nesne Angular'ın `Provider` biçimindedir ama tipi buraya gömülmez
51
+ * Dönen nesne Angular'ın `Provider` biçimindedir ama tipi buraya gömülmez -
52
52
  * paket Angular'a derleme zamanı bağımlılık taşımaz.
53
53
  */
54
54
  declare function provideSignalbird(config: AppConfig): {
package/dist/angular.js CHANGED
@@ -4,6 +4,26 @@ var rxjs = require('rxjs');
4
4
 
5
5
  // src/angular/index.ts
6
6
 
7
+ // src/shared/version.ts
8
+ var SDK_VERSION = "2.6.0" ;
9
+ var SDK_HEADER = "X-Signalbird-Sdk";
10
+ function sdkHeaderValue(platform) {
11
+ return `${platform}/${SDK_VERSION}`;
12
+ }
13
+ var warned = false;
14
+ function noteSdkStatus(headers) {
15
+ if (warned || !headers) return;
16
+ try {
17
+ const status = headers.get("Signalbird-Sdk-Status");
18
+ if (status !== "outdated" && status !== "unsupported") return;
19
+ warned = true;
20
+ const latest = headers.get("Signalbird-Sdk-Latest") ?? "?";
21
+ const message = status === "unsupported" ? `[signalbird] Bu SDK s\xFCr\xFCm\xFC (${SDK_VERSION}) art\u0131k desteklenmiyor. Son s\xFCr\xFCm: ${latest}. Paketi g\xFCncelleyin.` : `[signalbird] Yeni SDK s\xFCr\xFCm\xFC var: ${latest} (kurulu: ${SDK_VERSION}).`;
22
+ if (typeof console !== "undefined") console.warn(message);
23
+ } catch {
24
+ }
25
+ }
26
+
7
27
  // src/app/client.ts
8
28
  var DEFAULT_BASE_URL = "https://live.signalbird.io/api";
9
29
  var STORAGE_KEY = "sb_visitor";
@@ -91,7 +111,7 @@ var SignalbirdApp = class {
91
111
  identify(input) {
92
112
  return this.request("POST", "/v1/sdk/identify", input);
93
113
  }
94
- /** Saklanan ziyaretçi kimliği yoksa `null`. */
114
+ /** Saklanan ziyaretçi kimliği - yoksa `null`. */
95
115
  async currentVisitor() {
96
116
  const stored = await this.loadVisitor();
97
117
  return stored ? { id: stored.id, name: stored.name, email: stored.email } : null;
@@ -110,7 +130,7 @@ var SignalbirdApp = class {
110
130
  return this.request("GET", `/v1/sdk/chat/conversations/${enc(id)}`, void 0, query);
111
131
  }
112
132
  /**
113
- * İlk mesajla konuşma açar. Kota burada harcanır konuşma başına sayılır,
133
+ * İlk mesajla konuşma açar. Kota burada harcanır - konuşma başına sayılır,
114
134
  * mesaj başına değil.
115
135
  */
116
136
  startConversation(input) {
@@ -184,7 +204,7 @@ var SignalbirdApp = class {
184
204
  // ── Push ──────────────────────────────────────────────────────────────
185
205
  /**
186
206
  * Cihaz token'ını kaydeder. Token'ı almak (FCM/APNs/Web Push izni) ev
187
- * sahibinin işidir; SDK yalnız iletir izin diyaloğunu kimin, ne zaman
207
+ * sahibinin işidir; SDK yalnız iletir - izin diyaloğunu kimin, ne zaman
188
208
  * göstereceği ürün kararıdır, kütüphane kararı değil.
189
209
  */
190
210
  registerDevice(input) {
@@ -195,14 +215,14 @@ var SignalbirdApp = class {
195
215
  return this.request("DELETE", `/v1/sdk/devices/${enc(token)}`);
196
216
  }
197
217
  /**
198
- * Bildirime dokunuldu açılma damgası.
218
+ * Bildirime dokunuldu - açılma damgası.
199
219
  *
200
220
  * Push'ta açılmayı YALNIZCA uygulama bilir: FCM/APNs "teslim ettim" der,
201
221
  * "kullanıcı dokundu" demez. Bildirim yükündeki `data.sb_message_id`
202
222
  * değerini buraya geri gönderin.
203
223
  *
204
224
  * ```ts
205
- * // React Native / Expo bildirime dokunma işleyicisinde
225
+ * // React Native / Expo - bildirime dokunma işleyicisinde
206
226
  * const id = response.notification.request.content.data?.sb_message_id
207
227
  * if (id) await sb.reportPushOpened(String(id))
208
228
  * ```
@@ -219,7 +239,8 @@ var SignalbirdApp = class {
219
239
  const isForm = typeof FormData !== "undefined" && body instanceof FormData;
220
240
  const headers = {
221
241
  Accept: "application/json",
222
- "X-Signalbird-Key": this.config.publicKey
242
+ "X-Signalbird-Key": this.config.publicKey,
243
+ [SDK_HEADER]: sdkHeaderValue(appPlatform())
223
244
  };
224
245
  const moduleKey = path.startsWith("/v1/sdk/devices") || path.startsWith("/v1/sdk/push") ? this.config.pushKey : this.config.chatKey;
225
246
  if (moduleKey) headers["X-Signalbird-Module-Key"] = moduleKey;
@@ -235,6 +256,7 @@ var SignalbirdApp = class {
235
256
  body: body === void 0 ? void 0 : isForm ? body : JSON.stringify(body),
236
257
  signal: controller.signal
237
258
  });
259
+ noteSdkStatus(response.headers);
238
260
  const text = await response.text();
239
261
  let data = null;
240
262
  try {
@@ -310,6 +332,9 @@ function buildQuery(query) {
310
332
  const encoded = params.toString();
311
333
  return encoded ? `?${encoded}` : "";
312
334
  }
335
+ function appPlatform() {
336
+ return typeof navigator !== "undefined" && navigator.product === "ReactNative" ? "react-native" : "app";
337
+ }
313
338
 
314
339
  // src/shared/socket.ts
315
340
  var BACKOFF = [1e3, 2e3, 5e3, 1e4, 3e4];
@@ -434,7 +459,7 @@ var Socket = class {
434
459
  }
435
460
  }
436
461
  /**
437
- * Olay yolla ACK İSTEMEDEN.
462
+ * Olay yolla - ACK İSTEMEDEN.
438
463
  *
439
464
  * `subscribe`in sonucunu beklemek bir tur daha protokol yönetmek demekti;
440
465
  * oysa sonucu zaten davranıştan görüyoruz: imza tutmadıysa yayın gelmez ve
@@ -499,6 +524,8 @@ var ChatSession = class {
499
524
  * da düzenleme ekrana hiç yansımaz.
500
525
  */
501
526
  this.forceFull = false;
527
+ /** Son gönderilen `typing(true)` zamanı; 0 = açık sinyal yok. */
528
+ this.lastTypingSent = 0;
502
529
  this.active = options.active ?? false;
503
530
  }
504
531
  // ── Abonelik ──────────────────────────────────────────────────────────
@@ -533,7 +560,7 @@ var ChatSession = class {
533
560
  this.patch({ loading: false });
534
561
  this.schedule();
535
562
  }
536
- /** Panel açıldı/kapandı yoklama hızı buna göre değişir. */
563
+ /** Panel açıldı/kapandı - yoklama hızı buna göre değişir. */
537
564
  setActive(active) {
538
565
  if (this.active === active) return;
539
566
  this.active = active;
@@ -548,7 +575,7 @@ var ChatSession = class {
548
575
  * Konuşmayı bırakır; sonraki mesaj YENİ bir konuşma açar.
549
576
  *
550
577
  * Ekranın "yeni sohbet" düğmesi de bunu çağırır. Sunucuda hiçbir şey
551
- * silinmez yalnız bu oturumun neye baktığı değişir.
578
+ * silinmez - yalnız bu oturumun neye baktığı değişir.
552
579
  */
553
580
  reset() {
554
581
  this.patch({ conversation: null, messages: [], unread: 0, agentTyping: false, errorCode: void 0 });
@@ -562,7 +589,7 @@ var ChatSession = class {
562
589
  this.socket = null;
563
590
  this.live = false;
564
591
  }
565
- /** Canlı bağlantı kurulu mu arayüz isterse gösterir (zorunlu değil). */
592
+ /** Canlı bağlantı kurulu mu - arayüz isterse gösterir (zorunlu değil). */
566
593
  get isLive() {
567
594
  return this.live;
568
595
  }
@@ -617,16 +644,32 @@ var ChatSession = class {
617
644
  }
618
645
  /**
619
646
  * Ziyaretçinin konu seçimi. Konuşma AÇILDIKTAN sonra çağrılırsa etkisizdir:
620
- * açılmış konuşmanın konusunu ajan panelden değiştirir ziyaretçiye kendi
647
+ * açılmış konuşmanın konusunu ajan panelden değiştirir - ziyaretçiye kendi
621
648
  * konuşmasını yeniden sınıflandırma yetkisi vermek, atamayı da bozardı.
622
649
  */
623
650
  setTopic(slug) {
624
651
  this.patch({ topic: slug });
625
652
  }
626
- /** İlk tuşta `true`, 2.5 s hareketsizlikte `false` — çağıran zamanlar. */
653
+ /**
654
+ * İlk tuşta `true`, 2.5 s hareketsizlikte `false` - çağıran zamanlar.
655
+ *
656
+ * SDK yine de kendini korur (18 Eyl 2026): `true` 4 saniyede bir kez gider,
657
+ * `false` yalnız açık bir `true` varsa. Bir entegrasyon her tuşta
658
+ * çağırdığında (Penyu mobil öyle yapıyordu) 40 harflik mesaj 40 istek
659
+ * oluyor ve sunucunun hız sınırı ikinci mesajı 429 ile düşürüyordu. Web
660
+ * widget'ındaki kuralın aynısı.
661
+ */
627
662
  typing(isTyping) {
628
663
  const conversation = this.state.conversation;
629
664
  if (!conversation) return;
665
+ const now = Date.now();
666
+ if (isTyping) {
667
+ if (now - this.lastTypingSent < 4e3) return;
668
+ this.lastTypingSent = now;
669
+ } else {
670
+ if (this.lastTypingSent === 0) return;
671
+ this.lastTypingSent = 0;
672
+ }
630
673
  void this.app.setTyping(conversation.id, isTyping);
631
674
  }
632
675
  /** Görülen son mesaja kadar okundu işaretler. */
@@ -825,7 +868,7 @@ var SignalbirdService = class {
825
868
  }
826
869
  return this.subject.asObservable();
827
870
  }
828
- /** Panel açık mı yoklama hızını belirler. */
871
+ /** Panel açık mı - yoklama hızını belirler. */
829
872
  setOpen(open) {
830
873
  this.session.setActive(open);
831
874
  }