From 93d612be37f60e273abd781e07d5b0e2fc56990e Mon Sep 17 00:00:00 2001 From: lucaslokchan <74852140+lucaslokchan@users.noreply.github.com> Date: Wed, 29 Jul 2026 12:14:35 +1000 Subject: [PATCH 1/2] fix(whatsapp-bridge): implement dynamic WhatsApp version resolution - Added a new function `resolveWaVersion` to fetch the latest WhatsApp Web version and fallback to the latest Baileys version if necessary. - Updated the `startSocket` function to utilize the new version resolution logic, ensuring compatibility with the latest WhatsApp features. --- scripts/whatsapp-bridge/bridge.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/whatsapp-bridge/bridge.js b/scripts/whatsapp-bridge/bridge.js index fbacb6b43f8a9..e7b8b1a7607c4 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'; @@ -393,9 +393,17 @@ function emitPairEvent(event) { } catch {} } +async function resolveWaVersion() { + const waWeb = await fetchLatestWaWebVersion(); + if (waWeb.isLatest && !waWeb.error) { + return waWeb.version; + } + return (await fetchLatestBaileysVersion()).version; +} + async function startSocket() { const { state, saveCreds } = await useMultiFileAuthState(SESSION_DIR); - const { version } = await fetchLatestBaileysVersion(); + const version = await resolveWaVersion(); sock = makeWASocket({ version, From d993dbe412841f49e36942604729cb2e6cf6e52b Mon Sep 17 00:00:00 2001 From: lucaslokchan <74852140+lucaslokchan@users.noreply.github.com> Date: Fri, 31 Jul 2026 10:53:46 +1000 Subject: [PATCH 2/2] refactor(whatsapp-bridge): enhance version resolution logic - Moved the `resolveWaVersion` function to `bridge_helpers.js` for better modularity. - Updated `startSocket` to utilize the new `resolveWaVersion` function, passing the appropriate fetch functions. - Added tests for `resolveWaVersion` to ensure correct behavior for live version retrieval and fallback scenarios. --- scripts/whatsapp-bridge/bridge.js | 14 +++----- .../whatsapp-bridge/bridge.native.test.mjs | 32 +++++++++++++++++++ scripts/whatsapp-bridge/bridge_helpers.js | 8 +++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/scripts/whatsapp-bridge/bridge.js b/scripts/whatsapp-bridge/bridge.js index e7b8b1a7607c4..2db06322f2911 100644 --- a/scripts/whatsapp-bridge/bridge.js +++ b/scripts/whatsapp-bridge/bridge.js @@ -44,6 +44,7 @@ import { mediaPayloadForFile, pollCreationMessageFromPayload, pollUpdateForAggregation, + resolveWaVersion, } from './bridge_helpers.js'; // Parse CLI args @@ -393,17 +394,12 @@ function emitPairEvent(event) { } catch {} } -async function resolveWaVersion() { - const waWeb = await fetchLatestWaWebVersion(); - if (waWeb.isLatest && !waWeb.error) { - return waWeb.version; - } - return (await fetchLatestBaileysVersion()).version; -} - async function startSocket() { const { state, saveCreds } = await useMultiFileAuthState(SESSION_DIR); - const version = await resolveWaVersion(); + 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);