Skip to content

fix(baileys): stop resending stale messages on retry receipts - #2707

Closed
maximbaran wants to merge 0 commit into
evolution-foundation:mainfrom
maximbaran:fix/no-stale-retry-resend
Closed

fix(baileys): stop resending stale messages on retry receipts#2707
maximbaran wants to merge 0 commit into
evolution-foundation:mainfrom
maximbaran:fix/no-stale-retry-resend

Conversation

@maximbaran

@maximbaran maximbaran commented Aug 25, 2026

Copy link
Copy Markdown

When a peer fails to decrypt a message it sends a retry receipt, and Baileys replays whatever the socket getMessage callback returns. Since the callback served any message ever stored, a reconnect that flushed a backlog of queued retry receipts could rebroadcast days-old messages, which reappeared in groups as brand-new ones.

The socket callback now only serves messages younger than 15 minutes (poll creation messages stay exempt so vote decryption keeps working), and getMessage returns undefined instead of an empty conversation when the message is missing, so Baileys skips the resend instead of sending a blank bubble.

📋 Description

🔗 Related Issue

Closes #(issue_number)

🧪 Type of Change

  • 🐛 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📚 Documentation update
  • 🔧 Refactoring (no functional changes)
  • ⚡ Performance improvement
  • 🧹 Code cleanup
  • 🔒 Security fix

🧪 Testing

  • Manual testing completed
  • Functionality verified in development environment
  • No breaking changes introduced
  • Tested with different connection types (if applicable)

📸 Screenshots (if applicable)

✅ Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have manually tested my changes thoroughly
  • I have verified the changes work with different scenarios
  • Any dependent changes have been merged and published

📝 Additional Notes

Summary by Sourcery

Prevent stale or empty messages from being rebroadcast during Baileys retry handling.

Bug Fixes:

  • Prevent Baileys from retransmitting messages older than 15 minutes in response to retry receipts, while preserving poll creation messages needed for vote decryption.
  • Return no message when the requested message is missing or cannot be retrieved, avoiding blank-message resends.

Chores:

  • Bump the package version to 2.4.0.

@sourcery-ai

sourcery-ai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Prevents Baileys retry receipts from rebroadcasting stale WhatsApp messages by restricting socket lookups to the last 15 minutes, while preserving poll-related lookups and skipping retries when message content is unavailable.

Sequence diagram for age-limited WhatsApp retry resend

sequenceDiagram
    participant Peer
    participant Baileys
    participant SocketGetMessage
    participant Database

    Peer->>Baileys: retry receipt
    Baileys->>SocketGetMessage: getMessage(key, false, true)
    SocketGetMessage->>Database: query message by key
    alt message missing
        Database-->>SocketGetMessage: no result
        SocketGetMessage-->>Baileys: undefined
        Baileys-->>Peer: skip resend
    else message older than 15 minutes
        Database-->>SocketGetMessage: messageTimestamp
        SocketGetMessage-->>Baileys: undefined
        Baileys-->>Peer: skip resend
    else recent message
        Database-->>SocketGetMessage: message and timestamp
        SocketGetMessage-->>Baileys: message content
        Baileys-->>Peer: resend message
    end
Loading

File-Level Changes

Change Details Files
Limit retry-message replays to recent messages while preserving poll decryption behavior.
  • Add a 15-minute maximum age for messages returned through the retry-resend callback.
  • Keep poll creation messages exempt from the age restriction so vote decryption continues to work.
  • Pass the recent-only mode exclusively to Baileys’ socket getMessage callback.
src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts
Handle missing or unreadable stored messages by skipping resend instead of generating blank content.
  • Return undefined when no matching message is found.
  • Return undefined on lookup errors rather than an empty conversation payload.
src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Possibly linked issues

  • #: The PR directly fixes the reported empty-message retry behavior and additionally prevents stale-message retransmission.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Needs a human reviewer. If the age check is wrong or Baileys timestamps are missing or inconsistent, valid retry requests for messages older than 15 minutes will return no content and some recipients may never receive those messages. Reverting restores the old callback behavior, but deliveries already missed may require a retry or other bounded repair.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sourcery assessment

Approved.

@maximbaran maximbaran closed this Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant