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.
Resolução de mimetype
mimetype é opcional. O builder resolve nesta ordem:
- O
mimetypeque você passa no objeto de conteúdo vence. - Se um
WaMediaProcessorcomdetectMimetypeestá configurado, o builder o chama (sniffing de magic bytes).@zapo-js/media-utilsimplementa isso em cima defile-type^19 — instalefile-typepara habilitar a detecção. - Caso contrário, o builder lança erro para mensagens
image/video/audio/document/ptv.
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 campomedia aceita vários tipos de entrada:
Imagens
Vídeo
type: 'ptv' com o mesmo formato.
Áudio e notas de voz
Documentos
Figurinhas
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: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.
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:
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.
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.