diff --git a/native/native_rust_library/src/backup.rs b/native/native_rust_library/src/backup.rs --- a/native/native_rust_library/src/backup.rs +++ b/native/native_rust_library/src/backup.rs @@ -242,7 +242,11 @@ .map_err(|err| err.to_string()); let result = match latest_backup_id_response { - Ok(result) => result, + Ok(Some(result)) => result, + Ok(None) => { + string_callback("".to_string(), promise_id, "null".to_string()); + return; + } Err(error) => { string_callback(error, promise_id, "".to_string()); return; @@ -321,14 +325,20 @@ async fn download_latest_backup_info( user_identifier: String, -) -> Result> { +) -> Result, Box> { + use backup_client::Error as BackupError; let backup_client = BackupClient::new(BACKUP_SOCKET_ADDR)?; let latest_backup_descriptor = BackupDescriptor::Latest { user_identifier }; - let backup_info_response = backup_client + let backup_info_response = match backup_client .download_backup_data(&latest_backup_descriptor, RequestedData::BackupInfo) - .await?; + .await + { + Ok(response) => response, + Err(BackupError::BackupNotFound) => return Ok(None), + Err(e) => return Err(e.into()), + }; let LatestBackupInfoResponse { backup_id, @@ -336,11 +346,11 @@ siwe_backup_msg, } = serde_json::from_slice(&backup_info_response)?; - Ok(LatestBackupInfoResponse { + Ok(Some(LatestBackupInfoResponse { backup_id, user_id, siwe_backup_msg, - }) + })) } async fn download_backup_keys( diff --git a/shared/backup_client/src/lib.rs b/shared/backup_client/src/lib.rs --- a/shared/backup_client/src/lib.rs +++ b/shared/backup_client/src/lib.rs @@ -138,8 +138,15 @@ let response = request.send().await?; - let result = response.error_for_status()?.bytes().await?.to_vec(); + // this should be kept in sync with HTTP error conversions + // from `services/backup/src/error.rs` + match response.status() { + StatusCode::NOT_FOUND => return Err(Error::BackupNotFound), + StatusCode::BAD_REQUEST => return Err(Error::UserNotFound), + _ => (), + }; + let result = response.error_for_status()?.bytes().await?.to_vec(); Ok(result) } } @@ -397,7 +404,11 @@ WSClosed, Unauthenticated, InvalidRequest, + #[display(fmt = "user_not_found")] + UserNotFound, + BackupNotFound, } + impl std::error::Error for Error {} impl From for Error {