add ping socket

This commit is contained in:
cheykrym 2025-10-21 03:34:36 +03:00
parent af173066d5
commit 2b96e49d6f

View File

@ -29,9 +29,12 @@ final class SocketService {
connectionStateSubject.value
}
private let heartbeatInterval: TimeInterval = 10
#if canImport(SocketIO)
private var manager: SocketManager?
private var socket: SocketIOClient?
private var heartbeatTimer: DispatchSourceTimer?
#endif
private init() {}
@ -102,6 +105,7 @@ final class SocketService {
setupSocket(with: token)
updateConnectionState(.connecting)
socket?.connect(withPayload: currentAuthPayload)
startHeartbeat()
#else
updateConnectionState(.disconnected)
if AppConfig.DEBUG {
@ -185,12 +189,47 @@ final class SocketService {
}
private func disconnectInternal() {
stopHeartbeat()
socket?.disconnect()
manager?.disconnect()
socket = nil
manager = nil
updateConnectionState(.disconnected)
}
private func startHeartbeat() {
guard heartbeatInterval > 0 else { return }
stopHeartbeat()
let timer = DispatchSource.makeTimerSource(queue: syncQueue)
timer.schedule(deadline: .now() + heartbeatInterval, repeating: heartbeatInterval)
timer.setEventHandler { [weak self] in
guard let self else { return }
guard let socket = self.socket else {
self.updateConnectionState(.disconnected)
return
}
switch socket.status {
case .connected:
self.updateConnectionState(.connected)
case .connecting:
self.updateConnectionState(.connecting)
case .disconnected, .notConnected:
self.updateConnectionState(.connecting)
socket.connect(withPayload: self.currentAuthPayload)
@unknown default:
self.updateConnectionState(.connecting)
}
}
heartbeatTimer = timer
timer.resume()
}
private func stopHeartbeat() {
heartbeatTimer?.cancel()
heartbeatTimer = nil
}
#else
private func disconnectInternal() { }
#endif