Addresses 2 review comments on PR #385:
1. CodeRabbit Major — longToString/longToNumber checked
`value.high < 0` on the raw input. When a Long-like object carries
high as an unsigned 32-bit value (e.g. raw {low, high} from JSON
deserialization, not constructed via Long.fromBits/fromValue which
normalize via `| 0`), the sign-bit detection fails and the value is
interpreted as unsigned. Example: {low: 0, high: 0xFFFFFFFF} signed
should be -4294967296 but returned 18446744069414584320.
Fix: `const high = value.high | 0` before the sign check. Applied
to both helpers in WAProto/index.js (generated artifact) and
WAProto/fix-imports.js (template). Diverges from upstream Baileys
PR #2333 which has the same latent bug.
Added 2 test cases in bigint-validation.test.ts for the raw
{low, high} scenario (Long.fromBits would mask the bug because it
normalizes internally).
2. CodeRabbit Nitpick — the encode/decode roundtrip test in
proto-tojson-long.test.ts used safe integers (1700000000 and
123456789), which would silently pass even if longToString fell
back to Number(value). Switched to uint64 values above
MAX_SAFE_INTEGER (max uint64 and 9999999999999999999) so the
roundtrip actually exercises the BigInt fast path.
Test suite: 789/789 passing (+2 cases for the unsigned-high scenario).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aligns with Baileys upstream PR #2333 (jlucaso1). Surgical port of
4 micro-optimizations + 2 test files. No collision with InfiniteAPI's
LID/PN, carousel, buttons, Bad MAC or app state sync resilience code.
Changes:
1. WAProto longToString/longToNumber: use native BigInt instead of
Long library division loops. ~4.6x faster per call (237ns -> 52ns).
BigInt.toString() delegates to V8 native C++. Same change applied
to fix-imports.js (template) and index.js (generated artifact) so
future regenerations stay in sync.
2. downloadHistory: stream-pipe createInflate instead of buffering
the full compressed payload then inflating. Cuts RSS peak ~50%
on 50MB history payloads.
3. processHistoryMessage: drop the { ...chat } shallow copy before
pushing to chats[]. The decoded protobuf object is not referenced
after the push.
4. downloadEncryptedContent transform: skip Buffer.concat when
remainingBytes is empty (the common case — chunks usually arrive
AES-aligned). ~19x faster per chunk (78ms -> 4ms over 25k chunks).
Tests:
- bigint-validation.test.ts (NEW): 32 parameterized cases covering
zero, MAX_SAFE_INTEGER boundary, max int64/uint64, negative values,
tricky bit patterns and powers of 2; plus 200-iter fuzz comparing
old Long vs new BigInt implementations for equivalence.
- proto-tojson-long.test.ts: kept the existing fork-only test for
string-in-Long-field graceful handling, appended 4 upstream tests
covering Long->string fast path, large unsigned > MAX_SAFE_INTEGER,
zero/small values and encode/decode roundtrip.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: add patch-tojson functionality for improved proto serialization
* Remove patch-tojson functionality and its import from the main index file to streamline the codebase.
* refactor: simplify longToString and longToNumber functions for better readability and performance