@agatx/serenada-core 0.6.10
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/dist/ConsoleLogger.d.ts +6 -0
- package/dist/ConsoleLogger.d.ts.map +1 -0
- package/dist/ConsoleLogger.js +21 -0
- package/dist/ConsoleLogger.js.map +1 -0
- package/dist/RoomWatcher.d.ts +34 -0
- package/dist/RoomWatcher.d.ts.map +1 -0
- package/dist/RoomWatcher.js +103 -0
- package/dist/RoomWatcher.js.map +1 -0
- package/dist/SerenadaCore.d.ts +47 -0
- package/dist/SerenadaCore.d.ts.map +1 -0
- package/dist/SerenadaCore.js +141 -0
- package/dist/SerenadaCore.js.map +1 -0
- package/dist/SerenadaDiagnostics.d.ts +49 -0
- package/dist/SerenadaDiagnostics.d.ts.map +1 -0
- package/dist/SerenadaDiagnostics.js +421 -0
- package/dist/SerenadaDiagnostics.js.map +1 -0
- package/dist/SerenadaServerProvider.d.ts +48 -0
- package/dist/SerenadaServerProvider.d.ts.map +1 -0
- package/dist/SerenadaServerProvider.js +296 -0
- package/dist/SerenadaServerProvider.js.map +1 -0
- package/dist/SerenadaSession.d.ts +180 -0
- package/dist/SerenadaSession.d.ts.map +1 -0
- package/dist/SerenadaSession.js +1082 -0
- package/dist/SerenadaSession.js.map +1 -0
- package/dist/SignalingProvider.d.ts +132 -0
- package/dist/SignalingProvider.d.ts.map +1 -0
- package/dist/SignalingProvider.js +50 -0
- package/dist/SignalingProvider.js.map +1 -0
- package/dist/api/roomApi.d.ts +2 -0
- package/dist/api/roomApi.d.ts.map +1 -0
- package/dist/api/roomApi.js +14 -0
- package/dist/api/roomApi.js.map +1 -0
- package/dist/cameraModes.d.ts +13 -0
- package/dist/cameraModes.d.ts.map +1 -0
- package/dist/cameraModes.js +35 -0
- package/dist/cameraModes.js.map +1 -0
- package/dist/configValidation.d.ts +10 -0
- package/dist/configValidation.d.ts.map +1 -0
- package/dist/configValidation.js +24 -0
- package/dist/configValidation.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +65 -0
- package/dist/constants.js.map +1 -0
- package/dist/formatError.d.ts +3 -0
- package/dist/formatError.d.ts.map +1 -0
- package/dist/formatError.js +7 -0
- package/dist/formatError.js.map +1 -0
- package/dist/iceServers.d.ts +2 -0
- package/dist/iceServers.d.ts.map +1 -0
- package/dist/iceServers.js +21 -0
- package/dist/iceServers.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/computeLayout.d.ts +81 -0
- package/dist/layout/computeLayout.d.ts.map +1 -0
- package/dist/layout/computeLayout.js +380 -0
- package/dist/layout/computeLayout.js.map +1 -0
- package/dist/media/AudioLevelMonitor.d.ts +51 -0
- package/dist/media/AudioLevelMonitor.d.ts.map +1 -0
- package/dist/media/AudioLevelMonitor.js +179 -0
- package/dist/media/AudioLevelMonitor.js.map +1 -0
- package/dist/media/MediaEngine.d.ts +137 -0
- package/dist/media/MediaEngine.d.ts.map +1 -0
- package/dist/media/MediaEngine.js +1224 -0
- package/dist/media/MediaEngine.js.map +1 -0
- package/dist/media/callStats.d.ts +16 -0
- package/dist/media/callStats.d.ts.map +1 -0
- package/dist/media/callStats.js +214 -0
- package/dist/media/callStats.js.map +1 -0
- package/dist/media/localVideoRecovery.d.ts +16 -0
- package/dist/media/localVideoRecovery.d.ts.map +1 -0
- package/dist/media/localVideoRecovery.js +14 -0
- package/dist/media/localVideoRecovery.js.map +1 -0
- package/dist/recoveryStorage.d.ts +33 -0
- package/dist/recoveryStorage.d.ts.map +1 -0
- package/dist/recoveryStorage.js +88 -0
- package/dist/recoveryStorage.js.map +1 -0
- package/dist/serverUrls.d.ts +8 -0
- package/dist/serverUrls.d.ts.map +1 -0
- package/dist/serverUrls.js +65 -0
- package/dist/serverUrls.js.map +1 -0
- package/dist/signaling/SignalingEngine.d.ts +126 -0
- package/dist/signaling/SignalingEngine.d.ts.map +1 -0
- package/dist/signaling/SignalingEngine.js +720 -0
- package/dist/signaling/SignalingEngine.js.map +1 -0
- package/dist/signaling/payloads.d.ts +76 -0
- package/dist/signaling/payloads.d.ts.map +1 -0
- package/dist/signaling/payloads.js +160 -0
- package/dist/signaling/payloads.js.map +1 -0
- package/dist/signaling/roomStatuses.d.ts +9 -0
- package/dist/signaling/roomStatuses.d.ts.map +1 -0
- package/dist/signaling/roomStatuses.js +71 -0
- package/dist/signaling/roomStatuses.js.map +1 -0
- package/dist/signaling/transportConfig.d.ts +3 -0
- package/dist/signaling/transportConfig.d.ts.map +1 -0
- package/dist/signaling/transportConfig.js +27 -0
- package/dist/signaling/transportConfig.js.map +1 -0
- package/dist/signaling/transports/index.d.ts +13 -0
- package/dist/signaling/transports/index.d.ts.map +1 -0
- package/dist/signaling/transports/index.js +11 -0
- package/dist/signaling/transports/index.js.map +1 -0
- package/dist/signaling/transports/sse.d.ts +26 -0
- package/dist/signaling/transports/sse.d.ts.map +1 -0
- package/dist/signaling/transports/sse.js +131 -0
- package/dist/signaling/transports/sse.js.map +1 -0
- package/dist/signaling/transports/types.d.ts +17 -0
- package/dist/signaling/transports/types.d.ts.map +1 -0
- package/dist/signaling/transports/types.js +2 -0
- package/dist/signaling/transports/types.js.map +1 -0
- package/dist/signaling/transports/ws.d.ts +21 -0
- package/dist/signaling/transports/ws.d.ts.map +1 -0
- package/dist/signaling/transports/ws.js +93 -0
- package/dist/signaling/transports/ws.js.map +1 -0
- package/dist/signaling/types.d.ts +53 -0
- package/dist/signaling/types.d.ts.map +1 -0
- package/dist/signaling/types.js +2 -0
- package/dist/signaling/types.js.map +1 -0
- package/dist/types.d.ts +279 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
- package/src/ConsoleLogger.ts +14 -0
- package/src/RoomWatcher.ts +127 -0
- package/src/SerenadaCore.ts +163 -0
- package/src/SerenadaDiagnostics.ts +485 -0
- package/src/SerenadaServerProvider.ts +362 -0
- package/src/SerenadaSession.ts +1258 -0
- package/src/SignalingProvider.ts +207 -0
- package/src/api/roomApi.ts +16 -0
- package/src/cameraModes.ts +34 -0
- package/src/configValidation.ts +35 -0
- package/src/constants.ts +77 -0
- package/src/formatError.ts +5 -0
- package/src/iceServers.ts +20 -0
- package/src/index.ts +155 -0
- package/src/layout/computeLayout.ts +639 -0
- package/src/media/AudioLevelMonitor.ts +190 -0
- package/src/media/MediaEngine.ts +1183 -0
- package/src/media/callStats.ts +260 -0
- package/src/media/localVideoRecovery.ts +39 -0
- package/src/recoveryStorage.ts +101 -0
- package/src/serverUrls.ts +69 -0
- package/src/signaling/SignalingEngine.ts +762 -0
- package/src/signaling/payloads.ts +215 -0
- package/src/signaling/roomStatuses.ts +89 -0
- package/src/signaling/transportConfig.ts +30 -0
- package/src/signaling/transports/index.ts +26 -0
- package/src/signaling/transports/sse.ts +146 -0
- package/src/signaling/transports/types.ts +19 -0
- package/src/signaling/transports/ws.ts +108 -0
- package/src/signaling/types.ts +68 -0
- package/src/types.ts +299 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export type ParticipantConnectionStatus = 'active' | 'suspended';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Latest ephemeral content metadata for a participant (screen share, content
|
|
5
|
+
* camera mode, etc.). Persisted on the server's participant record so a peer
|
|
6
|
+
* reconnecting after a suspension reconstructs its UI without waiting for the
|
|
7
|
+
* sender to toggle again.
|
|
8
|
+
*/
|
|
9
|
+
export type ParticipantContentState = {
|
|
10
|
+
active: boolean;
|
|
11
|
+
contentType?: string;
|
|
12
|
+
updatedAtMs?: number;
|
|
13
|
+
epoch?: number;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type RoomParticipant = {
|
|
17
|
+
cid: string;
|
|
18
|
+
joinedAt?: number;
|
|
19
|
+
displayName?: string;
|
|
20
|
+
/** Host-supplied stable identity — opaque to the SDK, surfaced for avatar lookup. */
|
|
21
|
+
peerId?: string;
|
|
22
|
+
audioEnabled?: boolean;
|
|
23
|
+
videoEnabled?: boolean;
|
|
24
|
+
// Absent = active. 'suspended' means the server is holding the slot
|
|
25
|
+
// open across a signaling drop — peers MUST keep the existing peer
|
|
26
|
+
// connection alive until the participant returns or is fully removed.
|
|
27
|
+
connectionStatus?: ParticipantConnectionStatus;
|
|
28
|
+
contentState?: ParticipantContentState;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type RoomState = {
|
|
32
|
+
hostCid: string | null;
|
|
33
|
+
participants: RoomParticipant[];
|
|
34
|
+
maxParticipants?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Monotonic counter advanced by the server on every membership-mutating
|
|
37
|
+
* operation. SDKs gate ICE restart on receiving an authoritative
|
|
38
|
+
* post-reconnect room_state with epoch >= the last seen value, instead
|
|
39
|
+
* of acting on a stale in-memory peer map.
|
|
40
|
+
*/
|
|
41
|
+
epoch?: number;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Outcome reported by the server in `joined.reconnect`. Drives whether the
|
|
46
|
+
* SDK preserves media-active peer connections, schedules dirty-pair
|
|
47
|
+
* renegotiation, or starts ground-up.
|
|
48
|
+
*/
|
|
49
|
+
export type ReconnectOutcome = 'fresh' | 'reattached' | 'recovered';
|
|
50
|
+
|
|
51
|
+
export type SignalingMessage = {
|
|
52
|
+
v: number;
|
|
53
|
+
type: string;
|
|
54
|
+
rid?: string;
|
|
55
|
+
sid?: string;
|
|
56
|
+
cid?: string;
|
|
57
|
+
to?: string;
|
|
58
|
+
payload?: Record<string, unknown>;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type {
|
|
62
|
+
JoinedPayload,
|
|
63
|
+
ErrorPayload,
|
|
64
|
+
TurnRefreshedPayload,
|
|
65
|
+
OfferPayload,
|
|
66
|
+
AnswerPayload,
|
|
67
|
+
IceCandidatePayload,
|
|
68
|
+
} from './payloads.js';
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import type { SignalingProvider, PeerMessage } from './SignalingProvider.js';
|
|
2
|
+
import type { TransportKind } from './signaling/transports/types.js';
|
|
3
|
+
import type { RoomStatus, RoomStatuses } from './signaling/roomStatuses.js';
|
|
4
|
+
|
|
5
|
+
/** Current phase of the call lifecycle. */
|
|
6
|
+
export type CallPhase = 'idle' | 'awaitingPermissions' | 'joining' | 'waiting' | 'inCall' | 'ending' | 'error';
|
|
7
|
+
|
|
8
|
+
/** Network connection status between the client and signaling server. */
|
|
9
|
+
export type ConnectionStatus = 'connected' | 'recovering' | 'retrying' | 'disconnected';
|
|
10
|
+
|
|
11
|
+
/** Active signaling transport, including custom provider-specific transport labels. */
|
|
12
|
+
export type ActiveTransport = TransportKind | (string & {});
|
|
13
|
+
|
|
14
|
+
/** Camera mode: selfie (front), world (rear), composite (picture-in-picture), or screen share. */
|
|
15
|
+
export type CameraMode = 'selfie' | 'world' | 'composite' | 'screenShare';
|
|
16
|
+
|
|
17
|
+
/** Subset of {@link CameraMode} that can be configured via {@link SerenadaConfig.cameraModes}. */
|
|
18
|
+
export type ConfigurableCameraMode = Exclude<CameraMode, 'screenShare'>;
|
|
19
|
+
|
|
20
|
+
/** Default preference order for camera modes when {@link SerenadaConfig.cameraModes} is unset. */
|
|
21
|
+
export const DEFAULT_CAMERA_MODES: readonly ConfigurableCameraMode[] = ['selfie', 'world', 'composite'];
|
|
22
|
+
|
|
23
|
+
/** Device media capability that may require user permission. */
|
|
24
|
+
export type MediaCapability = 'camera' | 'microphone';
|
|
25
|
+
|
|
26
|
+
/** WebRTC peer connection state. */
|
|
27
|
+
export type PeerConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Signaling connection status of a remote participant as reported by the
|
|
31
|
+
* server. `'active'` means the participant is currently connected to the
|
|
32
|
+
* signaling server; `'suspended'` means their signaling transport dropped
|
|
33
|
+
* and the server is holding their slot open for reconnect — the peer
|
|
34
|
+
* connection to them is intentionally kept alive and UIs should surface a
|
|
35
|
+
* "reconnecting" indicator instead of rendering them as gone.
|
|
36
|
+
*/
|
|
37
|
+
export type ParticipantSignalingStatus = 'active' | 'suspended';
|
|
38
|
+
|
|
39
|
+
/** Remote participant in a call. */
|
|
40
|
+
export interface Participant {
|
|
41
|
+
cid: string;
|
|
42
|
+
displayName?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Host-supplied stable identity passed via {@link SerenadaCore.join} (the
|
|
45
|
+
* `peerId` option). Distinct from {@link cid} (per-call, server-issued) —
|
|
46
|
+
* used by the call UI to look up avatars or correlate to host-side records.
|
|
47
|
+
* Absent when the remote peer didn't supply one.
|
|
48
|
+
*/
|
|
49
|
+
peerId?: string;
|
|
50
|
+
audioEnabled: boolean;
|
|
51
|
+
videoEnabled: boolean;
|
|
52
|
+
connectionState: PeerConnectionState;
|
|
53
|
+
signalingStatus: ParticipantSignalingStatus;
|
|
54
|
+
/**
|
|
55
|
+
* `true` when this peer has been suspended longer than
|
|
56
|
+
* `PEER_SUSPENDED_UI_TIMEOUT_MS` and the SDK has flipped its UI
|
|
57
|
+
* presentation to "presumed lost." The peer connection is intentionally
|
|
58
|
+
* left open so media can resume immediately if the peer reattaches; this
|
|
59
|
+
* flag is purely a UI hint that call shells can use to move the
|
|
60
|
+
* participant out of the active grid or show a "connection lost" badge.
|
|
61
|
+
* Cleared when the peer transitions back to `signalingStatus="active"`.
|
|
62
|
+
*/
|
|
63
|
+
presumedLost: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Local participant info including camera mode and host status. */
|
|
67
|
+
export interface LocalParticipant {
|
|
68
|
+
cid: string;
|
|
69
|
+
displayName?: string;
|
|
70
|
+
/** Host-supplied stable identity — see {@link Participant.peerId}. */
|
|
71
|
+
peerId?: string;
|
|
72
|
+
audioEnabled: boolean;
|
|
73
|
+
videoEnabled: boolean;
|
|
74
|
+
cameraMode: CameraMode;
|
|
75
|
+
/**
|
|
76
|
+
* Camera modes the user can cycle through, in preference order.
|
|
77
|
+
* Derived from {@link SerenadaConfig.cameraModes} minus modes unsupported
|
|
78
|
+
* on this device/platform. An empty array means video is unavailable
|
|
79
|
+
* — the call UI should hide the video toggle.
|
|
80
|
+
*/
|
|
81
|
+
availableCameraModes: ConfigurableCameraMode[];
|
|
82
|
+
isHost: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Error codes for call failures. */
|
|
86
|
+
export type CallErrorCode =
|
|
87
|
+
| 'signalingTimeout'
|
|
88
|
+
| 'connectionFailed'
|
|
89
|
+
| 'roomFull'
|
|
90
|
+
| 'roomEnded'
|
|
91
|
+
| 'sessionExpired'
|
|
92
|
+
| 'permissionDenied'
|
|
93
|
+
| 'serverError'
|
|
94
|
+
| 'webrtcUnavailable'
|
|
95
|
+
| 'unknown';
|
|
96
|
+
|
|
97
|
+
/** Error with a machine-readable code and human-readable message. */
|
|
98
|
+
export interface CallError {
|
|
99
|
+
code: CallErrorCode;
|
|
100
|
+
message: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Richer view of the local signaling transport state. Apps can use this to
|
|
105
|
+
* render reconnect spinners, "you have been disconnected" UI, and a hard-
|
|
106
|
+
* eviction countdown when applicable. {@link CallState.connectionStatus}
|
|
107
|
+
* remains the simpler four-value summary.
|
|
108
|
+
*/
|
|
109
|
+
export type SignalingState =
|
|
110
|
+
| { kind: 'connected' }
|
|
111
|
+
| {
|
|
112
|
+
kind: 'reconnecting';
|
|
113
|
+
/** Number of consecutive reconnect attempts since transport last dropped. */
|
|
114
|
+
attempt: number;
|
|
115
|
+
/** Wall-clock ms for the next scheduled retry, or `null` if a retry is in flight. */
|
|
116
|
+
nextRetryAtMs: number | null;
|
|
117
|
+
}
|
|
118
|
+
| {
|
|
119
|
+
kind: 'suspended';
|
|
120
|
+
/** Wall-clock ms when the local transport last dropped. */
|
|
121
|
+
suspendedSinceMs: number;
|
|
122
|
+
/**
|
|
123
|
+
* Wall-clock ms when the server is expected to hard-evict the slot
|
|
124
|
+
* absent a successful reconnect. Computed locally from
|
|
125
|
+
* `suspendedSinceMs + SUSPEND_HARD_EVICTION_TIMEOUT_MS`. Best-effort
|
|
126
|
+
* — server media-liveness hints can extend retention.
|
|
127
|
+
*/
|
|
128
|
+
estimatedHardEvictionAtMs: number;
|
|
129
|
+
}
|
|
130
|
+
| { kind: 'failed'; reason: CallErrorCode };
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Primary observable call state. This is the main state object consumers subscribe to
|
|
134
|
+
* via {@link SerenadaSessionHandle.subscribe}.
|
|
135
|
+
*/
|
|
136
|
+
export interface CallState {
|
|
137
|
+
phase: CallPhase;
|
|
138
|
+
roomId: string | null;
|
|
139
|
+
roomUrl: string | null;
|
|
140
|
+
localParticipant: LocalParticipant | null;
|
|
141
|
+
remoteParticipants: Participant[];
|
|
142
|
+
connectionStatus: ConnectionStatus;
|
|
143
|
+
/**
|
|
144
|
+
* Richer signaling-transport state with timing details. Apps that don't
|
|
145
|
+
* need the extra detail can stick with {@link connectionStatus}.
|
|
146
|
+
*/
|
|
147
|
+
signalingState: SignalingState;
|
|
148
|
+
activeTransport: ActiveTransport | null;
|
|
149
|
+
requiredPermissions: MediaCapability[] | null;
|
|
150
|
+
error: CallError | null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** SDK configuration passed to {@link SerenadaCore}. */
|
|
154
|
+
export interface SerenadaConfig {
|
|
155
|
+
/** Bare host or full origin, e.g. `serenada.app` or `http://qa-box:8080`. */
|
|
156
|
+
serverHost?: string;
|
|
157
|
+
/** Custom signaling provider. Provide exactly one of `serverHost` or `signalingProvider`. */
|
|
158
|
+
signalingProvider?: SignalingProvider;
|
|
159
|
+
/** Whether the microphone is enabled when joining. Defaults to `true`. */
|
|
160
|
+
defaultAudioEnabled?: boolean;
|
|
161
|
+
/** Whether the camera is enabled when joining. Defaults to `true`. */
|
|
162
|
+
defaultVideoEnabled?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Camera modes available in the call UI, in preference order. The first
|
|
165
|
+
* entry is the initial mode. When only one mode is listed the flip-camera
|
|
166
|
+
* control is hidden; an empty array disables video entirely (the video
|
|
167
|
+
* toggle is hidden and the camera is never requested). Modes unsupported
|
|
168
|
+
* on the current platform or device are silently dropped (`'composite'`
|
|
169
|
+
* is always dropped on web). Defaults to `['selfie', 'world', 'composite']`.
|
|
170
|
+
*/
|
|
171
|
+
cameraModes?: ConfigurableCameraMode[];
|
|
172
|
+
/** Signaling transport priority order. Defaults to `['ws', 'sse']`. */
|
|
173
|
+
transports?: TransportKind[];
|
|
174
|
+
/** When `true`, only use TURNS (TLS) relay candidates. */
|
|
175
|
+
turnsOnly?: boolean;
|
|
176
|
+
/** Custom logger for SDK diagnostic output. */
|
|
177
|
+
logger?: SerenadaLogger;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Result of creating a new room via {@link SerenadaCore.createRoom}. */
|
|
181
|
+
export interface CreateRoomResult {
|
|
182
|
+
url: string;
|
|
183
|
+
roomId: string;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Public interface for an active call session. Consumers should use this
|
|
188
|
+
* instead of the concrete {@link SerenadaSession} class.
|
|
189
|
+
*/
|
|
190
|
+
export interface SerenadaSessionHandle {
|
|
191
|
+
subscribe(callback: (state: CallState) => void): () => void;
|
|
192
|
+
onPeerMessage(callback: (message: PeerMessage) => void): () => void;
|
|
193
|
+
leave(): void;
|
|
194
|
+
end(): void;
|
|
195
|
+
toggleAudio(): void;
|
|
196
|
+
toggleVideo(): void;
|
|
197
|
+
flipCamera(): Promise<void>;
|
|
198
|
+
setAudioEnabled(enabled: boolean): void;
|
|
199
|
+
setVideoEnabled(enabled: boolean): void;
|
|
200
|
+
setCameraMode(mode: CameraMode): void;
|
|
201
|
+
startScreenShare(): Promise<void>;
|
|
202
|
+
stopScreenShare(): Promise<void>;
|
|
203
|
+
resumeJoin(): Promise<void>;
|
|
204
|
+
cancelJoin(): void;
|
|
205
|
+
destroy(): void;
|
|
206
|
+
readonly state: CallState;
|
|
207
|
+
readonly localStream: MediaStream | null;
|
|
208
|
+
readonly remoteStreams: Map<string, MediaStream>;
|
|
209
|
+
readonly callStats: CallStats | null;
|
|
210
|
+
readonly hasMultipleCameras: boolean;
|
|
211
|
+
readonly canScreenShare: boolean;
|
|
212
|
+
readonly isSignalingConnected: boolean;
|
|
213
|
+
readonly iceConnectionState: RTCIceConnectionState;
|
|
214
|
+
readonly peerConnectionState: RTCPeerConnectionState;
|
|
215
|
+
readonly rtcSignalingState: RTCSignalingState;
|
|
216
|
+
onPermissionsRequired: ((permissions: MediaCapability[]) => void) | null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Aggregated WebRTC call statistics (bitrate, packet loss, jitter, codec, resolution). */
|
|
220
|
+
export interface CallStats {
|
|
221
|
+
transportPath: string | null;
|
|
222
|
+
rttMs: number | null;
|
|
223
|
+
availableOutgoingKbps: number | null;
|
|
224
|
+
audioRxPacketLossPct: number | null;
|
|
225
|
+
audioTxPacketLossPct: number | null;
|
|
226
|
+
audioJitterMs: number | null;
|
|
227
|
+
audioPlayoutDelayMs: number | null;
|
|
228
|
+
audioConcealedPct: number | null;
|
|
229
|
+
audioRxKbps: number | null;
|
|
230
|
+
audioTxKbps: number | null;
|
|
231
|
+
videoRxPacketLossPct: number | null;
|
|
232
|
+
videoTxPacketLossPct: number | null;
|
|
233
|
+
videoRxKbps: number | null;
|
|
234
|
+
videoTxKbps: number | null;
|
|
235
|
+
videoFps: number | null;
|
|
236
|
+
videoResolution: string | null;
|
|
237
|
+
videoFreezeCount60s: number | null;
|
|
238
|
+
videoFreezeDuration60s: number | null;
|
|
239
|
+
videoRetransmitPct: number | null;
|
|
240
|
+
updatedAtMs: number;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export type RoomOccupancy = RoomStatus;
|
|
244
|
+
|
|
245
|
+
/** Current state of room occupancy watching. */
|
|
246
|
+
export interface RoomWatcherState {
|
|
247
|
+
isConnected: boolean;
|
|
248
|
+
activeTransport: TransportKind | null;
|
|
249
|
+
roomStatuses: RoomStatuses;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Result of a single diagnostic check (available, unavailable, not authorized, or skipped). */
|
|
253
|
+
export type DiagnosticCheckResult =
|
|
254
|
+
| { status: 'available' }
|
|
255
|
+
| { status: 'unavailable'; reason: string }
|
|
256
|
+
| { status: 'notAuthorized' }
|
|
257
|
+
| { status: 'skipped'; reason: string };
|
|
258
|
+
|
|
259
|
+
/** Outcome of a timed connectivity check with latency on success or error on failure. */
|
|
260
|
+
export type CheckOutcome =
|
|
261
|
+
| { status: 'notRun' }
|
|
262
|
+
| { status: 'passed'; latencyMs: number }
|
|
263
|
+
| { status: 'failed'; error: string };
|
|
264
|
+
|
|
265
|
+
/** Full diagnostics report covering device capabilities and server connectivity. */
|
|
266
|
+
export interface DiagnosticsReport {
|
|
267
|
+
camera: DiagnosticCheckResult;
|
|
268
|
+
microphone: DiagnosticCheckResult;
|
|
269
|
+
speaker: DiagnosticCheckResult;
|
|
270
|
+
network: DiagnosticCheckResult;
|
|
271
|
+
signaling: DiagnosticCheckResult & { transport?: string };
|
|
272
|
+
turn: DiagnosticCheckResult & { latencyMs?: number };
|
|
273
|
+
devices: MediaDeviceInfo[];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Server connectivity check results (room API, WebSocket, SSE, TURN). */
|
|
277
|
+
export interface ConnectivityReport {
|
|
278
|
+
roomApi: CheckOutcome;
|
|
279
|
+
webSocket: CheckOutcome;
|
|
280
|
+
sse: CheckOutcome;
|
|
281
|
+
diagnosticToken: CheckOutcome;
|
|
282
|
+
turnCredentials: CheckOutcome;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** ICE connectivity probe results indicating STUN/TURN reachability. */
|
|
286
|
+
export interface IceProbeReport {
|
|
287
|
+
stunPassed: boolean;
|
|
288
|
+
turnPassed: boolean;
|
|
289
|
+
logs: string[];
|
|
290
|
+
iceServersSummary?: string;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Log level for SDK diagnostic output. */
|
|
294
|
+
export type SerenadaLogLevel = 'debug' | 'info' | 'warning' | 'error';
|
|
295
|
+
|
|
296
|
+
/** Logger interface for custom log handling. Implement this to capture SDK logs. */
|
|
297
|
+
export interface SerenadaLogger {
|
|
298
|
+
log(level: SerenadaLogLevel, tag: string, message: string): void;
|
|
299
|
+
}
|