@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,488 @@
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
+ import { Buffer } from 'node:buffer';
32
+ import { describe, test } from 'node:test';
33
+ // libsignal has no .d.ts; importing the JS module directly is fine for a
34
+ // node-test runtime, we just have to widen the type at the boundary.
35
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
36
+ // @ts-expect-error -- no types
37
+ import SessionRecord from 'libsignal/src/session_record.js';
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- bridge proto-types ambient
39
+ import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
40
+ import { wrapLegacyStore } from "../wrap-legacy-store.js";
41
+ import { initAuthCreds } from "../generics.js";
42
+ import { expect } from "../../__tests__/expect.js";
43
+ // ── Helpers ──────────────────────────────────────────────────────────────
44
+ function makeMemKeys() {
45
+ const data = {};
46
+ return {
47
+ raw: data,
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ async get(type, ids) {
50
+ const bucket = data[type] ?? {};
51
+ const out = {};
52
+ for (const id of ids)
53
+ out[id] = bucket[id] ?? null;
54
+ return out;
55
+ },
56
+ async set(updates) {
57
+ for (const [type, bucket] of Object.entries(updates)) {
58
+ data[type] ?? (data[type] = {});
59
+ for (const [id, val] of Object.entries(bucket)) {
60
+ if (val === null || val === undefined)
61
+ delete data[type][id];
62
+ else
63
+ data[type][id] = val;
64
+ }
65
+ }
66
+ }
67
+ };
68
+ }
69
+ async function makeWrapped() {
70
+ const creds = initAuthCreds();
71
+ const keys = makeMemKeys();
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ const state = { creds, keys: keys };
74
+ const wrapped = await wrapLegacyStore(state, async () => { });
75
+ return { wrapped, keys, creds };
76
+ }
77
+ const fill = (n, base) => new Uint8Array(n).map((_, i) => (i * base + base) & 0xff);
78
+ /** Build a realistic, fully-populated `RecordStructure` proto byte blob —
79
+ * matching what Rust libsignal would produce for an established Signal
80
+ * session that has both a sender chain and a receiver chain. */
81
+ function buildBridgeSessionBytes(opts) {
82
+ const { rootKey = fill(32, 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;
83
+ const session = bridgeProto.SessionStructure.create({
84
+ sessionVersion: 3,
85
+ localIdentityPublic: fill(33, 9),
86
+ remoteIdentityPublic: remoteIdentity,
87
+ rootKey,
88
+ previousCounter,
89
+ senderChain: {
90
+ senderRatchetKey: senderRatchetPub,
91
+ senderRatchetKeyPrivate: senderRatchetPriv,
92
+ chainKey: { index: senderChainIndex, key: senderChainKey },
93
+ messageKeys: []
94
+ },
95
+ receiverChains: [
96
+ {
97
+ senderRatchetKey: receiverRatchetPub,
98
+ chainKey: { index: receiverChainIndex, key: receiverChainKey },
99
+ messageKeys: []
100
+ }
101
+ ],
102
+ remoteRegistrationId,
103
+ localRegistrationId,
104
+ aliceBaseKey
105
+ });
106
+ const record = bridgeProto.RecordStructure.create({
107
+ currentSession: session,
108
+ previousSessions: []
109
+ });
110
+ return bridgeProto.RecordStructure.encode(record).finish();
111
+ }
112
+ const SAMPLE_BRIDGE_KEY_LID = '100000037037034@lid.0';
113
+ const EXPECTED_UPSTREAM_KEY_LID = '100000037037034_1.0';
114
+ const SAMPLE_BRIDGE_KEY_PN = '559980000003@s.whatsapp.net.0';
115
+ const EXPECTED_UPSTREAM_KEY_PN = '559980000003.0';
116
+ const SAMPLE_BRIDGE_KEY_PN_DEV = '559980000003:5@s.whatsapp.net.0';
117
+ const EXPECTED_UPSTREAM_KEY_PN_DEV = '559980000003.5';
118
+ // ── Tests ────────────────────────────────────────────────────────────────
119
+ describe('wrap-legacy-store: session key-name translation (cross-impl)', () => {
120
+ test('bridge SET writes under the upstream-formatted key (LID)', async () => {
121
+ const { wrapped, keys } = await makeWrapped();
122
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, buildBridgeSessionBytes({}));
123
+ expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID]).toBeDefined();
124
+ // The bridge-shaped key MUST NOT be written; otherwise upstream's
125
+ // `loadSession(<upstreamKey>)` won't find anything.
126
+ expect(keys.raw['session']?.[SAMPLE_BRIDGE_KEY_LID]).toBeUndefined();
127
+ });
128
+ test('bridge SET writes under the upstream-formatted key (PN, no device)', async () => {
129
+ const { wrapped, keys } = await makeWrapped();
130
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, buildBridgeSessionBytes({}));
131
+ expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN]).toBeDefined();
132
+ });
133
+ test('bridge SET writes under the upstream-formatted key (PN with device)', async () => {
134
+ const { wrapped, keys } = await makeWrapped();
135
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN_DEV, buildBridgeSessionBytes({}));
136
+ expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN_DEV]).toBeDefined();
137
+ });
138
+ });
139
+ describe('wrap-legacy-store: session value-byte translation (cross-impl)', () => {
140
+ test('bridge-written proto bytes are loadable by upstream SessionRecord.deserialize', async () => {
141
+ const { wrapped, keys } = await makeWrapped();
142
+ const aliceBaseKey = Buffer.from(new Uint8Array(33).map((_, i) => (i + 100) & 0xff));
143
+ const rootKey = Buffer.from(new Uint8Array(32).map((_, i) => (i * 3 + 1) & 0xff));
144
+ const remoteIdentity = Buffer.from(new Uint8Array(33).map((_, i) => (i * 5 + 7) & 0xff));
145
+ const senderRatchetPub = Buffer.from(new Uint8Array(33).map((_, i) => (i * 11 + 13) & 0xff));
146
+ const senderRatchetPriv = Buffer.from(new Uint8Array(32).map((_, i) => (i * 13 + 17) & 0xff));
147
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, buildBridgeSessionBytes({
148
+ rootKey: new Uint8Array(rootKey),
149
+ aliceBaseKey: new Uint8Array(aliceBaseKey),
150
+ remoteIdentity: new Uint8Array(remoteIdentity),
151
+ senderRatchetPub: new Uint8Array(senderRatchetPub),
152
+ senderRatchetPriv: new Uint8Array(senderRatchetPriv),
153
+ remoteRegistrationId: 99,
154
+ previousCounter: 4
155
+ }));
156
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
157
+ expect(stored).toBeDefined();
158
+ // THE call upstream's loadSession makes. If it throws or produces a
159
+ // session with no open entries, the regression isn't fixed.
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- libsignal lacks .d.ts
161
+ const rec = SessionRecord.deserialize(stored);
162
+ expect(rec.haveOpenSession()).toBe(true);
163
+ const open = rec.getOpenSession();
164
+ expect(open).toBeDefined();
165
+ expect(open.registrationId).toBe(99);
166
+ expect(open.currentRatchet.previousCounter).toBe(4);
167
+ expect(Buffer.from(open.currentRatchet.rootKey).equals(rootKey)).toBe(true);
168
+ expect(Buffer.from(open.currentRatchet.ephemeralKeyPair.pubKey).equals(senderRatchetPub)).toBe(true);
169
+ expect(Buffer.from(open.currentRatchet.ephemeralKeyPair.privKey).equals(senderRatchetPriv)).toBe(true);
170
+ expect(Buffer.from(open.indexInfo.baseKey).equals(aliceBaseKey)).toBe(true);
171
+ expect(Buffer.from(open.indexInfo.remoteIdentityKey).equals(remoteIdentity)).toBe(true);
172
+ // indexInfo.closed === -1 means the session is OPEN; cross-impl
173
+ // swap of an open session is the whole point.
174
+ expect(open.indexInfo.closed).toBe(-1);
175
+ // We expect at least one chain populated (sender + receiver).
176
+ expect(Object.keys(open._chains).length).toBeGreaterThanOrEqual(1);
177
+ });
178
+ test('upstream-written JS-shaped object round-trips through bridge GET to valid proto bytes', async () => {
179
+ const { wrapped, keys } = await makeWrapped();
180
+ // Build a SessionRecord the upstream way (start from a synthetic
181
+ // session shape, since libsignal exposes no public constructor that
182
+ // fully populates the entry).
183
+ const baseKey = Buffer.alloc(33, 0xa0);
184
+ const rootKey = Buffer.alloc(32, 0xb0);
185
+ const remoteIdent = Buffer.alloc(33, 0xc0);
186
+ const ephPub = Buffer.alloc(33, 0xd0);
187
+ const ephPriv = Buffer.alloc(32, 0xe0);
188
+ const lastRemoteEph = Buffer.alloc(33, 0xf0);
189
+ const upstreamRecord = {
190
+ _sessions: {
191
+ [baseKey.toString('base64')]: {
192
+ registrationId: 4242,
193
+ currentRatchet: {
194
+ ephemeralKeyPair: {
195
+ pubKey: ephPub.toString('base64'),
196
+ privKey: ephPriv.toString('base64')
197
+ },
198
+ lastRemoteEphemeralKey: lastRemoteEph.toString('base64'),
199
+ previousCounter: 7,
200
+ rootKey: rootKey.toString('base64')
201
+ },
202
+ indexInfo: {
203
+ baseKey: baseKey.toString('base64'),
204
+ baseKeyType: 1, // OURS — we initiated
205
+ closed: -1,
206
+ used: Date.now(),
207
+ created: Date.now(),
208
+ remoteIdentityKey: remoteIdent.toString('base64')
209
+ },
210
+ _chains: {}
211
+ }
212
+ },
213
+ version: 'v1'
214
+ };
215
+ keys.raw['session'] = { [EXPECTED_UPSTREAM_KEY_LID]: upstreamRecord };
216
+ const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
217
+ expect(protoOut).not.toBe(null);
218
+ const decoded = bridgeProto.RecordStructure.decode(protoOut);
219
+ expect(decoded.currentSession).toBeDefined();
220
+ const cs = decoded.currentSession;
221
+ expect(cs.remoteRegistrationId).toBe(4242);
222
+ expect(cs.previousCounter).toBe(7);
223
+ expect(Buffer.from(cs.rootKey).equals(rootKey)).toBe(true);
224
+ expect(Buffer.from(cs.aliceBaseKey).equals(baseKey)).toBe(true);
225
+ expect(Buffer.from(cs.remoteIdentityPublic).equals(remoteIdent)).toBe(true);
226
+ expect(Buffer.from(cs.senderChain.senderRatchetKey).equals(ephPub)).toBe(true);
227
+ expect(Buffer.from(cs.senderChain.senderRatchetKeyPrivate).equals(ephPriv)).toBe(true);
228
+ });
229
+ test('round-trip: bridge SET → upstream loadSession+haveOpenSession → still open + correct identity', async () => {
230
+ const { wrapped, keys } = await makeWrapped();
231
+ const remoteIdentity = Buffer.alloc(33, 0x11);
232
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, buildBridgeSessionBytes({ remoteIdentity: new Uint8Array(remoteIdentity), remoteRegistrationId: 7 }));
233
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
234
+ expect(stored).toBeDefined();
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ const rec = SessionRecord.deserialize(stored);
237
+ expect(rec.haveOpenSession()).toBe(true);
238
+ const open = rec.getOpenSession();
239
+ expect(open.registrationId).toBe(7);
240
+ expect(Buffer.from(open.indexInfo.remoteIdentityKey).equals(remoteIdentity)).toBe(true);
241
+ });
242
+ });
243
+ describe('wrap-legacy-store: session edge cases (multi-session, pendingPreKey, lastRemoteEph)', () => {
244
+ test('lastRemoteEphemeralKey does NOT collide with senderRatchetKey when receiverChains is empty (no-collide bug fix)', async () => {
245
+ // Regression for the bug discovered in audit: previously the
246
+ // converter used senderRatchetKey as a placeholder for
247
+ // lastRemoteEphemeralKey when receiverChains was empty, which
248
+ // caused upstream's `maybeStepRatchet` → `getChain(lastRemoteEph)`
249
+ // to return the SENDER chain and `delete chainKey.key` corrupted
250
+ // the outbound encryption channel.
251
+ const { wrapped, keys } = await makeWrapped();
252
+ // Build a freshly-initiated alice-side session: sender chain
253
+ // populated, no receiverChain yet, pendingPreKey set (alice waits
254
+ // for bob's first reply).
255
+ const senderRatchetPub = fill(33, 2);
256
+ const aliceBaseKey = fill(33, 7);
257
+ const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
258
+ currentSession: bridgeProto.SessionStructure.create({
259
+ sessionVersion: 3,
260
+ rootKey: fill(32, 1),
261
+ previousCounter: 0,
262
+ senderChain: {
263
+ senderRatchetKey: senderRatchetPub,
264
+ senderRatchetKeyPrivate: fill(32, 3),
265
+ chainKey: { index: 0, key: fill(32, 4) },
266
+ messageKeys: []
267
+ },
268
+ receiverChains: [],
269
+ remoteIdentityPublic: fill(33, 8),
270
+ remoteRegistrationId: 99,
271
+ localRegistrationId: 11,
272
+ aliceBaseKey,
273
+ pendingPreKey: { preKeyId: 42, signedPreKeyId: 7, baseKey: aliceBaseKey }
274
+ }),
275
+ previousSessions: []
276
+ })).finish();
277
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
278
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
279
+ expect(stored).toBeDefined();
280
+ const entry = Object.values(stored._sessions)[0];
281
+ // The last-remote-eph MUST NOT equal the sender's ratchet pubkey,
282
+ // otherwise upstream's maybeStepRatchet will close the SENDER chain
283
+ // when the peer ratchets next.
284
+ expect(entry.currentRatchet.lastRemoteEphemeralKey).not.toBe(Buffer.from(senderRatchetPub).toString('base64'));
285
+ });
286
+ test('baseKeyType derives from pendingPreKey: present → OURS (alice), absent → THEIRS (bob)', async () => {
287
+ // Regression for the bug where I always set OURS when aliceBaseKey
288
+ // was set (which is ALWAYS in established sessions), causing
289
+ // upstream's `getSession(byBaseKey)` to throw on every lookup.
290
+ const { wrapped, keys } = await makeWrapped();
291
+ // Bob-side session: established, no pendingPreKey, aliceBaseKey set
292
+ // (it's the peer's ephemeral). MUST land as THEIRS so upstream can
293
+ // look it up by baseKey.
294
+ const bobSideBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
295
+ currentSession: bridgeProto.SessionStructure.create({
296
+ sessionVersion: 3,
297
+ rootKey: fill(32, 1),
298
+ previousCounter: 0,
299
+ senderChain: {
300
+ senderRatchetKey: fill(33, 2),
301
+ senderRatchetKeyPrivate: fill(32, 3),
302
+ chainKey: { index: 0, key: fill(32, 4) },
303
+ messageKeys: []
304
+ },
305
+ receiverChains: [
306
+ {
307
+ senderRatchetKey: fill(33, 5),
308
+ chainKey: { index: 1, key: fill(32, 6) },
309
+ messageKeys: []
310
+ }
311
+ ],
312
+ remoteIdentityPublic: fill(33, 8),
313
+ remoteRegistrationId: 1,
314
+ aliceBaseKey: fill(33, 7) // present but we're bob (no pendingPreKey)
315
+ }),
316
+ previousSessions: []
317
+ })).finish();
318
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, bobSideBytes);
319
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
320
+ const bobEntry = Object.values(stored._sessions)[0];
321
+ expect(bobEntry.indexInfo.baseKeyType).toBe(2); // THEIRS
322
+ // Now alice-side: same session shape but with pendingPreKey → OURS.
323
+ const { wrapped: w2, keys: k2 } = await makeWrapped();
324
+ const aliceBaseKey = fill(33, 7);
325
+ const aliceBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
326
+ currentSession: bridgeProto.SessionStructure.create({
327
+ sessionVersion: 3,
328
+ rootKey: fill(32, 1),
329
+ previousCounter: 0,
330
+ senderChain: {
331
+ senderRatchetKey: fill(33, 2),
332
+ senderRatchetKeyPrivate: fill(32, 3),
333
+ chainKey: { index: 0, key: fill(32, 4) },
334
+ messageKeys: []
335
+ },
336
+ receiverChains: [],
337
+ remoteIdentityPublic: fill(33, 8),
338
+ remoteRegistrationId: 1,
339
+ aliceBaseKey,
340
+ pendingPreKey: { preKeyId: 1, signedPreKeyId: 2, baseKey: aliceBaseKey }
341
+ }),
342
+ previousSessions: []
343
+ })).finish();
344
+ await w2.set('session', SAMPLE_BRIDGE_KEY_PN, aliceBytes);
345
+ const aliceStored = k2.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
346
+ const aliceEntry = Object.values(aliceStored._sessions)[0];
347
+ expect(aliceEntry.indexInfo.baseKeyType).toBe(1); // OURS
348
+ });
349
+ test('multi-session: currentSession + previousSessions[] all round-trip into upstream _sessions', async () => {
350
+ // Cover the path where Rust archives sessions into previous_sessions
351
+ // (e.g. after identity change). Upstream should see one OPEN entry
352
+ // (closed=-1) plus one or more closed entries that share the same
353
+ // peer key.
354
+ const { wrapped, keys } = await makeWrapped();
355
+ const mkSession = (rootSeed, baseKeySeed) => bridgeProto.SessionStructure.create({
356
+ sessionVersion: 3,
357
+ rootKey: fill(32, rootSeed),
358
+ previousCounter: 0,
359
+ senderChain: {
360
+ senderRatchetKey: fill(33, rootSeed * 3),
361
+ senderRatchetKeyPrivate: fill(32, rootSeed * 5),
362
+ chainKey: { index: 0, key: fill(32, rootSeed * 7) },
363
+ messageKeys: []
364
+ },
365
+ receiverChains: [
366
+ {
367
+ senderRatchetKey: fill(33, rootSeed * 11),
368
+ chainKey: { index: 1, key: fill(32, rootSeed * 13) },
369
+ messageKeys: []
370
+ }
371
+ ],
372
+ remoteIdentityPublic: fill(33, 8),
373
+ remoteRegistrationId: 1,
374
+ aliceBaseKey: fill(33, baseKeySeed)
375
+ });
376
+ const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
377
+ currentSession: mkSession(1, 100),
378
+ previousSessions: [mkSession(2, 200), mkSession(3, 250)]
379
+ })).finish();
380
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
381
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
382
+ expect(stored.version).toBe('v1');
383
+ // 1 current + 2 previous, distinct baseKeys → 3 entries.
384
+ expect(Object.keys(stored._sessions).length).toBe(3);
385
+ // Exactly one OPEN session (closed=-1).
386
+ const open = Object.values(stored._sessions).filter(e => e.indexInfo.closed === -1);
387
+ expect(open.length).toBe(1);
388
+ expect(open[0].indexInfo.baseKey).toBe(Buffer.from(fill(33, 100)).toString('base64'));
389
+ // The other two are CLOSED with positive timestamps. Most recent
390
+ // archived (previous[0]) must have a LARGER timestamp than
391
+ // previous[1] so removeOldSessions evicts the oldest first
392
+ // (matching Rust's archive ordering: front = newest).
393
+ const closedEntries = Object.values(stored._sessions).filter(e => e.indexInfo.closed > 0);
394
+ expect(closedEntries.length).toBe(2);
395
+ const newer = closedEntries.find(e => e.indexInfo.baseKey === Buffer.from(fill(33, 200)).toString('base64'));
396
+ const older = closedEntries.find(e => e.indexInfo.baseKey === Buffer.from(fill(33, 250)).toString('base64'));
397
+ expect(newer).toBeDefined();
398
+ expect(older).toBeDefined();
399
+ expect(newer.indexInfo.closed).toBeGreaterThan(older.indexInfo.closed);
400
+ });
401
+ test('pendingPreKey: round-trips through bridge→upstream→bridge with field rename preserved', async () => {
402
+ // Bridge proto: pendingPreKey { preKeyId, signedPreKeyId, baseKey }
403
+ // Upstream JS: session.pendingPreKey { preKeyId, signedKeyId, baseKey }
404
+ // (yes, the field name differs — `signedPreKeyId` vs `signedKeyId`)
405
+ const { wrapped, keys } = await makeWrapped();
406
+ const aliceBaseKey = fill(33, 7);
407
+ const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
408
+ currentSession: bridgeProto.SessionStructure.create({
409
+ sessionVersion: 3,
410
+ rootKey: fill(32, 1),
411
+ previousCounter: 0,
412
+ senderChain: {
413
+ senderRatchetKey: fill(33, 2),
414
+ senderRatchetKeyPrivate: fill(32, 3),
415
+ chainKey: { index: 0, key: fill(32, 4) },
416
+ messageKeys: []
417
+ },
418
+ receiverChains: [],
419
+ remoteIdentityPublic: fill(33, 8),
420
+ remoteRegistrationId: 1,
421
+ aliceBaseKey,
422
+ pendingPreKey: { preKeyId: 314, signedPreKeyId: 271, baseKey: aliceBaseKey }
423
+ }),
424
+ previousSessions: []
425
+ })).finish();
426
+ await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
427
+ const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
428
+ const entry = Object.values(stored._sessions)[0];
429
+ expect(entry.pendingPreKey).toBeDefined();
430
+ expect(entry.pendingPreKey.preKeyId).toBe(314);
431
+ // Field rename: bridge's `signedPreKeyId` → upstream's `signedKeyId`.
432
+ expect(entry.pendingPreKey.signedKeyId).toBe(271);
433
+ expect(entry.pendingPreKey.baseKey).toBe(Buffer.from(aliceBaseKey).toString('base64'));
434
+ // Now read it back through the bridge GET path — pendingPreKey
435
+ // should round-trip with the original field names.
436
+ const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
437
+ const decoded = bridgeProto.RecordStructure.decode(protoOut);
438
+ expect(decoded.currentSession?.pendingPreKey?.preKeyId).toBe(314);
439
+ expect(decoded.currentSession?.pendingPreKey?.signedPreKeyId).toBe(271);
440
+ });
441
+ test('aliceBaseKey is preserved on JS→bridge round-trip regardless of baseKeyType', async () => {
442
+ // Regression for the matching-second bug discovered in audit: the
443
+ // reverse converter only set aliceBaseKey when baseKeyType=OURS, so
444
+ // bob-side sessions lost aliceBaseKey, breaking Rust's
445
+ // `find_matching_previous_session_index` lookups on subsequent
446
+ // PreKeySignal arrivals.
447
+ const { wrapped, keys } = await makeWrapped();
448
+ const baseKey = Buffer.alloc(33, 0xa0);
449
+ const remoteIdent = Buffer.alloc(33, 0xc0);
450
+ const ephPub = Buffer.alloc(33, 0xd0);
451
+ const ephPriv = Buffer.alloc(32, 0xe0);
452
+ const lastRemoteEph = Buffer.alloc(33, 0xf0);
453
+ const rootKey = Buffer.alloc(32, 0xb0);
454
+ // Bob-side stored object (baseKeyType=THEIRS, no pendingPreKey).
455
+ keys.raw['session'] = {
456
+ [EXPECTED_UPSTREAM_KEY_LID]: {
457
+ _sessions: {
458
+ [baseKey.toString('base64')]: {
459
+ registrationId: 4242,
460
+ currentRatchet: {
461
+ ephemeralKeyPair: { pubKey: ephPub.toString('base64'), privKey: ephPriv.toString('base64') },
462
+ lastRemoteEphemeralKey: lastRemoteEph.toString('base64'),
463
+ previousCounter: 0,
464
+ rootKey: rootKey.toString('base64')
465
+ },
466
+ indexInfo: {
467
+ baseKey: baseKey.toString('base64'),
468
+ baseKeyType: 2, // THEIRS — we're bob
469
+ closed: -1,
470
+ used: Date.now(),
471
+ created: Date.now(),
472
+ remoteIdentityKey: remoteIdent.toString('base64')
473
+ },
474
+ _chains: {}
475
+ }
476
+ },
477
+ version: 'v1'
478
+ }
479
+ };
480
+ const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
481
+ const decoded = bridgeProto.RecordStructure.decode(protoOut);
482
+ // aliceBaseKey MUST be set even when we're bob (baseKeyType=THEIRS),
483
+ // otherwise Rust's session-matching path breaks.
484
+ expect(decoded.currentSession?.aliceBaseKey).toBeDefined();
485
+ expect(Buffer.from(decoded.currentSession.aliceBaseKey).equals(baseKey)).toBe(true);
486
+ });
487
+ });
488
+ //# sourceMappingURL=wrap-legacy-store-session.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-legacy-store-session.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-session.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface BoomPayload {
2
+ readonly statusCode: number;
3
+ readonly error: string;
4
+ readonly message: string;
5
+ }
6
+ export interface BoomOutput {
7
+ readonly statusCode: number;
8
+ readonly headers: Readonly<Record<string, string>>;
9
+ readonly payload: BoomPayload;
10
+ }
11
+ export interface BoomOptions<TData = unknown> {
12
+ readonly statusCode?: number;
13
+ readonly data?: TData;
14
+ readonly cause?: unknown;
15
+ }
16
+ export declare class Boom<TData = unknown> extends Error {
17
+ readonly isBoom: true;
18
+ readonly statusCode: number;
19
+ readonly data?: TData;
20
+ constructor(message?: string | Error, options?: BoomOptions<TData>);
21
+ get isServer(): boolean;
22
+ /**
23
+ * `@hapi/boom`-compatible nested status info. Computed on every access
24
+ * (no `#private` cache) so the getter survives prototype-chain rewrites
25
+ * by other Boom-shaped wrappers — concretely, `new HapiBoom(ourBoom)`
26
+ * coerces the input to be `instanceof Boom` via `Object.setPrototypeOf`
27
+ * but never calls our constructor, leaving any private slot uninitialized
28
+ * and crashing the getter at runtime.
29
+ */
30
+ get output(): BoomOutput;
31
+ static isBoom(err: unknown): err is Boom;
32
+ }
33
+ //# sourceMappingURL=boom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boom.d.ts","sourceRoot":"","sources":["../../src/Utils/boom.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,OAAO;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACxB;AA2BD,qBAAa,IAAI,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAG,IAAI,CAAS;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;gBAET,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAE,WAAW,CAAC,KAAK,CAAM;IAQtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;;;OAOG;IACH,IAAI,MAAM,IAAI,UAAU,CAUvB;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,IAAI;CAGxC"}
@@ -0,0 +1,63 @@
1
+ const EMPTY_HEADERS = Object.freeze({});
2
+ const STATUS_PHRASES = Object.freeze({
3
+ 400: 'Bad Request',
4
+ 401: 'Unauthorized',
5
+ 403: 'Forbidden',
6
+ 404: 'Not Found',
7
+ 408: 'Request Timeout',
8
+ 411: 'Length Required',
9
+ 428: 'Precondition Required',
10
+ 440: 'Login Timeout',
11
+ 499: 'Client Closed Request',
12
+ 500: 'Internal Server Error',
13
+ 503: 'Service Unavailable',
14
+ 515: 'HTTP Version Not Supported'
15
+ });
16
+ function statusPhrase(code) {
17
+ const known = STATUS_PHRASES[code];
18
+ if (known !== undefined)
19
+ return known;
20
+ if (code >= 500)
21
+ return 'Server Error';
22
+ if (code >= 400)
23
+ return 'Client Error';
24
+ return 'Error';
25
+ }
26
+ export class Boom extends Error {
27
+ constructor(message, options = {}) {
28
+ const msg = message instanceof Error ? message.message : (message ?? 'Unknown error');
29
+ super(msg, options.cause !== undefined ? { cause: options.cause } : undefined);
30
+ this.isBoom = true;
31
+ this.statusCode = options.statusCode ?? 500;
32
+ if (options.data !== undefined)
33
+ this.data = options.data;
34
+ if (message instanceof Error && message.stack)
35
+ this.stack = message.stack;
36
+ }
37
+ get isServer() {
38
+ return this.statusCode >= 500;
39
+ }
40
+ /**
41
+ * `@hapi/boom`-compatible nested status info. Computed on every access
42
+ * (no `#private` cache) so the getter survives prototype-chain rewrites
43
+ * by other Boom-shaped wrappers — concretely, `new HapiBoom(ourBoom)`
44
+ * coerces the input to be `instanceof Boom` via `Object.setPrototypeOf`
45
+ * but never calls our constructor, leaving any private slot uninitialized
46
+ * and crashing the getter at runtime.
47
+ */
48
+ get output() {
49
+ return {
50
+ statusCode: this.statusCode,
51
+ headers: EMPTY_HEADERS,
52
+ payload: {
53
+ statusCode: this.statusCode,
54
+ error: statusPhrase(this.statusCode),
55
+ message: this.message
56
+ }
57
+ };
58
+ }
59
+ static isBoom(err) {
60
+ return typeof err === 'object' && err !== null && err.isBoom === true;
61
+ }
62
+ }
63
+ //# sourceMappingURL=boom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boom.js","sourceRoot":"","sources":["../../src/Utils/boom.ts"],"names":[],"mappings":"AAkBA,MAAM,aAAa,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,4BAA4B;CACxB,CAA4C,CAAA;AAEtD,SAAS,YAAY,CAAC,IAAY;IACjC,MAAM,KAAK,GAAI,cAAmD,CAAC,IAAI,CAAC,CAAA;IACxE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,cAAc,CAAA;IACtC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,cAAc,CAAA;IACtC,OAAO,OAAO,CAAA;AACf,CAAC;AAED,MAAM,OAAO,IAAsB,SAAQ,KAAK;IAK/C,YAAY,OAAwB,EAAE,UAA8B,EAAE;QACrE,MAAM,GAAG,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,CAAA;QACrF,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QANtE,WAAM,GAAG,IAAa,CAAA;QAO9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAA;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxD,IAAI,OAAO,YAAY,KAAK,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1E,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,UAAU,IAAI,GAAG,CAAA;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,MAAM;QACT,OAAO;YACN,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;gBACpC,OAAO,EAAE,IAAI,CAAC,OAAO;aACrB;SACD,CAAA;IACF,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAY;QACzB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAK,GAA4B,CAAC,MAAM,KAAK,IAAI,CAAA;IAChG,CAAC;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAgBjD,eAAO,MAAM,QAAQ,EAAE,WAMtB,CAAA"}
1
+ {"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgBpD,eAAO,MAAM,QAAQ,EAAE,WAMtB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-buffer.d.ts","sourceRoot":"","sources":["../../src/Utils/event-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,gBAAgB,CAAA;AAE1E;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,mBAuClC,CAAA"}
1
+ {"version":3,"file":"event-buffer.d.ts","sourceRoot":"","sources":["../../src/Utils/event-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,mBAuClC,CAAA"}