diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 4db8146cc..32d66fcb6 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -640,12 +640,17 @@ 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('.')}`; this.logger.info(log); + const error = baileysVersion?.error ?? null; + if (error) { + this.logger.error(`Fetch latest WaWeb version error: ${JSON.stringify({ error })}`); + } + this.logger.info(`Group Ignore: ${this.localSettings.groupsIgnore}`); let options; 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; } };