@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.
- package/README.md +119 -5
- package/lib/Bridge/__tests__/adapt.test.d.ts +2 -0
- package/lib/Bridge/__tests__/adapt.test.d.ts.map +1 -0
- package/lib/Bridge/__tests__/adapt.test.js +355 -0
- package/lib/Bridge/__tests__/adapt.test.js.map +1 -0
- package/lib/Bridge/__tests__/dts-drift.test.d.ts +13 -0
- package/lib/Bridge/__tests__/dts-drift.test.d.ts.map +1 -0
- package/lib/Bridge/__tests__/dts-drift.test.js +92 -0
- package/lib/Bridge/__tests__/dts-drift.test.js.map +1 -0
- package/lib/Bridge/__tests__/fixtures.d.ts +192 -0
- package/lib/Bridge/__tests__/fixtures.d.ts.map +1 -0
- package/lib/Bridge/__tests__/fixtures.js +99 -0
- package/lib/Bridge/__tests__/fixtures.js.map +1 -0
- package/lib/Bridge/adapt.d.ts +28 -0
- package/lib/Bridge/adapt.d.ts.map +1 -0
- package/lib/Bridge/adapt.js +504 -0
- package/lib/Bridge/adapt.js.map +1 -0
- package/lib/Bridge/index.d.ts +12 -0
- package/lib/Bridge/index.d.ts.map +1 -0
- package/lib/Bridge/index.js +12 -0
- package/lib/Bridge/index.js.map +1 -0
- package/lib/Bridge/primitives.d.ts +56 -0
- package/lib/Bridge/primitives.d.ts.map +1 -0
- package/lib/Bridge/primitives.js +58 -0
- package/lib/Bridge/primitives.js.map +1 -0
- package/lib/Bridge/types.d.ts +273 -0
- package/lib/Bridge/types.d.ts.map +1 -0
- package/lib/Bridge/types.js +17 -0
- package/lib/Bridge/types.js.map +1 -0
- package/lib/Defaults/index.d.ts.map +1 -1
- package/lib/Defaults/index.js +2 -2
- package/lib/Defaults/index.js.map +1 -1
- package/lib/Socket/blocking.d.ts.map +1 -1
- package/lib/Socket/chat-actions.d.ts.map +1 -1
- package/lib/Socket/contacts.d.ts +9 -4
- package/lib/Socket/contacts.d.ts.map +1 -1
- package/lib/Socket/contacts.js +11 -8
- package/lib/Socket/contacts.js.map +1 -1
- package/lib/Socket/events.d.ts +7 -1
- package/lib/Socket/events.d.ts.map +1 -1
- package/lib/Socket/events.js +212 -243
- package/lib/Socket/events.js.map +1 -1
- package/lib/Socket/group-notifications.d.ts +25 -0
- package/lib/Socket/group-notifications.d.ts.map +1 -0
- package/lib/Socket/group-notifications.js +162 -0
- package/lib/Socket/group-notifications.js.map +1 -0
- package/lib/Socket/groups.d.ts +12 -1
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/groups.js +44 -1
- package/lib/Socket/groups.js.map +1 -1
- package/lib/Socket/index.d.ts +47 -13
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/index.js +158 -24
- package/lib/Socket/index.js.map +1 -1
- package/lib/Socket/messages.d.ts +5 -2
- package/lib/Socket/messages.d.ts.map +1 -1
- package/lib/Socket/messages.js +42 -21
- package/lib/Socket/messages.js.map +1 -1
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Socket/presence.d.ts.map +1 -1
- package/lib/Socket/profile.d.ts +7 -1
- package/lib/Socket/profile.d.ts.map +1 -1
- package/lib/Socket/profile.js +20 -5
- package/lib/Socket/profile.js.map +1 -1
- package/lib/Socket/transport.d.ts.map +1 -1
- package/lib/Socket/transport.js +14 -13
- package/lib/Socket/transport.js.map +1 -1
- package/lib/Socket/types.d.ts.map +1 -1
- package/lib/Types/Auth.d.ts +1 -1
- package/lib/Types/Auth.d.ts.map +1 -1
- package/lib/Types/Bussines.d.ts +1 -1
- package/lib/Types/Bussines.d.ts.map +1 -1
- package/lib/Types/Chat.d.ts +1 -1
- package/lib/Types/Chat.d.ts.map +1 -1
- package/lib/Types/Events.d.ts +12 -3
- package/lib/Types/Events.d.ts.map +1 -1
- package/lib/Types/Events.js +1 -1
- package/lib/Types/Events.js.map +1 -1
- package/lib/Types/GroupMetadata.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +16 -1
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Types/Message.js +1 -1
- package/lib/Types/Message.js.map +1 -1
- package/lib/Types/Socket.d.ts +42 -1
- package/lib/Types/Socket.d.ts.map +1 -1
- package/lib/Types/State.d.ts +1 -1
- package/lib/Types/State.d.ts.map +1 -1
- package/lib/Types/index.d.ts +1 -1
- package/lib/Types/index.d.ts.map +1 -1
- package/lib/Types/index.js +17 -12
- package/lib/Types/index.js.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts +23 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js +157 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts +31 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js +253 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts +32 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js +488 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js.map +1 -0
- package/lib/Utils/boom.d.ts +33 -0
- package/lib/Utils/boom.d.ts.map +1 -0
- package/lib/Utils/boom.js +63 -0
- package/lib/Utils/boom.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -1
- package/lib/Utils/event-buffer.d.ts.map +1 -1
- package/lib/Utils/generics.d.ts +37 -1
- package/lib/Utils/generics.d.ts.map +1 -1
- package/lib/Utils/generics.js +60 -2
- package/lib/Utils/generics.js.map +1 -1
- package/lib/Utils/index.d.ts +1 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +10 -9
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/lid-mapping-store.d.ts +81 -0
- package/lib/Utils/lid-mapping-store.d.ts.map +1 -0
- package/lib/Utils/lid-mapping-store.js +126 -0
- package/lib/Utils/lid-mapping-store.js.map +1 -0
- package/lib/Utils/logger.d.ts.map +1 -1
- package/lib/Utils/logger.js +25 -1
- package/lib/Utils/logger.js.map +1 -1
- package/lib/Utils/messages-media.d.ts.map +1 -1
- package/lib/Utils/messages-media.js +1 -1
- package/lib/Utils/messages-media.js.map +1 -1
- package/lib/Utils/messages.d.ts +30 -1
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +115 -41
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/native-crypto-provider.d.ts +18 -0
- package/lib/Utils/native-crypto-provider.d.ts.map +1 -0
- package/lib/Utils/native-crypto-provider.js +67 -0
- package/lib/Utils/native-crypto-provider.js.map +1 -0
- package/lib/Utils/use-bridge-store.d.ts.map +1 -1
- package/lib/Utils/use-memory-store.d.ts.map +1 -1
- package/lib/Utils/use-memory-store.js +1 -1
- package/lib/Utils/use-memory-store.js.map +1 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
- package/lib/Utils/use-multi-file-auth-state.js +1 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
- package/lib/Utils/wrap-legacy-store.d.ts.map +1 -1
- package/lib/Utils/wrap-legacy-store.js +621 -13
- package/lib/Utils/wrap-legacy-store.js.map +1 -1
- package/lib/WABinary/index.d.ts.map +1 -1
- package/lib/WABinary/index.js +1 -1
- package/lib/WABinary/index.js.map +1 -1
- package/lib/__tests__/expect.d.ts +30 -0
- package/lib/__tests__/expect.d.ts.map +1 -0
- package/lib/__tests__/expect.js +60 -0
- package/lib/__tests__/expect.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -6
- package/lib/index.js.map +1 -1
- package/package.json +30 -25
- package/WAProto/index.d.ts +0 -13875
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAElD,4EAA4E;AAE5E,SAAS,WAAW;IACnB,MAAM,IAAI,GAA4C,EAAE,CAAA;IACxD,OAAO;QACN,GAAG,EAAE,IAAI;QACT,8DAA8D;QAC9D,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,GAAa;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAC/B,MAAM,GAAG,GAA4B,EAAE,CAAA;YACvC,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;YAClD,OAAO,GAAG,CAAA;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,OAAgD;YACzD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,IAAI,MAAT,IAAI,CAAC,IAAI,IAAM,EAAE,EAAA;gBACjB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;wBAAE,OAAO,IAAI,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC,CAAA;;wBACxD,IAAI,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC;AAED,KAAK,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAW,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,OAAO,GAAG,cAAc,CAAA;AAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAA;AAElC,4EAA4E;AAE5E,QAAQ,CAAC,kEAAkE,EAAE,GAAG,EAAE;IACjF,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrF,0CAA0C;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACxD,8CAA8C;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,OAAO;SACxB,CAAA;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACpG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACtE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oEAAoE,EAAE,GAAG,EAAE;IACnF,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAErF,uCAAuC;QACvC,oEAAoE;QACpE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,OAAO;SACxB,CAAA;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACpG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAA;QAC/D,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,qEAAqE;QACrE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAA;QACjD,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,CAAC,CAAsB,CAAA;QACpF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QAC1G,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;QAC9D,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAsB,CAAA;QACtF,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAM5D,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzC,oEAAoE;QACpE,oCAAoC;QACpC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACtH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,uEAAuE;QACvE,MAAM,KAAK,GAAG;YACb,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,UAAU;YACtB,eAAe,EAAE,iBAAiB;SAClC,CAAA;QACD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACpG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAErF,8CAA8C;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAEtE,8CAA8C;QAC9C,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,CAAC,CAAe,CAAA;QACjF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAe,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACzD,CAAA;QAC1C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -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"}
|