zapo-js 0.1.1 → 0.2.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 (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -12,6 +12,12 @@ function parseSyncResponse(iqNode) {
12
12
  }
13
13
  const syncNode = (0, helpers_1.findNodeChild)(iqNode, constants_1.WA_NODE_TAGS.SYNC);
14
14
  if (!syncNode) {
15
+ if (iqNode.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
16
+ const errorNode = (0, helpers_1.findNodeChild)(iqNode, constants_1.WA_NODE_TAGS.ERROR);
17
+ const code = errorNode?.attrs.code ?? 'unknown';
18
+ const text = errorNode?.attrs.text ?? 'unknown';
19
+ throw new Error(`sync iq failed (${code}: ${text})`);
20
+ }
15
21
  throw new Error('sync response is missing <sync> node');
16
22
  }
17
23
  const payloads = [];
@@ -30,11 +36,16 @@ function parseSyncResponse(iqNode) {
30
36
  }
31
37
  version = parsedVersion;
32
38
  }
33
- const patchesNode = (0, helpers_1.findNodeChild)(collectionNode, constants_1.WA_NODE_TAGS.PATCHES);
34
- const patches = patchesNode
35
- ? (0, helpers_1.getNodeChildrenByTag)(patchesNode, constants_1.WA_NODE_TAGS.PATCH).map((node) => _proto_1.proto.SyncdPatch.decode((0, helpers_1.decodeNodeContentBase64OrBytes)(node.content, 'collection.patches.patch')))
36
- : [];
37
- const snapshotNode = (0, helpers_1.findNodeChild)(collectionNode, constants_1.WA_NODE_TAGS.SNAPSHOT);
39
+ const [patchesNode, snapshotNode] = (0, helpers_1.findNodeChildrenByTags)(collectionNode, [
40
+ constants_1.WA_NODE_TAGS.PATCHES,
41
+ constants_1.WA_NODE_TAGS.SNAPSHOT
42
+ ]);
43
+ const patches = [];
44
+ if (patchesNode) {
45
+ for (const patchNode of (0, helpers_1.getNodeChildrenByTag)(patchesNode, constants_1.WA_NODE_TAGS.PATCH)) {
46
+ patches.push(_proto_1.proto.SyncdPatch.decode((0, helpers_1.decodeNodeContentBase64OrBytes)(patchNode.content, 'collection.patches.patch')));
47
+ }
48
+ }
38
49
  const snapshotReference = snapshotNode
39
50
  ? _proto_1.proto.ExternalBlobReference.decode((0, helpers_1.decodeNodeContentBase64OrBytes)(snapshotNode.content, 'collection.snapshot'))
40
51
  : undefined;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.APP_STATE_DEFAULT_COLLECTIONS = exports.APP_STATE_EMPTY_LT_HASH = exports.APP_STATE_POINT_SIZE = exports.APP_STATE_LT_HASH_SIZE = exports.APP_STATE_IV_LENGTH = exports.APP_STATE_MAC_OCTET_LENGTH = exports.APP_STATE_VALUE_MAC_LENGTH = exports.APP_STATE_DERIVED_PATCH_MAC_KEY_END = exports.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END = exports.APP_STATE_DERIVED_INDEX_KEY_END = exports.APP_STATE_DERIVED_KEY_LENGTH = void 0;
3
+ exports.APP_STATE_DEFAULT_COLLECTIONS = exports.APP_STATE_DEFAULT_COLLECTION_VERSION = exports.APP_STATE_EMPTY_LT_HASH = exports.APP_STATE_POINT_SIZE = exports.APP_STATE_LT_HASH_SIZE = exports.APP_STATE_IV_LENGTH = exports.APP_STATE_MAC_OCTET_LENGTH = exports.APP_STATE_VALUE_MAC_LENGTH = exports.APP_STATE_DERIVED_PATCH_MAC_KEY_END = exports.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_MAC_KEY_END = exports.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END = exports.APP_STATE_DERIVED_INDEX_KEY_END = exports.APP_STATE_DERIVED_KEY_LENGTH = void 0;
4
4
  const constants_1 = require("../protocol/constants");
5
5
  exports.APP_STATE_DERIVED_KEY_LENGTH = 160;
6
6
  exports.APP_STATE_DERIVED_INDEX_KEY_END = 32;
@@ -14,10 +14,11 @@ exports.APP_STATE_IV_LENGTH = 16;
14
14
  exports.APP_STATE_LT_HASH_SIZE = 128;
15
15
  exports.APP_STATE_POINT_SIZE = 2;
16
16
  exports.APP_STATE_EMPTY_LT_HASH = new Uint8Array(exports.APP_STATE_LT_HASH_SIZE);
