From c392d4ce6cd461a480d38fb7332aa40b94718fce Mon Sep 17 00:00:00 2001 From: vini Date: Thu, 8 Jan 2026 16:56:50 -0300 Subject: [PATCH] feat: add support for FB and Interop JID encoding/decoding and empty strings (#2189) --- src/WABinary/decode.ts | 27 +++++++++++++++++++++++++++ src/WABinary/encode.ts | 7 ++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/WABinary/decode.ts b/src/WABinary/decode.ts index e8a745c0..b0183d85 100644 --- a/src/WABinary/decode.ts +++ b/src/WABinary/decode.ts @@ -167,6 +167,29 @@ export const decodeDecompressedBinaryNode = ( return jidEncode(user, server, device) } + const readFbJid = () => { + const user = readString(readByte()!) + const device = readInt(2) + const server = readString(readByte()!) + return `${user}:${device}@${server}` + } + + const readInteropJid = () => { + const user = readString(readByte()!) + const device = readInt(2) + const integrator = readInt(2) + + let server = 'interop' + const beforeServer = indexRef.index + try { + server = readString(readByte()!) + } catch (err) { + indexRef.index = beforeServer + } + + return `${integrator}-${user}:${device}@${server}` + } + const readString = (tag: number): string => { if (tag >= 1 && tag < SINGLE_BYTE_TOKENS.length) { return SINGLE_BYTE_TOKENS[tag] || '' @@ -188,6 +211,10 @@ export const decodeDecompressedBinaryNode = ( return readStringFromChars(readInt(4)) case TAGS.JID_PAIR: return readJidPair() + case TAGS.FB_JID: + return readFbJid() + case TAGS.INTEROP_JID: + return readInteropJid() case TAGS.AD_JID: return readAdJid() case TAGS.HEX_8: diff --git a/src/WABinary/encode.ts b/src/WABinary/encode.ts index f8f31ab4..c883e6ed 100644 --- a/src/WABinary/encode.ts +++ b/src/WABinary/encode.ts @@ -182,6 +182,11 @@ const encodeBinaryNodeInner = ( return } + if (str === '') { + writeStringRaw(str) + return + } + const tokenIndex = TOKEN_MAP[str] if (tokenIndex) { if (typeof tokenIndex.dict === 'number') { @@ -193,7 +198,7 @@ const encodeBinaryNodeInner = ( writePackedBytes(str, 'nibble') } else if (isHex(str)) { writePackedBytes(str, 'hex') - } else if (str) { + } else { const decodedJid = jidDecode(str) if (decodedJid) { writeJid(decodedJid)