add ping socket
This commit is contained in:
parent
af173066d5
commit
2b96e49d6f
@ -29,9 +29,12 @@ final class SocketService {
|
|||||||
connectionStateSubject.value
|
connectionStateSubject.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let heartbeatInterval: TimeInterval = 10
|
||||||
|
|
||||||
#if canImport(SocketIO)
|
#if canImport(SocketIO)
|
||||||
private var manager: SocketManager?
|
private var manager: SocketManager?
|
||||||
private var socket: SocketIOClient?
|
private var socket: SocketIOClient?
|
||||||
|
private var heartbeatTimer: DispatchSourceTimer?
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
@ -102,6 +105,7 @@ final class SocketService {
|
|||||||
setupSocket(with: token)
|
setupSocket(with: token)
|
||||||
updateConnectionState(.connecting)
|
updateConnectionState(.connecting)
|
||||||
socket?.connect(withPayload: currentAuthPayload)
|
socket?.connect(withPayload: currentAuthPayload)
|
||||||
|
startHeartbeat()
|
||||||
#else
|
#else
|
||||||
updateConnectionState(.disconnected)
|
updateConnectionState(.disconnected)
|
||||||
if AppConfig.DEBUG {
|
if AppConfig.DEBUG {
|
||||||
@ -185,12 +189,47 @@ final class SocketService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func disconnectInternal() {
|
private func disconnectInternal() {
|
||||||
|
stopHeartbeat()
|
||||||
socket?.disconnect()
|
socket?.disconnect()
|
||||||
manager?.disconnect()
|
manager?.disconnect()
|
||||||
socket = nil
|
socket = nil
|
||||||
manager = nil
|
manager = nil
|
||||||
updateConnectionState(.disconnected)
|
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
|
#else
|
||||||
private func disconnectInternal() { }
|
private func disconnectInternal() { }
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user