17
- exports.APP_STATE_DEFAULT_COLLECTIONS = [
17
+ exports.APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
18
+ exports.APP_STATE_DEFAULT_COLLECTIONS = Object.freeze([
18
19
  constants_1.WA_APP_STATE_COLLECTIONS.CRITICAL_UNBLOCK_LOW,
19
20
  constants_1.WA_APP_STATE_COLLECTIONS.CRITICAL_BLOCK,
20
21
  constants_1.WA_APP_STATE_COLLECTIONS.REGULAR_LOW,
21
22
  constants_1.WA_APP_STATE_COLLECTIONS.REGULAR,
22
23
  constants_1.WA_APP_STATE_COLLECTIONS.REGULAR_HIGH
23
- ];
24
+ ]);
@@ -4,8 +4,8 @@ exports.encodeAppStateFingerprint = encodeAppStateFingerprint;
4
4
  exports.decodeAppStateFingerprint = decodeAppStateFingerprint;
5
5
  exports.decodeAppStateSyncKeys = decodeAppStateSyncKeys;
6
6
  exports.decodeAppStateCollections = decodeAppStateCollections;
7
- const _proto_1 = require("../../proto.js");
8
- const coercion_1 = require("../../util/coercion");
7
+ const _proto_1 = require("../proto.js");
8
+ const coercion_1 = require("../util/coercion");
9
9
  function encodeAppStateFingerprint(fingerprint) {
10
10
  if (!fingerprint) {
11
11
  return null;
@@ -26,12 +26,17 @@ function decodeAppStateFingerprint(raw) {
26
26
  }
27
27
  }
28
28
  function decodeAppStateSyncKeys(rows) {
29
- return rows.map((row) => ({
30
- keyId: (0, coercion_1.asBytes)(row.key_id, 'appstate_sync_keys.key_id'),
31
- keyData: (0, coercion_1.asBytes)(row.key_data, 'appstate_sync_keys.key_data'),
32
- timestamp: (0, coercion_1.asNumber)(row.timestamp, 'appstate_sync_keys.timestamp'),
33
- fingerprint: decodeAppStateFingerprint(row.fingerprint)
34
- }));
29
+ const decoded = new Array(rows.length);
30
+ for (let i = 0; i < rows.length; i += 1) {
31
+ const row = rows[i];
32
+ decoded[i] = {
33
+ keyId: (0, coercion_1.asBytes)(row.key_id, 'appstate_sync_keys.key_id'),
34
+ keyData: (0, coercion_1.asBytes)(row.key_data, 'appstate_sync_keys.key_data'),
35
+ timestamp: (0, coercion_1.asNumber)(row.timestamp, 'appstate_sync_keys.timestamp'),
36
+ fingerprint: decodeAppStateFingerprint(row.fingerprint)
37
+ };
38
+ }
39
+ return decoded;
35
40
  }
36
41
  function decodeAppStateCollections(versionRows, valueRows) {
37
42
  const valueMapByCollection = new Map();
@@ -14,15 +14,17 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.parseCollectionState = exports.WaAppStateMissingKeyError = exports.WaAppStateCrypto = void 0;
17
+ exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = void 0;
18
18
  __exportStar(require("./constants"), exports);
19
+ var encoding_1 = require("./encoding");
20
+ Object.defineProperty(exports, "encodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.encodeAppStateFingerprint; } });
21
+ Object.defineProperty(exports, "decodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.decodeAppStateFingerprint; } });
22
+ Object.defineProperty(exports, "decodeAppStateCollections", { enumerable: true, get: function () { return encoding_1.decodeAppStateCollections; } });
23
+ Object.defineProperty(exports, "decodeAppStateSyncKeys", { enumerable: true, get: function () { return encoding_1.decodeAppStateSyncKeys; } });
19
24
  __exportStar(require("./utils"), exports);
20
25
  var WaAppStateCrypto_1 = require("./WaAppStateCrypto");
21
26
  Object.defineProperty(exports, "WaAppStateCrypto", { enumerable: true, get: function () { return WaAppStateCrypto_1.WaAppStateCrypto; } });
22
- var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
23
- Object.defineProperty(exports, "WaAppStateMissingKeyError", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateMissingKeyError; } });
24
27
  var WaAppStateSyncResponseParser_1 = require("./WaAppStateSyncResponseParser");
25
- Object.defineProperty(exports, "parseCollectionState", { enumerable: true, get: function () { return WaAppStateSyncResponseParser_1.parseCollectionState; } });
26
28
  Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return WaAppStateSyncResponseParser_1.parseSyncResponse; } });
27
- var WaAppStateSyncClient_2 = require("./WaAppStateSyncClient");
28
- Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_2.WaAppStateSyncClient; } });
29
+ var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
30
+ Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateSyncClient; } });
@@ -1,40 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.keyIdToHex = keyIdToHex;
4
3
  exports.parseCollectionName = parseCollectionName;
5
- exports.keyDeviceId = keyDeviceId;
6
4
  exports.keyEpoch = keyEpoch;
7
5
  exports.pickActiveSyncKey = pickActiveSyncKey;
8
- exports.toNetworkOrder64 = toNetworkOrder64;
9
6
  exports.downloadExternalBlobReference = downloadExternalBlobReference;
10
7
  const constants_1 = require("../protocol/constants");
11
- const base64_1 = require("../util/base64");
12
8
  const bytes_1 = require("../util/bytes");
