zapo-js 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,12 +1,12 @@
1
- import { APP_STATE_DEFAULT_COLLECTIONS, APP_STATE_DEFAULT_COLLECTION_VERSION, APP_STATE_EMPTY_LT_HASH } from './constants.js';
1
+ import { APP_STATE_DEFAULT_COLLECTION_VERSION, APP_STATE_DEFAULT_COLLECTIONS, APP_STATE_EMPTY_LT_HASH } from './constants.js';
2
+ import { parseSyncResponse } from './response-parser.js';
2
3
  import { WaAppStateCrypto } from './WaAppStateCrypto.js';
3
- import { parseSyncResponse } from './WaAppStateSyncResponseParser.js';
4
+ import { randomBytesAsync, randomIntAsync } from '../crypto/index.js';
4
5
  import { proto } from '../proto.js';
5
6
  import { WA_APP_STATE_COLLECTION_STATES, WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../protocol/constants.js';
6
7
  import { parseSignalAddressFromJid } from '../protocol/jid.js';
7
8
  import { assertIqResult } from '../transport/node/query.js';
8
- import { decodeProtoBytes } from '../util/bytes.js';
9
- import { bytesToHex, uint8Equal } from '../util/bytes.js';
9
+ import { bytesToHex, decodeProtoBytes, uint8Equal } from '../util/bytes.js';
10
10
  import { longToNumber } from '../util/primitives.js';
11
11
  export class WaAppStateMissingKeyError extends Error {
12
12
  constructor(message, keyId, collection) {
@@ -25,7 +25,8 @@ export class WaAppStateSyncClient {
25
25
  this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
26
26
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.APP_STATE_SYNC_TIMEOUT_MS;
27
27
  this.onMissingKeys = options.onMissingKeys;
28
- this.crypto = new WaAppStateCrypto();
28
+ this.crypto = new WaAppStateCrypto(undefined, options.skipMacVerification === true);
29
+ this.mobilePrimary = options.mobilePrimary ?? false;
29
30
  this.syncContext = null;
30
31
  this.syncPromise = null;
31
32
  }
@@ -33,6 +34,28 @@ export class WaAppStateSyncClient {
33
34
  this.logger.trace('app-state export requested');
34
35
  return this.store.exportData();
35
36
  }
37
+ async ensureInitialSyncKey() {
38
+ const existing = await this.store.getActiveSyncKey();
39
+ if (existing) {
40
+ return existing;
41
+ }
42
+ const keyIdBytes = await randomBytesAsync(2);
43
+ const keyData = await randomBytesAsync(32);
44
+ const rawId = await randomIntAsync(0, 4294967295);
45
+ const key = {
46
+ keyId: keyIdBytes,
47
+ keyData,
48
+ timestamp: Date.now(),
49
+ fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
50
+ };
51
+ await this.store.upsertSyncKeys([key]);
52
+ this.crypto.clearCache();
53
+ this.logger.info('app-state initial sync key generated (mobile primary)', {
54
+ keyId: bytesToHex(keyIdBytes),
55
+ rawId
56
+ });
57
+ return key;
58
+ }
36
59
  async importSyncKeys(keys) {
37
60
  this.logger.debug('app-state importing sync keys', { count: keys.length });
38
61
  const inserted = await this.store.upsertSyncKeys(keys);
@@ -164,7 +187,12 @@ export class WaAppStateSyncClient {
164
187
  }
165
188
  }
166
189
  async syncCollectionsRound(collections, pendingByCollection, options) {
167
- const requests = await Promise.all(collections.map((collection) => this.buildCollectionSyncRequest(collection, pendingByCollection)));
190
+ const activeSyncKey = await this.store.getActiveSyncKey();
191
+ const requestPromises = new Array(collections.length);
192
+ for (let index = 0; index < collections.length; index += 1) {
193
+ requestPromises[index] = this.buildCollectionSyncRequest(collections[index], pendingByCollection, activeSyncKey);
194
+ }
195
+ const requests = await Promise.all(requestPromises);
168
196
  const collectionNodes = new Array(requests.length);
169
197
  const outgoingContexts = new Map();
170
198
  const skippedUploadCollections = new Set();
@@ -180,21 +208,26 @@ export class WaAppStateSyncClient {
180
208
  }
181
209
  const iqNode = this.buildSyncIqNode(collectionNodes);
182
210
  const payloadByCollection = await this.fetchSyncPayloadByCollection(iqNode, options.timeoutMs ?? this.defaultTimeoutMs);
183
- const collectionOutcomes = await Promise.all(collections.map((collection) => this.processCollectionRound({
184
- collection,
185
- payloadByCollection,
186
- pendingByCollection,
187
- options,
188
- outgoingContexts,
189
- skippedUploadCollections
190
- })));
211
+ const collectionOutcomePromises = new Array(collections.length);
212
+ for (let index = 0; index < collections.length; index += 1) {
213
+ collectionOutcomePromises[index] = this.processCollectionRound({
214
+ collection: collections[index],
215
+ payloadByCollection,
216
+ pendingByCollection,
217
+ options,
218
+ outgoingContexts,
219
+ skippedUploadCollections
220
+ });
221
+ }
222
+ const collectionOutcomes = await Promise.all(collectionOutcomePromises);
191
223
  const results = [];
192
224
  const collectionsToRefetch = [];
193
225
  const blockedCollections = [];
194
226
  const missingKeyIds = [];
195
227
  const missingKeyIdHexes = new Set();
196
228
  let stateChanged = false;
197
- for (const entry of collectionOutcomes) {
229
+ for (let index = 0; index < collectionOutcomes.length; index += 1) {
230
+ const entry = collectionOutcomes[index];
198
231
  results.push(entry.result);
199
232
  if (entry.shouldRefetch) {
200
233
  collectionsToRefetch.push(entry.collection);
@@ -221,7 +254,7 @@ export class WaAppStateSyncClient {
221
254
  blockedCollections
222
255
  };
223
256
  }
224
- async buildCollectionSyncRequest(collection, pendingByCollection) {
257
+ async buildCollectionSyncRequest(collection, pendingByCollection, activeSyncKey) {
225
258
  const collectionState = await this.getCollectionState(collection);
226
259
  const hasPersistedState = collectionState.initialized;
227
260
  const attrs = {
@@ -242,7 +275,7 @@ export class WaAppStateSyncClient {
242
275
  });
243
276
  }
244
277
  else {
245
- const outgoing = await this.buildOutgoingPatch(collection, collectionState, pendingMutations);
278
+ const outgoing = await this.buildOutgoingPatch(collection, collectionState, pendingMutations, activeSyncKey);
246
279
  outgoingContext = outgoing.context;
247
280
  children.push({
248
281
  tag: WA_NODE_TAGS.PATCH,
@@ -273,7 +306,7 @@ export class WaAppStateSyncClient {
273
306
  content: [
274
307
  {
275
308
  tag: WA_NODE_TAGS.SYNC,
276
- attrs: {},
309
+ attrs: this.mobilePrimary ? { data_namespace: '3' } : {},
277
310
  content: collectionNodes
278
311
  }
279
312
  ]
@@ -328,14 +361,14 @@ export class WaAppStateSyncClient {
328
361
  const snapshotBytes = await downloader(payload.collection, 'snapshot', payload.snapshotReference);
329
362
  const snapshot = this.validateSnapshot(payload.collection, proto.SyncdSnapshot.decode(snapshotBytes));
330
363
  const snapshotMutations = await this.applySnapshot(payload.collection, snapshot);
331
- appliedMutations = appliedMutations.concat(snapshotMutations);
364
+ appliedMutations.push(...snapshotMutations);
332
365
  collectionStateChanged = true;
333
366
  }
334
367
  if (payload.patches.length > 0) {
335
368
  const readyPatches = await this.resolveReadyPatches(payload, options);
336
369
  for (const readyPatch of readyPatches) {
337
370
  const patchMutations = await this.applyPatch(payload.collection, readyPatch);
338
- appliedMutations = appliedMutations.concat(patchMutations);
371
+ appliedMutations.push(...patchMutations);
339
372
  collectionStateChanged = true;
340
373
  }
341
374
  }
@@ -424,13 +457,12 @@ export class WaAppStateSyncClient {
424
457
  }
425
458
  }
426
459
  async resolveReadyPatches(payload, options) {
427
- const sortedPatches = payload.patches
428
- .map((patch) => ({
429
- patch,
430
- sortVersion: this.parseCollectionPatchVersion(payload.collection, patch)
431
- }))
432
- .sort((left, right) => left.sortVersion - right.sortVersion)
433
- .map((entry) => entry.patch);
460
+ const sortedPatches = payload.patches.slice();
461
+ const sortVersions = new Map();
462
+ for (const patch of sortedPatches) {
463
+ sortVersions.set(patch, this.parseCollectionPatchVersion(payload.collection, patch));
464
+ }
465
+ sortedPatches.sort((left, right) => sortVersions.get(left) - sortVersions.get(right));
434
466
  return Promise.all(sortedPatches.map(async (patch) => {
435
467
  let readyPatch = patch;
436
468
  if ((!readyPatch.mutations || readyPatch.mutations.length === 0) &&
@@ -453,11 +485,13 @@ export class WaAppStateSyncClient {
453
485
  if (!snapshot.version?.version) {
454
486
  throw new Error(`snapshot for ${collection} is missing version`);
455
487
  }
456
- if (!snapshot.mac) {
457
- throw new Error(`snapshot for ${collection} is missing mac`);
458
- }
459
- if (!snapshot.keyId?.id) {
460
- throw new Error(`snapshot for ${collection} is missing keyId`);
488
+ if (!this.crypto.isMacVerificationSkipped) {
489
+ if (!snapshot.mac) {
490
+ throw new Error(`snapshot for ${collection} is missing mac`);
491
+ }
492
+ if (!snapshot.keyId?.id) {
493
+ throw new Error(`snapshot for ${collection} is missing keyId`);
494
+ }
461
495
  }
462
496
  return snapshot;
463
497
  }
@@ -472,14 +506,16 @@ export class WaAppStateSyncClient {
472
506
  if (!patch.version?.version) {
473
507
  throw new Error(`patch for ${collection} is missing version`);
474
508
  }
475
- if (!patch.snapshotMac) {
476
- throw new Error(`patch for ${collection} is missing snapshotMac`);
477
- }
478
- if (!patch.patchMac) {
479
- throw new Error(`patch for ${collection} is missing patchMac`);
480
- }
481
- if (!patch.keyId?.id) {
482
- throw new Error(`patch for ${collection} is missing keyId`);
509
+ if (!this.crypto.isMacVerificationSkipped) {
510
+ if (!patch.snapshotMac) {
511
+ throw new Error(`patch for ${collection} is missing snapshotMac`);
512
+ }
513
+ if (!patch.patchMac) {
514
+ throw new Error(`patch for ${collection} is missing patchMac`);
515
+ }
516
+ if (!patch.keyId?.id) {
517
+ throw new Error(`patch for ${collection} is missing keyId`);
518
+ }
483
519
  }
484
520
  if (patch.mutations && patch.mutations.length > 0 && patch.externalMutations) {
485
521
  throw new Error(`patch for ${collection} has inline and external mutations together`);
@@ -493,10 +529,13 @@ export class WaAppStateSyncClient {
493
529
  }
494
530
  async applySnapshot(collection, snapshot) {
495
531
  const version = this.normalizeProtoLong(snapshot.version?.version, `snapshot.version.version (${collection})`);
496
- const keyId = decodeProtoBytes(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
497
- const keyData = await this.getKeyData(keyId);
498
- if (!keyData) {
499
- throw new WaAppStateMissingKeyError(`missing snapshot key ${bytesToHex(keyId)} for ${collection}`, keyId, collection);
532
+ let keyData = null;
533
+ if (!this.crypto.isMacVerificationSkipped) {
534
+ const keyId = decodeProtoBytes(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
535
+ keyData = await this.getKeyData(keyId);
536
+ if (!keyData) {
537
+ throw new WaAppStateMissingKeyError(`missing snapshot key ${bytesToHex(keyId)} for ${collection}`, keyId, collection);
538
+ }
500
539
  }
501
540
  const indexValueMap = new Map();
502
541
  const mutations = [];
@@ -517,10 +556,18 @@ export class WaAppStateSyncClient {
517
556
  timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `snapshot.record.value.timestamp (${collection})`)
518
557
  });
519
558
  }
520
- const ltHash = await this.crypto.ltHashAdd(APP_STATE_EMPTY_LT_HASH, Array.from(indexValueMap.values()));
521
- const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
522
- if (!uint8Equal(expectedSnapshotMac, snapshot.mac)) {
523
- throw new Error(`snapshot MAC mismatch for ${collection}`);
559
+ const ltHashInput = new Array(indexValueMap.size);
560
+ let ltHashInputIndex = 0;
561
+ for (const valueMac of indexValueMap.values()) {
562
+ ltHashInput[ltHashInputIndex] = valueMac;
563
+ ltHashInputIndex += 1;
564
+ }
565
+ const ltHash = await this.crypto.ltHashAdd(APP_STATE_EMPTY_LT_HASH, ltHashInput);
566
+ if (keyData !== null) {
567
+ const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
568
+ if (!uint8Equal(expectedSnapshotMac, snapshot.mac)) {
569
+ throw new Error(`snapshot MAC mismatch for ${collection}`);
570
+ }
524
571
  }
525
572
  this.setCollectionState(collection, version, ltHash, indexValueMap);
526
573
  return mutations;
@@ -531,10 +578,13 @@ export class WaAppStateSyncClient {
531
578
  if (current.version !== patchVersion - 1) {
532
579
  throw new Error(`patch version mismatch for ${collection}: local=${current.version}, incoming=${patchVersion}`);
533
580
  }
534
- const patchKeyId = decodeProtoBytes(patch.keyId?.id, `patch.keyId.id (${collection})`);
535
- const patchKeyData = await this.getKeyData(patchKeyId);
536
- if (!patchKeyData) {
537
- throw new WaAppStateMissingKeyError(`missing patch key ${bytesToHex(patchKeyId)} for ${collection}`, patchKeyId, collection);
581
+ let patchKeyData = null;
582
+ if (!this.crypto.isMacVerificationSkipped) {
583
+ const patchKeyId = decodeProtoBytes(patch.keyId?.id, `patch.keyId.id (${collection})`);
584
+ patchKeyData = await this.getKeyData(patchKeyId);
585
+ if (!patchKeyData) {
586
+ throw new WaAppStateMissingKeyError(`missing patch key ${bytesToHex(patchKeyId)} for ${collection}`, patchKeyId, collection);
587
+ }
538
588
  }
539
589
  const decryptedMutations = await this.decryptPatchMutations(collection, patch);
540
590
  const macMutations = new Array(decryptedMutations.length);
@@ -549,37 +599,56 @@ export class WaAppStateSyncClient {
549
599
  };
550
600
  }
551
601
  const nextState = await this.computeNextCollectionState(current.hash, current.indexValueMap, macMutations, collection);
552
- await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
602
+ if (patchKeyData !== null) {
603
+ await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
604
+ }
553
605
  this.setCollectionState(collection, patchVersion, nextState.hash, nextState.indexValueMap);
554
- return decryptedMutations.slice();
606
+ return decryptedMutations;
555
607
  }
556
608
  async decryptSnapshotRecords(collection, snapshot) {
557
- const records = (snapshot.records ?? []).map((record) => ({
558
- indexMac: decodeProtoBytes(record.index?.blob, `snapshot.record.index.blob (${collection})`),
559
- valueBlob: decodeProtoBytes(record.value?.blob, `snapshot.record.value.blob (${collection})`),
560
- recordKeyId: decodeProtoBytes(record.keyId?.id, `snapshot.record.keyId.id (${collection})`)
561
- }));
562
- await this.preloadKeyData(records.map((record) => record.recordKeyId));
563
- return Promise.all(records.map(async ({ indexMac, valueBlob, recordKeyId }) => {
564
- const recordKeyData = await this.getKeyData(recordKeyId);
565
- if (!recordKeyData) {
566
- throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
567
- }
568
- const decrypted = await this.crypto.decryptMutation({
569
- operation: proto.SyncdMutation.SyncdOperation.SET,
570
- keyId: recordKeyId,
571
- keyData: recordKeyData,
572
- indexMac,
573
- valueBlob
574
- });
575
- return {
576
- decrypted,
609
+ const rawRecords = snapshot.records ?? [];
610
+ const records = new Array(rawRecords.length);
611
+ const recordKeyIds = new Array(rawRecords.length);
612
+ for (let i = 0; i < rawRecords.length; i += 1) {
613
+ const record = rawRecords[i];
614
+ const recordKeyId = decodeProtoBytes(record.keyId?.id, `snapshot.record.keyId.id (${collection})`);
615
+ records[i] = {
616
+ indexMac: decodeProtoBytes(record.index?.blob, `snapshot.record.index.blob (${collection})`),
617
+ valueBlob: decodeProtoBytes(record.value?.blob, `snapshot.record.value.blob (${collection})`),
577
618
  recordKeyId
578
619
  };
579
- }));
620
+ recordKeyIds[i] = recordKeyId;
621
+ }
622
+ await this.preloadKeyData(recordKeyIds);
623
+ const decryptTasks = new Array(records.length);
624
+ for (let i = 0; i < records.length; i += 1) {
625
+ const { indexMac, valueBlob, recordKeyId } = records[i];
626
+ decryptTasks[i] = (async () => {
627
+ const recordKeyData = await this.getKeyData(recordKeyId);
628
+ if (!recordKeyData) {
629
+ throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
630
+ }
631
+ const decrypted = await this.crypto.decryptMutation({
632
+ operation: proto.SyncdMutation.SyncdOperation.SET,
633
+ keyId: recordKeyId,
634
+ keyData: recordKeyData,
635
+ indexMac,
636
+ valueBlob
637
+ });
638
+ return {
639
+ decrypted,
640
+ recordKeyId
641
+ };
642
+ })();
643
+ }
644
+ return Promise.all(decryptTasks);
580
645
  }
581
646
  async decryptPatchMutations(collection, patch) {
582
- const parsedMutations = (patch.mutations ?? []).map((mutation) => {
647
+ const rawMutations = patch.mutations ?? [];
648
+ const parsedMutations = new Array(rawMutations.length);
649
+ const mutationKeyIds = new Array(rawMutations.length);
650
+ for (let i = 0; i < rawMutations.length; i += 1) {
651
+ const mutation = rawMutations[i];
583
652
  const operationCode = mutation.operation;
584
653
  if (operationCode === null || operationCode === undefined) {
585
654
  throw new Error(`patch mutation is missing operation (${collection})`);
@@ -588,42 +657,49 @@ export class WaAppStateSyncClient {
588
657
  if (!record) {
589
658
  throw new Error(`patch mutation is missing record (${collection})`);
590
659
  }
591
- return {
660
+ const recordKeyId = decodeProtoBytes(record.keyId?.id, `patch.record.keyId.id (${collection})`);
661
+ parsedMutations[i] = {
592
662
  operationCode,
593
663
  indexMac: decodeProtoBytes(record.index?.blob, `patch.record.index.blob (${collection})`),
594
664
  valueBlob: decodeProtoBytes(record.value?.blob, `patch.record.value.blob (${collection})`),
595
- recordKeyId: decodeProtoBytes(record.keyId?.id, `patch.record.keyId.id (${collection})`)
596
- };
597
- });
598
- await this.preloadKeyData(parsedMutations.map((mutation) => mutation.recordKeyId));
599
- return Promise.all(parsedMutations.map(async ({ operationCode, indexMac, valueBlob, recordKeyId }) => {
600
- const recordKeyData = await this.getKeyData(recordKeyId);
601
- if (!recordKeyData) {
602
- throw new WaAppStateMissingKeyError(`missing mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
603
- }
604
- const decrypted = await this.crypto.decryptMutation({
605
- operation: operationCode,
606
- keyId: recordKeyId,
607
- keyData: recordKeyData,
608
- indexMac,
609
- valueBlob
610
- });
611
- return {
612
- collection,
613
- operation: operationCode === proto.SyncdMutation.SyncdOperation.REMOVE
614
- ? 'remove'
615
- : 'set',
616
- source: 'patch',
617
- operationCode,
618
- index: decrypted.index,
619
- value: decrypted.value,
620
- version: decrypted.version,
621
- indexMac: decrypted.indexMac,
622
- valueMac: decrypted.valueMac,
623
- keyId: recordKeyId,
624
- timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `patch.record.value.timestamp (${collection})`)
665
+ recordKeyId
625
666
  };
626
- }));
667
+ mutationKeyIds[i] = recordKeyId;
668
+ }
669
+ await this.preloadKeyData(mutationKeyIds);
670
+ const decryptTasks = new Array(parsedMutations.length);
671
+ for (let i = 0; i < parsedMutations.length; i += 1) {
672
+ const { operationCode, indexMac, valueBlob, recordKeyId } = parsedMutations[i];
673
+ decryptTasks[i] = (async () => {
674
+ const recordKeyData = await this.getKeyData(recordKeyId);
675
+ if (!recordKeyData) {
676
+ throw new WaAppStateMissingKeyError(`missing mutation key ${bytesToHex(recordKeyId)} for ${collection}`, recordKeyId, collection);
677
+ }
678
+ const decrypted = await this.crypto.decryptMutation({
679
+ operation: operationCode,
680
+ keyId: recordKeyId,
681
+ keyData: recordKeyData,
682
+ indexMac,
683
+ valueBlob
684
+ });
685
+ return {
686
+ collection,
687
+ operation: operationCode === proto.SyncdMutation.SyncdOperation.REMOVE
688
+ ? 'remove'
689
+ : 'set',
690
+ source: 'patch',
691
+ operationCode,
692
+ index: decrypted.index,
693
+ value: decrypted.value,
694
+ version: decrypted.version,
695
+ indexMac: decrypted.indexMac,
696
+ valueMac: decrypted.valueMac,
697
+ keyId: recordKeyId,
698
+ timestamp: this.normalizeProtoLong(decrypted.value?.timestamp, `patch.record.value.timestamp (${collection})`)
699
+ };
700
+ })();
701
+ }
702
+ return Promise.all(decryptTasks);
627
703
  }
628
704
  async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
629
705
  const snapshotMac = decodeProtoBytes(patch.snapshotMac, `patch.snapshotMac (${collection})`);
@@ -637,8 +713,7 @@ export class WaAppStateSyncClient {
637
713
  throw new Error(`patch MAC mismatch for ${collection}`);
638
714
  }
639
715
  }
640
- async buildOutgoingPatch(collection, snapshot, pendingMutations) {
641
- const activeKey = await this.store.getActiveSyncKey();
716
+ async buildOutgoingPatch(collection, snapshot, pendingMutations, activeKey) {
642
717
  if (!activeKey) {
643
718
  throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
644
719
  }
@@ -657,23 +732,30 @@ export class WaAppStateSyncClient {
657
732
  });
658
733
  return { operationCode, encrypted };
659
734
  }));
660
- const encryptedMutations = encryptedResults.map(({ operationCode, encrypted }) => ({
661
- operation: operationCode,
662
- record: {
663
- keyId: { id: activeKey.keyId },
664
- index: { blob: encrypted.indexMac },
665
- value: { blob: encrypted.valueBlob }
666
- }
667
- }));
668
- const macMutations = encryptedResults.map(({ operationCode, encrypted }) => ({
669
- operation: operationCode,
670
- indexMac: encrypted.indexMac,
671
- valueMac: encrypted.valueMac
672
- }));
735
+ const encryptedMutations = new Array(encryptedResults.length);
736
+ const macMutations = new Array(encryptedResults.length);
737
+ const valueMacs = new Array(encryptedResults.length);
738
+ for (let i = 0; i < encryptedResults.length; i += 1) {
739
+ const { operationCode, encrypted } = encryptedResults[i];
740
+ encryptedMutations[i] = {
741
+ operation: operationCode,
742
+ record: {
743
+ keyId: { id: activeKey.keyId },
744
+ index: { blob: encrypted.indexMac },
745
+ value: { blob: encrypted.valueBlob }
746
+ }
747
+ };
748
+ macMutations[i] = {
749
+ operation: operationCode,
750
+ indexMac: encrypted.indexMac,
751
+ valueMac: encrypted.valueMac
752
+ };
753
+ valueMacs[i] = encrypted.valueMac;
754
+ }
673
755
  const nextState = await this.computeNextCollectionState(snapshot.hash, snapshot.indexValueMap, macMutations, collection);
674
756
  const patchVersion = snapshot.version + 1;
675
757
  const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
676
- const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, macMutations.map((item) => item.valueMac), patchVersion, collection);
758
+ const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
677
759
  const deviceIndex = this.resolveDeviceIndex();
678
760
  const clientDebugData = this.buildPatchClientDebugData();
679
761
  const encodedPatch = proto.SyncdPatch.encode({
@@ -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 './response-parser.js';
6
6
  export { WaAppStateSyncClient } from './WaAppStateSyncClient.js';
@@ -1,7 +1,7 @@
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, findNodeChildrenByTags, findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
4
+ import { decodeNodeContentBase64OrBytes, findNodeChild, findNodeChildrenByTags, 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}`);
@@ -1,10 +1,10 @@
1
1
  import { WA_APP_STATE_COLLECTIONS, WA_APP_STATE_KEY_TYPES } from '../protocol/constants.js';
2
- import { decodeProtoBytes, intToBytes } from '../util/bytes.js';
2
+ import { decodeProtoBytes } from '../util/bytes.js';
3
3
  const APP_STATE_COLLECTION_NAMES = new Set(Object.values(WA_APP_STATE_COLLECTIONS));
4
4
  export function parseCollectionName(value) {
5
5
  return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
6
6
  }
7
- export function keyDeviceId(keyId) {
7
+ function keyDeviceId(keyId) {
8
8
  return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
9
9
  }
10
10
  export function keyEpoch(keyId) {
@@ -36,9 +36,6 @@ export function pickActiveSyncKey(keys) {
36
36
  }
37
37
  return active;
38
38
  }
39
- export function toNetworkOrder64(value) {
40
- return intToBytes(8, value);
41
- }
42
39
  export async function downloadExternalBlobReference(mediaTransfer, reference) {
43
40
  if (!reference.directPath) {
44
41
  throw new Error('external blob reference is missing directPath');