Skip to main content
O WaClient é um emissor de eventos fortemente tipado. Cada atividade de entrada — mensagens, recibos, mudanças em grupos, presença — é exposta como um evento com um payload tipado.
Plugins podem contribuir com seus próprios eventos tipados; eles aparecem em client.on apenas quando o plugin está no array plugins. Veja o guia de VoIP para um exemplo — seus eventos voip_* ficam disponíveis quando voipPlugin() está instalado.

Escutando

on, once e off são todos verificados por tipo contra o mapa de eventos — o tipo do payload é inferido a partir do nome do evento, então os listeners têm autocomplete completo.

Auth e conexão

O evento connection é uma union discriminada por status:
Veja Reconexão para o padrão de tratamento.

Mensagens

Veja Recebendo mensagens para detalhes do payload e extração de texto.

Mensagens indisponíveis

Algumas stanzas <message> recebidas carregam um marcador <unavailable/> no lugar de um corpo criptografado — uma view-once cujo conteúdo já foi consumido, uma mensagem hosted/bot que o servidor não conseguiu fazer fanout, ou um placeholder de fanout simples que o dispositivo primário ainda pode reenviar. Não há nada para decifrar na stanza em si, mas a chegada é informação útil (audit logs, linha “esta mensagem não está mais disponível” na UI, ou aguardar o resend chegar). A lib ackeia e emite um evento tipado message_unavailable com discriminador kind:
As requisições de resend são best-effort — como no wa-web, elas não são persistidas, então uma peer request que falha não é retentada. Veja Recebendo mensagens → Recuperando mensagens indisponíveis para os detalhes.

Presença e chat-state

Grupos, newsletters e perfis

Estado, histórico e MEX

Kinds de notificação MEX

WaMexNotificationEvent é uma union discriminada por kind. Toda variante carrega operationName (a operação GraphQL upstream) e errors: readonly WaMexNotificationGraphQlError[] (quaisquer erros GraphQL que o servidor anexou — tipicamente vazio).
Os kinds *_hint (username_update_hint, text_status_update_hint) trazem apenas um contactHash, não o valor novo — o servidor está dizendo “algo mudou para esse bucket” e o client é responsável por refetch pelo caminho normal de perfil / status.

Companion host (mobile-primary)

Emitidos pelo coordinator client.mobile quando uma sessão mobile-primary linka, revoga ou falha ao provisionar um device companion. Os três só disparam em sessão mobile-primary.

Falhas

Eventos de debug

Uma família de eventos debug_* expõe internals de baixo nível — frames brutos, nodes decodificados, erros de decode, stanzas não tratadas e erros do client. São úteis para depuração de protocolo, mas barulhentos; inscreva-se seletivamente.

debug_decrypted_payload

O plaintext de cada <enc> descriptografado da stanza, emitido entre o unpad e o proto.Message.decode. Dispara quer o decode dê certo ou não — o que torna o caso de falha observável. Sem esse hook, um payload que descriptografa mas não decodifica (um campo proto que a lib ainda não conhece, um corpo malformado) se perde: decode lança, a stanza é reportada em debug_unhandled_stanza, e os bytes vão junto — enquanto a decriptação já avançou o ratchet, então esse mesmo ciphertext nunca vai decifrar de novo.
Não custa nada quando ninguém está inscrito — a cópia do plaintext só é construída quando existe pelo menos um listener. Útil para gravar tráfego para replay fiel (re-encodar uma mensagem decodada não reproduz os bytes originais), ou decodificar com um protobuf mais novo do que a lib carrega. Um listener que lança é engolido e logado, então um observer buggy não pode envenenar a entrega.
Os eventos de registro mobile (mobile_registration_code, mobile_account_takeover_notice) existem para o caminho de registro mobile e não fazem parte do fluxo companion padrão.
Última modificação em 19 de agosto de 2026