From 2e667769abe3cda3184dd56a53e9d86a5423c407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 31 Mar 2026 23:20:23 -0300 Subject: [PATCH 1/2] feat: add companion registration utilities and refactor QR data generation --- src/Socket/socket.ts | 7 ++-- src/Utils/companion-reg-client-utils.ts | 45 +++++++++++++++++++++++++ src/Utils/index.ts | 1 + 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/Utils/companion-reg-client-utils.ts diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index cd39f13a9a5..7bc025b678b 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -21,12 +21,14 @@ import { aesEncryptCTR, bindWaitForConnectionUpdate, bytesToCrockford, + buildPairingQRData, configureSuccessfulPairing, Curve, derivePairingCodeKey, generateLoginNode, generateMdTagPrefix, generateRegistrationNode, + getCompanionPlatformId, getCodeFromWSError, getErrorCodeFromStreamError, getNextPreKeysNode, @@ -36,7 +38,6 @@ import { signedKeyPair, xmppSignedPreKey } from '../Utils' -import { getPlatformId } from '../Utils/browser-utils' import { assertNodeErrorFree, type BinaryNode, @@ -790,7 +791,7 @@ export const makeSocket = (config: SocketConfig) => { { tag: 'companion_platform_id', attrs: {}, - content: getPlatformId(browser[1]) + content: getCompanionPlatformId(browser) }, { tag: 'companion_platform_display', @@ -883,7 +884,7 @@ export const makeSocket = (config: SocketConfig) => { } const ref = (refNode.content as Buffer).toString('utf-8') - const qr = [ref, noiseKeyB64, identityKeyB64, advB64].join(',') + const qr = buildPairingQRData(ref, noiseKeyB64, identityKeyB64, advB64, browser) ev.emit('connection.update', { qr }) diff --git a/src/Utils/companion-reg-client-utils.ts b/src/Utils/companion-reg-client-utils.ts new file mode 100644 index 00000000000..c1a69386472 --- /dev/null +++ b/src/Utils/companion-reg-client-utils.ts @@ -0,0 +1,45 @@ +import type { WABrowserDescription } from '../Types' + +export enum CompanionWebClientType { + UNKNOWN = 0, + CHROME = 1, + EDGE = 2, + FIREFOX = 3, + IE = 4, + OPERA = 5, + SAFARI = 6, + ELECTRON = 7, + UWP = 8, + OTHER_WEB_CLIENT = 9 +} + +const BROWSER_TO_COMPANION_WEB_CLIENT: Record = { + Chrome: CompanionWebClientType.CHROME, + Edge: CompanionWebClientType.EDGE, + Firefox: CompanionWebClientType.FIREFOX, + IE: CompanionWebClientType.IE, + Opera: CompanionWebClientType.OPERA, + Safari: CompanionWebClientType.SAFARI +} + +export const getCompanionWebClientType = ([os, browserName]: WABrowserDescription): CompanionWebClientType => { + if (browserName === 'Desktop') { + return os === 'Windows' ? CompanionWebClientType.UWP : CompanionWebClientType.ELECTRON + } + + return BROWSER_TO_COMPANION_WEB_CLIENT[browserName] || CompanionWebClientType.OTHER_WEB_CLIENT +} + +export const getCompanionPlatformId = (browser: WABrowserDescription): string => { + return getCompanionWebClientType(browser).toString() +} + +export const buildPairingQRData = ( + ref: string, + noiseKeyB64: string, + identityKeyB64: string, + advB64: string, + browser: WABrowserDescription +): string => { + return [ref, noiseKeyB64, identityKeyB64, advB64, getCompanionPlatformId(browser)].join(',') +} diff --git a/src/Utils/index.ts b/src/Utils/index.ts index fa89de912bd..06fcdd5c35c 100644 --- a/src/Utils/index.ts +++ b/src/Utils/index.ts @@ -16,5 +16,6 @@ export * from './event-buffer' export * from './process-message' export * from './message-retry-manager' export * from './browser-utils' +export * from './companion-reg-client-utils' export * from './identity-change-handler' export * from './stanza-ack' From 0727f22fc36fc05042c801a9db2c02a96b08463c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Wed, 1 Apr 2026 10:15:18 -0300 Subject: [PATCH 2/2] fix: lint issue --- src/Socket/socket.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index 7bc025b678b..d95cf5bab13 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -20,16 +20,16 @@ import { addTransactionCapability, aesEncryptCTR, bindWaitForConnectionUpdate, - bytesToCrockford, buildPairingQRData, + bytesToCrockford, configureSuccessfulPairing, Curve, derivePairingCodeKey, generateLoginNode, generateMdTagPrefix, generateRegistrationNode, - getCompanionPlatformId, getCodeFromWSError, + getCompanionPlatformId, getErrorCodeFromStreamError, getNextPreKeysNode, makeEventBuffer,