Skip to content

Commit afb76b7

Browse files
committed
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
1 parent f5c8a3d commit afb76b7

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ export class BaileysStartupService extends ChannelStartupService {
640640
}
641641

642642
// Fetch latest WhatsApp Web version automatically
643-
const baileysVersion = await fetchLatestWaWebVersion({});
643+
const baileysVersion = await fetchLatestWaWebVersion({}, this.cache);
644644
const version = baileysVersion.version;
645645

646646
const log = `Baileys version: ${version.join('.')}`;

src/utils/fetchLatestWaWebVersion.ts

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
import axios, { AxiosRequestConfig } from 'axios';
22
import { fetchLatestBaileysVersion, WAVersion } from 'baileys';
33

4+
import { CacheService } from '../api/services/cache.service';
5+
import { CacheEngine } from '../cache/cacheengine';
46
import { Baileys, configService } from '../config/env.config';
57

6-
export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) => {
8+
// Cache keys
9+
const CACHE_KEY_WHATSAPP_WEB_VERSION = 'whatsapp_web_version';
10+
const CACHE_KEY_BAILEYS_FALLBACK_VERSION = 'baileys_fallback_version';
11+
12+
// Cache TTL (1 hour in seconds)
13+
const CACHE_TTL_SECONDS = 3600;
14+
15+
const MODULE_NAME = 'whatsapp-version';
16+
17+
export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>, cache?: CacheService) => {
718
// Check if manual version is set via configuration
819
const baileysConfig = configService.get<Baileys>('BAILEYS');
920
const manualVersion = baileysConfig?.VERSION;
@@ -19,6 +30,22 @@ export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) =
1930
}
2031
}
2132

33+
let versionCache = cache || null;
34+
35+
if (!versionCache) {
36+
// Cache estático para versões do WhatsApp Web e fallback do Baileys (fallback se não for passado via parâmetro)
37+
const cacheEngine = new CacheEngine(configService, MODULE_NAME);
38+
const engine = cacheEngine.getEngine();
39+
const defaultVersionCache = new CacheService(engine);
40+
versionCache = defaultVersionCache;
41+
}
42+
43+
// Check cache for WhatsApp Web version
44+
const cachedWaVersion = await versionCache.get(CACHE_KEY_WHATSAPP_WEB_VERSION);
45+
if (cachedWaVersion) {
46+
return cachedWaVersion;
47+
}
48+
2249
try {
2350
const { data } = await axios.get('https://web.whatsapp.com/sw.js', {
2451
...options,
@@ -29,26 +56,51 @@ export const fetchLatestWaWebVersion = async (options: AxiosRequestConfig<{}>) =
2956
const match = data.match(regex);
3057

3158
if (!match?.[1]) {
32-
return {
59+
// Check cache for Baileys fallback version
60+
const cachedFallback = await versionCache.get(CACHE_KEY_BAILEYS_FALLBACK_VERSION);
61+
if (cachedFallback) {
62+
return cachedFallback;
63+
}
64+
65+
// Fetch and cache Baileys fallback version
66+
const fallbackVersion = {
3367
version: (await fetchLatestBaileysVersion()).version as WAVersion,
3468
isLatest: false,
3569
error: {
3670
message: 'Could not find client revision in the fetched content',
3771
},
3872
};
73+
74+
await versionCache.set(CACHE_KEY_BAILEYS_FALLBACK_VERSION, fallbackVersion, CACHE_TTL_SECONDS);
75+
return fallbackVersion;
3976
}
4077

4178
const clientRevision = match[1];
4279

43-
return {
80+
const result = {
4481
version: [2, 3000, +clientRevision] as WAVersion,
4582
isLatest: true,
4683
};
84+
85+
// Cache the successful result
86+
await versionCache.set(CACHE_KEY_WHATSAPP_WEB_VERSION, result, CACHE_TTL_SECONDS);
87+
88+
return result;
4789
} catch (error) {
48-
return {
90+
// Check cache for Baileys fallback version
91+
const cachedFallback = await versionCache.get(CACHE_KEY_BAILEYS_FALLBACK_VERSION);
92+
if (cachedFallback) {
93+
return cachedFallback;
94+
}
95+
96+
// Fetch and cache Baileys fallback version
97+
const fallbackVersion = {
4998
version: (await fetchLatestBaileysVersion()).version as WAVersion,
5099
isLatest: false,
51100
error,
52101
};
102+
103+
await versionCache.set(CACHE_KEY_BAILEYS_FALLBACK_VERSION, fallbackVersion, CACHE_TTL_SECONDS);
104+
return fallbackVersion;
53105
}
54106
};

0 commit comments

Comments
 (0)