feat(safety): kill switch de saída (DISABLE_OUTBOUND) p/ ambientes de teste

Quando DISABLE_OUTBOUND=true, envolve sock.sendMessage na criação da sessão e
bloqueia QUALQUER envio ao WhatsApp — backstop universal, pois todo envio
(rotas, IA/secretária, chatbot, scheduler, warmer, plugins) usa este sock.
Evita que automações disparem mensagens a contatos/grupos reais ao conectar uma
sessão real em dev. Em produção a flag fica ausente/false (envios normais).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-06-28 00:17:10 +02:00
parent 58583db63d
commit 9d2412df21
2 changed files with 24 additions and 0 deletions
@@ -44,3 +44,12 @@ BAILEYS_SESSIONS_PATH=./sessions
# Frontend (CORS)
# ─────────────────────────────────────────────
FRONTEND_URL=http://localhost:3000
# ─────────────────────────────────────────────
# Modo teste (kill switch de saída)
# ─────────────────────────────────────────────
# Quando "true", bloqueia QUALQUER envio de mensagem ao WhatsApp (sock.sendMessage)
# para TODAS as instâncias — rotas, IA/secretária, chatbot, scheduler, warmer e
# plugins. Use em ambientes de DESENVOLVIMENTO/teste para nunca disparar mensagens
# a contatos/grupos reais. Em produção, deixe ausente/false.
DISABLE_OUTBOUND=false
@@ -253,6 +253,21 @@ export class WhatsAppConnectionManager {
},
})
// ── Kill switch de saída (modo teste) ──────────────────────────────────────
// DISABLE_OUTBOUND=true impede QUALQUER envio ao WhatsApp nesta sessão.
// Como todo envio (rotas, IA/secretária, chatbot, scheduler, warmer, plugins)
// usa este sock, envolver sendMessage aqui é o backstop universal para os
// testes: nada é disparado para contatos/grupos reais.
if (process.env.DISABLE_OUTBOUND === 'true') {
sock.sendMessage = (async (jid: string) => {
logger.warn({ instanceId, jid },
'[OUTBOUND BLOQUEADO] DISABLE_OUTBOUND ativo — mensagem NÃO enviada (modo teste)')
return { key: { id: `BLOCKED_${Date.now()}`, remoteJid: jid, fromMe: true }, status: 1 } as any
}) as typeof sock.sendMessage
logger.warn({ instanceId },
'[OUTBOUND BLOQUEADO] Modo teste ativo — envios desativados nesta sessão')
}
this.sockets.set(instanceId, sock)
this.touchActivity(instanceId)