diff --git a/src/message/dispatch.rs b/src/message/dispatch.rs index af2ba8d7c..70b867ab2 100644 --- a/src/message/dispatch.rs +++ b/src/message/dispatch.rs @@ -15,10 +15,9 @@ impl Client { let mut info = Arc::clone(info); if info.ephemeral_expiration.is_none() - && msg.get_base_message().get_ephemeral_expiration().is_some() + && let Some(exp) = msg.get_base_message().get_ephemeral_expiration() { - Arc::make_mut(&mut info).ephemeral_expiration = - msg.get_base_message().get_ephemeral_expiration(); + Arc::make_mut(&mut info).ephemeral_expiration = Some(exp); } // Keep this ordered with dispatch; add-on messages can immediately diff --git a/wacore/src/messages.rs b/wacore/src/messages.rs index 7e936df33..530006d08 100644 --- a/wacore/src/messages.rs +++ b/wacore/src/messages.rs @@ -1,7 +1,8 @@ use crate::libsignal::crypto::CryptographicHash; use anyhow::{Result, anyhow}; use base64::Engine as _; -use prost::Message as ProtoMessage; +#[cfg(test)] +use prost::Message as _; use waproto::whatsapp as wa; pub struct MessageUtils; @@ -98,8 +99,11 @@ impl MessageUtils { let ctx = owned .message_context_info .get_or_insert_with(Default::default); - ctx.merge(waproto::codec::message_context_info_to_vec(extra).as_slice()) - .expect("merge MessageContextInfo"); + waproto::codec::message_context_info_merge( + ctx, + &waproto::codec::message_context_info_to_vec(extra), + ) + .expect("merge MessageContextInfo"); } return Self::encode_dm_plaintexts_owned(owned, destination_jid); } diff --git a/waproto/src/lib.rs b/waproto/src/lib.rs index a1ac86d41..2f0a531d6 100644 --- a/waproto/src/lib.rs +++ b/waproto/src/lib.rs @@ -84,4 +84,20 @@ pub mod codec { pub fn message_context_info_to_vec(mci: &whatsapp::MessageContextInfo) -> Vec { mci.encode_to_vec() } + + /// Merge wire bytes into an existing `MessageContextInfo` (prost merge + /// semantics: later-set fields win). + /// + /// Merges through a `&mut &mut &[u8]` buffer — the exact shape + /// `Message::decode` threads into its nested `MessageContextInfo` — so the + /// `BotMetadata` decode subtree reuses that instantiation instead of + /// emitting a second ~67 KiB copy in a distinct buffer-type shape. + #[inline(never)] + pub fn message_context_info_merge( + mci: &mut whatsapp::MessageContextInfo, + bytes: &[u8], + ) -> Result<(), prost::DecodeError> { + let mut cursor = bytes; + mci.merge(&mut &mut cursor) + } }