|
|
|
|
@ -19,6 +19,7 @@ class WebSocketManager: ObservableObject { |
|
|
|
|
|
|
|
|
|
fileprivate var _reconnectAttempts = 0 |
|
|
|
|
fileprivate var _failure = false |
|
|
|
|
fileprivate var _error: Error? = nil |
|
|
|
|
fileprivate var _pingOk = false |
|
|
|
|
|
|
|
|
|
init(storeCenter: StoreCenter, urlString: String) { |
|
|
|
|
@ -59,10 +60,12 @@ class WebSocketManager: ObservableObject { |
|
|
|
|
switch result { |
|
|
|
|
case .failure(let error): |
|
|
|
|
self._failure = true |
|
|
|
|
self._error = error |
|
|
|
|
print("Error in receiving message: \(error)") |
|
|
|
|
self._handleWebSocketError(error) |
|
|
|
|
case .success(let message): |
|
|
|
|
self._failure = false |
|
|
|
|
self._reconnectAttempts = 0 |
|
|
|
|
switch message { |
|
|
|
|
case .string(let deviceId): |
|
|
|
|
// print("device id = \(StoreCenter.main.deviceId()), origin id: \(deviceId)") |
|
|
|
|
@ -90,7 +93,7 @@ class WebSocketManager: ObservableObject { |
|
|
|
|
private func _handleWebSocketError(_ error: Error) { |
|
|
|
|
// print("WebSocket error: \(error)") |
|
|
|
|
|
|
|
|
|
// Exponential backoff for reconnection |
|
|
|
|
// up to 10 seconds of reconnection |
|
|
|
|
let delay = min(Double(self._reconnectAttempts), 10.0) |
|
|
|
|
self._reconnectAttempts += 1 |
|
|
|
|
|
|
|
|
|
@ -131,7 +134,17 @@ class WebSocketManager: ObservableObject { |
|
|
|
|
var pingStatus: Bool { |
|
|
|
|
return self._pingOk |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var failure: Bool { |
|
|
|
|
return self._failure |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var error: Error? { |
|
|
|
|
return self._error |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var reconnectAttempts: Int { |
|
|
|
|
return self._reconnectAttempts |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|