> ## Documentation Index
> Fetch the complete documentation index at: https://zapo.to/llms.txt
> Use this file to discover all available pages before exploring further.

# Arquitetura

> Como o WaClient, os coordinators, as stores, o transporte e o fluxo de eventos se encaixam no zapo, e como os dados vão do WhatsApp ao seu código.

O `zapo` é organizado em torno de um **client** enxuto que delega cada funcionalidade a um **coordinator** focado. O client é dono da conexão, da autenticação e do emissor de eventos; os coordinators são donos da lógica de domínio.

<h2 id="the-client">
  O client
</h2>

O [`WaClient`](/pt-br/reference/client) é o único ponto de entrada. Você o constrói com opções e um logger opcional, e então chama `connect()`:

```ts theme={null}
const client = new WaClient({ store, sessionId: 'default' }, logger)
await client.connect()
```

O client em si expõe apenas uma superfície pequena: ciclo de vida da conexão (`connect`, `disconnect`, `logout`), consultas de estado (`getState`, `getCredentials`) e o emissor de eventos tipado (`on`, `once`, `off`). Todo o resto fica atrás de um getter de coordinator.

<h2 id="coordinators">
  Coordinators
</h2>

Cada coordinator é acessado por um getter no client. Eles são conectados de forma lazy na construção e é seguro manter referências a eles.

| Getter                 | Coordinator                     | Responsabilidade                                                |
| ---------------------- | ------------------------------- | --------------------------------------------------------------- |
| `client.auth`          | `WaAuthClient`                  | Pareamento, credenciais, estado de registro                     |
| `client.message`       | `WaMessageCoordinator`          | Envio/recebimento, recibos, download de mídia, addons           |
| `client.presence`      | `WaPresenceCoordinator`         | Presença própria/de terceiros e chat-state                      |
| `client.chat`          | `WaAppStateMutationCoordinator` | Configurações de chat: silenciar, fixar, arquivar, ler, excluir |
| `client.group`         | `WaGroupCoordinator`            | Grupos e comunidades                                            |
| `client.newsletter`    | `WaNewsletterCoordinator`       | Canais: criar, enviar, seguir, administrar                      |
| `client.status`        | `WaStatusCoordinator`           | Envio de status (broadcast) e reações                           |
| `client.broadcastList` | `WaBroadcastListCoordinator`    | Gerenciamento de listas de transmissão e envios                 |
| `client.privacy`       | `WaPrivacyCoordinator`          | Categorias de privacidade, lista de bloqueios                   |
| `client.profile`       | `WaProfileCoordinator`          | Foto de perfil, texto de status, nome de usuário                |
| `client.business`      | `WaBusinessCoordinator`         | Perfil business, nomes verificados                              |
| `client.bot`           | `WaBotCoordinator`              | Perfis e prompts de bot (Meta AI e outros)                      |
| `client.email`         | `WaEmailCoordinator`            | Vincular/verificar e-mail na conta                              |
| `client.lowlevel`      | `WaLowLevelCoordinator`         | Escape hatch para envio/query de node bruto                     |

Como os tipos dos coordinators são exportados a partir da raiz do pacote, você pode anotá-los em TypeScript:

```ts theme={null}
import type { WaGroupCoordinator } from 'zapo-js'

const groups: WaGroupCoordinator = client.group
```

<h2 id="data-flow">
  Fluxo de dados
</h2>

```mermaid theme={null}
flowchart TD
  S["WhatsApp Web servers"]
  T["Transport · binary node decode"]
  P["Parsers / normalizers · src/client/events"]
  C["Coordinators · emit typed events"]
  L["Your listeners"]
  D[("Store · auth, signal, app-state, messages …")]
  S -->|Noise-encrypted frames| T --> P --> C --> L
  C --> D
```

* **Entrada**: os frames são decodificados em binary nodes, parseados e normalizados em payloads de eventos tipados, e então emitidos (`message`, `receipt`, `group`, …).
* **Saída**: sua chamada a um coordinator (por exemplo, `client.message.send`) é construída em um node de protocolo, criptografada e escrita no socket; o coordinator resolve assim que o servidor envia o ack.

<h2 id="engineering-conventions">
  Convenções de engenharia
</h2>

Se você ler o código-fonte, estas convenções são onipresentes e explicam boa parte do formato da API:

* **`Uint8Array` em todo lugar** para dados binários (`Buffer` é evitado), com views zero-copy nos caminhos quentes.
* **Apenas named exports** — não há default exports.
* **Sem enums** — as constantes usam `Object.freeze({ ... } as const)`, expostas como os objetos `WA_*`.
* **Estruturas em memória limitadas** para evitar crescimento ilimitado em processos de longa duração.

<h2 id="next">
  A seguir
</h2>

<CardGroup cols={2}>
  <Card title="Autenticação" icon="qrcode" href="/pt-br/concepts/authentication" arrow>
    Pareamento com QR ou um código de 8 caracteres, e o ciclo de vida das credenciais.
  </Card>

  <Card title="Eventos" icon="bell" href="/pt-br/concepts/events" arrow>
    O mapa completo de eventos e como escutá-los.
  </Card>

  <Card title="Stores" icon="database" href="/pt-br/concepts/stores" arrow>
    Providers, domínios e backends.
  </Card>

  <Card title="Configuração" icon="sliders" href="/pt-br/concepts/configuration" arrow>
    Cada campo de `WaClientOptions` explicado.
  </Card>
</CardGroup>
