Compare commits

...

2 Commits

Author SHA1 Message Date
2b96e49d6f add ping socket 2025-10-21 03:34:36 +03:00
af173066d5 patch 2025-10-21 03:28:39 +03:00

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 {
@ -149,6 +153,27 @@ final class SocketService {
self.updateConnectionState(.connected)
}
socket.on(clientEvent: .statusChange) { data, _ in
guard let rawStatus = data.first as? SocketIOStatus else { return }
if rawStatus == .connected {
self.updateConnectionState(.connected)
} else if rawStatus == .connecting {
self.updateConnectionState(.connecting)
} else {
self.updateConnectionState(.disconnected)
}
}
socket.on(clientEvent: .reconnect) { _, _ in
if AppConfig.DEBUG { print("[SocketService] Reconnecting") }
self.updateConnectionState(.connecting)
}
socket.on(clientEvent: .reconnectAttempt) { data, _ in
if AppConfig.DEBUG { print("[SocketService] Reconnect attempt: \(data)") }
self.updateConnectionState(.connecting)
}
socket.on(clientEvent: .disconnect) { data, _ in
if AppConfig.DEBUG { print("[SocketService] Disconnected: \(data)") }
self.updateConnectionState(.disconnected)
@ -164,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