@cdteam/cdwa 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -2
  3. package/dist/auth/index.cjs +191 -0
  4. package/dist/auth/index.cjs.map +1 -0
  5. package/dist/auth/index.d.cts +25 -0
  6. package/dist/auth/index.d.ts +25 -0
  7. package/dist/auth/index.js +183 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/binary/index.cjs +414 -0
  10. package/dist/binary/index.cjs.map +1 -0
  11. package/dist/binary/index.d.cts +92 -0
  12. package/dist/binary/index.d.ts +92 -0
  13. package/dist/binary/index.js +407 -0
  14. package/dist/binary/index.js.map +1 -0
  15. package/dist/crypto/index.cjs +207 -0
  16. package/dist/crypto/index.cjs.map +1 -0
  17. package/dist/crypto/index.d.cts +91 -0
  18. package/dist/crypto/index.d.ts +91 -0
  19. package/dist/crypto/index.js +201 -0
  20. package/dist/crypto/index.js.map +1 -0
  21. package/dist/index-CcMoHfPz.d.cts +70 -0
  22. package/dist/index-CcMoHfPz.d.ts +70 -0
  23. package/dist/index.cjs +1254 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +97 -0
  26. package/dist/index.d.ts +97 -0
  27. package/dist/index.js +1224 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/messages/index.cjs +662 -0
  30. package/dist/messages/index.cjs.map +1 -0
  31. package/dist/messages/index.d.cts +122 -0
  32. package/dist/messages/index.d.ts +122 -0
  33. package/dist/messages/index.js +659 -0
  34. package/dist/messages/index.js.map +1 -0
  35. package/dist/signal/index.cjs +38 -0
  36. package/dist/signal/index.cjs.map +1 -0
  37. package/dist/signal/index.d.cts +30 -0
  38. package/dist/signal/index.d.ts +30 -0
  39. package/dist/signal/index.js +36 -0
  40. package/dist/signal/index.js.map +1 -0
  41. package/package.json +91 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crypto/noise.ts","../src/crypto/index.ts","../src/auth/index.ts","../src/signal/index.ts","../src/binary/constants.ts","../src/binary/encoder.ts","../src/binary/decoder.ts","../src/binary/index.ts","../src/messages/media.ts","../src/messages/builder.ts","../src/socket/index.ts","../src/client/index.ts"],"names":["sha256","randomBytes","fs","EventEmitter"],"mappings":"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","file":"index.js","sourcesContent":["import { CryptoEngine } from './index.js'\nimport { sha256 } from '@noble/hashes/sha256'\nimport type { KeyPair } from '../types/index.js'\n\nexport const NOISE_PROTOCOL_NAME = 'Noise_XX_25519_AESGCM_SHA256'\nexport const WA_NOISE_HEADER = new Uint8Array([87, 65, 6, 2]) // \"WA\\x06\\x02\"\n\n/**\n * Estado da cifra simétrica do Noise com contador sequencial (Nonce)\n */\nexport class NoiseCipherState {\n private key: Uint8Array | null = null\n private nonce = 0\n\n constructor(key?: Uint8Array) {\n if (key) {\n this.key = key\n }\n }\n\n hasKey(): boolean {\n return this.key !== null\n }\n\n setKey(key: Uint8Array) {\n this.key = key\n this.nonce = 0\n }\n\n encryptWithAd(ad: Uint8Array, plaintext: Uint8Array): Uint8Array {\n if (!this.key) {\n return plaintext\n }\n const iv = this.generateNonceBuffer(this.nonce)\n this.nonce += 1\n return CryptoEngine.aesGcmEncrypt(this.key, plaintext, iv, ad)\n }\n\n decryptWithAd(ad: Uint8Array, ciphertext: Uint8Array): Uint8Array {\n if (!this.key) {\n return ciphertext\n }\n const iv = this.generateNonceBuffer(this.nonce)\n this.nonce += 1\n return CryptoEngine.aesGcmDecrypt(this.key, ciphertext, iv, ad)\n }\n\n private generateNonceBuffer(nonce: number): Uint8Array {\n const buffer = new Uint8Array(12)\n const view = new DataView(buffer.buffer)\n // Nonce no formato 64-bit integer nos últimos 8 bytes\n view.setUint32(8, nonce, false)\n return buffer\n }\n}\n\n/**\n * Máquina de estado do Noise XX Handshake para o WhatsApp Web\n */\nexport class NoiseHandshake {\n private symmetricState: {\n h: Uint8Array\n ck: Uint8Array\n cipher: NoiseCipherState\n }\n private localEphemeral: KeyPair\n private localStatic: KeyPair\n private remoteEphemeral: Uint8Array | null = null\n private remoteStatic: Uint8Array | null = null\n\n constructor(localStaticKey: KeyPair) {\n this.localStatic = localStaticKey\n this.localEphemeral = CryptoEngine.generateKeyPair()\n\n // Inicialização do estado simétrico com o nome do protocolo\n const protocolHash = sha256(new TextEncoder().encode(NOISE_PROTOCOL_NAME))\n this.symmetricState = {\n h: new Uint8Array(protocolHash),\n ck: new Uint8Array(protocolHash),\n cipher: new NoiseCipherState(),\n }\n\n // Mistura o prólogo inicial do WhatsApp (WA_NOISE_HEADER) no hash\n this.mixHash(WA_NOISE_HEADER)\n }\n\n private mixHash(data: Uint8Array) {\n const merged = new Uint8Array(this.symmetricState.h.length + data.length)\n merged.set(this.symmetricState.h, 0)\n merged.set(data, this.symmetricState.h.length)\n this.symmetricState.h = sha256(merged)\n }\n\n private mixKey(data: Uint8Array) {\n // HKDF-Extract e Expand com Chaining Key\n const derived = CryptoEngine.deriveKey(data, '', this.symmetricState.ck, 64)\n this.symmetricState.ck = derived.slice(0, 32)\n const tempK = derived.slice(32, 64)\n this.symmetricState.cipher.setKey(tempK)\n }\n\n /**\n * Passo 1: Início do Handshake -> Envia chave efêmera local (e)\n */\n startHandshake(): Uint8Array {\n this.mixHash(this.localEphemeral.public)\n // O payload inicial consiste no prólogo do WhatsApp + a chave efêmera\n const message = new Uint8Array(WA_NOISE_HEADER.length + this.localEphemeral.public.length)\n message.set(WA_NOISE_HEADER, 0)\n message.set(this.localEphemeral.public, WA_NOISE_HEADER.length)\n return message\n }\n\n /**\n * Passo 2: Recebe resposta do servidor WhatsApp <- (e, ee, s, es)\n */\n processServerHello(serverBuffer: Uint8Array): Uint8Array {\n // Extrai a chave efêmera remota (primeiros 32 bytes)\n this.remoteEphemeral = serverBuffer.slice(0, 32)\n this.mixHash(this.remoteEphemeral)\n\n // ee: Diffie-Hellman entre as duas chaves efêmeras\n const ee = CryptoEngine.sharedKey(this.localEphemeral.private, this.remoteEphemeral)\n this.mixKey(ee)\n\n // s: Chave estática encriptada do servidor (48 bytes = 32 bytes de chave + 16 bytes auth tag do AES-GCM)\n const encryptedStatic = serverBuffer.slice(32, 80)\n this.remoteStatic = this.symmetricState.cipher.decryptWithAd(this.symmetricState.h, encryptedStatic)\n this.mixHash(encryptedStatic)\n\n // es: Diffie-Hellman entre a chave efêmera local e a chave estática do servidor\n const es = CryptoEngine.sharedKey(this.localEphemeral.private, this.remoteStatic)\n this.mixKey(es)\n\n // Payload final criptografado da resposta do servidor\n const encryptedPayload = serverBuffer.slice(80)\n const decryptedPayload = this.symmetricState.cipher.decryptWithAd(this.symmetricState.h, encryptedPayload)\n this.mixHash(encryptedPayload)\n\n return decryptedPayload\n }\n\n /**\n * Passo 3: Envia resposta final de autenticação do cliente -> (s, se) + payload\n * Retorna os CipherStates de leitura e escrita para uso no WebSocket\n */\n finishHandshake(payload: Uint8Array): {\n handshakeMessage: Uint8Array\n writeCipher: NoiseCipherState\n readCipher: NoiseCipherState\n } {\n // s: Encripta nossa chave estática de identidade\n const encryptedStatic = this.symmetricState.cipher.encryptWithAd(this.symmetricState.h, this.localStatic.public)\n this.mixHash(encryptedStatic)\n\n // se: Diffie-Hellman entre nossa chave estática e a efêmera do servidor\n if (!this.remoteEphemeral) {\n throw new Error('Remote ephemeral key is missing in Noise Handshake')\n }\n const se = CryptoEngine.sharedKey(this.localStatic.private, this.remoteEphemeral)\n this.mixKey(se)\n\n // Encripta o payload final (contendo informações de registro/login)\n const encryptedPayload = this.symmetricState.cipher.encryptWithAd(this.symmetricState.h, payload)\n this.mixHash(encryptedPayload)\n\n // Mensagem de envio: [encryptedStatic (48b)] + [encryptedPayload]\n const handshakeMessage = new Uint8Array(encryptedStatic.length + encryptedPayload.length)\n handshakeMessage.set(encryptedStatic, 0)\n handshakeMessage.set(encryptedPayload, encryptedStatic.length)\n\n // Divide a chaining key em 2 chaves finais de transporte (Split)\n const transportKeys = CryptoEngine.deriveKey(new Uint8Array(0), '', this.symmetricState.ck, 64)\n const writeKey = transportKeys.slice(0, 32)\n const readKey = transportKeys.slice(32, 64)\n\n return {\n handshakeMessage,\n writeCipher: new NoiseCipherState(writeKey),\n readCipher: new NoiseCipherState(readKey),\n }\n }\n}\n","import { x25519 } from '@noble/curves/ed25519'\nimport { hkdf } from '@noble/hashes/hkdf'\nimport { sha256 } from '@noble/hashes/sha256'\nimport { gcm } from '@noble/ciphers/aes'\nimport { randomBytes } from 'crypto'\nimport type { KeyPair } from '../types/index.js'\n\n/**\n * Utilitários criptográficos de alta performance e segurança para o protocolo WhatsApp\n */\n\nexport class CryptoEngine {\n /**\n * Gera um novo par de chaves Curve25519 (Diffie-Hellman)\n */\n static generateKeyPair(): KeyPair {\n const priv = randomBytes(32)\n const pub = x25519.getPublicKey(priv)\n return {\n private: new Uint8Array(priv),\n public: new Uint8Array(pub),\n }\n }\n\n /**\n * Executa Diffie-Hellman compartilhado (Shared Secret) usando Curve25519\n */\n static sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array {\n return x25519.getSharedSecret(privateKey, publicKey)\n }\n\n /**\n * HKDF baseado em SHA-256 para derivação segura de chaves (RFC 5869)\n */\n static deriveKey(\n secret: Uint8Array,\n info: string | Uint8Array,\n salt?: Uint8Array,\n length = 32\n ): Uint8Array {\n const infoBytes = typeof info === 'string' ? new TextEncoder().encode(info) : info\n return hkdf(sha256, secret, salt, infoBytes, length)\n }\n\n /**\n * Encriptação autenticada com AES-256-GCM\n */\n static aesGcmEncrypt(\n key: Uint8Array,\n plaintext: Uint8Array,\n iv: Uint8Array,\n additionalData?: Uint8Array\n ): Uint8Array {\n const cipher = gcm(key, iv, additionalData)\n return cipher.encrypt(plaintext)\n }\n\n /**\n * Decriptação autenticada com AES-256-GCM\n */\n static aesGcmDecrypt(\n key: Uint8Array,\n ciphertext: Uint8Array,\n iv: Uint8Array,\n additionalData?: Uint8Array\n ): Uint8Array {\n const cipher = gcm(key, iv, additionalData)\n return cipher.decrypt(ciphertext)\n }\n\n /**\n * Encripta um payload com uma senha mestra (para proteger credenciais at-rest)\n */\n static encryptAtRest(payload: Uint8Array, masterPassphrase: string): { iv: string; salt: string; data: string } {\n const salt = randomBytes(16)\n const iv = randomBytes(12)\n const key = hkdf(sha256, new TextEncoder().encode(masterPassphrase), salt, new TextEncoder().encode('cdwa-at-rest'), 32)\n const encrypted = this.aesGcmEncrypt(key, payload, iv)\n\n return {\n salt: Buffer.from(salt).toString('hex'),\n iv: Buffer.from(iv).toString('hex'),\n data: Buffer.from(encrypted).toString('base64'),\n }\n }\n\n /**\n * Decripta um payload protegido com a senha mestra\n */\n static decryptAtRest(\n encryptedBundle: { iv: string; salt: string; data: string },\n masterPassphrase: string\n ): Uint8Array {\n const salt = Buffer.from(encryptedBundle.salt, 'hex')\n const iv = Buffer.from(encryptedBundle.iv, 'hex')\n const data = Buffer.from(encryptedBundle.data, 'base64')\n const key = hkdf(sha256, new TextEncoder().encode(masterPassphrase), salt, new TextEncoder().encode('cdwa-at-rest'), 32)\n\n return this.aesGcmDecrypt(key, data, iv)\n }\n}\n\nexport * from './noise.js'\n\n","import { randomBytes } from 'crypto'\nimport { CryptoEngine } from '../crypto/index.js'\nimport type { AuthenticationCreds, AuthenticationState, SignalKeyStore } from '../types/index.js'\nimport { promises as fs } from 'fs'\nimport path from 'path'\n\n/**\n * Cria credenciais limpas para uma nova sessão Multi-Device\n */\nexport function initAuthCreds(): AuthenticationCreds {\n const identityKeyPair = CryptoEngine.generateKeyPair()\n const noiseKey = CryptoEngine.generateKeyPair()\n const pairingEphemeral = CryptoEngine.generateKeyPair()\n const signedPreKey = CryptoEngine.generateKeyPair()\n\n // Assinatura da pré-chave com a chave de identidade\n // No WhatsApp, isso garante autenticidade contra MITM no protocolo Signal\n const signedSignature = CryptoEngine.sharedKey(identityKeyPair.private, signedPreKey.public)\n\n return {\n noiseKey,\n pairingEphemeralKeyPair: pairingEphemeral,\n signedIdentityKey: identityKeyPair,\n signedPreKey: {\n ...signedPreKey,\n keyId: 1,\n signature: signedSignature,\n },\n registrationId: Math.floor(Math.random() * 16384),\n advSecretKey: Buffer.from(randomBytes(32)).toString('base64'),\n firstUnuploadedPreKeyId: 1,\n nextPreKeyId: 1,\n }\n}\n\n/**\n * Gerenciador de estado de autenticação com suporte opcional a encriptação at-rest\n */\nexport class EncryptedFileAuthState {\n private folderPath: string\n private passphrase?: string\n\n constructor(folderPath: string, passphrase?: string) {\n this.folderPath = folderPath\n this.passphrase = passphrase\n }\n\n private async ensureDir() {\n await fs.mkdir(this.folderPath, { recursive: true })\n }\n\n private getFilePath(filename: string): string {\n return path.join(this.folderPath, `${filename}.json`)\n }\n\n async save(key: string, data: unknown): Promise<void> {\n await this.ensureDir()\n const filePath = this.getFilePath(key)\n const jsonString = JSON.stringify(data, (_, value) => {\n if (value instanceof Uint8Array) {\n return { __type: 'Buffer', data: Buffer.from(value).toString('base64') }\n }\n return value\n })\n\n if (this.passphrase) {\n const encrypted = CryptoEngine.encryptAtRest(new TextEncoder().encode(jsonString), this.passphrase)\n await fs.writeFile(filePath, JSON.stringify(encrypted), 'utf-8')\n } else {\n await fs.writeFile(filePath, jsonString, 'utf-8')\n }\n }\n\n async load<T>(key: string): Promise<T | null> {\n const filePath = this.getFilePath(key)\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n let jsonString = content\n\n if (this.passphrase) {\n const bundle = JSON.parse(content)\n const decryptedBytes = CryptoEngine.decryptAtRest(bundle, this.passphrase)\n jsonString = new TextDecoder().decode(decryptedBytes)\n }\n\n return JSON.parse(jsonString, (_, value) => {\n if (value && value.__type === 'Buffer') {\n return new Uint8Array(Buffer.from(value.data, 'base64'))\n }\n return value\n }) as T\n } catch {\n return null\n }\n }\n\n createKeyStore(): SignalKeyStore {\n return {\n get: async <T>(type: string, ids: string[]): Promise<Record<string, T>> => {\n const result: Record<string, T> = {}\n for (const id of ids) {\n const item = await this.load<T>(`${type}-${id}`)\n if (item) {\n result[id] = item\n }\n }\n return result\n },\n set: async (data: Record<string, Record<string, unknown>>): Promise<void> => {\n for (const [type, entries] of Object.entries(data)) {\n for (const [id, value] of Object.entries(entries)) {\n await this.save(`${type}-${id}`, value)\n }\n }\n },\n }\n }\n}\n\n/**\n * Cria um estado de autenticação persistente com segurança reforçada\n */\nexport async function useSecureAuthState(\n folderPath: string,\n passphrase?: string\n): Promise<AuthenticationState> {\n const storage = new EncryptedFileAuthState(folderPath, passphrase)\n let creds = await storage.load<AuthenticationCreds>('creds')\n\n if (!creds) {\n creds = initAuthCreds()\n await storage.save('creds', creds)\n }\n\n return {\n creds,\n keys: storage.createKeyStore(),\n }\n}\n","import type { SignalKeyStore } from '../types/index.js'\n\nexport interface SignalSessionCipher {\n encrypt(plaintext: Uint8Array): Promise<{ type: number; body: Uint8Array }>\n decrypt(ciphertext: Uint8Array): Promise<Uint8Array>\n}\n\n/**\n * Motor de gerenciamento do protocolo Signal para criptografia ponta a ponta (E2EE)\n */\nexport class SignalEngine {\n private keyStore: SignalKeyStore\n\n constructor(keyStore: SignalKeyStore) {\n this.keyStore = keyStore\n }\n\n /**\n * Inicializa ou recupera uma sessão de Double Ratchet com um contato/dispositivo\n */\n async getSession(address: string): Promise<Record<string, unknown> | null> {\n const sessions = await this.keyStore.get<Record<string, unknown>>('session', [address])\n return sessions[address] || null\n }\n\n /**\n * Salva uma sessão atualizada após troca de chaves\n */\n async saveSession(address: string, sessionData: Record<string, unknown>): Promise<void> {\n await this.keyStore.set({\n session: {\n [address]: sessionData,\n },\n })\n }\n\n /**\n * Gerenciamento de chaves de remetente (Sender Keys) para envio otimizado em grupos\n */\n async getGroupSenderKey(groupId: string, senderId: string): Promise<Record<string, unknown> | null> {\n const keyKey = `${groupId}::${senderId}`\n const keys = await this.keyStore.get<Record<string, unknown>>('sender-key', [keyKey])\n return keys[keyKey] || null\n }\n}\n","/**\n * Constantes e tokens de indexação do protocolo WABinary do WhatsApp\n */\n\nexport const WABinaryConstants = {\n LIST_EMPTY: 0,\n STREAM_END: 2,\n DICTIONARY_0: 236,\n DICTIONARY_1: 237,\n DICTIONARY_2: 238,\n DICTIONARY_3: 239,\n LIST_8: 248,\n LIST_16: 249,\n JID_PAIR: 250,\n HEX_8: 251,\n BINARY_8: 252,\n BINARY_20: 253,\n BINARY_32: 254,\n NIBBLE_8: 255,\n SINGLE_BYTE_MAX: 256,\n}\n\n/**\n * Tabela de tokens simples comuns do WhatsApp\n */\nexport const SINGLE_BYTE_TOKENS = [\n '',\n '',\n '',\n '200',\n '400',\n '404',\n '500',\n '501',\n '502',\n 'action',\n 'add',\n 'after',\n 'archive',\n 'author',\n 'available',\n 'battery',\n 'before',\n 'body',\n 'broadcast',\n 'chat',\n 'clear',\n 'code',\n 'composing',\n 'config',\n 'contacts',\n 'count',\n 'create',\n 'debug',\n 'delete',\n 'demote',\n 'duplicate',\n 'encoding',\n 'error',\n 'false',\n 'filehash',\n 'from',\n 'g.us',\n 'group',\n 'groups_v2',\n 'height',\n 'ib',\n 'id',\n 'image',\n 'in',\n 'index',\n 'invis',\n 'item',\n 'jid',\n 'kind',\n 'last',\n 'leave',\n 'live',\n 'log',\n 'media',\n 'message',\n 'mimetype',\n 'missing',\n 'modify',\n 'name',\n 'notification',\n 'notify',\n 'out',\n 'owner',\n 'participant',\n 'paused',\n 'picture',\n 'played',\n 'presence',\n 'preview',\n 'promote',\n 'query',\n 'raw',\n 'read',\n 'receipt',\n 'received',\n 'recipient',\n 'recording',\n 'relay',\n 'remove',\n 'response',\n 'resume',\n 'retry',\n 's.whatsapp.net',\n 'seconds',\n 'set',\n 'size',\n 'status',\n 'subject',\n 'subscribe',\n 't',\n 'text',\n 'to',\n 'true',\n 'type',\n 'unarchive',\n 'unavailable',\n 'url',\n 'user',\n 'value',\n 'web',\n 'width',\n 'mute',\n 'read_only',\n 'admin',\n 'creator',\n 'short',\n 'update',\n 'powersave',\n 'rich',\n 'modify_tag',\n 'message_info',\n 'opaque',\n 'contact',\n 'unlink',\n 'iq',\n 'ping',\n 'version',\n 'client',\n 'pair-device',\n 'pair-success',\n 'success',\n 'failure',\n]\n\n// Mapa reverso para encoding ultra veloz O(1)\nexport const TOKEN_MAP = new Map<string, number>()\nSINGLE_BYTE_TOKENS.forEach((token, index) => {\n if (token) {\n TOKEN_MAP.set(token, index)\n }\n})\n","import { WABinaryConstants, TOKEN_MAP } from './constants.js'\nimport type { BinaryNode } from '../types/index.js'\n\n/**\n * Codificador de stanzas XML em bytes compatíveis com o WhatsApp Web (WABinary)\n */\nexport class BinaryEncoder {\n private buffer: number[] = []\n\n encode(node: BinaryNode): Uint8Array {\n this.buffer = []\n this.writeNode(node)\n return new Uint8Array(this.buffer)\n }\n\n private writeByte(byte: number) {\n this.buffer.push(byte & 0xff)\n }\n\n private writeBytes(bytes: Uint8Array | number[]) {\n for (let i = 0; i < bytes.length; i++) {\n this.writeByte(bytes[i]!)\n }\n }\n\n private writeInt16(value: number) {\n this.writeByte((value >> 8) & 0xff)\n this.writeByte(value & 0xff)\n }\n\n private writeInt32(value: number) {\n this.writeByte((value >> 24) & 0xff)\n this.writeByte((value >> 16) & 0xff)\n this.writeByte((value >> 8) & 0xff)\n this.writeByte(value & 0xff)\n }\n\n private writeListStart(size: number) {\n if (size === 0) {\n this.writeByte(WABinaryConstants.LIST_EMPTY)\n } else if (size < 256) {\n this.writeByte(WABinaryConstants.LIST_8)\n this.writeByte(size)\n } else {\n this.writeByte(WABinaryConstants.LIST_16)\n this.writeInt16(size)\n }\n }\n\n private writeString(str: string) {\n const tokenIndex = TOKEN_MAP.get(str)\n if (tokenIndex !== undefined) {\n this.writeByte(tokenIndex)\n return\n }\n\n const encoded = new TextEncoder().encode(str)\n if (encoded.length < 256) {\n this.writeByte(WABinaryConstants.BINARY_8)\n this.writeByte(encoded.length)\n } else {\n this.writeByte(WABinaryConstants.BINARY_32)\n this.writeInt32(encoded.length)\n }\n this.writeBytes(encoded)\n }\n\n private writeNode(node: BinaryNode) {\n const numAttrs = Object.keys(node.attrs).length\n const hasContent = node.content !== undefined\n\n // Um nó é serializado como uma lista de:\n // [tag, attrs, content (se houver)] -> tamanho total = 1 + (numAttrs * 2) + (hasContent ? 1 : 0)\n const listSize = 1 + numAttrs * 2 + (hasContent ? 1 : 0)\n this.writeListStart(listSize)\n\n // Escreve a Tag\n this.writeString(node.tag)\n\n // Escreve os Atributos (Pares chave=valor)\n for (const [key, value] of Object.entries(node.attrs)) {\n if (value !== undefined) {\n this.writeString(key)\n this.writeString(String(value))\n }\n }\n\n // Escreve o Conteúdo (Nós filhos, string ou buffer)\n if (hasContent) {\n if (Array.isArray(node.content)) {\n this.writeListStart(node.content.length)\n for (const child of node.content) {\n this.writeNode(child)\n }\n } else if (typeof node.content === 'string') {\n this.writeString(node.content)\n } else if (node.content instanceof Uint8Array) {\n if (node.content.length < 256) {\n this.writeByte(WABinaryConstants.BINARY_8)\n this.writeByte(node.content.length)\n } else {\n this.writeByte(WABinaryConstants.BINARY_32)\n this.writeInt32(node.content.length)\n }\n this.writeBytes(node.content)\n }\n }\n }\n}\n","import { WABinaryConstants, SINGLE_BYTE_TOKENS } from './constants.js'\nimport type { BinaryNode, BinaryNodeAttributes } from '../types/index.js'\n\n/**\n * Decodificador de stanzas do WhatsApp a partir de fluxos de bytes WABinary\n */\nexport class BinaryDecoder {\n private buffer: Uint8Array = new Uint8Array(0)\n private offset = 0\n\n decode(buffer: Uint8Array): BinaryNode {\n this.buffer = buffer\n this.offset = 0\n return this.readNode()\n }\n\n private readByte(): number {\n if (this.offset >= this.buffer.length) {\n throw new Error(`Unexpected EOF in WABinary stream at offset ${this.offset}`)\n }\n const b = this.buffer[this.offset]!\n this.offset += 1\n return b\n }\n\n private readBytes(length: number): Uint8Array {\n if (this.offset + length > this.buffer.length) {\n throw new Error(`Buffer underrun: requested ${length} bytes, have ${this.buffer.length - this.offset}`)\n }\n const slice = this.buffer.slice(this.offset, this.offset + length)\n this.offset += length\n return slice\n }\n\n private readInt16(): number {\n const b0 = this.readByte()\n const b1 = this.readByte()\n return (b0 << 8) | b1\n }\n\n private readInt32(): number {\n const b0 = this.readByte()\n const b1 = this.readByte()\n const b2 = this.readByte()\n const b3 = this.readByte()\n return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3\n }\n\n private readListSize(): number {\n const tag = this.readByte()\n if (tag === WABinaryConstants.LIST_EMPTY) {\n return 0\n }\n if (tag === WABinaryConstants.LIST_8) {\n return this.readByte()\n }\n if (tag === WABinaryConstants.LIST_16) {\n return this.readInt16()\n }\n throw new Error(`Invalid list tag byte: ${tag}`)\n }\n\n private readString(): string {\n const tag = this.readByte()\n\n if (tag < SINGLE_BYTE_TOKENS.length && SINGLE_BYTE_TOKENS[tag]) {\n return SINGLE_BYTE_TOKENS[tag]!\n }\n\n if (tag === WABinaryConstants.BINARY_8) {\n const length = this.readByte()\n const bytes = this.readBytes(length)\n return new TextDecoder().decode(bytes)\n }\n\n if (tag === WABinaryConstants.BINARY_32) {\n const length = this.readInt32()\n const bytes = this.readBytes(length)\n return new TextDecoder().decode(bytes)\n }\n\n throw new Error(`Unsupported string tag: ${tag} at offset ${this.offset - 1}`)\n }\n\n private readNode(): BinaryNode {\n const listSize = this.readListSize()\n if (listSize === 0) {\n throw new Error('Invalid empty node')\n }\n\n const tag = this.readString()\n const attrs: BinaryNodeAttributes = {}\n let remaining = listSize - 1\n\n // Lê pares de chave e valor de atributos\n while (remaining > 1) {\n const key = this.readString()\n const val = this.readString()\n attrs[key] = val\n remaining -= 2\n }\n\n let content: BinaryNode[] | string | Uint8Array | undefined\n\n if (remaining === 1) {\n const peekByte = this.buffer[this.offset]\n if (\n peekByte === WABinaryConstants.LIST_EMPTY ||\n peekByte === WABinaryConstants.LIST_8 ||\n peekByte === WABinaryConstants.LIST_16\n ) {\n const childCount = this.readListSize()\n const children: BinaryNode[] = []\n for (let i = 0; i < childCount; i++) {\n children.push(this.readNode())\n }\n content = children\n } else if (peekByte === WABinaryConstants.BINARY_8 || peekByte === WABinaryConstants.BINARY_32) {\n const nextTag = this.readByte()\n const length = nextTag === WABinaryConstants.BINARY_8 ? this.readByte() : this.readInt32()\n content = this.readBytes(length)\n } else {\n content = this.readString()\n }\n }\n\n return { tag, attrs, content }\n }\n}\n","import type { BinaryNode } from '../types/index.js'\nimport { BinaryEncoder } from './encoder.js'\nimport { BinaryDecoder } from './decoder.js'\n\nexport * from './constants.js'\nexport * from './encoder.js'\nexport * from './decoder.js'\n\n/**\n * Utilitários para manipulação de stanzas e nós binários (WABinary)\n */\nexport class BinaryProtocol {\n private static encoder = new BinaryEncoder()\n private static decoder = new BinaryDecoder()\n\n /**\n * Converte um BinaryNode para bytes WABinary\n */\n static encode(node: BinaryNode): Uint8Array {\n return this.encoder.encode(node)\n }\n\n /**\n * Converte bytes WABinary de volta para um BinaryNode estruturado\n */\n static decode(buffer: Uint8Array): BinaryNode {\n return this.decoder.decode(buffer)\n }\n\n /**\n * Constrói um nó binário com validação de formato\n */\n static createNode(\n tag: string,\n attrs: Record<string, string | number | undefined> = {},\n content?: BinaryNode[] | string | Uint8Array\n ): BinaryNode {\n return {\n tag,\n attrs,\n content,\n }\n }\n\n /**\n * Localiza o primeiro filho correspondente à tag fornecida\n */\n static getChildNode(node: BinaryNode, childTag: string): BinaryNode | undefined {\n if (Array.isArray(node.content)) {\n return node.content.find((child) => child.tag === childTag)\n }\n return undefined\n }\n\n /**\n * Extrai todos os nós filhos que batem com uma determinada tag\n */\n static getChildrenNodes(node: BinaryNode, childTag: string): BinaryNode[] {\n if (Array.isArray(node.content)) {\n return node.content.filter((child) => child.tag === childTag)\n }\n return []\n }\n\n /**\n * Converte o nó para representação em string legível para debug\n */\n static stringify(node: BinaryNode, indent = 0): string {\n const spaces = ' '.repeat(indent)\n const attrsStr = Object.entries(node.attrs)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ')\n\n const openTag = attrsStr ? `<${node.tag} ${attrsStr}>` : `<${node.tag}>`\n\n if (!node.content) {\n return `${spaces}<${node.tag} ${attrsStr} />`\n }\n\n if (Array.isArray(node.content)) {\n const children = node.content.map((c) => this.stringify(c, indent + 1)).join('\\n')\n return `${spaces}${openTag}\\n${children}\\n${spaces}</${node.tag}>`\n }\n\n const contentStr =\n node.content instanceof Uint8Array\n ? `[Buffer ${node.content.length}b]`\n : String(node.content)\n\n return `${spaces}${openTag}${contentStr}</${node.tag}>`\n }\n}\n","import { randomBytes, createCipheriv, createHmac } from 'crypto'\nimport { sha256 } from '@noble/hashes/sha256'\nimport { CryptoEngine } from '../crypto/index.js'\n\nexport type MediaType = 'image' | 'video' | 'audio' | 'document'\n\nexport interface EncryptedMediaResult {\n mediaKey: Uint8Array\n ciphertext: Uint8Array\n fileSha256: Uint8Array\n fileEncSha256: Uint8Array\n mac: Uint8Array\n}\n\nconst MEDIA_HKDF_INFO: Record<MediaType, string> = {\n image: 'WhatsApp Image Keys',\n video: 'WhatsApp Video Keys',\n audio: 'WhatsApp Audio Keys',\n document: 'WhatsApp Document Keys',\n}\n\n/**\n * Pipeline de criptografia E2EE para mídias do WhatsApp\n */\nexport class MediaCrypto {\n /**\n * Criptografa o arquivo de mídia de acordo com o padrão RFC do WhatsApp\n */\n static encryptMedia(mediaBuffer: Uint8Array, type: MediaType): EncryptedMediaResult {\n // 1. Gera uma chave aleatória de 32 bytes para a mídia\n const mediaKey = randomBytes(32)\n const info = MEDIA_HKDF_INFO[type]\n\n // 2. Expande para 112 bytes: [iv (16b), cipherKey (32b), macKey (32b), refKey (32b)]\n const expandedKeys = CryptoEngine.deriveKey(new Uint8Array(mediaKey), info, undefined, 112)\n const iv = expandedKeys.slice(0, 16)\n const cipherKey = expandedKeys.slice(16, 48)\n const macKey = expandedKeys.slice(48, 80)\n\n // 3. SHA-256 do arquivo original limpo\n const fileSha256 = sha256(mediaBuffer)\n\n // 4. Encripta o buffer com AES-256-CBC\n const cipher = createCipheriv('aes-256-cbc', Buffer.from(cipherKey), Buffer.from(iv))\n const encryptedBody = Buffer.concat([cipher.update(Buffer.from(mediaBuffer)), cipher.final()])\n\n // 5. Gera HMAC-SHA256 dos dados criptografados (truncado em 10 bytes)\n const hmac = createHmac('sha256', Buffer.from(macKey))\n hmac.update(Buffer.from(iv))\n hmac.update(encryptedBody)\n const fullMac = hmac.digest()\n const mac = fullMac.subarray(0, 10)\n\n // 6. Payload final encriptado: [encryptedBody] + [mac (10b)]\n const finalCiphertext = new Uint8Array(encryptedBody.length + mac.length)\n finalCiphertext.set(encryptedBody, 0)\n finalCiphertext.set(mac, encryptedBody.length)\n\n // 7. SHA-256 do arquivo encriptado\n const fileEncSha256 = sha256(finalCiphertext)\n\n return {\n mediaKey: new Uint8Array(mediaKey),\n ciphertext: finalCiphertext,\n fileSha256: new Uint8Array(fileSha256),\n fileEncSha256: new Uint8Array(fileEncSha256),\n mac: new Uint8Array(mac),\n }\n }\n}\n","import { BinaryProtocol } from '../binary/index.js'\nimport { MediaCrypto } from './media.js'\nimport type { AnyMessageContent, MessageOptions } from './types.js'\nimport type { BinaryNode } from '../types/index.js'\n\n/**\n * Construtor de nós e stanzas de mensagens do WhatsApp\n */\nexport class MessageBuilder {\n /**\n * Converte qualquer conteúdo de mensagem em uma stanza <message> pronta para transmissão\n */\n static async buildMessageNode(\n jid: string,\n content: AnyMessageContent,\n options: MessageOptions = {}\n ): Promise<{ node: BinaryNode; messageId: string }> {\n const messageId = `3EB0${Date.now().toString(16).toUpperCase()}${Math.floor(Math.random() * 10000)}`\n const timestamp = options.timestamp || Math.floor(Date.now() / 1000)\n\n const messageAttrs: Record<string, string | number | undefined> = {\n id: messageId,\n to: jid,\n type: 'text',\n t: timestamp,\n }\n\n let payloadContent: Uint8Array | BinaryNode[] = new Uint8Array(0)\n\n // 1. Mensagem de Texto\n if ('text' in content) {\n payloadContent = new TextEncoder().encode(content.text)\n }\n\n // 2. Mensagem de Imagem\n else if ('image' in content) {\n messageAttrs.type = 'media'\n messageAttrs.mediatype = 'image'\n const buffer = await this.resolveMediaBuffer(content.image)\n const encrypted = MediaCrypto.encryptMedia(buffer, 'image')\n\n payloadContent = [\n BinaryProtocol.createNode('image', {\n mimetype: content.mimetype || 'image/jpeg',\n caption: content.caption,\n fileLength: buffer.length,\n fileSha256: Buffer.from(encrypted.fileSha256).toString('base64'),\n fileEncSha256: Buffer.from(encrypted.fileEncSha256).toString('base64'),\n mediaKey: Buffer.from(encrypted.mediaKey).toString('base64'),\n }),\n ]\n }\n\n // 3. Mensagem de Vídeo\n else if ('video' in content) {\n messageAttrs.type = 'media'\n messageAttrs.mediatype = 'video'\n const buffer = await this.resolveMediaBuffer(content.video)\n const encrypted = MediaCrypto.encryptMedia(buffer, 'video')\n\n payloadContent = [\n BinaryProtocol.createNode('video', {\n mimetype: content.mimetype || 'video/mp4',\n caption: content.caption,\n gifPlayback: content.gifPlayback ? 'true' : undefined,\n ptv: content.ptv ? 'true' : undefined,\n fileLength: buffer.length,\n fileSha256: Buffer.from(encrypted.fileSha256).toString('base64'),\n fileEncSha256: Buffer.from(encrypted.fileEncSha256).toString('base64'),\n mediaKey: Buffer.from(encrypted.mediaKey).toString('base64'),\n }),\n ]\n }\n\n // 4. Mensagem de Áudio\n else if ('audio' in content) {\n messageAttrs.type = 'media'\n messageAttrs.mediatype = 'audio'\n const buffer = await this.resolveMediaBuffer(content.audio)\n const encrypted = MediaCrypto.encryptMedia(buffer, 'audio')\n\n payloadContent = [\n BinaryProtocol.createNode('audio', {\n mimetype: content.mimetype || (content.ptt ? 'audio/ogg; codecs=opus' : 'audio/mp4'),\n ptt: content.ptt ? 'true' : 'false',\n fileLength: buffer.length,\n fileSha256: Buffer.from(encrypted.fileSha256).toString('base64'),\n fileEncSha256: Buffer.from(encrypted.fileEncSha256).toString('base64'),\n mediaKey: Buffer.from(encrypted.mediaKey).toString('base64'),\n }),\n ]\n }\n\n // 5. Mensagem de Documento\n else if ('document' in content) {\n messageAttrs.type = 'media'\n messageAttrs.mediatype = 'document'\n const buffer = await this.resolveMediaBuffer(content.document)\n const encrypted = MediaCrypto.encryptMedia(buffer, 'document')\n\n payloadContent = [\n BinaryProtocol.createNode('document', {\n mimetype: content.mimetype,\n fileName: content.fileName || 'file',\n caption: content.caption,\n fileLength: buffer.length,\n fileSha256: Buffer.from(encrypted.fileSha256).toString('base64'),\n fileEncSha256: Buffer.from(encrypted.fileEncSha256).toString('base64'),\n mediaKey: Buffer.from(encrypted.mediaKey).toString('base64'),\n }),\n ]\n }\n\n // 6. Mensagem de Localização\n else if ('location' in content) {\n messageAttrs.type = 'location'\n payloadContent = [\n BinaryProtocol.createNode('location', {\n degreesLatitude: content.location.degreesLatitude,\n degreesLongitude: content.location.degreesLongitude,\n name: content.location.name,\n address: content.location.address,\n url: content.location.url,\n }),\n ]\n }\n\n // 7. Mensagem de Contato\n else if ('contact' in content) {\n messageAttrs.type = 'contact'\n payloadContent = [\n BinaryProtocol.createNode('contact', {\n displayName: content.contact.displayName,\n vcard: content.contact.vcard,\n }),\n ]\n }\n\n // 8. Mensagem de Múltiplos Contatos\n else if ('contacts' in content) {\n messageAttrs.type = 'contacts'\n const contactNodes = content.contacts.contacts.map((c) =>\n BinaryProtocol.createNode('contact', {\n displayName: c.displayName,\n vcard: c.vcard,\n })\n )\n payloadContent = [\n BinaryProtocol.createNode(\n 'contacts',\n { displayName: content.contacts.displayName },\n contactNodes\n ),\n ]\n }\n\n // 9. Reação\n else if ('react' in content) {\n messageAttrs.type = 'reaction'\n payloadContent = [\n BinaryProtocol.createNode('reaction', {\n text: content.react.text,\n targetId: content.react.key.id,\n targetJid: content.react.key.remoteJid,\n }),\n ]\n }\n\n // Monta o nó final da mensagem\n const node = BinaryProtocol.createNode('message', messageAttrs, payloadContent)\n\n return {\n node,\n messageId,\n }\n }\n\n /**\n * Resolve diferentes fontes de mídia (Buffer, Uint8Array ou URL) para um Uint8Array em memória\n */\n private static async resolveMediaBuffer(source: unknown): Promise<Uint8Array> {\n if (source instanceof Uint8Array) {\n return source\n }\n if (Buffer.isBuffer(source)) {\n return new Uint8Array(source)\n }\n if (typeof source === 'object' && source !== null && 'url' in source) {\n const res = await fetch((source as { url: string }).url)\n const arrayBuf = await res.arrayBuffer()\n return new Uint8Array(arrayBuf)\n }\n throw new Error('Unsupported media source format')\n }\n}\n","import WebSocket from 'ws'\nimport { EventEmitter } from 'events'\nimport { NoiseHandshake, NoiseCipherState } from '../crypto/noise.js'\nimport { BinaryProtocol } from '../binary/index.js'\nimport type { SocketConfig, ConnectionState, ConnectionUpdate, BinaryNode, KeyPair } from '../types/index.js'\n\nexport const DEFAULT_WA_WS_URL = 'wss://web.whatsapp.com/ws/chat'\n\nexport class WhatsAppSocket extends EventEmitter {\n private ws: WebSocket | null = null\n private config: SocketConfig\n private pingInterval: NodeJS.Timeout | null = null\n private state: ConnectionState = 'close'\n\n // Noise Handshake & Ciphers\n private noise: NoiseHandshake | null = null\n private writeCipher: NoiseCipherState | null = null\n private readCipher: NoiseCipherState | null = null\n private isHandshakeComplete = false\n\n constructor(config: SocketConfig = {}) {\n super()\n this.config = {\n waWebSocketUrl: DEFAULT_WA_WS_URL,\n connectTimeoutMs: 20000,\n keepAliveIntervalMs: 30000,\n ...config,\n }\n }\n\n get connectionState(): ConnectionState {\n return this.state\n }\n\n private updateConnection(update: ConnectionUpdate) {\n if (update.connection) {\n this.state = update.connection\n }\n this.emit('connection.update', update)\n }\n\n async connect(staticKey: KeyPair): Promise<void> {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n return\n }\n\n this.isHandshakeComplete = false\n this.writeCipher = null\n this.readCipher = null\n this.noise = new NoiseHandshake(staticKey)\n\n this.updateConnection({ connection: 'connecting' })\n\n const wsUrl = this.config.waWebSocketUrl || DEFAULT_WA_WS_URL\n this.ws = new WebSocket(wsUrl, {\n origin: 'https://web.whatsapp.com',\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n },\n })\n\n this.ws.on('open', () => {\n this.startKeepAlive()\n this.emit('open')\n this.initiateNoiseHandshake()\n })\n\n this.ws.on('message', (data: WebSocket.RawData) => {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer)\n this.handleIncomingFrame(new Uint8Array(buffer))\n })\n\n this.ws.on('close', (code: number, reason: Buffer) => {\n this.cleanup()\n this.updateConnection({\n connection: 'close',\n lastDisconnect: {\n error: new Error(`WebSocket closed with code ${code}: ${reason.toString()}`),\n date: new Date(),\n },\n })\n })\n\n this.ws.on('error', (err: Error) => {\n this.emit('error', err)\n })\n }\n\n /**\n * Envia a mensagem inicial do Noise Handshake\n */\n private initiateNoiseHandshake() {\n if (!this.noise) return\n const initialPayload = this.noise.startHandshake()\n this.sendRaw(initialPayload)\n }\n\n /**\n * Trata frames recebidos pelo WebSocket\n */\n private handleIncomingFrame(frame: Uint8Array) {\n if (!this.isHandshakeComplete) {\n this.handleHandshakeFrame(frame)\n return\n }\n\n // Após o handshake, os frames de dados possuem 3 bytes de tamanho + payload encriptado\n if (this.readCipher && frame.length > 3) {\n const ciphertext = frame.slice(3)\n const decrypted = this.readCipher.decryptWithAd(new Uint8Array(0), ciphertext)\n\n try {\n const node = BinaryProtocol.decode(decrypted)\n this.emit('node', node)\n } catch (err) {\n this.emit('error', new Error(`Failed to decode WABinary stanza: ${(err as Error).message}`))\n }\n }\n }\n\n /**\n * Conclui as etapas do Noise Handshake\n */\n private handleHandshakeFrame(frame: Uint8Array) {\n if (!this.noise) return\n\n try {\n // 1. Processa resposta do servidor (Server Hello)\n this.noise.processServerHello(frame)\n\n // 2. Monta o payload do cliente (Client Payload com versão e credenciais)\n const clientPayload = new Uint8Array([0]) // Payload inicial mínimo\n const finish = this.noise.finishHandshake(clientPayload)\n\n this.writeCipher = finish.writeCipher\n this.readCipher = finish.readCipher\n this.isHandshakeComplete = true\n\n // Envia a resposta final do handshake\n this.sendRaw(finish.handshakeMessage)\n\n // Conexão segura estabelecida\n this.updateConnection({ connection: 'open' })\n this.emit('handshake.complete')\n } catch (err) {\n this.emit('error', new Error(`Noise Handshake failed: ${(err as Error).message}`))\n this.disconnect()\n }\n }\n\n /**\n * Envia uma stanza estruturada, codificando em WABinary e criptografando com o Noise Write Cipher\n */\n sendNode(node: BinaryNode): void {\n if (!this.isHandshakeComplete || !this.writeCipher) {\n throw new Error('Cannot send stanza: Noise Handshake is not complete')\n }\n\n const encodedNode = BinaryProtocol.encode(node)\n const encrypted = this.writeCipher.encryptWithAd(new Uint8Array(0), encodedNode)\n\n // Formata o frame com 3 bytes de tamanho (Big Endian)\n const length = encrypted.length\n const frame = new Uint8Array(3 + length)\n frame[0] = (length >> 16) & 0xff\n frame[1] = (length >> 8) & 0xff\n frame[2] = length & 0xff\n frame.set(encrypted, 3)\n\n this.sendRaw(frame)\n }\n\n private sendRaw(data: Uint8Array): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('Cannot send raw data: WebSocket is not open')\n }\n this.ws.send(data)\n }\n\n private startKeepAlive(): void {\n this.stopKeepAlive()\n this.pingInterval = setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.ping()\n }\n }, this.config.keepAliveIntervalMs)\n }\n\n private stopKeepAlive(): void {\n if (this.pingInterval) {\n clearInterval(this.pingInterval)\n this.pingInterval = null\n }\n }\n\n private cleanup(): void {\n this.stopKeepAlive()\n this.isHandshakeComplete = false\n this.writeCipher = null\n this.readCipher = null\n this.noise = null\n if (this.ws) {\n this.ws.removeAllListeners()\n this.ws = null\n }\n }\n\n disconnect(): void {\n this.cleanup()\n this.updateConnection({ connection: 'close' })\n }\n}\n","import { EventEmitter } from 'events'\nimport { WhatsAppSocket } from '../socket/index.js'\nimport { SignalEngine } from '../signal/index.js'\nimport { BinaryProtocol } from '../binary/index.js'\nimport { MessageBuilder, type AnyMessageContent, type MessageOptions } from '../messages/index.js'\nimport { useSecureAuthState } from '../auth/index.js'\nimport type { SocketConfig, AuthenticationState, ConnectionUpdate, BinaryNode } from '../types/index.js'\n\nexport interface ClientEvents {\n 'connection.update': (update: ConnectionUpdate) => void\n 'messages.upsert': (messages: unknown) => void\n 'creds.update': () => void\n}\n\n/**\n * Cliente principal da biblioteca CDWA\n */\nexport class WhatsAppClient extends EventEmitter {\n public socket: WhatsAppSocket\n public auth: AuthenticationState | null = null\n public signal: SignalEngine | null = null\n public readonly config: SocketConfig\n\n constructor(config: SocketConfig = {}) {\n super()\n this.config = config\n this.socket = new WhatsAppSocket(config)\n\n if (config.auth) {\n this.setAuthState(config.auth)\n }\n\n this.setupListeners()\n }\n\n public setAuthState(auth: AuthenticationState) {\n this.auth = auth\n this.signal = new SignalEngine(auth.keys)\n }\n\n private setupListeners() {\n this.socket.on('connection.update', (update: ConnectionUpdate) => {\n this.emit('connection.update', update)\n })\n\n this.socket.on('handshake.complete', () => {\n this.onHandshakeComplete()\n })\n\n this.socket.on('node', (node: BinaryNode) => {\n this.handleIncomingNode(node)\n })\n\n this.socket.on('error', (err: Error) => {\n this.emit('error', err)\n })\n }\n\n /**\n * Disparado após a conexão criptografada (Noise) estar pronta\n */\n private async onHandshakeComplete() {\n if (!this.auth) {\n return\n }\n\n // Se o cliente ainda não tem conta vinculada, inicia o fluxo de pareamento com QR Code\n if (!this.auth.creds.me) {\n await this.requestPairingCode()\n } else {\n // Já autenticado: emite status de conexão aberta\n this.emit('connection.update', { connection: 'open', isNewLogin: false })\n }\n }\n\n /**\n * Envia stanza solicitando o QR Code de pareamento\n */\n private async requestPairingCode() {\n if (!this.auth) return\n\n const pairNode = BinaryProtocol.createNode(\n 'iq',\n {\n to: 's.whatsapp.net',\n type: 'set',\n xmlns: 'pair-device',\n id: `pair-${Date.now()}`,\n },\n [\n BinaryProtocol.createNode('pair-device', {}, [\n BinaryProtocol.createNode('ref', {}, undefined),\n ]),\n ]\n )\n\n this.socket.sendNode(pairNode)\n }\n\n /**\n * Processa stanzas recebidas do WhatsApp\n */\n private handleIncomingNode(node: BinaryNode) {\n this.emit('raw.node', node)\n\n // Trata resposta de pareamento (QR Code)\n if (node.tag === 'iq' && node.attrs.type === 'result') {\n const pairDevice = BinaryProtocol.getChildNode(node, 'pair-device')\n if (pairDevice) {\n const refNode = BinaryProtocol.getChildNode(pairDevice, 'ref')\n if (refNode && typeof refNode.content === 'string' && this.auth) {\n const ref = refNode.content\n const pubKey = Buffer.from(this.auth.creds.signedIdentityKey.public).toString('base64')\n const noisePub = Buffer.from(this.auth.creds.noiseKey.public).toString('base64')\n \n // Formato padrão do QR Code do WhatsApp Web: ref,noisePublicKey,identityPublicKey,advSecretKey\n const qrString = `${ref},${noisePub},${pubKey},${this.auth.creds.advSecretKey}`\n this.emit('connection.update', { qr: qrString })\n }\n }\n }\n\n // Trata sucesso de pareamento\n if (node.tag === 'iq' && node.attrs.xmlns === 'pair-success') {\n this.emit('connection.update', { connection: 'open', isNewLogin: true })\n }\n\n // Trata mensagens recebidas\n if (node.tag === 'message') {\n this.emit('messages.upsert', { node })\n }\n }\n\n /**\n * Inicia o fluxo de conexão com o WhatsApp Web\n */\n async connect(): Promise<void> {\n if (!this.auth) {\n throw new Error('AuthenticationState must be provided before calling connect()')\n }\n await this.socket.connect(this.auth.creds.noiseKey)\n }\n\n /**\n * Envia qualquer tipo de mensagem (Texto, Imagem, Vídeo, Áudio, Localização, Contato, Reação)\n */\n async sendMessage(\n jid: string,\n content: AnyMessageContent | string,\n options: MessageOptions = {}\n ): Promise<{ messageId: string }> {\n const normalizedContent: AnyMessageContent =\n typeof content === 'string' ? { text: content } : content\n\n const { node, messageId } = await MessageBuilder.buildMessageNode(\n jid,\n normalizedContent,\n options\n )\n\n this.socket.sendNode(node)\n return { messageId }\n }\n\n /**\n * Encerra a conexão\n */\n disconnect(): void {\n this.socket.disconnect()\n }\n}\n\n/**\n * Factory function para inicialização ergonômica estilo Baileys: `makeWASocket`\n */\nexport function makeWASocket(config: SocketConfig = {}): WhatsAppClient {\n return new WhatsAppClient(config)\n}\n\nexport { useSecureAuthState }\n"]}