From ae99ec7a0e89fc03560efc7fe4dc1e48081627e6 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Fri, 13 Jun 2025 13:14:35 -0300 Subject: [PATCH] feat(whatsapp): implement fetchLatestWaWebVersion utility and update version fetching logic - Added a new utility function `fetchLatestWaWebVersion` to retrieve the latest WhatsApp Web version. - Updated the Baileys service and router to utilize the new function instead of the deprecated `fetchLatestBaileysVersion`, ensuring accurate version information is fetched for WhatsApp integration. - This change enhances the reliability of version management in the application. --- .../whatsapp/whatsapp.baileys.service.ts | 4 +- src/api/routes/index.router.ts | 4 +- src/utils/fetchLatestWaWebVersion.ts | 37 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/utils/fetchLatestWaWebVersion.ts diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 79cc9d7d..de31b503 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -80,6 +80,7 @@ import { Boom } from '@hapi/boom'; import { createId as cuid } from '@paralleldrive/cuid2'; import { Instance, Message } from '@prisma/client'; import { createJid } from '@utils/createJid'; +import { fetchLatestWaWebVersion } from '@utils/fetchLatestWaWebVersion'; import { makeProxyAgent } from '@utils/makeProxyAgent'; import { getOnWhatsappCache, saveOnWhatsappCache } from '@utils/onWhatsappCache'; import { status } from '@utils/renderStatus'; @@ -99,7 +100,6 @@ import makeWASocket, { delay, DisconnectReason, downloadMediaMessage, - fetchLatestBaileysVersion, generateWAMessageFromContent, getAggregateVotesInPollMessage, GetCatalogOptions, @@ -548,7 +548,7 @@ export class BaileysStartupService extends ChannelStartupService { version = session.VERSION.split('.'); log = `Baileys version env: ${version}`; } else { - const baileysVersion = await fetchLatestBaileysVersion(); + const baileysVersion = await fetchLatestWaWebVersion({}); version = baileysVersion.version; log = `Baileys version: ${version}`; } diff --git a/src/api/routes/index.router.ts b/src/api/routes/index.router.ts index 89e6d1d0..fd2372fa 100644 --- a/src/api/routes/index.router.ts +++ b/src/api/routes/index.router.ts @@ -6,7 +6,7 @@ import { ChatbotRouter } from '@api/integrations/chatbot/chatbot.router'; import { EventRouter } from '@api/integrations/event/event.router'; import { StorageRouter } from '@api/integrations/storage/storage.router'; import { configService } from '@config/env.config'; -import { fetchLatestBaileysVersion } from 'baileys'; +import { fetchLatestWaWebVersion } from '@utils/fetchLatestWaWebVersion'; import { Router } from 'express'; import fs from 'fs'; import mimeTypes from 'mime-types'; @@ -70,7 +70,7 @@ router manager: !serverConfig.DISABLE_MANAGER ? `${req.protocol}://${req.get('host')}/manager` : undefined, documentation: `https://doc.evolution-api.com`, whatsappWebVersion: - process.env.CONFIG_SESSION_PHONE_VERSION || (await fetchLatestBaileysVersion()).version.join('.'), + process.env.CONFIG_SESSION_PHONE_VERSION || (await fetchLatestWaWebVersion({})).version.join('.'), }); }) .post('/verify-creds', authGuard['apikey'], async (req, res) => { diff --git a/src/utils/fetchLatestWaWebVersion.ts b/src/utils/fetchLatestWaWebVersion.ts new file mode 100644 index 00000000..6dcfb797 --- /dev/null +++ b/src/utils/fetchLatestWaWebVersion.ts @@ -0,0 +1,37 @@ +import axios, { AxiosRequestConfig } from 'axios'; +import { fetchLatestBaileysVersion, WAVersion } from 'baileys'; + +export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) => { + try { + const { data } = await axios.get('https://web.whatsapp.com/sw.js', { + ...options, + responseType: 'json', + }); + + const regex = /\\?"client_revision\\?":\s*(\d+)/; + const match = data.match(regex); + + if (!match?.[1]) { + return { + version: (await fetchLatestBaileysVersion()).version as WAVersion, + isLatest: false, + error: { + message: 'Could not find client revision in the fetched content', + }, + }; + } + + const clientRevision = match[1]; + + return { + version: [2, 3000, +clientRevision] as WAVersion, + isLatest: true, + }; + } catch (error) { + return { + version: (await fetchLatestBaileysVersion()).version as WAVersion, + isLatest: false, + error, + }; + } +};