Pular para o conteúdo principal

Documentation Index

Fetch the complete documentation index at: https://zapo.to/llms.txt

Use this file to discover all available pages before exploring further.

O WaClient não reconecta automaticamente. Esta é uma escolha de design deliberada: a política de reconexão (backoff, máximo de tentativas, alertas) pertence à sua aplicação. Você escuta o connection: close e decide o que fazer.

O evento connection

connection é uma union discriminada por status:
client.on('connection', (event) => {
  if (event.status === 'open') {
    console.log('connected', { isNewLogin: event.isNewLogin })
    return
  }

  // status === 'close'
  console.log('disconnected', {
    reason: event.reason,
    code: event.code,
    isLogout: event.isLogout
  })
})
Em close:
  • isLogout: true — o dispositivo foi desvinculado (logout no servidor). Não reconecte; as credenciais se foram e você precisa parear novamente.
  • isLogout: false — uma queda transitória. É seguro reconectar com as credenciais armazenadas.

Um loop de reconexão com backoff

const MAX_ATTEMPTS = 10

async function connectWithRetry(client: WaClient) {
  let attempt = 0

  client.on('connection', (event) => {
    if (event.status === 'open') {
      attempt = 0 // reseta o backoff em uma conexão saudável
      return
    }
    if (event.isLogout) {
      console.error('logged out — re-pairing required')
      return
    }
    void reconnect()
  })

  async function reconnect() {
    if (attempt >= MAX_ATTEMPTS) {
      console.error('giving up after', attempt, 'attempts')
      return
    }
    const delayMs = Math.min(30_000, 1_000 * 2 ** attempt)
    attempt += 1
    console.log(`reconnecting in ${delayMs}ms (attempt ${attempt})`)
    await new Promise((r) => setTimeout(r, delayMs))
    try {
      await client.connect()
    } catch (err) {
      console.error('reconnect failed', err)
      void reconnect()
    }
  }

  await client.connect()
}

Depois de reconectar

Parte do estado é escopado à conexão e precisa ser reestabelecido após uma reconexão bem-sucedida:
  • Assinaturas de presença — faça subscribe() novamente em qualquer contato que você estava observando (Presença).
  • Atualizações ao vivo de newsletter — faça subscribeLiveUpdates() novamente se você depende delas.
O estado persistido (credenciais, sessões do Signal, app-state) é restaurado da store automaticamente — você não pareia novamente em uma reconexão normal.

Encerramento gracioso

Chame disconnect() para um encerramento limpo que mantém as credenciais, para que você possa retomar mais tarde:
process.on('SIGINT', async () => {
  await client.disconnect()
  process.exit(0)
})
Isso descarrega os dados pendentes de write-behind e fecha o socket sem desvincular o dispositivo.
Last modified on May 27, 2026