From cb9771b06825edfb91fd053fdc085e42b9b34283 Mon Sep 17 00:00:00 2001 From: Martin Kysel Date: Mon, 16 Sep 2024 13:09:41 -0600 Subject: [PATCH] teach client to use v4 --- examples/cli/cli-client.rs | 59 +++++++++++++++++++--------- xmtp_api_grpc/src/conversions.rs | 14 +++++++ xmtp_api_grpc/src/grpc_api_helper.rs | 53 +++---------------------- xmtp_api_grpc/src/identity.rs | 25 ++++++++---- xmtp_api_grpc/src/lib.rs | 2 + xmtp_proto/src/convert.rs | 41 +++++++++++++++++++ 6 files changed, 121 insertions(+), 73 deletions(-) create mode 100644 xmtp_api_grpc/src/conversions.rs diff --git a/examples/cli/cli-client.rs b/examples/cli/cli-client.rs index e0a322560..23d8bb3a3 100755 --- a/examples/cli/cli-client.rs +++ b/examples/cli/cli-client.rs @@ -63,6 +63,8 @@ struct Cli { local: bool, #[clap(long, default_value_t = false)] json: bool, + #[clap(long, default_value_t = false)] + testnet: bool, } #[derive(ValueEnum, Debug, Copy, Clone)] @@ -412,24 +414,45 @@ async fn create_client(cli: &Cli, account: IdentityStrategy) -> Result PublishEnvelopeRequest { + let mut buf = vec![]; + req.encode(&mut buf).unwrap(); + + PublishEnvelopeRequest { + payer_envelope: Some(PayerEnvelope { + unsigned_client_envelope: buf, + payer_signature: None, + }), + } +} diff --git a/xmtp_api_grpc/src/grpc_api_helper.rs b/xmtp_api_grpc/src/grpc_api_helper.rs index 4d5737a2b..5202b5e0c 100644 --- a/xmtp_api_grpc/src/grpc_api_helper.rs +++ b/xmtp_api_grpc/src/grpc_api_helper.rs @@ -32,6 +32,7 @@ use xmtp_proto::{ use xmtp_proto::xmtp::xmtpv4::{BatchSubscribeEnvelopesRequest, BatchSubscribeEnvelopesResponse, ClientEnvelope, PayerEnvelope, PublishEnvelopeRequest, PublishEnvelopeResponse, QueryEnvelopesRequest, QueryEnvelopesResponse}; use xmtp_proto::xmtp::xmtpv4::client_envelope::Payload; use xmtp_proto::xmtp::xmtpv4::replication_api_client::ReplicationApiClient; +use crate::conversions::wrap_client_envelope; async fn create_tls_channel(address: String) -> Result { let channel = Channel::from_shared(address) @@ -77,7 +78,7 @@ pub struct Client { pub(crate) app_version: MetadataValue, pub(crate) libxmtp_version: MetadataValue, pub(crate) replication_client: ReplicationApiClient, - use_replication_v4: bool, + pub(crate) use_replication_v4: bool, } impl Client { @@ -346,7 +347,7 @@ impl XmtpMlsClient for Client { async fn upload_key_package(&self, req: UploadKeyPackageRequest) -> Result<(), Error> { if self.use_replication_v4 { let client = &mut self.replication_client.clone(); - let payload = wrap_client_envelope(req.to_client_envelope()); + let payload = wrap_client_envelope(ClientEnvelope::from(req)); let res = client.publish_envelope(payload).await; match res { Ok(_) => Ok(()), @@ -379,7 +380,7 @@ impl XmtpMlsClient for Client { async fn send_group_messages(&self, req: SendGroupMessagesRequest) -> Result<(), Error> { if self.use_replication_v4 { let client = &mut self.replication_client.clone(); - let payload = wrap_client_envelope(req.to_client_envelope()); + let payload = wrap_client_envelope(ClientEnvelope::from(req)); let res = client.publish_envelope(payload).await; match res { Ok(_) => Ok(()), @@ -399,7 +400,7 @@ impl XmtpMlsClient for Client { async fn send_welcome_messages(&self, req: SendWelcomeMessagesRequest) -> Result<(), Error> { if self.use_replication_v4 { let client = &mut self.replication_client.clone(); - let payload = wrap_client_envelope(req.to_client_envelope()); + let payload = wrap_client_envelope(ClientEnvelope::from(req)); let res = client.publish_envelope(payload).await; match res { Ok(_) => Ok(()), @@ -578,48 +579,4 @@ impl XmtpReplicationClient for Client { Ok(stream.into()) } -} - - -trait ClientEnvelopeConversion { - fn to_client_envelope(self) -> ClientEnvelope; -} - -impl ClientEnvelopeConversion for SendGroupMessagesRequest { - fn to_client_envelope(self) -> ClientEnvelope { - ClientEnvelope { - aad: None, - payload: Some(Payload::GroupMessage(self.messages.first().unwrap().clone())) - } - } -} - -impl ClientEnvelopeConversion for SendWelcomeMessagesRequest { - fn to_client_envelope(self) -> ClientEnvelope { - ClientEnvelope { - aad: None, - payload: Some(Payload::WelcomeMessage(self.messages.first().unwrap().clone())) - } - } -} - -impl ClientEnvelopeConversion for UploadKeyPackageRequest { - fn to_client_envelope(self) -> ClientEnvelope { - ClientEnvelope { - aad: None, - payload: Some(Payload::UploadKeyPackage(self)) - } - } -} - -fn wrap_client_envelope(req: ClientEnvelope) -> PublishEnvelopeRequest { - let mut buf = vec![]; - req.encode(&mut buf).unwrap(); - - PublishEnvelopeRequest { - payer_envelope: Some(PayerEnvelope { - unsigned_client_envelope: buf, - payer_signature: None, - }), - } } \ No newline at end of file diff --git a/xmtp_api_grpc/src/identity.rs b/xmtp_api_grpc/src/identity.rs index 92531e0a6..f8630cb99 100644 --- a/xmtp_api_grpc/src/identity.rs +++ b/xmtp_api_grpc/src/identity.rs @@ -6,8 +6,9 @@ use xmtp_proto::{ GetInboxIdsResponse, PublishIdentityUpdateRequest, PublishIdentityUpdateResponse, }, }; - +use xmtp_proto::xmtp::xmtpv4::ClientEnvelope; use crate::Client; +use crate::conversions::wrap_client_envelope; impl XmtpIdentityClient for Client { #[tracing::instrument(level = "trace", skip_all)] @@ -15,14 +16,24 @@ impl XmtpIdentityClient for Client { &self, request: PublishIdentityUpdateRequest, ) -> Result { - let client = &mut self.identity_client.clone(); + if self.use_replication_v4 { + let client = &mut self.replication_client.clone(); + let payload = wrap_client_envelope(ClientEnvelope::from(request)); + let res = client.publish_envelope(payload).await; + match res { + Ok(_) => Ok(PublishIdentityUpdateResponse{}), + Err(e) => Err(Error::new(ErrorKind::MlsError).with(e)), + } + } else { + let client = &mut self.identity_client.clone(); - let res = client - .publish_identity_update(self.build_request(request)) - .await; + let res = client + .publish_identity_update(self.build_request(request)) + .await; - res.map(|response| response.into_inner()) - .map_err(|err| Error::new(ErrorKind::IdentityError).with(err)) + res.map(|response| response.into_inner()) + .map_err(|err| Error::new(ErrorKind::IdentityError).with(err)) + } } #[tracing::instrument(level = "trace", skip_all)] diff --git a/xmtp_api_grpc/src/lib.rs b/xmtp_api_grpc/src/lib.rs index 8be1719b1..618630733 100644 --- a/xmtp_api_grpc/src/lib.rs +++ b/xmtp_api_grpc/src/lib.rs @@ -1,10 +1,12 @@ pub mod auth_token; pub mod grpc_api_helper; mod identity; +mod conversions; pub const LOCALHOST_ADDRESS: &str = "http://localhost:5556"; pub const DEV_ADDRESS: &str = "https://grpc.dev.xmtp.network:443"; +use prost::Message; pub use grpc_api_helper::{Client, GroupMessageStream, WelcomeMessageStream}; #[cfg(test)] diff --git a/xmtp_proto/src/convert.rs b/xmtp_proto/src/convert.rs index f85e8c8a0..d19a92841 100644 --- a/xmtp_proto/src/convert.rs +++ b/xmtp_proto/src/convert.rs @@ -1,3 +1,8 @@ +use crate::xmtp::identity::api::v1::PublishIdentityUpdateRequest; +use crate::xmtp::mls::api::v1::{SendGroupMessagesRequest, SendWelcomeMessagesRequest, UploadKeyPackageRequest}; +use crate::xmtp::xmtpv4::client_envelope::Payload; +use crate::xmtp::xmtpv4::ClientEnvelope; + mod inbox_id { use crate::xmtp::identity::MlsCredential; @@ -16,3 +21,39 @@ mod inbox_id { } } } + +impl From for ClientEnvelope { + fn from(req: SendWelcomeMessagesRequest) -> Self { + ClientEnvelope { + aad: None, + payload: Some(Payload::WelcomeMessage(req.messages.first().unwrap().clone())) + } + } +} + +impl From for ClientEnvelope { + fn from(req: SendGroupMessagesRequest) -> Self { + ClientEnvelope { + aad: None, + payload: Some(Payload::GroupMessage(req.messages.first().unwrap().clone())) + } + } +} + +impl From for ClientEnvelope { + fn from(req: UploadKeyPackageRequest) -> Self { + ClientEnvelope { + aad: None, + payload: Some(Payload::UploadKeyPackage(req)) + } + } +} + +impl From for ClientEnvelope { + fn from(req: PublishIdentityUpdateRequest) -> Self { + ClientEnvelope { + aad: None, + payload: Some(Payload::IdentityUpdate(req.identity_update.unwrap())) + } + } +} \ No newline at end of file