Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions guides/receiving-messages.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,10 @@ PDO is also used alongside retry receipts for normal decryption failures. On the
PDO requests are deduplicated — if a request is already pending for a given message, subsequent requests are skipped. Pending requests expire after 30 seconds. The deduplication cache uses phone-number JIDs as keys (not LID JIDs) to ensure the cache key matches the JID format in the phone's response.
</Note>

Separately from that 30-second in-flight cache, a longer-lived `pdo_requested` memo cache also gates placeholder requests, capping each message to at most one request within its window (default: 24h TTL, 512 entries — see [Bot - Cache Configuration Reference](/api/bot#cache-configuration-reference)). Expiration or eviction can still let a later redelivery send a second request for the same message.

**This gate now keys per sender, not just per `(chat, id)` ([#1319](https://github.com/oxidezap/whatsapp-rust/pull/1319)).** The sending client chooses a message's ID, not the server, so two participants in the same group can pick the same one. Before this fix, gating on `(chat, id)` alone let the first participant's request silently suppress the second's, and the second sender's content was never recovered. When a PDO response arrives, the client also checks that the pending request it matches names the same sender, comparing both the LID and phone-number spellings since a group's own delivery can carry either. If the sender doesn't match, the client rebuilds the recovered message from the response itself instead of risking a wrong attribution.

### Sent message retry (outbound)

When a recipient's device cannot decrypt your message, it sends a retry receipt. The client handles this automatically using DB-backed sent message storage:
Expand Down