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:
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 coordinatorclient.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 eventosdebug_* 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.
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.