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