fix reconnect socket
This commit is contained in:
parent
da5f198d8c
commit
cc32d7acad
@ -30,8 +30,8 @@ struct TopBarView: View {
|
|||||||
private var statusMessage: String? {
|
private var statusMessage: String? {
|
||||||
if viewModel.chatLoadingState == .loading {
|
if viewModel.chatLoadingState == .loading {
|
||||||
return NSLocalizedString("Загрузка чатов", comment: "")
|
return NSLocalizedString("Загрузка чатов", comment: "")
|
||||||
} else
|
}
|
||||||
if viewModel.socketState != .connected {
|
if viewModel.socketState == .connecting {
|
||||||
return NSLocalizedString("Подключение", comment: "")
|
return NSLocalizedString("Подключение", comment: "")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -41,6 +41,7 @@ final class SocketService {
|
|||||||
private var heartbeatAckInFlight = false
|
private var heartbeatAckInFlight = false
|
||||||
private var lastHeartbeatSentAt: Date?
|
private var lastHeartbeatSentAt: Date?
|
||||||
private var consecutiveHeartbeatMisses = 0
|
private var consecutiveHeartbeatMisses = 0
|
||||||
|
private var reconnectWorkItem: DispatchWorkItem?
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
@ -126,6 +127,7 @@ final class SocketService {
|
|||||||
currentToken = token
|
currentToken = token
|
||||||
currentAuthPayload = ["token": token]
|
currentAuthPayload = ["token": token]
|
||||||
setupSocket(with: token)
|
setupSocket(with: token)
|
||||||
|
cancelScheduledReconnect()
|
||||||
updateConnectionState(.connecting)
|
updateConnectionState(.connecting)
|
||||||
socket?.connect(withPayload: currentAuthPayload)
|
socket?.connect(withPayload: currentAuthPayload)
|
||||||
startHeartbeat()
|
startHeartbeat()
|
||||||
@ -202,11 +204,13 @@ final class SocketService {
|
|||||||
socket.on(clientEvent: .disconnect) { data, _ in
|
socket.on(clientEvent: .disconnect) { data, _ in
|
||||||
if AppConfig.DEBUG { print("[SocketService] Disconnected: \(data)") }
|
if AppConfig.DEBUG { print("[SocketService] Disconnected: \(data)") }
|
||||||
self.updateConnectionState(.disconnected)
|
self.updateConnectionState(.disconnected)
|
||||||
|
self.scheduleReconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.on(clientEvent: .error) { data, _ in
|
socket.on(clientEvent: .error) { data, _ in
|
||||||
if AppConfig.DEBUG { print("[SocketService] Error: \(data)") }
|
if AppConfig.DEBUG { print("[SocketService] Error: \(data)") }
|
||||||
self.updateConnectionState(.disconnected)
|
self.updateConnectionState(.disconnected)
|
||||||
|
self.scheduleReconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.on("pong") { [weak self] _, _ in
|
socket.on("pong") { [weak self] _, _ in
|
||||||
@ -223,6 +227,7 @@ final class SocketService {
|
|||||||
|
|
||||||
private func disconnectInternal() {
|
private func disconnectInternal() {
|
||||||
stopHeartbeat()
|
stopHeartbeat()
|
||||||
|
cancelScheduledReconnect()
|
||||||
socket?.disconnect()
|
socket?.disconnect()
|
||||||
manager?.disconnect()
|
manager?.disconnect()
|
||||||
socket = nil
|
socket = nil
|
||||||
@ -321,6 +326,7 @@ final class SocketService {
|
|||||||
consecutiveHeartbeatMisses = 0
|
consecutiveHeartbeatMisses = 0
|
||||||
heartbeatAckInFlight = false
|
heartbeatAckInFlight = false
|
||||||
lastHeartbeatSentAt = nil
|
lastHeartbeatSentAt = nil
|
||||||
|
cancelScheduledReconnect()
|
||||||
updateConnectionState(.connected)
|
updateConnectionState(.connected)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,6 +345,28 @@ final class SocketService {
|
|||||||
socket.disconnect()
|
socket.disconnect()
|
||||||
socket.connect(withPayload: currentAuthPayload)
|
socket.connect(withPayload: currentAuthPayload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func scheduleReconnect(after delay: TimeInterval = 5) {
|
||||||
|
cancelScheduledReconnect()
|
||||||
|
let workItem = DispatchWorkItem { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
if self.refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return }
|
||||||
|
|
||||||
|
if let socket = self.socket {
|
||||||
|
self.updateConnectionState(.connecting)
|
||||||
|
socket.connect(withPayload: self.currentAuthPayload)
|
||||||
|
} else {
|
||||||
|
self.connectForCurrentUser()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reconnectWorkItem = workItem
|
||||||
|
syncQueue.asyncAfter(deadline: .now() + delay, execute: workItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func cancelScheduledReconnect() {
|
||||||
|
reconnectWorkItem?.cancel()
|
||||||
|
reconnectWorkItem = nil
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
private func disconnectInternal() { }
|
private func disconnectInternal() { }
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -116,11 +116,11 @@ struct ChatsTab: View {
|
|||||||
Text(message)
|
Text(message)
|
||||||
.font(.subheadline)
|
.font(.subheadline)
|
||||||
.foregroundColor(.orange)
|
.foregroundColor(.orange)
|
||||||
Spacer(minLength: 0)
|
// Spacer(minLength: 0)
|
||||||
Button(action: triggerChatsReload) {
|
// Button(action: triggerChatsReload) {
|
||||||
Text(NSLocalizedString("Обновить", comment: ""))
|
// Text(NSLocalizedString("Обновить", comment: ""))
|
||||||
.font(.subheadline)
|
// .font(.subheadline)
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
.padding(.vertical, 4)
|
.padding(.vertical, 4)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user