Skip to content

[NOWEB] Voice/audio messages saved as 0-byte files in S3 storage — downloadMediaMessage 'buffer' mode returns empty buffer #1996

@daniel-rudaev

Description

@daniel-rudaev

Description

Voice/audio messages (OGG Opus) are saved as 0-byte empty files when using NOWEB engine with S3 media storage. Images download correctly through the same pipeline.

Version

  • WAHA: 2026.2.1 (also confirmed in latest core branch source)
  • Engine: NOWEB
  • Tier: PLUS
  • Media storage: S3 (AWS, eu-central-1)

Steps to reproduce

  1. Configure WAHA with WAHA_MEDIA_STORAGE=S3 and a valid S3 bucket
  2. Start a NOWEB session
  3. Receive an image message → file saved to S3 with correct size (e.g. 143KB) ✅
  4. Receive a voice message (PTT / audio/ogg) → file saved to S3 as 0 bytes ❌

Expected behavior

Voice/audio files should be saved with their actual content, same as images.

Actual behavior

  • hasMedia: true in webhook ✅
  • media.url present, pointing to S3 ✅
  • File exists in S3 bucket ✅
  • File size: 0 bytes
  • No errors in WAHA logs — the save appears successful

Analysis

The NOWEB media processor in session.noweb.core.ts calls:

return (await downloadMediaMessage(
  message,
  'buffer',   // <-- this mode
  {},
  {
    logger: this.logger,
    reuploadRequest: this.session.sock.updateMediaMessage,
  },
).finally(() => {
  content.url = url;
})) as Buffer;

The 'buffer' mode in Baileys silently returns an empty buffer for audio/voice messages without throwing an error. This is a known Baileys issue:

Images are unaffected because they go through a different decryption path in Baileys.

Suggested fix

Switch from 'buffer' to 'stream' mode and collect chunks manually:

const stream = await downloadMediaMessage(
  message,
  'stream',
  {},
  {
    logger: this.logger,
    reuploadRequest: this.session.sock.updateMediaMessage,
  },
);
const chunks = [];
for await (const chunk of stream) {
  chunks.push(chunk);
}
return Buffer.concat(chunks);

This is the fix confirmed working in openclaw/openclaw#4636.

Environment

  • OS: Linux x64 (Docker on AWS EC2)
  • Deployment: Coolify
  • S3 config: WAHA_S3_PROXY_FILES=false, WHATSAPP_FILES_LIFETIME=86400
  • No WHATSAPP_FILES_MIMETYPES restriction (all types enabled)
  • WHATSAPP_DOWNLOAD_MEDIA not set (defaults true)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions