Handle some socket exceptions

This commit is contained in:
Yegor Vialov 2019-11-29 11:21:45 +00:00
parent cd81fc72fd
commit dd5f8b155d

View File

@ -129,40 +129,44 @@ class ConnectionManager {
connecting = Completer(); connecting = Completer();
_disconnect().then((_) { _disconnect().then((_) {
Logger.d("Socket connecting..."); Logger.d("Socket connecting...");
_socket = IOWebSocketChannel.connect( try {
_socket = IOWebSocketChannel.connect(
_webSocketAPIEndpoint, pingInterval: Duration(seconds: 15)); _webSocketAPIEndpoint, pingInterval: Duration(seconds: 15));
_socketSubscription = _socket.stream.listen( _socketSubscription = _socket.stream.listen(
(message) { (message) {
isConnected = true; isConnected = true;
var data = json.decode(message); var data = json.decode(message);
if (data["type"] == "auth_required") { if (data["type"] == "auth_required") {
Logger.d("[Received] <== ${data.toString()}"); Logger.d("[Received] <== ${data.toString()}");
_authenticate().then((_) { _authenticate().then((_) {
Logger.d('Authentication complete'); Logger.d('Authentication complete');
connecting.complete(); connecting.complete();
}).catchError((e) { }).catchError((e) {
if (!connecting.isCompleted) connecting.completeError(e); if (!connecting.isCompleted) connecting.completeError(e);
}); });
} else if (data["type"] == "auth_ok") { } else if (data["type"] == "auth_ok") {
Logger.d("[Received] <== ${data.toString()}"); Logger.d("[Received] <== ${data.toString()}");
_messageResolver["auth"]?.complete(); _messageResolver["auth"]?.complete();
_messageResolver.remove("auth"); _messageResolver.remove("auth");
if (_token != null) { if (_token != null) {
if (!connecting.isCompleted) connecting.complete(); if (!connecting.isCompleted) connecting.complete();
}
} else if (data["type"] == "auth_invalid") {
Logger.d("[Received] <== ${data.toString()}");
_messageResolver["auth"]?.completeError(HAError("${data["message"]}", actions: [HAErrorAction.loginAgain()]));
_messageResolver.remove("auth");
if (!connecting.isCompleted) connecting.completeError(HAError("${data["message"]}", actions: [HAErrorAction.tryAgain(title: "Retry"), HAErrorAction.loginAgain(title: "Relogin")]));
} else {
_handleMessage(data);
} }
} else if (data["type"] == "auth_invalid") { },
Logger.d("[Received] <== ${data.toString()}"); cancelOnError: true,
_messageResolver["auth"]?.completeError(HAError("${data["message"]}", actions: [HAErrorAction.loginAgain()])); onDone: () => _handleSocketClose(connecting),
_messageResolver.remove("auth"); onError: (e) => _handleSocketError(e, connecting)
if (!connecting.isCompleted) connecting.completeError(HAError("${data["message"]}", actions: [HAErrorAction.tryAgain(title: "Retry"), HAErrorAction.loginAgain(title: "Relogin")])); );
} else { } catch(exeption) {
_handleMessage(data); connecting.completeError(HAError("${exeption.toString()}"));
} }
},
cancelOnError: true,
onDone: () => _handleSocketClose(connecting),
onError: (e) => _handleSocketError(e, connecting)
);
}); });
return connecting.future; return connecting.future;
} }
@ -214,38 +218,24 @@ class ConnectionManager {
void _handleSocketClose(Completer connectionCompleter) { void _handleSocketClose(Completer connectionCompleter) {
Logger.d("Socket disconnected."); Logger.d("Socket disconnected.");
if (!connectionCompleter.isCompleted) { _disconnect().then((_) {
isConnected = false; if (!connectionCompleter.isCompleted) {
connectionCompleter.completeError(HAError("Disconnected", actions: [HAErrorAction.reconnect()])); isConnected = false;
} else { connectionCompleter.completeError(HAError("Disconnected", actions: [HAErrorAction.reconnect()]));
_disconnect().then((_) { }
Timer(Duration(seconds: 5), () { eventBus.fire(ShowErrorEvent(HAError("Unable to connect to Home Assistant")));
Logger.d("Trying to reconnect..."); });
_connect().catchError((e) {
isConnected = false;
eventBus.fire(ShowErrorEvent(HAError("Unable to connect to Home Assistant")));
});
});
});
}
} }
void _handleSocketError(e, Completer connectionCompleter) { void _handleSocketError(e, Completer connectionCompleter) {
Logger.e("Socket stream Error: $e"); Logger.e("Socket stream Error: $e");
if (!connectionCompleter.isCompleted) { _disconnect().then((_) {
isConnected = false; if (!connectionCompleter.isCompleted) {
connectionCompleter.completeError(HAError("Unable to connect to Home Assistant")); isConnected = false;
} else { connectionCompleter.completeError(HAError("Disconnected", actions: [HAErrorAction.reconnect()]));
_disconnect().then((_) { }
Timer(Duration(seconds: 5), () { eventBus.fire(ShowErrorEvent(HAError("Unable to connect to Home Assistant")));
Logger.d("Trying to reconnect..."); });
_connect().catchError((e) {
isConnected = false;
eventBus.fire(ShowErrorEvent(HAError("Unable to connect to Home Assistant")));
});
});
});
}
} }
Future _authenticate() { Future _authenticate() {