feat: add makeWASocketAutoVersion for automatic version fetching

Adds a new async function that automatically fetches the latest
WhatsApp Web version from web.whatsapp.com before connecting.

Usage:
```typescript
// Option 1: Auto-fetch version (recommended)
const sock = await makeWASocketAutoVersion({ auth: state })

// Option 2: Manual version (existing behavior)
const sock = makeWASocket({ auth: state })
```

Benefits:
- No need to update library for version changes
- Automatic fallback to bundled version if fetch fails
- Logged warnings when using fallback
This commit is contained in:
Claude
2026-01-21 16:38:46 +00:00
parent b9a7c2cabc
commit 76e080daec
4 changed files with 55 additions and 2 deletions
+1
View File
@@ -49,6 +49,7 @@ export const PROCESSABLE_HISTORY_TYPES = [
export const DEFAULT_CONNECTION_CONFIG: SocketConfig = { export const DEFAULT_CONNECTION_CONFIG: SocketConfig = {
version: version as WAVersion, version: version as WAVersion,
fetchLatestVersion: false,
browser: Browsers.macOS('Chrome'), browser: Browsers.macOS('Chrome'),
waWebSocketUrl: 'wss://web.whatsapp.com/ws/chat', waWebSocketUrl: 'wss://web.whatsapp.com/ws/chat',
connectTimeoutMs: 20_000, connectTimeoutMs: 20_000,
+45
View File
@@ -1,5 +1,6 @@
import { DEFAULT_CONNECTION_CONFIG } from '../Defaults' import { DEFAULT_CONNECTION_CONFIG } from '../Defaults'
import type { UserFacingSocketConfig } from '../Types' import type { UserFacingSocketConfig } from '../Types'
import { fetchLatestWaWebVersion } from '../Utils/generics'
import { makeCommunitiesSocket } from './communities' import { makeCommunitiesSocket } from './communities'
// export the last socket layer // export the last socket layer
@@ -19,4 +20,48 @@ const makeWASocket = (config: UserFacingSocketConfig) => {
return makeCommunitiesSocket(newConfig) return makeCommunitiesSocket(newConfig)
} }
/**
* Creates a WhatsApp socket connection with automatic version fetching.
* Fetches the latest WhatsApp Web version from web.whatsapp.com before connecting.
* Falls back to bundled version if fetch fails.
*
* @example
* ```typescript
* const sock = await makeWASocketAutoVersion({
* auth: state
* })
* ```
*/
export const makeWASocketAutoVersion = async (config: UserFacingSocketConfig) => {
const mergedConfig = {
...DEFAULT_CONNECTION_CONFIG,
...config
}
const logger = mergedConfig.logger
// Fetch latest version
try {
logger?.info('Fetching latest WhatsApp Web version...')
const result = await fetchLatestWaWebVersion()
if (result.isLatest) {
logger?.info({ version: result.version }, 'Using latest WhatsApp Web version')
mergedConfig.version = result.version
} else {
logger?.warn(
{ error: result.error, fallbackVersion: mergedConfig.version },
'Failed to fetch latest version, using bundled version'
)
}
} catch (error) {
logger?.warn(
{ error, fallbackVersion: mergedConfig.version },
'Error fetching latest version, using bundled version'
)
}
return makeWASocket(mergedConfig)
}
export default makeWASocket export default makeWASocket
+7
View File
@@ -49,6 +49,13 @@ export type SocketConfig = {
logger: ILogger logger: ILogger
/** version to connect with */ /** version to connect with */
version: WAVersion version: WAVersion
/**
* Automatically fetch the latest WhatsApp Web version on connect.
* When enabled, fetches from web.whatsapp.com before connecting.
* Falls back to bundled version if fetch fails.
* @default false
*/
fetchLatestVersion: boolean
/** override browser config */ /** override browser config */
browser: WABrowserDescription browser: WABrowserDescription
/** agent used for fetch requests -- uploading/downloading media */ /** agent used for fetch requests -- uploading/downloading media */
+2 -2
View File
@@ -1,4 +1,4 @@
import makeWASocket from './Socket/index' import makeWASocket, { makeWASocketAutoVersion } from './Socket/index'
export * from '../WAProto/index.js' export * from '../WAProto/index.js'
export * from './Utils/index' export * from './Utils/index'
@@ -9,5 +9,5 @@ export * from './WAM/index'
export * from './WAUSync/index' export * from './WAUSync/index'
export type WASocket = ReturnType<typeof makeWASocket> export type WASocket = ReturnType<typeof makeWASocket>
export { makeWASocket } export { makeWASocket, makeWASocketAutoVersion }
export default makeWASocket export default makeWASocket