zapo-js 0.1.2 → 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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -5,8 +5,7 @@ exports.buildRegistrationPayload = buildRegistrationPayload;
5
5
  const node_crypto_1 = require("node:crypto");
6
6
  const primitives_1 = require("../../crypto/core/primitives");
7
7
  const _proto_1 = require("../../proto.js");
8
- const constants_1 = require("../../signal/constants");
9
- const constants_2 = require("../noise/constants");
8
+ const constants_1 = require("../noise/constants");
10
9
  const bytes_1 = require("../../util/bytes");
11
10
  function parseVersion(versionBase) {
12
11
  const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
@@ -20,13 +19,20 @@ function parseVersion(versionBase) {
20
19
  }
21
20
  return { primary, secondary, tertiary };
22
21
  }
22
+ let cachedLocale = null;
23
23
  function resolveLocale() {
24
+ // The first `Intl.DateTimeFormat()` call triggers V8's lazy ICU init
25
+ // (tens of ms). The process locale does not change at runtime, so
26
+ // memoize after the first resolve.
27
+ if (cachedLocale !== null)
28
+ return cachedLocale;
24
29
  const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';
25
30
  const [language = 'en', country = 'US'] = locale.split('-');
26
- return {
31
+ cachedLocale = Object.freeze({
27
32
  lg: language.toLowerCase(),
28
33
  lc: country.toUpperCase()
29
- };
34
+ });
35
+ return cachedLocale;
30
36
  }
31
37
  function defaultWebSubPlatform() {
32
38
  return _proto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
@@ -64,8 +70,8 @@ function resolveDevicePropsPlatformType(deviceBrowser) {
64
70
  return _proto_1.proto.DeviceProps.PlatformType.UNKNOWN;
65
71
  }
66
72
  }
