| @@ -61,16 +61,26 @@ class Connection { | |||||||
|           _tempToken = token; |           _tempToken = token; | ||||||
|         }); |         }); | ||||||
|       } |       } | ||||||
|       completer.complete(_connect()); |       _connect().timeout(connectTimeout, onTimeout: () { | ||||||
|  |         _disconnect().then((_) { | ||||||
|  |           completer.completeError( | ||||||
|  |               {"errorCode": 1, "errorMessage": "Connection timeout"}); | ||||||
|  |         }); | ||||||
|  |       }).then((_) => completer.complete()).catchError((e) { | ||||||
|  |         completer.completeError(e); | ||||||
|  |       }); | ||||||
|     } |     } | ||||||
|     return completer.future; |     return completer.future; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   Completer connecting; | ||||||
|  |  | ||||||
|   Future _connect() async { |   Future _connect() async { | ||||||
|     Completer completer = Completer(); |     if (connecting != null && !connecting.isCompleted) { | ||||||
|     Timer connectionTimer = Timer(connectTimeout, () { |       Logger.w(""); | ||||||
|       if (!completer.isCompleted) completer.completeError({"errorCode": 1, "errorMessage": "Connection timeout"}); |       return connecting.future; | ||||||
|     }); |     } | ||||||
|  |     connecting = Completer(); | ||||||
|     await _disconnect(); |     await _disconnect(); | ||||||
|     Logger.d( "Socket connecting..."); |     Logger.d( "Socket connecting..."); | ||||||
|     _socket = IOWebSocketChannel.connect( |     _socket = IOWebSocketChannel.connect( | ||||||
| @@ -78,18 +88,17 @@ class Connection { | |||||||
|     _socketSubscription = _socket.stream.listen( |     _socketSubscription = _socket.stream.listen( | ||||||
|             (message) { |             (message) { | ||||||
|           isConnected = true; |           isConnected = true; | ||||||
|           connectionTimer.cancel(); |  | ||||||
|           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((_) => completer.complete()).catchError((e) { |             _authenticate().then((_) => connecting.complete()).catchError((e) { | ||||||
|               if (!completer.isCompleted) completer.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 (!completer.isCompleted) completer.complete(sendSocketMessage( |             if (!connecting.isCompleted) connecting.complete(sendSocketMessage( | ||||||
|               type: "subscribe_events", |               type: "subscribe_events", | ||||||
|               additionalData: {"event_type": "state_changed"}, |               additionalData: {"event_type": "state_changed"}, | ||||||
|             )); |             )); | ||||||
| @@ -98,17 +107,17 @@ class Connection { | |||||||
|             _messageResolver["auth"]?.completeError({"errorCode": 62, "errorMessage": "${data["message"]}"}); |             _messageResolver["auth"]?.completeError({"errorCode": 62, "errorMessage": "${data["message"]}"}); | ||||||
|             _messageResolver.remove("auth"); |             _messageResolver.remove("auth"); | ||||||
|             logout().then((_) { |             logout().then((_) { | ||||||
|               if (!completer.isCompleted) completer.completeError({"errorCode": 62, "errorMessage": "${data["message"]}"}); |               if (!connecting.isCompleted) connecting.completeError({"errorCode": 62, "errorMessage": "${data["message"]}"}); | ||||||
|             }); |             }); | ||||||
|           } else { |           } else { | ||||||
|             _handleMessage(data); |             _handleMessage(data); | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         cancelOnError: true, |         cancelOnError: true, | ||||||
|         onDone: () => _handleSocketClose(completer), |         onDone: () => _handleSocketClose(connecting), | ||||||
|         onError: (e) => _handleSocketError(e, completer) |         onError: (e) => _handleSocketError(e, connecting) | ||||||
|     ); |     ); | ||||||
|     return completer.future; |     return connecting.future; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Future _disconnect() async { |   Future _disconnect() async { | ||||||
| @@ -150,7 +159,6 @@ class Connection { | |||||||
|     if (!connectionCompleter.isCompleted) { |     if (!connectionCompleter.isCompleted) { | ||||||
|       connectionCompleter.completeError({"errorCode": 82, "errorMessage": "Disconnected"}); |       connectionCompleter.completeError({"errorCode": 82, "errorMessage": "Disconnected"}); | ||||||
|     } else { |     } else { | ||||||
|       //TODO improve |  | ||||||
|       _disconnect().then((_) { |       _disconnect().then((_) { | ||||||
|         Timer(Duration(seconds: 5), () { |         Timer(Duration(seconds: 5), () { | ||||||
|           Logger.d("Trying to reconnect..."); |           Logger.d("Trying to reconnect..."); | ||||||
| @@ -166,7 +174,6 @@ class Connection { | |||||||
|     if (!connectionCompleter.isCompleted) { |     if (!connectionCompleter.isCompleted) { | ||||||
|       connectionCompleter.completeError({"errorCode": 81, "errorMessage": "Unable to connect to Home Assistant"}); |       connectionCompleter.completeError({"errorCode": 81, "errorMessage": "Unable to connect to Home Assistant"}); | ||||||
|     } else { |     } else { | ||||||
|       //TODO improve |  | ||||||
|       _disconnect().then((_) { |       _disconnect().then((_) { | ||||||
|         Timer(Duration(seconds: 5), () { |         Timer(Duration(seconds: 5), () { | ||||||
|           Logger.d("Trying to reconnect..."); |           Logger.d("Trying to reconnect..."); | ||||||
| @@ -237,9 +244,6 @@ class Connection { | |||||||
|  |  | ||||||
|   Future sendSocketMessage({String type, Map additionalData, bool auth: false}) { |   Future sendSocketMessage({String type, Map additionalData, bool auth: false}) { | ||||||
|     Completer _completer = Completer(); |     Completer _completer = Completer(); | ||||||
|     if (!isConnected) { |  | ||||||
|       _completer.completeError({"errorCode": 8, "errorMessage": "No connection to Home Assistant"}); |  | ||||||
|     } |  | ||||||
|     Map dataObject = {"type": "$type"}; |     Map dataObject = {"type": "$type"}; | ||||||
|     String callbackName; |     String callbackName; | ||||||
|     if (!auth) { |     if (!auth) { | ||||||
| @@ -253,10 +257,19 @@ class Connection { | |||||||
|       dataObject.addAll(additionalData); |       dataObject.addAll(additionalData); | ||||||
|     } |     } | ||||||
|     _messageResolver[callbackName] = _completer; |     _messageResolver[callbackName] = _completer; | ||||||
|     //TODO add message to q and send after reconnect |  | ||||||
|     String rawMessage = json.encode(dataObject); |     String rawMessage = json.encode(dataObject); | ||||||
|     Logger.d("[Sending] ==> $rawMessage"); |     Logger.d("[Sending] ==> $rawMessage"); | ||||||
|     _socket.sink.add(rawMessage); |     if (!isConnected) { | ||||||
|  |       _connect().timeout(connectTimeout, onTimeout: (){ | ||||||
|  |         _completer.completeError({"errorCode": 8, "errorMessage": "No connection to Home Assistant"}); | ||||||
|  |       }).then((_) { | ||||||
|  |         _socket.sink.add(rawMessage); | ||||||
|  |       }).catchError((e) { | ||||||
|  |         _completer.completeError(e); | ||||||
|  |       }); | ||||||
|  |     } else { | ||||||
|  |       _socket.sink.add(rawMessage); | ||||||
|  |     } | ||||||
|     return _completer.future; |     return _completer.future; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user