diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 171338f7..5ebf5520 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -427,8 +427,12 @@ export const decryptMessageNode = ( // Slim error projection — keep name/message/type for diagnosis, // drop `stack` which adds 4-5 lines of node_modules paths per log - // for known-recoverable libsignal errors. Full stack is still - // available via originalError if needed in custom handlers. + // for known-recoverable libsignal errors. + // + // CRITICAL: only slim for KNOWN-RECOVERABLE categories (corrupted / + // session-record). The unknown-error branch keeps the full Error so + // protobuf/parsing/runtime bugs still emit a stack trace where it + // matters most. Catches Copilot/Codex P2 review on PR #391. const slimErr = originalError ? { name: (originalError as { name?: string }).name, @@ -436,10 +440,11 @@ export const decryptMessageNode = ( type: (originalError as { type?: string }).type } : undefined + const isRecoverableCategory = isCorrupted || isSessionRecord const errorContext = { key: fullMessage.key, - err: slimErr, + err: isRecoverableCategory ? slimErr : originalError, messageType: tag === 'plaintext' ? 'plaintext' : attrs.type, sender, author, diff --git a/src/index.ts b/src/index.ts index 745af59f..fc3a701c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -30,8 +30,13 @@ console.info = function (...args: unknown[]) { const _errorTimestamps = new Map() // Dedup window for repeated decrypt-error console lines (Bad MAC / Counter / etc). // Was 150ms, but retry attempts of the SAME message are typically ~300-1000ms apart, -// so the second attempt fell outside the window and double-printed. 5s comfortably -// covers a retry pair without suppressing genuinely new errors for the same JID. +// so the second attempt fell outside the window and double-printed. +// +// TRADE-OFF: dedup key is `errorType + JID` (no message-id). With 5s, a burst of +// errors for the SAME JID — even of slightly different categories or different +// messages — collapses to one log line every 5s. This is intentional for a noisy +// production stream; if you need per-message visibility, set BAILEYS_LOG_LEVEL=debug +// to bypass this console-side dedup and see the structured pino logs in full. const DEDUP_WINDOW_MS = 5000 console.error = function (...args: unknown[]) {