diff --git a/yobble/Services/SocketService.swift b/yobble/Services/SocketService.swift index cfb9f05..9bb9db1 100644 --- a/yobble/Services/SocketService.swift +++ b/yobble/Services/SocketService.swift @@ -86,6 +86,23 @@ final class SocketService { } } + @discardableResult + private func refreshAuthTokenIfNeeded(disconnectIfMissing: Bool) -> Bool { + let storedToken = resolveCurrentAccessToken() + + guard let token = storedToken, !token.isEmpty else { + guard disconnectIfMissing else { return false } + currentToken = nil + disconnectInternal() + return true + } + + guard token != currentToken else { return false } + + connectInternal(with: token) + return true + } + private func resolveCurrentAccessToken() -> String? { guard let login = UserDefaults.standard.string(forKey: "currentUser"), @@ -172,11 +189,13 @@ final class SocketService { socket.on(clientEvent: .reconnect) { _, _ in if AppConfig.DEBUG { print("[SocketService] Reconnecting") } + if self.refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } self.updateConnectionState(.connecting) } socket.on(clientEvent: .reconnectAttempt) { data, _ in if AppConfig.DEBUG { print("[SocketService] Reconnect attempt: \(data)") } + if self.refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } self.updateConnectionState(.connecting) } @@ -233,6 +252,8 @@ final class SocketService { } private func performHeartbeatCheck() { + if refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } + guard let socket = socket else { updateConnectionState(.disconnected) return @@ -245,6 +266,7 @@ final class SocketService { updateConnectionState(.connecting) case .disconnected, .notConnected: updateConnectionState(.connecting) + if refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } socket.connect(withPayload: currentAuthPayload) @unknown default: updateConnectionState(.connecting) @@ -313,6 +335,7 @@ final class SocketService { consecutiveHeartbeatMisses = 0 updateConnectionState(.connecting) + if refreshAuthTokenIfNeeded(disconnectIfMissing: true) { return } socket.disconnect() socket.connect(withPayload: currentAuthPayload) }