@@ -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 }
0 commit comments