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 Prometheus metrics for CTWA recovery tracking
- 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 14:56:39 +00:00
parent af6f2eede7
commit 5a36ae20d4
6 changed files with 362 additions and 6 deletions
+18
View File
@@ -1385,6 +1385,24 @@ export const metrics = {
new Gauge('messages_queued', 'Current number of messages in queue', ['priority'])
),
// ========== CTWA (Click-to-WhatsApp Ads) Metrics ==========
/**
* Messages from Facebook/Instagram ads that arrive as placeholder messages
* and are recovered via PDO (Peer Data Operation) request
*/
ctwaRecoveryRequests: baileysMetrics.register(
new Counter('ctwa_recovery_requests_total', 'Total CTWA placeholder resend requests', ['status'])
),
ctwaMessagesRecovered: baileysMetrics.register(
new Counter('ctwa_messages_recovered_total', 'Total CTWA messages successfully recovered')
),
ctwaRecoveryLatency: baileysMetrics.register(
new Histogram('ctwa_recovery_latency_ms', 'CTWA message recovery latency in ms', [], [500, 1000, 2000, 3000, 5000, 8000, 10000])
),
ctwaRecoveryFailures: baileysMetrics.register(
new Counter('ctwa_recovery_failures_total', 'Total CTWA recovery failures', ['reason'])
),
// ========== Media Metrics ==========
mediaUploads: baileysMetrics.register(
new Counter('media_uploads_total', 'Total media uploads', ['type', 'status'])