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
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaNoiseSession = void 0;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
5
  const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
6
- const BoundedTaskQueue_1 = require("../../infra/perf/BoundedTaskQueue");
7
6
  const _proto_1 = require("../../proto.js");
8
7
  const constants_1 = require("../../protocol/constants");
9
8
  const constants_2 = require("../noise/constants");
@@ -51,12 +50,11 @@ function buildRoutingInfoPrefix(routingInfo) {
51
50
  }
52
51
  class WaNoiseSession {
53
52
  constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
54
- this.sendWire = sendWire;
55
- this.logger = logger;
56
- this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
57
- this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
53
+ this.writeChain = Promise.resolve();
54
+ this.readChain = Promise.resolve();
58
55
  this.frameCodec = null;
59
56
  this.handshakeInbox = [];
57
+ this.handshakeInboxHead = 0;
60
58
  this.handshakeWaiter = null;
61
59
  this.handshakeRejecter = null;
62
60
  this.pendingDecryptedFrames = [];
@@ -64,6 +62,8 @@ class WaNoiseSession {
64
62
  this.noiseSocket = null;
65
63
  this.serverStaticKey = null;
66
64
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
65
+ this.sendWire = sendWire;
66
+ this.logger = logger;
67
67
  }
68
68
  async start(config) {
69
69
  this.reset();
@@ -95,12 +95,24 @@ class WaNoiseSession {
95
95
  await this.decodeBufferedPostHandshakeFrames();
96
96
  this.logger.info('noise session established via full handshake');
97
97
  }
98
- async encryptFrame(frame) {
99
- if (!this.noiseSocket || !this.frameCodec) {
100
- throw new Error('noise session is not established');
98
+ encryptFrame(frame) {
99
+ const socket = this.noiseSocket;
100
+ const codec = this.frameCodec;
101
+ if (!socket || !codec) {
102
+ return Promise.reject(new Error('noise session is not established'));
101
103
  }
102
- const encrypted = await this.writeQueue.enqueue(() => this.noiseSocket.encrypt(frame));
103
- return this.frameCodec.encodeFrame(encrypted);
104
+ let encryptPromise;
105
+ try {
106
+ encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
107
+ }
108
+ catch (error) {
109
+ return Promise.reject(error);
110
+ }
111
+ const result = this.writeChain
112
+ .then(() => encryptPromise)
113
+ .then((encrypted) => codec.encodeFrame(encrypted));
114
+ this.writeChain = result.then(() => { }, () => { });
115
+ return result;
104
116
  }
105
117
  async pushWireChunk(chunk) {
106
118
  const codec = this.frameCodec;
@@ -109,7 +121,9 @@ class WaNoiseSession {
109
121
  }
110
122
  const out = [];
111
123
  if (this.pendingDecryptedFrames.length > 0) {
112
- out.push(...this.pendingDecryptedFrames);
124
+ for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
125
+ out.push(this.pendingDecryptedFrames[i]);
126
+ }
113
127
  this.pendingDecryptedFrames = [];
114
128
  }
115
129
  const frames = codec.pushWireChunk(chunk);
@@ -127,9 +141,15 @@ class WaNoiseSession {
127
141
  }
128
142
  return out;
129
143
  }
130
- for (const frame of frames) {
131
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
132
- out.push(decrypted);
144
+ if (frames.length > 0) {
145
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
146
+ this.readChain = this.readChain
147
+ .then(() => decryptBatch)
148
+ .then(() => { }, () => { });
149
+ const decrypted = await decryptBatch;
150
+ for (let i = 0; i < decrypted.length; i++) {
151
+ out.push(decrypted[i]);
152
+ }
133
153
  }
134
154
  return out;
135
155
  }
@@ -144,21 +164,30 @@ class WaNoiseSession {
144
164
  rejecter(closeError);
145
165
  }
146
166
  }
167
+ async decryptFramesBatch(socket, frames) {
168
+ if (frames.length === 1) {
169
+ return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
170
+ }
171
+ const pending = new Array(frames.length);
172
+ for (let i = 0; i < frames.length; i++) {
173
+ pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
174
+ }
175
+ return Promise.all(pending);
176
+ }
147
177
  reset() {
148
178
  this.logger.trace('noise session reset');
149
179
  this.frameCodec = null;
150
- this.handshakeInbox = [];
180
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
151
181
  this.handshakeWaiter = null;
152
182
  this.handshakeRejecter = null;
153
183
  this.pendingDecryptedFrames = [];
154
184
  this.closedError = null;
155
185
  this.noiseSocket = null;
156
186
  this.serverStaticKey = null;
187
+ this.writeChain = Promise.resolve();
188
+ this.readChain = Promise.resolve();
157
189
  }
158
190
  getServerStaticKey() {
159
- if (!this.serverStaticKey) {
160
- return null;
161
- }
162
191
  return this.serverStaticKey;
163
192
  }
164
193
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
@@ -188,10 +217,12 @@ class WaNoiseSession {
188
217
  await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
189
218
  await handshake.authenticate(serverStaticKey);
190
219
  await handshake.authenticate(ephemeralKeyPair.pubKey);
191
- const agreement1 = await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey);
220
+ const [agreement1, agreement2] = await Promise.all([
221
+ _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
222
+ _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
223
+ ]);
192
224
  await handshake.mixIntoKey(agreement1);
193
225
  const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
194
- const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
195
226
  await handshake.mixIntoKey(agreement2);
196
227
  const encryptedPayload = await handshake.encrypt(payload);
197
228
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
@@ -218,8 +249,12 @@ class WaNoiseSession {
218
249
  }
219
250
  const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
220
251
  await handshake.authenticate(serverEphemeral);
221
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
222
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
252
+ const [dh1, dh2] = await Promise.all([
253
+ _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
254
+ _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
255
+ ]);
256
+ await handshake.mixIntoKey(dh1);
257
+ await handshake.mixIntoKey(dh2);
223
258
  await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
224
259
  this.serverStaticKey = serverStaticKey;
225
260
  this.logger.info('noise resume handshake successful without fallback');
@@ -278,8 +313,13 @@ class WaNoiseSession {
278
313
  if (this.closedError) {
279
314
  throw this.closedError;
280
315
  }
281
- const queued = this.handshakeInbox.shift();
316
+ const queued = this.handshakeInboxHead < this.handshakeInbox.length
317
+ ? this.handshakeInbox[this.handshakeInboxHead++]
318
+ : undefined;
282
319
  if (queued) {
320
+ if (this.handshakeInboxHead === this.handshakeInbox.length) {
321
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
322
+ }
283
323
  this.logger.trace('noise handshake frame consumed from queue');
284
324
  return queued;
285
325
  }
@@ -310,17 +350,25 @@ class WaNoiseSession {
310
350
  });
311
351
  }
312
352
  async decodeBufferedPostHandshakeFrames() {
313
- if (!this.noiseSocket || this.handshakeInbox.length === 0) {
353
+ if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
314
354
  return;
315
355
  }
316
356
  this.logger.debug('decoding buffered post-handshake frames', {
317
- count: this.handshakeInbox.length
357
+ count: this.handshakeInbox.length - this.handshakeInboxHead
318
358
  });
319
- const buffered = this.handshakeInbox.splice(0, this.handshakeInbox.length);
320
- for (const frame of buffered) {
321
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
322
- this.pendingDecryptedFrames.push(decrypted);
359
+ const start = this.handshakeInboxHead;
360
+ const frames = this.handshakeInbox.slice(start);
361
+ if (frames.length > 0) {
362
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
363
+ this.readChain = this.readChain
364
+ .then(() => decryptBatch)
365
+ .then(() => { }, () => { });
366
+ const decrypted = await decryptBatch;
367
+ for (let i = 0; i < decrypted.length; i++) {
368
+ this.pendingDecryptedFrames.push(decrypted[i]);
369
+ }
323
370
  }
371
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
324
372
  }
325
373
  }
326
374
  exports.WaNoiseSession = WaNoiseSession;
@@ -9,12 +9,16 @@ class WaNoiseSocket {
9
9
  this.writeCounter = 0;
10
10
  this.readCounter = 0;
11
11
  }
12
- async encrypt(frame, additionalData) {
13
- const nonce = (0, _crypto_1.buildNonce)(this.writeCounter++);
12
+ reserveWriteNonce() {
13
+ return (0, _crypto_1.buildNonce)(this.writeCounter++);
14
+ }
15
+ encrypt(nonce, frame, additionalData) {
14
16
  return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
15
17
  }
16
- async decrypt(frame, additionalData) {
17
- const nonce = (0, _crypto_1.buildNonce)(this.readCounter++);
18
+ reserveReadNonce() {
19
+ return (0, _crypto_1.buildNonce)(this.readCounter++);
20
+ }
21
+ decrypt(nonce, frame, additionalData) {
18
22
  return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
19
23
  }
20
24
  }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isProxyDispatcher = isProxyDispatcher;
4
+ exports.isProxyAgent = isProxyAgent;
5
+ exports.isProxyTransport = isProxyTransport;
6
+ exports.toProxyDispatcher = toProxyDispatcher;
7
+ exports.toProxyAgent = toProxyAgent;
8
+ function isProxyDispatcher(value) {
9
+ return (typeof value === 'object' &&
10
+ value !== null &&
11
+ 'dispatch' in value &&
12
+ typeof value.dispatch === 'function');
13
+ }
14
+ function isProxyAgent(value) {
15
+ return (typeof value === 'object' &&
16
+ value !== null &&
17
+ 'addRequest' in value &&
18
+ typeof value.addRequest === 'function');
19
+ }
20
+ function isProxyTransport(value) {
21
+ return isProxyDispatcher(value) || isProxyAgent(value);
22
+ }
23
+ function toProxyDispatcher(proxy) {
24
+ if (!proxy || !isProxyDispatcher(proxy)) {
25
+ return undefined;
26
+ }
27
+ return proxy;
28
+ }
29
+ function toProxyAgent(proxy) {
30
+ if (!proxy || !isProxyAgent(proxy)) {
31
+ return undefined;
32
+ }
33
+ return proxy;
34
+ }
@@ -1,80 +1,48 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseStreamControlNode = parseStreamControlNode;
4
- exports.parseOptionalInt = parseOptionalInt;
5
4
  exports.parseCompanionEncStatic = parseCompanionEncStatic;
6
5
  exports.parseSuccessPersistAttributes = parseSuccessPersistAttributes;
7
6
  const constants_1 = require("../../protocol/constants");
8
7
  const helpers_1 = require("../node/helpers");
9
- const base64_1 = require("../../util/base64");
10
- function parseStrictUnsignedInt(value) {
11
- if (!/^\d+$/.test(value)) {
12
- return undefined;
13
- }
14
- const parsed = Number(value);
15
- if (!Number.isSafeInteger(parsed)) {
16
- return undefined;
17
- }
18
- return parsed;
19
- }
8
+ const bytes_1 = require("../../util/bytes");
9
+ const primitives_1 = require("../../util/primitives");
10
+ const DIGITS_ONLY_RE = /^\d+$/;
20
11
  function parseStreamControlNode(node) {
21
12
  if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
22
- return {
23
- kind: 'xmlstreamend'
24
- };
13
+ return { kind: 'xmlstreamend' };
25
14
  }
26
15
  if (node.tag !== constants_1.WA_STREAM_SIGNALING.STREAM_ERROR_TAG) {
27
16
  return null;
28
17
  }
29
18
  const conflictNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.CONFLICT_TAG);
30
19
  if (conflictNode) {
31
- if (conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE) {
32
- return {
33
- kind: 'stream_error_replaced'
34
- };
35
- }
36
- return {
37
- kind: 'stream_error_device_removed'
38
- };
20
+ return conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE
21
+ ? { kind: 'stream_error_replaced' }
22
+ : { kind: 'stream_error_device_removed' };
39
23
  }
40
- const codeRaw = node.attrs.code;
41
- if (codeRaw) {
42
- const code = parseStrictUnsignedInt(codeRaw);
43
- if (code !== undefined) {
44
- return {
45
- kind: 'stream_error_code',
46
- code
47
- };
24
+ const codeStr = node.attrs.code;
25
+ if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
26
+ const code = Number(codeStr);
27
+ if (Number.isSafeInteger(code)) {
28
+ return { kind: 'stream_error_code', code };
48
29
  }
49
30
  }
50
31
  const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
51
32
  if (ackNode) {
52
- return {
53
- kind: 'stream_error_ack',
54
- id: ackNode.attrs.id
55
- };
33
+ return { kind: 'stream_error_ack', id: ackNode.attrs.id };
56
34
  }
57
35
  if ((0, helpers_1.hasNodeChild)(node, constants_1.WA_STREAM_SIGNALING.XML_NOT_WELL_FORMED_TAG)) {
58
- return {
59
- kind: 'stream_error_xml_not_well_formed'
60
- };
61
- }
62
- return {
63
- kind: 'stream_error_other'
64
- };
65
- }
66
- function parseOptionalInt(value) {
67
- if (!value) {
68
- return undefined;
36
+ return { kind: 'stream_error_xml_not_well_formed' };
69
37
  }
70
- return parseStrictUnsignedInt(value);
38
+ return { kind: 'stream_error_other' };
71
39
  }
72
40
  function parseCompanionEncStatic(value, onError) {
73
41
  if (!value) {
74
42
  return undefined;
75
43
  }
76
44
  try {
77
- return (0, base64_1.base64ToBytes)(value, 'success.companion_enc_static');
45
+ return (0, bytes_1.base64ToBytesChecked)(value, 'success.companion_enc_static');
78
46
  }
79
47
  catch (error) {
80
48
  if (error instanceof Error) {
@@ -88,10 +56,10 @@ function parseSuccessPersistAttributes(node, onCompanionParseError) {
88
56
  meLid: node.attrs.lid,
89
57
  meDisplayName: node.attrs.display_name,
90
58
  companionEncStatic: parseCompanionEncStatic(node.attrs.companion_enc_static, onCompanionParseError),
91
- lastSuccessTs: parseOptionalInt(node.attrs.t),
92
- propsVersion: parseOptionalInt(node.attrs.props),
93
- abPropsVersion: parseOptionalInt(node.attrs.abprops),
59
+ lastSuccessTs: (0, primitives_1.parseOptionalInt)(node.attrs.t),
60
+ propsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.props),
61
+ abPropsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.abprops),
94
62
  connectionLocation: node.attrs.location,
95
- accountCreationTs: parseOptionalInt(node.attrs.creation)
63
+ accountCreationTs: (0, primitives_1.parseOptionalInt)(node.attrs.creation)
96
64
  };
97
65
  }
@@ -53,7 +53,6 @@ export declare class WaAppStateCrypto {
53
53
  private pointwiseWithOverflow;
54
54
  private generateAssociatedData;
55
55
  private generateValueMac;
56
- private normalizeDerivedKeysCacheMaxSize;
57
56
  private touchDerivedKeysCacheEntry;
58
57
  }
59
58
  export {};
@@ -7,6 +7,7 @@ interface WaAppStateSyncClientOptions {
7
7
  readonly logger: Logger;
8
8
  readonly query: (node: BinaryNode, timeoutMs: number) => Promise<BinaryNode>;
9
9
  readonly store: WaAppStateStore;
10
+ readonly getCurrentMeJid?: () => string | null | undefined;
10
11
  readonly hostDomain?: string;
11
12
  readonly defaultTimeoutMs?: number;
12
13
  readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
@@ -20,6 +21,7 @@ export declare class WaAppStateSyncClient {
20
21
  private readonly logger;
21
22
  private readonly query;
22
23
  private readonly store;
24
+ private readonly getCurrentMeJid?;
23
25
  private readonly hostDomain;
24
26
  private readonly defaultTimeoutMs;
25
27
  private readonly onMissingKeys?;
@@ -33,13 +35,11 @@ export declare class WaAppStateSyncClient {
33
35
  sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
34
36
  private syncOnce;
35
37
  private syncCollectionsRound;
36
- private prepareSyncRoundRequest;
37
38
  private buildCollectionSyncRequest;
38
39
  private buildSyncIqNode;
39
40
  private fetchSyncPayloadByCollection;
40
41
  private processCollectionRound;
41
42
  private createCollectionOutcome;
42
- private collectDistinctMissingKeyIds;
43
43
  private notifyMissingKeys;
44
44
  private resolveReadyPatches;
45
45
  private validateSnapshot;
@@ -51,9 +51,12 @@ export declare class WaAppStateSyncClient {
51
51
  private decryptPatchMutations;
52
52
  private assertPatchMacsMatch;
53
53
  private buildOutgoingPatch;
54
+ private resolveDeviceIndex;
55
+ private buildPatchClientDebugData;
54
56
  private computeNextCollectionState;
55
57
  private normalizeProtoLong;
56
58
  private groupPendingMutations;
59
+ private preloadKeyData;
57
60
  private getKeyData;
58
61
  private getCollectionState;
59
62
  private setCollectionState;
@@ -11,4 +11,5 @@ export declare const APP_STATE_IV_LENGTH = 16;
11
11
  export declare const APP_STATE_LT_HASH_SIZE = 128;
12
12
  export declare const APP_STATE_POINT_SIZE = 2;
13
13
  export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array<ArrayBuffer>;
14
+ export declare const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
14
15
  export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
@@ -0,0 +1,7 @@
1
+ import type { WaAppStateStoreData, WaAppStateSyncKey } from './types';
2
+ type StoreRow = Readonly<Record<string, unknown>>;
3
+ export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
4
+ export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
5
+ export declare function decodeAppStateSyncKeys(rows: readonly StoreRow[]): readonly WaAppStateSyncKey[];
6
+ export declare function decodeAppStateCollections(versionRows: readonly StoreRow[], valueRows: readonly StoreRow[]): WaAppStateStoreData['collections'];
7
+ export {};
@@ -1,7 +1,7 @@
1
1
  export * from './constants';
2
- export type { WaAppStateSyncOptions } from './types';
2
+ export type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey, WaAppStateSyncOptions } from './types';
3
+ export { encodeAppStateFingerprint, decodeAppStateFingerprint, decodeAppStateCollections, decodeAppStateSyncKeys } from './encoding';
3
4
  export * from './utils';
4
5
  export { WaAppStateCrypto } from './WaAppStateCrypto';
5
- export { WaAppStateMissingKeyError } from './WaAppStateSyncClient';
6
- export { parseCollectionState, parseSyncResponse, type CollectionResponsePayload } from './WaAppStateSyncResponseParser';
6
+ export { parseSyncResponse } from './WaAppStateSyncResponseParser';
7
7
  export { WaAppStateSyncClient } from './WaAppStateSyncClient';
@@ -1,10 +1,7 @@
1
1
  import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
2
2
  import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
3
3
  import type { Proto } from '..';
4
- export declare function keyIdToHex(keyId: Uint8Array): string;
5
4
  export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
6
- export declare function keyDeviceId(keyId: Uint8Array): number | null;
7
5
  export declare function keyEpoch(keyId: Uint8Array): number;
8
6
  export declare function pickActiveSyncKey(keys: Iterable<WaAppStateSyncKey>): WaAppStateSyncKey | null;
9
- export declare function toNetworkOrder64(value: number): Uint8Array;
10
7
  export declare function downloadExternalBlobReference(mediaTransfer: WaMediaTransferClient, reference: Proto.IExternalBlobReference): Promise<Uint8Array>;
@@ -3,14 +3,7 @@ import type { Logger } from '../infra/log/types';
3
3
  import type { WaAuthStore } from '../store/contracts/auth.store';
4
4
  import type { WaSignalStore } from '../store/contracts/signal.store';
5
5
  import type { BinaryNode } from '../transport/types';
6
- interface WaAuthClientCallbacks {
7
- readonly onQr?: (qr: string, ttlMs: number) => void;
8
- readonly onPairingCode?: (code: string) => void;
9
- readonly onPairingRefresh?: (forceManual: boolean) => void;
10
- readonly onPaired?: (credentials: WaAuthCredentials) => void;
11
- readonly onError?: (error: Error) => void;
12
- }
13
- interface WaAuthClientDependencies {
6
+ type WaAuthClientDeps = Readonly<{
14
7
  readonly logger: Logger;
15
8
  readonly authStore: WaAuthStore;
16
9
  readonly signalStore: WaSignalStore;
@@ -18,8 +11,14 @@ interface WaAuthClientDependencies {
18
11
  readonly sendNode: (node: BinaryNode) => Promise<void>;
19
12
  readonly query: (node: BinaryNode, timeoutMs?: number) => Promise<BinaryNode>;
20
13
  };
21
- readonly callbacks?: WaAuthClientCallbacks;
22
- }
14
+ readonly callbacks?: {
15
+ readonly onQr?: (qr: string, ttlMs: number) => void;
16
+ readonly onPairingCode?: (code: string) => void;
17
+ readonly onPairingRefresh?: (forceManual: boolean) => void;
18
+ readonly onPaired?: (credentials: WaAuthCredentials) => void;
19
+ readonly onError?: (error: Error) => void;
20
+ };
21
+ }>;
23
22
  export declare class WaAuthClient {
24
23
  private readonly options;
25
24
  private readonly logger;
@@ -29,7 +28,7 @@ export declare class WaAuthClient {
29
28
  private readonly qrFlow;
30
29
  private readonly pairingFlow;
31
30
  private credentials;
32
- constructor(options: WaAuthClientOptions, deps: WaAuthClientDependencies);
31
+ constructor(options: WaAuthClientOptions, deps: WaAuthClientDeps);
33
32
  getState(connected?: boolean): {
34
33
  connected: boolean;
35
34
  registered: boolean;
@@ -45,7 +44,6 @@ export declare class WaAuthClient {
45
44
  persistServerHasPreKeys(serverHasPreKeys: boolean): Promise<void>;
46
45
  persistRoutingInfo(routingInfo: Uint8Array): Promise<void>;
47
46
  clearRoutingInfo(): Promise<WaAuthCredentials>;
48
- persistMeLid(meLid: string): Promise<void>;
49
47
  persistSuccessAttributes(attributes: WaSuccessPersistAttributes): Promise<void>;
50
48
  requestPairingCode(phoneNumber: string, shouldShowPushNotification?: boolean): Promise<string>;
51
49
  fetchPairingCountryCodeIso(): Promise<string>;
@@ -10,5 +10,5 @@ interface WaAuthCredentialsFlowArgs {
10
10
  }
11
11
  export declare function loadOrCreateCredentials(args: WaAuthCredentialsFlowArgs): Promise<WaAuthCredentials>;
12
12
  export declare function persistCredentials(args: WaAuthCredentialsFlowArgs, credentials: WaAuthCredentials): Promise<void>;
13
- export declare function buildCommsConfig(logger: Logger, credentials: WaAuthCredentials, socketOptions: WaAuthSocketOptions, clientOptions: Pick<WaAuthClientOptions, 'deviceBrowser' | 'deviceOsDisplayName' | 'requireFullSync'>): WaCommsConfig;
13
+ export declare function buildCommsConfig(logger: Logger, credentials: WaAuthCredentials, socketOptions: WaAuthSocketOptions, clientOptions: Pick<WaAuthClientOptions, 'deviceBrowser' | 'deviceOsDisplayName' | 'requireFullSync' | 'version'>): WaCommsConfig;
14
14
  export {};
@@ -1,6 +1,2 @@
1
1
  export * from './types';
2
- export { getLoginIdentity } from '../protocol/jid';
3
2
  export { WaAuthClient } from './WaAuthClient';
4
- export { completeCompanionFinish, createCompanionHello } from './pairing/WaPairingCodeCrypto';
5
- export { WaAuthSqliteStore } from '../store/providers/sqlite/auth.store';
6
- export type { WaAuthStore } from '../store/contracts/auth.store';
@@ -6,7 +6,7 @@ export declare class WaQrFlow {
6
6
  private readonly getDevicePlatform;
7
7
  private readonly emitQr;
8
8
  private qrRefs;
9
- private currentRef;
9
+ private qrRefIndex;
10
10
  private currentQrTimer;
11
11
  constructor(args: {
12
12
  readonly logger: Logger;
@@ -1,6 +1,7 @@
1
1
  import type { SignalKeyPair } from '../crypto/curves/types';
2
2
  import type { Proto } from '..';
3
3
  import type { RegistrationInfo, SignedPreKeyRecord } from '../signal/types';
4
+ import type { WaCommsConfig, WaProxyTransport } from '../transport/types';
4
5
  export interface WaAuthCredentials {
5
6
  readonly noiseKeyPair: SignalKeyPair;
6
7
  readonly registrationInfo: RegistrationInfo;
@@ -21,20 +22,17 @@ export interface WaAuthCredentials {
21
22
  readonly connectionLocation?: string;
22
23
  readonly accountCreationTs?: number;
23
24
  }
24
- export interface WaAuthSocketOptions {
25
- readonly url?: string;
26
- readonly urls?: readonly string[];
27
- readonly protocols?: readonly string[];
28
- readonly connectTimeoutMs?: number;
29
- readonly reconnectIntervalMs?: number;
30
- readonly timeoutIntervalMs?: number;
31
- readonly maxReconnectAttempts?: number;
32
- }
25
+ export type WaAuthSocketOptions = Pick<WaCommsConfig, 'url' | 'urls' | 'protocols' | 'connectTimeoutMs' | 'reconnectIntervalMs' | 'timeoutIntervalMs' | 'maxReconnectAttempts'> & {
26
+ readonly proxy?: {
27
+ readonly ws?: WaProxyTransport;
28
+ };
29
+ };
33
30
  export interface WaAuthClientOptions {
34
31
  readonly deviceBrowser?: string;
35
32
  readonly devicePlatform?: string;
36
33
  readonly deviceOsDisplayName?: string;
37
34
  readonly requireFullSync?: boolean;
35
+ readonly version?: string;
38
36
  }
39
37
  export interface WaSuccessPersistAttributes {
40
38
  readonly meLid?: string;