13
- function keyIdToHex(keyId) {
14
- return (0, bytes_1.bytesToHex)(keyId);
15
- }
9
+ const APP_STATE_COLLECTION_NAMES = new Set(Object.values(constants_1.WA_APP_STATE_COLLECTIONS));
16
10
  function parseCollectionName(value) {
17
- if (!value) {
18
- return null;
19
- }
20
- for (const collection of Object.values(constants_1.WA_APP_STATE_COLLECTIONS)) {
21
- if (collection === value) {
22
- return collection;
23
- }
24
- }
25
- return null;
11
+ return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
26
12
  }
27
13
  function keyDeviceId(keyId) {
28
- if (keyId.byteLength < 6) {
29
- return null;
30
- }
31
- return (keyId[0] << 8) | keyId[1];
14
+ return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
32
15
  }
33
16
  function keyEpoch(keyId) {
34
- if (keyId.byteLength < 6) {
35
- return -1;
36
- }
37
- return new DataView(keyId.buffer, keyId.byteOffset, keyId.byteLength).getUint32(2, false);
17
+ return keyId.byteLength < 6
18
+ ? -1
19
+ : keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
38
20
  }
39
21
  function pickActiveSyncKey(keys) {
40
22
  let active = null;
@@ -60,20 +42,13 @@ function pickActiveSyncKey(keys) {
60
42
  }
61
43
  return active;
62
44
  }
63
- function toNetworkOrder64(value) {
64
- const out = new Uint8Array(8);
65
- const view = new DataView(out.buffer);
66
- view.setUint32(0, Math.floor(value / 4294967296), false);
67
- view.setUint32(4, value >>> 0, false);
68
- return out;
69
- }
70
45
  async function downloadExternalBlobReference(mediaTransfer, reference) {
71
46
  if (!reference.directPath) {
72
47
  throw new Error('external blob reference is missing directPath');
73
48
  }
74
- const mediaKey = (0, base64_1.decodeProtoBytes)(reference.mediaKey, 'external blob mediaKey');
75
- const fileSha256 = (0, base64_1.decodeProtoBytes)(reference.fileSha256, 'external blob fileSha256');
76
- const fileEncSha256 = (0, base64_1.decodeProtoBytes)(reference.fileEncSha256, 'external blob fileEncSha256');
49
+ const mediaKey = (0, bytes_1.decodeProtoBytes)(reference.mediaKey, 'external blob mediaKey');
50
+ const fileSha256 = (0, bytes_1.decodeProtoBytes)(reference.fileSha256, 'external blob fileSha256');
51
+ const fileEncSha256 = (0, bytes_1.decodeProtoBytes)(reference.fileEncSha256, 'external blob fileEncSha256');
77
52
  return mediaTransfer.downloadAndDecrypt({
78
53
  directPath: reference.directPath,
79
54
  mediaType: constants_1.WA_APP_STATE_KEY_TYPES.MD_APP_STATE,
@@ -70,7 +70,7 @@ class WaAuthClient {
70
70
  signalStore: this.signalStore
71
71
  });
72
72
  this.logger.info('auth client credentials ready', {
73
- registered: this.credentials.meJid !== null && this.credentials.meJid !== undefined
73
+ registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
74
74
  });
75
75
  return this.credentials;
76
76
  });
@@ -80,7 +80,8 @@ class WaAuthClient {
80
80
  return (0, WaAuthCredentialsFlow_1.buildCommsConfig)(this.logger, this.requireCredentials(), socketOptions, {
81
81
  deviceBrowser: this.options.deviceBrowser,
82
82
  deviceOsDisplayName: this.options.deviceOsDisplayName,
83
- requireFullSync: this.options.requireFullSync
83
+ requireFullSync: this.options.requireFullSync,
84
+ version: this.options.version
84
85
  });
85
86
  }
