zapo-js 0.2.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 (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  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 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  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 +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -2,26 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.verifyNoiseCertificateChain = verifyNoiseCertificateChain;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
- const X25519_1 = require("../../crypto/curves/X25519");
6
5
  const _proto_1 = require("../../proto.js");
7
6
  const constants_1 = require("../noise/constants");
8
7
  const bytes_1 = require("../../util/bytes");
9
8
  const primitives_1 = require("../../util/primitives");
10
- async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
11
- const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
12
- if (signatureInput.length !== 64) {
13
- return false;
14
- }
15
- const signature = new Uint8Array(signatureInput);
16
- const lastByte = signature[63];
17
- if ((lastByte & 0x60) !== 0) {
18
- return false;
19
- }
20
- const signBit = lastByte & 0x80;
21
- signature[63] = lastByte & 0x7f;
22
- const edwardsPublicKey = (0, X25519_1.montgomeryToEdwardsPublic)(publicKey.subarray(1), signBit);
23
- return _crypto_1.Ed25519.verify(message, signature, edwardsPublicKey);
24
- }
9
+ const PRODUCTION_ROOT_CA = {
10
+ publicKey: (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX),
11
+ serial: constants_1.ROOT_CA_SERIAL
12
+ };
25
13
  function parseNoiseCertificate(certificate) {
26
14
  if (!certificate) {
27
15
  throw new Error('missing noise certificate');
@@ -41,21 +29,21 @@ function parseNoiseCertificate(certificate) {
41
29
  signature: signatureBytes
42
30
  };
43
31
  }
44
- function rootPublicKeySerialized() {
45
- const raw = (0, bytes_1.hexToBytes)(constants_1.ROOT_CA_PUBLIC_KEY_HEX);
46
- return (0, _crypto_1.toSerializedPubKey)(raw);
47
- }
48
- async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
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
+ */
37
+ async function verifyNoiseCertificateChain(certificateChain, serverStatic, rootCa = PRODUCTION_ROOT_CA) {
49
38
  const chain = _proto_1.proto.CertChain.decode(certificateChain);
50
39
  if (!chain.leaf || !chain.intermediate) {
51
40
  throw new Error('noise certificate chain is missing leaf/intermediate');
52
41
  }
53
42
  const intermediate = parseNoiseCertificate(chain.intermediate);
54
- if (intermediate.issuerSerial !== constants_1.ROOT_CA_SERIAL) {
43
+ if (intermediate.issuerSerial !== rootCa.serial) {
55
44
  throw new Error('intermediate certificate issuer mismatch');
56
45
  }
57
- const rootKey = rootPublicKeySerialized();
58
- const validIntermediate = await verifySignalVariant(rootKey, intermediate.details, intermediate.signature);
46
+ const validIntermediate = await (0, _crypto_1.xeddsaVerify)(rootCa.publicKey, intermediate.details, intermediate.signature);
59
47
  if (!validIntermediate) {
60
48
  throw new Error('intermediate certificate signature is invalid');
61
49
  }
@@ -63,8 +51,7 @@ async function verifyNoiseCertificateChain(certificateChain, serverStatic) {
63
51
  if (leaf.issuerSerial !== intermediate.serial) {
64
52
  throw new Error('leaf certificate issuer mismatch');
65
53
  }
66
- const intermediatePublicSerialized = (0, _crypto_1.toSerializedPubKey)(intermediate.key);
67
- const validLeaf = await verifySignalVariant(intermediatePublicSerialized, leaf.details, leaf.signature);
54
+ const validLeaf = await (0, _crypto_1.xeddsaVerify)(intermediate.key, leaf.details, leaf.signature);
68
55
  if (!validLeaf) {
69
56
  throw new Error('leaf certificate signature is invalid');
70
57
  }
@@ -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;
@@ -16,7 +16,7 @@ function resolvePayload(payload) {
16
16
  if (payload instanceof Uint8Array) {
17
17
  return Promise.resolve(payload);
18
18
  }
19
- return Promise.resolve(payload()).then((value) => (0, bytes_1.toBytesView)(value));
19
+ return Promise.resolve(payload());
20
20
  }
21
21
  async function resolveHandshakePayload(config) {
22
22
  if (config.isRegistered) {
@@ -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;
@@ -61,6 +60,7 @@ class WaNoiseSession {
61
60
  this.closedError = null;
62
61
  this.noiseSocket = null;
63
62
  this.serverStaticKey = null;
63
+ this.trustedRootCa = undefined;
64
64
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
65
65
  this.sendWire = sendWire;
66
66
  this.logger = logger;
@@ -71,9 +71,7 @@ class WaNoiseSession {
71
71
  isRegistered: config.isRegistered,
72
72
  hasServerStaticKey: !!config.serverStaticKey
73
73
  });
74
- const protocolHeader = config.protocolHeader
75
- ? (0, bytes_1.toBytesView)(config.protocolHeader)
76
- : constants_2.WA_PROTO_HEADER;
74
+ const protocolHeader = config.protocolHeader ?? constants_2.WA_PROTO_HEADER;
77
75
  const introFrame = config.routingInfo && config.routingInfo.length > 0
78
76
  ? (0, bytes_1.concatBytes)([buildRoutingInfoPrefix(config.routingInfo), protocolHeader])
79
77
  : protocolHeader;
@@ -83,17 +81,18 @@ class WaNoiseSession {
83
81
  resolveHandshakePayload(config)
84
82
  ]);
85
83
  const verifyCertificates = config.verifyCertificateChain !== false;
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');
@@ -184,8 +168,8 @@ class WaNoiseSession {
184
168
  this.closedError = null;
185
169
  this.noiseSocket = null;
186
170
  this.serverStaticKey = null;
171
+ this.trustedRootCa = undefined;
187
172
  this.writeChain = Promise.resolve();
188
- this.readChain = Promise.resolve();
189
173
  }
190
174
  getServerStaticKey() {
191
175
  return this.serverStaticKey;
@@ -193,8 +177,8 @@ class WaNoiseSession {
193
177
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
194
178
  this.logger.trace('noise full handshake: send client hello');
195
179
  const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
196
- await handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
197
- await handshake.authenticate(ephemeralKeyPair.pubKey);
180
+ handshake.start(constants_2.NOISE_XX_NAME, protocolHeader);
181
+ handshake.authenticate(ephemeralKeyPair.pubKey);
198
182
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
199
183
  clientHello: {
200
184
  ephemeral: ephemeralKeyPair.pubKey
@@ -208,23 +192,23 @@ class WaNoiseSession {
208
192
  if (resumeResult.socket) {
209
193
  return resumeResult.socket;
210
194
  }
211
- this.logger.info('noise resume handshake fallback to XX');
195
+ this.logger.debug('noise resume handshake fallback to XX');
212
196
  return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
213
197
  }
214
198
  async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
215
199
  this.logger.trace('noise resume handshake: send IK client hello');
216
200
  const handshake = new WaNoiseHandshake_1.WaNoiseHandshake();
217
- await handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
218
- await handshake.authenticate(serverStaticKey);
219
- await handshake.authenticate(ephemeralKeyPair.pubKey);
201
+ handshake.start(constants_2.NOISE_IK_NAME, protocolHeader);
202
+ handshake.authenticate(serverStaticKey);
203
+ handshake.authenticate(ephemeralKeyPair.pubKey);
220
204
  const [agreement1, agreement2] = await Promise.all([
221
205
  _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
222
206
  _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
223
207
  ]);
224
- await handshake.mixIntoKey(agreement1);
225
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
226
- await handshake.mixIntoKey(agreement2);
227
- 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);
228
212
  const clientHello = _proto_1.proto.HandshakeMessage.encode({
229
213
  clientHello: {
230
214
  ephemeral: ephemeralKeyPair.pubKey,
@@ -247,23 +231,23 @@ class WaNoiseSession {
247
231
  if (!serverHello.payload) {
248
232
  throw new Error('noise resume handshake missing certificate payload');
249
233
  }
250
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
251
- await handshake.authenticate(serverEphemeral);
234
+ const serverEphemeral = serverHello.ephemeral;
235
+ handshake.authenticate(serverEphemeral);
252
236
  const [dh1, dh2] = await Promise.all([
253
237
  _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
254
238
  _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
255
239
  ]);
256
- await handshake.mixIntoKey(dh1);
257
- await handshake.mixIntoKey(dh2);
258
- await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
240
+ handshake.mixIntoKey(dh1);
241
+ handshake.mixIntoKey(dh2);
242
+ handshake.decrypt(serverHello.payload);
259
243
  this.serverStaticKey = serverStaticKey;
260
- this.logger.info('noise resume handshake successful without fallback');
261
- return { socket: await handshake.finish(), serverHelloFrame: null };
244
+ this.logger.debug('noise resume handshake successful without fallback');
245
+ return { socket: handshake.finish(), serverHelloFrame: null };
262
246
  }
263
247
  async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
264
248
  const fallback = new WaNoiseHandshake_1.WaNoiseHandshake();
265
- await fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
266
- await fallback.authenticate(ephemeralKeyPair.pubKey);
249
+ fallback.start(constants_2.NOISE_XX_FALLBACK_NAME, protocolHeader);
250
+ fallback.authenticate(ephemeralKeyPair.pubKey);
267
251
  return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
268
252
  }
269
253
  async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
@@ -273,20 +257,20 @@ class WaNoiseSession {
273
257
  if (!serverHello?.ephemeral || !serverHello.static || !serverHello.payload) {
274
258
  throw new Error('noise full handshake missing server hello fields');
275
259
  }
276
- const serverEphemeral = (0, bytes_1.toBytesView)(serverHello.ephemeral);
277
- await handshake.authenticate(serverEphemeral);
278
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
279
- const serverStatic = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.static));
280
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
281
- const certificate = await handshake.decrypt((0, bytes_1.toBytesView)(serverHello.payload));
260
+ const serverEphemeral = serverHello.ephemeral;
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);
282
266
  if (verifyCertificates) {
283
- await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic);
267
+ await (0, WaNoiseCert_1.verifyNoiseCertificateChain)(certificate, serverStatic, this.trustedRootCa);
284
268
  this.logger.trace('noise certificate chain verified');
285
269
  }
286
270
  this.serverStaticKey = serverStatic;
287
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
288
- await handshake.mixIntoKey(await _crypto_1.X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
289
- 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);
290
274
  const clientFinish = _proto_1.proto.HandshakeMessage.encode({
291
275
  clientFinish: {
292
276
  static: encryptedClientStatic,
@@ -349,6 +333,7 @@ class WaNoiseSession {
349
333
  throw (0, primitives_1.toError)(error);
350
334
  });
351
335
  }
336
+ // eslint-disable-next-line @typescript-eslint/require-await
352
337
  async decodeBufferedPostHandshakeFrames() {
353
338
  if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
354
339
  return;
@@ -359,11 +344,7 @@ class WaNoiseSession {
359
344
  const start = this.handshakeInboxHead;
360
345
  const frames = this.handshakeInbox.slice(start);
361
346
  if (frames.length > 0) {
362
- const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
363
- this.readChain = this.readChain
364
- .then(() => decryptBatch)
365
- .then(() => { }, () => { });
366
- const decrypted = await decryptBatch;
347
+ const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
367
348
  for (let i = 0; i < decrypted.length; i++) {
368
349
  this.pendingDecryptedFrames.push(decrypted[i]);
369
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[];