Compare commits
2 Commits
7c1d46ab77
...
2b96e49d6f
| Author | SHA1 | Date | |
|---|---|---|---|
| 2b96e49d6f | |||
| af173066d5 |
@ -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 {
|
||||||
@ -149,6 +153,27 @@ final class SocketService {
|
|||||||
self.updateConnectionState(.connected)
|
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
|
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)
|
||||||
@ -164,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