Skip to content

Commit f7fc857

Browse files
authored
fix: fix room.disconnect when pending reconnect. (#802)
1 parent 921c7e3 commit f7fc857

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

lib/src/core/engine.dart

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
116116

117117
bool get isClosed => _isClosed;
118118

119+
bool get isPendingReconnect =>
120+
reconnectStart != null && reconnectTimeout != null;
121+
119122
final int _reconnectCount = defaultRetryDelaysInMs.length;
120123

121124
bool attemptingReconnect = false;
@@ -145,6 +148,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
145148
void clearPendingReconnect() {
146149
clearReconnectTimeout();
147150
reconnectAttempts = 0;
151+
reconnectStart = null;
148152
}
149153

150154
Engine({
@@ -275,7 +279,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
275279
if (error is NegotiationError) {
276280
fullReconnectOnNext = true;
277281
}
278-
await handleDisconnect(ClientDisconnectReason.negotiationFailed);
282+
await handleReconnect(ClientDisconnectReason.negotiationFailed);
279283
}
280284
}
281285

@@ -449,7 +453,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
449453
));
450454
logger.fine('subscriber connectionState: $state');
451455
if (state.isDisconnected() || state.isFailed()) {
452-
await handleDisconnect(state.isFailed()
456+
await handleReconnect(state.isFailed()
453457
? ClientDisconnectReason.peerConnectionFailed
454458
: ClientDisconnectReason.peerConnectionClosed);
455459
}
@@ -462,7 +466,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
462466
));
463467
logger.fine('publisher connectionState: $state');
464468
if (state.isDisconnected() || state.isFailed()) {
465-
await handleDisconnect(state.isFailed()
469+
await handleReconnect(state.isFailed()
466470
? ClientDisconnectReason.peerConnectionFailed
467471
: ClientDisconnectReason.peerConnectionClosed);
468472
}
@@ -697,9 +701,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
697701
}
698702
}
699703

700-
Future<void> handleDisconnect(ClientDisconnectReason reason) async {
704+
Future<void> handleReconnect(ClientDisconnectReason reason) async {
701705
if (_isClosed) {
702-
logger.fine('handleDisconnect: engine is closed, skip');
706+
logger.fine('handleReconnect: engine is closed, skip');
703707
return;
704708
}
705709

@@ -797,7 +801,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
797801
}
798802

799803
if (recoverable) {
800-
unawaited(handleDisconnect(ClientDisconnectReason.reconnectRetry));
804+
unawaited(handleReconnect(ClientDisconnectReason.reconnectRetry));
801805
} else {
802806
logger.fine('attemptReconnect: disconnecting...');
803807
events.emit(EngineDisconnectedEvent(
@@ -1024,7 +1028,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10241028
..on<SignalDisconnectedEvent>((event) async {
10251029
logger.fine('Signal disconnected ${event.reason}');
10261030
if (event.reason == DisconnectReason.disconnected && !_isClosed) {
1027-
await handleDisconnect(ClientDisconnectReason.signal);
1031+
await handleReconnect(ClientDisconnectReason.signal);
10281032
} else if (event.reason == DisconnectReason.signalingConnectionFailure) {
10291033
events.emit(EngineDisconnectedEvent(
10301034
reason: event.reason,
@@ -1104,11 +1108,11 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
11041108
case lk_rtc.LeaveRequest_Action.RECONNECT:
11051109
fullReconnectOnNext = true;
11061110
// reconnect immediately instead of waiting for next attempt
1107-
await handleDisconnect(ClientDisconnectReason.leaveReconnect);
1111+
await handleReconnect(ClientDisconnectReason.leaveReconnect);
11081112
break;
11091113
case lk_rtc.LeaveRequest_Action.RESUME:
11101114
// reconnect immediately instead of waiting for next attempt
1111-
await handleDisconnect(ClientDisconnectReason.leaveReconnect);
1115+
await handleReconnect(ClientDisconnectReason.leaveReconnect);
11121116
default:
11131117
break;
11141118
}
@@ -1120,6 +1124,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
11201124
if (connectionState == ConnectionState.connected) {
11211125
await signalClient.sendLeave();
11221126
} else {
1127+
if (isPendingReconnect) {
1128+
logger.fine('disconnect: Cancel the reconnection processing!');
1129+
await signalClient.cleanUp();
1130+
await _signalListener.cancelAll();
1131+
clearPendingReconnect();
1132+
events.emit(EngineDisconnectedEvent(
1133+
reason: DisconnectReason.clientInitiated,
1134+
));
1135+
}
11231136
await cleanUp();
11241137
}
11251138
}

lib/src/core/room.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,14 +622,18 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
622622

623623
/// Disconnects from the room, notifying server of disconnection.
624624
Future<void> disconnect() async {
625+
bool isPendingReconnect = engine.isPendingReconnect;
625626
if (engine.isClosed &&
627+
!isPendingReconnect &&
626628
engine.connectionState == ConnectionState.disconnected) {
627629
logger.warning('Engine is already closed');
628630
return;
629631
}
630632
await engine.disconnect();
631-
await _engineListener.waitFor<EngineDisconnectedEvent>(
632-
duration: const Duration(seconds: 10));
633+
if (!isPendingReconnect) {
634+
await _engineListener.waitFor<EngineDisconnectedEvent>(
635+
duration: const Duration(seconds: 10));
636+
}
633637
await _cleanUp();
634638
}
635639

0 commit comments

Comments
 (0)