From bcdb4476730aeaadcfbbb83cb09b34d8c03b57df Mon Sep 17 00:00:00 2001 From: mkysel <7513948+mkysel@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:24:28 +0000 Subject: [PATCH] Nightly Protos --- crates/xmtp_proto/proto_version | 2 +- .../xmtp_proto/src/gen/proto_descriptor.bin | Bin 329104 -> 310415 bytes .../xmtp_proto/src/gen/xmtp.message_api.v1.rs | 100 +- .../src/gen/xmtp.message_contents.rs | 856 +++++++++--------- .../xmtp_proto/src/gen/xmtp.mls.database.rs | 92 +- ...xmtp.mls.message_contents.content_types.rs | 176 ++-- .../src/gen/xmtp.mls.message_contents.rs | 650 ++++++------- 7 files changed, 938 insertions(+), 938 deletions(-) diff --git a/crates/xmtp_proto/proto_version b/crates/xmtp_proto/proto_version index 16e50d2a10..fd602f029d 100644 --- a/crates/xmtp_proto/proto_version +++ b/crates/xmtp_proto/proto_version @@ -1 +1 @@ -8a0aafcf72f597ffac3773049bb0f37245ae0be1 +44c2361d36567944da0ea6ade164f1654a3d4477 diff --git a/crates/xmtp_proto/src/gen/proto_descriptor.bin b/crates/xmtp_proto/src/gen/proto_descriptor.bin index 7f6ba3d6a99724f0ebbad0a587b9fa91b926ee30..c5b964b810453750e0be3a94d54c6829a9d07e63 100644 GIT binary patch delta 18766 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 Q-*6wAI=Jd7&mZ}J0V$(r0{{R3 diff --git a/crates/xmtp_proto/src/gen/xmtp.message_api.v1.rs b/crates/xmtp_proto/src/gen/xmtp.message_api.v1.rs index d3fb9f6be9..6882242c90 100644 --- a/crates/xmtp_proto/src/gen/xmtp.message_api.v1.rs +++ b/crates/xmtp_proto/src/gen/xmtp.message_api.v1.rs @@ -1,54 +1,4 @@ // This file is @generated by prost-build. -/// Token is used by clients to prove to the nodes -/// that they are serving a specific wallet. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Token { - /// identity key signed by a wallet - #[prost(message, optional, tag = "1")] - pub identity_key: ::core::option::Option, - /// encoded bytes of AuthData - #[prost(bytes = "vec", tag = "2")] - pub auth_data_bytes: ::prost::alloc::vec::Vec, - /// identity key signature of AuthData bytes - #[prost(message, optional, tag = "3")] - pub auth_data_signature: ::core::option::Option< - super::super::message_contents::Signature, - >, -} -impl ::prost::Name for Token { - const NAME: &'static str = "Token"; - const PACKAGE: &'static str = "xmtp.message_api.v1"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_api.v1.Token".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_api.v1.Token".into() - } -} -/// AuthData carries token parameters that are authenticated -/// by the identity key signature. -/// It is embedded in the Token structure as bytes -/// so that the bytes don't need to be reconstructed -/// to verify the token signature. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct AuthData { - /// address of the wallet - #[prost(string, tag = "1")] - pub wallet_addr: ::prost::alloc::string::String, - /// time when the token was generated/signed - #[prost(uint64, tag = "2")] - pub created_ns: u64, -} -impl ::prost::Name for AuthData { - const NAME: &'static str = "AuthData"; - const PACKAGE: &'static str = "xmtp.message_api.v1"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_api.v1.AuthData".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_api.v1.AuthData".into() - } -} /// This is based off of the go-waku Index type, but with the /// receiverTime and pubsubTopic removed for simplicity. /// Both removed fields are optional @@ -768,3 +718,53 @@ pub mod message_api_server { const NAME: &'static str = SERVICE_NAME; } } +/// Token is used by clients to prove to the nodes +/// that they are serving a specific wallet. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Token { + /// identity key signed by a wallet + #[prost(message, optional, tag = "1")] + pub identity_key: ::core::option::Option, + /// encoded bytes of AuthData + #[prost(bytes = "vec", tag = "2")] + pub auth_data_bytes: ::prost::alloc::vec::Vec, + /// identity key signature of AuthData bytes + #[prost(message, optional, tag = "3")] + pub auth_data_signature: ::core::option::Option< + super::super::message_contents::Signature, + >, +} +impl ::prost::Name for Token { + const NAME: &'static str = "Token"; + const PACKAGE: &'static str = "xmtp.message_api.v1"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_api.v1.Token".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_api.v1.Token".into() + } +} +/// AuthData carries token parameters that are authenticated +/// by the identity key signature. +/// It is embedded in the Token structure as bytes +/// so that the bytes don't need to be reconstructed +/// to verify the token signature. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct AuthData { + /// address of the wallet + #[prost(string, tag = "1")] + pub wallet_addr: ::prost::alloc::string::String, + /// time when the token was generated/signed + #[prost(uint64, tag = "2")] + pub created_ns: u64, +} +impl ::prost::Name for AuthData { + const NAME: &'static str = "AuthData"; + const PACKAGE: &'static str = "xmtp.message_api.v1"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_api.v1.AuthData".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_api.v1.AuthData".into() + } +} diff --git a/crates/xmtp_proto/src/gen/xmtp.message_contents.rs b/crates/xmtp_proto/src/gen/xmtp.message_contents.rs index 1362df0280..32f9e205c9 100644 --- a/crates/xmtp_proto/src/gen/xmtp.message_contents.rs +++ b/crates/xmtp_proto/src/gen/xmtp.message_contents.rs @@ -320,231 +320,6 @@ impl ::prost::Name for SignedEciesCiphertext { "/xmtp.message_contents.SignedEciesCiphertext".into() } } -/// Unsealed invitation V1 -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct InvitationV1 { - /// topic name chosen for this conversation. - /// It MUST be randomly generated bytes (length >= 32), - /// then base64 encoded without padding - #[prost(string, tag = "1")] - pub topic: ::prost::alloc::string::String, - /// A context object defining metadata - #[prost(message, optional, tag = "2")] - pub context: ::core::option::Option, - /// The user's consent proof - #[prost(message, optional, tag = "4")] - pub consent_proof: ::core::option::Option, - /// message encryption scheme and keys for this conversation. - #[prost(oneof = "invitation_v1::Encryption", tags = "3")] - pub encryption: ::core::option::Option, -} -/// Nested message and enum types in `InvitationV1`. -pub mod invitation_v1 { - /// Supported encryption schemes - /// AES256-GCM-HKDF-SHA256 - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] - pub struct Aes256gcmHkdfsha256 { - /// randomly generated key material (32 bytes) - #[prost(bytes = "vec", tag = "1")] - pub key_material: ::prost::alloc::vec::Vec, - } - impl ::prost::Name for Aes256gcmHkdfsha256 { - const NAME: &'static str = "Aes256gcmHkdfsha256"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.InvitationV1.Aes256gcmHkdfsha256".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.InvitationV1.Aes256gcmHkdfsha256".into() - } - } - /// The context type - #[derive(Clone, PartialEq, ::prost::Message)] - pub struct Context { - /// Expected to be a URI (ie xmtp.org/convo1) - #[prost(string, tag = "1")] - pub conversation_id: ::prost::alloc::string::String, - /// Key value map of additional metadata that would be exposed to - /// application developers and could be used for filtering - #[prost(map = "string, string", tag = "2")] - pub metadata: ::std::collections::HashMap< - ::prost::alloc::string::String, - ::prost::alloc::string::String, - >, - } - impl ::prost::Name for Context { - const NAME: &'static str = "Context"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.InvitationV1.Context".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.InvitationV1.Context".into() - } - } - /// message encryption scheme and keys for this conversation. - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum Encryption { - /// Specify the encryption method to process the key material properly. - #[prost(message, tag = "3")] - Aes256GcmHkdfSha256(Aes256gcmHkdfsha256), - } -} -impl ::prost::Name for InvitationV1 { - const NAME: &'static str = "InvitationV1"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.InvitationV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.InvitationV1".into() - } -} -/// Sealed Invitation V1 Header -/// Header carries information that is unencrypted, thus readable by the network -/// it is however authenticated as associated data with the AEAD scheme used -/// to encrypt the invitation body, thus providing tamper evidence. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SealedInvitationHeaderV1 { - #[prost(message, optional, tag = "1")] - pub sender: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub recipient: ::core::option::Option, - #[prost(uint64, tag = "3")] - pub created_ns: u64, -} -impl ::prost::Name for SealedInvitationHeaderV1 { - const NAME: &'static str = "SealedInvitationHeaderV1"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.SealedInvitationHeaderV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.SealedInvitationHeaderV1".into() - } -} -/// Sealed Invitation V1 -/// Invitation encrypted with key material derived from the sender's and -/// recipient's public key bundles using simplified X3DH where -/// the sender's ephemeral key is replaced with sender's pre-key. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SealedInvitationV1 { - /// encoded SealedInvitationHeaderV1 used as associated data for Ciphertext - #[prost(bytes = "vec", tag = "1")] - pub header_bytes: ::prost::alloc::vec::Vec, - /// Ciphertext.payload MUST contain encrypted InvitationV1. - #[prost(message, optional, tag = "2")] - pub ciphertext: ::core::option::Option, -} -impl ::prost::Name for SealedInvitationV1 { - const NAME: &'static str = "SealedInvitationV1"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.SealedInvitationV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.SealedInvitationV1".into() - } -} -/// Versioned Sealed Invitation -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SealedInvitation { - #[prost(oneof = "sealed_invitation::Version", tags = "1")] - pub version: ::core::option::Option, -} -/// Nested message and enum types in `SealedInvitation`. -pub mod sealed_invitation { - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V1(super::SealedInvitationV1), - } -} -impl ::prost::Name for SealedInvitation { - const NAME: &'static str = "SealedInvitation"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.SealedInvitation".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.SealedInvitation".into() - } -} -/// Payload for user's consent proof to be set in the invitation -/// Signifying the conversation should be preapproved for the user on receipt -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ConsentProofPayload { - /// the user's signature in hex format - #[prost(string, tag = "1")] - pub signature: ::prost::alloc::string::String, - /// approximate time when the user signed - #[prost(uint64, tag = "2")] - pub timestamp: u64, - /// version of the payload - #[prost(enumeration = "ConsentProofPayloadVersion", tag = "3")] - pub payload_version: i32, -} -impl ::prost::Name for ConsentProofPayload { - const NAME: &'static str = "ConsentProofPayload"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.ConsentProofPayload".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.ConsentProofPayload".into() - } -} -/// Version of consent proof payload -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum ConsentProofPayloadVersion { - Unspecified = 0, - ConsentProofPayloadVersion1 = 1, -} -impl ConsentProofPayloadVersion { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Unspecified => "CONSENT_PROOF_PAYLOAD_VERSION_UNSPECIFIED", - Self::ConsentProofPayloadVersion1 => "CONSENT_PROOF_PAYLOAD_VERSION_1", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "CONSENT_PROOF_PAYLOAD_VERSION_UNSPECIFIED" => Some(Self::Unspecified), - "CONSENT_PROOF_PAYLOAD_VERSION_1" => Some(Self::ConsentProofPayloadVersion1), - _ => None, - } - } -} -/// A light pointer for a conversation that contains no decryption keys -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct ConversationReference { - #[prost(string, tag = "1")] - pub topic: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub peer_address: ::prost::alloc::string::String, - #[prost(uint64, tag = "3")] - pub created_ns: u64, - #[prost(message, optional, tag = "4")] - pub context: ::core::option::Option, - #[prost(message, optional, tag = "5")] - pub consent_proof_payload: ::core::option::Option, -} -impl ::prost::Name for ConversationReference { - const NAME: &'static str = "ConversationReference"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.ConversationReference".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.ConversationReference".into() - } -} /// PrivateKey generalized to support different key types #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct SignedPrivateKey { @@ -922,23 +697,399 @@ impl ::prost::Name for PrivatePreferencesPayload { "/xmtp.message_contents.PrivatePreferencesPayload".into() } } -/// ContentTypeId is used to identify the type of content stored in a Message. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ContentTypeId { - /// authority governing this content type +/// Unsealed invitation V1 +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InvitationV1 { + /// topic name chosen for this conversation. + /// It MUST be randomly generated bytes (length >= 32), + /// then base64 encoded without padding #[prost(string, tag = "1")] - pub authority_id: ::prost::alloc::string::String, - /// type identifier - #[prost(string, tag = "2")] - pub type_id: ::prost::alloc::string::String, - /// major version of the type - #[prost(uint32, tag = "3")] - pub version_major: u32, - /// minor version of the type - #[prost(uint32, tag = "4")] - pub version_minor: u32, + pub topic: ::prost::alloc::string::String, + /// A context object defining metadata + #[prost(message, optional, tag = "2")] + pub context: ::core::option::Option, + /// The user's consent proof + #[prost(message, optional, tag = "4")] + pub consent_proof: ::core::option::Option, + /// message encryption scheme and keys for this conversation. + #[prost(oneof = "invitation_v1::Encryption", tags = "3")] + pub encryption: ::core::option::Option, } -impl ::prost::Name for ContentTypeId { +/// Nested message and enum types in `InvitationV1`. +pub mod invitation_v1 { + /// Supported encryption schemes + /// AES256-GCM-HKDF-SHA256 + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] + pub struct Aes256gcmHkdfsha256 { + /// randomly generated key material (32 bytes) + #[prost(bytes = "vec", tag = "1")] + pub key_material: ::prost::alloc::vec::Vec, + } + impl ::prost::Name for Aes256gcmHkdfsha256 { + const NAME: &'static str = "Aes256gcmHkdfsha256"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.InvitationV1.Aes256gcmHkdfsha256".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.InvitationV1.Aes256gcmHkdfsha256".into() + } + } + /// The context type + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Context { + /// Expected to be a URI (ie xmtp.org/convo1) + #[prost(string, tag = "1")] + pub conversation_id: ::prost::alloc::string::String, + /// Key value map of additional metadata that would be exposed to + /// application developers and could be used for filtering + #[prost(map = "string, string", tag = "2")] + pub metadata: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + } + impl ::prost::Name for Context { + const NAME: &'static str = "Context"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.InvitationV1.Context".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.InvitationV1.Context".into() + } + } + /// message encryption scheme and keys for this conversation. + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Encryption { + /// Specify the encryption method to process the key material properly. + #[prost(message, tag = "3")] + Aes256GcmHkdfSha256(Aes256gcmHkdfsha256), + } +} +impl ::prost::Name for InvitationV1 { + const NAME: &'static str = "InvitationV1"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.InvitationV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.InvitationV1".into() + } +} +/// Sealed Invitation V1 Header +/// Header carries information that is unencrypted, thus readable by the network +/// it is however authenticated as associated data with the AEAD scheme used +/// to encrypt the invitation body, thus providing tamper evidence. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SealedInvitationHeaderV1 { + #[prost(message, optional, tag = "1")] + pub sender: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub recipient: ::core::option::Option, + #[prost(uint64, tag = "3")] + pub created_ns: u64, +} +impl ::prost::Name for SealedInvitationHeaderV1 { + const NAME: &'static str = "SealedInvitationHeaderV1"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.SealedInvitationHeaderV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.SealedInvitationHeaderV1".into() + } +} +/// Sealed Invitation V1 +/// Invitation encrypted with key material derived from the sender's and +/// recipient's public key bundles using simplified X3DH where +/// the sender's ephemeral key is replaced with sender's pre-key. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SealedInvitationV1 { + /// encoded SealedInvitationHeaderV1 used as associated data for Ciphertext + #[prost(bytes = "vec", tag = "1")] + pub header_bytes: ::prost::alloc::vec::Vec, + /// Ciphertext.payload MUST contain encrypted InvitationV1. + #[prost(message, optional, tag = "2")] + pub ciphertext: ::core::option::Option, +} +impl ::prost::Name for SealedInvitationV1 { + const NAME: &'static str = "SealedInvitationV1"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.SealedInvitationV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.SealedInvitationV1".into() + } +} +/// Versioned Sealed Invitation +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SealedInvitation { + #[prost(oneof = "sealed_invitation::Version", tags = "1")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `SealedInvitation`. +pub mod sealed_invitation { + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V1(super::SealedInvitationV1), + } +} +impl ::prost::Name for SealedInvitation { + const NAME: &'static str = "SealedInvitation"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.SealedInvitation".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.SealedInvitation".into() + } +} +/// Payload for user's consent proof to be set in the invitation +/// Signifying the conversation should be preapproved for the user on receipt +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ConsentProofPayload { + /// the user's signature in hex format + #[prost(string, tag = "1")] + pub signature: ::prost::alloc::string::String, + /// approximate time when the user signed + #[prost(uint64, tag = "2")] + pub timestamp: u64, + /// version of the payload + #[prost(enumeration = "ConsentProofPayloadVersion", tag = "3")] + pub payload_version: i32, +} +impl ::prost::Name for ConsentProofPayload { + const NAME: &'static str = "ConsentProofPayload"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.ConsentProofPayload".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.ConsentProofPayload".into() + } +} +/// Version of consent proof payload +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ConsentProofPayloadVersion { + Unspecified = 0, + ConsentProofPayloadVersion1 = 1, +} +impl ConsentProofPayloadVersion { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "CONSENT_PROOF_PAYLOAD_VERSION_UNSPECIFIED", + Self::ConsentProofPayloadVersion1 => "CONSENT_PROOF_PAYLOAD_VERSION_1", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CONSENT_PROOF_PAYLOAD_VERSION_UNSPECIFIED" => Some(Self::Unspecified), + "CONSENT_PROOF_PAYLOAD_VERSION_1" => Some(Self::ConsentProofPayloadVersion1), + _ => None, + } + } +} +/// A light pointer for a conversation that contains no decryption keys +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ConversationReference { + #[prost(string, tag = "1")] + pub topic: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub peer_address: ::prost::alloc::string::String, + #[prost(uint64, tag = "3")] + pub created_ns: u64, + #[prost(message, optional, tag = "4")] + pub context: ::core::option::Option, + #[prost(message, optional, tag = "5")] + pub consent_proof_payload: ::core::option::Option, +} +impl ::prost::Name for ConversationReference { + const NAME: &'static str = "ConversationReference"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.ConversationReference".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.ConversationReference".into() + } +} +/// Message header is encoded separately as the bytes are also used +/// as associated data for authenticated encryption +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct MessageHeaderV1 { + #[prost(message, optional, tag = "1")] + pub sender: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub recipient: ::core::option::Option, + #[prost(uint64, tag = "3")] + pub timestamp: u64, +} +impl ::prost::Name for MessageHeaderV1 { + const NAME: &'static str = "MessageHeaderV1"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.MessageHeaderV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.MessageHeaderV1".into() + } +} +/// Message is the top level protocol element +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct MessageV1 { + /// encapsulates encoded MessageHeaderV1 + #[prost(bytes = "vec", tag = "1")] + pub header_bytes: ::prost::alloc::vec::Vec, + /// Ciphertext.payload MUST contain encrypted EncodedContent + #[prost(message, optional, tag = "2")] + pub ciphertext: ::core::option::Option, +} +impl ::prost::Name for MessageV1 { + const NAME: &'static str = "MessageV1"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.MessageV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.MessageV1".into() + } +} +/// Message header carries information that is not encrypted, and is therefore +/// observable by the network. It is however authenticated as associated data +/// of the AEAD encryption used to protect the message, +/// thus providing tamper evidence. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct MessageHeaderV2 { + /// sender specified message creation time + #[prost(uint64, tag = "1")] + pub created_ns: u64, + /// the topic the message belongs to + #[prost(string, tag = "2")] + pub topic: ::prost::alloc::string::String, +} +impl ::prost::Name for MessageHeaderV2 { + const NAME: &'static str = "MessageHeaderV2"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.MessageHeaderV2".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.MessageHeaderV2".into() + } +} +/// Message combines the encoded header with the encrypted payload. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct MessageV2 { + /// encapsulates encoded MessageHeaderV2 + #[prost(bytes = "vec", tag = "1")] + pub header_bytes: ::prost::alloc::vec::Vec, + /// Ciphertext.payload MUST contain encrypted SignedContent + #[prost(message, optional, tag = "2")] + pub ciphertext: ::core::option::Option, + /// HMAC of the message ciphertext, with the HMAC key derived from the topic + /// key + #[prost(bytes = "vec", optional, tag = "3")] + pub sender_hmac: ::core::option::Option<::prost::alloc::vec::Vec>, + /// Flag indicating whether the message should be pushed from a notification + /// server + #[prost(bool, optional, tag = "4")] + pub should_push: ::core::option::Option, +} +impl ::prost::Name for MessageV2 { + const NAME: &'static str = "MessageV2"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.MessageV2".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.MessageV2".into() + } +} +/// Versioned Message +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Message { + #[prost(oneof = "message::Version", tags = "1, 2")] + pub version: ::core::option::Option, +} +/// Nested message and enum types in `Message`. +pub mod message { + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Version { + #[prost(message, tag = "1")] + V1(super::MessageV1), + #[prost(message, tag = "2")] + V2(super::MessageV2), + } +} +impl ::prost::Name for Message { + const NAME: &'static str = "Message"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.Message".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.Message".into() + } +} +/// DecodedMessage represents the decrypted message contents. +/// DecodedMessage instances are not stored on the network, but +/// may be serialized and stored by clients +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DecodedMessage { + #[prost(string, tag = "1")] + pub id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub message_version: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub sender_address: ::prost::alloc::string::String, + #[prost(string, optional, tag = "4")] + pub recipient_address: ::core::option::Option<::prost::alloc::string::String>, + #[prost(uint64, tag = "5")] + pub sent_ns: u64, + #[prost(string, tag = "6")] + pub content_topic: ::prost::alloc::string::String, + #[prost(message, optional, tag = "7")] + pub conversation: ::core::option::Option, + /// encapsulates EncodedContent + #[prost(bytes = "vec", tag = "8")] + pub content_bytes: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for DecodedMessage { + const NAME: &'static str = "DecodedMessage"; + const PACKAGE: &'static str = "xmtp.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.message_contents.DecodedMessage".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.message_contents.DecodedMessage".into() + } +} +/// ContentTypeId is used to identify the type of content stored in a Message. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ContentTypeId { + /// authority governing this content type + #[prost(string, tag = "1")] + pub authority_id: ::prost::alloc::string::String, + /// type identifier + #[prost(string, tag = "2")] + pub type_id: ::prost::alloc::string::String, + /// major version of the type + #[prost(uint32, tag = "3")] + pub version_major: u32, + /// minor version of the type + #[prost(uint32, tag = "4")] + pub version_minor: u32, +} +impl ::prost::Name for ContentTypeId { const NAME: &'static str = "ContentTypeId"; const PACKAGE: &'static str = "xmtp.message_contents"; fn full_name() -> ::prost::alloc::string::String { @@ -1081,65 +1232,6 @@ impl ::prost::Name for Composite { "/xmtp.message_contents.Composite".into() } } -/// LEGACY: User key bundle V1 using PublicKeys. -/// The PublicKeys MUST be signed. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ContactBundleV1 { - #[prost(message, optional, tag = "1")] - pub key_bundle: ::core::option::Option, -} -impl ::prost::Name for ContactBundleV1 { - const NAME: &'static str = "ContactBundleV1"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.ContactBundleV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.ContactBundleV1".into() - } -} -/// User key bundle V2 using SignedPublicKeys. -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ContactBundleV2 { - #[prost(message, optional, tag = "1")] - pub key_bundle: ::core::option::Option, -} -impl ::prost::Name for ContactBundleV2 { - const NAME: &'static str = "ContactBundleV2"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.ContactBundleV2".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.ContactBundleV2".into() - } -} -/// Versioned ContactBundle -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ContactBundle { - #[prost(oneof = "contact_bundle::Version", tags = "1, 2")] - pub version: ::core::option::Option, -} -/// Nested message and enum types in `ContactBundle`. -pub mod contact_bundle { - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum Version { - #[prost(message, tag = "1")] - V1(super::ContactBundleV1), - #[prost(message, tag = "2")] - V2(super::ContactBundleV2), - } -} -impl ::prost::Name for ContactBundle { - const NAME: &'static str = "ContactBundle"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.ContactBundle".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.ContactBundle".into() - } -} /// EciesMessage is a wrapper for ECIES encrypted payloads #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct EciesMessage { @@ -1246,172 +1338,80 @@ impl ::prost::Name for FrameAction { "/xmtp.message_contents.FrameAction".into() } } -/// Message header is encoded separately as the bytes are also used -/// as associated data for authenticated encryption -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MessageHeaderV1 { - #[prost(message, optional, tag = "1")] - pub sender: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub recipient: ::core::option::Option, - #[prost(uint64, tag = "3")] - pub timestamp: u64, -} -impl ::prost::Name for MessageHeaderV1 { - const NAME: &'static str = "MessageHeaderV1"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.MessageHeaderV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.MessageHeaderV1".into() - } -} -/// Message is the top level protocol element +/// SignedPayload is a wrapper for a signature and a payload #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MessageV1 { - /// encapsulates encoded MessageHeaderV1 +pub struct SignedPayload { #[prost(bytes = "vec", tag = "1")] - pub header_bytes: ::prost::alloc::vec::Vec, - /// Ciphertext.payload MUST contain encrypted EncodedContent + pub payload: ::prost::alloc::vec::Vec, #[prost(message, optional, tag = "2")] - pub ciphertext: ::core::option::Option, + pub signature: ::core::option::Option, } -impl ::prost::Name for MessageV1 { - const NAME: &'static str = "MessageV1"; +impl ::prost::Name for SignedPayload { + const NAME: &'static str = "SignedPayload"; const PACKAGE: &'static str = "xmtp.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.MessageV1".into() + "xmtp.message_contents.SignedPayload".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.MessageV1".into() + "/xmtp.message_contents.SignedPayload".into() } } -/// Message header carries information that is not encrypted, and is therefore -/// observable by the network. It is however authenticated as associated data -/// of the AEAD encryption used to protect the message, -/// thus providing tamper evidence. +/// LEGACY: User key bundle V1 using PublicKeys. +/// The PublicKeys MUST be signed. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MessageHeaderV2 { - /// sender specified message creation time - #[prost(uint64, tag = "1")] - pub created_ns: u64, - /// the topic the message belongs to - #[prost(string, tag = "2")] - pub topic: ::prost::alloc::string::String, +pub struct ContactBundleV1 { + #[prost(message, optional, tag = "1")] + pub key_bundle: ::core::option::Option, } -impl ::prost::Name for MessageHeaderV2 { - const NAME: &'static str = "MessageHeaderV2"; +impl ::prost::Name for ContactBundleV1 { + const NAME: &'static str = "ContactBundleV1"; const PACKAGE: &'static str = "xmtp.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.MessageHeaderV2".into() + "xmtp.message_contents.ContactBundleV1".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.MessageHeaderV2".into() + "/xmtp.message_contents.ContactBundleV1".into() } } -/// Message combines the encoded header with the encrypted payload. +/// User key bundle V2 using SignedPublicKeys. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MessageV2 { - /// encapsulates encoded MessageHeaderV2 - #[prost(bytes = "vec", tag = "1")] - pub header_bytes: ::prost::alloc::vec::Vec, - /// Ciphertext.payload MUST contain encrypted SignedContent - #[prost(message, optional, tag = "2")] - pub ciphertext: ::core::option::Option, - /// HMAC of the message ciphertext, with the HMAC key derived from the topic - /// key - #[prost(bytes = "vec", optional, tag = "3")] - pub sender_hmac: ::core::option::Option<::prost::alloc::vec::Vec>, - /// Flag indicating whether the message should be pushed from a notification - /// server - #[prost(bool, optional, tag = "4")] - pub should_push: ::core::option::Option, +pub struct ContactBundleV2 { + #[prost(message, optional, tag = "1")] + pub key_bundle: ::core::option::Option, } -impl ::prost::Name for MessageV2 { - const NAME: &'static str = "MessageV2"; +impl ::prost::Name for ContactBundleV2 { + const NAME: &'static str = "ContactBundleV2"; const PACKAGE: &'static str = "xmtp.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.MessageV2".into() + "xmtp.message_contents.ContactBundleV2".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.MessageV2".into() + "/xmtp.message_contents.ContactBundleV2".into() } } -/// Versioned Message +/// Versioned ContactBundle #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Message { - #[prost(oneof = "message::Version", tags = "1, 2")] - pub version: ::core::option::Option, +pub struct ContactBundle { + #[prost(oneof = "contact_bundle::Version", tags = "1, 2")] + pub version: ::core::option::Option, } -/// Nested message and enum types in `Message`. -pub mod message { +/// Nested message and enum types in `ContactBundle`. +pub mod contact_bundle { #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Version { #[prost(message, tag = "1")] - V1(super::MessageV1), + V1(super::ContactBundleV1), #[prost(message, tag = "2")] - V2(super::MessageV2), - } -} -impl ::prost::Name for Message { - const NAME: &'static str = "Message"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.Message".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.Message".into() - } -} -/// DecodedMessage represents the decrypted message contents. -/// DecodedMessage instances are not stored on the network, but -/// may be serialized and stored by clients -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct DecodedMessage { - #[prost(string, tag = "1")] - pub id: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub message_version: ::prost::alloc::string::String, - #[prost(string, tag = "3")] - pub sender_address: ::prost::alloc::string::String, - #[prost(string, optional, tag = "4")] - pub recipient_address: ::core::option::Option<::prost::alloc::string::String>, - #[prost(uint64, tag = "5")] - pub sent_ns: u64, - #[prost(string, tag = "6")] - pub content_topic: ::prost::alloc::string::String, - #[prost(message, optional, tag = "7")] - pub conversation: ::core::option::Option, - /// encapsulates EncodedContent - #[prost(bytes = "vec", tag = "8")] - pub content_bytes: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for DecodedMessage { - const NAME: &'static str = "DecodedMessage"; - const PACKAGE: &'static str = "xmtp.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.DecodedMessage".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.DecodedMessage".into() + V2(super::ContactBundleV2), } } -/// SignedPayload is a wrapper for a signature and a payload -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SignedPayload { - #[prost(bytes = "vec", tag = "1")] - pub payload: ::prost::alloc::vec::Vec, - #[prost(message, optional, tag = "2")] - pub signature: ::core::option::Option, -} -impl ::prost::Name for SignedPayload { - const NAME: &'static str = "SignedPayload"; +impl ::prost::Name for ContactBundle { + const NAME: &'static str = "ContactBundle"; const PACKAGE: &'static str = "xmtp.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.message_contents.SignedPayload".into() + "xmtp.message_contents.ContactBundle".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.message_contents.SignedPayload".into() + "/xmtp.message_contents.ContactBundle".into() } } diff --git a/crates/xmtp_proto/src/gen/xmtp.mls.database.rs b/crates/xmtp_proto/src/gen/xmtp.mls.database.rs index db8d13fb20..caaae92b87 100644 --- a/crates/xmtp_proto/src/gen/xmtp.mls.database.rs +++ b/crates/xmtp_proto/src/gen/xmtp.mls.database.rs @@ -1,4 +1,50 @@ // This file is @generated by prost-build. +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Task { + #[prost(oneof = "task::Task", tags = "1, 2")] + pub task: ::core::option::Option, +} +/// Nested message and enum types in `Task`. +pub mod task { + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum Task { + #[prost(message, tag = "1")] + ProcessWelcomePointer(super::super::message_contents::WelcomePointer), + #[prost(message, tag = "2")] + SendSyncArchive(super::SendSyncArchive), + } +} +impl ::prost::Name for Task { + const NAME: &'static str = "Task"; + const PACKAGE: &'static str = "xmtp.mls.database"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.database.Task".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.database.Task".into() + } +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SendSyncArchive { + #[prost(message, optional, tag = "1")] + pub options: ::core::option::Option, + #[prost(bytes = "vec", tag = "2")] + pub sync_group_id: ::prost::alloc::vec::Vec, + #[prost(string, optional, tag = "3")] + pub request_id: ::core::option::Option<::prost::alloc::string::String>, + #[prost(string, tag = "4")] + pub server_url: ::prost::alloc::string::String, +} +impl ::prost::Name for SendSyncArchive { + const NAME: &'static str = "SendSyncArchive"; + const PACKAGE: &'static str = "xmtp.mls.database"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.database.SendSyncArchive".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.database.SendSyncArchive".into() + } +} /// The data required to publish a message #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct SendMessageData { @@ -591,49 +637,3 @@ impl PermissionPolicyOption { } } } -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Task { - #[prost(oneof = "task::Task", tags = "1, 2")] - pub task: ::core::option::Option, -} -/// Nested message and enum types in `Task`. -pub mod task { - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum Task { - #[prost(message, tag = "1")] - ProcessWelcomePointer(super::super::message_contents::WelcomePointer), - #[prost(message, tag = "2")] - SendSyncArchive(super::SendSyncArchive), - } -} -impl ::prost::Name for Task { - const NAME: &'static str = "Task"; - const PACKAGE: &'static str = "xmtp.mls.database"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.database.Task".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.database.Task".into() - } -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct SendSyncArchive { - #[prost(message, optional, tag = "1")] - pub options: ::core::option::Option, - #[prost(bytes = "vec", tag = "2")] - pub sync_group_id: ::prost::alloc::vec::Vec, - #[prost(string, optional, tag = "3")] - pub request_id: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, tag = "4")] - pub server_url: ::prost::alloc::string::String, -} -impl ::prost::Name for SendSyncArchive { - const NAME: &'static str = "SendSyncArchive"; - const PACKAGE: &'static str = "xmtp.mls.database"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.database.SendSyncArchive".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.database.SendSyncArchive".into() - } -} diff --git a/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.content_types.rs b/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.content_types.rs index 0d7761f34f..0c4f5f816e 100644 --- a/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.content_types.rs +++ b/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.content_types.rs @@ -1,92 +1,4 @@ // This file is @generated by prost-build. -/// DeleteMessage message type -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct DeleteMessage { - /// ID of the message to delete - #[prost(string, tag = "1")] - pub message_id: ::prost::alloc::string::String, -} -impl ::prost::Name for DeleteMessage { - const NAME: &'static str = "DeleteMessage"; - const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.content_types.DeleteMessage".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.content_types.DeleteMessage".into() - } -} -/// LeaveRequest message type -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct LeaveRequest { - /// A serialized AuthenticatedNote containing the sender's signed, member-only verifiable statement - #[prost(bytes = "vec", optional, tag = "1")] - pub authenticated_note: ::core::option::Option<::prost::alloc::vec::Vec>, -} -impl ::prost::Name for LeaveRequest { - const NAME: &'static str = "LeaveRequest"; - const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.content_types.LeaveRequest".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.content_types.LeaveRequest".into() - } -} -/// MultiRemoteAttachment message type -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct MultiRemoteAttachment { - /// Array of attachment information - #[prost(message, repeated, tag = "1")] - pub attachments: ::prost::alloc::vec::Vec, -} -impl ::prost::Name for MultiRemoteAttachment { - const NAME: &'static str = "MultiRemoteAttachment"; - const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.content_types.MultiRemoteAttachment".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.content_types.MultiRemoteAttachment".into() - } -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct RemoteAttachmentInfo { - /// The SHA256 hash of the remote content - #[prost(string, tag = "1")] - pub content_digest: ::prost::alloc::string::String, - /// A 32 byte array for decrypting the remote content payload - #[prost(bytes = "vec", tag = "2")] - pub secret: ::prost::alloc::vec::Vec, - /// A byte array for the nonce used to encrypt the remote content payload - #[prost(bytes = "vec", tag = "3")] - pub nonce: ::prost::alloc::vec::Vec, - /// A byte array for the salt used to encrypt the remote content payload - #[prost(bytes = "vec", tag = "4")] - pub salt: ::prost::alloc::vec::Vec, - /// The scheme of the URL. Must be " - #[prost(string, tag = "5")] - pub scheme: ::prost::alloc::string::String, - /// The URL of the remote content - #[prost(string, tag = "6")] - pub url: ::prost::alloc::string::String, - /// The size of the encrypted content in bytes (max size of 4GB) - #[prost(uint32, optional, tag = "7")] - pub content_length: ::core::option::Option, - /// The filename of the remote content - #[prost(string, optional, tag = "8")] - pub filename: ::core::option::Option<::prost::alloc::string::String>, -} -impl ::prost::Name for RemoteAttachmentInfo { - const NAME: &'static str = "RemoteAttachmentInfo"; - const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.content_types.RemoteAttachmentInfo".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.content_types.RemoteAttachmentInfo".into() - } -} /// Reaction message type #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ReactionV2 { @@ -242,3 +154,91 @@ impl ::prost::Name for Call { "/xmtp.mls.message_contents.content_types.Call".into() } } +/// LeaveRequest message type +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct LeaveRequest { + /// A serialized AuthenticatedNote containing the sender's signed, member-only verifiable statement + #[prost(bytes = "vec", optional, tag = "1")] + pub authenticated_note: ::core::option::Option<::prost::alloc::vec::Vec>, +} +impl ::prost::Name for LeaveRequest { + const NAME: &'static str = "LeaveRequest"; + const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.content_types.LeaveRequest".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.content_types.LeaveRequest".into() + } +} +/// MultiRemoteAttachment message type +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MultiRemoteAttachment { + /// Array of attachment information + #[prost(message, repeated, tag = "1")] + pub attachments: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for MultiRemoteAttachment { + const NAME: &'static str = "MultiRemoteAttachment"; + const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.content_types.MultiRemoteAttachment".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.content_types.MultiRemoteAttachment".into() + } +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct RemoteAttachmentInfo { + /// The SHA256 hash of the remote content + #[prost(string, tag = "1")] + pub content_digest: ::prost::alloc::string::String, + /// A 32 byte array for decrypting the remote content payload + #[prost(bytes = "vec", tag = "2")] + pub secret: ::prost::alloc::vec::Vec, + /// A byte array for the nonce used to encrypt the remote content payload + #[prost(bytes = "vec", tag = "3")] + pub nonce: ::prost::alloc::vec::Vec, + /// A byte array for the salt used to encrypt the remote content payload + #[prost(bytes = "vec", tag = "4")] + pub salt: ::prost::alloc::vec::Vec, + /// The scheme of the URL. Must be " + #[prost(string, tag = "5")] + pub scheme: ::prost::alloc::string::String, + /// The URL of the remote content + #[prost(string, tag = "6")] + pub url: ::prost::alloc::string::String, + /// The size of the encrypted content in bytes (max size of 4GB) + #[prost(uint32, optional, tag = "7")] + pub content_length: ::core::option::Option, + /// The filename of the remote content + #[prost(string, optional, tag = "8")] + pub filename: ::core::option::Option<::prost::alloc::string::String>, +} +impl ::prost::Name for RemoteAttachmentInfo { + const NAME: &'static str = "RemoteAttachmentInfo"; + const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.content_types.RemoteAttachmentInfo".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.content_types.RemoteAttachmentInfo".into() + } +} +/// DeleteMessage message type +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct DeleteMessage { + /// ID of the message to delete + #[prost(string, tag = "1")] + pub message_id: ::prost::alloc::string::String, +} +impl ::prost::Name for DeleteMessage { + const NAME: &'static str = "DeleteMessage"; + const PACKAGE: &'static str = "xmtp.mls.message_contents.content_types"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.content_types.DeleteMessage".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.content_types.DeleteMessage".into() + } +} diff --git a/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.rs b/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.rs index 9a06b4d74d..1262ee050f 100644 --- a/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.rs +++ b/crates/xmtp_proto/src/gen/xmtp.mls.message_contents.rs @@ -275,6 +275,185 @@ impl WelcomeWrapperAlgorithm { } } } +/// A group member and affected installation IDs +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct MembershipChange { + #[prost(bytes = "vec", repeated, tag = "1")] + pub installation_ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, + #[prost(string, tag = "2")] + pub account_address: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub initiated_by_account_address: ::prost::alloc::string::String, +} +impl ::prost::Name for MembershipChange { + const NAME: &'static str = "MembershipChange"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.MembershipChange".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.MembershipChange".into() + } +} +/// The group membership change proto +/// +/// protolint:disable REPEATED_FIELD_NAMES_PLURALIZED +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GroupMembershipChanges { + /// Members that have been added in the commit + #[prost(message, repeated, tag = "1")] + pub members_added: ::prost::alloc::vec::Vec, + /// Members that have been removed in the commit + #[prost(message, repeated, tag = "2")] + pub members_removed: ::prost::alloc::vec::Vec, + /// Installations that have been added in the commit, grouped by member + #[prost(message, repeated, tag = "3")] + pub installations_added: ::prost::alloc::vec::Vec, + /// Installations removed in the commit, grouped by member + #[prost(message, repeated, tag = "4")] + pub installations_removed: ::prost::alloc::vec::Vec, +} +impl ::prost::Name for GroupMembershipChanges { + const NAME: &'static str = "GroupMembershipChanges"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.GroupMembershipChanges".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.GroupMembershipChanges".into() + } +} +/// A summary of the changes in a commit. +/// Includes added/removed inboxes and changes to metadata +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GroupUpdated { + #[prost(string, tag = "1")] + pub initiated_by_inbox_id: ::prost::alloc::string::String, + /// The inboxes added in the commit + #[prost(message, repeated, tag = "2")] + pub added_inboxes: ::prost::alloc::vec::Vec, + /// The inboxes removed in the commit + #[prost(message, repeated, tag = "3")] + pub removed_inboxes: ::prost::alloc::vec::Vec, + /// The metadata changes in the commit + #[prost(message, repeated, tag = "4")] + pub metadata_field_changes: ::prost::alloc::vec::Vec< + group_updated::MetadataFieldChange, + >, + /// / The inboxes that were removed from the group in response to pending-remove/self-remove requests + #[prost(message, repeated, tag = "5")] + pub left_inboxes: ::prost::alloc::vec::Vec, + /// The inboxes that were added to admin list in the commit + #[prost(message, repeated, tag = "6")] + pub added_admin_inboxes: ::prost::alloc::vec::Vec, + /// The inboxes that were removed from admin list in the commit + #[prost(message, repeated, tag = "7")] + pub removed_admin_inboxes: ::prost::alloc::vec::Vec, + /// The inboxes that were added to super admin list in the commit + #[prost(message, repeated, tag = "8")] + pub added_super_admin_inboxes: ::prost::alloc::vec::Vec, + /// The inboxes that were removed from super admin list in the commit + #[prost(message, repeated, tag = "9")] + pub removed_super_admin_inboxes: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `GroupUpdated`. +pub mod group_updated { + /// An inbox that was added or removed in this commit + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] + pub struct Inbox { + #[prost(string, tag = "1")] + pub inbox_id: ::prost::alloc::string::String, + } + impl ::prost::Name for Inbox { + const NAME: &'static str = "Inbox"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.GroupUpdated.Inbox".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.GroupUpdated.Inbox".into() + } + } + /// A summary of a change to the mutable metadata + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] + pub struct MetadataFieldChange { + /// The field that was changed + #[prost(string, tag = "1")] + pub field_name: ::prost::alloc::string::String, + /// The previous value + #[prost(string, optional, tag = "2")] + pub old_value: ::core::option::Option<::prost::alloc::string::String>, + /// The updated value + #[prost(string, optional, tag = "3")] + pub new_value: ::core::option::Option<::prost::alloc::string::String>, + } + impl ::prost::Name for MetadataFieldChange { + const NAME: &'static str = "MetadataFieldChange"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.GroupUpdated.MetadataFieldChange".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.GroupUpdated.MetadataFieldChange".into() + } + } +} +impl ::prost::Name for GroupUpdated { + const NAME: &'static str = "GroupUpdated"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.GroupUpdated".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.GroupUpdated".into() + } +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct OneshotMessage { + #[prost(oneof = "oneshot_message::MessageType", tags = "1")] + pub message_type: ::core::option::Option, +} +/// Nested message and enum types in `OneshotMessage`. +pub mod oneshot_message { + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] + pub enum MessageType { + #[prost(message, tag = "1")] + ReaddRequest(super::ReaddRequest), + } +} +impl ::prost::Name for OneshotMessage { + const NAME: &'static str = "OneshotMessage"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.OneshotMessage".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.OneshotMessage".into() + } +} +/// A request sent by an installation to recover from a fork. Other members +/// may remove and readd that installation from the group. +/// XIP: +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct ReaddRequest { + #[prost(bytes = "vec", tag = "1")] + pub group_id: ::prost::alloc::vec::Vec, + /// The sequence ID of the latest commit log entry at the time the request + /// is sent; used to disambiguate cases where an installation forks + /// and is readded multiple times. + #[prost(uint64, tag = "2")] + pub latest_commit_sequence_id: u64, +} +impl ::prost::Name for ReaddRequest { + const NAME: &'static str = "ReaddRequest"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.ReaddRequest".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.ReaddRequest".into() + } +} /// ContentTypeId is used to identify the type of content stored in a Message. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ContentTypeId { @@ -440,229 +619,24 @@ pub enum Compression { Deflate = 0, Gzip = 1, } -impl Compression { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Deflate => "COMPRESSION_DEFLATE", - Self::Gzip => "COMPRESSION_GZIP", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "COMPRESSION_DEFLATE" => Some(Self::Deflate), - "COMPRESSION_GZIP" => Some(Self::Gzip), - _ => None, - } - } -} -/// Contains a mapping of `inbox_id` -> `sequence_id` for all members of a group. -/// Designed to be stored in the group context extension of the MLS group -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GroupMembership { - #[prost(map = "string, uint64", tag = "1")] - pub members: ::std::collections::HashMap<::prost::alloc::string::String, u64>, - /// List of installations that failed to be added due to errors encountered during the evaluation process. - #[prost(bytes = "vec", repeated, tag = "2")] - pub failed_installations: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, -} -impl ::prost::Name for GroupMembership { - const NAME: &'static str = "GroupMembership"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupMembership".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupMembership".into() - } -} -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct OneshotMessage { - #[prost(oneof = "oneshot_message::MessageType", tags = "1")] - pub message_type: ::core::option::Option, -} -/// Nested message and enum types in `OneshotMessage`. -pub mod oneshot_message { - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] - pub enum MessageType { - #[prost(message, tag = "1")] - ReaddRequest(super::ReaddRequest), - } -} -impl ::prost::Name for OneshotMessage { - const NAME: &'static str = "OneshotMessage"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.OneshotMessage".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.OneshotMessage".into() - } -} -/// A request sent by an installation to recover from a fork. Other members -/// may remove and readd that installation from the group. -/// XIP: -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct ReaddRequest { - #[prost(bytes = "vec", tag = "1")] - pub group_id: ::prost::alloc::vec::Vec, - /// The sequence ID of the latest commit log entry at the time the request - /// is sent; used to disambiguate cases where an installation forks - /// and is readded multiple times. - #[prost(uint64, tag = "2")] - pub latest_commit_sequence_id: u64, -} -impl ::prost::Name for ReaddRequest { - const NAME: &'static str = "ReaddRequest"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.ReaddRequest".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.ReaddRequest".into() - } -} -/// Parent message for group metadata -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct GroupMetadataV1 { - #[prost(enumeration = "ConversationType", tag = "1")] - pub conversation_type: i32, - /// This will be removed soon - #[prost(string, tag = "2")] - pub creator_account_address: ::prost::alloc::string::String, - #[prost(string, tag = "3")] - pub creator_inbox_id: ::prost::alloc::string::String, - /// Should only be present for CONVERSATION_TYPE_DM - #[prost(message, optional, tag = "4")] - pub dm_members: ::core::option::Option, - /// Should only be present for CONVERSATION_TYPE_ONESHOT - #[prost(message, optional, tag = "5")] - pub oneshot_message: ::core::option::Option, -} -impl ::prost::Name for GroupMetadataV1 { - const NAME: &'static str = "GroupMetadataV1"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupMetadataV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupMetadataV1".into() - } -} -/// Wrapper around an Inbox Id -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Inbox { - #[prost(string, tag = "1")] - pub inbox_id: ::prost::alloc::string::String, -} -impl ::prost::Name for Inbox { - const NAME: &'static str = "Inbox"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.Inbox".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.Inbox".into() - } -} -/// Ordering does not matter here -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct DmMembers { - #[prost(message, optional, tag = "1")] - pub dm_member_one: ::core::option::Option, - #[prost(message, optional, tag = "2")] - pub dm_member_two: ::core::option::Option, -} -impl ::prost::Name for DmMembers { - const NAME: &'static str = "DmMembers"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.DmMembers".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.DmMembers".into() - } -} -/// Defines the type of conversation -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] -#[repr(i32)] -pub enum ConversationType { - Unspecified = 0, - Group = 1, - Dm = 2, - Sync = 3, - Oneshot = 4, -} -impl ConversationType { - /// String value of the enum field names used in the ProtoBuf definition. - /// - /// The values are not transformed in any way and thus are considered stable - /// (if the ProtoBuf definition does not change) and safe for programmatic use. - pub fn as_str_name(&self) -> &'static str { - match self { - Self::Unspecified => "CONVERSATION_TYPE_UNSPECIFIED", - Self::Group => "CONVERSATION_TYPE_GROUP", - Self::Dm => "CONVERSATION_TYPE_DM", - Self::Sync => "CONVERSATION_TYPE_SYNC", - Self::Oneshot => "CONVERSATION_TYPE_ONESHOT", - } - } - /// Creates an enum from field names used in the ProtoBuf definition. - pub fn from_str_name(value: &str) -> ::core::option::Option { - match value { - "CONVERSATION_TYPE_UNSPECIFIED" => Some(Self::Unspecified), - "CONVERSATION_TYPE_GROUP" => Some(Self::Group), - "CONVERSATION_TYPE_DM" => Some(Self::Dm), - "CONVERSATION_TYPE_SYNC" => Some(Self::Sync), - "CONVERSATION_TYPE_ONESHOT" => Some(Self::Oneshot), - _ => None, - } - } -} -/// Message for group mutable metadata -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GroupMutableMetadataV1 { - /// Map to store various metadata attributes (Group name, etc.) - #[prost(map = "string, string", tag = "1")] - pub attributes: ::std::collections::HashMap< - ::prost::alloc::string::String, - ::prost::alloc::string::String, - >, - #[prost(message, optional, tag = "2")] - pub admin_list: ::core::option::Option, - /// Creator starts as only super_admin - /// Only super_admin can add/remove other super_admin - #[prost(message, optional, tag = "3")] - pub super_admin_list: ::core::option::Option, -} -impl ::prost::Name for GroupMutableMetadataV1 { - const NAME: &'static str = "GroupMutableMetadataV1"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupMutableMetadataV1".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupMutableMetadataV1".into() - } -} -/// Wrapper around a list of repeated Inbox Ids -#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct Inboxes { - #[prost(string, repeated, tag = "1")] - pub inbox_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, -} -impl ::prost::Name for Inboxes { - const NAME: &'static str = "Inboxes"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.Inboxes".into() +impl Compression { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Deflate => "COMPRESSION_DEFLATE", + Self::Gzip => "COMPRESSION_GZIP", + } } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.Inboxes".into() + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "COMPRESSION_DEFLATE" => Some(Self::Deflate), + "COMPRESSION_GZIP" => Some(Self::Gzip), + _ => None, + } } } /// Message for group mutable metadata @@ -1033,136 +1007,162 @@ impl ::prost::Name for PermissionsUpdatePolicy { "/xmtp.mls.message_contents.PermissionsUpdatePolicy".into() } } -/// A group member and affected installation IDs +/// Message for group mutable metadata +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GroupMutableMetadataV1 { + /// Map to store various metadata attributes (Group name, etc.) + #[prost(map = "string, string", tag = "1")] + pub attributes: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + #[prost(message, optional, tag = "2")] + pub admin_list: ::core::option::Option, + /// Creator starts as only super_admin + /// Only super_admin can add/remove other super_admin + #[prost(message, optional, tag = "3")] + pub super_admin_list: ::core::option::Option, +} +impl ::prost::Name for GroupMutableMetadataV1 { + const NAME: &'static str = "GroupMutableMetadataV1"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.GroupMutableMetadataV1".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.GroupMutableMetadataV1".into() + } +} +/// Wrapper around a list of repeated Inbox Ids #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] -pub struct MembershipChange { - #[prost(bytes = "vec", repeated, tag = "1")] - pub installation_ids: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, - #[prost(string, tag = "2")] - pub account_address: ::prost::alloc::string::String, - #[prost(string, tag = "3")] - pub initiated_by_account_address: ::prost::alloc::string::String, +pub struct Inboxes { + #[prost(string, repeated, tag = "1")] + pub inbox_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -impl ::prost::Name for MembershipChange { - const NAME: &'static str = "MembershipChange"; +impl ::prost::Name for Inboxes { + const NAME: &'static str = "Inboxes"; const PACKAGE: &'static str = "xmtp.mls.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.MembershipChange".into() + "xmtp.mls.message_contents.Inboxes".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.MembershipChange".into() + "/xmtp.mls.message_contents.Inboxes".into() } } -/// The group membership change proto -/// -/// protolint:disable REPEATED_FIELD_NAMES_PLURALIZED -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GroupMembershipChanges { - /// Members that have been added in the commit - #[prost(message, repeated, tag = "1")] - pub members_added: ::prost::alloc::vec::Vec, - /// Members that have been removed in the commit - #[prost(message, repeated, tag = "2")] - pub members_removed: ::prost::alloc::vec::Vec, - /// Installations that have been added in the commit, grouped by member - #[prost(message, repeated, tag = "3")] - pub installations_added: ::prost::alloc::vec::Vec, - /// Installations removed in the commit, grouped by member - #[prost(message, repeated, tag = "4")] - pub installations_removed: ::prost::alloc::vec::Vec, +/// Parent message for group metadata +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct GroupMetadataV1 { + #[prost(enumeration = "ConversationType", tag = "1")] + pub conversation_type: i32, + /// This will be removed soon + #[prost(string, tag = "2")] + pub creator_account_address: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub creator_inbox_id: ::prost::alloc::string::String, + /// Should only be present for CONVERSATION_TYPE_DM + #[prost(message, optional, tag = "4")] + pub dm_members: ::core::option::Option, + /// Should only be present for CONVERSATION_TYPE_ONESHOT + #[prost(message, optional, tag = "5")] + pub oneshot_message: ::core::option::Option, } -impl ::prost::Name for GroupMembershipChanges { - const NAME: &'static str = "GroupMembershipChanges"; +impl ::prost::Name for GroupMetadataV1 { + const NAME: &'static str = "GroupMetadataV1"; const PACKAGE: &'static str = "xmtp.mls.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupMembershipChanges".into() + "xmtp.mls.message_contents.GroupMetadataV1".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupMembershipChanges".into() + "/xmtp.mls.message_contents.GroupMetadataV1".into() } } -/// A summary of the changes in a commit. -/// Includes added/removed inboxes and changes to metadata -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct GroupUpdated { +/// Wrapper around an Inbox Id +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct Inbox { #[prost(string, tag = "1")] - pub initiated_by_inbox_id: ::prost::alloc::string::String, - /// The inboxes added in the commit - #[prost(message, repeated, tag = "2")] - pub added_inboxes: ::prost::alloc::vec::Vec, - /// The inboxes removed in the commit - #[prost(message, repeated, tag = "3")] - pub removed_inboxes: ::prost::alloc::vec::Vec, - /// The metadata changes in the commit - #[prost(message, repeated, tag = "4")] - pub metadata_field_changes: ::prost::alloc::vec::Vec< - group_updated::MetadataFieldChange, - >, - /// / The inboxes that were removed from the group in response to pending-remove/self-remove requests - #[prost(message, repeated, tag = "5")] - pub left_inboxes: ::prost::alloc::vec::Vec, - /// The inboxes that were added to admin list in the commit - #[prost(message, repeated, tag = "6")] - pub added_admin_inboxes: ::prost::alloc::vec::Vec, - /// The inboxes that were removed from admin list in the commit - #[prost(message, repeated, tag = "7")] - pub removed_admin_inboxes: ::prost::alloc::vec::Vec, - /// The inboxes that were added to super admin list in the commit - #[prost(message, repeated, tag = "8")] - pub added_super_admin_inboxes: ::prost::alloc::vec::Vec, - /// The inboxes that were removed from super admin list in the commit - #[prost(message, repeated, tag = "9")] - pub removed_super_admin_inboxes: ::prost::alloc::vec::Vec, + pub inbox_id: ::prost::alloc::string::String, } -/// Nested message and enum types in `GroupUpdated`. -pub mod group_updated { - /// An inbox that was added or removed in this commit - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] - pub struct Inbox { - #[prost(string, tag = "1")] - pub inbox_id: ::prost::alloc::string::String, +impl ::prost::Name for Inbox { + const NAME: &'static str = "Inbox"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.Inbox".into() } - impl ::prost::Name for Inbox { - const NAME: &'static str = "Inbox"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupUpdated.Inbox".into() - } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupUpdated.Inbox".into() - } + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.Inbox".into() } - /// A summary of a change to the mutable metadata - #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] - pub struct MetadataFieldChange { - /// The field that was changed - #[prost(string, tag = "1")] - pub field_name: ::prost::alloc::string::String, - /// The previous value - #[prost(string, optional, tag = "2")] - pub old_value: ::core::option::Option<::prost::alloc::string::String>, - /// The updated value - #[prost(string, optional, tag = "3")] - pub new_value: ::core::option::Option<::prost::alloc::string::String>, +} +/// Ordering does not matter here +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct DmMembers { + #[prost(message, optional, tag = "1")] + pub dm_member_one: ::core::option::Option, + #[prost(message, optional, tag = "2")] + pub dm_member_two: ::core::option::Option, +} +impl ::prost::Name for DmMembers { + const NAME: &'static str = "DmMembers"; + const PACKAGE: &'static str = "xmtp.mls.message_contents"; + fn full_name() -> ::prost::alloc::string::String { + "xmtp.mls.message_contents.DmMembers".into() } - impl ::prost::Name for MetadataFieldChange { - const NAME: &'static str = "MetadataFieldChange"; - const PACKAGE: &'static str = "xmtp.mls.message_contents"; - fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupUpdated.MetadataFieldChange".into() + fn type_url() -> ::prost::alloc::string::String { + "/xmtp.mls.message_contents.DmMembers".into() + } +} +/// Defines the type of conversation +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum ConversationType { + Unspecified = 0, + Group = 1, + Dm = 2, + Sync = 3, + Oneshot = 4, +} +impl ConversationType { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + Self::Unspecified => "CONVERSATION_TYPE_UNSPECIFIED", + Self::Group => "CONVERSATION_TYPE_GROUP", + Self::Dm => "CONVERSATION_TYPE_DM", + Self::Sync => "CONVERSATION_TYPE_SYNC", + Self::Oneshot => "CONVERSATION_TYPE_ONESHOT", } - fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupUpdated.MetadataFieldChange".into() + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "CONVERSATION_TYPE_UNSPECIFIED" => Some(Self::Unspecified), + "CONVERSATION_TYPE_GROUP" => Some(Self::Group), + "CONVERSATION_TYPE_DM" => Some(Self::Dm), + "CONVERSATION_TYPE_SYNC" => Some(Self::Sync), + "CONVERSATION_TYPE_ONESHOT" => Some(Self::Oneshot), + _ => None, } } } -impl ::prost::Name for GroupUpdated { - const NAME: &'static str = "GroupUpdated"; +/// Contains a mapping of `inbox_id` -> `sequence_id` for all members of a group. +/// Designed to be stored in the group context extension of the MLS group +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GroupMembership { + #[prost(map = "string, uint64", tag = "1")] + pub members: ::std::collections::HashMap<::prost::alloc::string::String, u64>, + /// List of installations that failed to be added due to errors encountered during the evaluation process. + #[prost(bytes = "vec", repeated, tag = "2")] + pub failed_installations: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, +} +impl ::prost::Name for GroupMembership { + const NAME: &'static str = "GroupMembership"; const PACKAGE: &'static str = "xmtp.mls.message_contents"; fn full_name() -> ::prost::alloc::string::String { - "xmtp.mls.message_contents.GroupUpdated".into() + "xmtp.mls.message_contents.GroupMembership".into() } fn type_url() -> ::prost::alloc::string::String { - "/xmtp.mls.message_contents.GroupUpdated".into() + "/xmtp.mls.message_contents.GroupMembership".into() } }