@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,296 @@
|
|
|
1
|
+
import { SignalingProviderEmitter } from './SignalingProvider.js';
|
|
2
|
+
import { SignalingEngine } from './signaling/SignalingEngine.js';
|
|
3
|
+
import { parseErrorPayload, parseJoinedPayload, parseNegotiationDirtyPayload, parseRelayFailedPayload, parseRoomStatePayload, parseTurnRefreshedPayload, } from './signaling/payloads.js';
|
|
4
|
+
import { TURN_FETCH_TIMEOUT_MS } from './constants.js';
|
|
5
|
+
import { formatError } from './formatError.js';
|
|
6
|
+
import { buildApiUrl, resolveServerUrls } from './serverUrls.js';
|
|
7
|
+
export class SerenadaServerProvider extends SignalingProviderEmitter {
|
|
8
|
+
capabilities = { handlesReconnection: true };
|
|
9
|
+
serverHost;
|
|
10
|
+
signaling;
|
|
11
|
+
logger;
|
|
12
|
+
unsubscribeStateChange;
|
|
13
|
+
unsubscribeMessages;
|
|
14
|
+
lastConnected = false;
|
|
15
|
+
currentTurnToken = null;
|
|
16
|
+
previousParticipants = new Map();
|
|
17
|
+
currentHostPeerId = null;
|
|
18
|
+
disconnected = false;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
super();
|
|
21
|
+
const urls = resolveServerUrls(config.serverHost);
|
|
22
|
+
this.serverHost = config.serverHost;
|
|
23
|
+
this.logger = config.logger;
|
|
24
|
+
this.signaling = new SignalingEngine({
|
|
25
|
+
wsUrl: urls.wsUrl,
|
|
26
|
+
httpBaseUrl: urls.httpBaseUrl,
|
|
27
|
+
transports: config.transports,
|
|
28
|
+
logger: config.logger,
|
|
29
|
+
});
|
|
30
|
+
this.unsubscribeStateChange = this.signaling.onStateChange(() => {
|
|
31
|
+
this.handleStateChange();
|
|
32
|
+
});
|
|
33
|
+
this.unsubscribeMessages = this.signaling.subscribeToMessages((message) => {
|
|
34
|
+
this.handleMessage(message);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
connect() {
|
|
38
|
+
this.signaling.connect();
|
|
39
|
+
}
|
|
40
|
+
disconnect() {
|
|
41
|
+
if (this.disconnected) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.disconnected = true;
|
|
45
|
+
this.unsubscribeStateChange();
|
|
46
|
+
this.unsubscribeMessages();
|
|
47
|
+
this.signaling.destroy();
|
|
48
|
+
this.previousParticipants.clear();
|
|
49
|
+
this.currentTurnToken = null;
|
|
50
|
+
this.currentHostPeerId = null;
|
|
51
|
+
}
|
|
52
|
+
joinRoom(roomId, options) {
|
|
53
|
+
this.previousParticipants.clear();
|
|
54
|
+
this.signaling.joinRoom(roomId, {
|
|
55
|
+
createMaxParticipants: options?.maxParticipants,
|
|
56
|
+
displayName: options?.displayName,
|
|
57
|
+
peerId: options?.appPeerId,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
leaveRoom() {
|
|
61
|
+
this.previousParticipants.clear();
|
|
62
|
+
this.currentTurnToken = null;
|
|
63
|
+
this.currentHostPeerId = null;
|
|
64
|
+
this.signaling.leaveRoom();
|
|
65
|
+
}
|
|
66
|
+
endRoom() {
|
|
67
|
+
this.signaling.endRoom();
|
|
68
|
+
}
|
|
69
|
+
sendToPeer(peerId, type, payload) {
|
|
70
|
+
this.signaling.sendMessage(type, toRecordPayload(payload), peerId);
|
|
71
|
+
}
|
|
72
|
+
broadcast(type, payload) {
|
|
73
|
+
this.signaling.sendMessage(type, toRecordPayload(payload));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Install (or clear) a gate consulted before each periodic TURN refresh.
|
|
77
|
+
* The gate returns false to skip the refresh — used by the session to
|
|
78
|
+
* suppress refreshes while every peer is on a direct ICE path, so the
|
|
79
|
+
* call remains independent of signaling for the refresh cadence.
|
|
80
|
+
*/
|
|
81
|
+
setTurnRefreshGate(gate) {
|
|
82
|
+
this.signaling.setTurnRefreshGate(gate);
|
|
83
|
+
}
|
|
84
|
+
async getIceServers() {
|
|
85
|
+
const token = this.currentTurnToken?.trim();
|
|
86
|
+
if (!token) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
const controller = new AbortController();
|
|
90
|
+
const timeout = globalThis.setTimeout(() => controller.abort(), TURN_FETCH_TIMEOUT_MS);
|
|
91
|
+
try {
|
|
92
|
+
const response = await fetch(buildApiUrl(this.serverHost, `/api/turn-credentials?token=${encodeURIComponent(token)}`), { signal: controller.signal });
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(`TURN credentials request failed: ${response.status}`);
|
|
95
|
+
}
|
|
96
|
+
const data = await response.json();
|
|
97
|
+
const uris = Array.isArray(data.uris)
|
|
98
|
+
? data.uris.filter((uri) => typeof uri === 'string' && uri.trim().length > 0)
|
|
99
|
+
: [];
|
|
100
|
+
if (uris.length === 0) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
return [{
|
|
104
|
+
urls: uris,
|
|
105
|
+
username: typeof data.username === 'string' ? data.username : undefined,
|
|
106
|
+
credential: typeof data.password === 'string' ? data.password : undefined,
|
|
107
|
+
}];
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
globalThis.clearTimeout(timeout);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
handleStateChange() {
|
|
114
|
+
const connected = this.signaling.isConnected;
|
|
115
|
+
if (connected === this.lastConnected) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.lastConnected = connected;
|
|
119
|
+
if (connected) {
|
|
120
|
+
this.emit('connected', {
|
|
121
|
+
transport: this.signaling.activeTransport ?? undefined,
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.emit('disconnected', undefined);
|
|
126
|
+
}
|
|
127
|
+
handleMessage(message) {
|
|
128
|
+
switch (message.type) {
|
|
129
|
+
case 'joined':
|
|
130
|
+
this.handleJoined(message);
|
|
131
|
+
break;
|
|
132
|
+
case 'room_state':
|
|
133
|
+
this.handleRoomState(message);
|
|
134
|
+
break;
|
|
135
|
+
case 'room_ended':
|
|
136
|
+
this.previousParticipants.clear();
|
|
137
|
+
this.emitRoomEnded(message.payload);
|
|
138
|
+
break;
|
|
139
|
+
case 'error': {
|
|
140
|
+
const error = parseErrorPayload(message.payload);
|
|
141
|
+
if (error) {
|
|
142
|
+
this.emit('error', error);
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case 'turn-refreshed': {
|
|
147
|
+
const refreshed = parseTurnRefreshedPayload(message.payload);
|
|
148
|
+
if (!refreshed) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
this.currentTurnToken = refreshed.turnToken;
|
|
152
|
+
void this.refreshIceServers();
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'offer':
|
|
156
|
+
case 'answer':
|
|
157
|
+
case 'ice':
|
|
158
|
+
case 'content_state':
|
|
159
|
+
case 'participant_media_state':
|
|
160
|
+
this.emitPeerMessage(message);
|
|
161
|
+
break;
|
|
162
|
+
case 'negotiation_dirty': {
|
|
163
|
+
const dirty = parseNegotiationDirtyPayload(message.payload);
|
|
164
|
+
if (dirty) {
|
|
165
|
+
this.emit('negotiationDirty', { withCid: dirty.with });
|
|
166
|
+
}
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case 'relay_failed': {
|
|
170
|
+
const failed = parseRelayFailedPayload(message.payload);
|
|
171
|
+
if (failed) {
|
|
172
|
+
this.emit('relayFailed', failed);
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
emitRoomEnded(payload) {
|
|
179
|
+
const by = roomEndedBy(payload) ?? this.currentHostPeerId ?? undefined;
|
|
180
|
+
const event = {
|
|
181
|
+
reason: roomEndedReason(payload) ?? 'room ended',
|
|
182
|
+
};
|
|
183
|
+
if (by) {
|
|
184
|
+
event.by = by;
|
|
185
|
+
}
|
|
186
|
+
this.emit('roomEnded', event);
|
|
187
|
+
}
|
|
188
|
+
handleJoined(message) {
|
|
189
|
+
const payload = parseJoinedPayload(message.payload);
|
|
190
|
+
if (!payload || !message.cid) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (payload.turnToken) {
|
|
194
|
+
this.currentTurnToken = payload.turnToken;
|
|
195
|
+
}
|
|
196
|
+
const event = {
|
|
197
|
+
peerId: message.cid,
|
|
198
|
+
participants: payload.participants.map(mapParticipant),
|
|
199
|
+
hostPeerId: payload.hostCid ?? undefined,
|
|
200
|
+
maxParticipants: payload.maxParticipants,
|
|
201
|
+
};
|
|
202
|
+
this.currentHostPeerId = event.hostPeerId ?? null;
|
|
203
|
+
this.previousParticipants = toParticipantMap(event.participants);
|
|
204
|
+
this.emit('joined', event);
|
|
205
|
+
}
|
|
206
|
+
handleRoomState(message) {
|
|
207
|
+
const payload = parseRoomStatePayload(message.payload);
|
|
208
|
+
if (!payload) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (typeof message.payload?.turnToken === 'string') {
|
|
212
|
+
this.currentTurnToken = message.payload.turnToken;
|
|
213
|
+
}
|
|
214
|
+
const nextState = {
|
|
215
|
+
participants: payload.participants.map(mapParticipant),
|
|
216
|
+
hostPeerId: payload.hostCid ?? undefined,
|
|
217
|
+
maxParticipants: payload.maxParticipants,
|
|
218
|
+
};
|
|
219
|
+
const nextMap = toParticipantMap(nextState.participants);
|
|
220
|
+
this.emitParticipantDiffs(this.previousParticipants, nextMap);
|
|
221
|
+
this.previousParticipants = nextMap;
|
|
222
|
+
this.currentHostPeerId = nextState.hostPeerId ?? null;
|
|
223
|
+
this.emit('roomStateUpdated', nextState);
|
|
224
|
+
}
|
|
225
|
+
emitParticipantDiffs(previous, next) {
|
|
226
|
+
for (const [peerId, participant] of next) {
|
|
227
|
+
if (!previous.has(peerId)) {
|
|
228
|
+
this.emit('peerJoined', participant);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
for (const [peerId, participant] of previous) {
|
|
232
|
+
if (!next.has(peerId)) {
|
|
233
|
+
this.emit('peerLeft', participant);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
emitPeerMessage(message) {
|
|
238
|
+
const payload = message.payload;
|
|
239
|
+
const from = typeof payload?.from === 'string'
|
|
240
|
+
? payload.from
|
|
241
|
+
: (typeof message.cid === 'string' ? message.cid : null);
|
|
242
|
+
if (!from) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.emit('message', {
|
|
246
|
+
from,
|
|
247
|
+
type: message.type,
|
|
248
|
+
payload: payload ?? {},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async refreshIceServers() {
|
|
252
|
+
try {
|
|
253
|
+
const servers = await this.getIceServers();
|
|
254
|
+
this.emit('iceServersChanged', servers);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
this.logger?.log('warning', 'Signaling', `Failed to refresh ICE servers: ${formatError(error)}`);
|
|
258
|
+
this.emit('error', {
|
|
259
|
+
code: 'TURN_REFRESH_FAILED',
|
|
260
|
+
message: formatError(error),
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function mapParticipant(participant) {
|
|
266
|
+
return {
|
|
267
|
+
peerId: participant.cid,
|
|
268
|
+
joinedAt: participant.joinedAt,
|
|
269
|
+
displayName: participant.displayName,
|
|
270
|
+
appPeerId: participant.peerId,
|
|
271
|
+
audioEnabled: participant.audioEnabled,
|
|
272
|
+
videoEnabled: participant.videoEnabled,
|
|
273
|
+
connectionStatus: participant.connectionStatus,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function toParticipantMap(participants) {
|
|
277
|
+
return new Map(participants.map((participant) => [participant.peerId, participant]));
|
|
278
|
+
}
|
|
279
|
+
function toRecordPayload(payload) {
|
|
280
|
+
if (payload === undefined) {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
if (payload && typeof payload === 'object' && !Array.isArray(payload)) {
|
|
284
|
+
return payload;
|
|
285
|
+
}
|
|
286
|
+
return { value: payload };
|
|
287
|
+
}
|
|
288
|
+
function roomEndedBy(payload) {
|
|
289
|
+
const by = payload?.by;
|
|
290
|
+
return typeof by === 'string' && by.trim().length > 0 ? by : null;
|
|
291
|
+
}
|
|
292
|
+
function roomEndedReason(payload) {
|
|
293
|
+
const reason = payload?.reason;
|
|
294
|
+
return typeof reason === 'string' && reason.trim().length > 0 ? reason : null;
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=SerenadaServerProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerenadaServerProvider.js","sourceRoot":"","sources":["../src/SerenadaServerProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { CallState, CallStats, CameraMode, MediaCapability, SerenadaConfig, SerenadaSessionHandle } from './types.js';
|
|
2
|
+
import type { PeerMessage, SignalingProvider } from './SignalingProvider.js';
|
|
3
|
+
import { MediaEngine } from './media/MediaEngine.js';
|
|
4
|
+
import { CallStatsCollector } from './media/callStats.js';
|
|
5
|
+
interface SessionDependencies {
|
|
6
|
+
media?: MediaEngine;
|
|
7
|
+
statsCollector?: CallStatsCollector;
|
|
8
|
+
autoStart?: boolean;
|
|
9
|
+
displayName?: string;
|
|
10
|
+
peerId?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Represents an active call session. Created via {@link SerenadaCore.join} or
|
|
14
|
+
* {@link SerenadaCore.createRoom}. Manages media, signaling, and call state.
|
|
15
|
+
*/
|
|
16
|
+
export declare class SerenadaSession implements SerenadaSessionHandle {
|
|
17
|
+
private readonly signaling;
|
|
18
|
+
private readonly media;
|
|
19
|
+
private readonly statsCollector;
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly roomId;
|
|
22
|
+
private readonly roomUrl;
|
|
23
|
+
private readonly handlesReconnection;
|
|
24
|
+
private readonly displayName?;
|
|
25
|
+
private readonly appPeerId?;
|
|
26
|
+
private _state;
|
|
27
|
+
private stateListeners;
|
|
28
|
+
private readonly peerMessageListeners;
|
|
29
|
+
private readonly providerUnsubscribers;
|
|
30
|
+
private _destroyed;
|
|
31
|
+
private permissionCheckDone;
|
|
32
|
+
private permissionCheckInFlight;
|
|
33
|
+
private endingTimer;
|
|
34
|
+
private joinTimeoutTimer;
|
|
35
|
+
private reconnectTimer;
|
|
36
|
+
private reconnectAttempts;
|
|
37
|
+
private pendingJoinOptions;
|
|
38
|
+
private joinInFlight;
|
|
39
|
+
private reconnectRecoveryPending;
|
|
40
|
+
private pendingPostReconnectResync;
|
|
41
|
+
private postReconnectResyncTimer;
|
|
42
|
+
private iceFetchGeneration;
|
|
43
|
+
private started;
|
|
44
|
+
private terminated;
|
|
45
|
+
private isConnected;
|
|
46
|
+
private activeTransport;
|
|
47
|
+
private clientId;
|
|
48
|
+
private roomState;
|
|
49
|
+
private error;
|
|
50
|
+
private readonly remoteMediaStates;
|
|
51
|
+
private readonly availableCameraModes;
|
|
52
|
+
private userPreferredVideoEnabled;
|
|
53
|
+
private localSuspendedSinceMs;
|
|
54
|
+
private readonly suspendedPresentationTimers;
|
|
55
|
+
private readonly presumedLostRemoteCids;
|
|
56
|
+
private mediaLivenessTimer;
|
|
57
|
+
private mediaLivenessEmitInFlight;
|
|
58
|
+
private get isInactive();
|
|
59
|
+
onPermissionsRequired: ((permissions: MediaCapability[]) => void) | null;
|
|
60
|
+
constructor(config: SerenadaConfig, roomId: string, roomUrl: string | null, signaling: SignalingProvider, deps?: SessionDependencies);
|
|
61
|
+
/** Current call state. Subscribe via {@link subscribe} for updates. */
|
|
62
|
+
get state(): CallState;
|
|
63
|
+
/** Local media stream (camera/microphone), or `null` before media is acquired. */
|
|
64
|
+
get localStream(): MediaStream | null;
|
|
65
|
+
/** Map of remote participant CID to their media stream. */
|
|
66
|
+
get remoteStreams(): Map<string, MediaStream>;
|
|
67
|
+
/** Current WebRTC call statistics, or `null` if not yet collecting. */
|
|
68
|
+
get callStats(): CallStats | null;
|
|
69
|
+
get hasMultipleCameras(): boolean;
|
|
70
|
+
get canScreenShare(): boolean;
|
|
71
|
+
get isSignalingConnected(): boolean;
|
|
72
|
+
get iceConnectionState(): RTCIceConnectionState;
|
|
73
|
+
get peerConnectionState(): RTCPeerConnectionState;
|
|
74
|
+
get rtcSignalingState(): RTCSignalingState;
|
|
75
|
+
/** Subscribe to state changes. Returns an unsubscribe function. */
|
|
76
|
+
subscribe(callback: (state: CallState) => void): () => void;
|
|
77
|
+
onPeerMessage(callback: (message: PeerMessage) => void): () => void;
|
|
78
|
+
/** Resume joining after media permissions have been granted. */
|
|
79
|
+
resumeJoin(): Promise<void>;
|
|
80
|
+
/** Cancel an in-progress join and destroy the session. */
|
|
81
|
+
cancelJoin(): void;
|
|
82
|
+
/** Leave the call gracefully. The other participant stays connected. */
|
|
83
|
+
leave(): void;
|
|
84
|
+
/** End the call for all participants. */
|
|
85
|
+
end(): void;
|
|
86
|
+
/** Toggle local audio on/off. */
|
|
87
|
+
toggleAudio(): void;
|
|
88
|
+
/** Toggle local video on/off. */
|
|
89
|
+
toggleVideo(): void;
|
|
90
|
+
/** Set local audio enabled state explicitly. */
|
|
91
|
+
setAudioEnabled(enabled: boolean): void;
|
|
92
|
+
/** Set local video enabled state explicitly. */
|
|
93
|
+
setVideoEnabled(enabled: boolean): void;
|
|
94
|
+
/** Switch camera mode (selfie/world). Composite is not available on web. */
|
|
95
|
+
setCameraMode(mode: CameraMode): void;
|
|
96
|
+
/** Cycle to the next camera mode in the configured order. */
|
|
97
|
+
flipCamera(): Promise<void>;
|
|
98
|
+
/** Start sharing the screen, replacing the camera video track. */
|
|
99
|
+
startScreenShare(): Promise<void>;
|
|
100
|
+
/** Stop screen sharing and restore the camera video track. */
|
|
101
|
+
stopScreenShare(): Promise<void>;
|
|
102
|
+
/** Clean up all resources. Call when done with the session. */
|
|
103
|
+
destroy(): void;
|
|
104
|
+
private start;
|
|
105
|
+
private bindProviderEvents;
|
|
106
|
+
private bindProviderEvent;
|
|
107
|
+
private readonly handleConnected;
|
|
108
|
+
private readonly handleDisconnected;
|
|
109
|
+
private readonly handleJoined;
|
|
110
|
+
private readonly handleRoomStateUpdated;
|
|
111
|
+
private readonly handlePeerJoined;
|
|
112
|
+
private readonly handlePeerLeft;
|
|
113
|
+
private readonly handlePeerMessage;
|
|
114
|
+
private readonly handleRoomEnded;
|
|
115
|
+
private readonly handleError;
|
|
116
|
+
private readonly handleIceServersChanged;
|
|
117
|
+
private readonly handleNegotiationDirty;
|
|
118
|
+
private readonly handleRelayFailed;
|
|
119
|
+
private fetchInitialIceServers;
|
|
120
|
+
private isCurrentIceFetch;
|
|
121
|
+
private invalidateIceFetches;
|
|
122
|
+
private wait;
|
|
123
|
+
private scheduleJoinTimeout;
|
|
124
|
+
private clearJoinTimeout;
|
|
125
|
+
private scheduleReconnect;
|
|
126
|
+
private clearReconnectTimer;
|
|
127
|
+
private armPostReconnectResync;
|
|
128
|
+
private flushPostReconnectResync;
|
|
129
|
+
private cancelPostReconnectResync;
|
|
130
|
+
private clearEndingTimer;
|
|
131
|
+
private resetSessionResources;
|
|
132
|
+
private commitTerminalState;
|
|
133
|
+
private cleanupCall;
|
|
134
|
+
private failWithError;
|
|
135
|
+
private setTrackEnabled;
|
|
136
|
+
private broadcastLocalMediaState;
|
|
137
|
+
private handleRemoteMediaState;
|
|
138
|
+
private rebuildState;
|
|
139
|
+
/**
|
|
140
|
+
* Compute the public {@link SignalingState} surface from current internal
|
|
141
|
+
* state. Mid-call transport drops surface as `suspended` (carries
|
|
142
|
+
* `suspendedSinceMs` + estimated hard-eviction deadline); pre-join drops
|
|
143
|
+
* surface as `reconnecting`. Terminal errors map to `failed`.
|
|
144
|
+
*/
|
|
145
|
+
private computeSignalingState;
|
|
146
|
+
/**
|
|
147
|
+
* Walk the latest authoritative participant list and start/cancel per-CID
|
|
148
|
+
* suspended-presentation timers. Cancels cleanly when peers go back to
|
|
149
|
+
* active or are removed; flips `presumedLost=true` on timer expiry.
|
|
150
|
+
*
|
|
151
|
+
* "Already presumed lost" is a sticky state: once the timer has fired,
|
|
152
|
+
* we don't reschedule a new one if the peer remains suspended across
|
|
153
|
+
* subsequent room_state updates. The flag clears the moment the peer
|
|
154
|
+
* transitions back to active or leaves the room.
|
|
155
|
+
*/
|
|
156
|
+
private reconcileRemoteSuspensionTimers;
|
|
157
|
+
private startRemoteSuspensionTimer;
|
|
158
|
+
/**
|
|
159
|
+
* Clear all per-CID suspension state (timer + presumed-lost flag).
|
|
160
|
+
* Called when a peer transitions back to active, leaves the room, or
|
|
161
|
+
* the session is reset.
|
|
162
|
+
*/
|
|
163
|
+
private clearRemoteSuspensionTracking;
|
|
164
|
+
private clearAllRemoteSuspensionTracking;
|
|
165
|
+
/**
|
|
166
|
+
* Periodic `media_liveness{cids}` emission for #3. Started once we have
|
|
167
|
+
* remote peers (i.e. the call reaches `inCall`); runs across reconnects
|
|
168
|
+
* (ticks no-op while disconnected but baseline samples persist so the
|
|
169
|
+
* next post-reconnect tick can detect flow). Stopped on session
|
|
170
|
+
* reset/destroy.
|
|
171
|
+
*/
|
|
172
|
+
private maybeStartMediaLivenessTimer;
|
|
173
|
+
private stopMediaLivenessTimer;
|
|
174
|
+
private emitMediaLiveness;
|
|
175
|
+
private checkPermissionsAndStartMedia;
|
|
176
|
+
private ensureStatsCollection;
|
|
177
|
+
private notifyListeners;
|
|
178
|
+
}
|
|
179
|
+
export {};
|
|
180
|
+
//# sourceMappingURL=SerenadaSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerenadaSession.d.ts","sourceRoot":"","sources":["../src/SerenadaSession.ts"],"names":[],"mappings":"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"}
|