feat: add automatic CTWA (Click-to-WhatsApp) ads message recovery

Messages from Facebook/Instagram ads (Click-to-WhatsApp) don't arrive on
linked devices because Meta's ads endpoint doesn't encrypt for multi-device.
They arrive as "Message absent from node" placeholders.

This change automatically requests the message from the primary phone via
PDO (Peer Data Operation) when a CTWA placeholder is detected.

Changes:
- Add enableCTWARecovery config option (default: true)
- Trigger requestPlaceholderResend() for "Message absent from node" errors
- Add comprehensive unit tests for CTWA recovery functionality

Resolves: https://github.com/WhiskeySockets/Baileys/issues/1723
Resolves: https://github.com/WhiskeySockets/Baileys/issues/1034
This commit is contained in:
Claude
2026-01-21 15:28:56 +00:00
parent af6f2eede7
commit 9e5c14f2d5
4 changed files with 253 additions and 6 deletions
+18
View File
@@ -166,6 +166,24 @@ export type SocketConfig = {
/** Circuit breaker configuration for message operations */
messageCircuitBreaker?: Partial<CircuitBreakerOptions>
// === CTWA (Click-to-WhatsApp) Ads Recovery ===
/**
* Enable automatic recovery of CTWA (Click-to-WhatsApp) ads messages.
*
* Messages from Facebook/Instagram ads don't arrive on linked devices because
* Meta's ads endpoint doesn't encrypt messages for multi-device architecture.
* They arrive as "Message absent from node" placeholders.
*
* When enabled, the library will automatically request the original message
* from the primary phone via PDO (Peer Data Operation) when a CTWA placeholder
* is detected.
*
* @default true
* @see https://github.com/WhiskeySockets/Baileys/issues/1723
*/
enableCTWARecovery?: boolean
// === Listener Limits (Memory Leak Prevention) ===
/**