zapo-js 0.2.0 → 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 (351) hide show
  1. package/README.md +7 -3
  2. package/dist/appstate/WaAppStateCrypto.js +49 -41
  3. package/dist/appstate/WaAppStateSyncClient.js +79 -42
  4. package/dist/appstate/index.js +2 -2
  5. package/dist/auth/WaAuthClient.js +20 -11
  6. package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  7. package/dist/auth/pairing/WaPairingFlow.js +26 -29
  8. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
  9. package/dist/client/WaClient.js +115 -75
  10. package/dist/client/WaClientFactory.js +113 -30
  11. package/dist/client/connection/WaConnectionManager.js +4 -1
  12. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  13. package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
  14. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  15. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
  16. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
  17. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  18. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  19. package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
  20. package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
  21. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
  22. package/dist/client/dirty.js +1 -1
  23. package/dist/client/events/abprops.js +43 -0
  24. package/dist/client/events/privacy-token.js +1 -2
  25. package/dist/client/events/registration.js +42 -0
  26. package/dist/client/incoming.js +37 -0
  27. package/dist/client/mailbox.js +17 -1
  28. package/dist/client/media.js +243 -0
  29. package/dist/client/messages.js +163 -86
  30. package/dist/crypto/core/index.js +4 -1
  31. package/dist/crypto/core/random.js +3 -9
  32. package/dist/crypto/core/xeddsa.js +57 -0
  33. package/dist/crypto/curves/X25519.js +18 -0
  34. package/dist/crypto/curves/constants.js +2 -1
  35. package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
  36. package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
  37. package/dist/esm/appstate/index.js +1 -1
  38. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  39. package/dist/esm/auth/WaAuthClient.js +17 -8
  40. package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  41. package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
  42. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
  43. package/dist/esm/client/WaClient.js +116 -76
  44. package/dist/esm/client/WaClientFactory.js +114 -31
  45. package/dist/esm/client/connection/WaConnectionManager.js +4 -1
  46. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  47. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
  48. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  49. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
  50. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
  51. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  52. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  53. package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
  54. package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
  55. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
  56. package/dist/esm/client/dirty.js +1 -1
  57. package/dist/esm/client/events/abprops.js +40 -0
  58. package/dist/esm/client/events/privacy-token.js +1 -2
  59. package/dist/esm/client/events/registration.js +39 -0
  60. package/dist/esm/client/incoming.js +36 -0
  61. package/dist/esm/client/mailbox.js +17 -1
  62. package/dist/esm/client/media.js +234 -0
  63. package/dist/esm/client/messages.js +162 -85
  64. package/dist/esm/crypto/core/index.js +1 -0
  65. package/dist/esm/crypto/core/random.js +2 -7
  66. package/dist/esm/crypto/core/xeddsa.js +53 -0
  67. package/dist/esm/crypto/curves/X25519.js +20 -2
  68. package/dist/esm/crypto/curves/constants.js +1 -0
  69. package/dist/esm/infra/perf/StoreLock.js +7 -4
  70. package/dist/esm/media/WaMediaCrypto.js +257 -62
  71. package/dist/esm/media/WaMediaTransferClient.js +47 -190
  72. package/dist/esm/media/constants.js +2 -0
  73. package/dist/esm/media/processor.js +1 -0
  74. package/dist/esm/message/addon-crypto.js +130 -3
  75. package/dist/esm/message/content.js +12 -6
  76. package/dist/esm/message/icdc.js +8 -8
  77. package/dist/esm/message/incoming.js +14 -12
  78. package/dist/esm/message/phash.js +32 -12
  79. package/dist/esm/message/reporting-token.js +3 -3
  80. package/dist/esm/message/use-case-secret.js +1 -1
  81. package/dist/esm/protocol/abprops.js +159 -0
  82. package/dist/esm/protocol/browser.js +14 -0
  83. package/dist/esm/protocol/constants.js +3 -1
  84. package/dist/esm/protocol/email.js +30 -0
  85. package/dist/esm/protocol/jid.js +44 -10
  86. package/dist/esm/protocol/nodes.js +6 -2
  87. package/dist/esm/protocol/notification.js +7 -1
  88. package/dist/esm/retry/reason.js +1 -1
  89. package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
  90. package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
  91. package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
  92. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
  93. package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
  94. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
  95. package/dist/esm/signal/crypto/constants.js +0 -4
  96. package/dist/esm/signal/encoding.js +11 -54
  97. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  98. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  99. package/dist/esm/signal/group/SenderKeyManager.js +13 -10
  100. package/dist/esm/signal/registration/keygen.js +2 -3
  101. package/dist/esm/signal/registration/utils.js +2 -2
  102. package/dist/esm/signal/session/SignalProtocol.js +18 -17
  103. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  104. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  105. package/dist/esm/signal/session/SignalSession.js +11 -9
  106. package/dist/esm/signal/session/resolver.js +6 -6
  107. package/dist/esm/store/contracts/identity.store.js +1 -0
  108. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  109. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  110. package/dist/esm/store/contracts/session.store.js +1 -0
  111. package/dist/esm/store/createStore.js +48 -12
  112. package/dist/esm/store/index.js +4 -0
  113. package/dist/esm/store/locks/identity.lock.js +16 -0
  114. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  115. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  116. package/dist/esm/store/locks/session.lock.js +19 -0
  117. package/dist/esm/store/locks/signal.lock.js +0 -24
  118. package/dist/esm/store/noop.store.js +20 -0
  119. package/dist/esm/store/providers/memory/device-list.store.js +3 -0
  120. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  121. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  122. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  123. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  124. package/dist/esm/store/providers/memory/retry.store.js +25 -11
  125. package/dist/esm/store/providers/memory/session.store.js +45 -0
  126. package/dist/esm/store/providers/memory/signal.store.js +1 -164
  127. package/dist/esm/transport/WaComms.js +4 -3
  128. package/dist/esm/transport/WaWebSocket.js +9 -1
  129. package/dist/esm/transport/index.js +6 -0
  130. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  131. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  132. package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
  133. package/dist/esm/transport/node/builders/abprops.js +20 -0
  134. package/dist/esm/transport/node/builders/device.js +11 -0
  135. package/dist/esm/transport/node/builders/email.js +65 -0
  136. package/dist/esm/transport/node/builders/offline.js +14 -0
  137. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  138. package/dist/esm/transport/node/builders/presence.js +13 -0
  139. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  140. package/dist/esm/transport/node/builders/retry.js +1 -1
  141. package/dist/esm/transport/node/helpers.js +24 -0
  142. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  143. package/dist/esm/transport/node/mex/client.js +83 -0
  144. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  145. package/dist/esm/transport/noise/WaClientPayload.js +15 -10
  146. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  147. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  148. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  149. package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
  150. package/dist/infra/perf/StoreLock.js +7 -4
  151. package/dist/media/WaMediaCrypto.js +253 -58
  152. package/dist/media/WaMediaTransferClient.js +50 -223
  153. package/dist/media/constants.js +3 -1
  154. package/dist/media/processor.js +2 -0
  155. package/dist/message/addon-crypto.js +131 -0
  156. package/dist/message/content.js +13 -5
  157. package/dist/message/icdc.js +8 -8
  158. package/dist/message/incoming.js +14 -12
  159. package/dist/message/phash.js +32 -12
  160. package/dist/message/reporting-token.js +2 -2
  161. package/dist/message/use-case-secret.js +1 -1
  162. package/dist/protocol/abprops.js +163 -0
  163. package/dist/protocol/browser.js +15 -0
  164. package/dist/protocol/constants.js +14 -2
  165. package/dist/protocol/email.js +33 -0
  166. package/dist/protocol/jid.js +45 -10
  167. package/dist/protocol/nodes.js +6 -2
  168. package/dist/protocol/notification.js +8 -2
  169. package/dist/retry/reason.js +1 -1
  170. package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
  171. package/dist/signal/api/SignalDigestSyncApi.js +8 -6
  172. package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
  173. package/dist/signal/crypto/WaAdvSignature.js +2 -50
  174. package/dist/signal/crypto/constants.js +1 -5
  175. package/dist/signal/encoding.js +11 -49
  176. package/dist/signal/group/SenderKeyChain.js +2 -2
  177. package/dist/signal/group/SenderKeyCodec.js +4 -5
  178. package/dist/signal/group/SenderKeyManager.js +12 -9
  179. package/dist/signal/registration/keygen.js +1 -2
  180. package/dist/signal/registration/utils.js +2 -2
  181. package/dist/signal/session/SignalProtocol.js +18 -17
  182. package/dist/signal/session/SignalRatchet.js +19 -8
  183. package/dist/signal/session/SignalSerializer.js +5 -6
  184. package/dist/signal/session/SignalSession.js +11 -9
  185. package/dist/signal/session/resolver.js +6 -6
  186. package/dist/store/contracts/identity.store.js +2 -0
  187. package/dist/store/contracts/message-secret.store.js +2 -0
  188. package/dist/store/contracts/pre-key.store.js +2 -0
  189. package/dist/store/contracts/session.store.js +2 -0
  190. package/dist/store/createStore.js +47 -11
  191. package/dist/store/index.js +9 -1
  192. package/dist/store/locks/identity.lock.js +19 -0
  193. package/dist/store/locks/message-secret.lock.js +20 -0
  194. package/dist/store/locks/pre-key.lock.js +30 -0
  195. package/dist/store/locks/session.lock.js +22 -0
  196. package/dist/store/locks/signal.lock.js +0 -24
  197. package/dist/store/noop.store.js +21 -1
  198. package/dist/store/providers/memory/device-list.store.js +3 -0
  199. package/dist/store/providers/memory/identity.store.js +35 -0
  200. package/dist/store/providers/memory/message-secret.store.js +85 -0
  201. package/dist/store/providers/memory/participants.store.js +3 -0
  202. package/dist/store/providers/memory/pre-key.store.js +101 -0
  203. package/dist/store/providers/memory/retry.store.js +24 -10
  204. package/dist/store/providers/memory/session.store.js +49 -0
  205. package/dist/store/providers/memory/signal.store.js +1 -164
  206. package/dist/transport/WaComms.js +4 -3
  207. package/dist/transport/WaWebSocket.js +9 -1
  208. package/dist/transport/index.js +17 -1
  209. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  210. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  211. package/dist/transport/node/WaNodeOrchestrator.js +16 -7
  212. package/dist/transport/node/builders/abprops.js +23 -0
  213. package/dist/transport/node/builders/device.js +14 -0
  214. package/dist/transport/node/builders/email.js +72 -0
  215. package/dist/transport/node/builders/offline.js +17 -0
  216. package/dist/transport/node/builders/prekeys.js +36 -39
  217. package/dist/transport/node/builders/presence.js +16 -0
  218. package/dist/transport/node/builders/privacy-token.js +18 -22
  219. package/dist/transport/node/builders/retry.js +1 -1
  220. package/dist/transport/node/helpers.js +26 -0
  221. package/dist/transport/node/mex/argo-decoder.js +189 -0
  222. package/dist/transport/node/mex/client.js +86 -0
  223. package/dist/transport/node/mex/persist-ids.js +13 -0
  224. package/dist/transport/noise/WaClientPayload.js +14 -9
  225. package/dist/transport/noise/WaFrameCodec.js +1 -1
  226. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  227. package/dist/transport/noise/WaNoiseCert.js +8 -26
  228. package/dist/transport/noise/WaNoiseSession.js +11 -10
  229. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  230. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  231. package/dist/types/appstate/index.d.ts +1 -1
  232. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  233. package/dist/types/appstate/types.d.ts +1 -1
  234. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  235. package/dist/types/auth/credentials-flow.d.ts +20 -0
  236. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  237. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  238. package/dist/types/auth/types.d.ts +40 -0
  239. package/dist/types/client/WaClient.d.ts +19 -8
  240. package/dist/types/client/WaClientFactory.d.ts +10 -4
  241. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  242. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
  243. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  244. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
  245. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
  246. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  247. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
  248. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
  249. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
  250. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  251. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
  252. package/dist/types/client/dirty.d.ts +3 -1
  253. package/dist/types/client/events/abprops.d.ts +14 -0
  254. package/dist/types/client/events/registration.d.ts +17 -0
  255. package/dist/types/client/incoming.d.ts +6 -1
  256. package/dist/types/client/mailbox.d.ts +2 -0
  257. package/dist/types/client/media.d.ts +31 -0
  258. package/dist/types/client/messages.d.ts +2 -0
  259. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
  260. package/dist/types/client/types.d.ts +100 -1
  261. package/dist/types/crypto/core/index.d.ts +1 -0
  262. package/dist/types/crypto/core/primitives.d.ts +1 -1
  263. package/dist/types/crypto/core/random.d.ts +1 -1
  264. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  265. package/dist/types/crypto/curves/constants.d.ts +1 -0
  266. package/dist/types/crypto/index.d.ts +1 -0
  267. package/dist/types/index.d.ts +2 -1
  268. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  269. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  270. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  271. package/dist/types/media/WaMediaCrypto.d.ts +15 -6
  272. package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
  273. package/dist/types/media/constants.d.ts +2 -0
  274. package/dist/types/media/index.d.ts +1 -0
  275. package/dist/types/media/processor.d.ts +28 -0
  276. package/dist/types/media/types.d.ts +9 -3
  277. package/dist/types/message/addon-crypto.d.ts +34 -3
  278. package/dist/types/message/content.d.ts +3 -1
  279. package/dist/types/message/icdc.d.ts +4 -4
  280. package/dist/types/message/types.d.ts +16 -24
  281. package/dist/types/protocol/abprops.d.ts +142 -0
  282. package/dist/types/protocol/browser.d.ts +1 -0
  283. package/dist/types/protocol/constants.d.ts +5 -1
  284. package/dist/types/protocol/email.d.ts +32 -0
  285. package/dist/types/protocol/jid.d.ts +1 -0
  286. package/dist/types/protocol/nodes.d.ts +4 -0
  287. package/dist/types/protocol/notification.d.ts +6 -0
  288. package/dist/types/protocol/stream.d.ts +1 -0
  289. package/dist/types/retry/reason.d.ts +1 -1
  290. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
  291. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
  292. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  293. package/dist/types/signal/crypto/constants.d.ts +0 -1
  294. package/dist/types/signal/encoding.d.ts +7 -1
  295. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  296. package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
  297. package/dist/types/signal/registration/utils.d.ts +2 -1
  298. package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
  299. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  300. package/dist/types/signal/session/resolver.d.ts +4 -2
  301. package/dist/types/signal/types.d.ts +16 -4
  302. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  303. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  304. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  305. package/dist/types/store/contracts/session.store.d.ts +14 -0
  306. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  307. package/dist/types/store/index.d.ts +9 -1
  308. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  309. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  310. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  311. package/dist/types/store/locks/session.lock.d.ts +3 -0
  312. package/dist/types/store/noop.store.d.ts +4 -0
  313. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  314. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  315. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  316. package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
  317. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  318. package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
  319. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  320. package/dist/types/store/types.d.ts +21 -1
  321. package/dist/types/transport/WaWebSocket.d.ts +1 -0
  322. package/dist/types/transport/index.d.ts +8 -1
  323. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  324. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  325. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
  326. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  327. package/dist/types/transport/node/builders/device.d.ts +2 -0
  328. package/dist/types/transport/node/builders/email.d.ts +11 -0
  329. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  330. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  331. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  332. package/dist/types/transport/node/helpers.d.ts +3 -0
  333. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  334. package/dist/types/transport/node/mex/client.d.ts +18 -0
  335. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  336. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  337. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  338. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  339. package/dist/types/transport/types.d.ts +8 -0
  340. package/package.json +6 -4
  341. package/dist/auth/pairing/constants.js +0 -5
  342. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  343. package/dist/esm/auth/pairing/constants.js +0 -2
  344. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  345. package/dist/esm/transport/node/builders/index.js +0 -11
  346. package/dist/transport/node/builders/index.js +0 -51
  347. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  348. package/dist/types/auth/pairing/constants.d.ts +0 -2
  349. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  350. package/dist/types/transport/node/builders/index.d.ts +0 -11
  351. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isMexArgoDecoderAvailable = isMexArgoDecoderAvailable;
