Socket null handling (#1610)

* return null if in connection failure state

* reconnect on connection failure

* better connection handling

* probably not necessary but just incase

* connection handling updates

* add cancelOnError: true
This commit is contained in:
Matthew Fosse 2024-08-17 19:28:45 -04:00 committed by GitHub
parent 83ef61e928
commit 7c9b72483a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 36 deletions

View file

@ -66,6 +66,7 @@ class ElectrumClient {
try { try {
await socket?.close(); await socket?.close();
socket = null;
} catch (_) {} } catch (_) {}
try { try {
@ -90,33 +91,40 @@ class ElectrumClient {
} }
_setConnectionStatus(ConnectionStatus.connected); _setConnectionStatus(ConnectionStatus.connected);
socket!.listen((Uint8List event) { socket!.listen(
try { (Uint8List event) {
final msg = utf8.decode(event.toList()); try {
final messagesList = msg.split("\n"); final msg = utf8.decode(event.toList());
for (var message in messagesList) { final messagesList = msg.split("\n");
if (message.isEmpty) { for (var message in messagesList) {
continue; if (message.isEmpty) {
continue;
}
_parseResponse(message);
} }
_parseResponse(message); } catch (e) {
print(e.toString());
} }
} catch (e) { },
print(e.toString()); onError: (Object error) {
} socket = null;
}, onError: (Object error) { final errorMsg = error.toString();
final errorMsg = error.toString(); print(errorMsg);
print(errorMsg); unterminatedString = '';
unterminatedString = '';
final currentHost = socket?.address.host; final currentHost = socket?.address.host;
final isErrorForCurrentHost = errorMsg.contains(" ${currentHost} "); final isErrorForCurrentHost = errorMsg.contains(" ${currentHost} ");
if (currentHost != null && isErrorForCurrentHost) if (currentHost != null && isErrorForCurrentHost)
_setConnectionStatus(ConnectionStatus.failed); _setConnectionStatus(ConnectionStatus.failed);
}, onDone: () { },
unterminatedString = ''; onDone: () {
if (host == socket?.address.host) _setConnectionStatus(ConnectionStatus.disconnected); socket = null;
}); unterminatedString = '';
if (host == socket?.address.host) _setConnectionStatus(ConnectionStatus.disconnected);
},
cancelOnError: true,
);
keepAlive(); keepAlive();
} }

View file

@ -218,10 +218,7 @@ abstract class ElectrumWalletBase
if (electrumClient.isConnected) { if (electrumClient.isConnected) {
syncStatus = SyncedSyncStatus(); syncStatus = SyncedSyncStatus();
} else { } else {
if (electrumClient.uri != null) { syncStatus = NotConnectedSyncStatus();
await electrumClient.connectToUri(electrumClient.uri!, useSSL: electrumClient.useSSL);
startSync();
}
} }
} }
} }
@ -265,6 +262,7 @@ abstract class ElectrumWalletBase
Future<Isolate>? _isolate; Future<Isolate>? _isolate;
void Function(FlutterErrorDetails)? _onError; void Function(FlutterErrorDetails)? _onError;
Timer? _reconnectTimer;
Timer? _autoSaveTimer; Timer? _autoSaveTimer;
static const int _autoSaveInterval = 30; static const int _autoSaveInterval = 30;
@ -1980,13 +1978,6 @@ abstract class ElectrumWalletBase
break; break;
case ConnectionStatus.failed: case ConnectionStatus.failed:
syncStatus = LostConnectionSyncStatus(); syncStatus = LostConnectionSyncStatus();
// wait for 5 seconds and then try to reconnect:
Future.delayed(Duration(seconds: 5), () {
electrumClient.connectToUri(
node!.uri,
useSSL: node!.useSSL ?? false,
);
});
break; break;
case ConnectionStatus.connecting: case ConnectionStatus.connecting:
syncStatus = ConnectingSyncStatus(); syncStatus = ConnectingSyncStatus();
@ -1996,7 +1987,11 @@ abstract class ElectrumWalletBase
} }
void _syncStatusReaction(SyncStatus syncStatus) async { void _syncStatusReaction(SyncStatus syncStatus) async {
if (syncStatus is NotConnectedSyncStatus) { if (syncStatus is SyncingSyncStatus) {
return;
}
if (syncStatus is NotConnectedSyncStatus || syncStatus is LostConnectionSyncStatus) {
// Needs to re-subscribe to all scripthashes when reconnected // Needs to re-subscribe to all scripthashes when reconnected
_scripthashesUpdateSubject = {}; _scripthashesUpdateSubject = {};
@ -2004,7 +1999,8 @@ abstract class ElectrumWalletBase
_isTryingToConnect = true; _isTryingToConnect = true;
Future.delayed(Duration(seconds: 10), () { _reconnectTimer?.cancel();
_reconnectTimer = Timer(Duration(seconds: 10), () {
if (this.syncStatus is! SyncedSyncStatus && this.syncStatus is! SyncedTipSyncStatus) { if (this.syncStatus is! SyncedSyncStatus && this.syncStatus is! SyncedTipSyncStatus) {
this.electrumClient.connectToUri( this.electrumClient.connectToUri(
node!.uri, node!.uri,