@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.
Files changed (156) hide show
  1. package/dist/ConsoleLogger.d.ts +6 -0
  2. package/dist/ConsoleLogger.d.ts.map +1 -0
  3. package/dist/ConsoleLogger.js +21 -0
  4. package/dist/ConsoleLogger.js.map +1 -0
  5. package/dist/RoomWatcher.d.ts +34 -0
  6. package/dist/RoomWatcher.d.ts.map +1 -0
  7. package/dist/RoomWatcher.js +103 -0
  8. package/dist/RoomWatcher.js.map +1 -0
  9. package/dist/SerenadaCore.d.ts +47 -0
  10. package/dist/SerenadaCore.d.ts.map +1 -0
  11. package/dist/SerenadaCore.js +141 -0
  12. package/dist/SerenadaCore.js.map +1 -0
  13. package/dist/SerenadaDiagnostics.d.ts +49 -0
  14. package/dist/SerenadaDiagnostics.d.ts.map +1 -0
  15. package/dist/SerenadaDiagnostics.js +421 -0
  16. package/dist/SerenadaDiagnostics.js.map +1 -0
  17. package/dist/SerenadaServerProvider.d.ts +48 -0
  18. package/dist/SerenadaServerProvider.d.ts.map +1 -0
  19. package/dist/SerenadaServerProvider.js +296 -0
  20. package/dist/SerenadaServerProvider.js.map +1 -0
  21. package/dist/SerenadaSession.d.ts +180 -0
  22. package/dist/SerenadaSession.d.ts.map +1 -0
  23. package/dist/SerenadaSession.js +1082 -0
  24. package/dist/SerenadaSession.js.map +1 -0
  25. package/dist/SignalingProvider.d.ts +132 -0
  26. package/dist/SignalingProvider.d.ts.map +1 -0
  27. package/dist/SignalingProvider.js +50 -0
  28. package/dist/SignalingProvider.js.map +1 -0
  29. package/dist/api/roomApi.d.ts +2 -0
  30. package/dist/api/roomApi.d.ts.map +1 -0
  31. package/dist/api/roomApi.js +14 -0
  32. package/dist/api/roomApi.js.map +1 -0
  33. package/dist/cameraModes.d.ts +13 -0
  34. package/dist/cameraModes.d.ts.map +1 -0
  35. package/dist/cameraModes.js +35 -0
  36. package/dist/cameraModes.js.map +1 -0
  37. package/dist/configValidation.d.ts +10 -0
  38. package/dist/configValidation.d.ts.map +1 -0
  39. package/dist/configValidation.js +24 -0
  40. package/dist/configValidation.js.map +1 -0
  41. package/dist/constants.d.ts +33 -0
  42. package/dist/constants.d.ts.map +1 -0
  43. package/dist/constants.js +65 -0
  44. package/dist/constants.js.map +1 -0
  45. package/dist/formatError.d.ts +3 -0
  46. package/dist/formatError.d.ts.map +1 -0
  47. package/dist/formatError.js +7 -0
  48. package/dist/formatError.js.map +1 -0
  49. package/dist/iceServers.d.ts +2 -0
  50. package/dist/iceServers.d.ts.map +1 -0
  51. package/dist/iceServers.js +21 -0
  52. package/dist/iceServers.js.map +1 -0
  53. package/dist/index.d.ts +55 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +44 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/layout/computeLayout.d.ts +81 -0
  58. package/dist/layout/computeLayout.d.ts.map +1 -0
  59. package/dist/layout/computeLayout.js +380 -0
  60. package/dist/layout/computeLayout.js.map +1 -0
  61. package/dist/media/AudioLevelMonitor.d.ts +51 -0
  62. package/dist/media/AudioLevelMonitor.d.ts.map +1 -0
  63. package/dist/media/AudioLevelMonitor.js +179 -0
  64. package/dist/media/AudioLevelMonitor.js.map +1 -0
  65. package/dist/media/MediaEngine.d.ts +137 -0
  66. package/dist/media/MediaEngine.d.ts.map +1 -0
  67. package/dist/media/MediaEngine.js +1224 -0
  68. package/dist/media/MediaEngine.js.map +1 -0
  69. package/dist/media/callStats.d.ts +16 -0
  70. package/dist/media/callStats.d.ts.map +1 -0
  71. package/dist/media/callStats.js +214 -0
  72. package/dist/media/callStats.js.map +1 -0
  73. package/dist/media/localVideoRecovery.d.ts +16 -0
  74. package/dist/media/localVideoRecovery.d.ts.map +1 -0
  75. package/dist/media/localVideoRecovery.js +14 -0
  76. package/dist/media/localVideoRecovery.js.map +1 -0
  77. package/dist/recoveryStorage.d.ts +33 -0
  78. package/dist/recoveryStorage.d.ts.map +1 -0
  79. package/dist/recoveryStorage.js +88 -0
  80. package/dist/recoveryStorage.js.map +1 -0
  81. package/dist/serverUrls.d.ts +8 -0
  82. package/dist/serverUrls.d.ts.map +1 -0
  83. package/dist/serverUrls.js +65 -0
  84. package/dist/serverUrls.js.map +1 -0
  85. package/dist/signaling/SignalingEngine.d.ts +126 -0
  86. package/dist/signaling/SignalingEngine.d.ts.map +1 -0
  87. package/dist/signaling/SignalingEngine.js +720 -0
  88. package/dist/signaling/SignalingEngine.js.map +1 -0
  89. package/dist/signaling/payloads.d.ts +76 -0
  90. package/dist/signaling/payloads.d.ts.map +1 -0
  91. package/dist/signaling/payloads.js +160 -0
  92. package/dist/signaling/payloads.js.map +1 -0
  93. package/dist/signaling/roomStatuses.d.ts +9 -0
  94. package/dist/signaling/roomStatuses.d.ts.map +1 -0
  95. package/dist/signaling/roomStatuses.js +71 -0
  96. package/dist/signaling/roomStatuses.js.map +1 -0
  97. package/dist/signaling/transportConfig.d.ts +3 -0
  98. package/dist/signaling/transportConfig.d.ts.map +1 -0
  99. package/dist/signaling/transportConfig.js +27 -0
  100. package/dist/signaling/transportConfig.js.map +1 -0
  101. package/dist/signaling/transports/index.d.ts +13 -0
  102. package/dist/signaling/transports/index.d.ts.map +1 -0
  103. package/dist/signaling/transports/index.js +11 -0
  104. package/dist/signaling/transports/index.js.map +1 -0
  105. package/dist/signaling/transports/sse.d.ts +26 -0
  106. package/dist/signaling/transports/sse.d.ts.map +1 -0
  107. package/dist/signaling/transports/sse.js +131 -0
  108. package/dist/signaling/transports/sse.js.map +1 -0
  109. package/dist/signaling/transports/types.d.ts +17 -0
  110. package/dist/signaling/transports/types.d.ts.map +1 -0
  111. package/dist/signaling/transports/types.js +2 -0
  112. package/dist/signaling/transports/types.js.map +1 -0
  113. package/dist/signaling/transports/ws.d.ts +21 -0
  114. package/dist/signaling/transports/ws.d.ts.map +1 -0
  115. package/dist/signaling/transports/ws.js +93 -0
  116. package/dist/signaling/transports/ws.js.map +1 -0
  117. package/dist/signaling/types.d.ts +53 -0
  118. package/dist/signaling/types.d.ts.map +1 -0
  119. package/dist/signaling/types.js +2 -0
  120. package/dist/signaling/types.js.map +1 -0
  121. package/dist/types.d.ts +279 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +3 -0
  124. package/dist/types.js.map +1 -0
  125. package/package.json +43 -0
  126. package/src/ConsoleLogger.ts +14 -0
  127. package/src/RoomWatcher.ts +127 -0
  128. package/src/SerenadaCore.ts +163 -0
  129. package/src/SerenadaDiagnostics.ts +485 -0
  130. package/src/SerenadaServerProvider.ts +362 -0
  131. package/src/SerenadaSession.ts +1258 -0
  132. package/src/SignalingProvider.ts +207 -0
  133. package/src/api/roomApi.ts +16 -0
  134. package/src/cameraModes.ts +34 -0
  135. package/src/configValidation.ts +35 -0
  136. package/src/constants.ts +77 -0
  137. package/src/formatError.ts +5 -0
  138. package/src/iceServers.ts +20 -0
  139. package/src/index.ts +155 -0
  140. package/src/layout/computeLayout.ts +639 -0
  141. package/src/media/AudioLevelMonitor.ts +190 -0
  142. package/src/media/MediaEngine.ts +1183 -0
  143. package/src/media/callStats.ts +260 -0
  144. package/src/media/localVideoRecovery.ts +39 -0
  145. package/src/recoveryStorage.ts +101 -0
  146. package/src/serverUrls.ts +69 -0
  147. package/src/signaling/SignalingEngine.ts +762 -0
  148. package/src/signaling/payloads.ts +215 -0
  149. package/src/signaling/roomStatuses.ts +89 -0
  150. package/src/signaling/transportConfig.ts +30 -0
  151. package/src/signaling/transports/index.ts +26 -0
  152. package/src/signaling/transports/sse.ts +146 -0
  153. package/src/signaling/transports/types.ts +19 -0
  154. package/src/signaling/transports/ws.ts +108 -0
  155. package/src/signaling/types.ts +68 -0
  156. package/src/types.ts +299 -0
