diff --git a/scripts/whatsapp-bridge/bridge.js b/scripts/whatsapp-bridge/bridge.js index fbacb6b43f8a9..2db06322f2911 100644 --- a/scripts/whatsapp-bridge/bridge.js +++ b/scripts/whatsapp-bridge/bridge.js @@ -19,7 +19,7 @@ * node bridge.js --port 3000 --session ~/.hermes/whatsapp/session */ -import { makeWASocket, useMultiFileAuthState, DisconnectReason, fetchLatestBaileysVersion, downloadMediaMessage, getAggregateVotesInPollMessage, decryptPollVote, getKeyAuthor, jidNormalizedUser } from '@whiskeysockets/baileys'; +import { makeWASocket, useMultiFileAuthState, DisconnectReason, fetchLatestBaileysVersion, fetchLatestWaWebVersion, downloadMediaMessage, getAggregateVotesInPollMessage, decryptPollVote, getKeyAuthor, jidNormalizedUser } from '@whiskeysockets/baileys'; import express from 'express'; import { Boom } from '@hapi/boom'; import pino from 'pino'; @@ -44,6 +44,7 @@ import { mediaPayloadForFile, pollCreationMessageFromPayload, pollUpdateForAggregation, + resolveWaVersion, } from './bridge_helpers.js'; // Parse CLI args @@ -395,7 +396,10 @@ function emitPairEvent(event) { async function startSocket() { const { state, saveCreds } = await useMultiFileAuthState(SESSION_DIR); - const { version } = await fetchLatestBaileysVersion(); + const version = await resolveWaVersion({ + fetchLiveVersion: fetchLatestWaWebVersion, + fetchBaileysVersion: fetchLatestBaileysVersion, + }); sock = makeWASocket({ version, diff --git a/scripts/whatsapp-bridge/bridge.native.test.mjs b/scripts/whatsapp-bridge/bridge.native.test.mjs index b4e123a265efd..9e0860499cda0 100644 --- a/scripts/whatsapp-bridge/bridge.native.test.mjs +++ b/scripts/whatsapp-bridge/bridge.native.test.mjs @@ -22,6 +22,7 @@ import { mediaPayloadForFile, pollCreationMessageFromPayload, pollUpdateForAggregation, + resolveWaVersion, } from './bridge_helpers.js'; // -- inbound read receipts ------------------------------------------------ @@ -411,4 +412,35 @@ import { console.log(' ✓ captioned failed download keeps caption and appends note'); } +// -- resolveWaVersion (live-success and Baileys-fallback) ------------------ +{ + const liveVersion = [2, 3000, 1015901307]; + const version = await resolveWaVersion({ + fetchLiveVersion: async () => ({ version: liveVersion, isLatest: true, error: null }), + fetchBaileysVersion: async () => { throw new Error('should not be called'); }, + }); + assert.deepEqual(version, liveVersion); + console.log(' ✓ resolveWaVersion returns live WhatsApp Web version when isLatest'); +} + +{ + const baileysVersion = [2, 2413, 1]; + const version = await resolveWaVersion({ + fetchLiveVersion: async () => ({ version: [2, 0, 0], isLatest: false, error: null }), + fetchBaileysVersion: async () => ({ version: baileysVersion }), + }); + assert.deepEqual(version, baileysVersion); + console.log(' ✓ resolveWaVersion falls back to Baileys version when isLatest is false'); +} + +{ + const baileysVersion = [2, 2413, 2]; + const version = await resolveWaVersion({ + fetchLiveVersion: async () => ({ version: null, isLatest: true, error: 'network timeout' }), + fetchBaileysVersion: async () => ({ version: baileysVersion }), + }); + assert.deepEqual(version, baileysVersion); + console.log(' ✓ resolveWaVersion falls back to Baileys version when live fetch has error'); +} + console.log('\n✅ All WhatsApp native bridge helper tests passed.'); diff --git a/scripts/whatsapp-bridge/bridge_helpers.js b/scripts/whatsapp-bridge/bridge_helpers.js index c0618cd2bd6e8..bceda4a14f8f2 100644 --- a/scripts/whatsapp-bridge/bridge_helpers.js +++ b/scripts/whatsapp-bridge/bridge_helpers.js @@ -532,6 +532,14 @@ export function mediaPayloadForFile({ buffer, filePath, mediaType, caption, file } } +export async function resolveWaVersion({ fetchLiveVersion, fetchBaileysVersion }) { + const waWeb = await fetchLiveVersion(); + if (waWeb.isLatest && !waWeb.error) { + return waWeb.version; + } + return (await fetchBaileysVersion()).version; +} + export function buildPollPayload({ question, options, selectableCount = 1 }) { const cleanQuestion = String(question || '').trim(); const cleanOptions = (options || []).map(option => String(option || '').trim()).filter(Boolean);