@oxidezap/baileyrs 0.0.7 → 0.0.9

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 (167) hide show
  1. package/README.md +119 -5
  2. package/lib/Bridge/__tests__/adapt.test.d.ts +2 -0
  3. package/lib/Bridge/__tests__/adapt.test.d.ts.map +1 -0
  4. package/lib/Bridge/__tests__/adapt.test.js +355 -0
  5. package/lib/Bridge/__tests__/adapt.test.js.map +1 -0
  6. package/lib/Bridge/__tests__/dts-drift.test.d.ts +13 -0
  7. package/lib/Bridge/__tests__/dts-drift.test.d.ts.map +1 -0
  8. package/lib/Bridge/__tests__/dts-drift.test.js +92 -0
  9. package/lib/Bridge/__tests__/dts-drift.test.js.map +1 -0
  10. package/lib/Bridge/__tests__/fixtures.d.ts +192 -0
  11. package/lib/Bridge/__tests__/fixtures.d.ts.map +1 -0
  12. package/lib/Bridge/__tests__/fixtures.js +99 -0
  13. package/lib/Bridge/__tests__/fixtures.js.map +1 -0
  14. package/lib/Bridge/adapt.d.ts +28 -0
  15. package/lib/Bridge/adapt.d.ts.map +1 -0
  16. package/lib/Bridge/adapt.js +504 -0
  17. package/lib/Bridge/adapt.js.map +1 -0
  18. package/lib/Bridge/index.d.ts +12 -0
  19. package/lib/Bridge/index.d.ts.map +1 -0
  20. package/lib/Bridge/index.js +12 -0
  21. package/lib/Bridge/index.js.map +1 -0
  22. package/lib/Bridge/primitives.d.ts +56 -0
  23. package/lib/Bridge/primitives.d.ts.map +1 -0
  24. package/lib/Bridge/primitives.js +58 -0
  25. package/lib/Bridge/primitives.js.map +1 -0
  26. package/lib/Bridge/types.d.ts +273 -0
  27. package/lib/Bridge/types.d.ts.map +1 -0
  28. package/lib/Bridge/types.js +17 -0
  29. package/lib/Bridge/types.js.map +1 -0
  30. package/lib/Defaults/index.d.ts.map +1 -1
  31. package/lib/Defaults/index.js +2 -2
  32. package/lib/Defaults/index.js.map +1 -1
  33. package/lib/Socket/blocking.d.ts.map +1 -1
  34. package/lib/Socket/chat-actions.d.ts.map +1 -1
  35. package/lib/Socket/contacts.d.ts +9 -4
  36. package/lib/Socket/contacts.d.ts.map +1 -1
  37. package/lib/Socket/contacts.js +11 -8
  38. package/lib/Socket/contacts.js.map +1 -1
  39. package/lib/Socket/events.d.ts +7 -1
  40. package/lib/Socket/events.d.ts.map +1 -1
  41. package/lib/Socket/events.js +212 -243
  42. package/lib/Socket/events.js.map +1 -1
  43. package/lib/Socket/group-notifications.d.ts +25 -0
  44. package/lib/Socket/group-notifications.d.ts.map +1 -0
  45. package/lib/Socket/group-notifications.js +162 -0
  46. package/lib/Socket/group-notifications.js.map +1 -0
  47. package/lib/Socket/groups.d.ts +12 -1
  48. package/lib/Socket/groups.d.ts.map +1 -1
  49. package/lib/Socket/groups.js +44 -1
  50. package/lib/Socket/groups.js.map +1 -1
  51. package/lib/Socket/index.d.ts +47 -13
  52. package/lib/Socket/index.d.ts.map +1 -1
  53. package/lib/Socket/index.js +158 -24
  54. package/lib/Socket/index.js.map +1 -1
  55. package/lib/Socket/messages.d.ts +5 -2
  56. package/lib/Socket/messages.d.ts.map +1 -1
  57. package/lib/Socket/messages.js +42 -21
  58. package/lib/Socket/messages.js.map +1 -1
  59. package/lib/Socket/newsletter.d.ts.map +1 -1
  60. package/lib/Socket/presence.d.ts.map +1 -1
  61. package/lib/Socket/profile.d.ts +7 -1
  62. package/lib/Socket/profile.d.ts.map +1 -1
  63. package/lib/Socket/profile.js +20 -5
  64. package/lib/Socket/profile.js.map +1 -1
  65. package/lib/Socket/transport.d.ts.map +1 -1
  66. package/lib/Socket/transport.js +14 -13
  67. package/lib/Socket/transport.js.map +1 -1
  68. package/lib/Socket/types.d.ts.map +1 -1
  69. package/lib/Types/Auth.d.ts +1 -1
  70. package/lib/Types/Auth.d.ts.map +1 -1
  71. package/lib/Types/Bussines.d.ts +1 -1
  72. package/lib/Types/Bussines.d.ts.map +1 -1
  73. package/lib/Types/Chat.d.ts +1 -1
  74. package/lib/Types/Chat.d.ts.map +1 -1
  75. package/lib/Types/Events.d.ts +12 -3
  76. package/lib/Types/Events.d.ts.map +1 -1
  77. package/lib/Types/Events.js +1 -1
  78. package/lib/Types/Events.js.map +1 -1
  79. package/lib/Types/GroupMetadata.d.ts.map +1 -1
  80. package/lib/Types/Message.d.ts +16 -1
  81. package/lib/Types/Message.d.ts.map +1 -1
  82. package/lib/Types/Message.js +1 -1
  83. package/lib/Types/Message.js.map +1 -1
  84. package/lib/Types/Socket.d.ts +42 -1
  85. package/lib/Types/Socket.d.ts.map +1 -1
  86. package/lib/Types/State.d.ts +1 -1
  87. package/lib/Types/State.d.ts.map +1 -1
  88. package/lib/Types/index.d.ts +1 -1
  89. package/lib/Types/index.d.ts.map +1 -1
  90. package/lib/Types/index.js +17 -12
  91. package/lib/Types/index.js.map +1 -1
  92. package/lib/Utils/__tests__/_legacy-store-fixtures.d.ts +65 -0
  93. package/lib/Utils/__tests__/_legacy-store-fixtures.d.ts.map +1 -0
  94. package/lib/Utils/__tests__/_legacy-store-fixtures.js +107 -0
  95. package/lib/Utils/__tests__/_legacy-store-fixtures.js.map +1 -0
  96. package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.d.ts +10 -0
  97. package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.d.ts.map +1 -0
  98. package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.js +298 -0
  99. package/lib/Utils/__tests__/wrap-legacy-store-coverage.test.js.map +1 -0
  100. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts +8 -0
  101. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts.map +1 -0
  102. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js +91 -0
  103. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js.map +1 -0
  104. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts +10 -0
  105. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts.map +1 -0
  106. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js +126 -0
  107. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js.map +1 -0
  108. package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts +14 -0
  109. package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts.map +1 -0
  110. package/lib/Utils/__tests__/wrap-legacy-store-session.test.js +309 -0
  111. package/lib/Utils/__tests__/wrap-legacy-store-session.test.js.map +1 -0
  112. package/lib/Utils/boom.d.ts +33 -0
  113. package/lib/Utils/boom.d.ts.map +1 -0
  114. package/lib/Utils/boom.js +63 -0
  115. package/lib/Utils/boom.js.map +1 -0
  116. package/lib/Utils/browser-utils.d.ts.map +1 -1
  117. package/lib/Utils/event-buffer.d.ts.map +1 -1
  118. package/lib/Utils/generics.d.ts +37 -1
  119. package/lib/Utils/generics.d.ts.map +1 -1
  120. package/lib/Utils/generics.js +60 -2
  121. package/lib/Utils/generics.js.map +1 -1
  122. package/lib/Utils/index.d.ts +1 -0
  123. package/lib/Utils/index.d.ts.map +1 -1
  124. package/lib/Utils/index.js +10 -9
  125. package/lib/Utils/index.js.map +1 -1
  126. package/lib/Utils/lid-mapping-store.d.ts +81 -0
  127. package/lib/Utils/lid-mapping-store.d.ts.map +1 -0
  128. package/lib/Utils/lid-mapping-store.js +126 -0
  129. package/lib/Utils/lid-mapping-store.js.map +1 -0
  130. package/lib/Utils/logger.d.ts.map +1 -1
  131. package/lib/Utils/logger.js +25 -1
  132. package/lib/Utils/logger.js.map +1 -1
  133. package/lib/Utils/messages-media.d.ts.map +1 -1
  134. package/lib/Utils/messages-media.js +1 -1
  135. package/lib/Utils/messages-media.js.map +1 -1
  136. package/lib/Utils/messages.d.ts +30 -1
  137. package/lib/Utils/messages.d.ts.map +1 -1
  138. package/lib/Utils/messages.js +115 -41
  139. package/lib/Utils/messages.js.map +1 -1
  140. package/lib/Utils/native-crypto-provider.d.ts +18 -0
  141. package/lib/Utils/native-crypto-provider.d.ts.map +1 -0
  142. package/lib/Utils/native-crypto-provider.js +67 -0
  143. package/lib/Utils/native-crypto-provider.js.map +1 -0
  144. package/lib/Utils/use-bridge-store.d.ts.map +1 -1
  145. package/lib/Utils/use-memory-store.d.ts.map +1 -1
  146. package/lib/Utils/use-memory-store.js +1 -1
  147. package/lib/Utils/use-memory-store.js.map +1 -1
  148. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
  149. package/lib/Utils/use-multi-file-auth-state.js +1 -1
  150. package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
  151. package/lib/Utils/wrap-legacy-store.d.ts.map +1 -1
  152. package/lib/Utils/wrap-legacy-store.js +505 -42
  153. package/lib/Utils/wrap-legacy-store.js.map +1 -1
  154. package/lib/WABinary/index.d.ts.map +1 -1
  155. package/lib/WABinary/index.js +1 -1
  156. package/lib/WABinary/index.js.map +1 -1
  157. package/lib/__tests__/expect.d.ts +30 -0
  158. package/lib/__tests__/expect.d.ts.map +1 -0
  159. package/lib/__tests__/expect.js +60 -0
  160. package/lib/__tests__/expect.js.map +1 -0
  161. package/lib/index.d.ts +1 -1
  162. package/lib/index.d.ts.map +1 -1
  163. package/lib/index.js +9 -6
  164. package/lib/index.js.map +1 -1
  165. package/package.json +33 -25
  166. package/WAProto/index.d.ts +0 -13875
  167. package/WAProto/index.js +0 -175
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Shared fixtures for `wrap-legacy-store` unit tests. The 4 sister test
3
+ * files (sender-key / session / lid-mapping / coverage) all need the same
4
+ * in-memory keys store + wrapped-store factory + byte-pattern generator.
5
+ */
6
+ import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
7
+ import { initAuthCreds } from "../generics.js";
8
+ import { wrapLegacyStore } from "../wrap-legacy-store.js";
9
+ /** In-memory keys store mirroring upstream `useMultiFileAuthState`'s
10
+ * `keys.get(type, ids[])` / `keys.set({ [type]: { [id]: value } })`. */
11
+ export function makeMemKeys() {
12
+ const data = {};
13
+ return {
14
+ raw: data,
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors upstream surface
16
+ async get(type, ids) {
17
+ const bucket = data[type] ?? {};
18
+ const out = {};
19
+ for (const id of ids)
20
+ out[id] = bucket[id] ?? null;
21
+ return out;
22
+ },
23
+ async set(updates) {
24
+ for (const [type, bucket] of Object.entries(updates)) {
25
+ data[type] ?? (data[type] = {});
26
+ for (const [id, val] of Object.entries(bucket)) {
27
+ if (val === null || val === undefined)
28
+ delete data[type][id];
29
+ else
30
+ data[type][id] = val;
31
+ }
32
+ }
33
+ }
34
+ };
35
+ }
36
+ /** Build a wrap-legacy-store wired to a fresh in-memory keys backend. */
37
+ export async function makeWrapped() {
38
+ const creds = initAuthCreds();
39
+ const keys = makeMemKeys();
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal AuthenticationState surface
41
+ const wrapped = await wrapLegacyStore({ creds, keys: keys }, async () => { });
42
+ return { wrapped, keys, creds };
43
+ }
44
+ /** Deterministic byte-pattern generator. Distinct `(n, base)` pairs yield
45
+ * distinct buffers, so we can pinpoint which field round-tripped wrong. */
46
+ export const fill = (n, base) => new Uint8Array(n).map((_, i) => (i * base + base) & 0xff);
47
+ // ── Common LID/PN sample pairs ──
48
+ export const SAMPLE_GROUP = '120363012345678900@g.us';
49
+ // LID sender, no JID device (matches the mock server's default).
50
+ export const BRIDGE_SK_KEY_LID = `${SAMPLE_GROUP}:100000037037034@lid.0`;
51
+ export const UPSTREAM_SK_KEY_LID = `${SAMPLE_GROUP}::100000037037034_1::0`;
52
+ // PN sender on s.whatsapp.net with a JID device → exercises `user:device@server`.
53
+ export const BRIDGE_SK_KEY_PN_DEV = `${SAMPLE_GROUP}:559980000003:5@s.whatsapp.net.0`;
54
+ export const UPSTREAM_SK_KEY_PN_DEV = `${SAMPLE_GROUP}::559980000003::5`;
55
+ // Session keys (pairwise, no group prefix).
56
+ export const BRIDGE_SESSION_KEY_LID = '100000037037034@lid.0';
57
+ export const UPSTREAM_SESSION_KEY_LID = '100000037037034_1.0';
58
+ export const BRIDGE_SESSION_KEY_PN = '559980000003@s.whatsapp.net.0';
59
+ export const UPSTREAM_SESSION_KEY_PN = '559980000003.0';
60
+ export const BRIDGE_SESSION_KEY_PN_DEV = '559980000003:5@s.whatsapp.net.0';
61
+ export const UPSTREAM_SESSION_KEY_PN_DEV = '559980000003.5';
62
+ /** Encode a `SenderKeyRecordStructure` with one populated state. */
63
+ export function buildBridgeSenderKeyBytes(opts = {}) {
64
+ const { keyId = 1, iteration = 0, chainSeed = fill(32, 1), signingPublic = fill(33, 2), signingPrivate = fill(32, 3) } = opts;
65
+ return bridgeProto.SenderKeyRecordStructure.encode(bridgeProto.SenderKeyRecordStructure.create({
66
+ senderKeyStates: [
67
+ {
68
+ senderKeyId: keyId,
69
+ senderChainKey: { iteration, seed: chainSeed },
70
+ senderSigningKey: { public: signingPublic, private: signingPrivate },
71
+ senderMessageKeys: []
72
+ }
73
+ ]
74
+ })).finish();
75
+ }
76
+ /** Encode a `RecordStructure` with a single established `currentSession`
77
+ * (sender chain + one receiver chain). */
78
+ export function buildBridgeSessionBytes(opts = {}) {
79
+ const { rootKey = fill(32, opts.rootSeed ?? 1), previousCounter = 0, senderRatchetPub = fill(33, 2), senderRatchetPriv = fill(32, 3), senderChainKey = fill(32, 4), senderChainIndex = 0, receiverRatchetPub = fill(33, 5), receiverChainKey = fill(32, 6), receiverChainIndex = 1, aliceBaseKey = fill(33, 7), remoteIdentity = fill(33, 8), remoteRegistrationId = 1234, localRegistrationId = 5678 } = opts;
80
+ return bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
81
+ currentSession: bridgeProto.SessionStructure.create({
82
+ sessionVersion: 3,
83
+ localIdentityPublic: fill(33, 9),
84
+ remoteIdentityPublic: remoteIdentity,
85
+ rootKey,
86
+ previousCounter,
87
+ senderChain: {
88
+ senderRatchetKey: senderRatchetPub,
89
+ senderRatchetKeyPrivate: senderRatchetPriv,
90
+ chainKey: { index: senderChainIndex, key: senderChainKey },
91
+ messageKeys: []
92
+ },
93
+ receiverChains: [
94
+ {
95
+ senderRatchetKey: receiverRatchetPub,
96
+ chainKey: { index: receiverChainIndex, key: receiverChainKey },
97
+ messageKeys: []
98
+ }
99
+ ],
100
+ remoteRegistrationId,
101
+ localRegistrationId,
102
+ aliceBaseKey
103
+ }),
104
+ previousSessions: []
105
+ })).finish();
106
+ }
107
+ //# sourceMappingURL=_legacy-store-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_legacy-store-fixtures.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/_legacy-store-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cross-cutting `wrap-legacy-store` coverage:
3
+ * 1. Hosted JID domains (`hosted` → `_2`, `hosted.lid` → `_3`).
4
+ * 2. PreKey cross-impl (proto bytes ↔ {public, private}).
5
+ * 3. Identity cross-impl (32 bytes ↔ 33 bytes with 0x05 prefix + key rewrite).
6
+ * 4. Idempotent round-trip (write→read→write produces identical disk bytes).
7
+ * 5. messageKeys cache JS→Rust HKDF derivation (Finding 2 partial fix).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=wrap-legacy-store-coverage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-coverage.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-coverage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Cross-cutting `wrap-legacy-store` coverage:
3
+ * 1. Hosted JID domains (`hosted` → `_2`, `hosted.lid` → `_3`).
4
+ * 2. PreKey cross-impl (proto bytes ↔ {public, private}).
5
+ * 3. Identity cross-impl (32 bytes ↔ 33 bytes with 0x05 prefix + key rewrite).
6
+ * 4. Idempotent round-trip (write→read→write produces identical disk bytes).
7
+ * 5. messageKeys cache JS→Rust HKDF derivation (Finding 2 partial fix).
8
+ */
9
+ import { Buffer } from 'node:buffer';
10
+ import { createHmac } from 'node:crypto';
11
+ import { describe, test } from 'node:test';
12
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
13
+ // @ts-expect-error -- libsignal lacks .d.ts
14
+ import SessionRecord from 'libsignal/src/session_record.js';
15
+ import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
16
+ import { expect } from "../../__tests__/expect.js";
17
+ import { BRIDGE_SESSION_KEY_LID, SAMPLE_GROUP, UPSTREAM_SESSION_KEY_LID, buildBridgeSenderKeyBytes, buildBridgeSessionBytes, fill, makeWrapped } from "./_legacy-store-fixtures.js";
18
+ // ── 1. Hosted JID domains ───────────────────────────────────────────────
19
+ describe('wrap-legacy-store: hosted JID domain coverage', () => {
20
+ test('hosted (domainType=2): sender_key key gets `_2` suffix', async () => {
21
+ const { wrapped, keys } = await makeWrapped();
22
+ const bridgeKey = `${SAMPLE_GROUP}:5599800000@hosted.0`;
23
+ const expected = `${SAMPLE_GROUP}::5599800000_2::0`;
24
+ await wrapped.set('sender_key', bridgeKey, buildBridgeSenderKeyBytes());
25
+ expect(keys.raw['sender-key']?.[expected]).toBeDefined();
26
+ });
27
+ test('hosted.lid (domainType=3): sender_key key gets `_3` suffix', async () => {
28
+ const { wrapped, keys } = await makeWrapped();
29
+ const bridgeKey = `${SAMPLE_GROUP}:100000037037034@hosted.lid.0`;
30
+ const expected = `${SAMPLE_GROUP}::100000037037034_3::0`;
31
+ await wrapped.set('sender_key', bridgeKey, buildBridgeSenderKeyBytes());
32
+ expect(keys.raw['sender-key']?.[expected]).toBeDefined();
33
+ });
34
+ test('hosted: session key uses JID device suffix (not signal device)', async () => {
35
+ const { wrapped, keys } = await makeWrapped();
36
+ await wrapped.set('session', '5599800000:7@hosted.0', buildBridgeSessionBytes());
37
+ expect(keys.raw['session']?.['5599800000_2.7']).toBeDefined();
38
+ });
39
+ test('hosted.lid: identity round-trips (32 → 33 bytes + key rewrite)', async () => {
40
+ const { wrapped, keys } = await makeWrapped();
41
+ const raw32 = fill(32, 0xab);
42
+ await wrapped.set('identity', '100000037037034@hosted.lid.0', raw32);
43
+ const stored = keys.raw['identity-key']?.['100000037037034_3.0'];
44
+ expect(stored.length).toBe(33);
45
+ expect(stored[0]).toBe(0x05);
46
+ expect(stored.subarray(1).equals(Buffer.from(raw32))).toBe(true);
47
+ });
48
+ });
49
+ // ── 2. PreKey cross-impl ────────────────────────────────────────────────
50
+ describe('wrap-legacy-store: prekey cross-impl', () => {
51
+ test('upstream {public, private} → bridge GET returns proto bytes', async () => {
52
+ const { wrapped, keys } = await makeWrapped();
53
+ const pub = Buffer.from(fill(33, 0x10));
54
+ const priv = Buffer.from(fill(32, 0x20));
55
+ keys.raw['pre-key'] = { '42': { public: pub, private: priv } };
56
+ const out = (await wrapped.get('prekey', '42'));
57
+ // 33 + 32 + ~6 bytes proto overhead.
58
+ expect(out.length).toBeGreaterThan(60);
59
+ });
60
+ test('bridge proto bytes → upstream {public, private} on disk', async () => {
61
+ const { wrapped, keys } = await makeWrapped();
62
+ const pub = Buffer.from(fill(33, 0x10));
63
+ const priv = Buffer.from(fill(32, 0x20));
64
+ keys.raw['pre-key'] = { '42': { public: pub, private: priv } };
65
+ const protoBytes = (await wrapped.get('prekey', '42'));
66
+ keys.raw['pre-key'] = {};
67
+ await wrapped.set('prekey', '42', protoBytes);
68
+ const stored = keys.raw['pre-key']?.['42'];
69
+ expect(Buffer.from(stored.public).equals(pub)).toBe(true);
70
+ expect(Buffer.from(stored.private).equals(priv)).toBe(true);
71
+ });
72
+ });
73
+ // ── 3. Identity cross-impl ──────────────────────────────────────────────
74
+ describe('wrap-legacy-store: identity cross-impl', () => {
75
+ test('bridge SET 32-byte → upstream-side 33-byte under signalUser key', async () => {
76
+ const { wrapped, keys } = await makeWrapped();
77
+ const raw32 = fill(32, 0xc0);
78
+ await wrapped.set('identity', '559980000003@s.whatsapp.net.0', raw32);
79
+ const stored = keys.raw['identity-key']?.['559980000003.0'];
80
+ expect(stored.length).toBe(33);
81
+ expect(stored[0]).toBe(0x05);
82
+ expect(stored.subarray(1).equals(Buffer.from(raw32))).toBe(true);
83
+ expect(keys.raw['identity-key']?.['559980000003@s.whatsapp.net.0']).toBeUndefined();
84
+ });
85
+ test('upstream 33-byte → bridge GET returns 32-byte (prefix stripped)', async () => {
86
+ const { wrapped, keys } = await makeWrapped();
87
+ const raw32 = fill(32, 0xd0);
88
+ keys.raw['identity-key'] = { '559980000003.0': Buffer.concat([Buffer.from([0x05]), Buffer.from(raw32)]) };
89
+ const out = (await wrapped.get('identity', '559980000003@s.whatsapp.net.0'));
90
+ expect(out.length).toBe(32);
91
+ expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
92
+ });
93
+ test('LID identity round-trip preserves byte-for-byte', async () => {
94
+ const { wrapped, keys } = await makeWrapped();
95
+ const raw32 = fill(32, 0xe0);
96
+ await wrapped.set('identity', '100000037037034@lid.0', raw32);
97
+ expect(keys.raw['identity-key']?.['100000037037034_1.0']).toBeDefined();
98
+ const out = (await wrapped.get('identity', '100000037037034@lid.0'));
99
+ expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
100
+ });
101
+ });
102
+ // ── 4. Idempotent round-trip ────────────────────────────────────────────
103
+ describe('wrap-legacy-store: idempotent round-trip', () => {
104
+ test('sender_key: SET → GET → SET produces identical disk bytes', async () => {
105
+ const { wrapped, keys } = await makeWrapped();
106
+ const original = buildBridgeSenderKeyBytes({ keyId: 17, iteration: 5 });
107
+ const upstreamKey = `${SAMPLE_GROUP}::100000037037034_1::0`;
108
+ const bridgeKey = `${SAMPLE_GROUP}:100000037037034@lid.0`;
109
+ await wrapped.set('sender_key', bridgeKey, original);
110
+ const first = keys.raw['sender-key']?.[upstreamKey];
111
+ const back = (await wrapped.get('sender_key', bridgeKey));
112
+ await wrapped.set('sender_key', bridgeKey, back);
113
+ const second = keys.raw['sender-key']?.[upstreamKey];
114
+ expect(Buffer.compare(first, second)).toBe(0);
115
+ });
116
+ test('session: SET → GET → SET preserves baseKey set + open-status + identity', async () => {
117
+ const { wrapped, keys } = await makeWrapped();
118
+ const aliceBaseKey = Buffer.from(fill(33, 0x70));
119
+ const original = buildBridgeSessionBytes({ rootSeed: 11, aliceBaseKey: new Uint8Array(aliceBaseKey) });
120
+ await wrapped.set('session', BRIDGE_SESSION_KEY_LID, original);
121
+ const stored1 = keys.raw['session']?.[UPSTREAM_SESSION_KEY_LID];
122
+ // eslint-disable-next-line unicorn/no-array-sort, eslint-plugin-unicorn/no-useless-spread
123
+ const baseKeys1 = Object.keys(stored1._sessions).slice().sort();
124
+ const back = (await wrapped.get('session', BRIDGE_SESSION_KEY_LID));
125
+ await wrapped.set('session', BRIDGE_SESSION_KEY_LID, back);
126
+ const stored2 = keys.raw['session']?.[UPSTREAM_SESSION_KEY_LID];
127
+ // eslint-disable-next-line unicorn/no-array-sort
128
+ const baseKeys2 = Object.keys(stored2._sessions).slice().sort();
129
+ expect(baseKeys2).toEqual(baseKeys1);
130
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
+ const rec = SessionRecord.deserialize(stored2);
132
+ expect(rec.haveOpenSession()).toBe(true);
133
+ expect(Buffer.from(rec.getOpenSession().indexInfo.baseKey).equals(aliceBaseKey)).toBe(true);
134
+ });
135
+ test('identity: SET → GET → SET produces byte-identical upstream blob', async () => {
136
+ const { wrapped, keys } = await makeWrapped();
137
+ const raw32 = fill(32, 0x55);
138
+ await wrapped.set('identity', '100000037037034@lid.0', raw32);
139
+ const first = keys.raw['identity-key']?.['100000037037034_1.0'];
140
+ const back = (await wrapped.get('identity', '100000037037034@lid.0'));
141
+ await wrapped.set('identity', '100000037037034@lid.0', back);
142
+ const second = keys.raw['identity-key']?.['100000037037034_1.0'];
143
+ expect(Buffer.compare(first, second)).toBe(0);
144
+ });
145
+ });
146
+ // ── 5. Sender key multi-state ───────────────────────────────────────────
147
+ describe('wrap-legacy-store: sender_key multi-state record', () => {
148
+ test('multiple senderKeyStates round-trip individually', async () => {
149
+ const { wrapped, keys } = await makeWrapped();
150
+ const states = [1, 2, 3].map(seed => ({
151
+ senderKeyId: seed * 100,
152
+ senderChainKey: { iteration: seed, seed: fill(32, seed * 7) },
153
+ senderSigningKey: { public: fill(33, seed * 11), private: fill(32, seed * 13) },
154
+ senderMessageKeys: []
155
+ }));
156
+ const protoBytes = bridgeProto.SenderKeyRecordStructure.encode(bridgeProto.SenderKeyRecordStructure.create({ senderKeyStates: states })).finish();
157
+ const bridgeKey = `${SAMPLE_GROUP}:100000037037034@lid.0`;
158
+ const upstreamKey = `${SAMPLE_GROUP}::100000037037034_1::0`;
159
+ await wrapped.set('sender_key', bridgeKey, protoBytes);
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ const stored = keys.raw['sender-key']?.[upstreamKey];
162
+ const json = JSON.parse(Buffer.from(stored).toString('utf-8'));
163
+ expect(json.length).toBe(3);
164
+ expect(json[0].senderKeyId).toBe(100);
165
+ expect(json[1].senderKeyId).toBe(200);
166
+ expect(json[2].senderKeyId).toBe(300);
167
+ // Read back via bridge GET — all 3 states preserved.
168
+ const protoBack = (await wrapped.get('sender_key', bridgeKey));
169
+ const decoded = bridgeProto.SenderKeyRecordStructure.decode(protoBack);
170
+ expect(decoded.senderKeyStates.length).toBe(3);
171
+ // eslint-disable-next-line unicorn/no-array-sort
172
+ const ids = decoded.senderKeyStates.map(s => s.senderKeyId).slice().sort((a, b) => a - b);
173
+ expect(ids).toEqual([100, 200, 300]);
174
+ });
175
+ });
176
+ // ── 6. Lid mapping edge cases ───────────────────────────────────────────
177
+ describe('wrap-legacy-store: lid_mapping edge cases', () => {
178
+ test('unknown key prefix → warns + null on read, passthrough on write', async () => {
179
+ const { wrapped, keys } = await makeWrapped();
180
+ // Bridge would never write/read like this, but verify it doesn't crash.
181
+ await wrapped.set('lid_mapping', 'weird:format', new TextEncoder().encode('value'));
182
+ // On unknown prefix, fromBridge returns Buffer.from(value) as fallback.
183
+ expect(keys.raw['lid-mapping']?.['weird:format']).toBeDefined();
184
+ });
185
+ test('empty value on read returns null', async () => {
186
+ const { wrapped, keys } = await makeWrapped();
187
+ keys.raw['lid-mapping'] = { '559980000003': '' };
188
+ const out = await wrapped.get('lid_mapping', 'pn:559980000003');
189
+ expect(out).toBe(null);
190
+ });
191
+ });
192
+ // ── 7. Identity edge cases ──────────────────────────────────────────────
193
+ describe('wrap-legacy-store: identity edge cases', () => {
194
+ test('legacy 33-byte input from bridge → stored as-is (no double-prefix)', async () => {
195
+ const { wrapped, keys } = await makeWrapped();
196
+ const raw33 = Buffer.concat([Buffer.from([0x05]), Buffer.from(fill(32, 0xab))]);
197
+ await wrapped.set('identity', '100000037037034@lid.0', raw33);
198
+ const stored = keys.raw['identity-key']?.['100000037037034_1.0'];
199
+ // Should NOT double-prefix; pass through 33-byte input verbatim.
200
+ expect(stored.length).toBe(33);
201
+ expect(stored[0]).toBe(0x05);
202
+ expect(Buffer.compare(stored, raw33)).toBe(0);
203
+ });
204
+ test('upstream 32-byte stored input → bridge GET returns 32 bytes (no strip)', async () => {
205
+ const { wrapped, keys } = await makeWrapped();
206
+ // Some legacy upstream paths might write 32-byte directly.
207
+ const raw32 = fill(32, 0xab);
208
+ keys.raw['identity-key'] = { '100000037037034_1.0': Buffer.from(raw32) };
209
+ const out = (await wrapped.get('identity', '100000037037034@lid.0'));
210
+ expect(out.length).toBe(32);
211
+ expect(Buffer.from(out).equals(Buffer.from(raw32))).toBe(true);
212
+ });
213
+ test('GET on missing identity returns null (no exception)', async () => {
214
+ const { wrapped } = await makeWrapped();
215
+ const out = await wrapped.get('identity', '999999999999@lid.0');
216
+ expect(out).toBe(null);
217
+ });
218
+ });
219
+ // ── 8. messageKeys cache derivation (JS → Rust via HKDF) ────────────────
220
+ describe('wrap-legacy-store: messageKeys JS→Rust HKDF derivation', () => {
221
+ // Reference impl matching upstream `libsignal/src/crypto.js:53` exactly.
222
+ function jsLikeDeriveSecrets(seed) {
223
+ const salt = Buffer.alloc(32);
224
+ const info = Buffer.from('WhisperMessageKeys');
225
+ const prk = createHmac('sha256', salt).update(seed).digest();
226
+ const t1 = createHmac('sha256', prk)
227
+ .update(Buffer.concat([info, Buffer.from([0x01])]))
228
+ .digest();
229
+ const t2 = createHmac('sha256', prk)
230
+ .update(Buffer.concat([t1, info, Buffer.from([0x02])]))
231
+ .digest();
232
+ const t3 = createHmac('sha256', prk)
233
+ .update(Buffer.concat([t2, info, Buffer.from([0x03])]))
234
+ .digest();
235
+ return { cipher: t1, mac: t2, iv: t3.subarray(0, 16) };
236
+ }
237
+ test('upstream messageKeys cache → bridge proto carries derived cipher/mac/iv', async () => {
238
+ const { wrapped, keys } = await makeWrapped();
239
+ const baseKey = Buffer.alloc(33, 0xa0);
240
+ const peerRatchet = Buffer.alloc(33, 0xc0);
241
+ const skipSeed3 = Buffer.alloc(32, 0xd1);
242
+ const skipSeed5 = Buffer.alloc(32, 0xd2);
243
+ keys.raw['session'] = {
244
+ [UPSTREAM_SESSION_KEY_LID]: {
245
+ _sessions: {
246
+ [baseKey.toString('base64')]: {
247
+ registrationId: 1,
248
+ currentRatchet: {
249
+ ephemeralKeyPair: {
250
+ pubKey: Buffer.alloc(33, 0xb0).toString('base64'),
251
+ privKey: Buffer.alloc(32, 0xb1).toString('base64')
252
+ },
253
+ lastRemoteEphemeralKey: peerRatchet.toString('base64'),
254
+ previousCounter: 0,
255
+ rootKey: Buffer.alloc(32, 0x01).toString('base64')
256
+ },
257
+ indexInfo: {
258
+ baseKey: baseKey.toString('base64'),
259
+ baseKeyType: 2,
260
+ closed: -1,
261
+ used: Date.now(),
262
+ created: Date.now(),
263
+ remoteIdentityKey: Buffer.alloc(33, 0x02).toString('base64')
264
+ },
265
+ _chains: {
266
+ [peerRatchet.toString('base64')]: {
267
+ chainKey: { counter: 5, key: Buffer.alloc(32, 0xc1).toString('base64') },
268
+ chainType: 2,
269
+ messageKeys: { '3': skipSeed3.toString('base64'), '5': skipSeed5.toString('base64') }
270
+ }
271
+ }
272
+ }
273
+ },
274
+ version: 'v1'
275
+ }
276
+ };
277
+ const protoOut = (await wrapped.get('session', BRIDGE_SESSION_KEY_LID));
278
+ const decoded = bridgeProto.RecordStructure.decode(protoOut);
279
+ const recv = decoded.currentSession?.receiverChains?.[0];
280
+ const mks = recv.messageKeys ?? [];
281
+ expect(mks.length).toBe(2);
282
+ // Derived split MUST match HKDF reference exactly. If Rust libsignal
283
+ // ever fails to decrypt skipped messages from the cache, this test
284
+ // pinpoints which byte disagreed before any wire packet does.
285
+ const expected3 = jsLikeDeriveSecrets(skipSeed3);
286
+ const expected5 = jsLikeDeriveSecrets(skipSeed5);
287
+ const byIndex = Object.fromEntries(mks.map(m => [m.index, m]));
288
+ for (const [idx, expected] of [
289
+ [3, expected3],
290
+ [5, expected5]
291
+ ]) {
292
+ expect(Buffer.from(byIndex[idx].cipherKey).equals(expected.cipher)).toBe(true);
293
+ expect(Buffer.from(byIndex[idx].macKey).equals(expected.mac)).toBe(true);
294
+ expect(Buffer.from(byIndex[idx].iv).equals(expected.iv)).toBe(true);
295
+ }
296
+ });
297
+ });
298
+ //# sourceMappingURL=wrap-legacy-store-coverage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-coverage.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-coverage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Cross-impl gap for `lid_mapping`:
3
+ * • Bridge: `lid:{X}` → JSON `LidPnMappingEntry`; `pn:{X}` → bytes(LID).
4
+ * • Upstream: bare `{pnUser}` → string LID; `{lidUser}_reverse` → string PN.
5
+ * Without conversion, upstream falls back to USYNC re-fetch on every cold start.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=wrap-legacy-store-lid-mapping.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-lid-mapping.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-lid-mapping.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Cross-impl gap for `lid_mapping`:
3
+ * • Bridge: `lid:{X}` → JSON `LidPnMappingEntry`; `pn:{X}` → bytes(LID).
4
+ * • Upstream: bare `{pnUser}` → string LID; `{lidUser}_reverse` → string PN.
5
+ * Without conversion, upstream falls back to USYNC re-fetch on every cold start.
6
+ */
7
+ import { Buffer } from 'node:buffer';
8
+ import { describe, test } from 'node:test';
9
+ import { expect } from "../../__tests__/expect.js";
10
+ import { makeWrapped } from "./_legacy-store-fixtures.js";
11
+ const PN_USER = '559980000003';
12
+ const LID_USER = '100000037037034';
13
+ const ENC = (s) => new TextEncoder().encode(s);
14
+ describe('wrap-legacy-store: lid_mapping key-name translation', () => {
15
+ test('bridge SET pn:{X} → upstream bare key {X}', async () => {
16
+ const { wrapped, keys } = await makeWrapped();
17
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, ENC(LID_USER));
18
+ expect(keys.raw['lid-mapping']?.[PN_USER]).toBeDefined();
19
+ expect(keys.raw['lid-mapping']?.[`pn:${PN_USER}`]).toBeUndefined();
20
+ });
21
+ test('bridge SET lid:{X} → upstream key {X}_reverse', async () => {
22
+ const { wrapped, keys } = await makeWrapped();
23
+ const entry = {
24
+ lid: LID_USER,
25
+ phone_number: PN_USER,
26
+ created_at: 1700000000,
27
+ updated_at: 1700000000,
28
+ learning_source: 'usync'
29
+ };
30
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, ENC(JSON.stringify(entry)));
31
+ expect(keys.raw['lid-mapping']?.[`${LID_USER}_reverse`]).toBeDefined();
32
+ expect(keys.raw['lid-mapping']?.[`lid:${LID_USER}`]).toBeUndefined();
33
+ });
34
+ });
35
+ describe('wrap-legacy-store: lid_mapping value-byte translation', () => {
36
+ test('bridge `pn:` write surfaces a STRING for upstream (not Buffer)', async () => {
37
+ const { wrapped, keys } = await makeWrapped();
38
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, ENC(LID_USER));
39
+ // Upstream's `_getLIDsForPNsImpl` does `stored[pnUser]` → expects string.
40
+ expect(typeof keys.raw['lid-mapping']?.[PN_USER]).toBe('string');
41
+ expect(keys.raw['lid-mapping']?.[PN_USER]).toBe(LID_USER);
42
+ });
43
+ test('bridge `lid:` write surfaces phone_number STRING under {lid}_reverse', async () => {
44
+ const { wrapped, keys } = await makeWrapped();
45
+ const entry = {
46
+ lid: LID_USER,
47
+ phone_number: PN_USER,
48
+ created_at: 1,
49
+ updated_at: 1,
50
+ learning_source: 'usync'
51
+ };
52
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, ENC(JSON.stringify(entry)));
53
+ expect(keys.raw['lid-mapping']?.[`${LID_USER}_reverse`]).toBe(PN_USER);
54
+ });
55
+ test('bridge GET pn:{X} reads upstream string back as raw LID bytes', async () => {
56
+ const { wrapped, keys } = await makeWrapped();
57
+ keys.raw['lid-mapping'] = { [PN_USER]: LID_USER };
58
+ const out = (await wrapped.get('lid_mapping', `pn:${PN_USER}`));
59
+ expect(Buffer.from(out).toString('utf-8')).toBe(LID_USER);
60
+ });
61
+ test('bridge GET lid:{X} reconstructs synthetic LidPnMappingEntry from upstream', async () => {
62
+ const { wrapped, keys } = await makeWrapped();
63
+ keys.raw['lid-mapping'] = { [`${LID_USER}_reverse`]: PN_USER };
64
+ const out = (await wrapped.get('lid_mapping', `lid:${LID_USER}`));
65
+ const parsed = JSON.parse(Buffer.from(out).toString('utf-8'));
66
+ expect(parsed.lid).toBe(LID_USER);
67
+ expect(parsed.phone_number).toBe(PN_USER);
68
+ expect(parsed.learning_source).toBe('wrap-legacy-store');
69
+ expect(parsed.created_at).toBeGreaterThan(0);
70
+ });
71
+ test('round-trip: bridge SET both directions → read both back', async () => {
72
+ const { wrapped, keys } = await makeWrapped();
73
+ const entry = {
74
+ lid: LID_USER,
75
+ phone_number: PN_USER,
76
+ created_at: 1,
77
+ updated_at: 1,
78
+ learning_source: 'peer_pn_message'
79
+ };
80
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, ENC(JSON.stringify(entry)));
81
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, ENC(LID_USER));
82
+ expect(keys.raw['lid-mapping']?.[PN_USER]).toBe(LID_USER);
83
+ expect(keys.raw['lid-mapping']?.[`${LID_USER}_reverse`]).toBe(PN_USER);
84
+ const lidBack = Buffer.from((await wrapped.get('lid_mapping', `pn:${PN_USER}`))).toString('utf-8');
85
+ expect(lidBack).toBe(LID_USER);
86
+ const entryBack = JSON.parse(Buffer.from((await wrapped.get('lid_mapping', `lid:${LID_USER}`))).toString('utf-8'));
87
+ expect(entryBack.lid).toBe(LID_USER);
88
+ expect(entryBack.phone_number).toBe(PN_USER);
89
+ });
90
+ });
91
+ //# sourceMappingURL=wrap-legacy-store-lid-mapping.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-lid-mapping.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-lid-mapping.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cross-impl gap for `sender_key`:
3
+ * • Bridge: store `sender_key`, key `{group}:{user}[:dev]@{server}.{sig}`,
4
+ * value = protobuf `SenderKeyRecordStructure`.
5
+ * • Upstream: store `sender-key`, key `{group}::{signalUser}::{deviceId}`,
6
+ * value = `Buffer(JSON.stringify(states, BufferJSON.replacer), 'utf-8')`.
7
+ * Store name, key shape AND value encoding all differ.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=wrap-legacy-store-sender-key.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-sender-key.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-sender-key.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}