@@ -0,0 +1,421 @@
1
+ import { buildApiUrl, resolveServerBaseUrl, resolveServerUrls } from './serverUrls.js';
2
+ import { resolveSerenadaConfig } from './configValidation.js';
3
+ import { formatError } from './formatError.js';
4
+ import { normalizeIceServers } from './iceServers.js';
5
+ /**
6
+ * Pre-flight diagnostics utility. Checks device capabilities (camera, mic, speaker)
7
+ * and server connectivity (signaling, TURN) before joining a call.
8
+ */
9
+ export class SerenadaDiagnostics {
10
+ resolvedConfig;
11
+ constructor(config) {
12
+ this.resolvedConfig = resolveSerenadaConfig(config);
13
+ }
14
+ /** Run all diagnostic checks and return a full report. */
15
+ async runAll() {
16
+ const devicesPromise = this.enumerateDevices();
17
+ const networkPromise = this.checkNetwork();
18
+ const turnPromise = this.checkTurn();
19
+ const signalingPromise = this.resolvedConfig.serverHost
20
+ ? this.checkSignaling()
21
+ : Promise.resolve({ status: 'skipped', reason: 'requires serverHost' });
22
+ const [devices, network, signaling, turn] = await Promise.all([
23
+ devicesPromise,
24
+ networkPromise,
25
+ signalingPromise,
26
+ turnPromise,
27
+ ]);
28
+ const camera = this.checkMediaCapability(devices, 'videoinput', 'No camera found');
29
+ const microphone = this.checkMediaCapability(devices, 'audioinput', 'No microphone found');
30
+ const speaker = this.checkDeviceAvailability(devices, 'audiooutput', 'No speaker found');
31
+ return { camera, microphone, speaker, network, signaling, turn, devices };
32
+ }
33
+ /** Test server connectivity: room API, WebSocket, SSE, and TURN credentials. */
34
+ async runConnectivityChecks() {
35
+ const serverHost = this.resolvedConfig.serverHost;
36
+ if (!serverHost)
37
+ throw new Error('requires serverHost');
38
+ // Fetch the diagnostic token once and reuse it for the TURN credentials check.
39
+ let tokenForTurn;
40
+ const [roomApi, webSocket, sse, diagnosticToken] = await Promise.all([
41
+ this.runTimedCheck(async () => {
42
+ await this.createRoomId(serverHost);
43
+ }),
44
+ this.runTimedCheck(async () => {
45
+ await this.testWebSocket(serverHost);
46
+ }),
47
+ this.runTimedCheck(async () => {
48
+ await this.testSse(serverHost);
49
+ }),
50
+ this.runTimedCheck(async () => {
51
+ tokenForTurn = await this.fetchDiagnosticToken(serverHost);
52
+ }),
53
+ ]);
54
+ const turnCredentials = await this.runTimedCheck(async () => {
55
+ const token = tokenForTurn ?? await this.fetchDiagnosticToken(serverHost);
56
+ await this.fetchTurnCredentials(serverHost, token);
57
+ });
58
+ return { roomApi, webSocket, sse, diagnosticToken, turnCredentials };
59
+ }
60
+ /** Probe ICE connectivity using the active server or provider ICE source. */
61
+ async runTurnProbe(turnsOnly, onCandidateLog) {
62
+ try {
63
+ const iceServers = await this.resolveIceServers();
64
+ return await this.gatherIceCandidates(iceServers, turnsOnly, onCandidateLog);
65
+ }
66
+ catch (err) {
67
+ return { stunPassed: false, turnPassed: false, logs: [formatError(err)] };
68
+ }
69
+ }
70
+ /** Probe ICE connectivity (STUN/TURN) by gathering candidates with a real peer connection. */
71
+ async runIceProbe(turnsOnly, onCandidateLog) {
72
+ return this.runTurnProbe(turnsOnly, onCandidateLog);
73
+ }
74
+ /** Validate that a server host is reachable by requesting a room ID. */
75
+ async validateServerHost(host) {
76
+ if (!host) {
77
+ const resolved = this.resolvedConfig.serverHost;
78
+ if (!resolved)
79
+ throw new Error('requires serverHost');
80
+ host = resolved;
81
+ }
82
+ const response = await this.fetchJson(buildApiUrl(host, '/api/room-id'), {
83
+ method: 'GET',
84
+ timeoutMs: 5000,
85
+ });
86
+ if (typeof response.roomId !== 'string' || response.roomId.trim().length === 0) {
87
+ throw new Error('Room ID missing');
88
+ }
89
+ }
90
+ /** Check if a camera is available and authorized. */
91
+ async checkCamera() {
92
+ const devices = await this.enumerateDevices();
93
+ return this.checkMediaCapability(devices, 'videoinput', 'No camera found');
94
+ }
95
+ /** Check if a microphone is available and authorized. */
96
+ async checkMicrophone() {
97
+ const devices = await this.enumerateDevices();
98
+ return this.checkMediaCapability(devices, 'audioinput', 'No microphone found');
99
+ }
100
+ /** Check if a speaker/audio output device is available. */
101
+ async checkSpeaker() {
102
+ const devices = await this.enumerateDevices();
103
+ return this.checkDeviceAvailability(devices, 'audiooutput', 'No speaker found');
104
+ }
105
+ /** Check if the browser reports network connectivity. */
106
+ async checkNetwork() {
107
+ try {
108
+ if (!navigator.onLine)
109
+ return { status: 'unavailable', reason: 'Browser reports offline' };
110
+ return { status: 'available' };
111
+ }
112
+ catch (err) {
113
+ return { status: 'skipped', reason: String(err) };
114
+ }
115
+ }
116
+ /** Check if the signaling server is reachable. */
117
+ async checkSignaling() {
118
+ const serverHost = this.resolvedConfig.serverHost;
119
+ if (!serverHost) {
120
+ return { status: 'skipped', reason: 'requires serverHost' };
121
+ }
122
+ try {
123
+ const controller = new AbortController();
124
+ const timeout = setTimeout(() => controller.abort(), 5000);
125
+ const res = await fetch(buildApiUrl(serverHost, '/api/room-id'), {
126
+ method: 'GET',
127
+ signal: controller.signal,
128
+ });
129
+ clearTimeout(timeout);
130
+ if (res.ok || res.status === 405) {
131
+ return { status: 'available', transport: 'ws' };
132
+ }
133
+ return { status: 'unavailable', reason: `Server returned ${res.status}` };
134
+ }
135
+ catch (err) {
136
+ return { status: 'unavailable', reason: String(err) };
137
+ }
138
+ }
139
+ /** Check if the TURN relay endpoint is reachable. */
140
+ async checkTurn() {
141
+ const serverHost = this.resolvedConfig.serverHost;
142
+ if (!serverHost) {
143
+ try {
144
+ await this.resolveIceServers();
145
+ return { status: 'available' };
146
+ }
147
+ catch (err) {
148
+ return { status: 'unavailable', reason: String(err) };
149
+ }
150
+ }
151
+ try {
152
+ const start = Date.now();
153
+ const res = await this.fetchResponse(buildApiUrl(serverHost, '/api/turn-credentials?token=probe'), {
154
+ timeoutMs: 5000,
155
+ });
156
+ const latencyMs = Date.now() - start;
157
+ if (res.ok) {
158
+ return { status: 'available', latencyMs };
159
+ }
160
+ // 401/403 is expected without a valid token but means the endpoint is reachable
161
+ if (res.status === 401 || res.status === 403) {
162
+ return { status: 'available', latencyMs };
163
+ }
164
+ return { status: 'unavailable', reason: `TURN endpoint returned ${res.status}` };
165
+ }
166
+ catch (err) {
167
+ return { status: 'unavailable', reason: String(err) };
168
+ }
169
+ }
170
+ checkMediaCapability(devices, deviceKind, notFoundMsg) {
171
+ const matching = devices.filter(d => d.kind === deviceKind);
172
+ // If labels are empty, permissions haven't been granted yet
173
+ if (matching.length > 0 && matching.every(d => !d.label)) {
174
+ return { status: 'notAuthorized' };
175
+ }
176
+ if (matching.length === 0)
177
+ return { status: 'unavailable', reason: notFoundMsg };
178
+ return { status: 'available' };
179
+ }
180
+ checkDeviceAvailability(devices, deviceKind, notFoundMsg) {
181
+ const matching = devices.filter(d => d.kind === deviceKind);
182
+ if (matching.length === 0)
183
+ return { status: 'unavailable', reason: notFoundMsg };
184
+ return { status: 'available' };
185
+ }
186
+ async enumerateDevices() {
187
+ try {
188
+ if (!navigator.mediaDevices?.enumerateDevices)
189
+ return [];
190
+ return await navigator.mediaDevices.enumerateDevices();
191
+ }
192
+ catch {
193
+ return [];
194
+ }
195
+ }
196
+ async runTimedCheck(block) {
197
+ const start = Date.now();
198
+ try {
199
+ await block();
200
+ return { status: 'passed', latencyMs: Date.now() - start };
201
+ }
202
+ catch (err) {
203
+ return { status: 'failed', error: formatError(err) };
204
+ }
205
+ }
206
+ async createRoomId(serverHost) {
207
+ const response = await this.fetchJson(buildApiUrl(serverHost, '/api/room-id'), {
208
+ method: 'POST',
209
+ headers: { 'Content-Type': 'application/json' },
210
+ body: '',
211
+ timeoutMs: 5000,
212
+ });
213
+ if (typeof response.roomId !== 'string' || response.roomId.trim().length === 0) {
214
+ throw new Error('Room ID missing');
215
+ }
216
+ return response.roomId;
217
+ }
218
+ async fetchDiagnosticToken(serverHost) {
219
+ const response = await this.fetchJson(buildApiUrl(serverHost, '/api/diagnostic-token'), {
220
+ method: 'POST',
221
+ headers: { 'Content-Type': 'application/json' },
222
+ body: '',
223
+ timeoutMs: 5000,
224
+ });
225
+ const token = response.token?.trim();
226
+ if (!token) {
227
+ throw new Error('Diagnostic token missing');
228
+ }
229
+ return token;
230
+ }
231
+ async fetchTurnCredentials(serverHost, token) {
232
+ const response = await this.fetchJson(buildApiUrl(serverHost, `/api/turn-credentials?token=${encodeURIComponent(token)}`), { timeoutMs: 5000 });
233
+ if (typeof response.username !== 'string' ||
234
+ response.username.trim().length === 0 ||
235
+ typeof response.password !== 'string' ||
236
+ response.password.trim().length === 0 ||
237
+ !Array.isArray(response.uris) ||
238
+ response.uris.length === 0) {
239
+ throw new Error('Invalid TURN credentials');
240
+ }
241
+ return {
242
+ username: response.username,
243
+ password: response.password,
244
+ uris: response.uris,
245
+ };
246
+ }
247
+ async testWebSocket(serverHost) {
248
+ if (typeof WebSocket === 'undefined') {
249
+ throw new Error('WebSocket not available');
250
+ }
251
+ const { wsUrl } = resolveServerUrls(serverHost);
252
+ await new Promise((resolve, reject) => {
253
+ let settled = false;
254
+ const socket = new WebSocket(wsUrl);
255
+ const timeout = globalThis.setTimeout(() => {
256
+ finish(() => reject(new Error('WebSocket timeout')));
257
+ }, 5000);
258
+ const finish = (callback) => {
259
+ if (settled)
260
+ return;
261
+ settled = true;
262
+ globalThis.clearTimeout(timeout);
263
+ socket.onopen = null;
264
+ socket.onerror = null;
265
+ callback();
266
+ socket.close(1000, 'diagnostics');
267
+ };
268
+ socket.onopen = () => {
269
+ finish(resolve);
270
+ };
271
+ socket.onerror = () => {
272
+ finish(() => reject(new Error('WebSocket failed')));
273
+ };
274
+ });
275
+ }
276
+ async testSse(serverHost) {
277
+ if (typeof EventSource === 'undefined') {
278
+ throw new Error('EventSource not available');
279
+ }
280
+ const baseUrl = resolveServerBaseUrl(serverHost);
281
+ const sid = `diag-${Math.random().toString(36).slice(2, 10)}`;
282
+ const sseUrl = `${baseUrl}/sse?sid=${encodeURIComponent(sid)}`;
283
+ await new Promise((resolve, reject) => {
284
+ let settled = false;
285
+ const eventSource = new EventSource(sseUrl);
286
+ const timeout = globalThis.setTimeout(() => {
287
+ finish(() => reject(new Error('SSE timeout')));
288
+ }, 5000);
289
+ const finish = (callback) => {
290
+ if (settled)
291
+ return;
292
+ settled = true;
293
+ globalThis.clearTimeout(timeout);
294
+ eventSource.close();
295
+ callback();
296
+ };
297
+ eventSource.onopen = async () => {
298
+ try {
299
+ const response = await this.fetchResponse(sseUrl, {
300
+ method: 'POST',
301
+ headers: { 'Content-Type': 'application/json' },
302
+ body: JSON.stringify({ v: 1, type: 'ping', payload: { ts: Date.now() } }),
303
+ timeoutMs: 5000,
304
+ });
305
+ if (!response.ok) {
306
+ throw new Error(`SSE ping failed: ${response.status}`);
307
+ }
308
+ finish(resolve);
309
+ }
310
+ catch (err) {
311
+ finish(() => reject(err));
312
+ }
313
+ };
314
+ eventSource.onerror = () => {
315
+ finish(() => reject(new Error('SSE connection failed')));
316
+ };
317
+ });
318
+ }
319
+ async gatherIceCandidates(iceServers, turnsOnly, onCandidateLog) {
320
+ if (typeof RTCPeerConnection === 'undefined') {
321
+ return { stunPassed: false, turnPassed: false, logs: ['WebRTC not available'] };
322
+ }
323
+ const normalizedIceServers = normalizeIceServers(iceServers, turnsOnly);
324
+ if (normalizedIceServers.length === 0) {
325
+ return { stunPassed: false, turnPassed: false, logs: ['No ICE servers'] };
326
+ }
327
+ const logs = [];
328
+ const log = (message) => {
329
+ logs.push(message);
330
+ onCandidateLog?.(message);
331
+ };
332
+ return await new Promise((resolve) => {
333
+ let settled = false;
334
+ let stunPassed = false;
335
+ let turnPassed = false;
336
+ const iceServersSummary = normalizedIceServers
337
+ .flatMap((iceServer) => Array.isArray(iceServer.urls) ? iceServer.urls : [iceServer.urls])
338
+ .join(', ');
339
+ const connection = new RTCPeerConnection({
340
+ iceServers: normalizedIceServers,
341
+ });
342
+ const finish = () => {
343
+ if (settled)
344
+ return;
345
+ settled = true;
346
+ globalThis.clearTimeout(timeout);
347
+ connection.onicecandidate = null;
348
+ connection.onicecandidateerror = null;
349
+ connection.onicegatheringstatechange = null;
350
+ connection.close();
351
+ resolve({ stunPassed, turnPassed, logs, iceServersSummary });
352
+ };
353
+ const timeout = globalThis.setTimeout(() => {
354
+ log('ICE gathering timed out');
355
+ finish();
356
+ }, 10000);
357
+ connection.onicecandidate = (event) => {
358
+ const candidate = event.candidate?.candidate;
359
+ if (!candidate) {
360
+ finish();
361
+ return;
362
+ }
363
+ log(candidate);
364
+ if (candidate.includes(' typ srflx ')) {
365
+ stunPassed = true;
366
+ }
367
+ if (candidate.includes(' typ relay ')) {
368
+ turnPassed = true;
369
+ }
370
+ };
371
+ connection.onicecandidateerror = (event) => {
372
+ log(`ICE candidate error: ${event.errorText || event.errorCode}`);
373
+ };
374
+ connection.onicegatheringstatechange = () => {
375
+ if (connection.iceGatheringState === 'complete') {
376
+ finish();
377
+ }
378
+ };
379
+ connection.createDataChannel('diagnostics');
380
+ void connection.createOffer()
381
+ .then((offer) => connection.setLocalDescription(offer))
382
+ .catch((err) => {
383
+ log(`ICE probe failed: ${formatError(err)}`);
384
+ finish();
385
+ });
386
+ });
387
+ }
388
+ async resolveIceServers() {
389
+ if (this.resolvedConfig.serverHost) {
390
+ const token = await this.fetchDiagnosticToken(this.resolvedConfig.serverHost);
391
+ const credentials = await this.fetchTurnCredentials(this.resolvedConfig.serverHost, token);
392
+ return [{
393
+ urls: credentials.uris,
394
+ username: credentials.username,
395
+ credential: credentials.password,
396
+ }];
397
+ }
398
+ return await this.resolvedConfig.signalingProvider.getIceServers();
399
+ }
400
+ async fetchJson(url, options) {
401
+ const response = await this.fetchResponse(url, options);
402
+ if (!response.ok) {
403
+ throw new Error(`Request failed: ${response.status}`);
404
+ }
405
+ return await response.json();
406
+ }
407
+ async fetchResponse(url, options) {
408
+ const controller = new AbortController();
409
+ const timeout = globalThis.setTimeout(() => controller.abort(), options.timeoutMs);
410
+ try {
411
+ return await fetch(url, {
412
+ ...options,
413
+ signal: controller.signal,
414
+ });
415
+ }
416
+ finally {
417
+ globalThis.clearTimeout(timeout);
418
+ }
419
+ }
420
+ }
421
+ //# sourceMappingURL=SerenadaDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenadaDiagnostics.js","sourceRoot":"","sources":["../src/SerenadaDiagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { SignalingProviderEmitter, type JoinOptions } from './SignalingProvider.js';
2
+ import type { SerenadaLogger } from './types.js';
3
+ import type { TransportKind } from './signaling/transports/types.js';
4
+ export interface SerenadaServerProviderConfig {
5
+ serverHost: string;
6
+ transports?: TransportKind[];
7
+ logger?: SerenadaLogger;
8
+ }
9
+ export declare class SerenadaServerProvider extends SignalingProviderEmitter {
10
+ readonly capabilities: {
11
+ handlesReconnection: boolean;
12
+ };
13
+ private readonly serverHost;
14
+ private readonly signaling;
15
+ private readonly logger?;
16
+ private readonly unsubscribeStateChange;
17
+ private readonly unsubscribeMessages;
18
+ private lastConnected;
19
+ private currentTurnToken;
20
+ private previousParticipants;
21
+ private currentHostPeerId;
22
+ private disconnected;
23
+ constructor(config: SerenadaServerProviderConfig);
24
+ connect(): void;
25
+ disconnect(): void;
26
+ joinRoom(roomId: string, options?: JoinOptions): void;
27
+ leaveRoom(): void;
28
+ endRoom(): void;
29
+ sendToPeer(peerId: string, type: string, payload: unknown): void;
30
+ broadcast(type: string, payload: unknown): void;
31
+ /**
32
+ * Install (or clear) a gate consulted before each periodic TURN refresh.
33
+ * The gate returns false to skip the refresh — used by the session to
34
+ * suppress refreshes while every peer is on a direct ICE path, so the
35
+ * call remains independent of signaling for the refresh cadence.
36
+ */
37
+ setTurnRefreshGate(gate: (() => Promise<boolean>) | null): void;
38
+ getIceServers(): Promise<RTCIceServer[]>;
39
+ private handleStateChange;
40
+ private handleMessage;
41
+ private emitRoomEnded;
42
+ private handleJoined;
43
+ private handleRoomState;
44
+ private emitParticipantDiffs;
45
+ private emitPeerMessage;
46
+ private refreshIceServers;
47
+ }
48
+ //# sourceMappingURL=SerenadaServerProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerenadaServerProvider.d.ts","sourceRoot":"","sources":["../src/SerenadaServerProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,KAAK,WAAW,EAA+E,MAAM,wBAAwB,CAAC;AACjK,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAWrE,MAAM,WAAW,4BAA4B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,wBAAwB;IAChE,QAAQ,CAAC,YAAY;;MAAiC;IAEtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAa;IACjD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,oBAAoB,CAAmD;IAC/E,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,4BAA4B;IAmBhD,OAAO,IAAI,IAAI;IAIf,UAAU,IAAI,IAAI;IAalB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IASrD,SAAS,IAAI,IAAI;IAOjB,OAAO,IAAI,IAAI;IAIf,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAI/C;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI;IAIzD,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAsC9C,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,eAAe;YAgBT,iBAAiB;CAYlC"}