zapo-js 0.3.0 → 1.0.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 (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -5,8 +5,8 @@ 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("../noise/constants");
9
8
  const bytes_1 = require("../../util/bytes");
9
+ const _version_spec_1 = require("../../version-spec.js");
10
10
  function parseVersion(versionBase) {
11
11
  const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
12
12
  const primary = Number.parseInt(p, 10);
@@ -111,12 +111,13 @@ function defaultDeviceProps(versionBase, config, version) {
111
111
  supportHostedGroupMsg: true,
112
112
  supportBizHostedMsg: true,
113
113
  supportFbidBotChatHistory: true,
114
- supportMessageAssociation: true
114
+ supportMessageAssociation: true,
115
+ supportInlineContacts: true
115
116
  }
116
117
  }).finish();
117
118
  }
118
119
  function buildCommonPayload(config, version) {
119
- const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
120
+ const versionBase = config.versionBase ?? _version_spec_1.WA_VERSION;
120
121
  const pull = config.pull ?? true;
121
122
  return {
122
123
  passive: config.passive === true,
@@ -124,10 +125,9 @@ function buildCommonPayload(config, version) {
124
125
  connectType: _proto_1.proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
125
126
  connectReason: _proto_1.proto.ClientPayload.ConnectReason.USER_ACTIVATED,
126
127
  userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
127
- webInfo: config.webInfo ??
128
- {
129
- webSubPlatform: defaultWebSubPlatform()
130
- }
128
+ webInfo: config.webInfo ?? {
129
+ webSubPlatform: defaultWebSubPlatform()
130
+ }
131
131
  };
132
132
  }
133
133
  function buildLoginPayload(config) {
@@ -151,7 +151,7 @@ function buildRegistrationPayload(config) {
151
151
  if (!Number.isSafeInteger(signedPreKeyId) || signedPreKeyId <= 0) {
152
152
  throw new Error('registration payload requires a valid signedPreKeyId');
153
153
  }
154
- const versionBase = config.versionBase ?? constants_1.DEFAULT_VERSION_BASE;
154
+ const versionBase = config.versionBase ?? _version_spec_1.WA_VERSION;
155
155
  const version = parseVersion(versionBase);
156
156
  const common = buildCommonPayload(config, version);
157
157
  const devicePairingData = {
@@ -16,6 +16,11 @@ function parseAppVersion(version) {
16
16
  quaternary: at(3)
17
17
  };
18
18
  }
19
+ /**
20
+ * Builds the encoded {@link Proto.ClientPayload} bytes the WhatsApp Mobile
21
+ * transport sends after the noise login handshake. Throws when
22
+ * `username`/`appVersion` are missing/invalid.
23
+ */
19
24
  function buildMobileLoginPayload(config) {
20
25
  if (!Number.isSafeInteger(config.username) || config.username <= 0) {
21
26
  throw new Error('mobile login payload requires a valid numeric username');
@@ -29,6 +29,11 @@ function parseNoiseCertificate(certificate) {
29
29
  signature: signatureBytes
30
30
  };
31
31
  }
32
+ /**
33
+ * Validates a WhatsApp noise certificate chain against `rootCa` (defaults to
34
+ * the production root) and confirms the leaf binds `serverStatic`. Throws on
35
+ * any structural mismatch, bad signature, or unexpected issuer serial.
36
+ */
32
37
  async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
33
38
  const chain = _proto_1.proto.CertChain.decode(certificateChain);
34
39
  if (!chain.leaf || !chain.intermediate) {
@@ -4,53 +4,55 @@ exports.WaNoiseHandshake = void 0;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
5
  const WaNoiseSocket_1 = require("../noise/WaNoiseSocket");
6
6
  const bytes_1 = require("../../util/bytes");
7
+ /**
8
+ * Implements the Noise XX-style handshake state used by WaComms: tracks the
9
+ * handshake hash, chaining key, derived cipher key, and nonce counter. Calls
10
+ * {@link finish} to produce the post-handshake {@link WaNoiseSocket}.
11
+ */
7
12
  class WaNoiseHandshake {
8
13
  constructor() {
14
+ this.nonceScratch = new Uint8Array(12);
9
15
  this.handshakeHash = bytes_1.EMPTY_BYTES;
10
16
  this.chainingKey = bytes_1.EMPTY_BYTES;
11
17
  this.cipherKey = null;
12
18
  this.nonce = 0;
13
19
  }
14
- async start(protocolName, prologue) {
15
- const hashInput = protocolName.length === 32 ? protocolName : await (0, _crypto_1.sha256)(protocolName);
20
+ start(protocolName, prologue) {
21
+ const hashInput = protocolName.length === 32 ? protocolName : (0, _crypto_1.sha256)(protocolName);
16
22
  this.handshakeHash = hashInput;
17
23
  this.chainingKey = hashInput;
18
- this.cipherKey = await (0, _crypto_1.importAesGcmKey)(this.handshakeHash, ['encrypt', 'decrypt']);
19
- await this.authenticate(prologue);
24
+ this.cipherKey = this.handshakeHash;
25
+ this.authenticate(prologue);
20
26
  }
21
- async authenticate(data) {
22
- this.handshakeHash = await (0, _crypto_1.sha256)((0, bytes_1.concatBytes)([this.handshakeHash, data]));
27
+ authenticate(data) {
28
+ this.handshakeHash = (0, _crypto_1.sha256)([this.handshakeHash, data]);
23
29
  }
24
- async mixIntoKey(keyMaterial) {
30
+ mixIntoKey(keyMaterial) {
25
31
  this.nonce = 0;
26
- const [newChainingKey, nextCipherKey] = await (0, _crypto_1.hkdfSplit)(keyMaterial, this.chainingKey, '');
32
+ const [newChainingKey, nextCipherKey] = (0, _crypto_1.hkdfSplit)(keyMaterial, this.chainingKey, bytes_1.EMPTY_BYTES);
27
33
  this.chainingKey = newChainingKey;
28
- this.cipherKey = await (0, _crypto_1.importAesGcmKey)(nextCipherKey, ['encrypt', 'decrypt']);
34
+ this.cipherKey = nextCipherKey;
29
35
  }
30
- async encrypt(plaintext) {
36
+ encrypt(plaintext) {
31
37
  if (!this.cipherKey) {
32
38
  throw new Error('noise handshake cipher key is not initialized');
33
39
  }
34
- const nonce = (0, _crypto_1.buildNonce)(this.nonce++);
35
- const ciphertext = await (0, _crypto_1.aesGcmEncrypt)(this.cipherKey, nonce, plaintext, this.handshakeHash);
36
- await this.authenticate(ciphertext);
40
+ (0, _crypto_1.writeNonceCounter)(this.nonceScratch, this.nonce++);
41
+ const ciphertext = (0, _crypto_1.aesGcmEncrypt)(this.cipherKey, this.nonceScratch, plaintext, this.handshakeHash);
42
+ this.authenticate(ciphertext);
37
43
  return ciphertext;
38
44
  }
39
- async decrypt(ciphertext) {
45
+ decrypt(ciphertext) {
40
46
  if (!this.cipherKey) {
41
47
  throw new Error('noise handshake cipher key is not initialized');
42
48
  }
43
- const nonce = (0, _crypto_1.buildNonce)(this.nonce++);
44
- const plaintext = await (0, _crypto_1.aesGcmDecrypt)(this.cipherKey, nonce, ciphertext, this.handshakeHash);
45
- await this.authenticate(ciphertext);
49
+ (0, _crypto_1.writeNonceCounter)(this.nonceScratch, this.nonce++);
50
+ const plaintext = (0, _crypto_1.aesGcmDecrypt)(this.cipherKey, this.nonceScratch, ciphertext, this.handshakeHash);
51
+ this.authenticate(ciphertext);
46
52
  return plaintext;
47
53
  }
48
- async finish() {
49
- const [writeKeyRaw, readKeyRaw] = await (0, _crypto_1.hkdfSplit)(bytes_1.EMPTY_BYTES, this.chainingKey, '');
50
- const [writeKey, readKey] = await Promise.all([
51
- (0, _crypto_1.importAesGcmKey)(writeKeyRaw, ['encrypt']),
52
- (0, _crypto_1.importAesGcmKey)(readKeyRaw, ['decrypt'])
53
- ]);
54
+ finish() {
55
+ const [writeKey, readKey] = (0, _crypto_1.hkdfSplit)(bytes_1.EMPTY_BYTES, this.chainingKey, bytes_1.EMPTY_BYTES);
54
56
  this.handshakeHash = bytes_1.EMPTY_BYTES;
55
57
  this.chainingKey = bytes_1.EMPTY_BYTES;
56
58
  this.cipherKey = null;
@@ -51,7 +51,6 @@ function buildRoutingInfoPrefix(routingInfo) {
51
51
  class WaNoiseSession {
52
52
  constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
53
53
  this.writeChain = Promise.resolve();
54
- this.readChain = Promise.resolve();
55
54
  this.frameCodec = null;
56
55
  this.handshakeInbox = [];
57
56
  this.handshakeInboxHead = 0;
@@ -84,16 +83,16 @@ class WaNoiseSession {
84
83
  const verifyCertificates = config.verifyCertificateChain !== false;
85
84
  this.trustedRootCa = config.trustedRootCa;
86
85
  if (config.serverStaticKey && config.serverStaticKey.length === 32) {
87
- this.logger.info('noise session attempting resume handshake (IK)');
86
+ this.logger.debug('noise session attempting resume handshake (IK)');
88
87
  this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
89
88
  await this.decodeBufferedPostHandshakeFrames();
90
- this.logger.info('noise session established via resume/full fallback path');
89
+ this.logger.info('noise session established', { mode: 'resume_or_fallback' });
91
90
  return;
92
91
  }
93
- this.logger.info('noise session starting full handshake (XX)');
92
+ this.logger.debug('noise session starting full handshake (XX)');
94
93
  this.noiseSocket = await this.fullHandshake(config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
95
94
  await this.decodeBufferedPostHandshakeFrames();
96
- this.logger.info('noise session established via full handshake');
95
+ this.logger.info('noise session established', { mode: 'full' });
97
96
  }
98
97
  encryptFrame(frame) {
99
98
  const socket = this.noiseSocket;
@@ -101,19 +100,11 @@ class WaNoiseSession {
101
100
  if (!socket || !codec) {
102
101
  return Promise.reject(new Error('noise session is not established'));
103
102
  }
104
- let encryptPromise;
105
- try {
106
- encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
107
- }
108
- catch (error) {
109
- return Promise.reject(error);
110
- }
111
- const result = this.writeChain
112
- .then(() => encryptPromise)
113
- .then((encrypted) => codec.encodeFrame(encrypted));
103
+ const result = this.writeChain.then(() => codec.encodeFrame(socket.encrypt(frame)));
114
104
  this.writeChain = result.then(() => { }, () => { });
115
105
  return result;
116
106
  }
107
+ // eslint-disable-next-line @typescript-eslint/require-await
117
108
  async pushWireChunk(chunk) {
118
109
  const codec = this.frameCodec;
119
110
  if (!codec) {
@@ -142,11 +133,7 @@ class WaNoiseSession {
142
133
  return out;
143
134
  }
144
135
  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;
136
+ const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
150
137
  for (let i = 0; i < decrypted.length; i++) {
151
138
  out.push(decrypted[i]);
152
139
  }
@@ -164,15 +151,12 @@ class WaNoiseSession {
164
151
  rejecter(closeError);
165
152
  }
166
153
  }
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);
154
+ decryptFramesBatch(socket, frames) {
155
+ const out = new Array(frames.length);
172
156
  for (let i = 0; i < frames.length; i++) {
173
- pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
157
+ out[i] = socket.decrypt(frames[i]);
174
158
  }
175
- return Promise.all(pending);
159
+ return out;
176
160
  }
177
161
  reset() {
178
162
  this.logger.trace('noise session reset');
@@ -186,7 +170,6 @@ class WaNoiseSession {
186
170
  this.serverStaticKey = null;
187
171
  this.trustedRootCa = undefined;
188
172
  this.writeChain = Promise.resolve();
189
- this.readChain = Promise.resolve();
190
173
  }
191
174
  getServerStaticKey() {
192
175
  return this.serverStaticKey;
@@ -194,8 +177,8 @@ class WaNoiseSession {
194
177
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
195
178
  this.logger.trace('noise full handshake: send client hello');
196
179
  const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
197
- await handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
198
- await handshake.authenticate(ephemeralKeyPair.pubKey);
180
+ handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
181
+ handshake.authenticate(ephemeralKeyPair.pubKey);
199
182
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
200
183
  clientHello: {
201
184
  ephemeral: ephemeralKeyPair.pubKey
@@ -209,23 +192,23 @@ class WaNoiseSession {
209
192
  if (resumeResult.socket) {
210
193
  return resumeResult.socket;
211
194
  }
212
- this.logger.info('noise resume handshake fallback to XX');
195
+ this.logger.debug('noise resume handshake fallback to XX');
213
196
  return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
214
197
  }
215
198
  async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
216
199
  this.logger.trace('noise resume handshake: send IK client hello');
217
200
  const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
218
- await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
219
- await handshake.authenticate(serverStaticKey);
220
- await handshake.authenticate(ephemeralKeyPair.pubKey);
201
+ handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
202
+ handshake.authenticate(serverStaticKey);
203
+ handshake.authenticate(ephemeralKeyPair.pubKey);
221
204
  const [agreement1, agreement2] = await Promise.all([
222
205
  _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
223
206
  _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
224
207
  ]);
225
- await handshake.mixIntoKey(agreement1);
226
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
227
- await handshake.mixIntoKey(agreement2);
228
- const encryptedPayload = await handshake.encrypt(payload);
208
+ handshake.mixIntoKey(agreement1);
209
+ const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
210
+ handshake.mixIntoKey(agreement2);
211
+ const encryptedPayload = handshake.encrypt(payload);
229
212
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
230
213
  clientHello: {
231
214
  ephemeral: ephemeralKeyPair.pubKey,
@@ -249,22 +232,22 @@ class WaNoiseSession {
249
232
  throw new Error('noise resume handshake missing certificate payload');
250
233
  }
251
234
  const serverEphemeral = serverHello.ephemeral;
252
- await handshake.authenticate(serverEphemeral);
235
+ handshake.authenticate(serverEphemeral);
253
236
  const [dh1, dh2] = await Promise.all([
254
237
  _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
255
238
  _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
256
239
  ]);
257
- await handshake.mixIntoKey(dh1);
258
- await handshake.mixIntoKey(dh2);
259
- await handshake.decrypt(serverHello.payload);
240
+ handshake.mixIntoKey(dh1);
241
+ handshake.mixIntoKey(dh2);
242
+ handshake.decrypt(serverHello.payload);
260
243
  this.serverStaticKey = serverStaticKey;
261
- this.logger.info('noise resume handshake successful without fallback');
262
- return { socket: await handshake.finish(), serverHelloFrame: null };
244
+ this.logger.debug('noise resume handshake successful without fallback');
245
+ return { socket: handshake.finish(), serverHelloFrame: null };
263
246
  }
264
247
  async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
265
248
  const fallback = new WaNoiseHandshake_1.WaNoiseHandshake();
266
- await fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
267
- await fallback.authenticate(ephemeralKeyPair.pubKey);
249
+ fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
250
+ fallback.authenticate(ephemeralKeyPair.pubKey);
268
251
  return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
269
252
  }
270
253
  async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
@@ -275,19 +258,19 @@ class WaNoiseSession {
275
258
  throw new Error('noise full handshake missing server hello fields');
276
259
  }
277
260
  const serverEphemeral = serverHello.ephemeral;
278
- await handshake.authenticate(serverEphemeral);
279
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
280
- const serverStatic = await handshake.decrypt(serverHello.static);
281
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
282
- const certificate = await handshake.decrypt(serverHello.payload);
261
+ handshake.authenticate(serverEphemeral);
262
+ handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
263
+ const serverStatic = handshake.decrypt(serverHello.static);
264
+ handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
265
+ const certificate = handshake.decrypt(serverHello.payload);
283
266
  if (verifyCertificates) {
284
267
  await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
285
268
  this.logger.trace('noise certificate chain verified');
286
269
  }
287
270
  this.serverStaticKey = serverStatic;
288
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
289
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
290
- const encryptedPayload = await handshake.encrypt(payload);
271
+ const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
272
+ handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
273
+ const encryptedPayload = handshake.encrypt(payload);
291
274
  const clientFinish = _proto_1.proto.HandshakeMessage.encode({
292
275
  clientFinish: {
293
276
  static: encryptedClientStatic,
@@ -350,6 +333,7 @@ class WaNoiseSession {
350
333
  throw (0, primitives_1.toError)(error);
351
334
  });
352
335
  }
336
+ // eslint-disable-next-line @typescript-eslint/require-await
353
337
  async decodeBufferedPostHandshakeFrames() {
354
338
  if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
355
339
  return;
@@ -360,11 +344,7 @@ class WaNoiseSession {
360
344
  const start = this.handshakeInboxHead;
361
345
  const frames = this.handshakeInbox.slice(start);
362
346
  if (frames.length > 0) {
363
- const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
364
- this.readChain = this.readChain
365
- .then(() => decryptBatch)
366
- .then(() => { }, () => { });
367
- const decrypted = await decryptBatch;
347
+ const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
368
348
  for (let i = 0; i < decrypted.length; i++) {
369
349
  this.pendingDecryptedFrames.push(decrypted[i]);
370
350
  }
@@ -1,25 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaNoiseSocket = void 0;
4
+ const node_crypto_1 = require("node:crypto");
4
5
  const _crypto_1 = require("../../crypto/index.js");
6
+ /**
7
+ * Post-handshake symmetric channel: applies AES-GCM with per-direction
8
+ * 12-byte nonces (counter in the trailing 4 bytes) using a per-instance
9
+ * scratch buffer to avoid allocations on the hot path.
10
+ */
5
11
  class WaNoiseSocket {
6
12
  constructor(encryptKey, decryptKey) {
7
- this.encryptKey = encryptKey;
8
- this.decryptKey = decryptKey;
13
+ this.writeNonceScratch = new Uint8Array(12);
14
+ this.readNonceScratch = new Uint8Array(12);
15
+ this.encryptKey = (0, node_crypto_1.createSecretKey)(encryptKey);
16
+ this.decryptKey = (0, node_crypto_1.createSecretKey)(decryptKey);
9
17
  this.writeCounter = 0;
10
18
  this.readCounter = 0;
11
19
  }
12
- reserveWriteNonce() {
13
- return (0, _crypto_1.buildNonce)(this.writeCounter++);
20
+ /** Encrypts an outgoing `frame` with the next write nonce; advances the write counter. */
21
+ encrypt(frame, additionalData) {
22
+ (0, _crypto_1.writeNonceCounter)(this.writeNonceScratch, this.writeCounter++);
23
+ return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, this.writeNonceScratch, frame, additionalData);
14
24
  }
15
- encrypt(nonce, frame, additionalData) {
16
- return (0, _crypto_1.aesGcmEncrypt)(this.encryptKey, nonce, frame, additionalData);
17
- }
18
- reserveReadNonce() {
19
- return (0, _crypto_1.buildNonce)(this.readCounter++);
20
- }
21
- decrypt(nonce, frame, additionalData) {
22
- return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, nonce, frame, additionalData);
25
+ /** Decrypts an incoming `frame` with the next read nonce; advances the read counter. */
26
+ decrypt(frame, additionalData) {
27
+ (0, _crypto_1.writeNonceCounter)(this.readNonceScratch, this.readCounter++);
28
+ return (0, _crypto_1.aesGcmDecrypt)(this.decryptKey, this.readNonceScratch, frame, additionalData);
23
29
  }
24
30
  }
25
31
  exports.WaNoiseSocket = WaNoiseSocket;
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ROOT_CA_PUBLIC_KEY_HEX = exports.ROOT_CA_SERIAL = exports.NOISE_XX_FALLBACK_NAME = exports.NOISE_IK_NAME = exports.NOISE_XX_NAME = exports.WA_PROTO_HEADER = exports.DEFAULT_VERSION_BASE = void 0;
3
+ exports.ROOT_CA_PUBLIC_KEY_HEX = exports.ROOT_CA_SERIAL = exports.NOISE_XX_FALLBACK_NAME = exports.NOISE_IK_NAME = exports.NOISE_XX_NAME = exports.WA_PROTO_HEADER = void 0;
4
4
  const bytes_1 = require("../../util/bytes");
5
- exports.DEFAULT_VERSION_BASE = '2.3000.1034748654';
6
5
  exports.WA_PROTO_HEADER = new Uint8Array([87, 65, 6, 3]);
7
6
  exports.NOISE_XX_NAME = bytes_1.TEXT_ENCODER.encode('Noise_XX_25519_AESGCM_SHA256\0\0\0\0');
8
7
  exports.NOISE_IK_NAME = bytes_1.TEXT_ENCODER.encode('Noise_IK_25519_AESGCM_SHA256\0\0\0\0');
@@ -5,27 +5,32 @@ exports.isProxyAgent = isProxyAgent;
5
5
  exports.isProxyTransport = isProxyTransport;
6
6
  exports.toProxyDispatcher = toProxyDispatcher;
7
7
  exports.toProxyAgent = toProxyAgent;
8
+ /** Type guard for an undici-style proxy dispatcher (has `dispatch` method). */
8
9
  function isProxyDispatcher(value) {
9
10
  return (typeof value === 'object' &&
10
11
  value !== null &&
11
12
  'dispatch' in value &&
12
13
  typeof value.dispatch === 'function');
13
14
  }
15
+ /** Type guard for a Node http.Agent-style proxy (has `addRequest` method). */
14
16
  function isProxyAgent(value) {
15
17
  return (typeof value === 'object' &&
16
18
  value !== null &&
17
19
  'addRequest' in value &&
18
20
  typeof value.addRequest === 'function');
19
21
  }
22
+ /** Type guard accepting either {@link isProxyDispatcher} or {@link isProxyAgent} shapes. */
20
23
  function isProxyTransport(value) {
21
24
  return isProxyDispatcher(value) || isProxyAgent(value);
22
25
  }
26
+ /** Narrows `proxy` to {@link WaProxyDispatcher} or returns `undefined`. */
23
27
  function toProxyDispatcher(proxy) {
24
28
  if (!proxy || !isProxyDispatcher(proxy)) {
25
29
  return undefined;
26
30
  }
27
31
  return proxy;
28
32
  }
33
+ /** Narrows `proxy` to {@link WaProxyAgent} or returns `undefined`. */
29
34
  function toProxyAgent(proxy) {
30
35
  if (!proxy || !isProxyAgent(proxy)) {
31
36
  return undefined;
@@ -7,7 +7,6 @@ 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+$/;
11
10
  function parseStreamControlNode(node) {
12
11
  if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
13
12
  return { kind: 'xmlstreamend' };
@@ -21,12 +20,9 @@ function parseStreamControlNode(node) {
21
20
  ? { kind: 'stream_error_replaced' }
22
21
  : { kind: 'stream_error_device_removed' };
23
22
  }
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
- }
23
+ const code = (0, primitives_1.parseOptionalInt)(node.attrs.code);
24
+ if (code !== undefined) {
25
+ return { kind: 'stream_error_code', code };
30
26
  }
31
27
  const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
32
28
  if (ackNode) {
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchLatestWaWebVersion = fetchLatestWaWebVersion;
4
+ const proxy_1 = require("./proxy");
5
+ const primitives_1 = require("../util/primitives");
6
+ const DEFAULT_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
7
+ const DEFAULT_TIMEOUT_MS = 10000;
8
+ const SW_JS_URL = 'https://web.whatsapp.com/sw.js';
9
+ const CLIENT_REVISION_PATTERN = /\\?"client_revision\\?":\s*(\d+)/;
10
+ /**
11
+ * Fetches the current WhatsApp Web `client_revision` from the public
12
+ * `sw.js` served by the WhatsApp Web frontend and assembles a
13
+ * `2.3000.x` version string suitable for `WaClientOptions.version`.
14
+ *
15
+ * Use this when the library's hardcoded default starts being rejected by
16
+ * the server with HTTP 405 / `failure_client_too_old`, and you need to
17
+ * refresh the version without waiting for a library bump.
18
+ *
19
+ * Network failures and parse errors throw; wrap in a `try`/`catch` and
20
+ * fall back to the hardcoded default.
21
+ *
22
+ * @example
23
+ * const latest = await fetchLatestWaWebVersion()
24
+ * const client = new WaClient({ store, sessionId, version: latest.version })
25
+ */
26
+ async function fetchLatestWaWebVersion(options = {}) {
27
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
28
+ const dispatcher = (0, proxy_1.toProxyDispatcher)(options.proxy);
29
+ const fetchImpl = options.fetch ?? fetch;
30
+ const controller = new AbortController();
31
+ const timer = setTimeout(() => controller.abort(new Error(`fetch latest wa-web version timed out after ${timeoutMs}ms`)), timeoutMs);
32
+ timer.unref?.();
33
+ let onExternalAbort = null;
34
+ const externalSignal = options.signal;
35
+ if (externalSignal) {
36
+ if (externalSignal.aborted) {
37
+ controller.abort(externalSignal.reason);
38
+ }
39
+ else {
40
+ onExternalAbort = () => controller.abort(externalSignal.reason);
41
+ externalSignal.addEventListener('abort', onExternalAbort, { once: true });
42
+ }
43
+ }
44
+ try {
45
+ const headers = {
46
+ 'sec-fetch-site': 'none',
47
+ 'user-agent': options.userAgent ?? DEFAULT_USER_AGENT
48
+ };
49
+ if (options.headers) {
50
+ for (const key in options.headers) {
51
+ headers[key.toLowerCase()] = options.headers[key];
52
+ }
53
+ }
54
+ const init = {
55
+ method: 'GET',
56
+ headers,
57
+ signal: controller.signal
58
+ };
59
+ if (dispatcher) {
60
+ // dispatcher is a non-standard undici-only extension to RequestInit
61
+ ;
62
+ init.dispatcher = dispatcher;
63
+ }
64
+ let response;
65
+ try {
66
+ response = await fetchImpl(SW_JS_URL, init);
67
+ }
68
+ catch (error) {
69
+ throw new Error(`failed to fetch sw.js: ${(0, primitives_1.toError)(error).message}`);
70
+ }
71
+ if (!response.ok) {
72
+ throw new Error(`failed to fetch sw.js: http ${response.status}`);
73
+ }
74
+ const body = await response.text();
75
+ const match = CLIENT_REVISION_PATTERN.exec(body);
76
+ if (!match?.[1]) {
77
+ throw new Error('client_revision not found in sw.js response');
78
+ }
79
+ const revision = Number.parseInt(match[1], 10);
80
+ if (!Number.isSafeInteger(revision) || revision <= 0) {
81
+ throw new Error(`invalid client_revision in sw.js: ${match[1]}`);
82
+ }
83
+ return {
84
+ version: `2.3000.${revision}`,
85
+ parts: [2, 3000, revision]
86
+ };
87
+ }
88
+ finally {
89
+ clearTimeout(timer);
90
+ if (externalSignal && onExternalAbort) {
91
+ externalSignal.removeEventListener('abort', onExternalAbort);
92
+ }
93
+ }
94
+ }
@@ -10,6 +10,6 @@ export declare const APP_STATE_MAC_OCTET_LENGTH = 8;
10
10
  export declare const APP_STATE_IV_LENGTH = 16;
11
11
  export declare const APP_STATE_LT_HASH_SIZE = 128;
12
12
  export declare const APP_STATE_POINT_SIZE = 2;
13
- export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array<ArrayBuffer>;
13
+ export declare const APP_STATE_EMPTY_LT_HASH: Readonly<Uint8Array>;
14
14
  export declare const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
15
15
  export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
@@ -1,11 +1,10 @@
1
- import { type CryptoKey } from '../crypto/core/primitives';
2
- import { type Proto } from '..';
1
+ import { type Proto } from '../..';
3
2
  interface WaAppStateDerivedKeys {
4
- readonly indexHmacKey: CryptoKey;
5
- readonly valueEncryptionAesKey: CryptoKey;
6
- readonly valueMacHmacKey: CryptoKey;
7
- readonly snapshotMacHmacKey: CryptoKey;
8
- readonly patchMacHmacKey: CryptoKey;
3
+ readonly indexHmacKey: Uint8Array;
4
+ readonly valueEncryptionAesKey: Uint8Array;
5
+ readonly valueMacHmacKey: Uint8Array;
6
+ readonly snapshotMacHmacKey: Uint8Array;
7
+ readonly patchMacHmacKey: Uint8Array;
9
8
  }
10
9
  interface WaAppStateEncryptedMutation {
11
10
  readonly indexMac: Uint8Array;
@@ -19,15 +18,27 @@ interface WaAppStateDecryptedMutation {
19
18
  readonly indexMac: Uint8Array;
20
19
  readonly valueMac: Uint8Array;
21
20
  }
21
+ /**
22
+ * Implements the app-state mutation cryptography: HKDF key derivation (with
23
+ * a bounded LRU cache), per-mutation encrypt/decrypt, snapshot/patch MAC
24
+ * generation, and the LT-hash arithmetic used to track collection state.
25
+ */
22
26
  export declare class WaAppStateCrypto {
23
27
  private readonly derivedKeysCache;
24
28
  private readonly derivedKeysCacheMaxSize;
25
29
  private readonly skipMacVerification;
26
30
  constructor(derivedKeysCacheMaxSize?: number, skipMacVerification?: boolean);
27
31
  get isMacVerificationSkipped(): boolean;
32
+ /** Empties the derived-keys LRU cache (e.g. after a session reset). */
28
33
  clearCache(): void;
29
- deriveKeys(keyData: Uint8Array): Promise<WaAppStateDerivedKeys>;
30
- generateIndexMac(indexHmacKey: CryptoKey, indexBytes: Uint8Array): Promise<Uint8Array>;
34
+ /**
35
+ * Derives the index/value/snapshot/patch keys from an app-state sync key.
36
+ * Cached by base64 of `keyData` (LRU-bounded).
37
+ */
38
+ deriveKeys(keyData: Uint8Array): WaAppStateDerivedKeys;
39
+ /** Computes the HMAC-SHA-256 index MAC over `indexBytes`. */
40
+ generateIndexMac(indexHmacKey: Uint8Array, indexBytes: Uint8Array): Uint8Array;
41
+ /** Encrypts a single mutation value with AES-CBC + HMAC value-MAC. */
31
42
  encryptMutation(args: {
32
43
  readonly operation: number;
33
44
  readonly keyId: Uint8Array;
@@ -37,6 +48,7 @@ export declare class WaAppStateCrypto {
37
48
  readonly version: number;
38
49
  readonly iv?: Uint8Array;
39
50
  }): Promise<WaAppStateEncryptedMutation>;
51
+ /** Verifies and decrypts a single app-state mutation. */
40
52
  decryptMutation(args: {
41
53
  readonly operation: number;
42
54
  readonly keyId: Uint8Array;
@@ -44,10 +56,15 @@ export declare class WaAppStateCrypto {
44
56
  readonly indexMac: Uint8Array;
45
57
  readonly valueBlob: Uint8Array;
46
58
  }): Promise<WaAppStateDecryptedMutation>;
59
+ /** Generates the HMAC-SHA-512 snapshot MAC over the LT-hash + version + collection name. */
47
60
  generateSnapshotMac(keyData: Uint8Array, ltHash: Uint8Array, version: number, collectionName: string): Promise<Uint8Array>;
61
+ /** Generates the HMAC-SHA-512 patch MAC binding mutations to a collection version. */
48
62
  generatePatchMac(keyData: Uint8Array, snapshotMac: Uint8Array, valueMacs: readonly Uint8Array[], version: number, collectionName: string): Promise<Uint8Array>;
63
+ /** Adds value MACs into the running LT-hash digest for a collection. */
49
64
  ltHashAdd(base: Uint8Array, addValues: readonly Uint8Array[]): Promise<Uint8Array>;
65
+ /** Removes value MACs from the running LT-hash digest (for `remove` operations). */
50
66
  ltHashSubtract(base: Uint8Array, removeValues: readonly Uint8Array[]): Promise<Uint8Array>;
67
+ /** Combined subtract+add LT-hash update used when a key's value MAC changes in place. */
51
68
  ltHashSubtractThenAdd(base: Uint8Array, addValues: readonly Uint8Array[], removeValues: readonly Uint8Array[]): Promise<{
52
69
  readonly hash: Uint8Array;
53
70
  readonly subtractResult: Uint8Array;