@oxidezap/baileyrs 0.0.7 → 0.0.8

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 (159) 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__/wrap-legacy-store-lid-mapping.test.d.ts +23 -0
  93. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts.map +1 -0
  94. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js +157 -0
  95. package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js.map +1 -0
  96. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts +31 -0
  97. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts.map +1 -0
  98. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js +253 -0
  99. package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js.map +1 -0
  100. package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts +32 -0
  101. package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts.map +1 -0
  102. package/lib/Utils/__tests__/wrap-legacy-store-session.test.js +488 -0
  103. package/lib/Utils/__tests__/wrap-legacy-store-session.test.js.map +1 -0
  104. package/lib/Utils/boom.d.ts +33 -0
  105. package/lib/Utils/boom.d.ts.map +1 -0
  106. package/lib/Utils/boom.js +63 -0
  107. package/lib/Utils/boom.js.map +1 -0
  108. package/lib/Utils/browser-utils.d.ts.map +1 -1
  109. package/lib/Utils/event-buffer.d.ts.map +1 -1
  110. package/lib/Utils/generics.d.ts +37 -1
  111. package/lib/Utils/generics.d.ts.map +1 -1
  112. package/lib/Utils/generics.js +60 -2
  113. package/lib/Utils/generics.js.map +1 -1
  114. package/lib/Utils/index.d.ts +1 -0
  115. package/lib/Utils/index.d.ts.map +1 -1
  116. package/lib/Utils/index.js +10 -9
  117. package/lib/Utils/index.js.map +1 -1
  118. package/lib/Utils/lid-mapping-store.d.ts +81 -0
  119. package/lib/Utils/lid-mapping-store.d.ts.map +1 -0
  120. package/lib/Utils/lid-mapping-store.js +126 -0
  121. package/lib/Utils/lid-mapping-store.js.map +1 -0
  122. package/lib/Utils/logger.d.ts.map +1 -1
  123. package/lib/Utils/logger.js +25 -1
  124. package/lib/Utils/logger.js.map +1 -1
  125. package/lib/Utils/messages-media.d.ts.map +1 -1
  126. package/lib/Utils/messages-media.js +1 -1
  127. package/lib/Utils/messages-media.js.map +1 -1
  128. package/lib/Utils/messages.d.ts +30 -1
  129. package/lib/Utils/messages.d.ts.map +1 -1
  130. package/lib/Utils/messages.js +115 -41
  131. package/lib/Utils/messages.js.map +1 -1
  132. package/lib/Utils/native-crypto-provider.d.ts +18 -0
  133. package/lib/Utils/native-crypto-provider.d.ts.map +1 -0
  134. package/lib/Utils/native-crypto-provider.js +67 -0
  135. package/lib/Utils/native-crypto-provider.js.map +1 -0
  136. package/lib/Utils/use-bridge-store.d.ts.map +1 -1
  137. package/lib/Utils/use-memory-store.d.ts.map +1 -1
  138. package/lib/Utils/use-memory-store.js +1 -1
  139. package/lib/Utils/use-memory-store.js.map +1 -1
  140. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
  141. package/lib/Utils/use-multi-file-auth-state.js +1 -1
  142. package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
  143. package/lib/Utils/wrap-legacy-store.d.ts.map +1 -1
  144. package/lib/Utils/wrap-legacy-store.js +621 -13
  145. package/lib/Utils/wrap-legacy-store.js.map +1 -1
  146. package/lib/WABinary/index.d.ts.map +1 -1
  147. package/lib/WABinary/index.js +1 -1
  148. package/lib/WABinary/index.js.map +1 -1
  149. package/lib/__tests__/expect.d.ts +30 -0
  150. package/lib/__tests__/expect.d.ts.map +1 -0
  151. package/lib/__tests__/expect.js +60 -0
  152. package/lib/__tests__/expect.js.map +1 -0
  153. package/lib/index.d.ts +1 -1
  154. package/lib/index.d.ts.map +1 -1
  155. package/lib/index.js +9 -6
  156. package/lib/index.js.map +1 -1
  157. package/package.json +30 -25
  158. package/WAProto/index.d.ts +0 -13875
  159. package/WAProto/index.js +0 -175
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Pin down the `lid_mapping` cross-impl gap. Same auth folder must work for
3
+ * both libraries; the LID↔PN mapping table is what lets every send-side
4
+ * lookup correctly route a PN JID to its LID device address.
5
+ *
6
+ * Bridge (`whatsapp-rust-bridge/src/js_backend.rs`):
7
+ * • store: `lid_mapping`
8
+ * • forward key: `lid:{lidUser}` → JSON `LidPnMappingEntry`
9
+ * `{ lid, phone_number, created_at, updated_at, learning_source }`
10
+ * • reverse key: `pn:{pnUser}` → raw bytes of the LID user (UTF-8)
11
+ *
12
+ * Upstream baileys (`Signal/lid-mapping.js`):
13
+ * • store: `lid-mapping`
14
+ * • forward key: bare `{pnUser}` → string `lidUser`
15
+ * • reverse key: bare `{lidUser}_reverse` → string `pnUser`
16
+ *
17
+ * Without a converter, neither library finds the other's entries. Upstream
18
+ * has a USYNC fallback (re-fetch from server) so it doesn't crash, but
19
+ * costs an extra round-trip per cross-impl session start. These tests pin
20
+ * down direct compatibility so the fallback is no longer needed.
21
+ */
22
+ import { Buffer } from 'node:buffer';
23
+ import { describe, test } from 'node:test';
24
+ import { wrapLegacyStore } from "../wrap-legacy-store.js";
25
+ import { initAuthCreds } from "../generics.js";
26
+ import { expect } from "../../__tests__/expect.js";
27
+ // ── Helpers ──────────────────────────────────────────────────────────────
28
+ function makeMemKeys() {
29
+ const data = {};
30
+ return {
31
+ raw: data,
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ async get(type, ids) {
34
+ const bucket = data[type] ?? {};
35
+ const out = {};
36
+ for (const id of ids)
37
+ out[id] = bucket[id] ?? null;
38
+ return out;
39
+ },
40
+ async set(updates) {
41
+ for (const [type, bucket] of Object.entries(updates)) {
42
+ data[type] ?? (data[type] = {});
43
+ for (const [id, val] of Object.entries(bucket)) {
44
+ if (val === null || val === undefined)
45
+ delete data[type][id];
46
+ else
47
+ data[type][id] = val;
48
+ }
49
+ }
50
+ }
51
+ };
52
+ }
53
+ async function makeWrapped() {
54
+ const creds = initAuthCreds();
55
+ const keys = makeMemKeys();
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ const state = { creds, keys: keys };
58
+ const wrapped = await wrapLegacyStore(state, async () => { });
59
+ return { wrapped, keys, creds };
60
+ }
61
+ const PN_USER = '559980000003';
62
+ const LID_USER = '100000037037034';
63
+ // ── Tests ────────────────────────────────────────────────────────────────
64
+ describe('wrap-legacy-store: lid_mapping key-name translation (cross-impl)', () => {
65
+ test('bridge SET pn:{X} writes under upstream bare key {X}', async () => {
66
+ const { wrapped, keys } = await makeWrapped();
67
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, new TextEncoder().encode(LID_USER));
68
+ // Upstream's `lid-mapping.js` looks here:
69
+ expect(keys.raw['lid-mapping']?.[PN_USER]).toBeDefined();
70
+ // And NOT here (would be a passthrough leak):
71
+ expect(keys.raw['lid-mapping']?.[`pn:${PN_USER}`]).toBeUndefined();
72
+ });
73
+ test('bridge SET lid:{X} writes under upstream key {X}_reverse', async () => {
74
+ const { wrapped, keys } = await makeWrapped();
75
+ const entry = {
76
+ lid: LID_USER,
77
+ phone_number: PN_USER,
78
+ created_at: 1700000000,
79
+ updated_at: 1700000000,
80
+ learning_source: 'usync'
81
+ };
82
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, new TextEncoder().encode(JSON.stringify(entry)));
83
+ expect(keys.raw['lid-mapping']?.[`${LID_USER}_reverse`]).toBeDefined();
84
+ expect(keys.raw['lid-mapping']?.[`lid:${LID_USER}`]).toBeUndefined();
85
+ });
86
+ });
87
+ describe('wrap-legacy-store: lid_mapping value-byte translation (cross-impl)', () => {
88
+ test('bridge-written pn mapping is loadable as a STRING for upstream lid-mapping', async () => {
89
+ const { wrapped, keys } = await makeWrapped();
90
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, new TextEncoder().encode(LID_USER));
91
+ // Upstream's `_getLIDsForPNsImpl` does
92
+ // `const stored = await this.keys.get('lid-mapping', [pnUser])` and
93
+ // then `stored[pnUser]` — expects a STRING (not a Buffer).
94
+ const stored = keys.raw['lid-mapping']?.[PN_USER];
95
+ expect(typeof stored).toBe('string');
96
+ expect(stored).toBe(LID_USER);
97
+ });
98
+ test('bridge-written lid entry surfaces phone_number STRING under {lid}_reverse for upstream', async () => {
99
+ const { wrapped, keys } = await makeWrapped();
100
+ const entry = {
101
+ lid: LID_USER,
102
+ phone_number: PN_USER,
103
+ created_at: 1700000000,
104
+ updated_at: 1700000000,
105
+ learning_source: 'usync'
106
+ };
107
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, new TextEncoder().encode(JSON.stringify(entry)));
108
+ const stored = keys.raw['lid-mapping']?.[`${LID_USER}_reverse`];
109
+ expect(typeof stored).toBe('string');
110
+ expect(stored).toBe(PN_USER);
111
+ });
112
+ test('bridge GET pn:{X} reads back upstream bare-string entry as raw LID bytes', async () => {
113
+ const { wrapped, keys } = await makeWrapped();
114
+ // Pretend upstream wrote first (real "swap from upstream" scenario).
115
+ keys.raw['lid-mapping'] = { [PN_USER]: LID_USER };
116
+ const out = (await wrapped.get('lid_mapping', `pn:${PN_USER}`));
117
+ expect(out).not.toBe(null);
118
+ expect(Buffer.from(out).toString('utf-8')).toBe(LID_USER);
119
+ });
120
+ test('bridge GET lid:{X} reconstructs synthetic LidPnMappingEntry from upstream {lid}_reverse', async () => {
121
+ const { wrapped, keys } = await makeWrapped();
122
+ keys.raw['lid-mapping'] = { [`${LID_USER}_reverse`]: PN_USER };
123
+ const out = (await wrapped.get('lid_mapping', `lid:${LID_USER}`));
124
+ expect(out).not.toBe(null);
125
+ const parsed = JSON.parse(Buffer.from(out).toString('utf-8'));
126
+ expect(parsed.lid).toBe(LID_USER);
127
+ expect(parsed.phone_number).toBe(PN_USER);
128
+ // Synthetic timestamps + source to satisfy bridge consumers without
129
+ // requiring upstream to track them.
130
+ expect(parsed.learning_source).toBe('wrap-legacy-store');
131
+ expect(parsed.created_at).toBeGreaterThan(0);
132
+ expect(parsed.updated_at).toBeGreaterThan(0);
133
+ });
134
+ test('round-trip: bridge SET both forward + reverse → upstream-shape on disk → bridge GET both directions', async () => {
135
+ const { wrapped, keys } = await makeWrapped();
136
+ // What the bridge does on `put_lid_mapping`: writes both lid: and pn:.
137
+ const entry = {
138
+ lid: LID_USER,
139
+ phone_number: PN_USER,
140
+ created_at: 1700000000,
141
+ updated_at: 1700000000,
142
+ learning_source: 'peer_pn_message'
143
+ };
144
+ await wrapped.set('lid_mapping', `lid:${LID_USER}`, new TextEncoder().encode(JSON.stringify(entry)));
145
+ await wrapped.set('lid_mapping', `pn:${PN_USER}`, new TextEncoder().encode(LID_USER));
146
+ // On-disk: upstream-shape, both keys present.
147
+ expect(keys.raw['lid-mapping']?.[PN_USER]).toBe(LID_USER);
148
+ expect(keys.raw['lid-mapping']?.[`${LID_USER}_reverse`]).toBe(PN_USER);
149
+ // Read back via bridge — both should resolve.
150
+ const lidBack = (await wrapped.get('lid_mapping', `pn:${PN_USER}`));
151
+ expect(Buffer.from(lidBack).toString('utf-8')).toBe(LID_USER);
152
+ const entryBack = JSON.parse(Buffer.from((await wrapped.get('lid_mapping', `lid:${LID_USER}`))).toString('utf-8'));
153
+ expect(entryBack.lid).toBe(LID_USER);
154
+ expect(entryBack.phone_number).toBe(PN_USER);
155
+ });
156
+ });
157
+ //# 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,31 @@
1
+ /**
2
+ * Pin down the sender_key cross-impl gap that broke the e2e handoff test
3
+ * (`baileys-handoff.test-e2e.ts`, Phase 10). This is the fast unit-level
4
+ * version: no socket, no mock server, in-memory keys store, deterministic.
5
+ *
6
+ * Two formats are at play:
7
+ *
8
+ * ── Bridge (Rust libsignal, what whatsapp-rust-bridge writes) ─────────
9
+ * • store name: `sender_key`
10
+ * • key (cache_key): `{group}:{user}[:jidDev]@{server}.{signalDev}`
11
+ * e.g. "120363@g.us:100000037037034@lid.0"
12
+ * • value: raw protobuf bytes of `waproto.SenderKeyRecordStructure`
13
+ *
14
+ * ── Upstream baileys (JS libsignal, what `useMultiFileAuthState` produces)
15
+ * • store name: `sender-key` (hyphen, not underscore!)
16
+ * • key (SenderKeyName.serialize): `{group}::{signalUser}::{deviceId}`
17
+ * where signalUser = `${user}` for s.whatsapp.net (domainType 0)
18
+ * or `${user}_${domainType}` for LID (1) / hosted (2) / etc.
19
+ * e.g. "120363@g.us::100000037037034_1::0"
20
+ * • value: `Buffer.from(JSON.stringify(senderKeyStates, BufferJSON.replacer))`
21
+ * where each state is `{ senderKeyId, senderChainKey: { iteration, seed:Buffer },
22
+ * senderSigningKey: { public:Buffer, private:Buffer }, senderMessageKeys: [] }`
23
+ * and Buffer is replaced by `{ type:'Buffer', data:'<base64>' }` in the JSON.
24
+ *
25
+ * Both the **store name**, the **key shape**, AND the **value encoding**
26
+ * differ. So the bridge-write cannot be read by upstream-load and vice-versa
27
+ * unless `wrap-legacy-store` translates at the boundary. These tests pin
28
+ * that contract — they MUST remain green for the handoff to work.
29
+ */
30
+ export {};
31
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Pin down the sender_key cross-impl gap that broke the e2e handoff test
3
+ * (`baileys-handoff.test-e2e.ts`, Phase 10). This is the fast unit-level
4
+ * version: no socket, no mock server, in-memory keys store, deterministic.
5
+ *
6
+ * Two formats are at play:
7
+ *
8
+ * ── Bridge (Rust libsignal, what whatsapp-rust-bridge writes) ─────────
9
+ * • store name: `sender_key`
10
+ * • key (cache_key): `{group}:{user}[:jidDev]@{server}.{signalDev}`
11
+ * e.g. "120363@g.us:100000037037034@lid.0"
12
+ * • value: raw protobuf bytes of `waproto.SenderKeyRecordStructure`
13
+ *
14
+ * ── Upstream baileys (JS libsignal, what `useMultiFileAuthState` produces)
15
+ * • store name: `sender-key` (hyphen, not underscore!)
16
+ * • key (SenderKeyName.serialize): `{group}::{signalUser}::{deviceId}`
17
+ * where signalUser = `${user}` for s.whatsapp.net (domainType 0)
18
+ * or `${user}_${domainType}` for LID (1) / hosted (2) / etc.
19
+ * e.g. "120363@g.us::100000037037034_1::0"
20
+ * • value: `Buffer.from(JSON.stringify(senderKeyStates, BufferJSON.replacer))`
21
+ * where each state is `{ senderKeyId, senderChainKey: { iteration, seed:Buffer },
22
+ * senderSigningKey: { public:Buffer, private:Buffer }, senderMessageKeys: [] }`
23
+ * and Buffer is replaced by `{ type:'Buffer', data:'<base64>' }` in the JSON.
24
+ *
25
+ * Both the **store name**, the **key shape**, AND the **value encoding**
26
+ * differ. So the bridge-write cannot be read by upstream-load and vice-versa
27
+ * unless `wrap-legacy-store` translates at the boundary. These tests pin
28
+ * that contract — they MUST remain green for the handoff to work.
29
+ */
30
+ import { Buffer } from 'node:buffer';
31
+ import { describe, test } from 'node:test';
32
+ // Upstream baileys's actual classes — NOT a mock. We are asserting the same
33
+ // loadSenderKey/storeSenderKey path that runs inside upstream's libsignal at
34
+ // runtime.
35
+ import { SenderKeyRecord } from 'baileys/lib/Signal/Group/sender-key-record.js';
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bridge proto-types ambient
37
+ import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
38
+ import { wrapLegacyStore } from "../wrap-legacy-store.js";
39
+ import { initAuthCreds } from "../generics.js";
40
+ import { expect } from "../../__tests__/expect.js";
41
+ // ─── In-memory keys store identical in shape to upstream's `useMultiFileAuthState`
42
+ // keys callback (the surface wrap-legacy-store talks to). ────────────────────
43
+ function makeMemKeys() {
44
+ const data = {};
45
+ return {
46
+ raw: data,
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mirrors upstream `keys.get` shape
48
+ async get(type, ids) {
49
+ const bucket = data[type] ?? {};
50
+ const out = {};
51
+ for (const id of ids)
52
+ out[id] = bucket[id] ?? null;
53
+ return out;
54
+ },
55
+ async set(updates) {
56
+ for (const [type, bucket] of Object.entries(updates)) {
57
+ data[type] ?? (data[type] = {});
58
+ for (const [id, val] of Object.entries(bucket)) {
59
+ if (val === null || val === undefined)
60
+ delete data[type][id];
61
+ else
62
+ data[type][id] = val;
63
+ }
64
+ }
65
+ }
66
+ };
67
+ }
68
+ // ─── Helpers to build a realistic, fully-populated proto sender-key record ─
69
+ function buildBridgeSenderKeyBytes(opts) {
70
+ const { keyId = 17, iteration = 3, chainSeed = new Uint8Array(32).map((_, i) => (i * 7) & 0xff), signingPublic = new Uint8Array(33).map((_, i) => (i * 11) & 0xff), signingPrivate = new Uint8Array(32).map((_, i) => (i * 13) & 0xff) } = opts;
71
+ const struct = bridgeProto.SenderKeyRecordStructure.create({
72
+ senderKeyStates: [
73
+ {
74
+ senderKeyId: keyId,
75
+ senderChainKey: { iteration, seed: chainSeed },
76
+ senderSigningKey: { public: signingPublic, private: signingPrivate },
77
+ senderMessageKeys: []
78
+ }
79
+ ]
80
+ });
81
+ return bridgeProto.SenderKeyRecordStructure.encode(struct).finish();
82
+ }
83
+ const SAMPLE_GROUP = '120363012345678900@g.us';
84
+ // LID sender, no JID device. This is the mock-server default and the case
85
+ // our e2e test exercises.
86
+ const SAMPLE_BRIDGE_KEY_LID = `${SAMPLE_GROUP}:100000037037034@lid.0`;
87
+ const EXPECTED_UPSTREAM_KEY_LID = `${SAMPLE_GROUP}::100000037037034_1::0`;
88
+ // PN sender on s.whatsapp.net with a JID device — exercises the
89
+ // `user:device@server` userPart branch + the no-suffix signalUser branch.
90
+ const SAMPLE_BRIDGE_KEY_PN_DEV = `${SAMPLE_GROUP}:559980000003:5@s.whatsapp.net.0`;
91
+ const EXPECTED_UPSTREAM_KEY_PN_DEV = `${SAMPLE_GROUP}::559980000003::5`;
92
+ async function makeWrapped() {
93
+ const creds = initAuthCreds();
94
+ const keys = makeMemKeys();
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- minimal AuthenticationState surface
96
+ const state = { creds, keys: keys };
97
+ const wrapped = await wrapLegacyStore(state, async () => { });
98
+ return { wrapped, keys, creds };
99
+ }
100
+ describe('wrap-legacy-store: sender_key key-name translation (cross-impl)', () => {
101
+ test('bridge SET writes under the upstream-formatted key (LID, no JID device)', async () => {
102
+ const { wrapped, keys } = await makeWrapped();
103
+ await wrapped.set('sender_key', SAMPLE_BRIDGE_KEY_LID, buildBridgeSenderKeyBytes({}));
104
+ // Upstream's libsignal will look here:
105
+ const stored = keys.raw['sender-key']?.[EXPECTED_UPSTREAM_KEY_LID];
106
+ expect(stored).toBeDefined();
107
+ // AND the bridge-shaped key must NOT exist (would mean we just wrote
108
+ // raw bytes verbatim and hadn't translated the key).
109
+ const bridgeKeyValue = keys.raw['sender-key']?.[SAMPLE_BRIDGE_KEY_LID];
110
+ expect(bridgeKeyValue).toBeUndefined();
111
+ });
112
+ test('bridge SET writes under the upstream-formatted key (PN with device suffix)', async () => {
113
+ const { wrapped, keys } = await makeWrapped();
114
+ await wrapped.set('sender_key', SAMPLE_BRIDGE_KEY_PN_DEV, buildBridgeSenderKeyBytes({}));
115
+ const stored = keys.raw['sender-key']?.[EXPECTED_UPSTREAM_KEY_PN_DEV];
116
+ expect(stored).toBeDefined();
117
+ });
118
+ test('bridge GET reads back from the upstream-formatted key (LID)', async () => {
119
+ const { wrapped, keys } = await makeWrapped();
120
+ // Pretend upstream's libsignal already wrote here — this is the
121
+ // scenario where a bot ran on upstream first and is now booting
122
+ // baileyrs against the same auth folder.
123
+ const samples = [
124
+ {
125
+ senderKeyId: 17,
126
+ senderChainKey: { iteration: 3, seed: Buffer.from(new Uint8Array(32).map((_, i) => (i * 7) & 0xff)) },
127
+ senderSigningKey: {
128
+ public: Buffer.from(new Uint8Array(33).map((_, i) => (i * 11) & 0xff)),
129
+ private: Buffer.from(new Uint8Array(32).map((_, i) => (i * 13) & 0xff))
130
+ },
131
+ senderMessageKeys: []
132
+ }
133
+ ];
134
+ const upstreamBytes = Buffer.from(JSON.stringify(samples, (_k, v) => {
135
+ if (Buffer.isBuffer(v) || v instanceof Uint8Array || v?.type === 'Buffer') {
136
+ return { type: 'Buffer', data: Buffer.from(v?.data ?? v).toString('base64') };
137
+ }
138
+ return v;
139
+ }), 'utf-8');
140
+ keys.raw['sender-key'] = { [EXPECTED_UPSTREAM_KEY_LID]: upstreamBytes };
141
+ const out = (await wrapped.get('sender_key', SAMPLE_BRIDGE_KEY_LID));
142
+ expect(out).toBeDefined();
143
+ expect(out).not.toBe(null);
144
+ });
145
+ });
146
+ describe('wrap-legacy-store: sender_key value-byte translation (cross-impl)', () => {
147
+ test('bridge-written proto bytes are loadable by upstream SenderKeyRecord.deserialize', async () => {
148
+ const { wrapped, keys } = await makeWrapped();
149
+ const keyId = 42;
150
+ const iteration = 9;
151
+ const chainSeed = Buffer.from(new Uint8Array(32).map((_, i) => (i + 1) & 0xff));
152
+ const signPub = Buffer.from(new Uint8Array(33).map((_, i) => (200 - i) & 0xff));
153
+ const signPriv = Buffer.from(new Uint8Array(32).map((_, i) => (i * 5 + 11) & 0xff));
154
+ const protoBytes = buildBridgeSenderKeyBytes({
155
+ keyId,
156
+ iteration,
157
+ chainSeed: new Uint8Array(chainSeed),
158
+ signingPublic: new Uint8Array(signPub),
159
+ signingPrivate: new Uint8Array(signPriv)
160
+ });
161
+ await wrapped.set('sender_key', SAMPLE_BRIDGE_KEY_LID, protoBytes);
162
+ const onDisk = keys.raw['sender-key']?.[EXPECTED_UPSTREAM_KEY_LID];
163
+ expect(onDisk).toBeDefined();
164
+ // This is the EXACT call upstream's `loadSenderKey` makes. If it
165
+ // throws or produces an empty record, the e2e regression remains.
166
+ const rec = SenderKeyRecord.deserialize(onDisk);
167
+ expect(rec.isEmpty()).toBe(false);
168
+ const state = rec.getSenderKeyState();
169
+ expect(state.getKeyId()).toBe(keyId);
170
+ expect(state.getSenderChainKey().getIteration()).toBe(iteration);
171
+ // Buffer comparison via .equals — chain seed must round-trip byte-for-byte.
172
+ const seedOut = state.getSenderChainKey().getSeed();
173
+ expect(Buffer.from(seedOut).equals(chainSeed)).toBe(true);
174
+ // Signing keys: upstream prepends 0x05 to a 32-byte public on read,
175
+ // so we compare against the stored 33-byte value verbatim.
176
+ const pubOut = state.getSigningKeyPublic();
177
+ expect(Buffer.from(pubOut).equals(signPub)).toBe(true);
178
+ const privOut = state.getSigningKeyPrivate();
179
+ expect(Buffer.from(privOut).equals(signPriv)).toBe(true);
180
+ });
181
+ test('upstream-written JSON bytes round-trip through bridge GET to valid proto bytes', async () => {
182
+ const { wrapped, keys } = await makeWrapped();
183
+ // Build a record exactly the way upstream writes it (sender-key-state.js:19+).
184
+ const keyId = 99;
185
+ const iteration = 4;
186
+ const chainSeed = Buffer.alloc(32, 0xab);
187
+ const signPub = Buffer.alloc(33, 0xcd);
188
+ const signPriv = Buffer.alloc(32, 0xef);
189
+ const senderKeyStates = [
190
+ {
191
+ senderKeyId: keyId,
192
+ senderChainKey: { iteration, seed: chainSeed },
193
+ senderSigningKey: { public: signPub, private: signPriv },
194
+ senderMessageKeys: []
195
+ }
196
+ ];
197
+ // Same replacer baileys uses (BufferJSON in lib/Utils/generics.js).
198
+ const upstreamBytes = Buffer.from(JSON.stringify(senderKeyStates, (_k, v) => {
199
+ if (Buffer.isBuffer(v) || v instanceof Uint8Array || v?.type === 'Buffer') {
200
+ return { type: 'Buffer', data: Buffer.from(v?.data ?? v).toString('base64') };
201
+ }
202
+ return v;
203
+ }), 'utf-8');
204
+ keys.raw['sender-key'] = { [EXPECTED_UPSTREAM_KEY_LID]: upstreamBytes };
205
+ const bytesOut = (await wrapped.get('sender_key', SAMPLE_BRIDGE_KEY_LID));
206
+ expect(bytesOut).toBeDefined();
207
+ expect(bytesOut).not.toBe(null);
208
+ // These bytes must be valid `SenderKeyRecordStructure` proto for the
209
+ // Rust libsignal that lives in the bridge to consume them.
210
+ const decoded = bridgeProto.SenderKeyRecordStructure.decode(bytesOut);
211
+ expect(decoded.senderKeyStates.length).toBe(1);
212
+ const s = decoded.senderKeyStates[0];
213
+ expect(s.senderKeyId).toBe(keyId);
214
+ expect(s.senderChainKey?.iteration).toBe(iteration);
215
+ expect(Buffer.from(s.senderChainKey.seed).equals(chainSeed)).toBe(true);
216
+ expect(Buffer.from(s.senderSigningKey.public).equals(signPub)).toBe(true);
217
+ expect(Buffer.from(s.senderSigningKey.private).equals(signPriv)).toBe(true);
218
+ });
219
+ test('round-trip: bridge SET → upstream raw read → upstream-style modify → bridge GET → valid proto', async () => {
220
+ // End-to-end durability test: simulates a session where the bridge
221
+ // writes initially, upstream reads + advances chain (as it does on
222
+ // each receive), upstream writes back, and the bridge reads the
223
+ // final state.
224
+ const { wrapped, keys } = await makeWrapped();
225
+ const initialBytes = buildBridgeSenderKeyBytes({ keyId: 5, iteration: 1 });
226
+ await wrapped.set('sender_key', SAMPLE_BRIDGE_KEY_LID, initialBytes);
227
+ const onDisk = keys.raw['sender-key']?.[EXPECTED_UPSTREAM_KEY_LID];
228
+ const rec = SenderKeyRecord.deserialize(onDisk);
229
+ // Advance the iteration counter the way upstream's group cipher does
230
+ // after consuming a message.
231
+ const state = rec.getSenderKeyState();
232
+ const ck = state.getSenderChainKey();
233
+ // Simulate an iteration bump. We pass a duck-typed object that
234
+ // matches the SenderChainKey getter shape upstream uses internally.
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SenderChainKey is structurally typed inside upstream
236
+ const bumped = { getIteration: () => ck.getIteration() + 5, getSeed: () => ck.getSeed() };
237
+ state.setSenderChainKey(bumped);
238
+ // Re-serialize the upstream way and put it back on disk.
239
+ const newJson = JSON.stringify(rec.serialize(), (_k, v) => {
240
+ if (Buffer.isBuffer(v) || v instanceof Uint8Array || v?.type === 'Buffer') {
241
+ return { type: 'Buffer', data: Buffer.from(v?.data ?? v).toString('base64') };
242
+ }
243
+ return v;
244
+ });
245
+ keys.raw['sender-key'][EXPECTED_UPSTREAM_KEY_LID] = Buffer.from(newJson, 'utf-8');
246
+ // Now the bridge re-reads — it must see the bumped iteration.
247
+ const bytesOut = (await wrapped.get('sender_key', SAMPLE_BRIDGE_KEY_LID));
248
+ expect(bytesOut).not.toBe(null);
249
+ const decoded = bridgeProto.SenderKeyRecordStructure.decode(bytesOut);
250
+ expect(decoded.senderKeyStates[0].senderChainKey?.iteration).toBe(6);
251
+ });
252
+ });
253
+ //# sourceMappingURL=wrap-legacy-store-sender-key.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-sender-key.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-sender-key.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Pin down the `session` cross-impl gap. Sister of the sender_key test.
3
+ *
4
+ * Bridge (Rust libsignal) writes:
5
+ * • store: `session`
6
+ * • key: `{user}[:jidDev]@{server}.{signalDev}` e.g. "100000037037034@lid.0"
7
+ * • value: raw protobuf bytes of `waproto.RecordStructure`
8
+ * (current_session + previous_sessions, both `SessionStructure`)
9
+ *
10
+ * Upstream baileys (JS libsignal) writes:
11
+ * • store: `session` (same name, so no rename)
12
+ * • key: `{signalUser}.{deviceId}` e.g. "100000037037034_1.0"
13
+ * where signalUser = `${user}` for s.whatsapp.net (domainType 0),
14
+ * `${user}_${domainType}` otherwise
15
+ * • value: a plain JS object (NOT bytes!) with shape
16
+ * `{ _sessions: { [base64BaseKey]: SessionEntry }, version: 'v1' }`
17
+ * The keys store is responsible for JSON-stringifying it on disk.
18
+ *
19
+ * Two diffs at the boundary:
20
+ * 1. KEY format: bridge `addr@server.dev` ↔ upstream `signalUser.deviceId`
21
+ * 2. VALUE format: proto bytes ↔ JS object (with base64-encoded byte fields)
22
+ *
23
+ * If wrap-legacy-store doesn't translate, upstream's `loadSession` either
24
+ * (a) doesn't find the key at all, OR
25
+ * (b) finds it (Buffer of proto bytes) and throws inside SessionRecord.deserialize
26
+ * → returns null → falls back to fresh PreKey signal handshake. The e2e
27
+ * 1:1 phases still pass via that fallback, but every cross-impl swap then
28
+ * costs an extra ~3 wire roundtrips per peer pair. These tests pin down
29
+ * the contract for direct, no-re-handshake compatibility.
30
+ */
31
+ export {};
32
+ //# sourceMappingURL=wrap-legacy-store-session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-session.test.d.ts","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-session.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}