unify web + mobile and use tcp socket

This commit is contained in:
SamuelScheit
2023-04-30 12:30:08 +02:00
parent 4a2db5a033
commit 65aa4a7d99
6 changed files with 12 additions and 58 deletions

View File

@@ -564,7 +564,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
if(msg.messageStubType === proto.WebMessageInfo.StubType.CIPHERTEXT) { if(msg.messageStubType === proto.WebMessageInfo.StubType.CIPHERTEXT) {
retryMutex.mutex( retryMutex.mutex(
async() => { async() => {
if(ws.readyState === ws.OPEN) { if(ws.isOpen) {
const encNode = getBinaryNodeChild(node, 'enc') const encNode = getBinaryNodeChild(node, 'enc')
await sendRetryRequest(node, !encNode) await sendRetryRequest(node, !encNode)
if(retryRequestDelayMs) { if(retryRequestDelayMs) {

View File

@@ -6,10 +6,6 @@ export class MobileSocket extends Socket {
constructor(public config: SocketConfig) { constructor(public config: SocketConfig) {
super() super()
if(config.auth.creds.registered) {
this.connect()
}
this.on('data', (d) => { this.on('data', (d) => {
this.emit('message', d) this.emit('message', d)
}) })

View File

@@ -8,7 +8,6 @@ import { addTransactionCapability, bindWaitForConnectionUpdate, configureSuccess
import { makeEventBuffer } from '../Utils/event-buffer' import { makeEventBuffer } from '../Utils/event-buffer'
import { assertNodeErrorFree, BinaryNode, binaryNodeToString, encodeBinaryNode, getBinaryNodeChild, getBinaryNodeChildren, S_WHATSAPP_NET } from '../WABinary' import { assertNodeErrorFree, BinaryNode, binaryNodeToString, encodeBinaryNode, getBinaryNodeChild, getBinaryNodeChildren, S_WHATSAPP_NET } from '../WABinary'
import { MobileSocket } from './mobile-socket' import { MobileSocket } from './mobile-socket'
import { WebSocket } from './web-socket'
/** /**
* Connects to WA servers and performs: * Connects to WA servers and performs:
@@ -32,9 +31,17 @@ export const makeSocket = (config: SocketConfig) => {
} = config } = config
config.mobile = config.mobile || config.auth.creds.registered config.mobile = config.mobile || config.auth.creds.registered
const ws = config.mobile ? new MobileSocket(config) : new WebSocket(config) const ws = new MobileSocket(config)
ws.setMaxListeners(0) ws.setMaxListeners(0)
if(!config.mobile) {
// if not mobile -> auto connect
ws.connect()
} else if(config.auth.creds.registered) {
// if mobile and registered -> auto connect
ws.connect()
}
const ev = makeEventBuffer(logger) const ev = makeEventBuffer(logger)
/** ephemeral key pair used to encrypt/decrypt communication. Unique for each connection */ /** ephemeral key pair used to encrypt/decrypt communication. Unique for each connection */
const ephemeralKeyPair = Curve.generateKeyPair() const ephemeralKeyPair = Curve.generateKeyPair()

View File

@@ -1,31 +0,0 @@
import { WebSocket as WS } from 'ws'
import { DEFAULT_ORIGIN } from '../Defaults'
import { SocketConfig } from '../Types'
export class WebSocket extends WS {
constructor(public config: SocketConfig) {
super(config.waWebSocketUrl, undefined, {
origin: DEFAULT_ORIGIN,
headers: config.options.headers as Record<string, string>,
handshakeTimeout: config.connectTimeoutMs,
timeout: config.connectTimeoutMs,
agent: config.agent,
})
}
get isOpen() {
return this.readyState === WS.OPEN
}
get isClosed() {
return this.readyState === WS.CLOSED
}
get isClosing() {
return this.readyState === WS.CLOSING
}
get isConnecting() {
return this.readyState === WS.CONNECTING
}
}

View File

@@ -213,6 +213,6 @@ export const initAuthCreds = (): AuthenticationCreds => {
identityId: randomBytes(20), identityId: randomBytes(20),
registered: false, registered: false,
backupToken: randomBytes(20), backupToken: randomBytes(20),
registration: {} as RegistrationOptions registration: {} as never
} }
} }

View File

@@ -13,7 +13,7 @@ const getUserAgent = (config: SocketConfig): proto.ClientPayload.IUserAgent => {
const version = config.mobile ? [2, 22, 24] : config.version const version = config.mobile ? [2, 22, 24] : config.version
const device = config.mobile ? 'iPhone_7' : 'Desktop' const device = config.mobile ? 'iPhone_7' : 'Desktop'
const manufacturer = config.mobile ? 'Apple' : '' const manufacturer = config.mobile ? 'Apple' : ''
const platform = config.mobile ? proto.ClientPayload.UserAgent.Platform.IOS : proto.ClientPayload.UserAgent.Platform.WEB const platform = config.mobile ? proto.ClientPayload.UserAgent.Platform.IOS : proto.ClientPayload.UserAgent.Platform.MACOS
const phoneId = config.mobile ? { phoneId: config.auth.creds.phoneId } : {} const phoneId = config.mobile ? { phoneId: config.auth.creds.phoneId } : {}
return { return {
@@ -36,20 +36,6 @@ const getUserAgent = (config: SocketConfig): proto.ClientPayload.IUserAgent => {
} }
} }
const PLATFORM_MAP = {
'Mac OS': proto.ClientPayload.WebInfo.WebSubPlatform.DARWIN,
'Windows': proto.ClientPayload.WebInfo.WebSubPlatform.WIN32
}
const getWebInfo = (config: SocketConfig): proto.ClientPayload.IWebInfo => {
let webSubPlatform = proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER
if(config.syncFullHistory && PLATFORM_MAP[config.browser[0]]) {
webSubPlatform = PLATFORM_MAP[config.browser[0]]
}
return { webSubPlatform }
}
const getClientPayload = (config: SocketConfig) => { const getClientPayload = (config: SocketConfig) => {
const payload: proto.IClientPayload = { const payload: proto.IClientPayload = {
connectType: proto.ClientPayload.ConnectType.WIFI_UNKNOWN, connectType: proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
@@ -57,10 +43,6 @@ const getClientPayload = (config: SocketConfig) => {
userAgent: getUserAgent(config), userAgent: getUserAgent(config),
} }
if(!config.mobile) {
payload.webInfo = getWebInfo(config)
}
return payload return payload
} }