From 9e1e67df6a10011c2b5be5907d92f0196e541fbc Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 22 Jan 2026 18:24:18 +0000 Subject: [PATCH] fix: skip retry for expired status messages over 24 hours old MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-pick from upstream PR #2280 (commit 92d4198) - Add STATUS_EXPIRY_SECONDS constant (24h = 86400s) - Skip retry attempts for status broadcast messages older than 24h - Saves resources by not retrying messages that are already expired Co-authored-by: João Lucas de Oliveira Lopes <55464917+jlucaso1@users.noreply.github.com> --- src/Defaults/index.ts | 3 +++ src/Socket/messages-recv.ts | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Defaults/index.ts b/src/Defaults/index.ts index 846a8108..c2cb2c37 100644 --- a/src/Defaults/index.ts +++ b/src/Defaults/index.ts @@ -24,6 +24,9 @@ export const WA_ADV_HOSTED_DEVICE_SIG_PREFIX = Buffer.from([6, 6]) export const WA_DEFAULT_EPHEMERAL = 7 * 24 * 60 * 60 +/** Status messages older than 24 hours are considered expired */ +export const STATUS_EXPIRY_SECONDS = 24 * 60 * 60 + export const NOISE_MODE = 'Noise_XX_25519_AESGCM_SHA256\0\0\0\0' export const DICT_VERSION = 3 export const KEY_BUNDLE_TYPE = Buffer.from([5]) diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index 4be626e9..f7385565 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -3,7 +3,7 @@ import { Boom } from '@hapi/boom' import { randomBytes } from 'crypto' import Long from 'long' import { proto } from '../../WAProto/index.js' -import { DEFAULT_CACHE_TTLS, KEY_BUNDLE_TYPE, MIN_PREKEY_COUNT } from '../Defaults' +import { DEFAULT_CACHE_TTLS, KEY_BUNDLE_TYPE, MIN_PREKEY_COUNT, STATUS_EXPIRY_SECONDS } from '../Defaults' import { metrics, recordMessageReceived, recordHistorySyncMessages, recordMessageRetry, recordMessageFailure } from '../Utils/prometheus-metrics.js' import type { GroupParticipant, @@ -1299,6 +1299,18 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { return sendMessageAck(node) } + // Skip retry for expired status messages (>24h old) + if (isJidStatusBroadcast(msg.key.remoteJid!)) { + const messageAge = unixTimestampSeconds() - toNumber(msg.messageTimestamp) + if (messageAge > STATUS_EXPIRY_SECONDS) { + logger.debug( + { msgId: msg.key.id, messageAge, remoteJid: msg.key.remoteJid }, + 'skipping retry for expired status message' + ) + return sendMessageAck(node) + } + } + const errorMessage = msg?.messageStubParameters?.[0] || '' const isPreKeyError = errorMessage.includes('PreKey')