fix reconnect logic

This commit is contained in:
Hiroshi Horie
2021-12-23 01:50:58 +07:00
parent a0c7744baa
commit 94b4b07e92
9 changed files with 157 additions and 113 deletions
+27 -16
View File
@@ -86,8 +86,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
}) : signalClient = signalClient ?? SignalClient() {
if (kDebugMode) {
// log all EngineEvents
events.listen((event) =>
logger.fine('[EngineEvent] $objectId ${event.runtimeType}'));
events.listen((event) => logger.fine('[EngineEvent] $objectId ${event}'));
}
_setUpListeners();
@@ -241,7 +240,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
@internal
Future<void> reconnect() async {
if (_connectionState == ConnectionState.disconnected) {
logger.fine('$objectId reconnect() already closed');
logger.fine('Reconnect: Already closed.');
return;
}
@@ -252,6 +251,8 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
throw ConnectException('could not reconnect without url and token');
}
_connectionState = ConnectionState.reconnecting;
if (_reconnectAttempts == 0) {
events.emit(const EngineReconnectingEvent());
}
@@ -259,7 +260,6 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
try {
// isReconnecting = true;
_connectionState = ConnectionState.reconnecting;
await signalClient.reconnect(
url,
token,
@@ -274,13 +274,19 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
// await negotiate(iceRestart: true);
if (_hasPublished) {
logger.fine('reconnect: publisher.createAndSendOffer');
await publisher!
.createAndSendOffer(const RTCOfferOptions(iceRestart: true));
logger.fine('Reconnect: negotiating publisher...');
await publisher!.createAndSendOffer(const RTCOfferOptions(
iceRestart: true,
));
}
if (!(primary?.pc.iceConnectionState?.isConnected() ?? false)) {
logger.fine('reconnect: waiting for primary to ice-connect...');
final iceConnected =
primary?.pc.iceConnectionState?.isConnected() ?? false;
logger.fine('Reconnect: iceConnected: $iceConnected');
if (!iceConnected) {
logger.fine('Reconnect: Waiting for primary to connect...');
await events.waitFor<EngineIceStateUpdatedEvent>(
filter: (event) => event.isPrimary && event.iceState.isConnected(),
@@ -288,15 +294,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
);
}
logger.fine('reconnect: success');
logger.fine('Reconnect: success');
_connectionState = ConnectionState.connected;
events.emit(const EngineReconnectedEvent());
_reconnectAttempts = 0;
// don't catch and pass up any exception
} finally {
// always set reconnecting to false
// isReconnecting = false;
} catch (error) {
logger.fine('Reconnect: error ${error}');
// Pass up all exceptions
_connectionState = ConnectionState.disconnected;
rethrow;
}
}
@@ -344,7 +350,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
subscriber?.pc.onIceConnectionState =
(state) => events.emit(EngineSubscriberIceStateUpdatedEvent(
state: state,
iceState: state,
isPrimary: _subscriberPrimary,
));
@@ -491,6 +497,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
}
Future<void> _onDisconnected(String reason) async {
logger.info('onDisconnected reason: $reason');
if (_connectionState == ConnectionState.disconnected) {
logger.fine('[$objectId] Already disconnected $reason');
return;
@@ -596,6 +603,10 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
// relay
..on<SignalStreamStateUpdatedEvent>((event) => events.emit(event))
..on<SignalLeaveEvent>((event) async {
if (connectionState == ConnectionState.reconnecting) {
logger.fine('Ignoring leave signal since engine is reconnecting...');
return;
}
await close();
events.emit(const EngineDisconnectedEvent());
})