Avoid restoring several MatrixClient
This commit is contained in:
parent
e4bfc5ef8f
commit
c798a052cc
5 changed files with 32 additions and 37 deletions
|
|
@ -31,6 +31,7 @@ interface MatrixAuthenticationService {
|
||||||
/**
|
/**
|
||||||
* Restore a session from a [sessionId].
|
* Restore a session from a [sessionId].
|
||||||
* Do not restore anything it the access token is not valid anymore.
|
* Do not restore anything it the access token is not valid anymore.
|
||||||
|
* Generally this method should not be used directly, prefer using [MatrixClientProvider.getOrRestore] instead.
|
||||||
*/
|
*/
|
||||||
suspend fun restoreSession(sessionId: SessionId): Result<MatrixClient>
|
suspend fun restoreSession(sessionId: SessionId): Result<MatrixClient>
|
||||||
fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?>
|
fun getHomeserverDetails(): StateFlow<MatrixHomeServerDetails?>
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding
|
||||||
import io.element.android.libraries.core.extensions.flatMap
|
import io.element.android.libraries.core.extensions.flatMap
|
||||||
import io.element.android.libraries.core.log.logger.LoggerTag
|
import io.element.android.libraries.core.log.logger.LoggerTag
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.MatrixClientProvider
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
||||||
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
||||||
|
|
@ -43,7 +43,7 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
|
||||||
private val pusherSubscriber: PusherSubscriber,
|
private val pusherSubscriber: PusherSubscriber,
|
||||||
private val sessionStore: SessionStore,
|
private val sessionStore: SessionStore,
|
||||||
private val userPushStoreFactory: UserPushStoreFactory,
|
private val userPushStoreFactory: UserPushStoreFactory,
|
||||||
private val matrixAuthenticationService: MatrixAuthenticationService,
|
private val matrixClientProvider: MatrixClientProvider,
|
||||||
private val firebaseStore: FirebaseStore,
|
private val firebaseStore: FirebaseStore,
|
||||||
) : FirebaseNewTokenHandler {
|
) : FirebaseNewTokenHandler {
|
||||||
override suspend fun handle(firebaseToken: String) {
|
override suspend fun handle(firebaseToken: String) {
|
||||||
|
|
@ -54,8 +54,8 @@ class DefaultFirebaseNewTokenHandler @Inject constructor(
|
||||||
.forEach { sessionId ->
|
.forEach { sessionId ->
|
||||||
val userDataStore = userPushStoreFactory.getOrCreate(sessionId)
|
val userDataStore = userPushStoreFactory.getOrCreate(sessionId)
|
||||||
if (userDataStore.getPushProviderName() == FirebaseConfig.NAME) {
|
if (userDataStore.getPushProviderName() == FirebaseConfig.NAME) {
|
||||||
matrixAuthenticationService
|
matrixClientProvider
|
||||||
.restoreSession(sessionId)
|
.getOrRestore(sessionId)
|
||||||
.onFailure {
|
.onFailure {
|
||||||
Timber.tag(loggerTag.value).e(it, "Failed to restore session $sessionId")
|
Timber.tag(loggerTag.value).e(it, "Failed to restore session $sessionId")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,13 +18,13 @@ package io.element.android.libraries.pushproviders.firebase
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.MatrixClientProvider
|
||||||
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID
|
import io.element.android.libraries.matrix.test.A_USER_ID
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID_2
|
import io.element.android.libraries.matrix.test.A_USER_ID_2
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID_3
|
import io.element.android.libraries.matrix.test.A_USER_ID_3
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
|
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
|
||||||
import io.element.android.libraries.push.test.FakePusherSubscriber
|
import io.element.android.libraries.push.test.FakePusherSubscriber
|
||||||
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
||||||
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
||||||
|
|
@ -64,16 +64,14 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||||
storeData(aSessionData(A_USER_ID_2))
|
storeData(aSessionData(A_USER_ID_2))
|
||||||
storeData(aSessionData(A_USER_ID_3))
|
storeData(aSessionData(A_USER_ID_3))
|
||||||
},
|
},
|
||||||
matrixAuthenticationService = FakeMatrixAuthenticationService(
|
matrixClientProvider = FakeMatrixClientProvider { sessionId ->
|
||||||
matrixClientResult = { sessionId ->
|
when (sessionId) {
|
||||||
when (sessionId) {
|
A_USER_ID -> Result.success(aMatrixClient1)
|
||||||
A_USER_ID -> Result.success(aMatrixClient1)
|
A_USER_ID_2 -> Result.success(aMatrixClient2)
|
||||||
A_USER_ID_2 -> Result.success(aMatrixClient2)
|
A_USER_ID_3 -> Result.success(aMatrixClient3)
|
||||||
A_USER_ID_3 -> Result.success(aMatrixClient3)
|
else -> Result.failure(IllegalStateException())
|
||||||
else -> Result.failure(IllegalStateException())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
),
|
},
|
||||||
userPushStoreFactory = FakeUserPushStoreFactory(
|
userPushStoreFactory = FakeUserPushStoreFactory(
|
||||||
userPushStore = { sessionId ->
|
userPushStore = { sessionId ->
|
||||||
when (sessionId) {
|
when (sessionId) {
|
||||||
|
|
@ -103,11 +101,9 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||||
sessionStore = InMemoryMultiSessionsStore().apply {
|
sessionStore = InMemoryMultiSessionsStore().apply {
|
||||||
storeData(aSessionData(A_USER_ID))
|
storeData(aSessionData(A_USER_ID))
|
||||||
},
|
},
|
||||||
matrixAuthenticationService = FakeMatrixAuthenticationService(
|
matrixClientProvider = FakeMatrixClientProvider {
|
||||||
matrixClientResult = { _ ->
|
Result.failure(IllegalStateException())
|
||||||
Result.failure(IllegalStateException())
|
},
|
||||||
}
|
|
||||||
),
|
|
||||||
userPushStoreFactory = FakeUserPushStoreFactory(
|
userPushStoreFactory = FakeUserPushStoreFactory(
|
||||||
userPushStore = { _ ->
|
userPushStore = { _ ->
|
||||||
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
|
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
|
||||||
|
|
@ -129,11 +125,9 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||||
sessionStore = InMemoryMultiSessionsStore().apply {
|
sessionStore = InMemoryMultiSessionsStore().apply {
|
||||||
storeData(aSessionData(A_USER_ID))
|
storeData(aSessionData(A_USER_ID))
|
||||||
},
|
},
|
||||||
matrixAuthenticationService = FakeMatrixAuthenticationService(
|
matrixClientProvider = FakeMatrixClientProvider {
|
||||||
matrixClientResult = { _ ->
|
Result.success(aMatrixClient1)
|
||||||
Result.success(aMatrixClient1)
|
},
|
||||||
}
|
|
||||||
),
|
|
||||||
userPushStoreFactory = FakeUserPushStoreFactory(
|
userPushStoreFactory = FakeUserPushStoreFactory(
|
||||||
userPushStore = { _ ->
|
userPushStore = { _ ->
|
||||||
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
|
FakeUserPushStore(pushProviderName = FirebaseConfig.NAME)
|
||||||
|
|
@ -152,14 +146,14 @@ class DefaultFirebaseNewTokenHandlerTest {
|
||||||
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
|
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
|
||||||
sessionStore: SessionStore = InMemorySessionStore(),
|
sessionStore: SessionStore = InMemorySessionStore(),
|
||||||
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
|
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
|
||||||
matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService(),
|
matrixClientProvider: MatrixClientProvider = FakeMatrixClientProvider(),
|
||||||
firebaseStore: FirebaseStore = InMemoryFirebaseStore(),
|
firebaseStore: FirebaseStore = InMemoryFirebaseStore(),
|
||||||
): FirebaseNewTokenHandler {
|
): FirebaseNewTokenHandler {
|
||||||
return DefaultFirebaseNewTokenHandler(
|
return DefaultFirebaseNewTokenHandler(
|
||||||
pusherSubscriber = pusherSubscriber,
|
pusherSubscriber = pusherSubscriber,
|
||||||
sessionStore = sessionStore,
|
sessionStore = sessionStore,
|
||||||
userPushStoreFactory = userPushStoreFactory,
|
userPushStoreFactory = userPushStoreFactory,
|
||||||
matrixAuthenticationService = matrixAuthenticationService,
|
matrixClientProvider = matrixClientProvider,
|
||||||
firebaseStore = firebaseStore
|
firebaseStore = firebaseStore
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import com.squareup.anvil.annotations.ContributesBinding
|
||||||
import io.element.android.libraries.core.extensions.flatMap
|
import io.element.android.libraries.core.extensions.flatMap
|
||||||
import io.element.android.libraries.core.log.logger.LoggerTag
|
import io.element.android.libraries.core.log.logger.LoggerTag
|
||||||
import io.element.android.libraries.di.AppScope
|
import io.element.android.libraries.di.AppScope
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.MatrixClientProvider
|
||||||
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
||||||
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
||||||
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
|
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
|
||||||
|
|
@ -41,7 +41,7 @@ class DefaultUnifiedPushNewGatewayHandler @Inject constructor(
|
||||||
private val pusherSubscriber: PusherSubscriber,
|
private val pusherSubscriber: PusherSubscriber,
|
||||||
private val userPushStoreFactory: UserPushStoreFactory,
|
private val userPushStoreFactory: UserPushStoreFactory,
|
||||||
private val pushClientSecret: PushClientSecret,
|
private val pushClientSecret: PushClientSecret,
|
||||||
private val matrixAuthenticationService: MatrixAuthenticationService,
|
private val matrixClientProvider: MatrixClientProvider,
|
||||||
) : UnifiedPushNewGatewayHandler {
|
) : UnifiedPushNewGatewayHandler {
|
||||||
override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> {
|
override suspend fun handle(endpoint: String, pushGateway: String, clientSecret: String): Result<Unit> {
|
||||||
// Register the pusher for the session with this client secret, if is it using UnifiedPush.
|
// Register the pusher for the session with this client secret, if is it using UnifiedPush.
|
||||||
|
|
@ -52,8 +52,8 @@ class DefaultUnifiedPushNewGatewayHandler @Inject constructor(
|
||||||
}
|
}
|
||||||
val userDataStore = userPushStoreFactory.getOrCreate(userId)
|
val userDataStore = userPushStoreFactory.getOrCreate(userId)
|
||||||
return if (userDataStore.getPushProviderName() == UnifiedPushConfig.NAME) {
|
return if (userDataStore.getPushProviderName() == UnifiedPushConfig.NAME) {
|
||||||
matrixAuthenticationService
|
matrixClientProvider
|
||||||
.restoreSession(userId)
|
.getOrRestore(userId)
|
||||||
.flatMap { client ->
|
.flatMap { client ->
|
||||||
pusherSubscriber.registerPusher(client, endpoint, pushGateway)
|
pusherSubscriber.registerPusher(client, endpoint, pushGateway)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,11 @@ package io.element.android.libraries.pushproviders.unifiedpush
|
||||||
|
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.MatrixClientProvider
|
||||||
import io.element.android.libraries.matrix.test.A_SECRET
|
import io.element.android.libraries.matrix.test.A_SECRET
|
||||||
import io.element.android.libraries.matrix.test.A_USER_ID
|
import io.element.android.libraries.matrix.test.A_USER_ID
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
|
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
|
||||||
import io.element.android.libraries.push.test.FakePusherSubscriber
|
import io.element.android.libraries.push.test.FakePusherSubscriber
|
||||||
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
||||||
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
import io.element.android.libraries.pushstore.api.UserPushStoreFactory
|
||||||
|
|
@ -86,7 +86,7 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
|
||||||
pusherSubscriber = FakePusherSubscriber(
|
pusherSubscriber = FakePusherSubscriber(
|
||||||
registerPusherResult = { _, _, _ -> Result.failure(IllegalStateException("an error")) }
|
registerPusherResult = { _, _, _ -> Result.failure(IllegalStateException("an error")) }
|
||||||
),
|
),
|
||||||
matrixAuthenticationService = FakeMatrixAuthenticationService(matrixClientResult = { Result.success(aMatrixClient) }),
|
matrixClientProvider = FakeMatrixClientProvider { Result.success(aMatrixClient) },
|
||||||
)
|
)
|
||||||
val result = defaultUnifiedPushNewGatewayHandler.handle(
|
val result = defaultUnifiedPushNewGatewayHandler.handle(
|
||||||
endpoint = "aEndpoint",
|
endpoint = "aEndpoint",
|
||||||
|
|
@ -114,7 +114,7 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
|
||||||
pusherSubscriber = FakePusherSubscriber(
|
pusherSubscriber = FakePusherSubscriber(
|
||||||
registerPusherResult = lambda
|
registerPusherResult = lambda
|
||||||
),
|
),
|
||||||
matrixAuthenticationService = FakeMatrixAuthenticationService(matrixClientResult = { Result.success(aMatrixClient) }),
|
matrixClientProvider = FakeMatrixClientProvider { Result.success(aMatrixClient) },
|
||||||
)
|
)
|
||||||
val result = defaultUnifiedPushNewGatewayHandler.handle(
|
val result = defaultUnifiedPushNewGatewayHandler.handle(
|
||||||
endpoint = "aEndpoint",
|
endpoint = "aEndpoint",
|
||||||
|
|
@ -131,13 +131,13 @@ class DefaultUnifiedPushNewGatewayHandlerTest {
|
||||||
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
|
pusherSubscriber: PusherSubscriber = FakePusherSubscriber(),
|
||||||
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
|
userPushStoreFactory: UserPushStoreFactory = FakeUserPushStoreFactory(),
|
||||||
pushClientSecret: PushClientSecret = FakePushClientSecret(),
|
pushClientSecret: PushClientSecret = FakePushClientSecret(),
|
||||||
matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService()
|
matrixClientProvider: MatrixClientProvider = FakeMatrixClientProvider()
|
||||||
): DefaultUnifiedPushNewGatewayHandler {
|
): DefaultUnifiedPushNewGatewayHandler {
|
||||||
return DefaultUnifiedPushNewGatewayHandler(
|
return DefaultUnifiedPushNewGatewayHandler(
|
||||||
pusherSubscriber = pusherSubscriber,
|
pusherSubscriber = pusherSubscriber,
|
||||||
userPushStoreFactory = userPushStoreFactory,
|
userPushStoreFactory = userPushStoreFactory,
|
||||||
pushClientSecret = pushClientSecret,
|
pushClientSecret = pushClientSecret,
|
||||||
matrixAuthenticationService = matrixAuthenticationService
|
matrixClientProvider = matrixClientProvider,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue