Merge pull request #129 from rsalcara/claude/fix-top-level-await-PouTE

fix: replace static whatsapp-rust-bridge imports with lazy dynamic lo…
This commit is contained in:
Renato Alcara
2026-02-08 23:41:51 -03:00
committed by GitHub
5 changed files with 46 additions and 5 deletions
+2 -2
View File
@@ -19,7 +19,7 @@ import {
type MessageLabelAssociation
} from '../Types/LabelAssociation'
import { type BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, isJidGroup, jidNormalizedUser } from '../WABinary'
import { expandAppStateKeys } from 'whatsapp-rust-bridge'
import { expandAppStateKeys } from './wasm-bridge'
import { aesDecrypt, aesEncrypt, hmacSign } from './crypto'
import { toNumber } from './generics'
import type { ILogger } from './logger'
@@ -102,7 +102,7 @@ const makeLtHashGenerator = ({ indexValueMap, hash }: Pick<LTHashState, 'hash' |
}
},
finish: () => {
const result = LT_HASH_ANTI_TAMPERING.subtractThenAdd(new Uint8Array(hash), addBuffs, subBuffs)
const result = LT_HASH_ANTI_TAMPERING().subtractThenAdd(new Uint8Array(hash), addBuffs, subBuffs)
return {
hash: Buffer.from(result),
+1 -1
View File
@@ -118,7 +118,7 @@ export function sha256(buffer: Buffer) {
return createHash('sha256').update(buffer).digest()
}
export { hkdf, md5 } from 'whatsapp-rust-bridge'
export { hkdf, md5 } from './wasm-bridge'
export async function derivePairingCodeKey(pairingCode: string, salt: Buffer): Promise<Buffer> {
// Convert inputs to formats Web Crypto API can work with
+1
View File
@@ -9,6 +9,7 @@ export * from './noise-handler'
export * from './history'
export * from './chat-utils'
export * from './lt-hash'
export { wasmBridgeReady } from './wasm-bridge'
export * from './auth-utils'
export * from './use-multi-file-auth-state'
export * from './link-preview'
+2 -2
View File
@@ -1,3 +1,3 @@
import { LTHashAntiTampering } from 'whatsapp-rust-bridge'
import { getLTHashAntiTampering } from './wasm-bridge'
export const LT_HASH_ANTI_TAMPERING = new LTHashAntiTampering()
export { getLTHashAntiTampering as LT_HASH_ANTI_TAMPERING }
+40
View File
@@ -0,0 +1,40 @@
type WasmBridgeModule = typeof import('whatsapp-rust-bridge')
let _bridge: WasmBridgeModule | undefined
// Start loading eagerly using .then() instead of top-level await.
// This prevents the whatsapp-rust-bridge top-level await from propagating
// through the ESM graph, which would break CJS require() consumers.
const _bridgeReady = import('whatsapp-rust-bridge').then(m => {
_bridge = m
return m
})
export { _bridgeReady as wasmBridgeReady }
function getBridge(): WasmBridgeModule {
if (!_bridge) {
throw new Error(
'whatsapp-rust-bridge not yet loaded. ' +
'Ensure async operations have started before calling crypto functions.'
)
}
return _bridge
}
export const hkdf: WasmBridgeModule['hkdf'] = (...args) => getBridge().hkdf(...args)
export const md5: WasmBridgeModule['md5'] = (...args) => getBridge().md5(...args)
export const expandAppStateKeys: WasmBridgeModule['expandAppStateKeys'] = (...args) => getBridge().expandAppStateKeys(...args)
let _ltHash: InstanceType<WasmBridgeModule['LTHashAntiTampering']> | undefined
export function getLTHashAntiTampering(): InstanceType<WasmBridgeModule['LTHashAntiTampering']> {
if (!_ltHash) {
_ltHash = new (getBridge().LTHashAntiTampering)()
}
return _ltHash
}