diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/data/services/stream/StreamService.kt b/demo-app/src/main/kotlin/io/getstream/video/android/data/services/stream/StreamService.kt index eb2262c0032..0d33c396483 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/data/services/stream/StreamService.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/data/services/stream/StreamService.kt @@ -32,11 +32,12 @@ fun interface StreamService { suspend fun getAuthData( @Query("environment") environment: String, @Query("user_id") userId: String?, + @Query("exp") exp: Int, ): GetAuthDataResponse companion object { private const val BASE_URL = "https://pronto.getstream.io/" - + public const val TOKEN_EXPIRY_TIME = 40 private val json = Json { ignoreUnknownKeys = true } private val retrofit = Retrofit.Builder() @@ -46,9 +47,9 @@ fun interface StreamService { private val serviceInstance = retrofit.create() - val instance = StreamService { environment, userId -> + val instance = StreamService { environment, userId, exp -> User.builtInCredentials[userId]?.toAuthDataResponse() - ?: serviceInstance.getAuthData(environment, userId) + ?: serviceInstance.getAuthData(environment, userId, exp) } } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginViewModel.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginViewModel.kt index c66b2a9649d..a200efe5b29 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginViewModel.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginViewModel.kt @@ -92,6 +92,7 @@ class LoginViewModel @Inject constructor( val authData = StreamService.instance.getAuthData( environment = it.env, userId = userId, + StreamService.TOKEN_EXPIRY_TIME, ) val loggedInGoogleUser = if (autoLogIn) null else googleAccountRepository.getCurrentUser() @@ -128,6 +129,7 @@ class LoginViewModel @Inject constructor( val authData = StreamService.instance.getAuthData( environment = it.env, userId = user.id, + StreamService.TOKEN_EXPIRY_TIME, ) // Store the data in the demo app dataStore.updateUser(user) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/util/StreamVideoInitHelper.kt b/demo-app/src/main/kotlin/io/getstream/video/android/util/StreamVideoInitHelper.kt index c924c3f7d0c..ac8de5eb5b8 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/util/StreamVideoInitHelper.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/util/StreamVideoInitHelper.kt @@ -58,6 +58,7 @@ import io.getstream.video.android.util.config.AppConfig import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.runBlocking public enum class InitializedState { NOT_STARTED, RUNNING, FINISHED, FAILED @@ -121,6 +122,7 @@ object StreamVideoInitHelper { authData = StreamService.instance.getAuthData( environment = AppConfig.currentEnvironment.value!!.env, userId = userId, + StreamService.TOKEN_EXPIRY_TIME, ) loggedInUser = User(id = authData.userId, role = "admin") @@ -137,6 +139,7 @@ object StreamVideoInitHelper { authData = StreamService.instance.getAuthData( environment = AppConfig.currentEnvironment.value!!.env, userId = loggedInUser.id, + StreamService.TOKEN_EXPIRY_TIME, ) } @@ -194,7 +197,24 @@ object StreamVideoInitHelper { chatClient.connectUser( user = chatUser, - token = token, + tokenProvider = object : io.getstream.chat.android.client.token.TokenProvider { + override fun loadToken(): String { + return runBlocking { + Log.d("TokenProvider", "[loadToken] Chat token provider START") + val email = user.custom?.get("email") + val authData = StreamService.instance.getAuthData( + environment = AppConfig.currentEnvironment.value!!.env, + userId = email, + StreamService.TOKEN_EXPIRY_TIME, + ) + Log.d( + "TokenProvider", + "[loadToken] Chat token provider END, token: ${authData.token}", + ) + authData.token + } + } + }, ).enqueue() } @@ -286,10 +306,18 @@ object StreamVideoInitHelper { ), tokenProvider = object : TokenProvider { override suspend fun loadToken(): String { - val email = user.custom?.get("email") + val userEmail = user.custom?.get("email") + val userId = user.id + val userIdForTokenRenewal = if (userEmail.isNullOrEmpty()) userId else userEmail + Log.d("TokenProvider", "[loadToken] Video token provider START") val authData = StreamService.instance.getAuthData( environment = AppConfig.currentEnvironment.value!!.env, - userId = email, + userId = userIdForTokenRenewal, + StreamService.TOKEN_EXPIRY_TIME, + ) + Log.d( + "TokenProvider", + "[loadToken] Video token provider END: ${authData.token}", ) return authData.token } diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocket.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocket.kt index 7e939e92951..562dbcd9987 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocket.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocket.kt @@ -278,6 +278,15 @@ internal open class CoordinatorSocket( tokenManager.expireToken() } + if (error.serverErrorCode == VideoErrorCode.TOKEN_EXPIRED.code) { + logger.d { "[onVideoNetworkError] load sync START" } + tokenManager.expireToken() + val token = tokenManager.loadSync() + if (token.isNotEmpty()) { + logger.d { "[onVideoNetworkError] load sync END: $token" } + } + } + when (error.serverErrorCode) { VideoErrorCode.UNDEFINED_TOKEN.code, VideoErrorCode.INVALID_TOKEN.code, diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocketConnection.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocketConnection.kt index b075c461f5f..f721920e236 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocketConnection.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/socket/coordinator/CoordinatorSocketConnection.kt @@ -126,7 +126,9 @@ public open class CoordinatorSocketConnection( // Extension opportunity for subclasses override fun onCreated() { super.onCreated() - logger.d { "[onCreated] Socket is created" } + logger.d { + "[onCreated] Socket is created, initial token: $token, tokenManager.getToken() = ${tokenManager.getToken()}" + } scope.launch { logger.d { "[onConnected] Video socket created, user: $user" } if (token.isEmpty()) { @@ -134,7 +136,7 @@ public open class CoordinatorSocketConnection( disconnect() } else { val authRequest = WSAuthMessageRequest( - token = token, + token = tokenManager.getToken().ifEmpty { token }, userDetails = ConnectUserDetailsRequest( id = user.id, name = user.name.takeUnless { it.isWhitespaceOnly() },