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