37
+ exports.decodeMexArgoResponse = decodeMexArgoResponse;
38
+ const bytes_1 = require("../../../util/bytes");
39
+ let cachedArgo;
40
+ async function loadArgo() {
41
+ if (cachedArgo !== undefined)
42
+ return cachedArgo;
43
+ try {
44
+ cachedArgo = (await Promise.resolve().then(() => __importStar(require('argo-codec'))));
45
+ }
46
+ catch {
47
+ cachedArgo = null;
48
+ }
49
+ return cachedArgo;
50
+ }
51
+ async function isMexArgoDecoderAvailable() {
52
+ return (await loadArgo()) !== null;
53
+ }
54
+ const LABEL_NULL = -1;
55
+ const LABEL_ABSENT = -2;
56
+ const BACKREF_BASE = -4;
57
+ const DESC_NULL = -1;
58
+ const DESC_FALSE = 0;
59
+ const DESC_TRUE = 1;
60
+ const DESC_OBJECT = 2;
61
+ const DESC_LIST = 3;
62
+ const DESC_STRING = 4;
63
+ const DESC_BYTES = 5;
64
+ const DESC_INT = 6;
65
+ const DESC_FLOAT = 7;
66
+ const FLAG_INLINE_EVERYTHING = 1 << 0;
67
+ const FLAG_HAS_USER_FLAGS = 1 << 6;
68
+ async function decodeMexArgoResponse(bytes) {
69
+ const argo = await loadArgo();
70
+ if (!argo)
71
+ throw new Error('argo-codec not installed');
72
+ const r = new argo.Reader(bytes);
73
+ const flags = r.bitset();
74
+ const inline = (flags & FLAG_INLINE_EVERYTHING) !== 0;
75
+ if (flags & FLAG_HAS_USER_FLAGS)
76
+ r.bitset();
77
+ const segments = [];
78
+ if (!inline) {
79
+ while (r.pos < r.end) {
80
+ const len = r.label();
81
+ segments.push(new argo.Reader(r.bytes(len)));
82
+ }
83
+ if (segments.length === 0)
84
+ throw new Error('mex argo: missing core segment');
85
+ }
86
+ else {
87
+ segments.push(r);
88
+ }
89
+ const core = segments[segments.length - 1];
90
+ const blocks = inline ? new Map() : indexBlocks(segments.slice(0, -1));
91
+ const ctx = { core, blocks, stringSeen: [] };
92
+ const data = readDesc(ctx);
93
+ const errors = [];
94
+ if (core.pos < core.end) {
95
+ const errCount = core.label();
96
+ for (let i = 0; i < errCount; i++)
97
+ errors.push(readError(ctx));
98
+ }
99
+ return { data, errors };
100
+ }
101
+ function indexBlocks(slices) {
102
+ const m = new Map();
103
+ const keys = ['String', 'Int', 'Float', 'Bytes'];
104
+ for (let i = 0; i < slices.length && i < keys.length; i++)
105
+ m.set(keys[i], slices[i]);
106
+ return m;
107
+ }
108
+ function getBlock(ctx, key) {
109
+ const b = ctx.blocks.get(key);
110
+ if (!b)
111
+ throw new Error(`mex argo: block '${key}' missing`);
112
+ return b;
113
+ }
114
+ function readStringFromBlock(ctx) {
115
+ const lab = ctx.core.label();
116
+ if (lab < BACKREF_BASE + 1) {
117
+ const idx = -lab + BACKREF_BASE;
118
+ return ctx.stringSeen[idx];
119
+ }
120
+ const block = getBlock(ctx, 'String');
121
+ const s = bytes_1.TEXT_DECODER.decode(block.bytes(lab));
122
+ ctx.stringSeen.push(s);
123
+ return s;
124
+ }
125
+ function readDesc(ctx) {
126
+ const m = ctx.core.label();
127
+ switch (m) {
128
+ case DESC_NULL:
129
+ return null;
130
+ case DESC_FALSE:
131
+ return false;
132
+ case DESC_TRUE:
133
+ return true;
134
+ case DESC_STRING:
135
+ return readStringFromBlock(ctx);
136
+ case DESC_INT:
137
+ return getBlock(ctx, 'Int').label();
138
+ case DESC_FLOAT:
139
+ throw new Error('mex argo: DESC_FLOAT not implemented');
140
+ case DESC_BYTES:
141
+ throw new Error('mex argo: DESC_BYTES not implemented');
142
+ case DESC_LIST: {
143
+ const n = ctx.core.label();
144
+ const out = [];
145
+ for (let i = 0; i < n; i++)
146
+ out.push(readDesc(ctx));
147
+ return out;
148
+ }
149
+ case DESC_OBJECT: {
150
+ const n = ctx.core.label();
151
+ const out = {};
152
+ for (let i = 0; i < n; i++) {
153
+ const key = readStringFromBlock(ctx);
154
+ out[key] = readDesc(ctx);
155
+ }
156
+ return out;
157
+ }
158
+ default:
159
+ throw new Error(`mex argo: unknown DESC marker ${m}`);
160
+ }
161
+ }
162
+ function readError(ctx) {
163
+ const message = readStringFromBlock(ctx);
164
+ skipOptional(ctx); // location — never observed in MEX errors so far
165
+ const path = readPath(ctx);
166
+ const extensions = readOptionalDesc(ctx);
167
+ return { message, path, extensions };
168
+ }
169
+ function skipOptional(ctx) {
170
+ const lab = ctx.core.label();
171
+ if (lab !== LABEL_ABSENT && lab !== LABEL_NULL) {
172
+ // Present but not yet structurally decoded; would need a typed inner read here.
173
+ // For locations specifically we have no observed sample; bail loudly if hit.
174
+ throw new Error(`mex argo: unexpected optional present (lab=${lab}); add support`);
175
+ }
176
+ }
177
+ function readPath(ctx) {
178
+ const lab = ctx.core.label();
179
+ if (lab === LABEL_ABSENT || lab === LABEL_NULL)
180
+ return null;
181
+ return lab;
182
+ }
183
+ function readOptionalDesc(ctx) {
184
+ const lab = ctx.core.label();
185
+ if (lab === LABEL_ABSENT || lab === LABEL_NULL)
186
+ return null;
187
+ const v = readDesc(ctx);
188
+ return typeof v === 'object' && v !== null ? v : null;
189
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dispatchMexQuery = dispatchMexQuery;
4
+ const constants_1 = require("../../../protocol/constants");
5
+ const helpers_1 = require("../../node/helpers");
6
+ const argo_decoder_1 = require("../../node/mex/argo-decoder");
7
+ const query_1 = require("../../node/query");
8
+ const bytes_1 = require("../../../util/bytes");
9
+ const primitives_1 = require("../../../util/primitives");
10
+ const MEX_DEFAULT_TIMEOUT_MS = 32000;
11
+ async function dispatchMexQuery(socket, args) {
12
+ const body = JSON.stringify({
13
+ queryId: args.clientDocId,
14
+ variables: args.variables
15
+ });
16
+ const node = {
17
+ tag: constants_1.WA_NODE_TAGS.IQ,
18
+ attrs: {
19
+ ...(args.iqId ? { id: args.iqId } : {}),
20
+ to: constants_1.WA_DEFAULTS.HOST_DOMAIN,
21
+ type: constants_1.WA_IQ_TYPES.GET,
22
+ xmlns: constants_1.WA_XMLNS.MEX
23
+ },
24
+ content: [
25
+ {
26
+ tag: 'query',
27
+ attrs: { query_id: args.docId },
28
+ content: body
29
+ }
30
+ ]
31
+ };
32
+ const response = await socket.query(node, args.timeoutMs ?? MEX_DEFAULT_TIMEOUT_MS);
33
+ (0, query_1.assertIqResult)(response, `mex/${args.opName}`);
34
+ const data = await parseMexResultPayload(response, args.opName);
35
+ return { raw: response, data };
36
+ }
37
+ async function parseMexResultPayload(node, opName) {
38
+ const result = (0, helpers_1.findNodeChild)(node, 'result');
39
+ if (!result) {
40
+ throw new Error(`mex/${opName} response missing <result>`);
41
+ }
42
+ const format = result.attrs.format ?? 'json';
43
+ const rawBytes = (0, helpers_1.decodeNodeContentUtf8OrBytes)(result.content, `mex/${opName}/result`);
44
+ if (format === 'argo') {
45
+ if (!(await (0, argo_decoder_1.isMexArgoDecoderAvailable)())) {
46
+ throw new Error(`mex/${opName} argo response received but 'argo-codec' not installed; ${rawBytes.length}B; ` +
47
+ `strings: ${extractVisibleStrings(rawBytes)}`);
48
+ }
49
+ let decoded;
50
+ try {
51
+ decoded = await (0, argo_decoder_1.decodeMexArgoResponse)(rawBytes);
52
+ }
53
+ catch (error) {
54
+ throw new Error(`mex/${opName} argo decode failed: ${(0, primitives_1.toError)(error).message}; ` +
55
+ `${rawBytes.length}B; strings: ${extractVisibleStrings(rawBytes)}`);
56
+ }
57
+ if (decoded.errors.length > 0) {
58
+ const summary = decoded.errors
59
+ .map((e) => {
60
+ const code = e.extensions?.error_code ?? e.extensions?.code ?? '?';
61
+ const sev = e.extensions?.severity;
62
+ return `${code}${sev ? `/${String(sev)}` : ''}: ${e.message} @${e.path ?? ''}`;
63
+ })
64
+ .join('; ');
65
+ throw new Error(`mex/${opName} errors: ${summary}`);
66
+ }
67
+ return decoded.data;
68
+ }
69
+ return extractGraphQlData(JSON.parse(bytes_1.TEXT_DECODER.decode(rawBytes)), opName);
70
+ }
71
+ function extractVisibleStrings(bytes) {
72
+ return bytes_1.TEXT_DECODER.decode(bytes)
73
+ .replace(/[\x00-\x1f\x7f-\xff]+/g, ' ')
74
+ .replace(/\s+/g, ' ')
75
+ .trim();
76
+ }
77
+ function extractGraphQlData(payload, opName) {
78
+ const json = (payload ?? {});
79
+ if (json.errors && json.errors.length > 0) {
80
+ const summary = json.errors
81
+ .map((e) => `${e.extensions?.error_code ?? '?'}: ${e.message ?? '?'} @${(e.path ?? []).join('.')}`)
82
+ .join('; ');
83
+ throw new Error(`mex/${opName} errors: ${summary}`);
84
+ }
85
+ return json.data ?? null;
86
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WA_MEX_PERSIST_IDS = void 0;
4
+ exports.WA_MEX_PERSIST_IDS = Object.freeze({
5
+ WWWGetCertificates: Object.freeze({
6
+ docId: '25094190163544446',
7
+ clientDocId: '16428758503015954638431529919'
8
+ }),
9
+ WWWCreateUser: Object.freeze({
10
+ docId: '8548056818544135',
11
+ clientDocId: '25777518041400352865446016972'
12
+ })
13
+ });
@@ -19,13 +19,20 @@ function parseVersion(versionBase) {
19
19
  }
20
20
  return { primary, secondary, tertiary };
21
21
  }
22
+ let cachedLocale = null;
22
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;
23
29
  const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';
24
30
  const [language = 'en', country = 'US'] = locale.split('-');
25
- return {
31
+ cachedLocale = Object.freeze({
26
32
  lg: language.toLowerCase(),
27
33
  lc: country.toUpperCase()
28
- };
34
+ });
35
+ return cachedLocale;
29
36
  }
