WaWeb canonical pipeline

Do socket à mensagem

Como o WhatsApp Web sai do nada e chega a mandar e receber uma mensagem: abre um canal seguro, pede autorização ao celular principal, autentica a sessão, baixa o estado da conta e troca mensagens.

Glossário

Termos técnicos do protocolo explicados em linguagem direta.

Glossário dos termos do mapa

Tradução curta dos nomes mais técnicos que aparecem no fluxo. Os termos ficam no idioma do protocolo para facilitar o diff com os logs, mas a explicação mostra o papel de cada um.

WebSocket
Canal que fica aberto entre cliente e servidor, permitindo troca de dados nos dois sentidos sem abrir uma conexão nova a cada mensagem.
HTTP 101
Resposta do servidor que aceita trocar o HTTP comum por WebSocket. É o sim oficial para abrir o canal persistente.
frame
Pacote bruto que viaja pelo WebSocket. Antes de virar uma stanza legível, tudo aparece como frames binários.
Noise
Protocolo que cria o canal seguro. Depois do handshake Noise, o tráfego passa cifrado entre cliente e servidor.
client_hello
Primeira mensagem do handshake Noise. O cliente envia uma chave temporária para começar a negociação segura.
server_hello
Resposta do servidor no handshake Noise. Ela devolve dados temporários para o cliente continuar a negociação.
client_finish
Mensagem final do handshake Noise. O cliente fecha a negociação e deixa o canal pronto para tráfego cifrado.
stanza
Mensagem estruturada do protocolo, parecida com uma árvore: tem tag, atributos, conteúdo e filhos.
WAP
Formato binário usado pelo WhatsApp para transformar stanzas em bytes compactos antes de enviar pelo socket.
iq
Tipo de stanza usado para pedidos que esperam resposta, como consultar dados, configurar estado ou registrar algo.
PairCode
Código curto digitado no celular para autorizar o novo aparelho sem usar QR code.
pair-device
Pedido inicial do servidor para começar o pareamento. Ele carrega referências usadas pelo celular e pelo cliente.
companion
Nome do protocolo para o aparelho secundário, ou seja, o cliente que será vinculado ao celular principal.
ref
Identificador temporário do pareamento. Ele amarra a tentativa do companion com o celular principal.
primary hello
Mensagem do celular principal para o companion durante o pareamento. Ela confirma o pedido e envia chaves.
ack
Confirmação curta de recebimento. Diz que uma stanza chegou, sem carregar uma resposta de negócio.
pair-success
Stanza que marca o pareamento como concluído. Depois dela, o companion já pode operar como autorizado.
stream:error
Erro de stream usado aqui como fechamento controlado. O servidor encerra o canal antigo para forçar reconexão.
success
Confirmação de login depois da reconexão. A partir dela, a sessão foi aceita e pode sincronizar dados.
lid
Identificador interno da conta no modelo multi-device. Em muitos pontos ele substitui o telefone.
props
Conjunto de configurações e flags que o servidor entrega para ajustar o comportamento da sessão.
edge_routing
Informação de rota que ajuda o cliente a escolher por onde trafegar com os servidores do WhatsApp.
dirty
Sinal de que algum conjunto de dados precisa ser limpo, confirmado ou sincronizado de novo.
Signal
Protocolo de criptografia ponta a ponta. Ele protege o conteúdo para que só remetente e destino leiam.
skey
Bloco de chave assinada usado no material de criptografia do dispositivo. O relatório mostra só a presença, nunca o valor.
usync
Consulta de sincronização de usuários. Serve para descobrir dispositivos, identidades, status e chaves.
offline
Lote de mensagens e eventos que chegaram enquanto o cliente estava fora e precisam ser entregues ao reconectar.
histórico pendente
Nome didático para mensagens e eventos que ficaram acumulados enquanto o Web não estava conectado. A captura mostra a estrutura desses pacotes, mas não publica o conteúdo cifrado.
app-state
Estado local do aplicativo: perfil, foto, dispositivos, identidade, listas, privacidade e outros dados que precisam ficar iguais entre celular, Web e servidor.
unified_session
Marcador de sessão enviado durante o bootstrap para alinhar estado entre a sessão Web e o servidor.
device-identity
Bloco assinado que prova quais dispositivos pertencem a uma conta e ajuda a validar o envio cifrado.
receipt
Recibo de estado da mensagem. Pode indicar entrega, recebimento, leitura ou outro avanço do fluxo.
fanout
Envio da mesma mensagem para vários dispositivos do destinatário, cada um com seu envelope cifrado.
phash
Hash estrutural que aparece em confirmação de envio. Ajuda a correlacionar o ack sem expor o conteúdo da mensagem.
my_addons
Consulta de recursos adicionais da conta. No fluxo, aparece como checagem auxiliar antes de concluir o fanout.
enc
Filho da stanza que carrega o conteúdo cifrado pelo Signal. O texto real só aparece depois de decifrar.
pipeline
Linha do tempo completa da captura. Inclui eventos de transporte, frames, handshake, stanzas e fechamento.
seq
Número sequencial de um evento no pipeline. Ele permite dizer exatamente o que veio antes e depois.
sent
Direção cliente para servidor. No mapa aparece como C → S.
recv
Direção servidor para cliente. No mapa aparece como S → C.
attrs
Atributos de uma stanza, como nomes de campos. O relatório publica nomes, não valores sensíveis.
children
Filhos de uma stanza. Eles formam a árvore interna, por exemplo message contendo enc.
payload
Conteúdo carregado por um frame ou stanza. Pode ser bytes cifrados, árvore WAP ou dados redigidos.
opcode
Tipo técnico do frame WebSocket. Aqui o importante é saber quando ele carrega bytes binários.
ping
Checagem curta de conexão. Nos frames capturados pelo recorder, não apareceu ping nativo do WebSocket; tratamos o sent iq vazio com xmlns=w:p como ping de aplicação.
keepalive
Função de manter a conexão viva. Nos frames capturados, o keepalive visível é interpretado como ping de aplicação do WhatsApp, não como opcode WebSocket de ping/pong.
batimento de aplicação
Forma didática de falar dos pares curtos e repetidos de iq vistos na janela passiva. Como o envio usa xmlns=w:p, o relatório também chama isso de ping de aplicação.
redigido
Valor ocultado de propósito. A estrutura fica visível, mas telefone, token, chave, JID e payload bruto ficam fora.
captura canônica
Execução do WhatsApp Web oficial observada em detalhe. Ela vira a referência para comparar o cliente C#.
baseline
Registro de referência usado no diff. Se o C# divergir dele, a diferença aponta onde investigar.
fresh
Execução começando sem sessão salva. Por isso inclui pareamento novo, autenticação e primeiro bootstrap.
observe
Execução de observação passiva. Ela usa uma sessão já pareada, não envia mensagem e fica olhando o que o WhatsApp Web faz sozinho depois do ready, quando o cliente oficial declara que está pronto.
contrato
Forma esperada do evento: ordem, tag, attrs, filhos, direção e contagens. Valores variáveis não entram no contrato.
JSONL
Arquivo de dados com um JSON por linha. Foi usado como insumo local, mas não é publicado neste HTML.
cliente oficial
O WhatsApp Web real rodando no navegador. Ele é a fonte de verdade do projeto.
cliente C#
A implementação WaWeb que deve reproduzir a mesma estrutura do fluxo observado no cliente oficial.
celular principal
Aparelho dono da conta WhatsApp Business. Ele autoriza o PairCode e mantém a identidade principal.
celular auxiliar
Aparelho usado no teste para enviar a mensagem que aparece como recebida no fim da captura.