Reconnect on connection failure

This commit is contained in:
2025-06-19 15:00:19 -07:00
parent 7e10083671
commit 397add6c8c

View File

@@ -52,8 +52,7 @@ class HomeAssistantServer: Server
print("Websocket not running: \(String(describing: websocketTask.error))") print("Websocket not running: \(String(describing: websocketTask.error))")
} catch { } catch {
print("Websocket Error: \(error)") encounteredWebsocketError(error)
self.connectionStatus = .error
} }
} }
@@ -153,19 +152,27 @@ class HomeAssistantServer: Server
} }
} }
do { Task {
let encodedMessage = try JSONEncoder().encode(message) do {
let jsonString = String(data: encodedMessage, encoding: .utf8)! let encodedMessage = try JSONEncoder().encode(message)
websocketTask?.send(.string(jsonString)) { error in let jsonString = String(data: encodedMessage, encoding: .utf8)!
guard let error else { return } try await websocketTask?.send(.string(jsonString))
print("Websocket send error: \(error)") } 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 { private func decodeEvent(_ data: Data) async {
do { do {
let decoder = JSONDecoder() let decoder = JSONDecoder()
@@ -311,9 +318,9 @@ typealias MessageID = Int64?
extension MessageID extension MessageID
{ {
private static var counter: Int64 = 0 private static var counter: Int64 = 1
static func next() -> Self { static func next() -> Self {
Self.counter += 1 OSAtomicIncrement64(&Self.counter)
return Self.counter return Self.counter
} }
} }