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
@@ -1,13 +1,19 @@
1
1
  import { parseCollectionName } from './utils.js';
2
2
  import { proto } from '../proto.js';
3
3
  import { WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_ERROR_CODES, WA_IQ_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
4
- import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
4
+ import { decodeNodeContentBase64OrBytes, findNodeChildrenByTags, findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
5
5
  export function parseSyncResponse(iqNode) {
6
6
  if (iqNode.tag !== WA_NODE_TAGS.IQ) {
7
7
  throw new Error(`invalid sync response tag ${iqNode.tag}`);
8
8
  }
9
9
  const syncNode = findNodeChild(iqNode, WA_NODE_TAGS.SYNC);
10
10
  if (!syncNode) {
11
+ if (iqNode.attrs.type === WA_IQ_TYPES.ERROR) {
12
+ const errorNode = findNodeChild(iqNode, WA_NODE_TAGS.ERROR);
13
+ const code = errorNode?.attrs.code ?? 'unknown';
14
+ const text = errorNode?.attrs.text ?? 'unknown';
15
+ throw new Error(`sync iq failed (${code}: ${text})`);
16
+ }
11
17
  throw new Error('sync response is missing <sync> node');
12
18
  }
13
19
  const payloads = [];
@@ -26,11 +32,16 @@ export function parseSyncResponse(iqNode) {
26
32
  }
27
33
  version = parsedVersion;
28
34
  }
29
- const patchesNode = findNodeChild(collectionNode, WA_NODE_TAGS.PATCHES);
30
- const patches = patchesNode
31
- ? getNodeChildrenByTag(patchesNode, WA_NODE_TAGS.PATCH).map((node) => proto.SyncdPatch.decode(decodeNodeContentBase64OrBytes(node.content, 'collection.patches.patch')))
32
- : [];
33
- const snapshotNode = findNodeChild(collectionNode, WA_NODE_TAGS.SNAPSHOT);
35
+ const [patchesNode, snapshotNode] = findNodeChildrenByTags(collectionNode, [
36
+ WA_NODE_TAGS.PATCHES,
37
+ WA_NODE_TAGS.SNAPSHOT
38
+ ]);
39
+ const patches = [];
40
+ if (patchesNode) {
41
+ for (const patchNode of getNodeChildrenByTag(patchesNode, WA_NODE_TAGS.PATCH)) {
42
+ patches.push(proto.SyncdPatch.decode(decodeNodeContentBase64OrBytes(patchNode.content, 'collection.patches.patch')));
43
+ }
44
+ }
34
45
  const snapshotReference = snapshotNode
35
46
  ? proto.ExternalBlobReference.decode(decodeNodeContentBase64OrBytes(snapshotNode.content, 'collection.snapshot'))
36
47
  : undefined;
@@ -11,10 +11,11 @@ export const APP_STATE_IV_LENGTH = 16;
11
11
  export const APP_STATE_LT_HASH_SIZE = 128;
12
12
  export const APP_STATE_POINT_SIZE = 2;
13
13
  export const APP_STATE_EMPTY_LT_HASH = new Uint8Array(APP_STATE_LT_HASH_SIZE);
14
- export const APP_STATE_DEFAULT_COLLECTIONS = [
14
+ export const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
15
+ export const APP_STATE_DEFAULT_COLLECTIONS = Object.freeze([
15
16
  WA_APP_STATE_COLLECTIONS.CRITICAL_UNBLOCK_LOW,
16
17
  WA_APP_STATE_COLLECTIONS.CRITICAL_BLOCK,
17
18
  WA_APP_STATE_COLLECTIONS.REGULAR_LOW,
18
19
  WA_APP_STATE_COLLECTIONS.REGULAR,
19
20
  WA_APP_STATE_COLLECTIONS.REGULAR_HIGH
20
- ];
21
+ ]);
@@ -1,5 +1,5 @@
1
- import { proto } from '../../proto.js';
2
- import { asBytes, asNumber, asOptionalBytes, asString } from '../../util/coercion.js';
1
+ import { proto } from '../proto.js';
2
+ import { asBytes, asNumber, asOptionalBytes, asString } from '../util/coercion.js';
3
3
  export function encodeAppStateFingerprint(fingerprint) {
4
4
  if (!fingerprint) {
5
5
  return null;
@@ -20,12 +20,17 @@ export function decodeAppStateFingerprint(raw) {
20
20
  }
21
21
  }
22
22
  export function decodeAppStateSyncKeys(rows) {
23
- return rows.map((row) => ({
24
- keyId: asBytes(row.key_id, 'appstate_sync_keys.key_id'),
25
- keyData: asBytes(row.key_data, 'appstate_sync_keys.key_data'),
26
- timestamp: asNumber(row.timestamp, 'appstate_sync_keys.timestamp'),
27
- fingerprint: decodeAppStateFingerprint(row.fingerprint)
28
- }));
23
+ const decoded = new Array(rows.length);
24
+ for (let i = 0; i < rows.length; i += 1) {
25
+ const row = rows[i];
26
+ decoded[i] = {
27
+ keyId: asBytes(row.key_id, 'appstate_sync_keys.key_id'),
28
+ keyData: asBytes(row.key_data, 'appstate_sync_keys.key_data'),
29
+ timestamp: asNumber(row.timestamp, 'appstate_sync_keys.timestamp'),
30
+ fingerprint: decodeAppStateFingerprint(row.fingerprint)
31
+ };
32
+ }
33
+ return decoded;
29
34
  }
30
35
  export function decodeAppStateCollections(versionRows, valueRows) {
31
36
  const valueMapByCollection = new Map();
@@ -1,6 +1,6 @@
1
1
  export * from './constants.js';
2
+ export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding.js';
2
3
  export * from './utils.js';
3
4
  export { WaAppStateCrypto } from './WaAppStateCrypto.js';
4
- export { WaAppStateMissingKeyError } from './WaAppStateSyncClient.js';
5
- export { parseCollectionState, parseSyncResponse } from './WaAppStateSyncResponseParser.js';
5
+ export { parseSyncResponse } from './WaAppStateSyncResponseParser.js';
6
6
  export { WaAppStateSyncClient } from './WaAppStateSyncClient.js';
@@ -1,31 +1,16 @@
1
1
  import { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_KEY_TYPES } from '../protocol/constants.js';
2
- import { decodeProtoBytes } from '../util/base64.js';
3
- import { bytesToHex } from '../util/bytes.js';
4
- export function keyIdToHex(keyId) {
5
- return bytesToHex(keyId);
6
- }
2
+ import { decodeProtoBytes } from '../util/bytes.js';
3
+ const APP_STATE_COLLECTION_NAMES = new Set(Object.values(WA_APP_STATE_COLLECTIONS));
7
4
  export function parseCollectionName(value) {
8
- if (!value) {
9
- return null;
10
- }
11
- for (const collection of Object.values(WA_APP_STATE_COLLECTIONS)) {
12
- if (collection === value) {
13
- return collection;
14
- }
15
- }
16
- return null;
5
+ return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
17
6
  }
18
- export function keyDeviceId(keyId) {
19
- if (keyId.byteLength < 6) {
20
- return null;
21
- }
22
- return (keyId[0] << 8) | keyId[1];
7
+ function keyDeviceId(keyId) {
8
+ return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
23
9
  }
24
10
  export function keyEpoch(keyId) {
25
- if (keyId.byteLength < 6) {
26
- return -1;
27
- }
28
- return new DataView(keyId.buffer, keyId.byteOffset, keyId.byteLength).getUint32(2, false);
11
+ return keyId.byteLength < 6
12
+ ? -1
13
+ : keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
29
14
  }
30
15
  export function pickActiveSyncKey(keys) {
31
16
  let active = null;
@@ -51,13 +36,6 @@ export function pickActiveSyncKey(keys) {
51
36
  }
52
37
  return active;
53
38
  }
54
- export function toNetworkOrder64(value) {
55
- const out = new Uint8Array(8);
56
- const view = new DataView(out.buffer);
57
- view.setUint32(0, Math.floor(value / 4294967296), false);
58
- view.setUint32(4, value >>> 0, false);
59
- return out;
60
- }
61
39
  export async function downloadExternalBlobReference(mediaTransfer, reference) {
62
40
  if (!reference.directPath) {
63
41
  throw new Error('external blob reference is missing directPath');
@@ -67,7 +67,7 @@ export class WaAuthClient {
67
67
  signalStore: this.signalStore
68
68
  });
69
69
  this.logger.info('auth client credentials ready', {
70
- registered: this.credentials.meJid !== null && this.credentials.meJid !== undefined
70
+ registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
71
71
  });
72
72
  return this.credentials;
73
73
  });
@@ -77,7 +77,8 @@ export class WaAuthClient {
77
77
  return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
78
78
  deviceBrowser: this.options.deviceBrowser,
79
79
  deviceOsDisplayName: this.options.deviceOsDisplayName,
80
- requireFullSync: this.options.requireFullSync
80
+ requireFullSync: this.options.requireFullSync,
81
+ version: this.options.version
81
82
  });
82
83
  }
83
84
  async clearTransientState() {
@@ -87,9 +88,8 @@ export class WaAuthClient {
87
88
  }
88
89
  async clearStoredCredentials() {
89
90
  this.logger.warn('auth client clearing stored credentials');
90
- await this.authStore.clear();
91
91
  this.credentials = null;
92
- await this.clearTransientState();
92
+ await Promise.all([this.authStore.clear(), this.clearTransientState()]);
93
93
  }
94
94
  async persistServerStaticKey(serverStaticKey) {
95
95
  this.logger.debug('persisting server static key', {
@@ -141,51 +141,39 @@ export class WaAuthClient {
141
141
  }
142
142
  });
143
143
  }
144
- async persistMeLid(meLid) {
145
- await this.persistSuccessAttributes({
146
- meLid
147
- });
148
- }
149
144
  async persistSuccessAttributes(attributes) {
150
- let changes = {};
151
- await this.patchCredentials((credentials) => {
152
- const nextMeLid = attributes.meLid ?? credentials.meLid;
153
- const nextMeDisplayName = attributes.meDisplayName ?? credentials.meDisplayName;
154
- const nextCompanionEncStatic = attributes.companionEncStatic ?? credentials.companionEncStatic;
155
- const nextLastSuccessTs = attributes.lastSuccessTs ?? credentials.lastSuccessTs;
156
- const nextPropsVersion = attributes.propsVersion ?? credentials.propsVersion;
157
- const nextAbPropsVersion = attributes.abPropsVersion ?? credentials.abPropsVersion;
158
- const nextConnectionLocation = attributes.connectionLocation ?? credentials.connectionLocation;
159
- const nextAccountCreationTs = attributes.accountCreationTs ?? credentials.accountCreationTs;
160
- changes = {
161
- lidChanged: nextMeLid !== credentials.meLid,
162
- displayNameChanged: nextMeDisplayName !== credentials.meDisplayName,
163
- companionChanged: (credentials.companionEncStatic === undefined) !==
164
- (nextCompanionEncStatic === undefined) ||
165
- (credentials.companionEncStatic !== undefined &&
166
- nextCompanionEncStatic !== undefined &&
167
- !uint8Equal(credentials.companionEncStatic, nextCompanionEncStatic)),
168
- lastSuccessTsChanged: nextLastSuccessTs !== credentials.lastSuccessTs,
169
- propsVersionChanged: nextPropsVersion !== credentials.propsVersion,
170
- abPropsVersionChanged: nextAbPropsVersion !== credentials.abPropsVersion,
171
- connectionLocationChanged: nextConnectionLocation !== credentials.connectionLocation,
172
- accountCreationTsChanged: nextAccountCreationTs !== credentials.accountCreationTs
173
- };
174
- return {
175
- ...credentials,
176
- meLid: nextMeLid,
177
- meDisplayName: nextMeDisplayName,
178
- companionEncStatic: nextCompanionEncStatic,
179
- lastSuccessTs: nextLastSuccessTs,
180
- propsVersion: nextPropsVersion,
181
- abPropsVersion: nextAbPropsVersion,
182
- connectionLocation: nextConnectionLocation,
183
- accountCreationTs: nextAccountCreationTs
184
- };
185
- }, {
186
- shouldPersist: () => Object.values(changes).some(Boolean),
145
+ let persistDiff;
146
+ const computeDiff = (current, next) => ({
147
+ lidChanged: next.meLid !== current.meLid,
148
+ displayNameChanged: next.meDisplayName !== current.meDisplayName,
149
+ companionChanged: (current.companionEncStatic === undefined) !==
150
+ (next.companionEncStatic === undefined) ||
151
+ (current.companionEncStatic !== undefined &&
152
+ next.companionEncStatic !== undefined &&
153
+ !uint8Equal(current.companionEncStatic, next.companionEncStatic)),
154
+ lastSuccessTsChanged: next.lastSuccessTs !== current.lastSuccessTs,
155
+ propsVersionChanged: next.propsVersion !== current.propsVersion,
156
+ abPropsVersionChanged: next.abPropsVersion !== current.abPropsVersion,
157
+ connectionLocationChanged: next.connectionLocation !== current.connectionLocation,
158
+ accountCreationTsChanged: next.accountCreationTs !== current.accountCreationTs
159
+ });
160
+ await this.patchCredentials((credentials) => ({
161
+ ...credentials,
162
+ meLid: attributes.meLid ?? credentials.meLid,
163
+ meDisplayName: attributes.meDisplayName ?? credentials.meDisplayName,
164
+ companionEncStatic: attributes.companionEncStatic ?? credentials.companionEncStatic,
165
+ lastSuccessTs: attributes.lastSuccessTs ?? credentials.lastSuccessTs,
166
+ propsVersion: attributes.propsVersion ?? credentials.propsVersion,
167
+ abPropsVersion: attributes.abPropsVersion ?? credentials.abPropsVersion,
168
+ connectionLocation: attributes.connectionLocation ?? credentials.connectionLocation,
169
+ accountCreationTs: attributes.accountCreationTs ?? credentials.accountCreationTs
170
+ }), {
171
+ shouldPersist: (current, next) => {
172
+ persistDiff = computeDiff(current, next);
173
+ return Object.values(persistDiff).some(Boolean);
174
+ },
187
175
  onPersist: () => {
188
- this.logger.debug('persisting success attributes', changes);
176
+ this.logger.debug('persisting success attributes', persistDiff);
189
177
  }
190
178
  });
191
179
  }
@@ -200,24 +188,18 @@ export class WaAuthClient {
200
188
  return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
201
189
  }
202
190
  async handleIncomingIqSet(node) {
203
- return this.runHandled(async () => {
204
- this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
205
- return this.pairingFlow.handleIncomingIqSet(node);
206
- });
191
+ this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
192
+ return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
207
193
  }
208
194
  async handleLinkCodeNotification(node) {
209
- return this.runHandled(async () => {
210
- this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
211
- return this.pairingFlow.handleLinkCodeNotification(node);
212
- });
195
+ this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
196
+ return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
213
197
  }
214
198
  async handleCompanionRegRefreshNotification(node) {
215
- return this.runHandled(async () => {
216
- this.logger.trace('auth client handleCompanionRegRefreshNotification', {
217
- id: node.attrs.id
218
- });
219
- return this.pairingFlow.handleCompanionRegRefreshNotification(node);
199
+ this.logger.trace('auth client handleCompanionRegRefreshNotification', {
200
+ id: node.attrs.id
220
201
  });
202
+ return this.runHandled(() => this.pairingFlow.handleCompanionRegRefreshNotification(node));
221
203
  }
222
204
  async patchCredentials(buildNext, options = {}) {
223
205
  const current = this.requireCredentials();
@@ -240,7 +222,7 @@ export class WaAuthClient {
240
222
  }
241
223
  async updateCredentials(credentials) {
242
224
  this.logger.trace('auth client update credentials', {
243
- registered: credentials.meJid !== null && credentials.meJid !== undefined
225
+ registered: credentials?.meJid !== null && credentials?.meJid !== undefined
244
226
  });
245
227
  this.credentials = credentials;
246
228
  await persistCredentials({
@@ -4,12 +4,13 @@ import { X25519 } from '../../crypto/curves/X25519.js';
4
4
  import { getLoginIdentity } from '../../protocol/jid.js';
5
5
  import { verifySignalSignature } from '../../signal/crypto/WaAdvSignature.js';
6
6
  import { createAndStoreInitialKeys } from '../../signal/registration/utils.js';
7
+ import { toProxyAgent, toProxyDispatcher } from '../../transport/proxy.js';
7
8
  import { toError } from '../../util/primitives.js';
8
9
  export async function loadOrCreateCredentials(args) {
9
10
  args.logger.trace('auth credentials loadOrCreate start');
10
11
  const existing = await args.authStore.load();
11
12
  if (!existing) {
12
- const credentials = await createAndPersistFreshCredentials(args);
13
+ const credentials = await createFreshAndPersistCredentials(args);
13
14
  args.logger.info('created fresh auth credentials');
14
15
  return credentials;
15
16
  }
@@ -19,7 +20,7 @@ export async function loadOrCreateCredentials(args) {
19
20
  });
20
21
  if (!existing.meJid && !(await hasValidSignedPreKey(args.logger, existing))) {
21
22
  args.logger.warn('signed pre-key is invalid, regenerating credentials');
22
- const fresh = await createAndPersistFreshCredentials(args);
23
+ const fresh = await createFreshAndPersistCredentials(args);
23
24
  args.logger.info('regenerated credentials due to invalid signed pre-key');
24
25
  return fresh;
25
26
  }
@@ -34,8 +35,10 @@ export async function persistCredentials(args, credentials) {
34
35
  await args.authStore.save(credentials);
35
36
  }
36
37
  export function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
37
- const registered = credentials.meJid !== null && credentials.meJid !== undefined;
38
- const loginIdentity = registered ? getLoginIdentity(credentials.meJid) : null;
38
+ const meJid = credentials.meJid;
39
+ const registered = meJid !== null && meJid !== undefined;
40
+ const loginIdentity = registered ? getLoginIdentity(meJid) : null;
41
+ const wsProxy = socketOptions.proxy?.ws;
39
42
  logger.debug('building comms config from credentials', {
40
43
  registered,
41
44
  hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined
@@ -44,6 +47,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
44
47
  url: socketOptions.url,
45
48
  urls: socketOptions.urls,
46
49
  protocols: socketOptions.protocols,
50
+ dispatcher: toProxyDispatcher(wsProxy),
51
+ agent: toProxyAgent(wsProxy),
47
52
  connectTimeoutMs: socketOptions.connectTimeoutMs,
48
53
  reconnectIntervalMs: socketOptions.reconnectIntervalMs,
49
54
  timeoutIntervalMs: socketOptions.timeoutIntervalMs,
@@ -58,7 +63,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
58
63
  username: loginIdentity.username,
59
64
  device: loginIdentity.device,
60
65
  deviceBrowser: clientOptions.deviceBrowser,
61
- deviceOsDisplayName: clientOptions.deviceOsDisplayName
66
+ deviceOsDisplayName: clientOptions.deviceOsDisplayName,
67
+ versionBase: clientOptions.version
62
68
  }
63
69
  : undefined,
64
70
  registrationPayloadConfig: !loginIdentity
@@ -67,7 +73,8 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
67
73
  signedPreKey: credentials.signedPreKey,
68
74
  deviceBrowser: clientOptions.deviceBrowser,
69
75
  deviceOsDisplayName: clientOptions.deviceOsDisplayName,
70
- requireFullSync: clientOptions.requireFullSync
76
+ requireFullSync: clientOptions.requireFullSync,
77
+ versionBase: clientOptions.version
71
78
  }
72
79
  : undefined
73
80
  }
@@ -88,9 +95,11 @@ async function createFreshCredentials(signalStore, logger) {
88
95
  advSecretKey
89
96
  };
90
97
  }
91
- async function createAndPersistFreshCredentials(args) {
98
+ async function createFreshAndPersistCredentials(args) {
92
99
  const credentials = await createFreshCredentials(args.signalStore, args.logger);
93
- await persistFreshCredentials(args, credentials);
100
+ // Persist credentials first so signal restore never commits state for credentials that failed to save.
101
+ await args.authStore.save(credentials);
102
+ await restoreSignalStore(args.signalStore, credentials);
94
103
  return credentials;
95
104
  }
96
105
  async function hasValidSignedPreKey(logger, credentials) {
@@ -108,11 +117,9 @@ async function hasValidSignedPreKey(logger, credentials) {
108
117
  }
109
118
  }
110
119
  async function restoreSignalStore(signalStore, credentials) {
111
- await signalStore.setRegistrationInfo(credentials.registrationInfo);
112
- await signalStore.setSignedPreKey(credentials.signedPreKey);
113
- await signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true);
114
- }
115
- async function persistFreshCredentials(args, credentials) {
116
- await args.authStore.save(credentials);
117
- await restoreSignalStore(args.signalStore, credentials);
120
+ await Promise.all([
121
+ signalStore.setRegistrationInfo(credentials.registrationInfo),
122
+ signalStore.setSignedPreKey(credentials.signedPreKey),
123
+ signalStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
124
+ ]);
118
125
  }
@@ -1,5 +1,2 @@
1
1
  export * from './types.js';
2
- export { getLoginIdentity } from '../protocol/jid.js';
3
2
  export { WaAuthClient } from './WaAuthClient.js';
4
- export { completeCompanionFinish, createCompanionHello } from './pairing/WaPairingCodeCrypto.js';
5
- export { WaAuthSqliteStore } from '../store/providers/sqlite/auth.store.js';
@@ -45,8 +45,8 @@ export async function completeCompanionFinish(args) {
45
45
  if (primaryEphemeralPub.length === 0) {
46
46
  throw new Error('empty primary ephemeral public key');
47
47
  }
48
- const sharedEphemeral = await X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub);
49
- const [bundleSalt, bundleSecret, bundleIv] = await Promise.all([
48
+ const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
49
+ X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
50
50
  randomBytesAsync(32),
51
51
  randomBytesAsync(32),
52
52
  randomBytesAsync(12)
@@ -58,9 +58,11 @@ export async function completeCompanionFinish(args) {
58
58
  args.primaryIdentityPub,
59
59
  bundleSecret
60
60
  ]);
61
- const encryptedBundle = await aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle);
61
+ const [encryptedBundle, sharedIdentity] = await Promise.all([
62
+ aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle),
63
+ X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
64
+ ]);
62
65
  const wrappedKeyBundle = concatBytes([bundleSalt, bundleIv, encryptedBundle]);
63
- const sharedIdentity = await X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub);
64
66
  const advMaterial = concatBytes([sharedEphemeral, sharedIdentity, bundleSecret]);
65
67
  const advSecret = await hkdf(advMaterial, null, WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
66
68
  return {
@@ -4,10 +4,11 @@ import { proto } from '../../proto.js';
4
4
  import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
5
5
  import { parsePhoneJid } from '../../protocol/jid.js';
6
6
  import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/crypto/WaAdvSignature.js';
7
- import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode, buildIqResultNode, buildNotificationAckNode } from '../../transport/node/builders/pairing.js';
8
- import { decodeNodeContentUtf8OrBytes, findNodeChild, getFirstNodeChild, getNodeChildrenByTag, hasNodeChild } from '../../transport/node/helpers.js';
9
- import { decodeProtoBytes } from '../../util/base64.js';
10
- import { concatBytes, TEXT_DECODER, uint8Equal } from '../../util/bytes.js';
7
+ import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
8
+ import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
9
+ import { decodeNodeContentUtf8OrBytes, findNodeChildrenByTags, findNodeChild, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.js';
10
+ import { decodeProtoBytes } from '../../util/bytes.js';
11
+ import { concatBytes, uint8Equal } from '../../util/bytes.js';
11
12
  export class WaPairingFlow {
12
13
  constructor(options) {
13
14
  this.opts = options;
@@ -118,7 +119,10 @@ export class WaPairingFlow {
118
119
  id: node.attrs.id,
119
120
  stage: linkCodeNode.attrs.stage
120
121
  });
121
- await this.opts.socket.sendNode(buildNotificationAckNode(node));
122
+ await this.opts.socket.sendNode(buildAckNode({
123
+ kind: 'notification',
124
+ node
125
+ }));
122
126
  const stage = linkCodeNode.attrs.stage;
123
127
  if (stage === WA_SIGNALING.LINK_CODE_STAGE_REFRESH_CODE) {
124
128
  const refNode = findNodeChild(linkCodeNode, WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
@@ -146,27 +150,29 @@ export class WaPairingFlow {
146
150
  if (!hasExpectedChild) {
147
151
  return false;
148
152
  }
149
- await this.opts.socket.sendNode(buildNotificationAckNode(node, WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION));
153
+ // Rotate first so we don't ack success before local credential state is durably updated.
150
154
  await this.rotateAdvSecret(this.requireCredentials());
155
+ await this.opts.socket.sendNode(buildAckNode({
156
+ kind: 'notification',
157
+ node,
158
+ typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
159
+ }));
151
160
  this.opts.logger.info('handled companion_reg_refresh notification');
152
161
  this.opts.qrFlow.refreshCurrentQr();
153
162
  return true;
154
163
  }
155
164
  async handlePairDevice(iqNode, pairDeviceNode) {
156
- const refs = getNodeChildrenByTag(pairDeviceNode, WA_NODE_TAGS.REF)
157
- .map((child) => TEXT_DECODER.decode(decodeNodeContentUtf8OrBytes(child.content, 'pair-device.ref')))
158
- .filter((ref) => ref.length > 0);
165
+ const refs = getNodeChildrenNonEmptyUtf8ByTag(pairDeviceNode, WA_NODE_TAGS.REF, 'pair-device.ref');
166
+ // Commit adv-secret rotation before sending IQ success to avoid protocol/state divergence.
159
167
  await this.rotateAdvSecret(this.requireCredentials());
168
+ await this.opts.socket.sendNode(buildIqResultNode(iqNode));
160
169
  this.opts.qrFlow.setRefs(refs);
161
170
  this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
162
- await this.opts.socket.sendNode(buildIqResultNode(iqNode));
163
171
  }
164
172
  async handlePairSuccess(iqNode, pairSuccessNode) {
165
173
  this.opts.logger.info('processing pair-success node');
166
174
  const credentials = this.requireCredentials();
167
- const deviceIdentityNode = findNodeChild(pairSuccessNode, WA_NODE_TAGS.DEVICE_IDENTITY);
168
- const deviceNode = findNodeChild(pairSuccessNode, 'device');
169
- const platformNode = findNodeChild(pairSuccessNode, WA_NODE_TAGS.PLATFORM);
175
+ const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
170
176
  if (!deviceIdentityNode || !deviceNode || !platformNode) {
171
177
  this.opts.logger.error('pair-success missing required nodes', {
172
178
  hasDeviceIdentity: !!deviceIdentityNode,
@@ -267,9 +273,11 @@ export class WaPairingFlow {
267
273
  if (pairingSession.attempts > 3) {
268
274
  throw new Error('pairing code exceeded maximum primary hello attempts');
269
275
  }
270
- const refNode = findNodeChild(linkCodeNode, WA_NODE_TAGS.LINK_CODE_PAIRING_REF);
271
- const wrappedPrimaryNode = findNodeChild(linkCodeNode, 'link_code_pairing_wrapped_primary_ephemeral_pub');
272
- const primaryIdentityNode = findNodeChild(linkCodeNode, 'primary_identity_pub');
276
+ const [refNode, wrappedPrimaryNode, primaryIdentityNode] = findNodeChildrenByTags(linkCodeNode, [
277
+ WA_NODE_TAGS.LINK_CODE_PAIRING_REF,
278
+ 'link_code_pairing_wrapped_primary_ephemeral_pub',
279
+ 'primary_identity_pub'
280
+ ]);
273
281
  if (!refNode || !wrappedPrimaryNode || !primaryIdentityNode) {
274
282
  throw new Error('primary_hello notification is missing fields');
275
283
  }
@@ -290,10 +298,6 @@ export class WaPairingFlow {
290
298
  companionEphemeralPrivKey: pairingSession.companionEphemeralKeyPair.privKey,
291
299
  registrationIdentityKeyPair: credentials.registrationInfo.identityKeyPair
292
300
  });
293
- await this.opts.auth.updateCredentials({
294
- ...credentials,
295
- advSecretKey: finish.advSecret
296
- });
297
301
  const result = await this.opts.socket.query(buildCompanionFinishRequestNode({
298
302
  phoneJid: pairingSession.phoneJid,
299
303
  wrappedKeyBundle: finish.wrappedKeyBundle,
@@ -303,6 +307,10 @@ export class WaPairingFlow {
303
307
  if (result.attrs.type === WA_IQ_TYPES.ERROR) {
304
308
  throw new Error('companion_finish returned error');
305
309
  }
310
+ await this.opts.auth.updateCredentials({
311
+ ...credentials,
312
+ advSecretKey: finish.advSecret
313
+ });
306
314
  pairingSession.finished = true;
307
315
  this.opts.logger.info('primary_hello completed with companion_finish success');
308
316
  }