Skip to content

[BUG] stream:error code='515' Causing Connection Termination During Pairing #1218

Description

@felipeduarte26

Description:

I'm encountering an issue where the WhatsApp connection consistently terminates with a stream:error code='515' after successfully pairing. This prevents my application from maintaining a stable connection with WhatsApp.

Steps to Reproduce:

Setup:

Integrated Baileys into a Fastify-based API.
Configured authentication using useMultiFileAuthState.
Attempted to pair by scanning the QR code displayed in the terminal.
Execution:

Ran the server.
Scanned the QR code with the WhatsApp application on my mobile device.
Observed the connection process in the logs.

Outcome:

{"level":30,"time":1737841923938,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"Using WA Web v2,3000,1017531287, isLatest: true"}
{"level":30,"time":1737841923945,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"connection update: connecting"}
{"level":30,"time":1737841924314,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","browser":["Ubuntu","Chrome","22.04.4"],"helloMsg":{"clientHello":{"ephemeral":"BAx0S6Zph+QX8EIJXuukIIXz95EH973Whax2U0rtA0Q="}},"msg":"connected to WA"}
{"level":10,"time":1737841924543,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv 350 bytes, total recv 350 bytes"}
{"level":10,"time":1737841924543,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv frame"}
{"level":10,"time":1737841924545,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","handshake":{"serverHello":{"ephemeral":"FHFDpOazFJmXenIelMLyjPxm4C+ZNk02/06P9hKplHc=","static":"1dEqZnwcY76pcg9LmFE17Ef2RCyZPJyZ0WmXuLXPI9hHB8L/mKwYBcqEf69P/LcU","payload":"3mTAIk17SKGjPg3WgZdbZEmbaxqSeIcsul0FMBBNUmw1UBfM41RXBs9Z7wdsrdWE8IF2eAga5isB7NUm5Ylt2zV7NO9v+bkLP1yQO5Ro+jM2y255cqa9gh42iRETWTzB2XID2+ZQvMNO7jj6s9SWrSfqj9FpnpHI21iIppK+DE1I3Z/O/qMfXuSh4/w0VxynsWS8HAXTwMu6TOiBQ77BbK9jwdG9khiK2Ys/Jjlp/a3fTgccWzmxnJkeDMkeD1X9c0fkF95jT2WrgxLZs1D3Pj64MJSiCfv1IfpNAwZNDeuA//JAI9Fbwp/JjtRxRHeL2DEKbaDuMOUdSMkZXqtMpGI="}},"msg":"handshake recv from WA"}
{"level":30,"time":1737841924560,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","node":{"passive":false,"userAgent":{"platform":"WEB","appVersion":{"primary":2,"secondary":3000,"tertiary":1017531287},"osVersion":"0.1","device":"Desktop","osBuildNumber":"0.1","releaseChannel":"RELEASE","localeLanguageIso6391":"en","localeCountryIso31661Alpha2":"US"},"webInfo":{"webSubPlatform":"WEB_BROWSER"},"connectType":"WIFI_UNKNOWN","connectReason":"USER_ACTIVATED","devicePairingData":{"eRegid":"AAAAdQ==","eKeytype":"BQ==","eIdent":"FNwUwxIOJtbF2kOcKKiz7+92K3O0oVXGzTXk1VwhQm8=","eSkeyId":"AAAB","eSkeyVal":"W2H8uP8oXwkjdHlPfYNV69T4bVvkytk+vh8qJA5Jj04=","eSkeySig":"ijwHTjNhmY6mp6/ZanwMWG/GMqvtmU2A4wUisx0nuUr9Th5kJ5Rf0V5UJf2HEfyIS/wQQHwuKA3vvhsUCsmzAw==","buildHash":"xEauBiqjwsZJtQsy2Yl8zg==","deviceProps":"CgZVYnVudHUYASAA"}},"msg":"not logged in, attempting registration..."}
{"level":10,"time":1737841924911,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv 727 bytes, total recv 727 bytes"}
{"level":10,"time":1737841924914,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"1281315550","msg":"recv frame"}
{"level":10,"time":1737841924916,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"\n\t\t\n\t\t\t\t\n\t\t\t\t\t3240595730736d41366e626b6343624761527362507564384f68715850784554495a4558573379676f656e546a6761695a7456625934336968484e4a6447533046383435386a3946426d4a514868685752587676622f6b354a485438786b6b2f684a48746f3d\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t32404b4f4a334e325a354d4c38436366526749536e2f44513468424f5a4945474a696f76704e68694e506d62533566626c442b386569455649796f7871637a4632706933646132695a516e74642f4b4c6b357857584e33676c7a3172763132437a673971383d\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t32405156614c35436e6436346d6e78666a59732b77795743417a56706644644d4f6e7a454949623975574767423935706835735666466b484a4a522b574b74542f2f463446432b393631413367796747535a694e556b4d486838542b6d627241416861624d3d\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t32404f7731303047727231316e487349654f6a39576a77304b4f486c6f4d375a4c737945654837302b634772386d4c48536f78346f32427271724945356568446d487a6e53664d77787075332f5a45454476515a69336a33556f4133532f613830634231453d\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t324078324c774f70596e6b6c6c3433546f64585670614a71525869344a314c524b594e644246712b6464324653642f2f6c576f6f44422b4e47683830435a6e58646e4d4c2b3766546654626251614a536a62702b544b59356b4c2b4f7a785054672b58386f3d\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t324046487a75515752716b39454b633331764e2b4e4c5553676e7172486d686641554d614e584a6a4d6c47366c727273696c4c63565a5a70476f4937774d6370356f6b637733684f4e44626f43612b31553751584a4f326e53733461634c583335434364593d\n\t\t\t\t\n\t\t\n","msg":"recv xml"}
{"level":10,"time":1737841924916,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"","msg":"xml send"}
{"level":30,"time":1737841924919,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"connection update: undefined"}
{"level":10,"time":1737841954274,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv 281 bytes, total recv 281 bytes"}
{"level":10,"time":1737841954277,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"2124915782","msg":"recv frame"}
{"level":10,"time":1737841954277,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"\n\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t0a780a1208e48f85ad0610a0bad5bc06180120002800122098c84329b1f266c1eb1d82aca501ae0b093f49f43899da504bcba347b08144781a4094218ec265fb30054de06928e559808f60ee1c9bd0f406ebb16d56395b871ae4d9a0161df2596d79c94d44d075378b26191470274fdc61c709f19b1ace1f3a021220804156e8fba0540dbf08346a200c9d341eaad3bfba743dc973d6dd51c889ee911800\n\t\t\t\t\n\t\t\t\t\n\t\t\n","msg":"recv xml"}
{"level":20,"time":1737841954277,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"pair success recv"}
{"level":30,"time":1737841954302,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","me":{"id":"556798478067:60@s.whatsapp.net"},"platform":"android","msg":"pairing configured successfully, expect to restart the connection..."}
{"level":30,"time":1737841954303,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"connection update: undefined"}
{"level":10,"time":1737841954303,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"\n\t\t\n\t\t\t\t\n\t\t\t\t\t0a1208e48f85ad0610a0bad5bc061801200028001a4094218ec265fb30054de06928e559808f60ee1c9bd0f406ebb16d56395b871ae4d9a0161df2596d79c94d44d075378b26191470274fdc61c709f19b1ace1f3a022240c7e61c94ee0c4ee10217670d4ce4d11cb4334d86224d13155aa6990e3d4d1f37474e4c301ce55558be71f4ed130e0948b4d4166e521ed2e0b78e03338a341e04\n\t\t\t\t\n\t\t\n","msg":"xml send"}
{"level":10,"time":1737841954566,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"\n\t\t\n","msg":"xml send"}
{"level":10,"time":1737841954885,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv 52 bytes, total recv 52 bytes"}
{"level":10,"time":1737841954886,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv frame"}
{"level":10,"time":1737841954886,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"<stream:error code='515'/>","msg":"recv xml"}
{"level":50,"time":1737841954886,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","node":{"tag":"stream:error","attrs":{"code":"515"}},"msg":"stream errored out"}
{"level":30,"time":1737841954887,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","trace":"Error: Stream Errored (restart required)\n at WebSocketClient. (/Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Socket/socket.js:519:13)\n at WebSocketClient.emit (node:events:513:28)\n at /Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Socket/socket.js:236:35\n at Object.decodeFrame (/Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Utils/noise-handler.js:144:17)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)","msg":"connection errored"}
{"level":30,"time":1737841954888,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"connection update: close"}
{"level":40,"time":1737841954888,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","msg":"Conexão fechada. Tentando reconectar..."}
{"level":10,"time":1737841954888,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","class":"ns","msg":"recv frame"}
{"level":10,"time":1737841954888,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","xml":"","msg":"recv xml"}
{"level":10,"time":1737841954888,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","trace":"Error: Connection Terminated by Server\n at WebSocketClient. (/Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Socket/socket.js:456:40)\n at WebSocketClient.emit (node:events:513:28)\n at /Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Socket/socket.js:236:35\n at Object.decodeFrame (/Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Utils/noise-handler.js:144:17)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)","msg":"connection already closed"}
{"level":50,"time":1737842014575,"pid":46562,"hostname":"MacBook-Pro-de-Felipe.local","trace":"Error: Timed Out\n at /Users/felipeduarte/Projetos/SolidCode/wattsBoot/wattsBoot-api/node_modules/@whiskeysockets/baileys/lib/Utils/generics.js:170:32","msg":"error in sending keep alive"}



`import { FastifyPluginCallback } from "fastify";
import {
  makeWASocket,
  useMultiFileAuthState,
  fetchLatestBaileysVersion,
  makeCacheableSignalKeyStore,
  makeInMemoryStore,
  delay,
  isJidNewsletter,
  proto,
} from "@whiskeysockets/baileys";
import pino from "pino";
import NodeCache from "node-cache";

const baileysPlugin: FastifyPluginCallback = async (fastify, opts) => {
  const loggerBase = pino(
    { level: "trace" },
    pino.destination("./wa-logs.txt")
  );

  const logger = loggerBase;

  // Opcional: usar um store para armazenar contatos, chats e mensagens
  const useStore = true;
  const storeFile = "./baileys_store_multi.json";
  const store = useStore ? makeInMemoryStore({ logger }) : undefined;

  store?.readFromFile(storeFile);
  setInterval(() => {
    store?.writeToFile(storeFile);
  }, 10_000);

  // Node-cache para contadores de tentativa
  const msgRetryCounterCache = new NodeCache();

  // Autenticação em múltiplos arquivos (cada arquivo tem parte da credencial)
  const { state, saveCreds } = await useMultiFileAuthState("baileys_auth_info");

  // Verifica a versão mais recente compatível com WA Web
  const { version, isLatest } = await fetchLatestBaileysVersion();
  logger.info(`Using WA Web v${version}, isLatest: ${isLatest}`);

  // Cria a instância do Baileys
  const sock = makeWASocket({
    version,
    logger,
    printQRInTerminal: true,
    auth: {
      creds: state.creds,
      keys: makeCacheableSignalKeyStore(state.keys, logger),
    },
    msgRetryCounterCache,
    // Função que retorna a mensagem original do store, se precisar
    getMessage: async (key) => {
      if (store) {
        const msg = await store.loadMessage(key.remoteJid!, key.id!);
        return msg?.message || undefined;
      }
      return proto.Message.fromObject({});
    },
  });

  // Se estiver usando store, “amarra” os eventos do socket ao store
  store?.bind(sock.ev);

  // Exemplo de função para enviar msg com status "digitando..."
  const sendMessageWTyping = async (jid: string, text: string) => {
    await sock.presenceSubscribe(jid);
    await delay(500);
    await sock.sendPresenceUpdate("composing", jid);
    await delay(1500);
    await sock.sendPresenceUpdate("paused", jid);
    await sock.sendMessage(jid, { text });
  };

  // Processa eventos em batch
  sock.ev.process(async (events) => {
    // 1) Atualização de conexão
    if (events["connection.update"]) {
      const { connection, lastDisconnect } = events["connection.update"];
      logger.info(`connection update: ${connection}`);

      if (connection === "close") {
        const shouldReconnect =
          (lastDisconnect?.error as any)?.output?.statusCode !== 401;
        if (shouldReconnect) {
          logger.warn("Conexão fechada. Tentando reconectar...");
          // O Baileys já gerencia reconexões internamente
          // Não é necessário recriar o socket ou re-registrar o plugin
        } else {
          logger.error("Você foi deslogado do WhatsApp!");
        }
      }
    }

    // 2) Credenciais atualizadas -> salvar
    if (events["creds.update"]) {
      await saveCreds();
    }

    // 3) Novas mensagens chegando
    if (events["messages.upsert"]) {
      const upsert = events["messages.upsert"];
      if (upsert.type === "notify") {
        for (const msg of upsert.messages) {
          // Se a msg não é minha e não é de "newsletter" (canal de mensagens WA)
          if (!msg.key.fromMe && !isJidNewsletter(msg.key.remoteJid!)) {
            const sender = msg.key.remoteJid;
            const text =
              msg.message?.conversation ||
              msg.message?.extendedTextMessage?.text;

            logger.info(`Mensagem recebida de ${sender}: ${text}`);

            // Resposta automática de teste
            await sock.readMessages([msg.key]);
            await sendMessageWTyping(sender!, "Olá! Recebi sua mensagem.");
          }
        }
      }
    }
  });

  // Salva a instância do Baileys em fastify, para acesso nas rotas
  fastify.decorate("baileys", sock);
};

export default baileysPlugin;

declare module "fastify" {
  interface FastifyInstance {
    baileys: ReturnType<typeof makeWASocket>;
  }
}
`

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions