@caitdesk/client 0.3.3 → 0.4.1
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 +119 -16
- package/dist/api.d.ts +6 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +33 -0
- package/dist/api.js.map +1 -1
- package/dist/broadcast-ws.d.ts +30 -0
- package/dist/broadcast-ws.d.ts.map +1 -0
- package/dist/broadcast-ws.js +183 -0
- package/dist/broadcast-ws.js.map +1 -0
- package/dist/client.d.ts +8 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +21 -0
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @caitdesk/client
|
|
2
2
|
|
|
3
|
-
Official TypeScript client for the CaitDesk
|
|
3
|
+
Official TypeScript client for the CaitDesk API. Provides typed REST and WebSocket interfaces for third-party captioning and broadcast viewing applications.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -10,12 +10,14 @@ npm install @caitdesk/client
|
|
|
10
10
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
|
+
### Captioner (sending captions)
|
|
14
|
+
|
|
13
15
|
```ts
|
|
14
16
|
import { CaitDeskClient } from '@caitdesk/client';
|
|
15
17
|
|
|
16
18
|
const client = new CaitDeskClient({
|
|
17
19
|
apiUrl: 'https://api.caitdesk.com',
|
|
18
|
-
apiKey: 'cait_sk_...',
|
|
20
|
+
apiKey: 'cait_sk_...', // needs captioner:stream + captioner:events scopes
|
|
19
21
|
onStatusChange: (status) => console.log('Connection:', status),
|
|
20
22
|
onSlotChange: (status) => console.log('Slot:', status),
|
|
21
23
|
onCaptionAck: (ack) => console.log('Ack seq:', ack.seq),
|
|
@@ -33,16 +35,47 @@ await client.connect(events[0].id);
|
|
|
33
35
|
client.append('Hello, world!');
|
|
34
36
|
client.append(' More text.');
|
|
35
37
|
|
|
36
|
-
// Control the event
|
|
37
|
-
client.start(); // Start the event
|
|
38
|
-
client.pause(); // Pause captions
|
|
39
|
-
client.resume(); // Resume captions
|
|
40
|
-
client.stop(); // End the event
|
|
41
|
-
|
|
42
38
|
// Disconnect when done
|
|
43
39
|
client.disconnect();
|
|
44
40
|
```
|
|
45
41
|
|
|
42
|
+
### Viewer (receiving captions)
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import { CaitDeskClient } from '@caitdesk/client';
|
|
46
|
+
|
|
47
|
+
const client = new CaitDeskClient({
|
|
48
|
+
apiUrl: 'https://api.caitdesk.com',
|
|
49
|
+
apiKey: 'cait_sk_...', // needs broadcast:view scope
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Subscribe to an event's broadcast
|
|
53
|
+
await client.subscribe('event-id', {
|
|
54
|
+
onCaption: (text, seq) => console.log('Caption:', text),
|
|
55
|
+
onStatus: (status) => console.log('Event status:', status),
|
|
56
|
+
onViewerCount: (count) => console.log('Viewers:', count),
|
|
57
|
+
onError: (err) => console.error('Error:', err.message),
|
|
58
|
+
onEventEnded: (id) => console.log('Event ended:', id),
|
|
59
|
+
onStatusChange: (status) => console.log('Connection:', status),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Later: disconnect
|
|
63
|
+
client.unsubscribe();
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Public Event Check (no auth required)
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { checkEvent } from '@caitdesk/client';
|
|
70
|
+
|
|
71
|
+
const result = await checkEvent('https://api.caitdesk.com', 'event-uuid-here');
|
|
72
|
+
if (result.exists && result.joinable) {
|
|
73
|
+
// Safe to open a WebSocket connection
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Accepts an optional third argument for a custom `fetch` implementation (e.g. Tauri).
|
|
78
|
+
|
|
46
79
|
### Custom Fetch (Tauri, etc.)
|
|
47
80
|
|
|
48
81
|
```ts
|
|
@@ -68,10 +101,11 @@ new CaitDeskClient(config: CaitDeskConfig)
|
|
|
68
101
|
|
|
69
102
|
#### Properties
|
|
70
103
|
|
|
71
|
-
| Property
|
|
72
|
-
|
|
|
73
|
-
| `status`
|
|
74
|
-
| `slotStatus`
|
|
104
|
+
| Property | Type | Description |
|
|
105
|
+
| ----------------- | ------------------ | ---------------------------------------------- |
|
|
106
|
+
| `status` | `ConnectionStatus` | Current captioner WebSocket connection status |
|
|
107
|
+
| `slotStatus` | `SlotStatus` | Current slot status (active or waiting) |
|
|
108
|
+
| `broadcastStatus` | `ConnectionStatus` | Current broadcast WebSocket connection status |
|
|
75
109
|
|
|
76
110
|
#### REST Methods
|
|
77
111
|
|
|
@@ -82,6 +116,12 @@ client.startEvent(eventId: string): Promise<{ success: boolean }>
|
|
|
82
116
|
client.stopEvent(eventId: string): Promise<{ success: boolean }>
|
|
83
117
|
```
|
|
84
118
|
|
|
119
|
+
### Standalone Functions
|
|
120
|
+
|
|
121
|
+
#### `checkEvent(apiUrl, eventId, fetchFn?)`
|
|
122
|
+
|
|
123
|
+
Public endpoint — no API key required. Returns `{ exists: boolean; joinable: boolean }`. Useful for validating an event ID before attempting a WebSocket connection. On network errors, returns `{ exists: false, joinable: false }`.
|
|
124
|
+
|
|
85
125
|
- `getMe()` — returns the authenticated user's info
|
|
86
126
|
- `getEvents()` — returns events assigned to you as captioner (scheduled and live only)
|
|
87
127
|
- `startEvent(eventId)` — start an event via REST (scheduled → live). Requires `captioner:control` scope
|
|
@@ -123,6 +163,31 @@ These methods require an active WebSocket connection (call `connect()` first). F
|
|
|
123
163
|
client.releaseSlot(): void // Yield active slot to next waiting captioner
|
|
124
164
|
```
|
|
125
165
|
|
|
166
|
+
#### Broadcast Subscription (Viewer)
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
client.subscribe(eventId: string, config: SubscribeConfig): Promise<void>
|
|
170
|
+
client.unsubscribe(): void
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`subscribe()` fetches a broadcast ticket and opens a WebSocket connection to receive captions in real-time. Requires the `broadcast:view` API key scope.
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
await client.subscribe(eventId, {
|
|
177
|
+
onCaption: (text, seq) => console.log('Caption:', text),
|
|
178
|
+
onStatus: (status) => console.log('Event status:', status),
|
|
179
|
+
onViewerCount: (count) => console.log('Viewers:', count),
|
|
180
|
+
onError: (err) => console.error('Error:', err.message),
|
|
181
|
+
onEventEnded: (id) => console.log('Event ended:', id),
|
|
182
|
+
onStatusChange: (status) => console.log('Connection:', status),
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Later: disconnect from broadcast
|
|
186
|
+
client.unsubscribe();
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The captioner connection (`connect`/`disconnect`) and broadcast subscription (`subscribe`/`unsubscribe`) are fully independent and can run simultaneously.
|
|
190
|
+
|
|
126
191
|
### Configuration
|
|
127
192
|
|
|
128
193
|
```ts
|
|
@@ -158,6 +223,8 @@ interface CaitDeskConfig {
|
|
|
158
223
|
|
|
159
224
|
### Types
|
|
160
225
|
|
|
226
|
+
#### Captioner types
|
|
227
|
+
|
|
161
228
|
```ts
|
|
162
229
|
interface User { id: string; email: string; name: string | null }
|
|
163
230
|
interface Event { id: string; organizationId: string; title: string; description: string | null; scheduledStart: string; scheduledEnd: string | null; status: string; clientName: string | null }
|
|
@@ -167,6 +234,28 @@ interface ServerError { type: 'error'; code: string; message: string; details?:
|
|
|
167
234
|
interface SlotDetail { position?: number; activeSince?: string }
|
|
168
235
|
```
|
|
169
236
|
|
|
237
|
+
#### Broadcast types
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
interface SubscribeConfig {
|
|
241
|
+
onCaption?: (text: string, seq: number) => void;
|
|
242
|
+
onStatus?: (status: string, detail?: { scheduledStart?: string }) => void;
|
|
243
|
+
onViewerCount?: (count: number) => void;
|
|
244
|
+
onError?: (error: ServerError) => void;
|
|
245
|
+
onEventEnded?: (eventId: string) => void;
|
|
246
|
+
onStatusChange?: (status: ConnectionStatus) => void;
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
| Callback | When it fires |
|
|
251
|
+
| ---------------- | ------------------------------------------------------- |
|
|
252
|
+
| `onCaption` | New caption text received (full text state + seq) |
|
|
253
|
+
| `onStatus` | Event status changes (waiting/live/ended) |
|
|
254
|
+
| `onViewerCount` | Viewer count updates |
|
|
255
|
+
| `onError` | Server sends an error message |
|
|
256
|
+
| `onEventEnded` | The event has ended (server-initiated, closes connection) |
|
|
257
|
+
| `onStatusChange` | Broadcast WebSocket connection state changes |
|
|
258
|
+
|
|
170
259
|
### Constants
|
|
171
260
|
|
|
172
261
|
```ts
|
|
@@ -175,6 +264,19 @@ import { EVENT_STATUS, ERROR_CODE, RATE_LIMITS, CONNECTION_DEFAULTS } from '@cai
|
|
|
175
264
|
|
|
176
265
|
- `EVENT_STATUS` — event status values (`DRAFT`, `SCHEDULED`, `LIVE`, `ENDED`, `ARCHIVED`, `CANCELLED`)
|
|
177
266
|
|
|
267
|
+
## API Key Scopes
|
|
268
|
+
|
|
269
|
+
Your API key must have the appropriate scopes for the methods you use:
|
|
270
|
+
|
|
271
|
+
| Scope | Required for |
|
|
272
|
+
| -------------------- | ------------------------------------------------------ |
|
|
273
|
+
| `captioner:events` | `getEvents()` |
|
|
274
|
+
| `captioner:stream` | `connect()` (fetches stream ticket) |
|
|
275
|
+
| `captioner:control` | `startEvent()`, `stopEvent()` |
|
|
276
|
+
| `broadcast:view` | `subscribe()` (fetches broadcast ticket) |
|
|
277
|
+
|
|
278
|
+
`getMe()` requires any valid API key (no specific scope).
|
|
279
|
+
|
|
178
280
|
## Error Handling
|
|
179
281
|
|
|
180
282
|
Errors are delivered via the `onError` callback. Some errors are terminal:
|
|
@@ -192,17 +294,18 @@ Terminal errors close the connection without reconnection.
|
|
|
192
294
|
|
|
193
295
|
## Reconnection
|
|
194
296
|
|
|
195
|
-
|
|
297
|
+
Both captioner and broadcast connections reconnect automatically on unexpected disconnects using exponential backoff (1s initial, 30s max, 1.5x multiplier). During reconnection:
|
|
196
298
|
|
|
197
299
|
1. A fresh ticket is fetched via the REST API
|
|
198
300
|
2. A new WebSocket connection is established
|
|
199
|
-
3. The slot system restores your position (same user ID = seamless takeover)
|
|
301
|
+
3. **Captioner**: The slot system restores your position (same user ID = seamless takeover)
|
|
302
|
+
4. **Broadcast**: Missed captions are replayed from the last received sequence number
|
|
200
303
|
|
|
201
304
|
The client does **not** reconnect when:
|
|
202
|
-
- You call `disconnect()`
|
|
305
|
+
- You call `disconnect()` / `unsubscribe()`
|
|
203
306
|
- The event ends (`event_ended` message)
|
|
204
307
|
- Authentication fails (close code `1008`)
|
|
205
|
-
- The slot queue is full (close code `1013
|
|
308
|
+
- The slot queue is full (close code `1013`, captioner only)
|
|
206
309
|
|
|
207
310
|
## Slot System
|
|
208
311
|
|
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type { User, Event, Ticket } from './types';
|
|
1
|
+
import type { User, Event, Ticket, BroadcastTicket, EventCheckResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Check if an event exists and is joinable (public, no auth required).
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkEvent(apiUrl: string, eventId: string, fetchFn?: typeof globalThis.fetch): Promise<EventCheckResult>;
|
|
2
6
|
export declare class ApiClient {
|
|
3
7
|
private readonly baseUrl;
|
|
4
8
|
private readonly apiKey;
|
|
@@ -14,6 +18,7 @@ export declare class ApiClient {
|
|
|
14
18
|
stopEvent(eventId: string): Promise<{
|
|
15
19
|
success: boolean;
|
|
16
20
|
}>;
|
|
21
|
+
getBroadcastTicket(eventId: string): Promise<BroadcastTicket>;
|
|
17
22
|
private request;
|
|
18
23
|
}
|
|
19
24
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEtF;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AAaD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK;IAOxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI7B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAI1D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAIzD,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAIrD,OAAO;CA+BtB"}
|
package/dist/api.js
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import { CONNECTION_DEFAULTS } from './constants';
|
|
2
|
+
/**
|
|
3
|
+
* Check if an event exists and is joinable (public, no auth required).
|
|
4
|
+
*/
|
|
5
|
+
export async function checkEvent(apiUrl, eventId, fetchFn) {
|
|
6
|
+
const base = apiUrl.replace(/\/+$/, '');
|
|
7
|
+
const f = fetchFn ?? globalThis.fetch;
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
const timer = setTimeout(() => controller.abort(), CONNECTION_DEFAULTS.REQUEST_TIMEOUT_MS);
|
|
10
|
+
try {
|
|
11
|
+
const response = await f(`${base}/api/v1/public/events/${eventId}/check`, {
|
|
12
|
+
method: 'GET',
|
|
13
|
+
headers: { 'Content-Type': 'application/json' },
|
|
14
|
+
signal: controller.signal,
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
return { exists: false, joinable: false };
|
|
18
|
+
}
|
|
19
|
+
const body = await response.json();
|
|
20
|
+
if (typeof body?.exists !== 'boolean' || typeof body?.joinable !== 'boolean') {
|
|
21
|
+
return { exists: false, joinable: false };
|
|
22
|
+
}
|
|
23
|
+
return { exists: body.exists, joinable: body.joinable };
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { exists: false, joinable: false };
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
clearTimeout(timer);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
2
32
|
export class ApiClient {
|
|
3
33
|
baseUrl;
|
|
4
34
|
apiKey;
|
|
@@ -25,6 +55,9 @@ export class ApiClient {
|
|
|
25
55
|
async stopEvent(eventId) {
|
|
26
56
|
return this.request('POST', `/api/v1/me/events/${eventId}/stop`);
|
|
27
57
|
}
|
|
58
|
+
async getBroadcastTicket(eventId) {
|
|
59
|
+
return this.request('POST', `/api/v1/me/events/${eventId}/broadcast/ticket`);
|
|
60
|
+
}
|
|
28
61
|
async request(method, path) {
|
|
29
62
|
const controller = new AbortController();
|
|
30
63
|
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ConnectionStatus, BroadcastTicket, SubscribeConfig } from './types';
|
|
2
|
+
export declare class BroadcastWsClient {
|
|
3
|
+
private ws;
|
|
4
|
+
private _status;
|
|
5
|
+
private reconnectDelay;
|
|
6
|
+
private reconnectTimer;
|
|
7
|
+
private heartbeatTimer;
|
|
8
|
+
private intentionalClose;
|
|
9
|
+
private broadcastUrl;
|
|
10
|
+
private eventId;
|
|
11
|
+
private ticket;
|
|
12
|
+
private lastSeq;
|
|
13
|
+
private pendingReplay;
|
|
14
|
+
private readonly config;
|
|
15
|
+
private readonly refreshTicket;
|
|
16
|
+
constructor(config: SubscribeConfig, refreshTicket: () => Promise<BroadcastTicket>);
|
|
17
|
+
get status(): ConnectionStatus;
|
|
18
|
+
connect(ticket: BroadcastTicket, eventId: string): void;
|
|
19
|
+
disconnect(): void;
|
|
20
|
+
private send;
|
|
21
|
+
private openSocket;
|
|
22
|
+
private handleMessage;
|
|
23
|
+
private handleClose;
|
|
24
|
+
private scheduleReconnect;
|
|
25
|
+
private clearReconnectTimer;
|
|
26
|
+
private startHeartbeat;
|
|
27
|
+
private stopHeartbeat;
|
|
28
|
+
private setStatus;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=broadcast-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-ws.d.ts","sourceRoot":"","sources":["../src/broadcast-ws.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAGf,eAAe,EAChB,MAAM,SAAS,CAAC;AAUjB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAAkD;IACxE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;gBAEnD,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC;IAKlF,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQvD,UAAU,IAAI,IAAI;IAelB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,UAAU;IA2BlB,OAAO,CAAC,aAAa;IA0DrB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ERROR_CODE, CONNECTION_DEFAULTS, WS_CLOSE_CODE } from './constants';
|
|
2
|
+
/** Close codes that should not trigger reconnection */
|
|
3
|
+
const TERMINAL_CLOSE_CODES = new Set([
|
|
4
|
+
WS_CLOSE_CODE.AUTH_FAILED,
|
|
5
|
+
]);
|
|
6
|
+
/** Heartbeat interval in ms */
|
|
7
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
8
|
+
export class BroadcastWsClient {
|
|
9
|
+
ws = null;
|
|
10
|
+
_status = 'disconnected';
|
|
11
|
+
reconnectDelay = CONNECTION_DEFAULTS.RECONNECT_DELAY_MS;
|
|
12
|
+
reconnectTimer = null;
|
|
13
|
+
heartbeatTimer = null;
|
|
14
|
+
intentionalClose = false;
|
|
15
|
+
broadcastUrl = '';
|
|
16
|
+
eventId = '';
|
|
17
|
+
ticket = '';
|
|
18
|
+
lastSeq = 0;
|
|
19
|
+
pendingReplay = false;
|
|
20
|
+
config;
|
|
21
|
+
refreshTicket;
|
|
22
|
+
constructor(config, refreshTicket) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.refreshTicket = refreshTicket;
|
|
25
|
+
}
|
|
26
|
+
get status() {
|
|
27
|
+
return this._status;
|
|
28
|
+
}
|
|
29
|
+
connect(ticket, eventId) {
|
|
30
|
+
this.intentionalClose = false;
|
|
31
|
+
this.broadcastUrl = ticket.broadcastUrl;
|
|
32
|
+
this.ticket = ticket.ticket;
|
|
33
|
+
this.eventId = eventId;
|
|
34
|
+
this.openSocket();
|
|
35
|
+
}
|
|
36
|
+
disconnect() {
|
|
37
|
+
this.intentionalClose = true;
|
|
38
|
+
this.clearReconnectTimer();
|
|
39
|
+
this.stopHeartbeat();
|
|
40
|
+
if (this.ws) {
|
|
41
|
+
this.ws.close(1000);
|
|
42
|
+
this.ws = null;
|
|
43
|
+
}
|
|
44
|
+
this.setStatus('disconnected');
|
|
45
|
+
}
|
|
46
|
+
// -----------------------------------------------------------------------
|
|
47
|
+
// Private
|
|
48
|
+
// -----------------------------------------------------------------------
|
|
49
|
+
send(message) {
|
|
50
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
51
|
+
this.ws.send(JSON.stringify(message));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
openSocket() {
|
|
55
|
+
this.setStatus('connecting');
|
|
56
|
+
const base = this.broadcastUrl.replace(/\/+$/, '');
|
|
57
|
+
const url = new URL(`${base}/ws/${this.eventId}`);
|
|
58
|
+
url.searchParams.set('ticket', this.ticket);
|
|
59
|
+
this.ws = new WebSocket(url.toString());
|
|
60
|
+
this.ws.onopen = () => {
|
|
61
|
+
this.reconnectDelay = CONNECTION_DEFAULTS.RECONNECT_DELAY_MS;
|
|
62
|
+
this.setStatus('connected');
|
|
63
|
+
this.startHeartbeat();
|
|
64
|
+
};
|
|
65
|
+
this.ws.onmessage = (event) => {
|
|
66
|
+
this.handleMessage(event.data);
|
|
67
|
+
};
|
|
68
|
+
this.ws.onclose = (event) => {
|
|
69
|
+
this.handleClose(event);
|
|
70
|
+
};
|
|
71
|
+
this.ws.onerror = () => {
|
|
72
|
+
// The close event fires after error, which handles reconnection
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
handleMessage(data) {
|
|
76
|
+
let msg;
|
|
77
|
+
try {
|
|
78
|
+
msg = JSON.parse(data);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
switch (msg.type) {
|
|
84
|
+
case 'connected':
|
|
85
|
+
// Connection confirmed — request replay if reconnecting with missed captions
|
|
86
|
+
if (this.pendingReplay && this.lastSeq > 0) {
|
|
87
|
+
this.pendingReplay = false;
|
|
88
|
+
this.send({ type: 'reconnect', eventId: this.eventId, lastSeq: this.lastSeq });
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case 'caption': {
|
|
92
|
+
const caption = msg;
|
|
93
|
+
this.lastSeq = caption.seq;
|
|
94
|
+
this.config.onCaption?.(caption.text, caption.seq);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case 'status': {
|
|
98
|
+
const status = msg;
|
|
99
|
+
const detail = status.scheduledStart ? { scheduledStart: status.scheduledStart } : undefined;
|
|
100
|
+
this.config.onStatus?.(status.status, detail);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'viewers': {
|
|
104
|
+
const viewers = msg;
|
|
105
|
+
this.config.onViewerCount?.(viewers.count);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case 'error':
|
|
109
|
+
this.config.onError?.(msg);
|
|
110
|
+
if (msg.code === ERROR_CODE.WS_AUTH_FAILED) {
|
|
111
|
+
this.intentionalClose = true;
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
case 'event_ended': {
|
|
115
|
+
const ended = msg;
|
|
116
|
+
this.config.onEventEnded?.(ended.eventId);
|
|
117
|
+
this.intentionalClose = true;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case 'pong':
|
|
121
|
+
case 'replay_complete':
|
|
122
|
+
// No-op: acknowledged by server
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
handleClose(event) {
|
|
127
|
+
this.ws = null;
|
|
128
|
+
this.stopHeartbeat();
|
|
129
|
+
if (this.intentionalClose || TERMINAL_CLOSE_CODES.has(event.code)) {
|
|
130
|
+
this.setStatus('disconnected');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Attempt reconnection
|
|
134
|
+
this.setStatus('reconnecting');
|
|
135
|
+
this.scheduleReconnect();
|
|
136
|
+
}
|
|
137
|
+
scheduleReconnect() {
|
|
138
|
+
this.clearReconnectTimer();
|
|
139
|
+
this.reconnectTimer = setTimeout(async () => {
|
|
140
|
+
try {
|
|
141
|
+
const newTicket = await this.refreshTicket();
|
|
142
|
+
this.ticket = newTicket.ticket;
|
|
143
|
+
this.broadcastUrl = newTicket.broadcastUrl;
|
|
144
|
+
this.pendingReplay = this.lastSeq > 0;
|
|
145
|
+
this.openSocket();
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
this.config.onError?.({
|
|
149
|
+
type: 'error',
|
|
150
|
+
code: ERROR_CODE.NETWORK_ERROR,
|
|
151
|
+
message: 'Failed to refresh broadcast ticket',
|
|
152
|
+
});
|
|
153
|
+
this.reconnectDelay = Math.min(this.reconnectDelay * CONNECTION_DEFAULTS.RECONNECT_MULTIPLIER, CONNECTION_DEFAULTS.RECONNECT_DELAY_MAX_MS);
|
|
154
|
+
this.scheduleReconnect();
|
|
155
|
+
}
|
|
156
|
+
}, this.reconnectDelay);
|
|
157
|
+
}
|
|
158
|
+
clearReconnectTimer() {
|
|
159
|
+
if (this.reconnectTimer != null) {
|
|
160
|
+
clearTimeout(this.reconnectTimer);
|
|
161
|
+
this.reconnectTimer = null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
startHeartbeat() {
|
|
165
|
+
this.stopHeartbeat();
|
|
166
|
+
this.heartbeatTimer = setInterval(() => {
|
|
167
|
+
this.send({ type: 'ping' });
|
|
168
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
169
|
+
}
|
|
170
|
+
stopHeartbeat() {
|
|
171
|
+
if (this.heartbeatTimer != null) {
|
|
172
|
+
clearInterval(this.heartbeatTimer);
|
|
173
|
+
this.heartbeatTimer = null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
setStatus(status) {
|
|
177
|
+
if (this._status !== status) {
|
|
178
|
+
this._status = status;
|
|
179
|
+
this.config.onStatusChange?.(status);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=broadcast-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-ws.js","sourceRoot":"","sources":["../src/broadcast-ws.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import type { CaitDeskConfig, User, Event, ConnectionStatus, SlotStatus } from './types';
|
|
1
|
+
import type { CaitDeskConfig, User, Event, ConnectionStatus, SlotStatus, SubscribeConfig } from './types';
|
|
2
2
|
export declare class CaitDeskClient {
|
|
3
3
|
private readonly api;
|
|
4
4
|
private ws;
|
|
5
5
|
private eventId;
|
|
6
|
+
private broadcastWs;
|
|
6
7
|
private readonly config;
|
|
7
8
|
constructor(config: CaitDeskConfig);
|
|
8
9
|
/** Current WebSocket connection status */
|
|
9
10
|
get status(): ConnectionStatus;
|
|
10
11
|
/** Current slot status (active, waiting, or unknown) */
|
|
11
12
|
get slotStatus(): SlotStatus;
|
|
13
|
+
/** Current broadcast WebSocket connection status */
|
|
14
|
+
get broadcastStatus(): ConnectionStatus;
|
|
12
15
|
/** Get the authenticated user's info */
|
|
13
16
|
getMe(): Promise<User>;
|
|
14
17
|
/** List events assigned to the authenticated user as captioner */
|
|
@@ -41,6 +44,10 @@ export declare class CaitDeskClient {
|
|
|
41
44
|
resume(): void;
|
|
42
45
|
/** Release the active slot to the next waiting captioner */
|
|
43
46
|
releaseSlot(): void;
|
|
47
|
+
/** Subscribe to an event's broadcast to receive captions in real-time */
|
|
48
|
+
subscribe(eventId: string, config: SubscribeConfig): Promise<void>;
|
|
49
|
+
/** Unsubscribe from the broadcast */
|
|
50
|
+
unsubscribe(): void;
|
|
44
51
|
private sendControl;
|
|
45
52
|
private requireConnection;
|
|
46
53
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,IAAI,EACJ,KAAK,EACL,gBAAgB,EAChB,UAAU,EAEV,eAAe,EAChB,MAAM,SAAS,CAAC;AAIjB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,EAAE,cAAc;IAKlC,0CAA0C;IAC1C,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED,wDAAwD;IACxD,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,oDAAoD;IACpD,IAAI,eAAe,IAAI,gBAAgB,CAEtC;IAMD,wCAAwC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,kEAAkE;IAC5D,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAInC,uEAAuE;IACjE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAIhE,kEAAkE;IAC5D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAQ/D,8CAA8C;IACxC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7C,4CAA4C;IAC5C,UAAU,IAAI,IAAI;IAUlB,gDAAgD;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3B,kFAAkF;IAClF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYxB,2DAA2D;IAC3D,KAAK,IAAI,IAAI;IAIb,sDAAsD;IACtD,IAAI,IAAI,IAAI;IAIZ,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IAIb,6BAA6B;IAC7B,MAAM,IAAI,IAAI;IAQd,4DAA4D;IAC5D,WAAW,IAAI,IAAI;IASnB,yEAAyE;IACnE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE,qCAAqC;IACrC,WAAW,IAAI,IAAI;IASnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,iBAAiB;CAM1B"}
|
package/dist/client.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { CONTROL_ACTION, RATE_LIMITS } from './constants';
|
|
2
2
|
import { ApiClient } from './api';
|
|
3
3
|
import { WsClient } from './ws';
|
|
4
|
+
import { BroadcastWsClient } from './broadcast-ws';
|
|
4
5
|
const noop = () => { };
|
|
5
6
|
export class CaitDeskClient {
|
|
6
7
|
api;
|
|
7
8
|
ws = null;
|
|
8
9
|
eventId = null;
|
|
10
|
+
broadcastWs = null;
|
|
9
11
|
config;
|
|
10
12
|
constructor(config) {
|
|
11
13
|
this.config = config;
|
|
@@ -19,6 +21,10 @@ export class CaitDeskClient {
|
|
|
19
21
|
get slotStatus() {
|
|
20
22
|
return this.ws?.slotStatus ?? 'unknown';
|
|
21
23
|
}
|
|
24
|
+
/** Current broadcast WebSocket connection status */
|
|
25
|
+
get broadcastStatus() {
|
|
26
|
+
return this.broadcastWs?.status ?? 'disconnected';
|
|
27
|
+
}
|
|
22
28
|
// -----------------------------------------------------------------------
|
|
23
29
|
// REST
|
|
24
30
|
// -----------------------------------------------------------------------
|
|
@@ -119,6 +125,21 @@ export class CaitDeskClient {
|
|
|
119
125
|
ws.releaseSlot();
|
|
120
126
|
}
|
|
121
127
|
// -----------------------------------------------------------------------
|
|
128
|
+
// Broadcast (viewer) subscription
|
|
129
|
+
// -----------------------------------------------------------------------
|
|
130
|
+
/** Subscribe to an event's broadcast to receive captions in real-time */
|
|
131
|
+
async subscribe(eventId, config) {
|
|
132
|
+
this.broadcastWs?.disconnect();
|
|
133
|
+
const ticket = await this.api.getBroadcastTicket(eventId);
|
|
134
|
+
this.broadcastWs = new BroadcastWsClient(config, () => this.api.getBroadcastTicket(eventId));
|
|
135
|
+
this.broadcastWs.connect(ticket, eventId);
|
|
136
|
+
}
|
|
137
|
+
/** Unsubscribe from the broadcast */
|
|
138
|
+
unsubscribe() {
|
|
139
|
+
this.broadcastWs?.disconnect();
|
|
140
|
+
this.broadcastWs = null;
|
|
141
|
+
}
|
|
142
|
+
// -----------------------------------------------------------------------
|
|
122
143
|
// Private
|
|
123
144
|
// -----------------------------------------------------------------------
|
|
124
145
|
sendControl(action) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { CaitDeskClient } from './client';
|
|
2
|
-
export
|
|
2
|
+
export { checkEvent } from './api';
|
|
3
|
+
export type { CaitDeskConfig, User, Event, Ticket, ConnectionStatus, SlotStatus, SlotDetail, CaptionAck, ControlAck, ServerError, ControlActionValue, ErrorCodeValue, BroadcastTicket, BroadcastCaptionMessage, BroadcastStatusMessage, BroadcastViewerCountMessage, BroadcastEventEndedMessage, BroadcastMessage, SubscribeConfig, EventCheckResult, } from './types';
|
|
3
4
|
export { EVENT_STATUS, ERROR_CODE, RATE_LIMITS, CONNECTION_DEFAULTS, SESSION_ACTION, CONTROL_ACTION, WS_CLOSE_CODE, } from './constants';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEnC,YAAY,EACV,cAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAyBnC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { SESSION_ACTION, CONTROL_ACTION, ERROR_CODE } from './constants';
|
|
2
|
+
export interface EventCheckResult {
|
|
3
|
+
exists: boolean;
|
|
4
|
+
joinable: boolean;
|
|
5
|
+
}
|
|
2
6
|
export interface CaitDeskConfig {
|
|
3
7
|
/** Base URL of the CaitDesk API (e.g. "https://api.caitdesk.com") */
|
|
4
8
|
apiUrl: string;
|
|
@@ -126,4 +130,49 @@ export type SessionMessage = SlotGrantedMessage | SlotOccupiedMessage | SlotRequ
|
|
|
126
130
|
export type IncomingMessage = ConnectedMessage | CaptionAck | ControlAck | ServerError | EventEndedMessage | SessionMessage;
|
|
127
131
|
export type ControlActionValue = (typeof CONTROL_ACTION)[keyof typeof CONTROL_ACTION];
|
|
128
132
|
export type ErrorCodeValue = (typeof ERROR_CODE)[keyof typeof ERROR_CODE];
|
|
133
|
+
/** Response from the broadcast ticket API endpoint */
|
|
134
|
+
export interface BroadcastTicket {
|
|
135
|
+
ticket: string;
|
|
136
|
+
expiresIn: number;
|
|
137
|
+
broadcastUrl: string;
|
|
138
|
+
}
|
|
139
|
+
/** Caption message from broadcast service */
|
|
140
|
+
export interface BroadcastCaptionMessage {
|
|
141
|
+
type: 'caption';
|
|
142
|
+
eventId: string;
|
|
143
|
+
seq: number;
|
|
144
|
+
text: string;
|
|
145
|
+
}
|
|
146
|
+
/** Event status message from broadcast service */
|
|
147
|
+
export interface BroadcastStatusMessage {
|
|
148
|
+
type: 'status';
|
|
149
|
+
eventId: string;
|
|
150
|
+
status: string;
|
|
151
|
+
scheduledStart?: string;
|
|
152
|
+
}
|
|
153
|
+
/** Viewer count update from broadcast service */
|
|
154
|
+
export interface BroadcastViewerCountMessage {
|
|
155
|
+
type: 'viewers';
|
|
156
|
+
eventId: string;
|
|
157
|
+
count: number;
|
|
158
|
+
}
|
|
159
|
+
/** Event ended message from broadcast service */
|
|
160
|
+
export interface BroadcastEventEndedMessage {
|
|
161
|
+
type: 'event_ended';
|
|
162
|
+
eventId: string;
|
|
163
|
+
message: string;
|
|
164
|
+
}
|
|
165
|
+
/** All possible incoming broadcast messages */
|
|
166
|
+
export type BroadcastMessage = BroadcastCaptionMessage | BroadcastStatusMessage | BroadcastViewerCountMessage | BroadcastEventEndedMessage | ServerError;
|
|
167
|
+
/** Callback configuration for broadcast subscription */
|
|
168
|
+
export interface SubscribeConfig {
|
|
169
|
+
onCaption?: (text: string, seq: number) => void;
|
|
170
|
+
onStatus?: (status: string, detail?: {
|
|
171
|
+
scheduledStart?: string;
|
|
172
|
+
}) => void;
|
|
173
|
+
onViewerCount?: (count: number) => void;
|
|
174
|
+
onError?: (error: ServerError) => void;
|
|
175
|
+
onEventEnded?: (eventId: string) => void;
|
|
176
|
+
onStatusChange?: (status: ConnectionStatus) => void;
|
|
177
|
+
}
|
|
129
178
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|