signalbird 2.4.5 → 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.
- package/README.md +37 -33
- package/dist/angular.d.mts +4 -4
- package/dist/angular.d.ts +4 -4
- package/dist/angular.js +56 -13
- package/dist/angular.js.map +1 -1
- package/dist/angular.mjs +56 -13
- package/dist/angular.mjs.map +1 -1
- package/dist/app.d.mts +37 -47
- package/dist/app.d.ts +37 -47
- package/dist/app.js +55 -12
- package/dist/app.js.map +1 -1
- package/dist/app.mjs +55 -12
- package/dist/app.mjs.map +1 -1
- package/dist/browser.d.mts +1 -13
- package/dist/browser.d.ts +1 -13
- package/dist/browser.js +25 -3
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +25 -3
- package/dist/browser.mjs.map +1 -1
- package/dist/embed.d.mts +6 -6
- package/dist/embed.d.ts +6 -6
- package/dist/embed.js +1 -1
- package/dist/embed.js.map +1 -1
- package/dist/embed.mjs +1 -1
- package/dist/embed.mjs.map +1 -1
- package/dist/index.d.mts +50 -50
- package/dist/index.d.ts +50 -50
- package/dist/index.js +48 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -22
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.d.mts +2 -2
- package/dist/react-native.d.ts +2 -2
- package/dist/react-native.js +55 -12
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +55 -12
- package/dist/react-native.mjs.map +1 -1
- package/dist/react.d.mts +4 -4
- package/dist/react.d.ts +4 -4
- package/dist/react.js +55 -12
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +55 -12
- package/dist/react.mjs.map +1 -1
- package/dist/signalbird.js +33 -19
- package/dist/vue.d.mts +3 -3
- package/dist/vue.d.ts +3 -3
- package/dist/vue.js +55 -12
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +55 -12
- package/dist/vue.mjs.map +1 -1
- 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) | ✓ |
|
|
22
|
+
| Tarayıcı (düz JS) | ✓ | - | - | ✓ | `signalbird/browser` · `/app` |
|
|
23
23
|
| React / Next.js | ✓ | ✓ | ✓ | ✓ | `signalbird/react` |
|
|
24
|
-
| Vue 3 | ✓ |
|
|
25
|
-
| Angular | ✓ |
|
|
26
|
-
| React Native / Expo | ✓ |
|
|
27
|
-
| PHP / Laravel | ✓ | ✓ | ✓ |
|
|
28
|
-
| Python | ✓ | ✓ | ✓ |
|
|
29
|
-
| Go | ✓ | ✓ | ✓ |
|
|
30
|
-
| .NET / ASP.NET Core | ✓ | ✓ | ✓ |
|
|
31
|
-
| Swift (iOS) | ✓ |
|
|
32
|
-
| Kotlin (Android) | ✓ |
|
|
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**
|
|
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
|
|
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.
|
|
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
|
|
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**
|
|
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**
|
|
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**
|
|
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**
|
|
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**
|
|
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**
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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ı
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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)
|
|
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
|
|
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ı
|
|
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
|
|
708
|
+
oturum açılır), `CHAT_UNAVAILABLE` (kota - "sohbet kullanılamıyor" bandı),
|
|
705
709
|
`NOT_INITIALIZED`.
|
package/dist/angular.d.mts
CHANGED
|
@@ -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`
|
|
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
|
|
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ı
|
|
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`
|
|
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
|
|
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ı
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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ı
|
|
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
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
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ı
|
|
871
|
+
/** Panel açık mı - yoklama hızını belirler. */
|
|
829
872
|
setOpen(open) {
|
|
830
873
|
this.session.setActive(open);
|
|
831
874
|
}
|