fix reconnect socket

This commit is contained in:
cheykrym 2025-10-21 19:12:25 +03:00
parent da5f198d8c
commit cc32d7acad
3 changed files with 35 additions and 7 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
} }