From 8b47df31ece1cded24500fb4eb2f376d3d0f1ae1 Mon Sep 17 00:00:00 2001 From: Nicholas Molnar <65710+neekolas@users.noreply.github.com> Date: Wed, 14 Aug 2024 17:41:48 -0700 Subject: [PATCH] Remove dead endpoints (#963) ## AI Assisted Summary ### TL;DR Removed deprecated MLS API methods and updated related functionality. ### What changed? - Removed `register_installation` method from `XmtpMlsClient` trait and its implementations. - Removed `get_identity_updates` method from `XmtpMlsClient` trait and its implementations. - Removed related types and imports for these deprecated methods. - Updated tests to reflect these changes. ### How to test? 1. Ensure all existing tests pass after removing the deprecated methods. 2. Verify that any code previously using `register_installation` now uses `upload_key_package` instead. 3. Check that no code is relying on the removed `get_identity_updates` functionality. ### Why make this change? This change is part of an effort to streamline the MLS API by removing deprecated methods. The `register_installation` method has been replaced by `upload_key_package`, and `get_identity_updates` is no longer needed. Removing these methods simplifies the API, reduces maintenance overhead, and ensures that clients are using the most up-to-date methods for interacting with the MLS system. --- --- xmtp_api_grpc/src/grpc_api_helper.rs | 34 +---- xmtp_api_http/src/lib.rs | 40 +----- xmtp_mls/src/api/mls.rs | 198 +-------------------------- xmtp_mls/src/api/test_utils.rs | 16 +-- xmtp_mls/src/client.rs | 2 +- xmtp_proto/src/api_client.rs | 16 +-- 6 files changed, 23 insertions(+), 283 deletions(-) diff --git a/xmtp_api_grpc/src/grpc_api_helper.rs b/xmtp_api_grpc/src/grpc_api_helper.rs index 6ec010a44..de1523b50 100644 --- a/xmtp_api_grpc/src/grpc_api_helper.rs +++ b/xmtp_api_grpc/src/grpc_api_helper.rs @@ -21,11 +21,10 @@ use xmtp_proto::{ }, xmtp::mls::api::v1::{ mls_api_client::MlsApiClient as ProtoMlsApiClient, FetchKeyPackagesRequest, - FetchKeyPackagesResponse, GetIdentityUpdatesRequest, GetIdentityUpdatesResponse, - QueryGroupMessagesRequest, QueryGroupMessagesResponse, QueryWelcomeMessagesRequest, - QueryWelcomeMessagesResponse, RegisterInstallationRequest, RegisterInstallationResponse, - SendGroupMessagesRequest, SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, - SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, + FetchKeyPackagesResponse, QueryGroupMessagesRequest, QueryGroupMessagesResponse, + QueryWelcomeMessagesRequest, QueryWelcomeMessagesResponse, SendGroupMessagesRequest, + SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, SubscribeWelcomeMessagesRequest, + UploadKeyPackageRequest, }, }; @@ -344,19 +343,6 @@ impl MutableApiSubscription for GrpcMutableSubscription { #[async_trait] impl XmtpMlsClient for Client { - #[tracing::instrument(level = "trace", skip_all)] - async fn register_installation( - &self, - req: RegisterInstallationRequest, - ) -> Result { - let client = &mut self.mls_client.clone(); - let res = client.register_installation(req).await; - match res { - Ok(response) => Ok(response.into_inner()), - Err(e) => Err(Error::new(ErrorKind::MlsError).with(e)), - } - } - #[tracing::instrument(level = "trace", skip_all)] async fn upload_key_package(&self, req: UploadKeyPackageRequest) -> Result<(), Error> { let client = &mut self.mls_client.clone(); @@ -425,18 +411,6 @@ impl XmtpMlsClient for Client { .map_err(|e| Error::new(ErrorKind::MlsError).with(e)) } - #[tracing::instrument(level = "trace", skip_all)] - async fn get_identity_updates( - &self, - req: GetIdentityUpdatesRequest, - ) -> Result { - let client = &mut self.mls_client.clone(); - let res = client.get_identity_updates(req).await; - - res.map(|r| r.into_inner()) - .map_err(|e| Error::new(ErrorKind::MlsError).with(e)) - } - async fn subscribe_group_messages( &self, req: SubscribeGroupMessagesRequest, diff --git a/xmtp_api_http/src/lib.rs b/xmtp_api_http/src/lib.rs index a375ded72..e4708371d 100644 --- a/xmtp_api_http/src/lib.rs +++ b/xmtp_api_http/src/lib.rs @@ -13,11 +13,10 @@ use xmtp_proto::xmtp::mls::api::v1::{GroupMessage, WelcomeMessage}; use xmtp_proto::{ api_client::{GroupMessageStream, WelcomeMessageStream, XmtpMlsClient}, xmtp::mls::api::v1::{ - FetchKeyPackagesRequest, FetchKeyPackagesResponse, GetIdentityUpdatesRequest, - GetIdentityUpdatesResponse, QueryGroupMessagesRequest, QueryGroupMessagesResponse, - QueryWelcomeMessagesRequest, QueryWelcomeMessagesResponse, RegisterInstallationRequest, - RegisterInstallationResponse, SendGroupMessagesRequest, SendWelcomeMessagesRequest, - SubscribeGroupMessagesRequest, SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, + FetchKeyPackagesRequest, FetchKeyPackagesResponse, QueryGroupMessagesRequest, + QueryGroupMessagesResponse, QueryWelcomeMessagesRequest, QueryWelcomeMessagesResponse, + SendGroupMessagesRequest, SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, + SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, }, }; @@ -54,25 +53,6 @@ impl XmtpHttpApiClient { #[cfg_attr(not(target_arch = "wasm32"), async_trait)] #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] impl XmtpMlsClient for XmtpHttpApiClient { - async fn register_installation( - &self, - request: RegisterInstallationRequest, - ) -> Result { - let res = self - .http_client - .post(self.endpoint(ApiEndpoints::REGISTER_INSTALLATION)) - .json(&request) - .send() - .await - .map_err(|e| Error::new(ErrorKind::MlsError).with(e))? - .bytes() - .await - .map_err(|e| Error::new(ErrorKind::MlsError).with(e))?; - - log::debug!("register_installation"); - handle_error(&*res) - } - async fn upload_key_package(&self, request: UploadKeyPackageRequest) -> Result<(), Error> { let res = self .http_client @@ -143,14 +123,6 @@ impl XmtpMlsClient for XmtpHttpApiClient { handle_error(&*res) } - // deprecated - async fn get_identity_updates( - &self, - _request: GetIdentityUpdatesRequest, - ) -> Result { - unimplemented!() - } - async fn query_group_messages( &self, request: QueryGroupMessagesRequest, @@ -287,10 +259,10 @@ mod tests { use super::*; #[tokio::test] - async fn test_register_installation() { + async fn test_upload_key_package() { let client = XmtpHttpApiClient::new(ApiUrls::LOCAL_ADDRESS.to_string()).unwrap(); let result = client - .register_installation(RegisterInstallationRequest { + .upload_key_package(UploadKeyPackageRequest { is_inbox_id_credential: false, key_package: Some(KeyPackageUpload { key_package_tls_serialized: vec![1, 2, 3], diff --git a/xmtp_mls/src/api/mls.rs b/xmtp_mls/src/api/mls.rs index eaf3af6b4..e12dd9574 100644 --- a/xmtp_mls/src/api/mls.rs +++ b/xmtp_mls/src/api/mls.rs @@ -6,15 +6,13 @@ use xmtp_proto::api_client::{ Error as ApiError, ErrorKind, GroupMessageStream, WelcomeMessageStream, }; use xmtp_proto::xmtp::mls::api::v1::{ - get_identity_updates_response::update::Kind as UpdateKind, group_message_input::{Version as GroupMessageInputVersion, V1 as GroupMessageInputV1}, subscribe_group_messages_request::Filter as GroupFilterProto, subscribe_welcome_messages_request::Filter as WelcomeFilterProto, - FetchKeyPackagesRequest, GetIdentityUpdatesRequest, GroupMessage, GroupMessageInput, - KeyPackageUpload, PagingInfo, QueryGroupMessagesRequest, QueryWelcomeMessagesRequest, - RegisterInstallationRequest, SendGroupMessagesRequest, SendWelcomeMessagesRequest, - SortDirection, SubscribeGroupMessagesRequest, SubscribeWelcomeMessagesRequest, - UploadKeyPackageRequest, WelcomeMessage, WelcomeMessageInput, + FetchKeyPackagesRequest, GroupMessage, GroupMessageInput, KeyPackageUpload, PagingInfo, + QueryGroupMessagesRequest, QueryWelcomeMessagesRequest, SendGroupMessagesRequest, + SendWelcomeMessagesRequest, SortDirection, SubscribeGroupMessagesRequest, + SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, WelcomeMessage, WelcomeMessageInput, }; /// A filter for querying group messages @@ -63,8 +61,6 @@ pub enum IdentityUpdate { type KeyPackageMap = HashMap, Vec>; -type IdentityUpdatesMap = HashMap>; - impl ApiClientWrapper where ApiClient: XmtpApi, @@ -157,33 +153,6 @@ where Ok(out) } - /// Register an XMTP KeyPackage with the network. - /// New InboxID clients should set `is_inbox_id_credential` to true. - /// V3 clients should have `is_inbox_id_credential` to `false`. - /// Not indicating your client version will result in validation failure. - #[tracing::instrument(level = "trace", skip_all)] - pub async fn register_installation( - &self, - key_package: Vec, - is_inbox_id_credential: bool, - ) -> Result, ApiError> { - let res = retry_async!( - self.retry_strategy, - (async { - self.api_client - .register_installation(RegisterInstallationRequest { - key_package: Some(KeyPackageUpload { - key_package_tls_serialized: key_package.to_vec(), - }), - is_inbox_id_credential, - }) - .await - }) - )?; - - Ok(res.installation_key) - } - /// Upload a KeyPackage to the network /// New InboxID clients should set `is_inbox_id_credential` to true. /// V3 clients should have `is_inbox_id_credential` to `false`. @@ -266,66 +235,6 @@ where Ok(()) } - #[tracing::instrument(level = "trace", skip_all)] - pub async fn get_identity_updates( - &self, - start_time_ns: u64, - account_addresses: Vec, - ) -> Result { - let result = retry_async!( - self.retry_strategy, - (async { - self.api_client - .get_identity_updates(GetIdentityUpdatesRequest { - start_time_ns, - account_addresses: account_addresses.clone(), - }) - .await - }) - )?; - - if result.updates.len() != account_addresses.len() { - println!("mismatched number of results"); - return Err(ApiError::new(ErrorKind::MlsError)); - } - - let mapping: IdentityUpdatesMap = result - .updates - .into_iter() - .zip(account_addresses.into_iter()) - .map(|(update, account_address)| { - ( - account_address, - update - .updates - .into_iter() - .map(|update| match update.kind { - Some(UpdateKind::NewInstallation(new_installation)) => { - IdentityUpdate::NewInstallation(NewInstallation { - timestamp_ns: update.timestamp_ns, - installation_key: new_installation.installation_key, - credential_bytes: new_installation.credential_identity, - }) - } - Some(UpdateKind::RevokedInstallation(revoke_installation)) => { - IdentityUpdate::RevokeInstallation(RevokeInstallation { - timestamp_ns: update.timestamp_ns, - installation_key: revoke_installation.installation_key, - }) - } - None => { - println!("no update kind"); - IdentityUpdate::Invalid - } - }) - .collect(), - ) - }) - .collect(); - - Ok(mapping) - } - #[tracing::instrument(level = "trace", skip_all)] pub async fn send_group_messages(&self, group_messages: Vec<&[u8]>) -> Result<(), ApiError> { let to_send: Vec = group_messages @@ -387,31 +296,11 @@ pub mod tests { use xmtp_proto::{ api_client::{Error, ErrorKind}, xmtp::mls::api::v1::{ - fetch_key_packages_response::KeyPackage, - get_identity_updates_response::{ - update::Kind as UpdateKind, NewInstallationUpdate, Update, WalletUpdates, - }, - FetchKeyPackagesResponse, GetIdentityUpdatesResponse, PagingInfo, - QueryGroupMessagesResponse, RegisterInstallationResponse, + fetch_key_packages_response::KeyPackage, FetchKeyPackagesResponse, PagingInfo, + QueryGroupMessagesResponse, }, }; - #[tokio::test] - async fn test_register_installation() { - let mut mock_api = MockApiClient::new(); - mock_api.expect_register_installation().returning(move |_| { - Ok(RegisterInstallationResponse { - installation_key: vec![1, 2, 3], - }) - }); - let wrapper = ApiClientWrapper::new(mock_api, Retry::default()); - let result = wrapper - .register_installation(vec![2, 3, 4], false) - .await - .unwrap(); - assert_eq!(result, vec![1, 2, 3]); - } - #[tokio::test] async fn test_upload_key_package() { let mut mock_api = MockApiClient::new(); @@ -465,81 +354,6 @@ pub mod tests { } } - #[tokio::test] - async fn test_get_identity_updates() { - let mut mock_api = MockApiClient::new(); - let start_time_ns = 12; - let account_addresses = vec!["wallet1".to_string(), "wallet2".to_string()]; - // account_addresses gets moved below but needs to be used for assertions later - let account_addresses_clone = account_addresses.clone(); - mock_api - .expect_get_identity_updates() - .withf(move |req| { - req.start_time_ns.eq(&start_time_ns) && req.account_addresses.eq(&account_addresses) - }) - .returning(move |_| { - Ok(GetIdentityUpdatesResponse { - updates: { - vec![ - WalletUpdates { - updates: vec![Update { - timestamp_ns: 1, - kind: Some(UpdateKind::NewInstallation( - NewInstallationUpdate { - installation_key: vec![1, 2, 3], - credential_identity: vec![4, 5, 6], - }, - )), - }], - }, - WalletUpdates { - updates: vec![Update { - timestamp_ns: 2, - kind: Some(UpdateKind::NewInstallation( - NewInstallationUpdate { - installation_key: vec![7, 8, 9], - credential_identity: vec![10, 11, 12], - }, - )), - }], - }, - ] - }, - }) - }); - - let wrapper = ApiClientWrapper::new(mock_api, Retry::default()); - let result = wrapper - .get_identity_updates(start_time_ns, account_addresses_clone.clone()) - .await - .unwrap(); - assert_eq!(result.len(), 2); - - for (k, v) in result { - if k.eq(&account_addresses_clone[0]) { - assert_eq!(v.len(), 1); - assert_eq!( - v[0], - super::IdentityUpdate::NewInstallation(super::NewInstallation { - installation_key: vec![1, 2, 3], - credential_bytes: vec![4, 5, 6], - timestamp_ns: 1, - }) - ); - } else { - assert_eq!(v.len(), 1); - assert_eq!( - v[0], - super::IdentityUpdate::NewInstallation(super::NewInstallation { - installation_key: vec![7, 8, 9], - credential_bytes: vec![10, 11, 12], - timestamp_ns: 2, - }) - ); - } - } - } - #[tokio::test] async fn test_read_group_messages_single_page() { let mut mock_api = MockApiClient::new(); diff --git a/xmtp_mls/src/api/test_utils.rs b/xmtp_mls/src/api/test_utils.rs index 9f0a1f8e0..b263c9400 100644 --- a/xmtp_mls/src/api/test_utils.rs +++ b/xmtp_mls/src/api/test_utils.rs @@ -11,12 +11,10 @@ use xmtp_proto::{ }, xmtp::mls::api::v1::{ group_message::{Version as GroupMessageVersion, V1 as GroupMessageV1}, - FetchKeyPackagesRequest, FetchKeyPackagesResponse, GetIdentityUpdatesRequest, - GetIdentityUpdatesResponse, GroupMessage, QueryGroupMessagesRequest, + FetchKeyPackagesRequest, FetchKeyPackagesResponse, GroupMessage, QueryGroupMessagesRequest, QueryGroupMessagesResponse, QueryWelcomeMessagesRequest, QueryWelcomeMessagesResponse, - RegisterInstallationRequest, RegisterInstallationResponse, SendGroupMessagesRequest, - SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, SubscribeWelcomeMessagesRequest, - UploadKeyPackageRequest, + SendGroupMessagesRequest, SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, + SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, }, }; @@ -44,10 +42,6 @@ mock! { #[async_trait] impl XmtpMlsClient for ApiClient { - async fn register_installation( - &self, - request: RegisterInstallationRequest, - ) -> Result; async fn upload_key_package(&self, request: UploadKeyPackageRequest) -> Result<(), Error>; async fn fetch_key_packages( &self, @@ -55,10 +49,6 @@ mock! { ) -> Result; async fn send_group_messages(&self, request: SendGroupMessagesRequest) -> Result<(), Error>; async fn send_welcome_messages(&self, request: SendWelcomeMessagesRequest) -> Result<(), Error>; - async fn get_identity_updates( - &self, - request: GetIdentityUpdatesRequest, - ) -> Result; async fn query_group_messages(&self, request: QueryGroupMessagesRequest) -> Result; async fn query_welcome_messages(&self, request: QueryWelcomeMessagesRequest) -> Result; async fn subscribe_group_messages(&self, request: SubscribeGroupMessagesRequest) -> Result; diff --git a/xmtp_mls/src/client.rs b/xmtp_mls/src/client.rs index 8c0be881f..6157a25dc 100644 --- a/xmtp_mls/src/client.rs +++ b/xmtp_mls/src/client.rs @@ -664,7 +664,7 @@ mod tests { let client = ClientBuilder::new_test_client(&generate_local_wallet()).await; let result = client .api_client - .register_installation(vec![1, 2, 3], false) + .upload_key_package(vec![1, 2, 3], false) .await; assert!(result.is_err()); diff --git a/xmtp_proto/src/api_client.rs b/xmtp_proto/src/api_client.rs index 418da0a9c..c48d9038f 100644 --- a/xmtp_proto/src/api_client.rs +++ b/xmtp_proto/src/api_client.rs @@ -13,12 +13,10 @@ use crate::xmtp::identity::api::v1::{ GetInboxIdsResponse, PublishIdentityUpdateRequest, PublishIdentityUpdateResponse, }; use crate::xmtp::mls::api::v1::{ - FetchKeyPackagesRequest, FetchKeyPackagesResponse, GetIdentityUpdatesRequest, - GetIdentityUpdatesResponse, GroupMessage, QueryGroupMessagesRequest, + FetchKeyPackagesRequest, FetchKeyPackagesResponse, GroupMessage, QueryGroupMessagesRequest, QueryGroupMessagesResponse, QueryWelcomeMessagesRequest, QueryWelcomeMessagesResponse, - RegisterInstallationRequest, RegisterInstallationResponse, SendGroupMessagesRequest, - SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, SubscribeWelcomeMessagesRequest, - UploadKeyPackageRequest, WelcomeMessage, + SendGroupMessagesRequest, SendWelcomeMessagesRequest, SubscribeGroupMessagesRequest, + SubscribeWelcomeMessagesRequest, UploadKeyPackageRequest, WelcomeMessage, }; #[derive(Debug)] @@ -144,10 +142,6 @@ pub type WelcomeMessageStream = Pin Result; async fn upload_key_package(&self, request: UploadKeyPackageRequest) -> Result<(), Error>; async fn fetch_key_packages( &self, @@ -156,10 +150,6 @@ pub trait XmtpMlsClient: Send + Sync + 'static { async fn send_group_messages(&self, request: SendGroupMessagesRequest) -> Result<(), Error>; async fn send_welcome_messages(&self, request: SendWelcomeMessagesRequest) -> Result<(), Error>; - async fn get_identity_updates( - &self, - request: GetIdentityUpdatesRequest, - ) -> Result; async fn query_group_messages( &self, request: QueryGroupMessagesRequest,