30
37
  function defaultWebSubPlatform() {
31
38
  return _proto_1.proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
@@ -148,16 +155,14 @@ function buildRegistrationPayload(config) {
148
155
  const version = parseVersion(versionBase);
149
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, version),
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
161
  eKeytype: (0, bytes_1.intToBytes)(1, 5),
157
- eIdent: (0, bytes_1.toBytesView)(config.registrationInfo.identityKeyPair.pubKey),
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 (signatureInput.length !== 64) {
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 _crypto_1.Ed25519.verify(message, signature, edwardsPublicKey);
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
  }
@@ -16,7 +16,7 @@ function resolvePayload(payload) {
16
16
  if (payload instanceof Uint8Array) {
17
17
  return Promise.resolve(payload);
18
18
  }
19
- return Promise.resolve(payload()).then((value) => (0, bytes_1.toBytesView)(value));
19
+ return Promise.resolve(payload());
20
20
  }
21
21
  async function resolveHandshakePayload(config) {
22
22
  if (config.isRegistered) {
@@ -61,6 +61,7 @@ class WaNoiseSession {
61
61
  this.closedError = null;
62
62
  this.noiseSocket = null;
63
63
  this.serverStaticKey = null;
64
+ this.trustedRootCa = undefined;
64
65
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
65
66
  this.sendWire = sendWire;
66
67
  this.logger = logger;
@@ -71,9 +72,7 @@ class WaNoiseSession {
71
72
  isRegistered: config.isRegistered,
72
73
  hasServerStaticKey: !!config.serverStaticKey
73
74
  });
74
- const protocolHeader = config.protocolHeader
75
- ? (0, bytes_1.toBytesView)(config.protocolHeader)
76
- : constants_2.WA_PROTO_HEADER;
75
+ const protocolHeader = config.protocolHeader ?? constants_2.WA_PROTO_HEADER;
77
76
  const introFrame = config.routingInfo && config.routingInfo.length > 0
78
77
  ? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
79
78
  : protocolHeader;
@@ -83,6 +82,7 @@ class WaNoiseSession {
83
82
  resolveHandshakePayload(config)
84
83
  ]);
85
84
  const verifyCertificates = config.verifyCertificateChain !== false;
85
+ this.trustedRootCa = config.trustedRootCa;
86
86
  if (config.serverStaticKey && config.serverStaticKey.length === 32) {
87
87
  this.logger.info('noise session attempting resume handshake (IK)');
88
88
  this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
@@ -184,6 +184,7 @@ class WaNoiseSession {
184
184
  this.closedError = null;
185
185
  this.noiseSocket = null;
186
186
  this.serverStaticKey = null;
187
+ this.trustedRootCa = undefined;
187
188
  this.writeChain = Promise.resolve();
188
189
  this.readChain = Promise.resolve();
189
190
  }
@@ -247,7 +248,7 @@ class WaNoiseSession {
247
248
  if (!serverHello.payload) {
248
249
  throw new Error('noise resume handshake missing certificate payload');
249
250
  }
250
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
251
+ const serverEphemeral = serverHello.ephemeral;
251
252
  await handshake.authenticate(serverEphemeral);
252
253
  const [dh1, dh2] = await Promise.all([
253
254
  _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
@@ -255,7 +256,7 @@ class WaNoiseSession {
255
256
  ]);
256
257
  await handshake.mixIntoKey(dh1);
257
258
  await handshake.mixIntoKey(dh2);
258
- await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
259
+ await handshake.decrypt(serverHello.payload);
259
260
  this.serverStaticKey = serverStaticKey;
260
261
  this.logger.info('noise resume handshake successful without fallback');
261
262
  return { socket: await handshake.finish(), serverHelloFrame: null };
@@ -273,14 +274,14 @@ class WaNoiseSession {
273
274
  if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
274
275
  throw new Error('noise full handshake missing server hello fields');
275
276
  }
276
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
277
+ const serverEphemeral = serverHello.ephemeral;
277
278
  await handshake.authenticate(serverEphemeral);
278
279
  await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
279
- const serverStatic = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.static));
280
+ const serverStatic = await handshake.decrypt(serverHello.static);
280
281
  await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
281
- const certificate = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
282
+ const certificate = await handshake.decrypt(serverHello.payload);
282
283
  if (verifyCertificates) {
283
- await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
284
+ await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
284
285
  this.logger.trace('noise certificate chain verified');
285
286
  }
286
287
  this.serverStaticKey = serverStatic;
@@ -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>;
@@ -3,5 +3,5 @@ export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, Wa
3
3
  export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
4
4
  export * from './utils';
5
5
  export { WaAppStateCrypto } from './WaAppStateCrypto';
6
- export { parseSyncResponse } 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 {