Pular para o conteúdo principal
A mídia é enviada pelo mesmo método client.message.send, usando um objeto de conteúdo de mídia tipado. O builder preenche para você os campos gerenciados pelo protocolo (chaves de criptografia, digests SHA-256, direct path, upload) — você fornece a fonte e, opcionalmente, um mimetype.
Para mídia utilizável, instale @zapo-js/media-utils e conecte um processor via opção de client media. A mídia ainda faz upload sem ele, mas sem um processor ela fica sem thumbnail/preview, dimensões ou waveform — então pode chegar como anexo simples.

Resolução de mimetype

mimetype é opcional. O builder resolve nesta ordem:
  1. O mimetype que você passa no objeto de conteúdo vence.
  2. Se um WaMediaProcessor com detectMimetype está configurado, o builder o chama (sniffing de magic bytes). @zapo-js/media-utils implementa isso em cima de file-type ^19 — instale file-type para habilitar a detecção.
  3. Caso contrário, o builder lança erro para mensagens image/video/audio/document/ptv.
Stickers usam image/webp por padrão quando nenhum mimetype é definido. Entradas de stream Readable sem mimetype são staged para um arquivo temporário antes da detecção rodar.

Entrada de mídia

O campo media aceita vários tipos de entrada:
Prefira um caminho de arquivo (string) ou um stream Readable em vez de um Buffer/Uint8Array. O zapo faz o streaming da mídia pelo pipeline sem bufferizar o arquivo inteiro em memória — passar um caminho ou stream mantém a memória plana independentemente do tamanho do arquivo. Ler um arquivo grande inteiro para um Buffer primeiro anula isso e é desencorajado. (Buffer também é evitado internamente em favor de Uint8Array.)

Imagens

Vídeo

Para uma mensagem redonda de push-to-video (PTV), use type: 'ptv' com o mesmo formato.

Áudio e notas de voz

Notas de voz são melhor renderizadas como Opus em um container OGG. Habilite o processamento de mídia para gerar waveforms automaticamente e normalizar notas de voz.

Documentos

Figurinhas

Para um pacote de figurinhas completo, use type: 'sticker-pack' com stickers, um trayIcon e os metadados do pacote (stickerPackId, name, publisher).

Visualização única

Envolva imagem/vídeo/áudio como visualização única com a opção de envio:

Baixando mídia recebida

O coordinator de mensagens descriptografa e baixa a mídia de um evento recebido. Três variantes estão disponíveis — prefira as de streaming:
download() / downloadToFile() fazem o streaming da mídia e mantêm a memória plana independentemente do tamanho. downloadBytes() materializa o arquivo inteiro em memória — recorra a ele apenas para mídias pequenas e limite-o com maxBytes.
As três aceitam tanto um WaIncomingMessageEvent quanto um Proto.IMessage bruto, mais WaDownloadMediaOptions opcional (por exemplo maxBytes para limitar downloadBytes).

Sem um client conectado

downloadMediaMessage é uma função livre que espelha o client.message.download mas não precisa de uma sessão pareada. O metadata de mídia encriptada viaja dentro da própria mensagem (já decifrada), então você consegue re-baixar mídia de um evento persistido muito tempo depois do socket original ter ido embora — útil para workers offline, replay de arquivo, ou qualquer coisa que processe mensagens armazenadas sem subir um WaClient.
Aceita um WaIncomingMessageEvent ou um Proto.IMessage bruto, retorna um Readable cujo dono é você (pipe ou .destroy() — um stream não consumido vaza o socket). Verificação MAC + SHA-256 roda conforme os bytes são consumidos, mesma semântica do método do coordinator. Lança quando a mensagem não tem mídia para download. Para acesso de mais baixo nível — quando você quer fazer o fetch ao CDN você mesmo, passar as chaves para outro processo, ou só inspecionar o que é baixável — o resolveMediaPayload retorna as keys + hashes sem fazer I/O:
Retorna null quando a mensagem não tem mídia para download, ou quando o proto não carrega directPath / mediaKey. Desencapsula ephemeralMessage, viewOnceMessage / viewOnceMessageV2 e documentWithCaptionMessage antes de resolver. Tipos suportados: image, video (gif quando gifPlayback), audio (ptt quando ptt), document, sticker, ptv.
payload.mediaKey é a seed AES/MAC do blob encriptado — trate como segredo. Não logue, não inclua em mensagens de erro, e não envie para serviço de terceiros a menos que esse seja o ponto inteiro do seu pipeline.

Processamento de mídia

Para mídia adequada, use um processador de mídia. Instale @zapo-js/media-utils e passe um através da opção de client media — ele sonda e processa a mídia (dimensões, duração, miniaturas, waveforms, normalização de notas de voz) antes do upload. Sem ele, a mídia ainda faz upload mas sem esse processamento:
@zapo-js/media-utils invoca ffmpeg/ffprobe e usa sharp. Garanta que esses binários estejam disponíveis no seu ambiente.
Última modificação em 3 de junho de 2026