zapo-js 0.1.2 → 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 (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -4,6 +4,7 @@ exports.buildRetryReceiptNode = buildRetryReceiptNode;
4
4
  const constants_1 = require("../../../protocol/constants");
5
5
  const constants_2 = require("../../../retry/constants");
6
6
  const constants_3 = require("../../../signal/api/constants");
7
+ const global_1 = require("../../node/builders/global");
7
8
  const bytes_1 = require("../../../util/bytes");
8
9
  function buildRetryKeysNode(keys) {
9
10
  const content = [
@@ -71,23 +72,6 @@ function buildRetryKeysNode(keys) {
71
72
  };
72
73
  }
73
74
  function buildRetryReceiptNode(input) {
74
- const attrs = {
75
- id: input.stanzaId,
76
- to: input.to,
77
- type: 'retry'
78
- };
79
- if (input.participant) {
80
- attrs.participant = input.participant;
81
- }
82
- if (input.recipient) {
83
- attrs.recipient = input.recipient;
84
- }
85
- if (input.from) {
86
- attrs.from = input.from;
87
- }
88
- if (input.categoryPeer) {
89
- attrs.category = 'peer';
90
- }
91
75
  const retryAttrs = {
92
76
  v: constants_2.RETRY_RECEIPT_VERSION,
93
77
  count: String(input.retryCount),
@@ -111,9 +95,13 @@ function buildRetryReceiptNode(input) {
111
95
  if (input.keys) {
112
96
  content.push(buildRetryKeysNode(input.keys));
113
97
  }
114
- return {
115
- tag: constants_1.WA_MESSAGE_TAGS.RECEIPT,
116
- attrs,
98
+ return (0, global_1.buildReceiptNode)({
99
+ kind: 'retry_custom',
100
+ id: input.stanzaId,
101
+ to: input.to,
102
+ participant: input.participant,
103
+ recipient: input.recipient,
104
+ categoryPeer: input.categoryPeer,
117
105
  content
118
- };
106
+ });
119
107
  }
@@ -18,6 +18,10 @@ function buildUsyncIq(input) {
18
18
  if (input.queryProtocolNodes.length === 0) {
19
19
  throw new Error('usync query must include at least one protocol node');
20
20
  }
21
+ const users = new Array(input.users.length);
22
+ for (let index = 0; index < input.users.length; index += 1) {
23
+ users[index] = buildUsyncUserNode(input.users[index]);
24
+ }
21
25
  return (0, query_1.buildIqNode)('get', input.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN, constants_1.WA_XMLNS.USYNC, [
22
26
  {
23
27
  tag: constants_1.WA_NODE_TAGS.USYNC,
@@ -32,12 +36,12 @@ function buildUsyncIq(input) {
32
36
  {
33
37
  tag: constants_1.WA_NODE_TAGS.QUERY,
34
38
  attrs: {},
35
- content: [...input.queryProtocolNodes]
39
+ content: input.queryProtocolNodes
36
40
  },
37
41
  {
38
42
  tag: constants_1.WA_NODE_TAGS.LIST,
39
43
  attrs: {},
40
- content: input.users.map((user) => buildUsyncUserNode(user))
44
+ content: users
41
45
  }
42
46
  ]
43
47
  }
@@ -13,10 +13,13 @@ exports.hasNodeChild = hasNodeChild;
13
13
  exports.decodeNodeContentUtf8OrBytes = decodeNodeContentUtf8OrBytes;
14
14
  exports.decodeNodeContentBase64OrBytes = decodeNodeContentBase64OrBytes;
15
15
  exports.formatNodeIdPrefixFromSeed = formatNodeIdPrefixFromSeed;
16
+ exports.createNodeIdGenerator = createNodeIdGenerator;
17
+ const _crypto_1 = require("../../crypto/index.js");
16
18
  const bytes_1 = require("../../util/bytes");
17
19
  const EMPTY_NODE_CHILDREN = Object.freeze([]);
18
20
  const EMPTY_NODE_TAGS = Object.freeze([]);
19
21
  const EMPTY_NODE_VALUES = Object.freeze([]);
22
+ const NODE_ID_PREFIX_SEED = new Uint8Array(4);
20
23
  function getNodeChildren(node) {
21
24
  return Array.isArray(node.content) ? node.content : EMPTY_NODE_CHILDREN;
22
25
  }
@@ -69,7 +72,11 @@ function getNodeChildrenTags(node) {
69
72
  const content = node.content;
70
73
  if (!Array.isArray(content) || content.length === 0)
71
74
  return EMPTY_NODE_TAGS;
72
- return content.map((c) => c.tag);
75
+ const tags = new Array(content.length);
76
+ for (let i = 0; i < content.length; i += 1) {
77
+ tags[i] = content[i].tag;
78
+ }
79
+ return tags;
73
80
  }
74
81
  function getNodeChildrenNonEmptyAttrValuesByTag(node, tag, attr) {
75
82
  let values = null;
@@ -152,3 +159,15 @@ function formatNodeIdPrefixFromSeed(seed) {
152
159
  const right = ((seed[2] << 8) | seed[3]) >>> 0;
153
160
  return `${left}.${right}-`;
154
161
  }
162
+ async function createNodeIdGenerator() {
163
+ await (0, _crypto_1.randomFillAsync)(NODE_ID_PREFIX_SEED);
164
+ const prefix = formatNodeIdPrefixFromSeed(NODE_ID_PREFIX_SEED);
165
+ let counter = 0;
166
+ return {
167
+ prefix,
168
+ next() {
169
+ counter += 1;
170
+ return `${prefix}${counter}`;
171
+ }
172
+ };
173
+ }
@@ -1,38 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createUsyncSidGenerator = createUsyncSidGenerator;
4
- const _crypto_1 = require("../../crypto/index.js");
5
4
  const helpers_1 = require("./helpers");
6
5
  function createUsyncSidGenerator() {
7
- const state = {
8
- prefix: null,
9
- prefixPromise: null,
10
- counter: 1
11
- };
12
- return async () => {
13
- const prefix = await getUsyncPrefix(state);
14
- const sid = `${prefix}${state.counter}`;
15
- state.counter += 1;
16
- return sid;
17
- };
18
- }
19
- async function getUsyncPrefix(state) {
20
- if (state.prefix) {
21
- return state.prefix;
22
- }
23
- if (!state.prefixPromise) {
24
- state.prefixPromise = buildUsyncPrefix()
25
- .then((prefix) => {
26
- state.prefix = prefix;
27
- return prefix;
28
- })
29
- .finally(() => {
30
- state.prefixPromise = null;
31
- });
32
- }
33
- return state.prefixPromise;
34
- }
35
- async function buildUsyncPrefix() {
36
- const seed = await (0, _crypto_1.randomBytesAsync)(4);
37
- return (0, helpers_1.formatNodeIdPrefixFromSeed)(seed);
6
+ const generatorPromise = (0, helpers_1.createNodeIdGenerator)();
7
+ return async () => (await generatorPromise).next();
38
8
  }
@@ -4,23 +4,41 @@ exports.formatBinaryNodeAsXml = formatBinaryNodeAsXml;
4
4
  const bytes_1 = require("../../util/bytes");
5
5
  const XML_INDENT = ' ';
6
6
  function escapeXml(value) {
7
- return value
8
- .replace(/&/g, '&amp;')
9
- .replace(/</g, '&lt;')
10
- .replace(/>/g, '&gt;')
11
- .replace(/"/g, '&quot;')
12
- .replace(/'/g, '&apos;');
13
- }
14
- function renderAttrs(attrs) {
15
- const entries = Object.entries(attrs);
16
- if (entries.length === 0) {
17
- return '';
7
+ let out = '';
8
+ let last = 0;
9
+ for (let i = 0; i < value.length; i++) {
10
+ let esc;
11
+ switch (value.charCodeAt(i)) {
12
+ case 38:
13
+ esc = '&amp;';
14
+ break;
15
+ case 60:
16
+ esc = '&lt;';
17
+ break;
18
+ case 62:
19
+ esc = '&gt;';
20
+ break;
21
+ case 34:
22
+ esc = '&quot;';
23
+ break;
24
+ case 39:
25
+ esc = '&apos;';
26
+ break;
27
+ }
28
+ if (esc) {
29
+ out += value.slice(last, i) + esc;
30
+ last = i + 1;
31
+ }
18
32
  }
19
- return entries.map(([key, value]) => ` ${key}='${escapeXml(value)}'`).join('');
33
+ return last === 0 ? value : out + value.slice(last);
20
34
  }
21
35
  function renderNode(node, depth) {
22
36
  const indent = XML_INDENT.repeat(depth);
23
- const attrs = renderAttrs(node.attrs);
37
+ const keys = Object.keys(node.attrs);
38
+ let attrs = '';
39
+ for (let i = 0; i < keys.length; i++) {
40
+ attrs += ` ${keys[i]}='${escapeXml(node.attrs[keys[i]])}'`;
41
+ }
24
42
  const content = node.content;
25
43
  if (content === undefined) {
26
44
  return `${indent}<${node.tag}${attrs}/>`;
@@ -34,7 +52,10 @@ function renderNode(node, depth) {
34
52
  if (content.length === 0) {
35
53
  return `${indent}<${node.tag}${attrs}/>`;
36
54
  }
37
- const children = content.map((child) => renderNode(child, depth + 1)).join('\n');
55
+ let children = renderNode(content[0], depth + 1);
56
+ for (let i = 1; i < content.length; i++) {
57
+ children += '\n' + renderNode(content[i], depth + 1);
58
+ }
38
59
  return `${indent}<${node.tag}${attrs}>\n${children}\n${indent}</${node.tag}>`;
39
60
  }
40
61
  function formatBinaryNodeAsXml(node) {
@@ -5,8 +5,7 @@ exports.buildRegistrationPayload = buildRegistrationPayload;
5
5
  const node_crypto_1 = require("node:crypto");
6
6
  const primitives_1 = require("../../crypto/core/primitives");
7
7
  const _proto_1 = require("../../proto.js");
8
- const constants_1 = require("../../signal/constants");
9
- const constants_2 = require("../noise/constants");
8
+ const constants_1 = require("../noise/constants");
10
9
  const bytes_1 = require("../../util/bytes");
11
10
  function parseVersion(versionBase) {
12
11
  const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
@@ -64,8 +63,8 @@ function resolveDevicePropsPlatformType(deviceBrowser) {
64
63
  return _proto_1.proto.DeviceProps.PlatformType.UNKNOWN;
65
64
  }
66
65
  }
67
- function defaultUserAgent(versionBase, deviceOsDisplayName) {
68
- const { primary, secondary, tertiary } = parseVersion(versionBase);
66
+ function defaultUserAgent(versionBase, deviceOsDisplayName, version) {
67
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
69
68
  const locale = resolveLocale();
70
69
  return {
71
70
  platform: _proto_1.proto.ClientPayload.UserAgent.Platform.WEB,
@@ -86,8 +85,8 @@ function defaultUserAgent(versionBase, deviceOsDisplayName) {
86
85
  localeCountryIso31661Alpha2: locale.lc
87
86
  };
88
87
  }
89
- function defaultDeviceProps(versionBase, config) {
90
- const { primary, secondary, tertiary } = parseVersion(versionBase);
88
+ function defaultDeviceProps(versionBase, config, version) {
89
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
91
90
  return _proto_1.proto.DeviceProps.encode({
92
91
  os: config.deviceOsDisplayName ?? process.platform,
93
92
  version: {
@@ -109,15 +108,15 @@ function defaultDeviceProps(versionBase, config) {
109
108
  }
110
109
  }).finish();
111
110
  }
112
- function buildCommonPayload(config) {
113
- const versionBase = config.versionBase ?? constants_2.DEFAULT_VERSION_BASE;
111
+ function buildCommonPayload(config, version) {
112
+ const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
114
113
  const pull = config.pull ?? true;
115
114
  return {
116
115
  passive: config.passive === true,
117
116
  pull,
118
117
  connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
119
118
  connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
120
- userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName),
119
+ userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
121
120
  webInfo: config.webInfo ??
122
121
  {
123
122
  webSubPlatform: defaultWebSubPlatform()
@@ -145,15 +144,16 @@ function buildRegistrationPayload(config) {
145
144
  if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
146
145
  throw new Error('registration payload requires a valid signedPreKeyId');
147
146
  }
148
- const versionBase = config.versionBase ?? constants_2.DEFAULT_VERSION_BASE;
149
- const common = buildCommonPayload(config);
147
+ const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
148
+ const version = parseVersion(versionBase);
149
+ const common = buildCommonPayload(config, version);
150
150
  const devicePairingData = {
151
151
  buildHash: config.buildHash ? (0, bytes_1.toBytesView)(config.buildHash) : (0, primitives_1.md5Bytes)(versionBase),
152
152
  deviceProps: config.deviceProps
153
153
  ? (0, bytes_1.toBytesView)(config.deviceProps)
154
- : defaultDeviceProps(versionBase, config),
154
+ : defaultDeviceProps(versionBase, config, version),
155
155
  eRegid: (0, bytes_1.intToBytes)(4, registrationId),
156
- eKeytype: (0, bytes_1.intToBytes)(1, constants_1.KEY_TYPE_CURVE25519),
156
+ eKeytype: (0, bytes_1.intToBytes)(1, 5),
157
157
  eIdent: (0, bytes_1.toBytesView)(config.registrationInfo.identityKeyPair.pubKey),
158
158
  eSkeyId: (0, bytes_1.intToBytes)(3, signedPreKeyId),
159
159
  eSkeyVal: (0, bytes_1.toBytesView)(config.signedPreKey.keyPair.pubKey),
@@ -9,7 +9,7 @@ const bytes_1 = require("../../util/bytes");
9
9
  const primitives_1 = require("../../util/primitives");
10
10
  async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
11
11
  const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
12
- if (!(0, bytes_1.assertByteLength)(signatureInput, 64, 'invalid certificate signature size', false)) {
12
+ if (signatureInput.length !== 64) {
13
13
  return false;
14
14
  }
15
15
  const signature = new Uint8Array(signatureInput);
@@ -20,7 +20,7 @@ async function verifySignalVariant(serializedPublicKey, message, signatureInput)
20
20
  const signBit = lastByte & 0x80;
21
21
  signature[63] = lastByte & 0x7f;
22
22
  const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
23
- return (0, _crypto_1.ed25519VerifyRaw)(edwardsPublicKey, signature, message);
23
+ return _crypto_1.Ed25519.verify(message, signature, edwardsPublicKey);
24
24
  }
25
25
  function parseNoiseCertificate(certificate) {
26
26
  if (!certificate) {
@@ -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,6 +50,8 @@ function buildRoutingInfoPrefix(routingInfo) {
51
50
  }
52
51
  class WaNoiseSession {
53
52
  constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
53
+ this.writeChain = Promise.resolve();
54
+ this.readChain = Promise.resolve();
54
55
  this.frameCodec = null;
55
56
  this.handshakeInbox = [];
56
57
  this.handshakeInboxHead = 0;
@@ -63,8 +64,6 @@ class WaNoiseSession {
63
64
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
64
65
  this.sendWire = sendWire;
65
66
  this.logger = logger;
66
- this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
67
- this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
68
67
  }
69
68
  async start(config) {
70
69
  this.reset();
@@ -96,12 +95,24 @@ class WaNoiseSession {
96
95
  await this.decodeBufferedPostHandshakeFrames();
97
96
  this.logger.info('noise session established via full handshake');
98
97
  }
99
- async encryptFrame(frame) {
100
- if (!this.noiseSocket || !this.frameCodec) {
101
- 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'));
103
+ }
104
+ let encryptPromise;
105
+ try {
106
+ encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
102
107
  }
103
- const encrypted = await this.writeQueue.enqueue(() => this.noiseSocket.encrypt(frame));
104
- return this.frameCodec.encodeFrame(encrypted);
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;
105
116
  }
106
117
  async pushWireChunk(chunk) {
107
118
  const codec = this.frameCodec;
@@ -110,7 +121,9 @@ class WaNoiseSession {
110
121
  }
111
122
  const out = [];
112
123
  if (this.pendingDecryptedFrames.length > 0) {
113
- out.push(...this.pendingDecryptedFrames);
124
+ for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
125
+ out.push(this.pendingDecryptedFrames[i]);
126
+ }
114
127
  this.pendingDecryptedFrames = [];
115
128
  }
116
129
  const frames = codec.pushWireChunk(chunk);
@@ -128,9 +141,15 @@ class WaNoiseSession {
128
141
  }
129
142
  return out;
130
143
  }
131
- for (const frame of frames) {
132
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
133
- 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
+ }
134
153
  }
135
154
  return out;
136
155
  }
@@ -145,6 +164,16 @@ class WaNoiseSession {
145
164
  rejecter(closeError);
146
165
  }
147
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
+ }
148
177
  reset() {
149
178
  this.logger.trace('noise session reset');
150
179
  this.frameCodec = null;
@@ -155,11 +184,10 @@ class WaNoiseSession {
155
184
  this.closedError = null;
156
185
  this.noiseSocket = null;
157
186
  this.serverStaticKey = null;
187
+ this.writeChain = Promise.resolve();
188
+ this.readChain = Promise.resolve();
158
189
  }
159
190
  getServerStaticKey() {
160
- if (!this.serverStaticKey) {
161
- return null;
162
- }
163
191
  return this.serverStaticKey;
164
192
  }
165
193
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
@@ -189,10 +217,12 @@ class WaNoiseSession {
189
217
  await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
190
218
  await handshake.authenticate(serverStaticKey);
191
219
  await handshake.authenticate(ephemeralKeyPair.pubKey);
192
- 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
+ ]);
193
224
  await handshake.mixIntoKey(agreement1);
194
225
  const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
195
- const agreement2 = await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
196
226
  await handshake.mixIntoKey(agreement2);
197
227
  const encryptedPayload = await handshake.encrypt(payload);
198
228
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
@@ -219,8 +249,12 @@ class WaNoiseSession {
219
249
  }
220
250
  const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
221
251
  await handshake.authenticate(serverEphemeral);
222
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
223
- 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);
224
258
  await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
225
259
  this.serverStaticKey = serverStaticKey;
226
260
  this.logger.info('noise resume handshake successful without fallback');
@@ -322,10 +356,17 @@ class WaNoiseSession {
322
356
  this.logger.debug('decoding buffered post-handshake frames', {
323
357
  count: this.handshakeInbox.length - this.handshakeInboxHead
324
358
  });
325
- for (let index = this.handshakeInboxHead; index < this.handshakeInbox.length; index += 1) {
326
- const frame = this.handshakeInbox[index];
327
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
328
- 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
+ }
329
370
  }
330
371
  this.handshakeInbox.length = this.handshakeInboxHead = 0;
331
372
  }
@@ -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
  }
@@ -7,6 +7,7 @@ const constants_1 = require("../../protocol/constants");
7
7
  const helpers_1 = require("../node/helpers");
8
8
  const bytes_1 = require("../../util/bytes");
9
9
  const primitives_1 = require("../../util/primitives");
10
+ const DIGITS_ONLY_RE = /^\d+$/;
10
11
  function parseStreamControlNode(node) {
11
12
  if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
12
13
  return { kind: 'xmlstreamend' };
@@ -20,9 +21,12 @@ function parseStreamControlNode(node) {
20
21
  ? { kind: 'stream_error_replaced' }
21
22
  : { kind: 'stream_error_device_removed' };
22
23
  }
23
- const code = node.attrs.code ? (0, primitives_1.parseStrictUnsignedInt)(node.attrs.code) : undefined;
24
- if (code !== undefined) {
25
- return { kind: 'stream_error_code', code };
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 };
29
+ }
26
30
  }
27
31
  const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
28
32
  if (ackNode) {
@@ -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';
@@ -2,8 +2,6 @@ import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
2
2
  import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
3
3
  import type { Proto } from '..';
4
4
  export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
5
- export declare function keyDeviceId(keyId: Uint8Array): number | null;
6
5
  export declare function keyEpoch(keyId: Uint8Array): number;
7
6
  export declare function pickActiveSyncKey(keys: Iterable<WaAppStateSyncKey>): WaAppStateSyncKey | null;
8
- export declare function toNetworkOrder64(value: number): Uint8Array;
9
7
  export declare function downloadExternalBlobReference(mediaTransfer: WaMediaTransferClient, reference: Proto.IExternalBlobReference): Promise<Uint8Array>;
@@ -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,4 +1,2 @@
1
1
  export * from './types';
2
2
  export { WaAuthClient } from './WaAuthClient';
3
- export { completeCompanionFinish, createCompanionHello } from './pairing/WaPairingCodeCrypto';
4
- export { WaAuthSqliteStore } from '../store/providers/sqlite/auth.store';
@@ -32,6 +32,7 @@ export interface WaAuthClientOptions {
32
32
  readonly devicePlatform?: string;
33
33
  readonly deviceOsDisplayName?: string;
34
34
  readonly requireFullSync?: boolean;
35
+ readonly version?: string;
35
36
  }
36
37
  export interface WaSuccessPersistAttributes {
37
38
  readonly meLid?: string;