From 15bfcf9ceaa16d577147a0ea297b791979db5ca3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 20 Jun 2025 17:37:01 +0800 Subject: [PATCH] Updated on 2026-08-14 --- .../sessions/DefaultWcSessionsManager.kt | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt index c6239ed16c..66211e5d83 100644 --- a/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt +++ b/data/wallet-connect/src/main/kotlin/com/tangem/data/walletconnect/sessions/DefaultWcSessionsManager.kt @@ -7,9 +7,9 @@ import com.domain.blockaid.models.dapp.CheckDAppResult import com.reown.walletkit.client.Wallet import com.reown.walletkit.client.WalletKit import com.tangem.data.walletconnect.pair.AssociateNetworksDelegate +import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.data.walletconnect.utils.WcSdkObserver import com.tangem.data.walletconnect.utils.WcSdkSessionConverter -import com.tangem.data.walletconnect.utils.WC_TAG import com.tangem.datasource.local.walletconnect.WalletConnectStore import com.tangem.domain.walletconnect.model.WcSession import com.tangem.domain.walletconnect.model.WcSessionDTO @@ -18,11 +18,9 @@ import com.tangem.domain.walletconnect.repository.WcSessionsManager import com.tangem.domain.wallets.models.UserWallet import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.* -import kotlinx.coroutines.suspendCancellableCoroutine -import kotlinx.coroutines.withContext import timber.log.Timber import kotlin.coroutines.resume @@ -37,6 +35,7 @@ internal class DefaultWcSessionsManager( private val onSessionDelete = Channel(capacity = Channel.BUFFERED) private val oneTimeMigration = MutableStateFlow(true) + private val oneTimeSessionExtend = MutableStateFlow(true) override val sessions: Flow>> get() = combine(getWallets(), store.sessions) { wallets, inStore -> wallets to inStore } @@ -51,6 +50,10 @@ internal class DefaultWcSessionsManager( val associatedSessions: List = associate(inSdk, inStore, wallets) val someRemove = removeUnknownSessions(inStore, associatedSessions) if (someRemove) return@transform // ignore emit, wait next one + if (oneTimeSessionExtend.value) { + oneTimeSessionExtend.value = false + scope.launch { extendAliveSessions(associatedSessions) } + } emit(associatedSessions.groupBy { it.wallet }) } .distinctUntilChanged() @@ -58,6 +61,7 @@ internal class DefaultWcSessionsManager( override fun onWcSdkInit() { oneTimeMigration.value = true + oneTimeSessionExtend.value = true listenOnSessionDelete() } @@ -150,6 +154,11 @@ internal class DefaultWcSessionsManager( return haveSomeUnknown } + private suspend fun extendAliveSessions(sessions: List) = coroutineScope { + val jobs = sessions.map { launch { sdkSessionExtend(it.sdkModel.topic) } } + jobs.joinAll() + } + private suspend fun sdkDisconnectSession(topic: String): Either { return suspendCancellableCoroutine { continuation -> WalletKit.disconnectSession( @@ -160,6 +169,16 @@ internal class DefaultWcSessionsManager( } } + private suspend fun sdkSessionExtend(topic: String): Either { + return suspendCancellableCoroutine { continuation -> + WalletKit.extendSession( + params = Wallet.Params.SessionExtend(topic), + onSuccess = { continuation.resume(Unit.right()) }, + onError = { continuation.resume(it.throwable.left()) }, + ) + } + } + private fun listenOnSessionDelete() { onSessionDelete.receiveAsFlow() .filterIsInstance()