@zapo-js/fake-server 0.3.0

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 (238) hide show
  1. package/README.md +176 -0
  2. package/dist/api/AppStateSyncManager.d.ts +27 -0
  3. package/dist/api/AppStateSyncManager.d.ts.map +1 -0
  4. package/dist/api/AppStateSyncManager.js +151 -0
  5. package/dist/api/AppStateSyncManager.js.map +1 -0
  6. package/dist/api/FakePairingDriver.d.ts +27 -0
  7. package/dist/api/FakePairingDriver.d.ts.map +1 -0
  8. package/dist/api/FakePairingDriver.js +36 -0
  9. package/dist/api/FakePairingDriver.js.map +1 -0
  10. package/dist/api/FakePeer.d.ts +143 -0
  11. package/dist/api/FakePeer.d.ts.map +1 -0
  12. package/dist/api/FakePeer.js +408 -0
  13. package/dist/api/FakePeer.js.map +1 -0
  14. package/dist/api/FakeWaServer.d.ts +167 -0
  15. package/dist/api/FakeWaServer.d.ts.map +1 -0
  16. package/dist/api/FakeWaServer.js +652 -0
  17. package/dist/api/FakeWaServer.js.map +1 -0
  18. package/dist/api/PreKeyDispenser.d.ts +23 -0
  19. package/dist/api/PreKeyDispenser.d.ts.map +1 -0
  20. package/dist/api/PreKeyDispenser.js +98 -0
  21. package/dist/api/PreKeyDispenser.js.map +1 -0
  22. package/dist/api/Scenario.d.ts +24 -0
  23. package/dist/api/Scenario.d.ts.map +1 -0
  24. package/dist/api/Scenario.js +38 -0
  25. package/dist/api/Scenario.js.map +1 -0
  26. package/dist/api/ServerRegistries.d.ts +110 -0
  27. package/dist/api/ServerRegistries.d.ts.map +1 -0
  28. package/dist/api/ServerRegistries.js +268 -0
  29. package/dist/api/ServerRegistries.js.map +1 -0
  30. package/dist/api/iq-handlers.d.ts +47 -0
  31. package/dist/api/iq-handlers.d.ts.map +1 -0
  32. package/dist/api/iq-handlers.js +498 -0
  33. package/dist/api/iq-handlers.js.map +1 -0
  34. package/dist/cli.d.ts +4 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +249 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/index.d.ts +51 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +74 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/infra/WaFakeConnection.d.ts +23 -0
  43. package/dist/infra/WaFakeConnection.d.ts.map +1 -0
  44. package/dist/infra/WaFakeConnection.js +54 -0
  45. package/dist/infra/WaFakeConnection.js.map +1 -0
  46. package/dist/infra/WaFakeConnectionPipeline.d.ts +51 -0
  47. package/dist/infra/WaFakeConnectionPipeline.d.ts.map +1 -0
  48. package/dist/infra/WaFakeConnectionPipeline.js +224 -0
  49. package/dist/infra/WaFakeConnectionPipeline.js.map +1 -0
  50. package/dist/infra/WaFakeFrameSocket.d.ts +29 -0
  51. package/dist/infra/WaFakeFrameSocket.d.ts.map +1 -0
  52. package/dist/infra/WaFakeFrameSocket.js +122 -0
  53. package/dist/infra/WaFakeFrameSocket.js.map +1 -0
  54. package/dist/infra/WaFakeMediaHttpsServer.d.ts +16 -0
  55. package/dist/infra/WaFakeMediaHttpsServer.d.ts.map +1 -0
  56. package/dist/infra/WaFakeMediaHttpsServer.js +131 -0
  57. package/dist/infra/WaFakeMediaHttpsServer.js.map +1 -0
  58. package/dist/infra/WaFakeNoiseHandshake.d.ts +23 -0
  59. package/dist/infra/WaFakeNoiseHandshake.d.ts.map +1 -0
  60. package/dist/infra/WaFakeNoiseHandshake.js +76 -0
  61. package/dist/infra/WaFakeNoiseHandshake.js.map +1 -0
  62. package/dist/infra/WaFakeTransport.d.ts +15 -0
  63. package/dist/infra/WaFakeTransport.d.ts.map +1 -0
  64. package/dist/infra/WaFakeTransport.js +34 -0
  65. package/dist/infra/WaFakeTransport.js.map +1 -0
  66. package/dist/infra/WaFakeWsServer.d.ts +29 -0
  67. package/dist/infra/WaFakeWsServer.d.ts.map +1 -0
  68. package/dist/infra/WaFakeWsServer.js +101 -0
  69. package/dist/infra/WaFakeWsServer.js.map +1 -0
  70. package/dist/protocol/auth/cert-chain.d.ts +18 -0
  71. package/dist/protocol/auth/cert-chain.d.ts.map +1 -0
  72. package/dist/protocol/auth/cert-chain.js +44 -0
  73. package/dist/protocol/auth/cert-chain.js.map +1 -0
  74. package/dist/protocol/auth/client-payload-validate.d.ts +21 -0
  75. package/dist/protocol/auth/client-payload-validate.d.ts.map +1 -0
  76. package/dist/protocol/auth/client-payload-validate.js +61 -0
  77. package/dist/protocol/auth/client-payload-validate.js.map +1 -0
  78. package/dist/protocol/auth/fake-primary-device.d.ts +19 -0
  79. package/dist/protocol/auth/fake-primary-device.d.ts.map +1 -0
  80. package/dist/protocol/auth/fake-primary-device.js +53 -0
  81. package/dist/protocol/auth/fake-primary-device.js.map +1 -0
  82. package/dist/protocol/auth/pair-device.d.ts +26 -0
  83. package/dist/protocol/auth/pair-device.d.ts.map +1 -0
  84. package/dist/protocol/auth/pair-device.js +104 -0
  85. package/dist/protocol/auth/pair-device.js.map +1 -0
  86. package/dist/protocol/auth/success-node.d.ts +15 -0
  87. package/dist/protocol/auth/success-node.d.ts.map +1 -0
  88. package/dist/protocol/auth/success-node.js +30 -0
  89. package/dist/protocol/auth/success-node.js.map +1 -0
  90. package/dist/protocol/iq/abprops.d.ts +14 -0
  91. package/dist/protocol/iq/abprops.d.ts.map +1 -0
  92. package/dist/protocol/iq/abprops.js +34 -0
  93. package/dist/protocol/iq/abprops.js.map +1 -0
  94. package/dist/protocol/iq/appstate-sync.d.ts +38 -0
  95. package/dist/protocol/iq/appstate-sync.d.ts.map +1 -0
  96. package/dist/protocol/iq/appstate-sync.js +154 -0
  97. package/dist/protocol/iq/appstate-sync.js.map +1 -0
  98. package/dist/protocol/iq/business.d.ts +13 -0
  99. package/dist/protocol/iq/business.d.ts.map +1 -0
  100. package/dist/protocol/iq/business.js +64 -0
  101. package/dist/protocol/iq/business.js.map +1 -0
  102. package/dist/protocol/iq/dirty-bits.d.ts +8 -0
  103. package/dist/protocol/iq/dirty-bits.d.ts.map +1 -0
  104. package/dist/protocol/iq/dirty-bits.js +23 -0
  105. package/dist/protocol/iq/dirty-bits.js.map +1 -0
  106. package/dist/protocol/iq/group-ops.d.ts +34 -0
  107. package/dist/protocol/iq/group-ops.d.ts.map +1 -0
  108. package/dist/protocol/iq/group-ops.js +164 -0
  109. package/dist/protocol/iq/group-ops.js.map +1 -0
  110. package/dist/protocol/iq/newsletter.d.ts +4 -0
  111. package/dist/protocol/iq/newsletter.d.ts.map +1 -0
  112. package/dist/protocol/iq/newsletter.js +18 -0
  113. package/dist/protocol/iq/newsletter.js.map +1 -0
  114. package/dist/protocol/iq/prekey-fetch.d.ts +18 -0
  115. package/dist/protocol/iq/prekey-fetch.d.ts.map +1 -0
  116. package/dist/protocol/iq/prekey-fetch.js +92 -0
  117. package/dist/protocol/iq/prekey-fetch.js.map +1 -0
  118. package/dist/protocol/iq/privacy-token.d.ts +9 -0
  119. package/dist/protocol/iq/privacy-token.d.ts.map +1 -0
  120. package/dist/protocol/iq/privacy-token.js +30 -0
  121. package/dist/protocol/iq/privacy-token.js.map +1 -0
  122. package/dist/protocol/iq/privacy.d.ts +22 -0
  123. package/dist/protocol/iq/privacy.d.ts.map +1 -0
  124. package/dist/protocol/iq/privacy.js +133 -0
  125. package/dist/protocol/iq/privacy.js.map +1 -0
  126. package/dist/protocol/iq/profile.d.ts +22 -0
  127. package/dist/protocol/iq/profile.d.ts.map +1 -0
  128. package/dist/protocol/iq/profile.js +80 -0
  129. package/dist/protocol/iq/profile.js.map +1 -0
  130. package/dist/protocol/iq/router.d.ts +39 -0
  131. package/dist/protocol/iq/router.d.ts.map +1 -0
  132. package/dist/protocol/iq/router.js +118 -0
  133. package/dist/protocol/iq/router.js.map +1 -0
  134. package/dist/protocol/iq/usync.d.ts +8 -0
  135. package/dist/protocol/iq/usync.d.ts.map +1 -0
  136. package/dist/protocol/iq/usync.js +68 -0
  137. package/dist/protocol/iq/usync.js.map +1 -0
  138. package/dist/protocol/push/app-state-key-share.d.ts +17 -0
  139. package/dist/protocol/push/app-state-key-share.d.ts.map +1 -0
  140. package/dist/protocol/push/app-state-key-share.js +30 -0
  141. package/dist/protocol/push/app-state-key-share.js.map +1 -0
  142. package/dist/protocol/push/call-failure.d.ts +16 -0
  143. package/dist/protocol/push/call-failure.d.ts.map +1 -0
  144. package/dist/protocol/push/call-failure.js +32 -0
  145. package/dist/protocol/push/call-failure.js.map +1 -0
  146. package/dist/protocol/push/chatstate.d.ts +15 -0
  147. package/dist/protocol/push/chatstate.d.ts.map +1 -0
  148. package/dist/protocol/push/chatstate.js +27 -0
  149. package/dist/protocol/push/chatstate.js.map +1 -0
  150. package/dist/protocol/push/error-stanza.d.ts +8 -0
  151. package/dist/protocol/push/error-stanza.d.ts.map +1 -0
  152. package/dist/protocol/push/error-stanza.js +17 -0
  153. package/dist/protocol/push/error-stanza.js.map +1 -0
  154. package/dist/protocol/push/history-sync.d.ts +46 -0
  155. package/dist/protocol/push/history-sync.d.ts.map +1 -0
  156. package/dist/protocol/push/history-sync.js +117 -0
  157. package/dist/protocol/push/history-sync.js.map +1 -0
  158. package/dist/protocol/push/message.d.ts +21 -0
  159. package/dist/protocol/push/message.d.ts.map +1 -0
  160. package/dist/protocol/push/message.js +42 -0
  161. package/dist/protocol/push/message.js.map +1 -0
  162. package/dist/protocol/push/notification.d.ts +21 -0
  163. package/dist/protocol/push/notification.d.ts.map +1 -0
  164. package/dist/protocol/push/notification.js +34 -0
  165. package/dist/protocol/push/notification.js.map +1 -0
  166. package/dist/protocol/push/presence.d.ts +11 -0
  167. package/dist/protocol/push/presence.d.ts.map +1 -0
  168. package/dist/protocol/push/presence.js +18 -0
  169. package/dist/protocol/push/presence.js.map +1 -0
  170. package/dist/protocol/push/receipt.d.ts +14 -0
  171. package/dist/protocol/push/receipt.d.ts.map +1 -0
  172. package/dist/protocol/push/receipt.js +25 -0
  173. package/dist/protocol/push/receipt.js.map +1 -0
  174. package/dist/protocol/signal/fake-app-state-crypto.d.ts +49 -0
  175. package/dist/protocol/signal/fake-app-state-crypto.d.ts.map +1 -0
  176. package/dist/protocol/signal/fake-app-state-crypto.js +202 -0
  177. package/dist/protocol/signal/fake-app-state-crypto.js.map +1 -0
  178. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts +38 -0
  179. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts.map +1 -0
  180. package/dist/protocol/signal/fake-peer-double-ratchet.js +408 -0
  181. package/dist/protocol/signal/fake-peer-double-ratchet.js.map +1 -0
  182. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts +10 -0
  183. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts.map +1 -0
  184. package/dist/protocol/signal/fake-peer-group-recv-session.js +129 -0
  185. package/dist/protocol/signal/fake-peer-group-recv-session.js.map +1 -0
  186. package/dist/protocol/signal/fake-peer-identity.d.ts +7 -0
  187. package/dist/protocol/signal/fake-peer-identity.d.ts.map +1 -0
  188. package/dist/protocol/signal/fake-peer-identity.js +12 -0
  189. package/dist/protocol/signal/fake-peer-identity.js.map +1 -0
  190. package/dist/protocol/signal/fake-peer-key-bundle.d.ts +24 -0
  191. package/dist/protocol/signal/fake-peer-key-bundle.d.ts.map +1 -0
  192. package/dist/protocol/signal/fake-peer-key-bundle.js +29 -0
  193. package/dist/protocol/signal/fake-peer-key-bundle.js.map +1 -0
  194. package/dist/protocol/signal/fake-peer-recv-session.d.ts +60 -0
  195. package/dist/protocol/signal/fake-peer-recv-session.d.ts.map +1 -0
  196. package/dist/protocol/signal/fake-peer-recv-session.js +284 -0
  197. package/dist/protocol/signal/fake-peer-recv-session.js.map +1 -0
  198. package/dist/protocol/signal/fake-peer-session.d.ts +87 -0
  199. package/dist/protocol/signal/fake-peer-session.d.ts.map +1 -0
  200. package/dist/protocol/signal/fake-peer-session.js +207 -0
  201. package/dist/protocol/signal/fake-peer-session.js.map +1 -0
  202. package/dist/protocol/signal/fake-sender-key.d.ts +15 -0
  203. package/dist/protocol/signal/fake-sender-key.d.ts.map +1 -0
  204. package/dist/protocol/signal/fake-sender-key.js +91 -0
  205. package/dist/protocol/signal/fake-sender-key.js.map +1 -0
  206. package/dist/protocol/signal/prekey-upload.d.ts +22 -0
  207. package/dist/protocol/signal/prekey-upload.d.ts.map +1 -0
  208. package/dist/protocol/signal/prekey-upload.js +113 -0
  209. package/dist/protocol/signal/prekey-upload.js.map +1 -0
  210. package/dist/protocol/stream/stream-error.d.ts +8 -0
  211. package/dist/protocol/stream/stream-error.d.ts.map +1 -0
  212. package/dist/protocol/stream/stream-error.js +64 -0
  213. package/dist/protocol/stream/stream-error.js.map +1 -0
  214. package/dist/state/fake-app-state-collection.d.ts +35 -0
  215. package/dist/state/fake-app-state-collection.d.ts.map +1 -0
  216. package/dist/state/fake-app-state-collection.js +139 -0
  217. package/dist/state/fake-app-state-collection.js.map +1 -0
  218. package/dist/state/fake-media-store.d.ts +35 -0
  219. package/dist/state/fake-media-store.d.ts.map +1 -0
  220. package/dist/state/fake-media-store.js +57 -0
  221. package/dist/state/fake-media-store.js.map +1 -0
  222. package/dist/transport/codec.d.ts +10 -0
  223. package/dist/transport/codec.d.ts.map +1 -0
  224. package/dist/transport/codec.js +17 -0
  225. package/dist/transport/codec.js.map +1 -0
  226. package/dist/transport/crypto.d.ts +11 -0
  227. package/dist/transport/crypto.d.ts.map +1 -0
  228. package/dist/transport/crypto.js +36 -0
  229. package/dist/transport/crypto.js.map +1 -0
  230. package/dist/transport/index.d.ts +4 -0
  231. package/dist/transport/index.d.ts.map +1 -0
  232. package/dist/transport/index.js +20 -0
  233. package/dist/transport/index.js.map +1 -0
  234. package/dist/transport/protos.d.ts +10 -0
  235. package/dist/transport/protos.d.ts.map +1 -0
  236. package/dist/transport/protos.js +13 -0
  237. package/dist/transport/protos.js.map +1 -0
  238. package/package.json +43 -0
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ /**
3
+ * Fake-peer-side Signal Protocol session.
4
+ *
5
+ * This is the encrypter half: a fake peer (acting as "Alice") sends messages
6
+ * to the real `WaClient` (acting as "Bob"). It implements just enough of
7
+ * the WhatsApp Web Signal Protocol to:
8
+ *
9
+ * 1. Run X3DH against the client's prekey bundle (captured from the
10
+ * client's PreKey upload IQ).
11
+ * 2. Maintain a sending chain key.
12
+ * 3. Encrypt a plaintext into a `PreKeySignalMessage` (first message)
13
+ * or `SignalMessage` (subsequent messages).
14
+ *
15
+ * Sources:
16
+ * /deobfuscated/WASignal/WASignalWhitepaper.js (X3DH inputs)
17
+ * /deobfuscated/WASignal/WASignalSessions.js (session structure)
18
+ * /deobfuscated/WASignal/WASignalCipher.js (encrypt path)
19
+ * /deobfuscated/pb/WASignalWhisperTextProtocol_pb.js (protobuf shapes)
20
+ *
21
+ * Cross-checked against the lib's `initiateSessionOutgoing` /
22
+ * `encryptMsg` (`src/signal/session/SignalSession.ts`,
23
+ * `src/signal/session/SignalRatchet.ts`) — the byte-level recipe is the
24
+ * same; the only difference is that this fake-peer implementation does
25
+ * **not** persist sessions or implement the receive ratchet (the fake
26
+ * server doesn't need to handle inbound messages from the real client to
27
+ * make Phase 8 work).
28
+ */
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.FakePeerSession = void 0;
31
+ exports.generateFakePeerIdentity = generateFakePeerIdentity;
32
+ const crypto_1 = require("../../transport/crypto");
33
+ const protos_1 = require("../../transport/protos");
34
+ const SIGNAL_VERSION = 3;
35
+ const SIGNAL_MAC_SIZE = 8;
36
+ const SIGNAL_PREFIX_FF = new Uint8Array(32).fill(0xff);
37
+ const MESSAGE_KEY_LABEL = new Uint8Array([1]);
38
+ const CHAIN_KEY_LABEL = new Uint8Array([2]);
39
+ async function generateFakePeerIdentity() {
40
+ const identityKeyPair = await crypto_1.X25519.generateKeyPair();
41
+ return {
42
+ identityKeyPair,
43
+ registrationId: Math.floor(Math.random() * 0x3fff) + 1
44
+ };
45
+ }
46
+ class FakePeerSession {
47
+ constructor(identity, localPub, remotePub, rootKey, sendChain, firstMessageHeader) {
48
+ this.identity = identity;
49
+ this.localPub = localPub;
50
+ this.remotePub = remotePub;
51
+ this.rootKey = rootKey;
52
+ this.sendChain = sendChain;
53
+ this.firstMessageHeader = firstMessageHeader;
54
+ }
55
+ get registrationId() {
56
+ return this.identity.registrationId;
57
+ }
58
+ /**
59
+ * Initiates a new outgoing session against the client's prekey bundle.
60
+ *
61
+ * Mirrors the X3DH initiator path of `initiateSessionOutgoing` (lib)
62
+ * and the deobfuscated `WASignalSessions.initiateSessionOutgoing`:
63
+ *
64
+ * localOneTimeBase = generate ephemeral keypair (Alice's "base key")
65
+ *
66
+ * DH1 = ECDH(local.identity.priv, remote.signedPreKey.pub)
67
+ * DH2 = ECDH(localOneTimeBase.priv, remote.identity.pub)
68
+ * DH3 = ECDH(localOneTimeBase.priv, remote.signedPreKey.pub)
69
+ * DH4 = ECDH(localOneTimeBase.priv, remote.oneTimePreKey.pub) [optional]
70
+ *
71
+ * secret = 0xFF*32 || DH1 || DH2 || DH3 || [DH4]
72
+ * [rootKey, chainKey] = HKDF_split(secret, salt=null, info="WhisperText")
73
+ *
74
+ * Then a single send-ratchet kick:
75
+ * sendRatchetKeyPair = generateKeyPair()
76
+ * sharedSecret = ECDH(sendRatchetKeyPair.priv, remoteRatchetKey)
77
+ * [rootKey, chainKey] = HKDF_split(sharedSecret, salt=rootKey, info="WhisperRatchet")
78
+ *
79
+ * Where remoteRatchetKey = remote.signedPreKey.pub (no separate
80
+ * ratchet key in the upload IQ — this matches the lib's behavior).
81
+ */
82
+ static async initiate(identity, bundle, oneTimePreKey) {
83
+ const localPub = (0, crypto_1.toSerializedPubKey)(identity.identityKeyPair.pubKey);
84
+ const remoteIdentity = (0, crypto_1.toSerializedPubKey)(bundle.identityKey);
85
+ const remoteSigned = (0, crypto_1.toSerializedPubKey)(bundle.signedPreKey.publicKey);
86
+ const localBase = await crypto_1.X25519.generateKeyPair();
87
+ const localBaseSerialized = (0, crypto_1.toSerializedPubKey)(localBase.pubKey);
88
+ // Resolve which one-time prekey we're consuming. Callers normally pass
89
+ // the one we want to consume; if omitted, take the first.
90
+ const consumedOneTime = oneTimePreKey ?? bundle.preKeys[0];
91
+ const remoteOneTime = consumedOneTime ? (0, crypto_1.toSerializedPubKey)(consumedOneTime.publicKey) : null;
92
+ // X3DH DHs.
93
+ const [dh1, dh2, dh3, dh4] = await Promise.all([
94
+ crypto_1.X25519.scalarMult(identity.identityKeyPair.privKey, (0, crypto_1.toRawPubKey)(remoteSigned)),
95
+ crypto_1.X25519.scalarMult(localBase.privKey, (0, crypto_1.toRawPubKey)(remoteIdentity)),
96
+ crypto_1.X25519.scalarMult(localBase.privKey, (0, crypto_1.toRawPubKey)(remoteSigned)),
97
+ remoteOneTime
98
+ ? crypto_1.X25519.scalarMult(localBase.privKey, (0, crypto_1.toRawPubKey)(remoteOneTime))
99
+ : Promise.resolve(null)
100
+ ]);
101
+ const sharedParts = [SIGNAL_PREFIX_FF, dh1, dh2, dh3];
102
+ if (dh4)
103
+ sharedParts.push(dh4);
104
+ const shared = concatBytes(sharedParts);
105
+ const [rootKey, chainKey] = await (0, crypto_1.hkdfSplit)(shared, null, 'WhisperText');
106
+ // Single send-ratchet kick: generate sendRatchet, mix DH(send.priv, remoteSigned).
107
+ const sendRatchet = await crypto_1.X25519.generateKeyPair();
108
+ const ratchetSecret = await crypto_1.X25519.scalarMult(sendRatchet.privKey, (0, crypto_1.toRawPubKey)(remoteSigned));
109
+ const [nextRootKey, sendChainKey] = await (0, crypto_1.hkdfSplit)(ratchetSecret, rootKey, 'WhisperRatchet');
110
+ const sendChain = {
111
+ ratchetPubKey: (0, crypto_1.toSerializedPubKey)(sendRatchet.pubKey),
112
+ ratchetPrivKey: sendRatchet.privKey,
113
+ chainKey: sendChainKey,
114
+ nextIndex: 0
115
+ };
116
+ // Pin the chain key reference to silence "ts(6133): never read" — it
117
+ // is read on every encrypt() invocation. (Defensive no-op.)
118
+ void chainKey;
119
+ return new FakePeerSession(identity, localPub, remoteIdentity, nextRootKey, sendChain, {
120
+ preKeyId: consumedOneTime?.keyId,
121
+ signedPreKeyId: bundle.signedPreKey.keyId,
122
+ baseKey: localBaseSerialized
123
+ });
124
+ }
125
+ /**
126
+ * Encrypts a plaintext message and returns either a `pkmsg` (first
127
+ * message in the session — wraps the SignalMessage in a
128
+ * PreKeySignalMessage envelope) or `msg` (subsequent messages).
129
+ */
130
+ async encrypt(plaintext) {
131
+ const { nextChainKey, messageKey } = await deriveMessageKey(this.sendChain.nextIndex, this.sendChain.chainKey);
132
+ const [cipherKey, macKey] = await Promise.all([
133
+ (0, crypto_1.importAesCbcKey)(messageKey.cipherKey),
134
+ (0, crypto_1.importHmacKey)(messageKey.macKey)
135
+ ]);
136
+ const ciphertext = await (0, crypto_1.aesCbcEncrypt)(cipherKey, messageKey.iv, plaintext);
137
+ const signalMessage = protos_1.proto.SignalMessage.encode({
138
+ ratchetKey: this.sendChain.ratchetPubKey,
139
+ counter: messageKey.index,
140
+ previousCounter: 0,
141
+ ciphertext
142
+ }).finish();
143
+ const versioned = (0, crypto_1.prependVersion)(signalMessage, SIGNAL_VERSION);
144
+ const macInput = concatBytes([this.localPub, this.remotePub, versioned]);
145
+ const fullMac = await (0, crypto_1.hmacSign)(macKey, macInput);
146
+ const truncatedMac = fullMac.subarray(0, SIGNAL_MAC_SIZE);
147
+ const inner = concatBytes([versioned, truncatedMac]);
148
+ // Advance chain (single-direction; no ratchet rotation in fake peer).
149
+ this.sendChain = {
150
+ ...this.sendChain,
151
+ chainKey: nextChainKey,
152
+ nextIndex: messageKey.index + 1
153
+ };
154
+ // rootKey is unused after the initial kick because we never rotate
155
+ // ratchets on the peer side. Keep the field for completeness.
156
+ void this.rootKey;
157
+ if (this.firstMessageHeader) {
158
+ const header = this.firstMessageHeader;
159
+ this.firstMessageHeader = null;
160
+ const preKeyMessage = protos_1.proto.PreKeySignalMessage.encode({
161
+ registrationId: this.identity.registrationId,
162
+ preKeyId: header.preKeyId,
163
+ signedPreKeyId: header.signedPreKeyId,
164
+ baseKey: header.baseKey,
165
+ identityKey: this.localPub,
166
+ message: inner
167
+ }).finish();
168
+ return {
169
+ type: 'pkmsg',
170
+ ciphertext: (0, crypto_1.prependVersion)(preKeyMessage, SIGNAL_VERSION)
171
+ };
172
+ }
173
+ return { type: 'msg', ciphertext: inner };
174
+ }
175
+ }
176
+ exports.FakePeerSession = FakePeerSession;
177
+ async function deriveMessageKey(index, chainKey) {
178
+ const hmacKey = await (0, crypto_1.importHmacKey)(chainKey);
179
+ const [messageInputKey, nextChainRaw] = await Promise.all([
180
+ (0, crypto_1.hmacSign)(hmacKey, MESSAGE_KEY_LABEL),
181
+ (0, crypto_1.hmacSign)(hmacKey, CHAIN_KEY_LABEL)
182
+ ]);
183
+ const expanded = await (0, crypto_1.hkdf)(messageInputKey, null, 'WhisperMessageKeys', 80);
184
+ const messageKey = {
185
+ index,
186
+ cipherKey: expanded.subarray(0, 32),
187
+ macKey: expanded.subarray(32, 64),
188
+ iv: expanded.subarray(64, 80)
189
+ };
190
+ return {
191
+ nextChainKey: nextChainRaw.subarray(0, 32),
192
+ messageKey
193
+ };
194
+ }
195
+ function concatBytes(parts) {
196
+ let total = 0;
197
+ for (const part of parts)
198
+ total += part.byteLength;
199
+ const out = new Uint8Array(total);
200
+ let offset = 0;
201
+ for (const part of parts) {
202
+ out.set(part, offset);
203
+ offset += part.byteLength;
204
+ }
205
+ return out;
206
+ }
207
+ //# sourceMappingURL=fake-peer-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-peer-session.js","sourceRoot":"","sources":["../../../src/protocol/signal/fake-peer-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** SenderKey state used by fake peers for group encryption. */
2
+ export interface FakeSenderKeyEncryptionResult {
3
+ readonly ciphertext: Uint8Array;
4
+ readonly distributionMessage: Uint8Array;
5
+ readonly keyId: number;
6
+ }
7
+ export declare class FakeSenderKey {
8
+ private state;
9
+ private constructor();
10
+ static generate(): Promise<FakeSenderKey>;
11
+ get id(): number;
12
+ encrypt(plaintext: Uint8Array): Promise<FakeSenderKeyEncryptionResult>;
13
+ private buildDistributionMessage;
14
+ }
15
+ //# sourceMappingURL=fake-sender-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-sender-key.d.ts","sourceRoot":"","sources":["../../../src/protocol/signal/fake-sender-key.ts"],"names":[],"mappings":"AAAA,+DAA+D;AA6B/D,MAAM,WAAW,6BAA6B;IAC1C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAA;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACzB;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,KAAK,CAAgB;IAE7B,OAAO;WAIa,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAetD,IAAW,EAAE,IAAI,MAAM,CAEtB;IAEY,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAsCnF,OAAO,CAAC,wBAAwB;CASnC"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ /** SenderKey state used by fake peers for group encryption. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FakeSenderKey = void 0;
5
+ const crypto_1 = require("../../transport/crypto");
6
+ const protos_1 = require("../../transport/protos");
7
+ const SIGNAL_GROUP_VERSION = 3;
8
+ const WHISPER_GROUP_INFO = new TextEncoder().encode('WhisperGroup');
9
+ const MESSAGE_KEY_LABEL = new Uint8Array([1]);
10
+ const CHAIN_KEY_LABEL = new Uint8Array([2]);
11
+ class FakeSenderKey {
12
+ constructor(state) {
13
+ this.state = state;
14
+ }
15
+ static async generate() {
16
+ const [chainKey, signingKeyPair, idBytes] = await Promise.all([
17
+ (0, crypto_1.randomBytesAsync)(32),
18
+ crypto_1.X25519.generateKeyPair(),
19
+ (0, crypto_1.randomBytesAsync)(4)
20
+ ]);
21
+ const id = ((idBytes[0] << 24) | (idBytes[1] << 16) | (idBytes[2] << 8) | idBytes[3]) >>> 0;
22
+ return new FakeSenderKey({
23
+ id,
24
+ chainKey,
25
+ iteration: 0,
26
+ signingKeyPair
27
+ });
28
+ }
29
+ get id() {
30
+ return this.state.id;
31
+ }
32
+ async encrypt(plaintext) {
33
+ const distributionMessage = this.buildDistributionMessage();
34
+ const { messageKey, nextChainKey } = await deriveSenderKeyMessageKey(this.state.iteration, this.state.chainKey);
35
+ const { iv, cipherKey } = splitSenderKeyMessageSeed(messageKey.seed);
36
+ const cipherKeyHandle = await (0, crypto_1.importAesCbcKey)(cipherKey);
37
+ const ciphertext = await (0, crypto_1.aesCbcEncrypt)(cipherKeyHandle, iv, plaintext);
38
+ const senderKeyMessage = protos_1.proto.SenderKeyMessage.encode({
39
+ id: this.state.id,
40
+ iteration: messageKey.iteration,
41
+ ciphertext
42
+ }).finish();
43
+ const versioned = (0, crypto_1.prependVersion)(senderKeyMessage, SIGNAL_GROUP_VERSION);
44
+ const signature = await (0, crypto_1.xeddsaSign)(this.state.signingKeyPair.privKey, versioned);
45
+ const finalCiphertext = new Uint8Array(versioned.byteLength + signature.byteLength);
46
+ finalCiphertext.set(versioned, 0);
47
+ finalCiphertext.set(signature, versioned.byteLength);
48
+ this.state = {
49
+ ...this.state,
50
+ chainKey: nextChainKey,
51
+ iteration: messageKey.iteration + 1
52
+ };
53
+ return {
54
+ ciphertext: finalCiphertext,
55
+ distributionMessage,
56
+ keyId: this.state.id
57
+ };
58
+ }
59
+ buildDistributionMessage() {
60
+ const proto1 = protos_1.proto.SenderKeyDistributionMessage.encode({
61
+ id: this.state.id,
62
+ iteration: this.state.iteration,
63
+ chainKey: this.state.chainKey,
64
+ signingKey: (0, crypto_1.toSerializedPubKey)(this.state.signingKeyPair.pubKey)
65
+ }).finish();
66
+ return (0, crypto_1.prependVersion)(proto1, SIGNAL_GROUP_VERSION);
67
+ }
68
+ }
69
+ exports.FakeSenderKey = FakeSenderKey;
70
+ async function deriveSenderKeyMessageKey(iteration, chainKey) {
71
+ const hmacKey = await (0, crypto_1.importHmacKey)(chainKey);
72
+ const [messageInputKey, nextChainRaw] = await Promise.all([
73
+ (0, crypto_1.hmacSign)(hmacKey, MESSAGE_KEY_LABEL),
74
+ (0, crypto_1.hmacSign)(hmacKey, CHAIN_KEY_LABEL)
75
+ ]);
76
+ const seed = await (0, crypto_1.hkdf)(messageInputKey, null, WHISPER_GROUP_INFO, 50);
77
+ return {
78
+ messageKey: { iteration, seed },
79
+ nextChainKey: nextChainRaw.subarray(0, 32)
80
+ };
81
+ }
82
+ function splitSenderKeyMessageSeed(seed) {
83
+ if (seed.byteLength < 48) {
84
+ throw new Error(`sender key message seed too short: ${seed.byteLength}`);
85
+ }
86
+ return {
87
+ iv: seed.subarray(0, 16),
88
+ cipherKey: seed.subarray(16, 48)
89
+ };
90
+ }
91
+ //# sourceMappingURL=fake-sender-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-sender-key.js","sourceRoot":"","sources":["../../../src/protocol/signal/fake-sender-key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Parser for client prekey upload IQs (`xmlns=encrypt`, `type=set`). */
2
+ import type { BinaryNode } from '../../transport/codec';
3
+ export interface ClientPreKeyEntry {
4
+ readonly keyId: number;
5
+ readonly publicKey: Uint8Array;
6
+ }
7
+ export interface ClientSignedPreKey {
8
+ readonly keyId: number;
9
+ readonly publicKey: Uint8Array;
10
+ readonly signature: Uint8Array;
11
+ }
12
+ export interface ClientPreKeyBundle {
13
+ readonly registrationId: number;
14
+ readonly identityKey: Uint8Array;
15
+ readonly signedPreKey: ClientSignedPreKey;
16
+ readonly preKeys: readonly ClientPreKeyEntry[];
17
+ }
18
+ export declare class PreKeyUploadParseError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ export declare function parsePreKeyUploadIq(iq: BinaryNode): ClientPreKeyBundle;
22
+ //# sourceMappingURL=prekey-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prekey-upload.d.ts","sourceRoot":"","sources":["../../../src/protocol/signal/prekey-upload.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAA;IAChC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAA;CACjD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAIrC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,kBAAkB,CAmCtE"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /** Parser for client prekey upload IQs (`xmlns=encrypt`, `type=set`). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PreKeyUploadParseError = void 0;
5
+ exports.parsePreKeyUploadIq = parsePreKeyUploadIq;
6
+ class PreKeyUploadParseError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'PreKeyUploadParseError';
10
+ }
11
+ }
12
+ exports.PreKeyUploadParseError = PreKeyUploadParseError;
13
+ function parsePreKeyUploadIq(iq) {
14
+ if (iq.tag !== 'iq') {
15
+ throw new PreKeyUploadParseError(`expected iq stanza, got ${iq.tag}`);
16
+ }
17
+ if (iq.attrs.xmlns !== 'encrypt' || iq.attrs.type !== 'set') {
18
+ throw new PreKeyUploadParseError(`expected iq with xmlns=encrypt type=set, got xmlns=${iq.attrs.xmlns} type=${iq.attrs.type}`);
19
+ }
20
+ const children = iq.content;
21
+ if (!Array.isArray(children)) {
22
+ throw new PreKeyUploadParseError('iq has no children');
23
+ }
24
+ const registrationNode = findChild(children, 'registration');
25
+ const identityNode = findChild(children, 'identity');
26
+ const listNode = findChild(children, 'list');
27
+ const skeyNode = findChild(children, 'skey');
28
+ const registrationId = readBigEndianInt(requireBytes(registrationNode?.content, 'registration'));
29
+ const identityKey = requireBytes(identityNode?.content, 'identity');
30
+ if (identityKey.byteLength !== 32) {
31
+ throw new PreKeyUploadParseError(`identity key must be 32 bytes, got ${identityKey.byteLength}`);
32
+ }
33
+ const signedPreKey = parseSignedPreKey(skeyNode);
34
+ const preKeys = parsePreKeyList(listNode);
35
+ return {
36
+ registrationId,
37
+ identityKey,
38
+ signedPreKey,
39
+ preKeys
40
+ };
41
+ }
42
+ function findChild(children, tag) {
43
+ for (const child of children) {
44
+ if (child.tag === tag)
45
+ return child;
46
+ }
47
+ return null;
48
+ }
49
+ function parseSignedPreKey(node) {
50
+ if (!node) {
51
+ throw new PreKeyUploadParseError('skey child missing');
52
+ }
53
+ if (!Array.isArray(node.content)) {
54
+ throw new PreKeyUploadParseError('skey has no inner nodes');
55
+ }
56
+ const idNode = findChild(node.content, 'id');
57
+ const valueNode = findChild(node.content, 'value');
58
+ const signatureNode = findChild(node.content, 'signature');
59
+ const keyId = readBigEndianInt(requireBytes(idNode?.content, 'skey.id'));
60
+ const publicKey = requireBytes(valueNode?.content, 'skey.value');
61
+ const signature = requireBytes(signatureNode?.content, 'skey.signature');
62
+ if (publicKey.byteLength !== 32) {
63
+ throw new PreKeyUploadParseError(`skey value must be 32 bytes, got ${publicKey.byteLength}`);
64
+ }
65
+ if (signature.byteLength !== 64) {
66
+ throw new PreKeyUploadParseError(`skey signature must be 64 bytes, got ${signature.byteLength}`);
67
+ }
68
+ return { keyId, publicKey, signature };
69
+ }
70
+ function parsePreKeyList(node) {
71
+ if (!node) {
72
+ throw new PreKeyUploadParseError('list child missing');
73
+ }
74
+ if (!Array.isArray(node.content)) {
75
+ throw new PreKeyUploadParseError('list has no inner key entries');
76
+ }
77
+ const out = [];
78
+ for (const entry of node.content) {
79
+ if (entry.tag !== 'key')
80
+ continue;
81
+ if (!Array.isArray(entry.content))
82
+ continue;
83
+ const idNode = findChild(entry.content, 'id');
84
+ const valueNode = findChild(entry.content, 'value');
85
+ const keyId = readBigEndianInt(requireBytes(idNode?.content, 'key.id'));
86
+ const publicKey = requireBytes(valueNode?.content, 'key.value');
87
+ if (publicKey.byteLength !== 32) {
88
+ throw new PreKeyUploadParseError(`key value must be 32 bytes, got ${publicKey.byteLength}`);
89
+ }
90
+ out.push({ keyId, publicKey });
91
+ }
92
+ if (out.length === 0) {
93
+ throw new PreKeyUploadParseError('list is empty');
94
+ }
95
+ return out;
96
+ }
97
+ function requireBytes(content, label) {
98
+ if (content === undefined || content === null) {
99
+ throw new PreKeyUploadParseError(`${label} child has no content`);
100
+ }
101
+ if (!(content instanceof Uint8Array)) {
102
+ throw new PreKeyUploadParseError(`${label} content must be bytes`);
103
+ }
104
+ return content;
105
+ }
106
+ function readBigEndianInt(bytes) {
107
+ let value = 0;
108
+ for (let i = 0; i < bytes.byteLength; i += 1) {
109
+ value = value * 256 + bytes[i];
110
+ }
111
+ return value;
112
+ }
113
+ //# sourceMappingURL=prekey-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prekey-upload.js","sourceRoot":"","sources":["../../../src/protocol/signal/prekey-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Builders for `<stream:error/>` stanzas pushed to the client. */
2
+ import type { BinaryNode } from '../../transport/codec';
3
+ export declare function buildStreamErrorCode(code: number): BinaryNode;
4
+ export declare function buildStreamErrorReplaced(): BinaryNode;
5
+ export declare function buildStreamErrorDeviceRemoved(): BinaryNode;
6
+ export declare function buildStreamErrorAck(id: string): BinaryNode;
7
+ export declare function buildStreamErrorXmlNotWellFormed(): BinaryNode;
8
+ //# sourceMappingURL=stream-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-error.d.ts","sourceRoot":"","sources":["../../../src/protocol/stream/stream-error.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAIvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAK7D;AAED,wBAAgB,wBAAwB,IAAI,UAAU,CAWrD;AAED,wBAAgB,6BAA6B,IAAI,UAAU,CAW1D;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,CAW1D;AAED,wBAAgB,gCAAgC,IAAI,UAAU,CAW7D"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /** Builders for `<stream:error/>` stanzas pushed to the client. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.buildStreamErrorCode = buildStreamErrorCode;
5
+ exports.buildStreamErrorReplaced = buildStreamErrorReplaced;
6
+ exports.buildStreamErrorDeviceRemoved = buildStreamErrorDeviceRemoved;
7
+ exports.buildStreamErrorAck = buildStreamErrorAck;
8
+ exports.buildStreamErrorXmlNotWellFormed = buildStreamErrorXmlNotWellFormed;
9
+ const STREAM_ERROR_TAG = 'stream:error';
10
+ function buildStreamErrorCode(code) {
11
+ return {
12
+ tag: STREAM_ERROR_TAG,
13
+ attrs: { code: String(code) }
14
+ };
15
+ }
16
+ function buildStreamErrorReplaced() {
17
+ return {
18
+ tag: STREAM_ERROR_TAG,
19
+ attrs: {},
20
+ content: [
21
+ {
22
+ tag: 'conflict',
23
+ attrs: { type: 'replaced' }
24
+ }
25
+ ]
26
+ };
27
+ }
28
+ function buildStreamErrorDeviceRemoved() {
29
+ return {
30
+ tag: STREAM_ERROR_TAG,
31
+ attrs: {},
32
+ content: [
33
+ {
34
+ tag: 'conflict',
35
+ attrs: { type: 'device_removed' }
36
+ }
37
+ ]
38
+ };
39
+ }
40
+ function buildStreamErrorAck(id) {
41
+ return {
42
+ tag: STREAM_ERROR_TAG,
43
+ attrs: {},
44
+ content: [
45
+ {
46
+ tag: 'ack',
47
+ attrs: { id }
48
+ }
49
+ ]
50
+ };
51
+ }
52
+ function buildStreamErrorXmlNotWellFormed() {
53
+ return {
54
+ tag: STREAM_ERROR_TAG,
55
+ attrs: {},
56
+ content: [
57
+ {
58
+ tag: 'xml-not-well-formed',
59
+ attrs: {}
60
+ }
61
+ ]
62
+ };
63
+ }
64
+ //# sourceMappingURL=stream-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-error.js","sourceRoot":"","sources":["../../../src/protocol/stream/stream-error.ts"],"names":[],"mappings":";AAAA,mEAAmE;;AAMnE,oDAKC;AAED,4DAWC;AAED,sEAWC;AAED,kDAWC;AAED,4EAWC;AA3DD,MAAM,gBAAgB,GAAG,cAAc,CAAA;AAEvC,SAAgB,oBAAoB,CAAC,IAAY;IAC7C,OAAO;QACH,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;KAChC,CAAA;AACL,CAAC;AAED,SAAgB,wBAAwB;IACpC,OAAO;QACH,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACL;gBACI,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aAC9B;SACJ;KACJ,CAAA;AACL,CAAC;AAED,SAAgB,6BAA6B;IACzC,OAAO;QACH,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACL;gBACI,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;aACpC;SACJ;KACJ,CAAA;AACL,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAU;IAC1C,OAAO;QACH,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACL;gBACI,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,EAAE,EAAE,EAAE;aAChB;SACJ;KACJ,CAAA;AACL,CAAC;AAED,SAAgB,gCAAgC;IAC5C,OAAO;QACH,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACL;gBACI,GAAG,EAAE,qBAAqB;gBAC1B,KAAK,EAAE,EAAE;aACZ;SACJ;KACJ,CAAA;AACL,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** In-memory app-state collection tracker (version/LTHash + patch queue). */
2
+ import { FakeAppStateCrypto } from '../protocol/signal/fake-app-state-crypto';
3
+ import { type Proto } from '../transport/protos';
4
+ export interface FakeAppStateCollectionOptions {
5
+ readonly name: string;
6
+ readonly keyId: Uint8Array;
7
+ readonly keyData: Uint8Array;
8
+ readonly crypto?: FakeAppStateCrypto;
9
+ }
10
+ export interface FakeAppStateMutationDescriptor {
11
+ readonly operation: 'set' | 'remove';
12
+ readonly index: string;
13
+ readonly value: Proto.ISyncActionValue | null;
14
+ readonly version: number;
15
+ }
16
+ export declare class FakeAppStateCollection {
17
+ readonly name: string;
18
+ readonly keyId: Uint8Array;
19
+ readonly keyData: Uint8Array;
20
+ private readonly crypto;
21
+ private currentVersion;
22
+ private currentLtHash;
23
+ private readonly recordsByIndexMacHex;
24
+ private readonly pendingPatchMutations;
25
+ private hasUnflushedSnapshotChanges;
26
+ constructor(options: FakeAppStateCollectionOptions);
27
+ get version(): number;
28
+ get ltHash(): Uint8Array;
29
+ applyMutation(input: FakeAppStateMutationDescriptor): Promise<void>;
30
+ encodeSnapshot(): Promise<Uint8Array>;
31
+ encodePendingPatch(): Promise<Uint8Array>;
32
+ hasPending(): boolean;
33
+ private applyLtHash;
34
+ }
35
+ //# sourceMappingURL=fake-app-state-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-app-state-collection.d.ts","sourceRoot":"","sources":["../../src/state/fake-app-state-collection.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAEH,kBAAkB,EAErB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,6BAA6B;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;CACvC;AAED,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,QAAQ,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAC3B;AASD,qBAAa,sBAAsB;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,KAAK,EAAE,UAAU,CAAA;IACjC,SAAgB,OAAO,EAAE,UAAU,CAAA;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAoC;IACzE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAG9B;IACR,OAAO,CAAC,2BAA2B,CAAQ;gBAExB,OAAO,EAAE,6BAA6B;IAOzD,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED,IAAW,MAAM,IAAI,UAAU,CAE9B;IAEY,aAAa,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CnE,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;IA0BrC,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC;IAgD/C,UAAU,IAAI,OAAO;YAId,WAAW;CAQ5B"}