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:
@@ -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);
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user