@@ -76,7 +76,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
76
76
String ? get connectedServerAddress => _connectedServerAddress;
77
77
78
78
// server-provided ice servers
79
- List <lk_rtc. ICEServer > _serverProvidedIceServers = [];
79
+ List <RTCIceServer > _serverProvidedIceServers = [];
80
80
81
81
late final _signalListener = signalClient.createListener (synchronized: true );
82
82
@@ -337,27 +337,42 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
337
337
}
338
338
}
339
339
340
- Future <void > _configurePeerConnections ({bool ? forceRelay}) async {
340
+ Future <void > _configurePeerConnections (
341
+ {required lk_models.ClientConfigSetting forceRelay,
342
+ required List <RTCIceServer > serverProvidedIceServers}) async {
341
343
if (publisher != null || subscriber != null ) {
342
344
logger.warning ('Already configured' );
343
345
return ;
344
346
}
345
347
346
348
// RTCConfiguration? config;
347
- // use server-provided iceServers if not provided by user
348
- final serverIceServers =
349
- _serverProvidedIceServers.map ((e) => e.toSDKType ()).toList ();
350
-
351
349
RTCConfiguration rtcConfiguration = connectOptions.rtcConfiguration;
352
- if (serverIceServers.isNotEmpty) {
353
- // use server provided iceServers if exists
350
+
351
+ // The server provided iceServers are only used if
352
+ // the client's iceServers are not set.
353
+ if (rtcConfiguration.iceServers == null &&
354
+ serverProvidedIceServers.isNotEmpty) {
354
355
rtcConfiguration = connectOptions.rtcConfiguration
355
- .copyWith (iceServers: serverIceServers );
356
+ .copyWith (iceServers: serverProvidedIceServers );
356
357
}
357
358
358
- if (forceRelay != null && forceRelay) {
359
- rtcConfiguration = rtcConfiguration.copyWith (
360
- iceTransportPolicy: RTCIceTransportPolicy .relay);
359
+ // set forceRelay
360
+ if (rtcConfiguration.iceTransportPolicy == null ) {
361
+ switch (forceRelay) {
362
+ case lk_models.ClientConfigSetting .ENABLED :
363
+ rtcConfiguration = rtcConfiguration.copyWith (
364
+ iceTransportPolicy: RTCIceTransportPolicy .relay,
365
+ );
366
+ break ;
367
+ case lk_models.ClientConfigSetting .DISABLED :
368
+ rtcConfiguration = rtcConfiguration.copyWith (
369
+ iceTransportPolicy: RTCIceTransportPolicy .all,
370
+ );
371
+ break ;
372
+ case lk_models.ClientConfigSetting .UNSET :
373
+ // do nothing
374
+ break ;
375
+ }
361
376
}
362
377
363
378
publisher = await Transport .create (_peerConnectionCreate,
@@ -627,16 +642,22 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
627
642
..on < SignalJoinResponseEvent > ((event) async {
628
643
// create peer connections
629
644
_subscriberPrimary = event.response.subscriberPrimary;
630
- _serverProvidedIceServers = event.response.iceServers;
631
645
_participantSid = event.response.participant.sid;
646
+ var iceServersFromServer =
647
+ event.response.iceServers.map ((e) => e.toSDKType ()).toList ();
648
+
649
+ if (iceServersFromServer.isNotEmpty) {
650
+ _serverProvidedIceServers = iceServersFromServer;
651
+ }
632
652
633
653
logger.fine ('onConnected subscriberPrimary: ${_subscriberPrimary }, '
634
654
'serverVersion: ${event .response .serverVersion }, '
635
- 'iceServers: ${event .response .iceServers }' );
655
+ 'iceServers: ${event .response .iceServers }, '
656
+ 'forceRelay: $event .response.clientConfiguration.forceRelay' );
636
657
637
658
await _configurePeerConnections (
638
- forceRelay: event.response.clientConfiguration.forceRelay ==
639
- lk_models. ClientConfigSetting . ENABLED );
659
+ forceRelay: event.response.clientConfiguration.forceRelay,
660
+ serverProvidedIceServers : _serverProvidedIceServers );
640
661
641
662
if (! _subscriberPrimary) {
642
663
// for subscriberPrimary, we negotiate when necessary (lazy)
0 commit comments