86
87
  async clearTransientState() {
@@ -90,9 +91,8 @@ class WaAuthClient {
90
91
  }
91
92
  async clearStoredCredentials() {
92
93
  this.logger.warn('auth client clearing stored credentials');
93
- await this.authStore.clear();
94
94
  this.credentials = null;
95
- await this.clearTransientState();
95
+ await Promise.all([this.authStore.clear(), this.clearTransientState()]);
96
96
  }
97
97
  async persistServerStaticKey(serverStaticKey) {
98
98
  this.logger.debug('persisting server static key', {
@@ -144,51 +144,39 @@ class WaAuthClient {
144
144
  }
145
145
  });
146
146
  }
147
- async persistMeLid(meLid) {
148
- await this.persistSuccessAttributes({
149
- meLid
150
- });
151
- }
152
147
  async persistSuccessAttributes(attributes) {
153
- let changes = {};
154
- await this.patchCredentials((credentials) => {
155
- const nextMeLid = attributes.meLid ?? credentials.meLid;
156
- const nextMeDisplayName = attributes.meDisplayName ?? credentials.meDisplayName;
157
- const nextCompanionEncStatic = attributes.companionEncStatic ?? credentials.companionEncStatic;
158
- const nextLastSuccessTs = attributes.lastSuccessTs ?? credentials.lastSuccessTs;
159
- const nextPropsVersion = attributes.propsVersion ?? credentials.propsVersion;
160
- const nextAbPropsVersion = attributes.abPropsVersion ?? credentials.abPropsVersion;
161
- const nextConnectionLocation = attributes.connectionLocation ?? credentials.connectionLocation;
162
- const nextAccountCreationTs = attributes.accountCreationTs ?? credentials.accountCreationTs;
163
- changes = {
164
- lidChanged: nextMeLid !== credentials.meLid,
165
- displayNameChanged: nextMeDisplayName !== credentials.meDisplayName,
166
- companionChanged: (credentials.companionEncStatic === undefined) !==
167
- (nextCompanionEncStatic === undefined) ||
168
- (credentials.companionEncStatic !== undefined &&
169
- nextCompanionEncStatic !== undefined &&
170
- !(0, bytes_1.uint8Equal)(credentials.companionEncStatic, nextCompanionEncStatic)),
171
- lastSuccessTsChanged: nextLastSuccessTs !== credentials.lastSuccessTs,
172
- propsVersionChanged: nextPropsVersion !== credentials.propsVersion,
173
- abPropsVersionChanged: nextAbPropsVersion !== credentials.abPropsVersion,
174
- connectionLocationChanged: nextConnectionLocation !== credentials.connectionLocation,
175
- accountCreationTsChanged: nextAccountCreationTs !== credentials.accountCreationTs
176
- };
177
- return {
178
- ...credentials,
179
- meLid: nextMeLid,
180
- meDisplayName: nextMeDisplayName,
181
- companionEncStatic: nextCompanionEncStatic,
182
- lastSuccessTs: nextLastSuccessTs,
183
- propsVersion: nextPropsVersion,
184
- abPropsVersion: nextAbPropsVersion,
185
- connectionLocation: nextConnectionLocation,
186
- accountCreationTs: nextAccountCreationTs
187
- };
188
- }, {
189
- shouldPersist: () => Object.values(changes).some(Boolean),
148
+ let persistDiff;
149
+ const computeDiff = (current, next) => ({
150
+ lidChanged: next.meLid !== current.meLid,
151
+ displayNameChanged: next.meDisplayName !== current.meDisplayName,
152
+ companionChanged: (current.companionEncStatic === undefined) !==
153
+ (next.companionEncStatic === undefined) ||
154
+ (current.companionEncStatic !== undefined &&
155
+ next.companionEncStatic !== undefined &&
156
+ !(0, bytes_1.uint8Equal)(current.companionEncStatic, next.companionEncStatic)),
157
+ lastSuccessTsChanged: next.lastSuccessTs !== current.lastSuccessTs,
158
+ propsVersionChanged: next.propsVersion !== current.propsVersion,
159
+ abPropsVersionChanged: next.abPropsVersion !== current.abPropsVersion,
160
+ connectionLocationChanged: next.connectionLocation !== current.connectionLocation,
161
+ accountCreationTsChanged: next.accountCreationTs !== current.accountCreationTs
162
+ });
163
+ await this.patchCredentials((credentials) => ({
164
+ ...credentials,
165
+ meLid: attributes.meLid ?? credentials.meLid,
166
+ meDisplayName: attributes.meDisplayName ?? credentials.meDisplayName,
167
+ companionEncStatic: attributes.companionEncStatic ?? credentials.companionEncStatic,
168
+ lastSuccessTs: attributes.lastSuccessTs ?? credentials.lastSuccessTs,
169
+ propsVersion: attributes.propsVersion ?? credentials.propsVersion,
170
+ abPropsVersion: attributes.abPropsVersion ?? credentials.abPropsVersion,
171
+ connectionLocation: attributes.connectionLocation ?? credentials.connectionLocation,
172
+ accountCreationTs: attributes.accountCreationTs ?? credentials.accountCreationTs
173
+ }), {
174
+ shouldPersist: (current, next) => {
175
+ persistDiff = computeDiff(current, next);
176
+ return Object.values(persistDiff).some(Boolean);
177
+ },
190
178
  onPersist: () => {
191
- this.logger.debug('persisting success attributes', changes);
179
+ this.logger.debug('persisting success attributes', persistDiff);
192
180
  }
193
181
  });
194
182
  }
@@ -203,24 +191,18 @@ class WaAuthClient {
203
191
  return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
204
192
  }
205
193
  async handleIncomingIqSet(node) {
206
- return this.runHandled(async () => {
207
- this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
208
- return this.pairingFlow.handleIncomingIqSet(node);
209
- });
194
+ this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
195
+ return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
210
196
  }
211
197
  async handleLinkCodeNotification(node) {
212
- return this.runHandled(async () => {
213
- this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
214
- return this.pairingFlow.handleLinkCodeNotification(node);
215
- });
198
+ this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
199
+ return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
216
200
  }
217
201
  async handleCompanionRegRefreshNotification(node) {
218
- return this.runHandled(async () => {
219
- this.logger.trace('auth client handleCompanionRegRefreshNotification', {
220
- id: node.attrs.id
221
- });
222
- return this.pairingFlow.handleCompanionRegRefreshNotification(node);
202
+ this.logger.trace('auth client handleCompanionRegRefreshNotification', {
203
+ id: node.attrs.id
223
204
  });
205
+ return this.runHandled(() => this.pairingFlow.handleCompanionRegRefreshNotification(node));
224
206
  }
225
207
  async patchCredentials(buildNext, options = {}) {
226
208
  const current = this.requireCredentials();
@@ -243,7 +225,7 @@ class WaAuthClient {
243
225
  }
244
226
  async updateCredentials(credentials) {
245
227
  this.logger.trace('auth client update credentials', {
246
- registered: credentials.meJid !== null && credentials.meJid !== undefined
228
+ registered: credentials?.meJid !== null && credentials?.meJid !== undefined
247
229
  });
248
230
  this.credentials = credentials;
249
231
  await (0, WaAuthCredentialsFlow_1.persistCredentials)({
@@ -9,12 +9,13 @@ const X25519_1 = require("../../crypto/curves/X25519");
9
9
  const jid_1 = require("../../protocol/jid");
10
10
  const WaAdvSignature_1 = require("../../signal/crypto/WaAdvSignature");
11
11
  const utils_1 = require("../../signal/registration/utils");
12
+ const proxy_1 = require("../../transport/proxy");
12
13
  const primitives_1 = require("../../util/primitives");
13
14
  async function loadOrCreateCredentials(args) {
14
15
  args.logger.trace('auth credentials loadOrCreate start');
15
16
  const existing = await args.authStore.load();
16
17
  if (!existing) {
17
- const credentials = await createAndPersistFreshCredentials(args);
18
+ const credentials = await createFreshAndPersistCredentials(args);
18
19
  args.logger.info('created fresh auth credentials');
19
20
  return credentials;
20
21
  }
@@ -24,7 +25,7 @@ async function loadOrCreateCredentials(args) {
24
25
  });
25
26
  if (!existing.meJid && !(await hasValidSignedPreKey(args.logger, existing))) {
26
27
  args.logger.warn('signed pre-key is invalid, regenerating credentials');
27
- const fresh = await createAndPersistFreshCredentials(args);
28
+ const fresh = await createFreshAndPersistCredentials(args);
28
29
  args.logger.info('regenerated credentials due to invalid signed pre-key');
29
30
  return fresh;
30
31
  }
@@ -39,8 +40,10 @@ async function persistCredentials(args, credentials) {
39
40
  await args.authStore.save(credentials);
40
41
  }
41
42
  function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
42
- const registered = credentials.meJid !== null && credentials.meJid !== undefined;
43
- const loginIdentity = registered ? (0, jid_1.getLoginIdentity)(credentials.meJid) : null;
43
+ const meJid = credentials.meJid;
44
+ const registered = meJid !== null && meJid !== undefined;
45
+ const loginIdentity = registered ? (0, jid_1.getLoginIdentity)(meJid) : null;
46
+ const wsProxy = socketOptions.proxy?.ws;
44
47
  logger.debug('building comms config from credentials', {
45
48
  registered,
46
49
  hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined
@@ -49,6 +52,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
49
52
  url: socketOptions.url,
50
53
  urls: socketOptions.urls,
51
54
  protocols: socketOptions.protocols,
55
+ dispatcher: (0, proxy_1.toProxyDispatcher)(wsProxy),
56
+ agent: (0, proxy_1.toProxyAgent)(wsProxy),
52
57
  connectTimeoutMs: socketOptions.connectTimeoutMs,
53
58
  reconnectIntervalMs: socketOptions.reconnectIntervalMs,
54
59
  timeoutIntervalMs: socketOptions.timeoutIntervalMs,
@@ -63,7 +68,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
63
68
  username: loginIdentity.username,
64
69
  device: loginIdentity.device,
65
70
  deviceBrowser: clientOptions.deviceBrowser,
66
- deviceOsDisplayName: clientOptions.deviceOsDisplayName
71
+ deviceOsDisplayName: clientOptions.deviceOsDisplayName,
72
+ versionBase: clientOptions.version
67
73
  }
68
74
  : undefined,
69
75
  registrationPayloadConfig: !loginIdentity
@@ -72,7 +78,8 @@ function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
72
78
  signedPreKey: credentials.signedPreKey,
73
79
  deviceBrowser: clientOptions.deviceBrowser,
74
80
  deviceOsDisplayName: clientOptions.deviceOsDisplayName,
75
- requireFullSync: clientOptions.requireFullSync
81
+ requireFullSync: clientOptions.requireFullSync,
82
+ versionBase: clientOptions.version
76
83
  }
77
84
  : undefined
78
85
  }
@@ -93,9 +100,11 @@ async function createFreshCredentials(signalStore, logger) {
93
100
  advSecretKey
94
101
  };
95
102
  }
96
- async function createAndPersistFreshCredentials(args) {
103
+ async function createFreshAndPersistCredentials(args) {
97
104
  const credentials = await createFreshCredentials(args.signalStore, args.logger);
98
- await persistFreshCredentials(args, credentials);
105
+ // Persist credentials first so signal restore never commits state for credentials that failed to save.
106
+ await args.authStore.save(credentials);
107
+ await restoreSignalStore(args.signalStore, credentials);
99
108
  return credentials;
100
109
  }
101
110
  async function hasValidSignedPreKey(logger, credentials) {
@@ -113,11 +122,9 @@ async function hasValidSignedPreKey(logger, credentials) {
113
122
  }
114
123
  }
115
124
  async function restoreSignalStore(signalStore, credentials) {
116
- await signalStore.setRegistrationInfo(credentials.registrationInfo);
117
- await signalStore.setSignedPreKey(credentials.signedPreKey);
118
- await signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true);
119
- }
120
- async function persistFreshCredentials(args, credentials) {
121
- await args.authStore.save(credentials);
122
- await restoreSignalStore(args.signalStore, credentials);
125
+ await Promise.all([
126
+ signalStore.setRegistrationInfo(credentials.registrationInfo),
127
+ signalStore.setSignedPreKey(credentials.signedPreKey),
128
+ signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
129
+ ]);
123
130
  }
@@ -14,14 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.WaAuthSqliteStore = exports.createCompanionHello = exports.completeCompanionFinish = exports.WaAuthClient = exports.getLoginIdentity = void 0;
17
+ exports.WaAuthClient = void 0;
18
18
  __exportStar(require("./types"), exports);
19
- var jid_1 = require("../protocol/jid");
20
- Object.defineProperty(exports, "getLoginIdentity", { enumerable: true, get: function () { return jid_1.getLoginIdentity; } });
21
19
  var WaAuthClient_1 = require("./WaAuthClient");
22
20
  Object.defineProperty(exports, "WaAuthClient", { enumerable: true, get: function () { return WaAuthClient_1.WaAuthClient; } });
23
- var WaPairingCodeCrypto_1 = require("./pairing/WaPairingCodeCrypto");
24
- Object.defineProperty(exports, "completeCompanionFinish", { enumerable: true, get: function () { return WaPairingCodeCrypto_1.completeCompanionFinish; } });
25
- Object.defineProperty(exports, "createCompanionHello", { enumerable: true, get: function () { return WaPairingCodeCrypto_1.createCompanionHello; } });
26
- var auth_store_1 = require("../store/providers/sqlite/auth.store");
27
- Object.defineProperty(exports, "WaAuthSqliteStore", { enumerable: true, get: function () { return auth_store_1.WaAuthSqliteStore; } });
@@ -49,8 +49,8 @@ async function completeCompanionFinish(args) {
49
49
  if (primaryEphemeralPub.length === 0) {
50
50
  throw new Error('empty primary ephemeral public key');
51
51
  }
52
- const sharedEphemeral = await X25519_1.X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub);
53
- const [bundleSalt, bundleSecret, bundleIv] = await Promise.all([
52
+ const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
53
+ X25519_1.X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
54
54
  (0, _crypto_1.randomBytesAsync)(32),
55
55
  (0, _crypto_1.randomBytesAsync)(32),
56
56
  (0, _crypto_1.randomBytesAsync)(12)
@@ -62,9 +62,11 @@ async function completeCompanionFinish(args) {
62
62
  args.primaryIdentityPub,
63
63
  bundleSecret
64
64
  ]);
65
- const encryptedBundle = await (0, _crypto_1.aesGcmEncrypt)(bundleEncryptionKey, bundleIv, plaintextBundle);
65
+ const [encryptedBundle, sharedIdentity] = await Promise.all([
66
+ (0, _crypto_1.aesGcmEncrypt)(bundleEncryptionKey, bundleIv, plaintextBundle),
67
+ X25519_1.X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
68
+ ]);
66
69
  const wrappedKeyBundle = (0, bytes_1.concatBytes)([bundleSalt, bundleIv, encryptedBundle]);
67
- const sharedIdentity = await X25519_1.X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub);
68
70
  const advMaterial = (0, bytes_1.concatBytes)([sharedEphemeral, sharedIdentity, bundleSecret]);
69
71
  const advSecret = await (0, _crypto_1.hkdf)(advMaterial, null, constants_2.WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
70
72
  return {
@@ -7,10 +7,11 @@ const _proto_1 = require("../../proto.js");
7
7
  const constants_1 = require("../../protocol/constants");
8
8
  const jid_1 = require("../../protocol/jid");
9
9
  const WaAdvSignature_1 = require("../../signal/crypto/WaAdvSignature");
10
+ const global_1 = require("../../transport/node/builders/global");
10
11
  const pairing_1 = require("../../transport/node/builders/pairing");
11
12
  const helpers_1 = require("../../transport/node/helpers");
12
- const base64_1 = require("../../util/base64");
13
13
  const bytes_1 = require("../../util/bytes");
14
+ const bytes_2 = require("../../util/bytes");
14
15
  class WaPairingFlow {
15
16
  constructor(options) {
16
17
  this.opts = options;
@@ -121,7 +122,10 @@ class WaPairingFlow {
121
122
  id: node.attrs.id,
122
123
  stage: linkCodeNode.attrs.stage
123
124
  });
124
- await this.opts.socket.sendNode((0, pairing_1.buildNotificationAckNode)(node));
125
+ await this.opts.socket.sendNode((0, global_1.buildAckNode)({
126
+ kind: 'notification',
127
+ node
128
+ }));
125
129
  const stage = linkCodeNode.attrs.stage;
126
130
  if (stage === constants_1.WA_SIGNALING.LINK_CODE_STAGE_REFRESH_CODE) {
127
131
  const refNode = (0, helpers_1.findNodeChild)(linkCodeNode, constants_1.WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
@@ -129,7 +133,7 @@ class WaPairingFlow {
129
133
  return true;
130
134
  }
131
135
  const ref = (0, helpers_1.decodeNodeContentUtf8OrBytes)(refNode.content, 'refresh_code.link_code_pairing_ref');
132
- if ((0, bytes_1.uint8Equal)(ref, this.pairingSession.ref)) {
136
+ if ((0, bytes_2.uint8Equal)(ref, this.pairingSession.ref)) {
133
137
  this.opts.logger.info('received pairing refresh notification', {
134
138
  forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
135
139
  });
@@ -149,27 +153,29 @@ class WaPairingFlow {
149
153
  if (!hasExpectedChild) {
150
154
  return false;
151
155
  }
152
- await this.opts.socket.sendNode((0, pairing_1.buildNotificationAckNode)(node, constants_1.WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION));
156
+ // Rotate first so we don't ack success before local credential state is durably updated.
153
157
  await this.rotateAdvSecret(this.requireCredentials());
158
+ await this.opts.socket.sendNode((0, global_1.buildAckNode)({
159
+ kind: 'notification',
160
+ node,
161
+ typeOverride: constants_1.WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
162
+ }));
154
163
  this.opts.logger.info('handled companion_reg_refresh notification');
155
164
  this.opts.qrFlow.refreshCurrentQr();
156
165
  return true;
157
166
  }
158
167
  async handlePairDevice(iqNode, pairDeviceNode) {
159
- const refs = (0, helpers_1.getNodeChildrenByTag)(pairDeviceNode, constants_1.WA_NODE_TAGS.REF)
160
- .map((child) => bytes_1.TEXT_DECODER.decode((0, helpers_1.decodeNodeContentUtf8OrBytes)(child.content, 'pair-device.ref')))
161
- .filter((ref) => ref.length > 0);
168
+ const refs = (0, helpers_1.getNodeChildrenNonEmptyUtf8ByTag)(pairDeviceNode, constants_1.WA_NODE_TAGS.REF, 'pair-device.ref');
169
+ // Commit adv-secret rotation before sending IQ success to avoid protocol/state divergence.
162
170
  await this.rotateAdvSecret(this.requireCredentials());
171
+ await this.opts.socket.sendNode((0, global_1.buildIqResultNode)(iqNode));
163
172
  this.opts.qrFlow.setRefs(refs);
164
173
  this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
165
- await this.opts.socket.sendNode((0, pairing_1.buildIqResultNode)(iqNode));
166
174
  }
167
175
  async handlePairSuccess(iqNode, pairSuccessNode) {
168
176
  this.opts.logger.info('processing pair-success node');
169
177
  const credentials = this.requireCredentials();
170
- const deviceIdentityNode = (0, helpers_1.findNodeChild)(pairSuccessNode, constants_1.WA_NODE_TAGS.DEVICE_IDENTITY);
171
- const deviceNode = (0, helpers_1.findNodeChild)(pairSuccessNode, 'device');
172
- const platformNode = (0, helpers_1.findNodeChild)(pairSuccessNode, constants_1.WA_NODE_TAGS.PLATFORM);
178
+ const [deviceIdentityNode, deviceNode, platformNode] = (0, helpers_1.findNodeChildrenByTags)(pairSuccessNode, [constants_1.WA_NODE_TAGS.DEVICE_IDENTITY, 'device', constants_1.WA_NODE_TAGS.PLATFORM]);
173
179
  if (!deviceIdentityNode || !deviceNode || !platformNode) {
174
180
  this.opts.logger.error('pair-success missing required nodes', {
175
181
  hasDeviceIdentity: !!deviceIdentityNode,
@@ -179,15 +185,15 @@ class WaPairingFlow {
179
185
  throw new Error('pair-success stanza is missing required nodes');
180
186
  }
181
187
  const wrappedIdentity = _proto_1.proto.ADVSignedDeviceIdentityHMAC.decode((0, helpers_1.decodeNodeContentUtf8OrBytes)(deviceIdentityNode.content, 'pair-success.device-identity'));
182
- const wrappedDetails = (0, base64_1.decodeProtoBytes)(wrappedIdentity.details, 'ADVSignedDeviceIdentityHMAC.details');
183
- const wrappedHmac = (0, base64_1.decodeProtoBytes)(wrappedIdentity.hmac, 'ADVSignedDeviceIdentityHMAC.hmac');
188
+ const wrappedDetails = (0, bytes_1.decodeProtoBytes)(wrappedIdentity.details, 'ADVSignedDeviceIdentityHMAC.details');
189
+ const wrappedHmac = (0, bytes_1.decodeProtoBytes)(wrappedIdentity.hmac, 'ADVSignedDeviceIdentityHMAC.hmac');
184
190
  const accountType = wrappedIdentity.accountType ?? _proto_1.proto.ADVEncryptionType.E2EE;
185
191
  const isHosted = accountType === _proto_1.proto.ADVEncryptionType.HOSTED;
186
192
  const hmacInput = isHosted
187
- ? (0, bytes_1.concatBytes)([WaAdvSignature_1.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
193
+ ? (0, bytes_2.concatBytes)([WaAdvSignature_1.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
188
194
  : wrappedDetails;
189
195
  const expectedHmac = await (0, WaAdvSignature_1.computeAdvIdentityHmac)(credentials.advSecretKey, hmacInput);
190
- if (!(0, bytes_1.uint8Equal)(expectedHmac, wrappedHmac)) {
196
+ if (!(0, bytes_2.uint8Equal)(expectedHmac, wrappedHmac)) {
191
197
  this.opts.logger.error('pair-success hmac mismatch');
192
198
  throw new Error('pair-success HMAC validation failed');
193
199
  }
@@ -234,9 +240,9 @@ class WaPairingFlow {
234
240
  }
235
241
  async buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted) {
236
242
  const signedIdentity = _proto_1.proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
237
- const details = (0, base64_1.decodeProtoBytes)(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
238
- const accountSignature = (0, base64_1.decodeProtoBytes)(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
239
- const accountSignatureKey = (0, base64_1.decodeProtoBytes)(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
243
+ const details = (0, bytes_1.decodeProtoBytes)(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
244
+ const accountSignature = (0, bytes_1.decodeProtoBytes)(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
245
+ const accountSignatureKey = (0, bytes_1.decodeProtoBytes)(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
240
246
  const localIdentity = credentials.registrationInfo.identityKeyPair;
241
247
  const validAccountSignature = await (0, WaAdvSignature_1.verifyDeviceIdentityAccountSignature)(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isHosted);
242
248
  if (!validAccountSignature) {
@@ -270,14 +276,16 @@ class WaPairingFlow {
270
276
  if (pairingSession.attempts > 3) {
271
277
  throw new Error('pairing code exceeded maximum primary hello attempts');
272
278
  }
273
- const refNode = (0, helpers_1.findNodeChild)(linkCodeNode, constants_1.WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
274
- const wrappedPrimaryNode = (0, helpers_1.findNodeChild)(linkCodeNode, 'link_code_pairing_wrapped_primary_ephemeral_pub');
275
- const primaryIdentityNode = (0, helpers_1.findNodeChild)(linkCodeNode, 'primary_identity_pub');
279
+ const [refNode, wrappedPrimaryNode, primaryIdentityNode] = (0, helpers_1.findNodeChildrenByTags)(linkCodeNode, [
280
+ constants_1.WA_NODE_TAGS.LINK_CODE_PAIRING_REF,
281
+ 'link_code_pairing_wrapped_primary_ephemeral_pub',
282
+ 'primary_identity_pub'
283
+ ]);
276
284
  if (!refNode || !wrappedPrimaryNode || !primaryIdentityNode) {
277
285
  throw new Error('primary_hello notification is missing fields');
278
286
  }
279
287
  const ref = (0, helpers_1.decodeNodeContentUtf8OrBytes)(refNode.content, 'primary_hello.link_code_pairing_ref');
280
- if (!pairingSession.ref || !(0, bytes_1.uint8Equal)(ref, pairingSession.ref)) {
288
+ if (!pairingSession.ref || !(0, bytes_2.uint8Equal)(ref, pairingSession.ref)) {
281
289
  this.opts.logger.warn('primary_hello ref mismatch ignored');
282
290
  return;
283
291
  }
@@ -293,10 +301,6 @@ class WaPairingFlow {
293
301
  companionEphemeralPrivKey: pairingSession.companionEphemeralKeyPair.privKey,
294
302
  registrationIdentityKeyPair: credentials.registrationInfo.identityKeyPair
295
303
  });
296
- await this.opts.auth.updateCredentials({
297
- ...credentials,
298
- advSecretKey: finish.advSecret
299
- });
300
304
  const result = await this.opts.socket.query((0, pairing_1.buildCompanionFinishRequestNode)({
301
305
  phoneJid: pairingSession.phoneJid,
302
306
  wrappedKeyBundle: finish.wrappedKeyBundle,
@@ -306,6 +310,10 @@ class WaPairingFlow {
306
310
  if (result.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
307
311
  throw new Error('companion_finish returned error');
308
312
  }
313
+ await this.opts.auth.updateCredentials({
314
+ ...credentials,
315
+ advSecretKey: finish.advSecret
316
+ });
309
317
  pairingSession.finished = true;
310
318
  this.opts.logger.info('primary_hello completed with companion_finish success');
311
319
  }