diff --git a/XIONControlPanel/Servers/HomeAssistantServer.swift b/XIONControlPanel/Servers/HomeAssistantServer.swift index 753d798..8f6cd8d 100644 --- a/XIONControlPanel/Servers/HomeAssistantServer.swift +++ b/XIONControlPanel/Servers/HomeAssistantServer.swift @@ -52,8 +52,7 @@ class HomeAssistantServer: Server print("Websocket not running: \(String(describing: websocketTask.error))") } catch { - print("Websocket Error: \(error)") - self.connectionStatus = .error + encounteredWebsocketError(error) } } @@ -153,19 +152,27 @@ class HomeAssistantServer: Server } } - do { - let encodedMessage = try JSONEncoder().encode(message) - let jsonString = String(data: encodedMessage, encoding: .utf8)! - websocketTask?.send(.string(jsonString)) { error in - guard let error else { return } - print("Websocket send error: \(error)") + Task { + do { + let encodedMessage = try JSONEncoder().encode(message) + let jsonString = String(data: encodedMessage, encoding: .utf8)! + try await websocketTask?.send(.string(jsonString)) + } catch { + print("Error sending message: \(error)") + encounteredWebsocketError(error) } - } catch { - print("Error sending message: \(error)") } } } + private func encounteredWebsocketError(_ error: any Error) { + print("Websocket Error: \(error)") + self.connectionStatus = .error + self.websocketTask?.cancel() + self.websocketTask = nil + // reconnects the next time we're refreshed. + } + private func decodeEvent(_ data: Data) async { do { let decoder = JSONDecoder() @@ -311,9 +318,9 @@ typealias MessageID = Int64? extension MessageID { - private static var counter: Int64 = 0 + private static var counter: Int64 = 1 static func next() -> Self { - Self.counter += 1 + OSAtomicIncrement64(&Self.counter) return Self.counter } }