@@ -116,6 +116,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
116
116
117
117
bool get isClosed => _isClosed;
118
118
119
+ bool get isPendingReconnect =>
120
+ reconnectStart != null && reconnectTimeout != null ;
121
+
119
122
final int _reconnectCount = defaultRetryDelaysInMs.length;
120
123
121
124
bool attemptingReconnect = false ;
@@ -145,6 +148,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
145
148
void clearPendingReconnect () {
146
149
clearReconnectTimeout ();
147
150
reconnectAttempts = 0 ;
151
+ reconnectStart = null ;
148
152
}
149
153
150
154
Engine ({
@@ -275,7 +279,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
275
279
if (error is NegotiationError ) {
276
280
fullReconnectOnNext = true ;
277
281
}
278
- await handleDisconnect (ClientDisconnectReason .negotiationFailed);
282
+ await handleReconnect (ClientDisconnectReason .negotiationFailed);
279
283
}
280
284
}
281
285
@@ -449,7 +453,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
449
453
));
450
454
logger.fine ('subscriber connectionState: $state ' );
451
455
if (state.isDisconnected () || state.isFailed ()) {
452
- await handleDisconnect (state.isFailed ()
456
+ await handleReconnect (state.isFailed ()
453
457
? ClientDisconnectReason .peerConnectionFailed
454
458
: ClientDisconnectReason .peerConnectionClosed);
455
459
}
@@ -462,7 +466,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
462
466
));
463
467
logger.fine ('publisher connectionState: $state ' );
464
468
if (state.isDisconnected () || state.isFailed ()) {
465
- await handleDisconnect (state.isFailed ()
469
+ await handleReconnect (state.isFailed ()
466
470
? ClientDisconnectReason .peerConnectionFailed
467
471
: ClientDisconnectReason .peerConnectionClosed);
468
472
}
@@ -697,9 +701,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
697
701
}
698
702
}
699
703
700
- Future <void > handleDisconnect (ClientDisconnectReason reason) async {
704
+ Future <void > handleReconnect (ClientDisconnectReason reason) async {
701
705
if (_isClosed) {
702
- logger.fine ('handleDisconnect : engine is closed, skip' );
706
+ logger.fine ('handleReconnect : engine is closed, skip' );
703
707
return ;
704
708
}
705
709
@@ -797,7 +801,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
797
801
}
798
802
799
803
if (recoverable) {
800
- unawaited (handleDisconnect (ClientDisconnectReason .reconnectRetry));
804
+ unawaited (handleReconnect (ClientDisconnectReason .reconnectRetry));
801
805
} else {
802
806
logger.fine ('attemptReconnect: disconnecting...' );
803
807
events.emit (EngineDisconnectedEvent (
@@ -1024,7 +1028,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
1024
1028
..on < SignalDisconnectedEvent > ((event) async {
1025
1029
logger.fine ('Signal disconnected ${event .reason }' );
1026
1030
if (event.reason == DisconnectReason .disconnected && ! _isClosed) {
1027
- await handleDisconnect (ClientDisconnectReason .signal);
1031
+ await handleReconnect (ClientDisconnectReason .signal);
1028
1032
} else if (event.reason == DisconnectReason .signalingConnectionFailure) {
1029
1033
events.emit (EngineDisconnectedEvent (
1030
1034
reason: event.reason,
@@ -1104,11 +1108,11 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
1104
1108
case lk_rtc.LeaveRequest_Action .RECONNECT :
1105
1109
fullReconnectOnNext = true ;
1106
1110
// reconnect immediately instead of waiting for next attempt
1107
- await handleDisconnect (ClientDisconnectReason .leaveReconnect);
1111
+ await handleReconnect (ClientDisconnectReason .leaveReconnect);
1108
1112
break ;
1109
1113
case lk_rtc.LeaveRequest_Action .RESUME :
1110
1114
// reconnect immediately instead of waiting for next attempt
1111
- await handleDisconnect (ClientDisconnectReason .leaveReconnect);
1115
+ await handleReconnect (ClientDisconnectReason .leaveReconnect);
1112
1116
default :
1113
1117
break ;
1114
1118
}
@@ -1120,6 +1124,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
1120
1124
if (connectionState == ConnectionState .connected) {
1121
1125
await signalClient.sendLeave ();
1122
1126
} 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
+ }
1123
1136
await cleanUp ();
1124
1137
}
1125
1138
}
0 commit comments