feat: handle reconnect response to re-configuration PCs. (#255)

* feat: handle reconnect response to re-configuration PCs.

* chore: fn rename.

* fmt: format proto/*.dart.

* update.
This commit is contained in:
CloudWebRTC
2023-03-27 09:20:18 +08:00
committed by GitHub
parent bc4df105fa
commit abd6bb32b6
3 changed files with 48 additions and 7 deletions
+36 -7
View File
@@ -278,14 +278,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
await channel.send(message); await channel.send(message);
} }
Future<void> _configurePeerConnections( Future<RTCConfiguration> _buildRtcConfiguration(
{required lk_models.ClientConfigSetting serverResponseForceRelay, {required lk_models.ClientConfigSetting serverResponseForceRelay,
required List<RTCIceServer> serverProvidedIceServers}) async { required List<RTCIceServer> serverProvidedIceServers}) async {
if (publisher != null || subscriber != null) {
logger.warning('Already configured');
return;
}
// RTCConfiguration? config; // RTCConfiguration? config;
RTCConfiguration rtcConfiguration = connectOptions.rtcConfiguration; RTCConfiguration rtcConfiguration = connectOptions.rtcConfiguration;
@@ -304,6 +299,10 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
); );
} }
return rtcConfiguration;
}
Future<void> _createPeerConnections(RTCConfiguration rtcConfiguration) async {
publisher = await Transport.create(_peerConnectionCreate, publisher = await Transport.create(_peerConnectionCreate,
rtcConfig: rtcConfiguration, connectOptions: connectOptions); rtcConfig: rtcConfiguration, connectOptions: connectOptions);
subscriber = await Transport.create(_peerConnectionCreate, subscriber = await Transport.create(_peerConnectionCreate,
@@ -710,16 +709,46 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
'iceServers: ${event.response.iceServers}, ' 'iceServers: ${event.response.iceServers}, '
'forceRelay: $event.response.clientConfiguration.forceRelay'); 'forceRelay: $event.response.clientConfiguration.forceRelay');
await _configurePeerConnections( var rtcConfiguration = await _buildRtcConfiguration(
serverResponseForceRelay: serverResponseForceRelay:
event.response.clientConfiguration.forceRelay, event.response.clientConfiguration.forceRelay,
serverProvidedIceServers: _serverProvidedIceServers); serverProvidedIceServers: _serverProvidedIceServers);
if (publisher == null && subscriber == null) {
await _createPeerConnections(rtcConfiguration);
}
if (!_subscriberPrimary) { if (!_subscriberPrimary) {
// for subscriberPrimary, we negotiate when necessary (lazy) // for subscriberPrimary, we negotiate when necessary (lazy)
await negotiate(); await negotiate();
} }
}) })
..on<SignalReconnectResponseEvent>((event) async {
var iceServersFromServer =
event.response.iceServers.map((e) => e.toSDKType()).toList();
if (iceServersFromServer.isNotEmpty) {
_serverProvidedIceServers = iceServersFromServer;
}
_clientConfiguration = event.response.clientConfiguration;
logger.fine('Handle ReconnectResponse: '
'iceServers: ${event.response.iceServers}, '
'forceRelay: $event.response.clientConfiguration.forceRelay');
var rtcConfiguration = await _buildRtcConfiguration(
serverResponseForceRelay:
event.response.clientConfiguration.forceRelay,
serverProvidedIceServers: _serverProvidedIceServers);
await publisher?.pc.setConfiguration(rtcConfiguration.toMap());
await subscriber?.pc.setConfiguration(rtcConfiguration.toMap());
if (!_subscriberPrimary) {
await negotiate();
}
})
..on<SignalConnectionStateUpdatedEvent>((event) async { ..on<SignalConnectionStateUpdatedEvent>((event) async {
if (event.newState == ConnectionState.disconnected) { if (event.newState == ConnectionState.disconnected) {
await handleDisconnect(ClientDisconnectReason.signal); await handleDisconnect(ClientDisconnectReason.signal);
+3
View File
@@ -247,6 +247,9 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
_pingCount++; _pingCount++;
_resetPingTimeout(); _resetPingTimeout();
break; break;
case lk_rtc.SignalResponse_Message.reconnect:
events.emit(SignalReconnectResponseEvent(response: msg.reconnect));
break;
default: default:
logger.warning('received unknown signal message'); logger.warning('received unknown signal message');
} }
+9
View File
@@ -101,6 +101,15 @@ class SignalJoinResponseEvent with SignalEvent, InternalEvent {
}); });
} }
@internal
// Received a ReconnectResponse from the server.
class SignalReconnectResponseEvent with SignalEvent, InternalEvent {
final lk_rtc.ReconnectResponse response;
const SignalReconnectResponseEvent({
required this.response,
});
}
/// Base class for a ConnectionStateUpdated event /// Base class for a ConnectionStateUpdated event
@internal @internal
abstract class ConnectionStateUpdatedEvent with InternalEvent { abstract class ConnectionStateUpdatedEvent with InternalEvent {