From f07166f945190be67e83cc58908b15fe7a2e8b6d Mon Sep 17 00:00:00 2001 From: Vitor Duggen Date: Wed, 14 Jan 2026 10:08:55 -0300 Subject: [PATCH 1/3] fix(baileys): improve error logging for fetching latest WaWeb version --- .../channel/whatsapp/whatsapp.baileys.service.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 4db8146cc..52dd0de79 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -646,6 +646,11 @@ export class BaileysStartupService extends ChannelStartupService { const log = `Baileys version: ${version.join('.')}`; this.logger.info(log); + const error = baileysVersion?.error ?? null; + if (error) { + this.logger.error(`Fetch latest WaWeb version error: ${error.message}`); + } + this.logger.info(`Group Ignore: ${this.localSettings.groupsIgnore}`); let options; From f5c8a3d791db17ac69252db7413ee6e99f3edf83 Mon Sep 17 00:00:00 2001 From: Vitor Duggen Date: Wed, 14 Jan 2026 10:18:51 -0300 Subject: [PATCH 2/3] fix(baileys): enhance error logging by serializing error object for fetching latest WaWeb version --- .../integrations/channel/whatsapp/whatsapp.baileys.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 52dd0de79..358f1aafc 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -648,7 +648,7 @@ export class BaileysStartupService extends ChannelStartupService { const error = baileysVersion?.error ?? null; if (error) { - this.logger.error(`Fetch latest WaWeb version error: ${error.message}`); + this.logger.error(`Fetch latest WaWeb version error: ${JSON.stringify({ error })}`); } this.logger.info(`Group Ignore: ${this.localSettings.groupsIgnore}`); From afb76b7b35043baeff3bcf4a3f517e1c8757279b Mon Sep 17 00:00:00 2001 From: Vitor Duggen Date: Wed, 14 Jan 2026 20:24:44 -0300 Subject: [PATCH 3/3] feat(baileys): implement caching for WhatsApp Web version fetching - Added caching mechanism to store and retrieve the latest WhatsApp Web version - Enhanced error handling to utilize cached fallback versions when fetching fails - Updated the fetchLatestWaWebVersion function to accept a cache service as an optional parameter --- .../whatsapp/whatsapp.baileys.service.ts | 2 +- src/utils/fetchLatestWaWebVersion.ts | 60 +++++++++++++++++-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 358f1aafc..32d66fcb6 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -640,7 +640,7 @@ export class BaileysStartupService extends ChannelStartupService { } // Fetch latest WhatsApp Web version automatically - const baileysVersion = await fetchLatestWaWebVersion({}); + const baileysVersion = await fetchLatestWaWebVersion({}, this.cache); const version = baileysVersion.version; const log = `Baileys version: ${version.join('.')}`; diff --git a/src/utils/fetchLatestWaWebVersion.ts b/src/utils/fetchLatestWaWebVersion.ts index f6b0aa6d6..f973f20f2 100644 --- a/src/utils/fetchLatestWaWebVersion.ts +++ b/src/utils/fetchLatestWaWebVersion.ts @@ -1,9 +1,20 @@ import axios, { AxiosRequestConfig } from 'axios'; import { fetchLatestBaileysVersion, WAVersion } from 'baileys'; +import { CacheService } from '../api/services/cache.service'; +import { CacheEngine } from '../cache/cacheengine'; import { Baileys, configService } from '../config/env.config'; -export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) => { +// Cache keys +const CACHE_KEY_WHATSAPP_WEB_VERSION = 'whatsapp_web_version'; +const CACHE_KEY_BAILEYS_FALLBACK_VERSION = 'baileys_fallback_version'; + +// Cache TTL (1 hour in seconds) +const CACHE_TTL_SECONDS = 3600; + +const MODULE_NAME = 'whatsapp-version'; + +export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>, cache?: CacheService) => { // Check if manual version is set via configuration const baileysConfig = configService.get('BAILEYS'); const manualVersion = baileysConfig?.VERSION; @@ -19,6 +30,22 @@ export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) = } } + let versionCache = cache || null; + + if (!versionCache) { + // Cache estático para versões do WhatsApp Web e fallback do Baileys (fallback se não for passado via parâmetro) + const cacheEngine = new CacheEngine(configService, MODULE_NAME); + const engine = cacheEngine.getEngine(); + const defaultVersionCache = new CacheService(engine); + versionCache = defaultVersionCache; + } + + // Check cache for WhatsApp Web version + const cachedWaVersion = await versionCache.get(CACHE_KEY_WHATSAPP_WEB_VERSION); + if (cachedWaVersion) { + return cachedWaVersion; + } + try { const { data } = await axios.get('https://web.whatsapp.com/sw.js', { ...options, @@ -29,26 +56,51 @@ export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) = const match = data.match(regex); if (!match?.[1]) { - return { + // Check cache for Baileys fallback version + const cachedFallback = await versionCache.get(CACHE_KEY_BAILEYS_FALLBACK_VERSION); + if (cachedFallback) { + return cachedFallback; + } + + // Fetch and cache Baileys fallback version + const fallbackVersion = { version: (await fetchLatestBaileysVersion()).version as WAVersion, isLatest: false, error: { message: 'Could not find client revision in the fetched content', }, }; + + await versionCache.set(CACHE_KEY_BAILEYS_FALLBACK_VERSION, fallbackVersion, CACHE_TTL_SECONDS); + return fallbackVersion; } const clientRevision = match[1]; - return { + const result = { version: [2, 3000, +clientRevision] as WAVersion, isLatest: true, }; + + // Cache the successful result + await versionCache.set(CACHE_KEY_WHATSAPP_WEB_VERSION, result, CACHE_TTL_SECONDS); + + return result; } catch (error) { - return { + // Check cache for Baileys fallback version + const cachedFallback = await versionCache.get(CACHE_KEY_BAILEYS_FALLBACK_VERSION); + if (cachedFallback) { + return cachedFallback; + } + + // Fetch and cache Baileys fallback version + const fallbackVersion = { version: (await fetchLatestBaileysVersion()).version as WAVersion, isLatest: false, error, }; + + await versionCache.set(CACHE_KEY_BAILEYS_FALLBACK_VERSION, fallbackVersion, CACHE_TTL_SECONDS); + return fallbackVersion; } };