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.