diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/SessionRestorationException.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/SessionRestorationException.kt new file mode 100644 index 0000000000..bf6f50cab5 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/auth/SessionRestorationException.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.auth + +import io.element.android.libraries.matrix.api.core.SessionId + +sealed class SessionRestorationException(message: String, cause: Throwable? = null) : Exception(message, cause) { + data class MissingSession(val sessionId: SessionId) : SessionRestorationException("Session with id $sessionId not found") + class InvalidToken : SessionRestorationException("Access token is invalid or expired") +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ClientException.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ClientException.kt index 35acec43ca..30f77e7b5e 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ClientException.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/exception/ClientException.kt @@ -8,10 +8,10 @@ package io.element.android.libraries.matrix.api.exception -sealed class ClientException(message: String, val details: String?) : Exception(message) { - class Generic(message: String, details: String?) : ClientException(message, details) - class MatrixApi(val kind: ErrorKind, val code: String, message: String, details: String?) : ClientException(message, details) - class Other(message: String) : ClientException(message, null) +sealed class ClientException(message: String, val details: String?, cause: Throwable? = null) : Exception(message, cause) { + class Generic(message: String, details: String?, cause: Throwable? = null) : ClientException(message, details, cause) + class MatrixApi(val kind: ErrorKind, val code: String, message: String, details: String?, cause: Throwable? = null) : ClientException(message, details, cause) + class Other(message: String, cause: Throwable? = null) : ClientException(message, null, cause) } fun ClientException.isNetworkError(): Boolean { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index df4333654b..97719bed36 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -20,6 +20,7 @@ import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.auth.MatrixHomeServerDetails import io.element.android.libraries.matrix.api.auth.OidcDetails import io.element.android.libraries.matrix.api.auth.OidcPrompt +import io.element.android.libraries.matrix.api.auth.SessionRestorationException import io.element.android.libraries.matrix.api.auth.external.ExternalSession import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep @@ -91,10 +92,10 @@ class RustMatrixAuthenticationService( } rustMatrixClientFactory.create(sessionData) } else { - error("Token is not valid") + throw SessionRestorationException.InvalidToken() } } else { - error("No session to restore with id $sessionId") + throw SessionRestorationException.MissingSession(sessionId) } }.mapFailure { failure -> failure.mapClientException() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt index 76a72cd65b..f5d1a4253b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/encryption/RecoveryExceptionMapper.kt @@ -30,7 +30,7 @@ fun Throwable.mapRecoveryException(): RecoveryException { } } else -> RecoveryException.Client( - ClientException.Other("Unknown error") + ClientException.Other("Unknown error", this) ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ClientException.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ClientException.kt index 668e55e9bf..eefa6d4986 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ClientException.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/exception/ClientException.kt @@ -15,15 +15,16 @@ fun Throwable.mapClientException(): ClientException { return when (this) { is RustClientException -> { when (this) { - is RustClientException.Generic -> ClientException.Generic(msg, details) + is RustClientException.Generic -> ClientException.Generic(message = msg, details = details, cause = this) is RustClientException.MatrixApi -> ClientException.MatrixApi( kind = kind.map(), code = code, message = msg, details = details, + cause = this, ) } } - else -> ClientException.Other(message ?: "Unknown error") + else -> ClientException.Other(message ?: "Unknown error", this) } }