zapo-js 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,24 +1,12 @@
1
- import { ed25519VerifyRaw, toSerializedPubKey } from '../../crypto/index.js';
2
- import { montgomeryToEdwardsPublic } from '../../crypto/curves/X25519.js';
1
+ import { xeddsaVerify } from '../../crypto/index.js';
3
2
  import { proto } from '../../proto.js';
4
3
  import { ROOT_CA_PUBLIC_KEY_HEX, ROOT_CA_SERIAL } from '../noise/constants.js';
5
4
  import { assertByteLength, decodeProtoBytes, hexToBytes, uint8Equal } from '../../util/bytes.js';
6
5
  import { toSafeNumber } from '../../util/primitives.js';
7
- async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
8
- const publicKey = toSerializedPubKey(serializedPublicKey);
9
- if (!assertByteLength(signatureInput, 64, 'invalid certificate signature size', false)) {
10
- return false;
11
- }
12
- const signature = new Uint8Array(signatureInput);
13
- const lastByte = signature[63];
14
- if ((lastByte & 0x60) !== 0) {
15
- return false;
16
- }
17
- const signBit = lastByte & 0x80;
18
- signature[63] = lastByte & 0x7f;
19
- const edwardsPublicKey = montgomeryToEdwardsPublic(publicKey.subarray(1), signBit);
20
- return ed25519VerifyRaw(edwardsPublicKey, signature, message);
21
- }
6
+ const PRODUCTION_ROOT_CA = {
7
+ publicKey: hexToBytes(ROOT_CA_PUBLIC_KEY_HEX),
8
+ serial: ROOT_CA_SERIAL
9
+ };
22
10
  function parseNoiseCertificate(certificate) {
23
11
  if (!certificate) {
24
12
  throw new Error('missing noise certificate');
@@ -38,21 +26,16 @@ function parseNoiseCertificate(certificate) {
38
26
  signature: signatureBytes
39
27
  };
40
28
  }
41
- function rootPublicKeySerialized() {
42
- const raw = hexToBytes(ROOT_CA_PUBLIC_KEY_HEX);
43
- return toSerializedPubKey(raw);
44
- }
45
- export async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
29
+ export async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
46
30
  const chain = proto.CertChain.decode(certificateChain);
47
31
  if (!chain.leaf || !chain.intermediate) {
48
32
  throw new Error('noise certificate chain is missing leaf/intermediate');
49
33
  }
50
34
  const intermediate = parseNoiseCertificate(chain.intermediate);
51
- if (intermediate.issuerSerial !== ROOT_CA_SERIAL) {
35
+ if (intermediate.issuerSerial !== rootCa.serial) {
52
36
  throw new Error('intermediate certificate issuer mismatch');
53
37
  }
54
- const rootKey = rootPublicKeySerialized();
55
- const validIntermediate = await verifySignalVariant(rootKey, intermediate.details, intermediate.signature);
38
+ const validIntermediate = await xeddsaVerify(rootCa.publicKey, intermediate.details, intermediate.signature);
56
39
  if (!validIntermediate) {
57
40
  throw new Error('intermediate certificate signature is invalid');
58
41
  }
@@ -60,8 +43,7 @@ export async function verifyNoiseCertificateChain(certificateChain, serverStatic
60
43
  if (leaf.issuerSerial !== intermediate.serial) {
61
44
  throw new Error('leaf certificate issuer mismatch');
62
45
  }
63
- const intermediatePublicSerialized = toSerializedPubKey(intermediate.key);
64
- const validLeaf = await verifySignalVariant(intermediatePublicSerialized, leaf.details, leaf.signature);
46
+ const validLeaf = await xeddsaVerify(intermediate.key, leaf.details, leaf.signature);
65
47
  if (!validLeaf) {
66
48
  throw new Error('leaf certificate signature is invalid');
67
49
  }
@@ -1,6 +1,5 @@
1
1
  import { X25519 } from '../../crypto/index.js';
2
2
  import { ConsoleLogger } from '../../infra/log/ConsoleLogger.js';
3
- import { BoundedTaskQueue } from '../../infra/perf/BoundedTaskQueue.js';
4
3
  import { proto } from '../../proto.js';
5
4
  import { WA_DEFAULTS } from '../../protocol/constants.js';
6
5
  import { NOISE_IK_NAME, NOISE_XX_FALLBACK_NAME, NOISE_XX_NAME, WA_PROTO_HEADER } from '../noise/constants.js';
@@ -8,13 +7,13 @@ import { buildLoginPayload, buildRegistrationPayload } from '../noise/WaClientPa
8
7
  import { WaFrameCodec } from '../noise/WaFrameCodec.js';
9
8
  import { verifyNoiseCertificateChain } from '../noise/WaNoiseCert.js';
10
9
  import { WaNoiseHandshake } from '../noise/WaNoiseHandshake.js';
11
- import { concatBytes, toBytesView } from '../../util/bytes.js';
10
+ import { concatBytes } from '../../util/bytes.js';
12
11
  import { toError } from '../../util/primitives.js';
13
12
  function resolvePayload(payload) {
14
13
  if (payload instanceof Uint8Array) {
15
14
  return Promise.resolve(payload);
16
15
  }
17
- return Promise.resolve(payload()).then((value) => toBytesView(value));
16
+ return Promise.resolve(payload());
18
17
  }
19
18
  async function resolveHandshakePayload(config) {
20
19
  if (config.isRegistered) {
@@ -48,6 +47,8 @@ function buildRoutingInfoPrefix(routingInfo) {
48
47
  }
49
48
  export class WaNoiseSession {
50
49
  constructor(sendWire, logger = new ConsoleLogger('info')) {
50
+ this.writeChain = Promise.resolve();
51
+ this.readChain = Promise.resolve();
51
52
  this.frameCodec = null;
52
53
  this.handshakeInbox = [];
53
54
  this.handshakeInboxHead = 0;
@@ -57,11 +58,10 @@ export class WaNoiseSession {
57
58
  this.closedError = null;
58
59
  this.noiseSocket = null;
59
60
  this.serverStaticKey = null;
61
+ this.trustedRootCa = undefined;
60
62
  this.handshakeFrameTimeoutMs = WA_DEFAULTS.CONNECT_TIMEOUT_MS;
61
63
  this.sendWire = sendWire;
62
64
  this.logger = logger;
63
- this.writeQueue = new BoundedTaskQueue(4096, 1);
64
- this.readQueue = new BoundedTaskQueue(4096, 1);
65
65
  }
66
66
  async start(config) {
67
67
  this.reset();
@@ -69,9 +69,7 @@ export class WaNoiseSession {
69
69
  isRegistered: config.isRegistered,
70
70
  hasServerStaticKey: !!config.serverStaticKey
71
71
  });
72
- const protocolHeader = config.protocolHeader
73
- ? toBytesView(config.protocolHeader)
74
- : WA_PROTO_HEADER;
72
+ const protocolHeader = config.protocolHeader ?? WA_PROTO_HEADER;
75
73
  const introFrame = config.routingInfo && config.routingInfo.length > 0
76
74
  ? concatBytes([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
77
75
  : protocolHeader;
@@ -81,6 +79,7 @@ export class WaNoiseSession {
81
79
  resolveHandshakePayload(config)
82
80
  ]);
83
81
  const verifyCertificates = config.verifyCertificateChain !== false;
82
+ this.trustedRootCa = config.trustedRootCa;
84
83
  if (config.serverStaticKey && config.serverStaticKey.length === 32) {
85
84
  this.logger.info('noise session attempting resume handshake (IK)');
86
85
  this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
@@ -93,12 +92,24 @@ export class WaNoiseSession {
93
92
  await this.decodeBufferedPostHandshakeFrames();
94
93
  this.logger.info('noise session established via full handshake');
95
94
  }
96
- async encryptFrame(frame) {
97
- if (!this.noiseSocket || !this.frameCodec) {
98
- throw new Error('noise session is not established');
95
+ encryptFrame(frame) {
96
+ const socket = this.noiseSocket;
97
+ const codec = this.frameCodec;
98
+ if (!socket || !codec) {
99
+ return Promise.reject(new Error('noise session is not established'));
100
+ }
101
+ let encryptPromise;
102
+ try {
103
+ encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
99
104
  }
100
- const encrypted = await this.writeQueue.enqueue(() => this.noiseSocket.encrypt(frame));
101
- return this.frameCodec.encodeFrame(encrypted);
105
+ catch (error) {
106
+ return Promise.reject(error);
107
+ }
108
+ const result = this.writeChain
109
+ .then(() => encryptPromise)
110
+ .then((encrypted) => codec.encodeFrame(encrypted));
111
+ this.writeChain = result.then(() => { }, () => { });
112
+ return result;
102
113
  }
103
114
  async pushWireChunk(chunk) {
104
115
  const codec = this.frameCodec;
@@ -107,7 +118,9 @@ export class WaNoiseSession {
107
118
  }
108
119
  const out = [];
109
120
  if (this.pendingDecryptedFrames.length > 0) {
110
- out.push(...this.pendingDecryptedFrames);
121
+ for (let i = 0; i < this.pendingDecryptedFrames.length; i += 1) {
122
+ out.push(this.pendingDecryptedFrames[i]);
123
+ }
111
124
  this.pendingDecryptedFrames = [];
112
125
  }
113
126
  const frames = codec.pushWireChunk(chunk);
@@ -125,9 +138,15 @@ export class WaNoiseSession {
125
138
  }
126
139
  return out;
127
140
  }
128
- for (const frame of frames) {
129
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
130
- out.push(decrypted);
141
+ if (frames.length > 0) {
142
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
143
+ this.readChain = this.readChain
144
+ .then(() => decryptBatch)
145
+ .then(() => { }, () => { });
146
+ const decrypted = await decryptBatch;
147
+ for (let i = 0; i < decrypted.length; i++) {
148
+ out.push(decrypted[i]);
149
+ }
131
150
  }
132
151
  return out;
133
152
  }
@@ -142,6 +161,16 @@ export class WaNoiseSession {
142
161
  rejecter(closeError);
143
162
  }
144
163
  }
164
+ async decryptFramesBatch(socket, frames) {
165
+ if (frames.length === 1) {
166
+ return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
167
+ }
168
+ const pending = new Array(frames.length);
169
+ for (let i = 0; i < frames.length; i++) {
170
+ pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
171
+ }
172
+ return Promise.all(pending);
173
+ }
145
174
  reset() {
146
175
  this.logger.trace('noise session reset');
147
176
  this.frameCodec = null;
@@ -152,11 +181,11 @@ export class WaNoiseSession {
152
181
  this.closedError = null;
153
182
  this.noiseSocket = null;
154
183
  this.serverStaticKey = null;
184
+ this.trustedRootCa = undefined;
185
+ this.writeChain = Promise.resolve();
186
+ this.readChain = Promise.resolve();
155
187
  }
156
188
  getServerStaticKey() {
157
- if (!this.serverStaticKey) {
158
- return null;
159
- }
160
189
  return this.serverStaticKey;
161
190
  }
162
191
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
@@ -186,10 +215,12 @@ export class WaNoiseSession {
186
215
  await handshake.start(NOISE_IK_NAME, protocolHeader);
187
216
  await handshake.authenticate(serverStaticKey);
188
217
  await handshake.authenticate(ephemeralKeyPair.pubKey);
189
- const agreement1 = await X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey);
218
+ const [agreement1, agreement2] = await Promise.all([
219
+ X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
220
+ X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
221
+ ]);
190
222
  await handshake.mixIntoKey(agreement1);
191
223
  const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
192
- const agreement2 = await X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey);
193
224
  await handshake.mixIntoKey(agreement2);
194
225
  const encryptedPayload = await handshake.encrypt(payload);
195
226
  const clientHello = proto.HandshakeMessage.encode({
@@ -214,11 +245,15 @@ export class WaNoiseSession {
214
245
  if (!serverHello.payload) {
215
246
  throw new Error('noise resume handshake missing certificate payload');
216
247
  }
217
- const serverEphemeral = toBytesView(serverHello.ephemeral);
248
+ const serverEphemeral = serverHello.ephemeral;
218
249
  await handshake.authenticate(serverEphemeral);
219
- await handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
220
- await handshake.mixIntoKey(await X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
221
- await handshake.decrypt(toBytesView(serverHello.payload));
250
+ const [dh1, dh2] = await Promise.all([
251
+ X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
252
+ X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
253
+ ]);
254
+ await handshake.mixIntoKey(dh1);
255
+ await handshake.mixIntoKey(dh2);
256
+ await handshake.decrypt(serverHello.payload);
222
257
  this.serverStaticKey = serverStaticKey;
223
258
  this.logger.info('noise resume handshake successful without fallback');
224
259
  return { socket: await handshake.finish(), serverHelloFrame: null };
@@ -236,14 +271,14 @@ export class WaNoiseSession {
236
271
  if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
237
272
  throw new Error('noise full handshake missing server hello fields');
238
273
  }
239
- const serverEphemeral = toBytesView(serverHello.ephemeral);
274
+ const serverEphemeral = serverHello.ephemeral;
240
275
  await handshake.authenticate(serverEphemeral);
241
276
  await handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
242
- const serverStatic = await handshake.decrypt(toBytesView(serverHello.static));
277
+ const serverStatic = await handshake.decrypt(serverHello.static);
243
278
  await handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
244
- const certificate = await handshake.decrypt(toBytesView(serverHello.payload));
279
+ const certificate = await handshake.decrypt(serverHello.payload);
245
280
  if (verifyCertificates) {
246
- await verifyNoiseCertificateChain(certificate, serverStatic);
281
+ await verifyNoiseCertificateChain(certificate, serverStatic, this.trustedRootCa);
247
282
  this.logger.trace('noise certificate chain verified');
248
283
  }
249
284
  this.serverStaticKey = serverStatic;
@@ -319,10 +354,17 @@ export class WaNoiseSession {
319
354
  this.logger.debug('decoding buffered post-handshake frames', {
320
355
  count: this.handshakeInbox.length - this.handshakeInboxHead
321
356
  });
322
- for (let index = this.handshakeInboxHead; index < this.handshakeInbox.length; index += 1) {
323
- const frame = this.handshakeInbox[index];
324
- const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
325
- this.pendingDecryptedFrames.push(decrypted);
357
+ const start = this.handshakeInboxHead;
358
+ const frames = this.handshakeInbox.slice(start);
359
+ if (frames.length > 0) {
360
+ const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
361
+ this.readChain = this.readChain
362
+ .then(() => decryptBatch)
363
+ .then(() => { }, () => { });
364
+ const decrypted = await decryptBatch;
365
+ for (let i = 0; i < decrypted.length; i++) {
366
+ this.pendingDecryptedFrames.push(decrypted[i]);
367
+ }
326
368
  }
327
369
  this.handshakeInbox.length = this.handshakeInboxHead = 0;
328
370
  }
@@ -6,12 +6,16 @@ export class WaNoiseSocket {
6
6
  this.writeCounter = 0;
7
7
  this.readCounter = 0;
8
8
  }
9
- async encrypt(frame, additionalData) {
10
- const nonce = buildNonce(this.writeCounter++);
9
+ reserveWriteNonce() {
10
+ return buildNonce(this.writeCounter++);
11
+ }
12
+ encrypt(nonce, frame, additionalData) {
11
13
  return aesGcmEncrypt(this.encryptKey, nonce, frame, additionalData);
12
14
  }
13
- async decrypt(frame, additionalData) {
14
- const nonce = buildNonce(this.readCounter++);
15
+ reserveReadNonce() {
16
+ return buildNonce(this.readCounter++);
17
+ }
18
+ decrypt(nonce, frame, additionalData) {
15
19
  return aesGcmDecrypt(this.decryptKey, nonce, frame, additionalData);
16
20
  }
17
21
  }
@@ -1,7 +1,8 @@
1
1
  import { WA_STREAM_SIGNALING } from '../../protocol/constants.js';
2
2
  import { findNodeChild, hasNodeChild } from '../node/helpers.js';
3
3
  import { base64ToBytesChecked } from '../../util/bytes.js';
4
- import { parseOptionalInt, parseStrictUnsignedInt } from '../../util/primitives.js';
4
+ import { parseOptionalInt } from '../../util/primitives.js';
5
+ const DIGITS_ONLY_RE = /^\d+$/;
5
6
  export function parseStreamControlNode(node) {
6
7
  if (node.tag === WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
7
8
  return { kind: 'xmlstreamend' };
@@ -15,9 +16,12 @@ export function parseStreamControlNode(node) {
15
16
  ? { kind: 'stream_error_replaced' }
16
17
  : { kind: 'stream_error_device_removed' };
17
18
  }
18
- const code = node.attrs.code ? parseStrictUnsignedInt(node.attrs.code) : undefined;
19
- if (code !== undefined) {
20
- return { kind: 'stream_error_code', code };
19
+ const codeStr = node.attrs.code;
20
+ if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
21
+ const code = Number(codeStr);
22
+ if (Number.isSafeInteger(code)) {
23
+ return { kind: 'stream_error_code', code };
24
+ }
21
25
  }
22
26
  const ackNode = findNodeChild(node, WA_STREAM_SIGNALING.ACK_TAG);
23
27
  if (ackNode) {
@@ -120,14 +120,10 @@ export function decodeBase64Url(value, field) {
120
120
  .padEnd(Math.ceil(value.length / 4) * 4, '=');
121
121
  return base64ToBytesChecked(padded, field);
122
122
  }
123
- export function assertByteLength(value, expectedLength, errorMessage, throwOnMismatch = true) {
123
+ export function assertByteLength(value, expectedLength, errorMessage) {
124
124
  if (value.length !== expectedLength) {
125
- if (!throwOnMismatch) {
126
- return false;
127
- }
128
125
  throw new Error(errorMessage);
129
126
  }
130
- return true;
131
127
  }
132
128
  export function decodeProtoBytes(value, field) {
133
129
  if (value === null || value === undefined) {
@@ -194,12 +190,15 @@ function encodeBase64(value, alphabet, pad) {
194
190
  return out.join('');
195
191
  }
196
192
  export function concatBytes(parts) {
197
- const total = parts.reduce((sum, current) => sum + current.length, 0);
193
+ let total = 0;
194
+ for (let i = 0; i < parts.length; i += 1) {
195
+ total += parts[i].length;
196
+ }
198
197
  const out = new Uint8Array(total);
199
198
  let offset = 0;
200
- for (const part of parts) {
201
- out.set(part, offset);
202
- offset += part.length;
199
+ for (let i = 0; i < parts.length; i += 1) {
200
+ out.set(parts[i], offset);
201
+ offset += parts[i].length;
203
202
  }
204
203
  return out;
205
204
  }
@@ -240,10 +239,21 @@ export function uint8Equal(a, b) {
240
239
  return diff === 0;
241
240
  }
242
241
  export function removeAt(items, index) {
243
- const out = [];
242
+ if (items.length === 0) {
243
+ return [];
244
+ }
245
+ if (index < 0 || index >= items.length) {
246
+ const out = new Array(items.length);
247
+ for (let i = 0; i < items.length; i += 1) {
248
+ out[i] = items[i];
249
+ }
250
+ return out;
251
+ }
252
+ const out = new Array(items.length - 1);
253
+ let k = 0;
244
254
  for (let i = 0; i < items.length; i += 1) {
245
255
  if (i !== index) {
246
- out.push(items[i]);
256
+ out[k++] = items[i];
247
257
  }
248
258
  }
249
259
  return out;
@@ -283,11 +293,5 @@ export async function readAllBytes(stream, options = {}) {
283
293
  if (chunks.length === 1) {
284
294
  return chunks[0];
285
295
  }
286
- const merged = new Uint8Array(total);
287
- let offset = 0;
288
- for (const chunk of chunks) {
289
- merged.set(chunk, offset);
290
- offset += chunk.byteLength;
291
- }
292
- return merged;
296
+ return concatBytes(chunks);
293
297
  }
@@ -0,0 +1,5 @@
1
+ export { bytesToHex, hexToBytes, toBytesView, uint8Equal } from './bytes.js';
2
+ export { asBytes, asNumber, asOptionalBytes, asOptionalNumber, asOptionalString, asString, resolvePositive, toBoolOrUndef } from './coercion.js';
3
+ export { normalizeQueryLimit } from './collections.js';
4
+ export { toSafeNumber } from './primitives.js';
5
+ export { isBunRuntime } from './runtime.js';
@@ -1,3 +1,4 @@
1
+ const DIGITS_ONLY_RE = /^\d+$/;
1
2
  export function toError(value) {
2
3
  if (value instanceof Error)
3
4
  return value;
@@ -42,8 +43,8 @@ export function normalizeNonNegativeInteger(value, fallback) {
42
43
  return fallback;
43
44
  return Math.max(0, Math.trunc(value));
44
45
  }
45
- export function parseStrictUnsignedInt(value) {
46
- if (!/^\d+$/.test(value))
46
+ function parseStrictUnsignedInt(value) {
47
+ if (!DIGITS_ONLY_RE.test(value))
47
48
  return undefined;
48
49
  const parsed = Number(value);
49
50
  if (!Number.isSafeInteger(parsed))
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.proto = exports.WA_XMLNS = exports.WA_SUPPORTED_DIRTY_TYPES = exports.WA_STREAM_SIGNALING = exports.WA_SIGNALING = exports.WA_RETRYABLE_ACK_CODES = exports.WA_READY_STATES = exports.WA_PREVIEW_MEDIA_HKDF_INFO = exports.WA_PAIRING_KDF_INFO = exports.WA_NODE_TAGS = exports.WA_MEDIA_HKDF_INFO = exports.WA_MESSAGE_TYPES = exports.WA_MESSAGE_TAGS = exports.WA_LOGOUT_REASONS = exports.WA_IQ_TYPES = exports.WA_DISCONNECT_REASONS = exports.WA_DIRTY_TYPES = exports.WA_DIRTY_PROTOCOLS = exports.WA_DEFAULTS = exports.WA_COMPANION_PLATFORM_IDS = exports.WA_BROWSERS = exports.WA_APP_STATE_SYNC_DATA_TYPE = exports.WA_APP_STATE_KEY_TYPES = exports.WA_APP_STATE_KDF_INFO = exports.WA_APP_STATE_ERROR_CODES = exports.WA_APP_STATE_COLLECTION_STATES = exports.WA_APP_STATE_COLLECTIONS = exports.WA_ACCOUNT_SYNC_PROTOCOLS = exports.toUserJid = exports.splitJid = exports.parseSignalAddressFromJid = exports.parsePhoneJid = exports.normalizeRecipientJid = exports.normalizeDeviceJid = exports.isGroupJid = exports.getWaMediaHkdfInfo = exports.getWaCompanionPlatformId = exports.getLoginIdentity = exports.createStore = exports.createPinoLogger = exports.PinoLogger = exports.ConsoleLogger = exports.WaClient = void 0;
3
+ exports.proto = exports.WA_XMLNS = exports.WA_PRIVACY_VALUES = exports.WA_PRIVACY_TAGS = exports.WA_PRIVACY_SETTING_TO_CATEGORY = exports.WA_PRIVACY_DISALLOWED_LIST_CATEGORIES = exports.WA_PRIVACY_CATEGORY_TO_SETTING = exports.WA_PRIVACY_CATEGORIES = exports.WA_SUPPORTED_DIRTY_TYPES = exports.WA_STREAM_SIGNALING = exports.WA_SIGNALING = exports.WA_RETRYABLE_ACK_CODES = exports.WA_READY_STATES = exports.WA_PREVIEW_MEDIA_HKDF_INFO = exports.WA_PAIRING_KDF_INFO = exports.WA_NODE_TAGS = exports.WA_MEDIA_HKDF_INFO = exports.WA_MESSAGE_TYPES = exports.WA_MESSAGE_TAGS = exports.WA_LOGOUT_REASONS = exports.WA_IQ_TYPES = exports.WA_DISCONNECT_REASONS = exports.WA_DIRTY_TYPES = exports.WA_DIRTY_PROTOCOLS = exports.WA_DEFAULTS = exports.WA_COMPANION_PLATFORM_IDS = exports.WA_BROWSERS = exports.WA_APP_STATE_SYNC_DATA_TYPE = exports.WA_APP_STATE_KEY_TYPES = exports.WA_APP_STATE_KDF_INFO = exports.WA_APP_STATE_ERROR_CODES = exports.WA_APP_STATE_COLLECTION_STATES = exports.WA_APP_STATE_COLLECTIONS = exports.WA_ACCOUNT_SYNC_PROTOCOLS = exports.toUserJid = exports.splitJid = exports.parseSignalAddressFromJid = exports.parsePhoneJid = exports.normalizeRecipientJid = exports.normalizeDeviceJid = exports.isGroupJid = exports.getWaMediaHkdfInfo = exports.getWaCompanionPlatformId = exports.getLoginIdentity = exports.createStore = exports.createPinoLogger = exports.PinoLogger = exports.ConsoleLogger = exports.WaClient = void 0;
4
4
  var _client_1 = require("./client/index.js");
5
5
  Object.defineProperty(exports, "WaClient", { enumerable: true, get: function () { return _client_1.WaClient; } });
6
6
  var ConsoleLogger_1 = require("./infra/log/ConsoleLogger");
@@ -47,6 +47,12 @@ Object.defineProperty(exports, "WA_RETRYABLE_ACK_CODES", { enumerable: true, get
47
47
  Object.defineProperty(exports, "WA_SIGNALING", { enumerable: true, get: function () { return _protocol_1.WA_SIGNALING; } });
48
48
  Object.defineProperty(exports, "WA_STREAM_SIGNALING", { enumerable: true, get: function () { return _protocol_1.WA_STREAM_SIGNALING; } });
49
49
  Object.defineProperty(exports, "WA_SUPPORTED_DIRTY_TYPES", { enumerable: true, get: function () { return _protocol_1.WA_SUPPORTED_DIRTY_TYPES; } });
50
+ Object.defineProperty(exports, "WA_PRIVACY_CATEGORIES", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_CATEGORIES; } });
51
+ Object.defineProperty(exports, "WA_PRIVACY_CATEGORY_TO_SETTING", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_CATEGORY_TO_SETTING; } });
52
+ Object.defineProperty(exports, "WA_PRIVACY_DISALLOWED_LIST_CATEGORIES", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_DISALLOWED_LIST_CATEGORIES; } });
53
+ Object.defineProperty(exports, "WA_PRIVACY_SETTING_TO_CATEGORY", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_SETTING_TO_CATEGORY; } });
54
+ Object.defineProperty(exports, "WA_PRIVACY_TAGS", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_TAGS; } });
55
+ Object.defineProperty(exports, "WA_PRIVACY_VALUES", { enumerable: true, get: function () { return _protocol_1.WA_PRIVACY_VALUES; } });
50
56
  Object.defineProperty(exports, "WA_XMLNS", { enumerable: true, get: function () { return _protocol_1.WA_XMLNS; } });
51
57
  var _proto_1 = require("./proto.js");
52
58
  Object.defineProperty(exports, "proto", { enumerable: true, get: function () { return _proto_1.proto; } });