New features
Encrypted reactions in Community Announcement GroupsClient::send_reaction now transparently detects Community Announcement Groups (CAG — the default announcement subgroup of a community) and encrypts the reaction before sending. No API change is needed; the same call works for DMs, regular groups, and CAGs:
GroupInfo::is_community_announce (cached from group metadata). When true, the reaction emoji and timestamp are encrypted with the target post’s messageSecret under the "Enc Reaction" HKDF use-case and shipped as an enc_reaction_message envelope — matching WA Web’s WAWebReactionEncryptMsgData flow. If the parent secret was not captured (message received before session started, or msg_secret_policy disabled without a resolver) the call fails with a descriptive error rather than silently emitting a plaintext reaction the channel would reject.
Incoming encrypted reactions are decrypted transparently by the receive path and dispatched in the same plaintext reaction_message shape as an ordinary group reaction. The key field is filled from the envelope’s target_message_key so event handlers require no changes.
Channel comments via
client.comments()
A new Comments feature handle lets you post encrypted threaded replies under a CAG post. Comments require the parent post’s messageSecret (captured during receive) and are authored under the LID identity, matching WA Web’s getMeLidUserOrThrow:
messageSecret of its own so it can receive encrypted reactions. Both the comment body secret and the parent-post secret are persisted under the correct ids.
Incoming encrypted comments are decrypted transparently. The decrypted body is dispatched as a normal Event::Message. The parent post key surfaces on the new MessageInfo::comment_target field, since the inner Message proto has no slot for the threading link:
messageSecret (from the outer envelope) is persisted under the comment’s id and sender so that future encrypted reactions to the comment can be decrypted.
Breaking changes
Pre-1.0, additive surface. The following structs and enums gain new fields/variants. If you construct them with exhaustive struct-literal syntax (without..Default::default()), add the new fields:
MessageInfo gains comment_target: Option<wa::MessageKey>:
GroupInfo gains is_community_announce: Option<bool>. Blobs persisted before this field was added will deserialize with None (“unknown”) and trigger one metadata re-query when the value is first needed. No migration is required — existing serialized blobs remain valid.
SecretEncKind gains two variants that must be covered in exhaustive match arms:
SecretEncKind::EncReaction— anenc_reaction_messageenvelopeSecretEncKind::EncComment— anenc_comment_messageenvelope