67
- function defaultUserAgent(versionBase, deviceOsDisplayName) {
68
- const { primary, secondary, tertiary } = parseVersion(versionBase);
73
+ function defaultUserAgent(versionBase, deviceOsDisplayName, version) {
74
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
69
75
  const locale = resolveLocale();
70
76
  return {
71
77
  platform: _proto_1.proto.ClientPayload.UserAgent.Platform.WEB,
@@ -86,8 +92,8 @@ function defaultUserAgent(versionBase, deviceOsDisplayName) {
86
92
  localeCountryIso31661Alpha2: locale.lc
87
93
  };
88
94
  }
89
- function defaultDeviceProps(versionBase, config) {
90
- const { primary, secondary, tertiary } = parseVersion(versionBase);
95
+ function defaultDeviceProps(versionBase, config, version) {
96
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
91
97
  return _proto_1.proto.DeviceProps.encode({
92
98
  os: config.deviceOsDisplayName ?? process.platform,
93
99
  version: {
@@ -109,15 +115,15 @@ function defaultDeviceProps(versionBase, config) {
109
115
  }
110
116
  }).finish();
111
117
  }
112
- function buildCommonPayload(config) {
113
- const versionBase = config.versionBase ?? constants_2.DEFAULT_VERSION_BASE;
118
+ function buildCommonPayload(config, version) {
119
+ const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
114
120
  const pull = config.pull ?? true;
115
121
  return {
116
122
  passive: config.passive === true,
117
123
  pull,
118
124
  connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
119
125
  connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
120
- userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName),
126
+ userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
121
127
  webInfo: config.webInfo ??
122
128
  {
123
129
  webSubPlatform: defaultWebSubPlatform()
@@ -145,19 +151,18 @@ function buildRegistrationPayload(config) {
145
151
  if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
146
152
  throw new Error('registration payload requires a valid signedPreKeyId');
147
153
  }
148
- const versionBase = config.versionBase ?? constants_2.DEFAULT_VERSION_BASE;
149
- const common = buildCommonPayload(config);
154
+ const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
155
+ const version = parseVersion(versionBase);
156
+ const common = buildCommonPayload(config, version);
150
157
  const devicePairingData = {
151
- buildHash: config.buildHash ? (0, bytes_1.toBytesView)(config.buildHash) : (0, primitives_1.md5Bytes)(versionBase),
152
- deviceProps: config.deviceProps
153
- ? (0, bytes_1.toBytesView)(config.deviceProps)
154
- : defaultDeviceProps(versionBase, config),
158
+ buildHash: config.buildHash ?? (0, primitives_1.md5Bytes)(versionBase),
159
+ deviceProps: config.deviceProps ?? defaultDeviceProps(versionBase, config, version),
155
160
  eRegid: (0, bytes_1.intToBytes)(4, registrationId),
156
- eKeytype: (0, bytes_1.intToBytes)(1, constants_1.KEY_TYPE_CURVE25519),
157
- eIdent: (0, bytes_1.toBytesView)(config.registrationInfo.identityKeyPair.pubKey),
161
+ eKeytype: (0, bytes_1.intToBytes)(1, 5),
162
+ eIdent: config.registrationInfo.identityKeyPair.pubKey,
158
163
  eSkeyId: (0, bytes_1.intToBytes)(3, signedPreKeyId),
159
- eSkeyVal: (0, bytes_1.toBytesView)(config.signedPreKey.keyPair.pubKey),
160
- eSkeySig: (0, bytes_1.toBytesView)(config.signedPreKey.signature)
164
+ eSkeyVal: config.signedPreKey.keyPair.pubKey,
165
+ eSkeySig: config.signedPreKey.signature
161
166
  };
162
167
  return _proto_1.proto.ClientPayload.encode({
163
168
  ...common,
@@ -14,7 +14,7 @@ class WaFrameCodec {
14
14
  if (maxFrameLength >= 1 << 24) {
15
15
  throw new Error('maxFrameLength must be lower than protocol limit (16777216)');
16
16
  }
17
- this.introFrame = introFrame && introFrame.length > 0 ? (0, bytes_1.toBytesView)(introFrame) : null;
17
+ this.introFrame = introFrame && introFrame.length > 0 ? introFrame : null;
18
18
  this.maxFrameLength = maxFrameLength;
19
19
  this.introSent = false;
20
20
  this.buffered = bytes_1.EMPTY_BYTES;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMobileLoginPayload = buildMobileLoginPayload;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const _proto_1 = require("../../proto.js");
6
+ function parseAppVersion(version) {
7
+ const parts = version.split('.');
8
+ const at = (i) => {
9
+ const n = Number(parts[i]);
10
+ return Number.isFinite(n) ? n : undefined;
11
+ };
12
+ return {
13
+ primary: at(0) ?? 2,
14
+ secondary: at(1) ?? 0,
15
+ tertiary: at(2) ?? 0,
16
+ quaternary: at(3)
17
+ };
18
+ }
19
+ function buildMobileLoginPayload(config) {
20
+ if (!Number.isSafeInteger(config.username) || config.username <= 0) {
21
+ throw new Error('mobile login payload requires a valid numeric username');
22
+ }
23
+ const info = config.deviceInfo;
24
+ const version = parseAppVersion(info.appVersion);
25
+ const userAgent = {
26
+ platform: _proto_1.proto.ClientPayload.UserAgent.Platform.ANDROID,
27
+ releaseChannel: _proto_1.proto.ClientPayload.UserAgent.ReleaseChannel.RELEASE,
28
+ appVersion: version,
29
+ mcc: info.mcc ?? '000',
30
+ mnc: info.mnc ?? '000',
31
+ osVersion: info.osVersion,
32
+ manufacturer: info.manufacturer,
33
+ device: info.device,
34
+ osBuildNumber: info.osBuildNumber,
35
+ phoneId: info.phoneId ?? (0, node_crypto_1.randomUUID)(),
36
+ localeLanguageIso6391: info.localeLanguageIso6391 ?? 'en',
37
+ localeCountryIso31661Alpha2: info.localeCountryIso31661Alpha2 ?? 'US',
38
+ deviceType: _proto_1.proto.ClientPayload.UserAgent.DeviceType.PHONE,
39
+ deviceBoard: info.deviceBoard,
40
+ deviceModelType: info.deviceModelType
41
+ };
42
+ return _proto_1.proto.ClientPayload.encode({
43
+ passive: config.passive === true,
44
+ pull: config.pull ?? true,
45
+ product: _proto_1.proto.ClientPayload.Product.WHATSAPP,
46
+ connectType: config.connectType ?? _proto_1.proto.ClientPayload.ConnectType.CELLULAR_UNKNOWN,
47
+ connectReason: config.connectReason ?? _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
48
+ userAgent,
49
+ username: config.username,
50
+ device: config.device ?? 0,
51
+ lidDbMigrated: config.lidDbMigrated === true,
52
+ pushName: config.pushName,
53
+ yearClass: config.yearClass,
54
+ memClass: config.memClass
55
+ }).finish();
56
+ }
@@ -2,26 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.verifyNoiseCertificateChain = verifyNoiseCertificateChain;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
- const X25519_1 = require("../../crypto/curves/X25519");
6
5
  const _proto_1 = require("../../proto.js");
7
6
  const constants_1 = require("../noise/constants");
8
7
  const bytes_1 = require("../../util/bytes");
9
8
  const primitives_1 = require("../../util/primitives");
10
- async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
11
- const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
12
- if (!(0, bytes_1.assertByteLength)(signatureInput, 64, 'invalid certificate signature size', false)) {
13
- return false;
14
- }
15
- const signature = new Uint8Array(signatureInput);
16
- const lastByte = signature[63];
17
- if ((lastByte & 0x60) !== 0) {
18
- return false;
19
- }
20
- const signBit = lastByte & 0x80;
21
- signature[63] = lastByte & 0x7f;
22
- const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
23
- return (0, _crypto_1.ed25519VerifyRaw)(edwardsPublicKey, signature, message);
24
- }
9
+ const PRODUCTION_ROOT_CA = {
10
+ publicKey: (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX),
11
+ serial: constants_1.ROOT_CA_SERIAL
12
+ };
25
13
  function parseNoiseCertificate(certificate) {
26
14
  if (!certificate) {
27
15
  throw new Error('missing noise certificate');
@@ -41,21 +29,16 @@ function parseNoiseCertificate(certificate) {
41
29
  signature: signatureBytes
42
30
  };
43
31
  }
44
- function rootPublicKeySerialized() {
45
- const raw = (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX);
46
- return (0, _crypto_1.toSerializedPubKey)(raw);
47
- }
48
- async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
32
+ async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
49
33
  const chain = _proto_1.proto.CertChain.decode(certificateChain);
50
34
  if (!chain.leaf || !chain.intermediate) {
51
35
  throw new Error('noise certificate chain is missing leaf/intermediate');
52
36
  }
53
37
  const intermediate = parseNoiseCertificate(chain.intermediate);
54
- if (intermediate.issuerSerial !== constants_1.ROOT_CA_SERIAL) {
38
+ if (intermediate.issuerSerial !== rootCa.serial) {
55
39
  throw new Error('intermediate certificate issuer mismatch');
56
40
  }
57
- const rootKey = rootPublicKeySerialized();
58
- const validIntermediate = await verifySignalVariant(rootKey, intermediate.details, intermediate.signature);
41
+ const validIntermediate = await (0, _crypto_1.xeddsaVerify)(rootCa.publicKey, intermediate.details, intermediate.signature);
59
42
  if (!validIntermediate) {
60
43
  throw new Error('intermediate certificate signature is invalid');
61
44
  }
@@ -63,8 +46,7 @@ async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
63
46
  if (leaf.issuerSerial !== intermediate.serial) {
64
47
  throw new Error('leaf certificate issuer mismatch');
65
48
  }
66
- const intermediatePublicSerialized = (0, _crypto_1.toSerializedPubKey)(intermediate.key);
67
- const validLeaf = await verifySignalVariant(intermediatePublicSerialized, leaf.details, leaf.signature);
49
+ const validLeaf = await (0, _crypto_1.xeddsaVerify)(intermediate.key, leaf.details, leaf.signature);
68
50
  if (!validLeaf) {
69
51
  throw new Error('leaf certificate signature is invalid');
70
52
  }
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaNoiseSession = void 0;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
5
  const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
6
- const BoundedTaskQueue_1 = require("../../infra/perf/BoundedTaskQueue");
7
6
  const _proto_1 = require("../../proto.js");
8
7
  const constants_1 = require("../../protocol/constants");
9
8
  const constants_2 = require("../noise/constants");
@@ -17,7 +16,7 @@ function resolvePayload(payload) {
17
16
  if (payload instanceof Uint8Array) {
18
17
  return Promise.resolve(payload);
19
18
  }
20
- return Promise.resolve(payload()).then((value) => (0, bytes_1.toBytesView)(value));
19
+ return Promise.resolve(payload());
21
20
  }
22
21
  async function resolveHandshakePayload(config) {
23
22
  if (config.isRegistered) {
@@ -51,6 +50,8 @@ function buildRoutingInfoPrefix(routingInfo) {
51
50
  }
52
51
  class WaNoiseSession {
53
52
  constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
53
+ this.writeChain = Promise.resolve();
54
+ this.readChain = Promise.resolve();
54
55
  this.frameCodec = null;
55
56
  this.handshakeInbox = [];
56
57
  this.handshakeInboxHead = 0;
@@ -60,11 +61,10 @@ class WaNoiseSession {
60
61
  this.closedError = null;
61
62
  this.noiseSocket = null;
62
63
  this.serverStaticKey = null;
64
+ this.trustedRootCa = undefined;
63
65
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
64
66
  this.sendWire = sendWire;
65
67
  this.logger = logger;
66
- this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
67
- this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
68
68
  }
69
69
  async start(config) {
70
70
  this.reset();
@@ -72,9 +72,7 @@ class WaNoiseSession {
72
72
  isRegistered: config.isRegistered,
73
73
  hasServerStaticKey: !!config.serverStaticKey
74
74
  });
75
- const protocolHeader = config.protocolHeader
76
- ? (0, bytes_1.toBytesView)(config.protocolHeader)
77
- : constants_2.WA_PROTO_HEADER;
75
+ const protocolHeader = config.protocolHeader ?? constants_2.WA_PROTO_HEADER;
78
76
  const introFrame = config.routingInfo && config.routingInfo.length > 0
79
77
  ? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
80
78
  : protocolHeader;
@@ -84,6 +82,7 @@ class WaNoiseSession {
84
82
  resolveHandshakePayload(config)
85
83
  ]);
86
84
  const verifyCertificates = config.verifyCertificateChain !== false;
85
+ this.trustedRootCa = config.trustedRootCa;
87
86
  if (config.serverStaticKey && config.serverStaticKey.length === 32) {
88
87
  this.logger.info('noise session attempting resume handshake (IK)');
89
88
  this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
@@ -96,12 +95,24 @@ class WaNoiseSession {
96
95
  await this.decodeBufferedPostHandshakeFrames();
97
96
  this.logger.info('noise session established via full handshake');
98
97
  }
99
- async encryptFrame(frame) {
100
- if (!this.noiseSocket || !this.frameCodec) {
101
- throw new Error('noise session is not established');
98
+ encryptFrame(frame) {
99
+ const socket = this.noiseSocket;
100
+ const codec = this.frameCodec;
101
+ if (!socket || !codec) {
102
+ return Promise.reject(new Error('noise session is not established'));
103
+ }
104
+ let encryptPromise;
105
+ try {
106
+ encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
102
107
  }
103
- const encrypted = await this.writeQueue.enqueue(() => this.noiseSocket.encrypt(frame));
104
- return this.frameCodec.encodeFrame(encrypted);
108
+ catch (error) {
109
+ return Promise.reject(error);
110
+ }
111
+ const result = this.writeChain
112
+ .then(() => encryptPromise)
113
+ .then((encrypted) => codec.encodeFrame(encrypted));
114
+ this.writeChain = result.then(() => { }, () => { });
115
+ return result;
105
116
  }
106
117
  async pushWireChunk(chunk) {
107
118
  const codec = this.frameCodec;
@@ -110,7 +121,9 @@ class WaNoiseSession {
110
121
  }
111
122
  const out = [];
112
123
  if (this.pendingDecryptedFrames.length > 0) {
113
- out.push(...this.pendingDecryptedFrames);
124
+ for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
125
+ out.push(this.pendingDecryptedFrames[i]);
126
+ }
114
127
  this.pendingDecryptedFrames = [];
115
128
  }
116
129
  const frames = codec.pushWireChunk(chunk);
@@ -128,9 +141,15 @@ class WaNoiseSession {
128
141
  }
129
142
  return out;
130
143
  }
131
- for (const frame of frames) {
132
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
133
- out.push(decrypted);
144
+ if (frames.length > 0) {
145
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
146
+ this.readChain = this.readChain
147
+ .then(() => decryptBatch)
148
+ .then(() => { }, () => { });
149
+ const decrypted = await decryptBatch;
150
+ for (let i = 0; i < decrypted.length; i++) {
151
+ out.push(decrypted[i]);
152
+ }
134
153
  }
135
154
  return out;
136
155
  }
@@ -145,6 +164,16 @@ class WaNoiseSession {
145
164
  rejecter(closeError);
146
165
  }
147
166
  }
167
+ async decryptFramesBatch(socket, frames) {
168
+ if (frames.length === 1) {
169
+ return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
170
+ }
171
+ const pending = new Array(frames.length);
172
+ for (let i = 0; i < frames.length; i++) {
173
+ pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
174
+ }
175
+ return Promise.all(pending);
176
+ }
148
177
  reset() {
149
178
  this.logger.trace('noise session reset');
150
179
  this.frameCodec = null;
@@ -155,11 +184,11 @@ class WaNoiseSession {
155
184
  this.closedError = null;
156
185
  this.noiseSocket = null;
157
186
  this.serverStaticKey = null;
187
+ this.trustedRootCa = undefined;
188
+ this.writeChain = Promise.resolve();
189
+ this.readChain = Promise.resolve();
158
190
  }
159
191
  getServerStaticKey() {
160
- if (!this.serverStaticKey) {
161
- return null;
162
- }
163
192
  return this.serverStaticKey;
164
193
  }
165
194
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
@@ -189,10 +218,12 @@ class WaNoiseSession {
189
218
  await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
190
219
  await handshake.authenticate(serverStaticKey);
191
220
  await handshake.authenticate(ephemeralKeyPair.pubKey);
192
- const agreement1 = await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey);
221
+ const [agreement1, agreement2] = await Promise.all([
222
+ _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
223
+ _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
224
+ ]);
193
225
  await handshake.mixIntoKey(agreement1);
194
226
  const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
195
- const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
196
227
  await handshake.mixIntoKey(agreement2);
197
228
  const encryptedPayload = await handshake.encrypt(payload);
198
229
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
@@ -217,11 +248,15 @@ class WaNoiseSession {
217
248
  if (!serverHello.payload) {
218
249
  throw new Error('noise resume handshake missing certificate payload');
219
250
  }
220
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
251
+ const serverEphemeral = serverHello.ephemeral;
221
252
  await handshake.authenticate(serverEphemeral);
222
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
223
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
224
- await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
253
+ const [dh1, dh2] = await Promise.all([
254
+ _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
255
+ _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
256
+ ]);
257
+ await handshake.mixIntoKey(dh1);
258
+ await handshake.mixIntoKey(dh2);
259
+ await handshake.decrypt(serverHello.payload);
225
260
  this.serverStaticKey = serverStaticKey;
226
261
  this.logger.info('noise resume handshake successful without fallback');
227
262
  return { socket: await handshake.finish(), serverHelloFrame: null };
@@ -239,14 +274,14 @@ class WaNoiseSession {
239
274
  if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
240
275
  throw new Error('noise full handshake missing server hello fields');
241
276
  }
242
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
277
+ const serverEphemeral = serverHello.ephemeral;
243
278
  await handshake.authenticate(serverEphemeral);
244
279
  await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
245
- const serverStatic = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.static));
280
+ const serverStatic = await handshake.decrypt(serverHello.static);
246
281
  await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
247
- const certificate = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
282
+ const certificate = await handshake.decrypt(serverHello.payload);
248
283
  if (verifyCertificates) {
249
- await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
284
+ await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
250
285
  this.logger.trace('noise certificate chain verified');
251
286
  }
252
287
  this.serverStaticKey = serverStatic;
@@ -322,10 +357,17 @@ class WaNoiseSession {
322
357
  this.logger.debug('decoding buffered post-handshake frames', {
323
358
  count: this.handshakeInbox.length - this.handshakeInboxHead
324
359
  });
325
- for (let index = this.handshakeInboxHead; index < this.handshakeInbox.length; index += 1) {
326
- const frame = this.handshakeInbox[index];
327
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
328
- this.pendingDecryptedFrames.push(decrypted);
360
+ const start = this.handshakeInboxHead;
361
+ const frames = this.handshakeInbox.slice(start);
362
+ if (frames.length > 0) {
363
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
364
+ this.readChain = this.readChain
365
+ .then(() => decryptBatch)
366
+ .then(() => { }, () => { });
367
+ const decrypted = await decryptBatch;
368
+ for (let i = 0; i < decrypted.length; i++) {
369
+ this.pendingDecryptedFrames.push(decrypted[i]);
370
+ }
329
371
  }
330
372
  this.handshakeInbox.length = this.handshakeInboxHead = 0;
331
373
  }
@@ -9,12 +9,16 @@ class WaNoiseSocket {
9
9
  this.writeCounter = 0;
10
10
  this.readCounter = 0;
11
11
  }
12
- async encrypt(frame, additionalData) {
13
- const nonce = (0, _crypto_1.buildNonce)(this.writeCounter++);
12
+ reserveWriteNonce() {
13
+ return (0, _crypto_1.buildNonce)(this.writeCounter++);
14
+ }
15
+ encrypt(nonce, frame, additionalData) {
14
16
  return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
15
17
  }
16
- async decrypt(frame, additionalData) {
17
- const nonce = (0, _crypto_1.buildNonce)(this.readCounter++);
18
+ reserveReadNonce() {
19
+ return (0, _crypto_1.buildNonce)(this.readCounter++);
20
+ }
21
+ decrypt(nonce, frame, additionalData) {
18
22
  return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
19
23
  }
20
24
  }
@@ -7,6 +7,7 @@ const constants_1 = require("../../protocol/constants");
7
7
  const helpers_1 = require("../node/helpers");
8
8
  const bytes_1 = require("../../util/bytes");
9
9
  const primitives_1 = require("../../util/primitives");
10
+ const DIGITS_ONLY_RE = /^\d+$/;
10
11
  function parseStreamControlNode(node) {
11
12
  if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
12
13
  return { kind: 'xmlstreamend' };
@@ -20,9 +21,12 @@ function parseStreamControlNode(node) {
20
21
  ? { kind: 'stream_error_replaced' }
21
22
  : { kind: 'stream_error_device_removed' };
22
23
  }
23
- const code = node.attrs.code ? (0, primitives_1.parseStrictUnsignedInt)(node.attrs.code) : undefined;
24
- if (code !== undefined) {
25
- return { kind: 'stream_error_code', code };
24
+ const codeStr = node.attrs.code;
25
+ if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
26
+ const code = Number(codeStr);
27
+ if (Number.isSafeInteger(code)) {
28
+ return { kind: 'stream_error_code', code };
29
+ }
26
30
  }
27
31
  const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
28
32
  if (ackNode) {
@@ -1,10 +1,11 @@
1
- import type { Proto } from '..';
1
+ import { type CryptoKey } from '../crypto/core/primitives';
2
+ import { type Proto } from '..';
2
3
  interface WaAppStateDerivedKeys {
3
- readonly indexKey: Uint8Array;
4
- readonly valueEncryptionKey: Uint8Array;
5
- readonly valueMacKey: Uint8Array;
6
- readonly snapshotMacKey: Uint8Array;
7
- readonly patchMacKey: Uint8Array;
4
+ readonly indexHmacKey: CryptoKey;
5
+ readonly valueEncryptionAesKey: CryptoKey;
6
+ readonly valueMacHmacKey: CryptoKey;
7
+ readonly snapshotMacHmacKey: CryptoKey;
8
+ readonly patchMacHmacKey: CryptoKey;
8
9
  }
9
10
  interface WaAppStateEncryptedMutation {
10
11
  readonly indexMac: Uint8Array;
@@ -21,10 +22,12 @@ interface WaAppStateDecryptedMutation {
21
22
  export declare class WaAppStateCrypto {
22
23
  private readonly derivedKeysCache;
23
24
  private readonly derivedKeysCacheMaxSize;
24
- constructor(derivedKeysCacheMaxSize?: number);
25
+ private readonly skipMacVerification;
26
+ constructor(derivedKeysCacheMaxSize?: number, skipMacVerification?: boolean);
27
+ get isMacVerificationSkipped(): boolean;
25
28
  clearCache(): void;
26
29
  deriveKeys(keyData: Uint8Array): Promise<WaAppStateDerivedKeys>;
27
- generateIndexMac(indexKey: Uint8Array, indexBytes: Uint8Array): Promise<Uint8Array>;
30
+ generateIndexMac(indexHmacKey: CryptoKey, indexBytes: Uint8Array): Promise<Uint8Array>;
28
31
  encryptMutation(args: {
29
32
  readonly operation: number;
30
33
  readonly keyId: Uint8Array;
@@ -1,6 +1,6 @@
1
- import type { AppStateCollectionName, WaAppStateMissingKeysEvent, WaAppStateSyncOptions, WaAppStateStoreData, WaAppStateSyncResult, WaAppStateSyncKey } from './types';
1
+ import type { AppStateCollectionName, WaAppStateMissingKeysEvent, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions, WaAppStateSyncResult } from './types';
2
2
  import type { Logger } from '../infra/log/types';
3
- import type { Proto } from '..';
3
+ import { type Proto } from '..';
4
4
  import type { WaAppStateStore } from '../store/contracts/appstate.store';
5
5
  import type { BinaryNode } from '../transport/types';
6
6
  interface WaAppStateSyncClientOptions {
@@ -11,6 +11,8 @@ interface WaAppStateSyncClientOptions {
11
11
  readonly hostDomain?: string;
12
12
  readonly defaultTimeoutMs?: number;
13
13
  readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
14
+ readonly skipMacVerification?: boolean;
15
+ readonly mobilePrimary?: boolean;
14
16
  }
15
17
  export declare class WaAppStateMissingKeyError extends Error {
16
18
  readonly keyId: Uint8Array | null;
@@ -26,10 +28,12 @@ export declare class WaAppStateSyncClient {
26
28
  private readonly defaultTimeoutMs;
27
29
  private readonly onMissingKeys?;
28
30
  private readonly crypto;
31
+ private readonly mobilePrimary;
29
32
  private syncContext;
30
33
  private syncPromise;
31
34
  constructor(options: WaAppStateSyncClientOptions);
32
35
  exportState(): Promise<WaAppStateStoreData>;
36
+ ensureInitialSyncKey(): Promise<WaAppStateSyncKey>;
33
37
  importSyncKeys(keys: readonly WaAppStateSyncKey[]): Promise<number>;
34
38
  importSyncKeyShare(share: Proto.Message.IAppStateSyncKeyShare): Promise<number>;
35
39
  sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
@@ -0,0 +1,7 @@
1
+ import type { WaAppStateStoreData, WaAppStateSyncKey } from './types';
2
+ type StoreRow = Readonly<Record<string, unknown>>;
3
+ export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
4
+ export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
5
+ export declare function decodeAppStateSyncKeys(rows: readonly StoreRow[]): readonly WaAppStateSyncKey[];
6
+ export declare function decodeAppStateCollections(versionRows: readonly StoreRow[], valueRows: readonly StoreRow[]): WaAppStateStoreData['collections'];
7
+ export {};
@@ -1,7 +1,7 @@
1
1
  export * from './constants';
2
- export type { WaAppStateSyncOptions } from './types';
2
+ export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions } from './types';
3
+ export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
3
4
  export * from './utils';
4
5
  export { WaAppStateCrypto } from './WaAppStateCrypto';
5
- export { WaAppStateMissingKeyError } from './WaAppStateSyncClient';
6
- export { parseCollectionState, parseSyncResponse, type CollectionResponsePayload } from './WaAppStateSyncResponseParser';
6
+ export { parseSyncResponse } from './response-parser';
7
7
  export { WaAppStateSyncClient } from './WaAppStateSyncClient';
@@ -1,5 +1,5 @@
1
1
  import type { AppStateCollectionName, AppStateCollectionState } from './types';
2
- import type { Proto } from '..';
2
+ import { type Proto } from '..';
3
3
  import type { BinaryNode } from '../transport/types';
4
4
  export interface CollectionResponsePayload {
5
5
  readonly collection: AppStateCollectionName;
@@ -1,5 +1,5 @@
1
1
  import type { Proto } from '..';
2
- import type { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_COLLECTION_STATES } from '../protocol/constants';
2
+ import type { WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_COLLECTIONS } from '../protocol/constants';
3
3
  export type AppStateCollectionName = (typeof WA_APP_STATE_COLLECTIONS)[keyof typeof WA_APP_STATE_COLLECTIONS];
4
4
  export type AppStateCollectionState = (typeof WA_APP_STATE_COLLECTION_STATES)[keyof typeof WA_APP_STATE_COLLECTION_STATES];
5
5
  export interface WaAppStateSyncKey {
@@ -2,8 +2,6 @@ import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
2
2
  import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
3
3
  import type { Proto } from '..';
4
4
  export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
5
- export declare function keyDeviceId(keyId: Uint8Array): number | null;
6
5
  export declare function keyEpoch(keyId: Uint8Array): number;
7
6
  export declare function pickActiveSyncKey(keys: Iterable<WaAppStateSyncKey>): WaAppStateSyncKey | null;
8
- export declare function toNetworkOrder64(value: number): Uint8Array;
9
7
  export declare function downloadExternalBlobReference(mediaTransfer: WaMediaTransferClient, reference: Proto.IExternalBlobReference): Promise<Uint8Array>;