Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b0d1531455 | |||
| 81215cec15 | |||
| 4cadcd1c57 | |||
| 937b26edcd | |||
| acad0c06dc | |||
| 98995aae89 | |||
| 7a7d92e3f8 | |||
| 1fbaa284f9 | |||
| 9c7dd0460c | |||
| 579277cb29 | |||
| bb0cb90260 | |||
| 56955e12f5 | |||
| b7d9f2b866 | |||
| daaf0bc813 | |||
| bf95867089 | |||
| 9fac156474 |
@@ -1,7 +1,7 @@
|
||||
syntax = "proto3";
|
||||
package proto;
|
||||
|
||||
/// WhatsApp Version: 2.3000.1037162330
|
||||
/// WhatsApp Version: 2.3000.1037753511
|
||||
|
||||
message ADVDeviceIdentity {
|
||||
optional uint32 rawId = 1;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":[2,3000,1037186195]}
|
||||
{"version":[2,3000,1037786138]}
|
||||
|
||||
+19
-2
@@ -31,9 +31,26 @@ export const STATUS_EXPIRY_SECONDS = 24 * 60 * 60
|
||||
export const PLACEHOLDER_MAX_AGE_SECONDS = 7 * 24 * 60 * 60
|
||||
|
||||
export const NOISE_MODE = 'Noise_XX_25519_AESGCM_SHA256\0\0\0\0'
|
||||
export const DICT_VERSION = 3
|
||||
|
||||
/**
|
||||
* Protocol mode: 'web' (default) or 'native' (experimental)
|
||||
* - web: WA\x06\x03 — standard WhatsApp Web protocol
|
||||
* - native: WAM\x05 — native Android protocol (may enable view-once media on companions)
|
||||
*
|
||||
* Set via BAILEYS_PROTOCOL env var:
|
||||
* BAILEYS_PROTOCOL=native
|
||||
*/
|
||||
const PROTOCOL_MODE = process.env.BAILEYS_PROTOCOL?.trim().toLowerCase() === 'native' ? 'native' : 'web'
|
||||
|
||||
export const DICT_VERSION = PROTOCOL_MODE === 'native' ? 5 : 3
|
||||
export const KEY_BUNDLE_TYPE = Buffer.from([5])
|
||||
export const NOISE_WA_HEADER = Buffer.from([87, 65, 6, DICT_VERSION]) // last is "DICT_VERSION"
|
||||
|
||||
// WA\x06\x03 = web protocol, WAM\x05 = native Android protocol
|
||||
export const NOISE_WA_HEADER = PROTOCOL_MODE === 'native'
|
||||
? Buffer.from([87, 65, 77, DICT_VERSION]) // WAM\x05
|
||||
: Buffer.from([87, 65, 6, DICT_VERSION]) // WA\x06\x03
|
||||
|
||||
export { PROTOCOL_MODE }
|
||||
/** from: https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url */
|
||||
export const URL_REGEX = /https:\/\/(?![^:@\/\s]+:[^:@\/\s]+@)[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(:\d+)?(\/[^\s]*)?/g
|
||||
|
||||
|
||||
@@ -2241,13 +2241,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
||||
}
|
||||
|
||||
const handleMessage = async (node: BinaryNode) => {
|
||||
const _encNode = getBinaryNodeChild(node, 'enc')
|
||||
const _unavNode = getBinaryNodeChild(node, 'unavailable')
|
||||
// VO_RAW: log BEFORE any filtering — captures every stanza that enters handleMessage
|
||||
console.log(`[VO_RAW] id=${node.attrs.id} from=${node.attrs.from} type=${node.attrs.type} enc=${_encNode ? _encNode.attrs?.type : 'NO'} unavailable=${_unavNode ? _unavNode.attrs?.type : 'NO'} children=${Array.isArray(node.content) ? (node.content as BinaryNode[]).map(c => c.tag).join(',') : 'none'}`)
|
||||
|
||||
if (shouldIgnoreJid(node.attrs.from!) && node.attrs.from !== S_WHATSAPP_NET) {
|
||||
console.log(`[VO_RAW] IGNORED by shouldIgnoreJid: ${node.attrs.from}`)
|
||||
logger.trace({ from: node.attrs.from }, 'ignored message')
|
||||
await sendMessageAck(node)
|
||||
return
|
||||
@@ -2256,17 +2250,6 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
||||
const encNode = getBinaryNodeChild(node, 'enc')
|
||||
const unavailableNode = getBinaryNodeChild(node, 'unavailable')
|
||||
|
||||
// DEBUG: log every incoming message stanza to trace view-once delivery
|
||||
logger.info({
|
||||
id: node.attrs.id,
|
||||
from: node.attrs.from,
|
||||
type: node.attrs.type,
|
||||
hasEnc: !!encNode,
|
||||
encType: encNode?.attrs?.type,
|
||||
hasUnavailable: !!unavailableNode,
|
||||
unavailableType: unavailableNode?.attrs?.type,
|
||||
}, 'VO_TRACE: incoming message stanza')
|
||||
|
||||
// msmsg block removed — allow msmsg decryption (required for view-once on linked devices)
|
||||
if (unavailableNode?.attrs?.type === 'view_once') {
|
||||
const { fullMessage: voMsg } = decryptMessageNode(
|
||||
|
||||
@@ -3,6 +3,7 @@ import { createHash } from 'crypto'
|
||||
import { proto } from '../../WAProto/index.js'
|
||||
import {
|
||||
KEY_BUNDLE_TYPE,
|
||||
PROTOCOL_MODE,
|
||||
WA_ADV_ACCOUNT_SIG_PREFIX,
|
||||
WA_ADV_DEVICE_SIG_PREFIX,
|
||||
WA_ADV_HOSTED_ACCOUNT_SIG_PREFIX
|
||||
@@ -58,7 +59,10 @@ const getClientPayload = (config: SocketConfig) => {
|
||||
userAgent: getUserAgent(config)
|
||||
}
|
||||
|
||||
payload.webInfo = getWebInfo(config)
|
||||
// Native protocol (WAM\x05) does not use WebInfo — only web protocol does
|
||||
if (PROTOCOL_MODE !== 'native') {
|
||||
payload.webInfo = getWebInfo(config)
|
||||
}
|
||||
|
||||
return payload
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user