Resolves #364, Resolves #363 Connection issues

This commit is contained in:
estevez-dev
2019-04-19 14:07:44 +03:00
parent 8c1ad9c7f9
commit a916ddfa50

View File

@ -87,14 +87,14 @@ class Connection {
if (forceReconnect || !isConnected) { if (forceReconnect || !isConnected) {
_connect().timeout(connectTimeout, onTimeout: () { _connect().timeout(connectTimeout, onTimeout: () {
_disconnect().then((_) { _disconnect().then((_) {
completer.completeError( completer?.completeError(
{"errorCode": 1, "errorMessage": "Connection timeout"}); {"errorCode": 1, "errorMessage": "Connection timeout"});
}); });
}).then((_) => completer.complete()).catchError((e) { }).then((_) => completer?.complete()).catchError((e) {
completer.completeError(e); completer?.completeError(e);
}); });
} else { } else {
completer.complete(); completer?.complete();
} }
} }
@ -146,18 +146,24 @@ class Connection {
} }
} }
_disconnect() async { Future _disconnect() {
isConnected = false; Completer completer = Completer();
Logger.d( "Socket disconnecting..."); if (!isConnected) {
if (_socketSubscription != null) { completer.complete();
await _socketSubscription?.cancel(); } else {
isConnected = false;
List<Future> fl = [];
Logger.d("Socket disconnecting...");
if (_socketSubscription != null) {
fl.add(_socketSubscription.cancel());
}
if (_socket != null && _socket.sink != null &&
_socket.closeCode == null) {
fl.add(_socket.sink.close().timeout(Duration(seconds: 3)));
}
Future.wait(fl).whenComplete(() => completer.complete());
} }
if (_socket != null && _socket.sink != null) { return completer.future;
await _socket.sink.close().timeout(Duration(seconds: 3),
onTimeout: () => Logger.d("Socket sink close timeout")
);
}
Logger.d( "..Disconnected");
} }
_handleMessage(data) { _handleMessage(data) {
@ -185,15 +191,16 @@ class Connection {
} }
void _handleSocketClose(Completer connectionCompleter) { void _handleSocketClose(Completer connectionCompleter) {
isConnected = false;
Logger.d("Socket disconnected."); Logger.d("Socket disconnected.");
if (!connectionCompleter.isCompleted) { if (!connectionCompleter.isCompleted) {
isConnected = false;
connectionCompleter.completeError({"errorCode": 82, "errorMessage": "Disconnected"}); connectionCompleter.completeError({"errorCode": 82, "errorMessage": "Disconnected"});
} else { } else {
_disconnect().then((_) { _disconnect().then((_) {
Timer(Duration(seconds: 5), () { Timer(Duration(seconds: 5), () {
Logger.d("Trying to reconnect..."); Logger.d("Trying to reconnect...");
_connect().catchError((e) { _connect().catchError((e) {
isConnected = false;
eventBus.fire(ShowErrorEvent("Unable to connect to Home Assistant", 81)); eventBus.fire(ShowErrorEvent("Unable to connect to Home Assistant", 81));
}); });
}); });
@ -202,15 +209,16 @@ class Connection {
} }
void _handleSocketError(e, Completer connectionCompleter) { void _handleSocketError(e, Completer connectionCompleter) {
isConnected = false;
Logger.e("Socket stream Error: $e"); Logger.e("Socket stream Error: $e");
if (!connectionCompleter.isCompleted) { if (!connectionCompleter.isCompleted) {
isConnected = false;
connectionCompleter.completeError({"errorCode": 81, "errorMessage": "Unable to connect to Home Assistant"}); connectionCompleter.completeError({"errorCode": 81, "errorMessage": "Unable to connect to Home Assistant"});
} else { } else {
_disconnect().then((_) { _disconnect().then((_) {
Timer(Duration(seconds: 5), () { Timer(Duration(seconds: 5), () {
Logger.d("Trying to reconnect..."); Logger.d("Trying to reconnect...");
_connect().catchError((e) { _connect().catchError((e) {
isConnected = false;
eventBus.fire(ShowErrorEvent("Unable to connect to Home Assistant", 81)); eventBus.fire(ShowErrorEvent("Unable to connect to Home Assistant", 81));
}); });
}); });