@@ -228,6 +228,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
228228 await signalClient.cleanUp ();
229229
230230 fullReconnectOnNext = false ;
231+ attemptingReconnect = false ;
231232
232233 clearPendingReconnect ();
233234 }
@@ -625,8 +626,25 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
625626 reconnectStart = DateTime .now ();
626627 }
627628
629+ if (reconnectAttempts! >= _reconnectCount) {
630+ logger.fine ('reconnectAttempts exceeded, disconnecting...' );
631+ _isClosed = true ;
632+ await cleanUp ();
633+
634+ events.emit (EngineDisconnectedEvent (
635+ reason: DisconnectReason .reconnectAttemptsExceeded,
636+ ));
637+ return ;
638+ }
639+
628640 var delay = defaultRetryDelaysInMs[reconnectAttempts! ];
629641
642+ events.emit (EngineAttemptReconnectEvent (
643+ attempt: reconnectAttempts! + 1 ,
644+ maxAttempts: _reconnectCount,
645+ nextRetryDelaysInMs: delay,
646+ ));
647+
630648 clearReconnectTimeout ();
631649 logger.fine (
632650 'WebSocket reconnecting in $delay ms, retry times $reconnectAttempts ' );
@@ -656,19 +674,10 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
656674 fullReconnectOnNext = true ;
657675 }
658676
659- if (reconnectAttempts! >= _reconnectCount) {
660- logger.fine ('reconnectAttempts exceeded, disconnecting...' );
661- events.emit (EngineDisconnectedEvent (
662- reason: DisconnectReason .connectionClosed,
663- ));
664- await cleanUp ();
665- return ;
666- }
667-
668677 try {
669678 attemptingReconnect = true ;
670679
671- if (await signalClient.checkInternetConnection () == false ) {
680+ if (await signalClient.networkIsAvailable () == false ) {
672681 logger.fine ('no internet connection, waiting...' );
673682 await signalClient.events.waitFor <SignalConnectivityChangedEvent >(
674683 duration: connectOptions.timeouts.connection * 10 ,
@@ -688,14 +697,12 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
688697 } catch (e) {
689698 reconnectAttempts = reconnectAttempts! + 1 ;
690699 bool recoverable = true ;
691- if (e is WebSocketException ||
692- e is ConnectException ||
693- e is MediaConnectException ) {
700+ if (e is WebSocketException || e is MediaConnectException ) {
694701 // cannot resume connection, need to do full reconnect
695702 fullReconnectOnNext = true ;
696- } else if (e is TimeoutException ) {
697- fullReconnectOnNext = false ;
698- } else {
703+ }
704+
705+ if (e is UnexpectedConnectionState ) {
699706 recoverable = false ;
700707 }
701708
@@ -704,7 +711,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
704711 } else {
705712 logger.fine ('attemptReconnect: disconnecting...' );
706713 events.emit (EngineDisconnectedEvent (
707- reason: DisconnectReason .connectionClosed ,
714+ reason: DisconnectReason .disconnected ,
708715 ));
709716 await cleanUp ();
710717 }
@@ -835,7 +842,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
835842 }
836843
837844 void _setUpEngineListeners () =>
838- events.on < EngineReconnectingEvent > ((event) async {
845+ events.on < SignalReconnectedEvent > ((event) async {
839846 // send queued requests if engine re-connected
840847 signalClient.sendQueuedRequests ();
841848 });
@@ -907,14 +914,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
907914 })
908915 ..on < SignalConnectingEvent > ((event) async {
909916 logger.fine ('Signal connecting' );
917+ events.emit (const EngineConnectingEvent ());
910918 })
911919 ..on < SignalReconnectingEvent > ((event) async {
912920 logger.fine ('Signal reconnecting' );
913921 events.emit (const EngineReconnectingEvent ());
914922 })
915923 ..on < SignalDisconnectedEvent > ((event) async {
916924 logger.fine ('Signal disconnected ${event .reason }' );
917- if (event.reason == DisconnectReason .connectionClosed && ! _isClosed) {
925+ if (event.reason == DisconnectReason .disconnected && ! _isClosed) {
918926 await handleDisconnect (ClientDisconnectReason .signal);
919927 } else {
920928 events.emit (EngineDisconnectedEvent (
0 commit comments