fix: notifica falhas silenciosas de QR no Chatwoot e reconcilia estado zumbi#2657
Open
PhyBruno wants to merge 6 commits into
Open
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…n-foundation Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…o zumbi Dois problemas distintos, mas relacionados: 1) QR solicitado pelo Chatwoot as vezes simplesmente nao aparecia na conversa - mesmo com a instancia genuinamente desconectada, nao so em cenario de estado "zumbi". Causa: falhas engolidas em silencio. receiveWebhook (comando 'init') e o handler de qrcode.updated estavam em try/catch que so logava no servidor, sem nenhum feedback ao operador no Chatwoot. Havia tambem um bug de optional chaining (body?.qrcode.base64) que podia lancar TypeError silencioso se body.qrcode viesse undefined. 2) Instancia aparecia "conectada" na Evolution mesmo com o WhatsApp real caido. Causa: o status de conexao e 100% orientado a evento (connection.update); se esse evento nunca dispara (ex. socket morrendo sem RST/FIN, comum sob CPU steal alto), o valor cacheado em memoria/banco fica preso em 'open' para sempre. Nao havia nenhuma sonda ativa (confirmado: zero ocorrencias de setInterval em todo o src/). Mudancas: - receiveWebhook: erro ao conectar agora notifica a conversa (cw.inbox.qrError); catch geral tambem notifica erro generico (cw.inbox.requestError) alem de logar. - Corrigido o optional chaining (body?.qrcode?.base64) com guarda explicita e notificacao de erro. - Handler de qrcode.updated: catch notifica cw.inbox.qrError, mas so quando o QR ainda nao tinha sido postado com sucesso (flag qrPosted) - evita notificar erro depois que a imagem do QR ja chegou na conversa. - monitor.service.ts: health check periodico (30s) que confirma via client.ws.isOpen se instancias marcadas 'open' realmente tem socket ativo; se nao, reconcilia o estado para 'close' (banco + webhook CONNECTION_UPDATE), reaproveitando os mesmos campos ja usados no fechamento real da conexao. - instance.controller.ts: connectionState reconcilia sob demanda antes de responder, alem do health check periodico. - Novas chaves de traducao cw.inbox.qrError/cw.inbox.requestError em pt-BR/en/es.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problemas
Causa raiz
Falhas silenciosas (Chatwoot):
receiveWebhook(comandoinit) e o handler deqrcode.updated, emchatwoot.service.ts, tem try/catch que so loga no servidor, sem nenhum feedback visivel ao operador do Chatwoot.body?.qrcode.base64protegebodymas naobody.qrcode- seqrcodevierundefined, lancaTypeErrorcapturado silenciosamente pelo catch.Estado zumbi:
connection.update). Se esse evento nunca dispara (ex. socket morrendo sem RST/FIN, cenario plausivel sob carga de rede/CPU instavel), o valor cacheado em memoria/banco fica preso em'open'indefinidamente.setIntervalem todosrc/antes deste PR - nenhuma sonda ativa existia para reconciliar esse estado.Mudancas
receiveWebhook: erro ao conectar agora notifica a conversa (cw.inbox.qrError); catch geral tambem notifica erro generico (cw.inbox.requestError) alem de logar.body?.qrcode?.base64) com guarda explicita e notificacao de erro.qrcode.updated: catch notificacw.inbox.qrError, mas so quando o QR ainda nao tinha sido postado com sucesso (flagqrPosted) - evita notificar erro logo depois que a imagem do QR ja chegou na conversa (ex. se so a mensagem de texto que acompanha o QR falhar).monitor.service.ts: health check periodico (30s) que confirma viaclient.ws.isOpen(propriedade real doAbstractSocketClientdo Baileys) se instancias marcadas'open'realmente tem socket ativo; se nao, reconcilia o estado para'close'(banco + webhookCONNECTION_UPDATE), reaproveitando os mesmos campos ja usados no fechamento real da conexao.instance.controller.ts:connectionStatereconcilia sob demanda antes de responder, alem do health check periodico.cw.inbox.qrError/cw.inbox.requestErrorem pt-BR/en/es.Deliberadamente nao foi adicionado um listener extra de
close/errorno WebSocket do Baileys: o proprio Baileys ja trata isso internamente e emiteconnection.update; um segundo listener nosso criaria risco de reconexao/processamento duplicado.Validacao
npx tsc --noEmit: sem erros.npx eslint --ext .ts src: sem erros/warnings.