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,18 @@ import { getWaCompanionPlatformId, WA_DEFAULTS } from '../protocol/constants.js'
5
5
  import { uint8Equal } from '../util/bytes.js';
6
6
  import { toError } from '../util/primitives.js';
7
7
  import { getRuntimeOsDisplayName } from '../util/runtime.js';
8
+ /**
9
+ * Owns the auth/pairing lifecycle and persistence of {@link WaAuthCredentials}.
10
+ * Exposed as `client.auth` on a {@link WaClient}.
11
+ *
12
+ * Lifecycle: construct with options + dependencies, call
13
+ * {@link loadOrCreateCredentials} to bring credentials online, then either
14
+ * follow the QR flow (`onQr` callback) or call {@link requestPairingCode} for
15
+ * the link-code flow.
16
+ */
8
17
  export class WaAuthClient {
9
18
  constructor(options, deps) {
19
+ this.versionOverride = null;
10
20
  const deviceBrowser = options.deviceBrowser ?? WA_DEFAULTS.DEVICE_BROWSER;
11
21
  const device = Object.freeze({
12
22
  browser: deviceBrowser,
@@ -25,6 +35,7 @@ export class WaAuthClient {
25
35
  this.authStore = deps.authStore;
26
36
  this.signalStore = deps.signalStore;
27
37
  this.preKeyStore = deps.preKeyStore;
38
+ this.isConnected = deps.isConnected;
28
39
  this.credentials = null;
29
40
  this.qrFlow = new WaQrFlow({
30
41
  logger: this.logger,
@@ -49,6 +60,10 @@ export class WaAuthClient {
49
60
  dangerous: options.dangerous
50
61
  });
51
62
  }
63
+ /**
64
+ * Returns a snapshot of auth readiness flags (connection, registration,
65
+ * pending QR/pairing prompts).
66
+ */
52
67
  getState(connected = false) {
53
68
  return {
54
69
  connected,
@@ -57,9 +72,14 @@ export class WaAuthClient {
57
72
  hasPairingCode: this.pairingFlow.hasPairingSession()
58
73
  };
59
74
  }
75
+ /** Returns the currently-loaded credentials, or `null` before initialization. */
60
76
  getCurrentCredentials() {
61
77
  return this.credentials;
62
78
  }
79
+ /**
80
+ * Loads persisted credentials from the auth store, or generates a fresh
81
+ * set when none exist. Must be called before connecting.
82
+ */
63
83
  async loadOrCreateCredentials() {
64
84
  return this.runHandled(async () => {
65
85
  this.logger.debug('auth client loadOrCreateCredentials start');
@@ -76,29 +96,56 @@ export class WaAuthClient {
76
96
  return this.credentials;
77
97
  });
78
98
  }
79
- buildCommsConfig(socketOptions, overrides = {}) {
99
+ /**
100
+ * Builds a {@link WaCommsConfig} from the current credentials and the
101
+ * runtime device/transport options – feeds {@link WaComms}.
102
+ */
103
+ async buildCommsConfig(socketOptions, overrides = {}) {
80
104
  this.logger.trace('auth client building comms config');
105
+ const override = this.versionOverride;
106
+ this.versionOverride = null;
81
107
  return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
82
108
  deviceBrowser: this.options.deviceBrowser,
83
109
  deviceOsDisplayName: this.options.deviceOsDisplayName,
84
110
  requireFullSync: this.options.requireFullSync,
85
- version: this.options.version,
111
+ version: override ?? this.options.version,
86
112
  mobileTransport: this.options.mobileTransport,
87
113
  noiseTrustedRootCa: overrides.noiseTrustedRootCa,
88
114
  disableNoiseCertificateChainVerification: overrides.disableNoiseCertificateChainVerification ??
89
115
  this.options.dangerous?.disableNoiseCertificateChainVerification
90
116
  });
91
117
  }
118
+ /**
119
+ * One-shot override for the next {@link buildCommsConfig} call: takes
120
+ * precedence over the user-supplied `version` option, then clears. Used
121
+ * by the `recoverFromClientTooOld` auto-retry to inject a fresh version
122
+ * string fetched from `web.whatsapp.com` without mutating the user's
123
+ * options.
124
+ */
125
+ setNextConnectVersion(version) {
126
+ this.versionOverride = version;
127
+ }
128
+ /** Clears the in-memory QR and pairing sessions without touching storage. */
129
+ // eslint-disable-next-line @typescript-eslint/require-await
92
130
  async clearTransientState() {
93
131
  this.logger.trace('auth client clear transient state');
94
132
  this.qrFlow.clear();
95
133
  this.pairingFlow.clearSession();
96
134
  }
135
+ /**
136
+ * Wipes credentials from memory **and** from the auth store. Does
137
+ * **not** touch the other store domains (signal, app-state, ...) -
138
+ * those are cleared separately when {@link WaClient.logout} triggers
139
+ * the server-side logout path, honoring `options.logoutStoreClear`.
140
+ * Call this manually only when you want to force a re-pair without
141
+ * going through the server logout IQ.
142
+ */
97
143
  async clearStoredCredentials() {
98
144
  this.logger.warn('auth client clearing stored credentials');
99
145
  this.credentials = null;
100
146
  await Promise.all([this.authStore.clear(), this.clearTransientState()]);
101
147
  }
148
+ /** Stores the server's noise static key for subsequent handshakes. */
102
149
  async persistServerStaticKey(serverStaticKey) {
103
150
  this.logger.debug('persisting server static key', {
104
151
  keyLength: serverStaticKey.byteLength
@@ -108,6 +155,7 @@ export class WaAuthClient {
108
155
  serverStaticKey
109
156
  }));
110
157
  }
158
+ /** Stores the "server holds prekeys" flag; persists only when the value changes. */
111
159
  async persistServerHasPreKeys(serverHasPreKeys) {
112
160
  await this.patchCredentials((credentials) => ({
113
161
  ...credentials,
@@ -121,6 +169,10 @@ export class WaAuthClient {
121
169
  }
122
170
  });
123
171
  }
172
+ /**
173
+ * Stores the routing-info blob received from the server. Skips persistence
174
+ * when the value matches the one already on disk.
175
+ */
124
176
  async persistRoutingInfo(routingInfo) {
125
177
  this.logger.trace('persisting routing info', {
126
178
  byteLength: routingInfo.byteLength
@@ -138,6 +190,7 @@ export class WaAuthClient {
138
190
  }
139
191
  });
140
192
  }
193
+ /** Clears the persisted routing-info blob (used after a routing error). */
141
194
  async clearRoutingInfo() {
142
195
  return this.patchCredentials((credentials) => ({
143
196
  ...credentials,
@@ -149,6 +202,11 @@ export class WaAuthClient {
149
202
  }
150
203
  });
151
204
  }
205
+ /**
206
+ * Persists the per-connection success attributes from the server (LID,
207
+ * display name, companion key, last-success ts, props versions, ...). Only
208
+ * persists when at least one attribute actually changed.
209
+ */
152
210
  async persistSuccessAttributes(attributes) {
153
211
  let persistDiff;
154
212
  const computeDiff = (current, next) => ({
@@ -185,24 +243,56 @@ export class WaAuthClient {
185
243
  }
186
244
  });
187
245
  }
188
- async requestPairingCode(phoneNumber, shouldShowPushNotification = false, customCode) {
246
+ /**
247
+ * Requests an 8-character pairing code for `phoneNumber` (link-code flow).
248
+ * Pass `customCode` to suggest a specific code; the server still validates
249
+ * and may return a different one.
250
+ *
251
+ * The client must already be connected – kick off `WaClient.connect()` in
252
+ * parallel, wait for the `auth_pairing_required` event (or any QR), then
253
+ * call this. The user then enters the returned code in WhatsApp on their
254
+ * phone under *Linked Devices → Link with phone number instead*.
255
+ *
256
+ * @example
257
+ * ```ts
258
+ * // Start the handshake; do NOT await – connect() resolves only after pairing
259
+ * void client.connect()
260
+ *
261
+ * // Wait until the pairing screen is ready on the server side
262
+ * await new Promise<void>((resolve) => client.once('auth_pairing_required', () => resolve()))
263
+ *
264
+ * // Phone number in international format, digits only
265
+ * const code = await client.auth.requestPairingCode('5511999999999')
266
+ * console.log(`enter this on your phone: ${code.match(/.{1,4}/g)!.join('-')}`)
267
+ *
268
+ * // The `connect()` promise resolves after the user types the code:
269
+ * await new Promise<void>((resolve) => client.once('auth_paired', () => resolve()))
270
+ * ```
271
+ */
272
+ async requestPairingCode(phoneNumber, shouldShowPushNotification = true, customCode) {
273
+ this.requireConnected();
189
274
  this.requireCredentials();
190
- this.logger.info('auth client requesting pairing code');
275
+ this.logger.debug('auth client requesting pairing code');
191
276
  return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification, customCode));
192
277
  }
278
+ /** Fetches the ISO country code the server resolved for the current account. */
193
279
  async fetchPairingCountryCodeIso() {
280
+ this.requireConnected();
194
281
  this.requireCredentials();
195
282
  this.logger.trace('auth client fetching pairing country code ISO');
196
283
  return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
197
284
  }
285
+ /** Dispatcher: returns `true` when `node` is a pairing-related IQ-set we handled. */
198
286
  async handleIncomingIqSet(node) {
199
287
  this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
200
288
  return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
201
289
  }
290
+ /** Dispatcher: returns `true` when `node` is a link-code companion notification. */
202
291
  async handleLinkCodeNotification(node) {
203
292
  this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
204
293
  return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
205
294
  }
295
+ /** Dispatcher: returns `true` when `node` is a companion-registration refresh notification. */
206
296
  async handleCompanionRegRefreshNotification(node) {
207
297
  this.logger.trace('auth client handleCompanionRegRefreshNotification', {
208
298
  id: node.attrs.id
@@ -230,7 +320,7 @@ export class WaAuthClient {
230
320
  }
231
321
  async updateCredentials(credentials) {
232
322
  this.logger.trace('auth client update credentials', {
233
- registered: credentials?.meJid !== null && credentials?.meJid !== undefined
323
+ registered: !!credentials?.meJid
234
324
  });
235
325
  this.credentials = credentials;
236
326
  await persistCredentials({
@@ -240,6 +330,11 @@ export class WaAuthClient {
240
330
  preKeyStore: this.preKeyStore
241
331
  }, credentials);
242
332
  }
333
+ requireConnected() {
334
+ if (this.isConnected && !this.isConnected()) {
335
+ throw new Error('client is not connected');
336
+ }
337
+ }
243
338
  requireCredentials() {
244
339
  if (!this.credentials) {
245
340
  throw new Error('credentials are not initialized');
@@ -2,7 +2,7 @@ import { randomBytesAsync, toRawPubKey, xeddsaVerify } from '../crypto/index.js'
2
2
  import { toSerializedPubKey } from '../crypto/core/keys.js';
3
3
  import { X25519 } from '../crypto/curves/X25519.js';
4
4
  import { getLoginIdentity } from '../protocol/jid.js';
5
- import { createAndStoreInitialKeys } from '../signal/registration/utils.js';
5
+ import { createAndStoreInitialKeys } from '../signal/index.js';
6
6
  import { WaMobileTcpSocketCtor } from '../transport/node/WaMobileTcpSocket.js';
7
7
  import { buildMobileLoginPayload } from '../transport/noise/WaMobileClientPayload.js';
8
8
  import { toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
@@ -48,7 +48,18 @@ function mobileTransportFromCredentials(credentials) {
48
48
  ...(credentials.memClass !== undefined ? { memClass: credentials.memClass } : {})
49
49
  };
50
50
  }
51
- export function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
51
+ async function resolveVersion(version) {
52
+ if (version === undefined)
53
+ return undefined;
54
+ if (typeof version === 'string')
55
+ return version;
56
+ const resolved = await version();
57
+ if (typeof resolved !== 'string' || resolved.length === 0) {
58
+ throw new Error('version resolver returned a non-string value');
59
+ }
60
+ return resolved;
61
+ }
62
+ export async function buildCommsConfig(logger, credentials, socketOptions, clientOptions) {
52
63
  const meJid = credentials.meJid;
53
64
  const registered = meJid !== null && meJid !== undefined;
54
65
  const loginIdentity = registered ? getLoginIdentity(meJid) : null;
@@ -70,10 +81,10 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
70
81
  });
71
82
  if (effectiveMobileTransport) {
72
83
  if (wsProxy) {
73
- throw new Error('mobileTransport does not support socketOptions.proxy.ws remove the proxy option or open an issue to add TCP proxy support');
84
+ throw new Error('mobileTransport does not support socketOptions.proxy.ws remove the proxy option or open an issue to add TCP proxy support');
74
85
  }
75
86
  if (!loginIdentity) {
76
- throw new Error('mobileTransport requires registered credentials (meJid) run the mobile bridge flow first');
87
+ throw new Error('mobileTransport requires registered credentials (meJid) run the mobile bridge flow first');
77
88
  }
78
89
  const loginPayload = buildMobileLoginPayload({
79
90
  username: loginIdentity.username,
@@ -104,6 +115,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
104
115
  }
105
116
  };
106
117
  }
118
+ const versionBase = await resolveVersion(clientOptions.version);
107
119
  return {
108
120
  url: socketOptions.url,
109
121
  urls: socketOptions.urls,
@@ -129,7 +141,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
129
141
  device: loginIdentity.device,
130
142
  deviceBrowser: clientOptions.deviceBrowser,
131
143
  deviceOsDisplayName: clientOptions.deviceOsDisplayName,
132
- versionBase: clientOptions.version
144
+ versionBase
133
145
  }
134
146
  : undefined,
135
147
  registrationPayloadConfig: !loginIdentity
@@ -139,7 +151,7 @@ export function buildCommsConfig(logger, credentials, socketOptions, clientOptio
139
151
  deviceBrowser: clientOptions.deviceBrowser,
140
152
  deviceOsDisplayName: clientOptions.deviceOsDisplayName,
141
153
  requireFullSync: clientOptions.requireFullSync,
142
- versionBase: clientOptions.version
154
+ versionBase
143
155
  }
144
156
  : undefined
145
157
  }
@@ -4,11 +4,11 @@ import { proto } from '../../proto.js';
4
4
  import { getWaBrowserDisplayName } from '../../protocol/browser.js';
5
5
  import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
6
6
  import { parsePhoneJid } from '../../protocol/jid.js';
7
- import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/crypto/WaAdvSignature.js';
7
+ import { ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, computeAdvIdentityHmac, generateDeviceSignature, verifyDeviceIdentityAccountSignature } from '../../signal/attestation/WaAdvSignature.js';
8
8
  import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
9
9
  import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
10
10
  import { decodeNodeContentUtf8OrBytes, findNodeChild, findNodeChildrenByTags, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.js';
11
- import { concatBytes, decodeProtoBytes, uint8Equal } from '../../util/bytes.js';
11
+ import { concatBytes, decodeProtoBytes, uint8Equal, uint8TimingSafeEqual } from '../../util/bytes.js';
12
12
  export class WaPairingFlow {
13
13
  constructor(options) {
14
14
  this.opts = options;
@@ -21,7 +21,7 @@ export class WaPairingFlow {
21
21
  this.opts.logger.trace('pairing flow session cleared');
22
22
  this.pairingSession = null;
23
23
  }
24
- async requestPairingCode(phoneNumber, shouldShowPushNotification = false, customCode) {
24
+ async requestPairingCode(phoneNumber, shouldShowPushNotification = true, customCode) {
25
25
  this.opts.logger.info('requesting pairing code', {
26
26
  shouldShowPushNotification,
27
27
  hasCustomCode: customCode !== undefined
@@ -65,7 +65,7 @@ export class WaPairingFlow {
65
65
  finished: false
66
66
  };
67
67
  this.opts.callbacks.emitPairingCode(companionHello.pairingCode);
68
- this.opts.logger.info('pairing code emitted', {
68
+ this.opts.logger.debug('pairing code emitted', {
69
69
  phoneJid,
70
70
  createdAtSeconds: this.pairingSession.createdAtSeconds
71
71
  });
@@ -83,21 +83,19 @@ export class WaPairingFlow {
83
83
  return iso;
84
84
  }
85
85
  async handleIncomingIqSet(node) {
86
- this.opts.logger.trace('pairing flow received iq:set', {
87
- id: node.attrs.id,
88
- from: node.attrs.from
89
- });
86
+ const iqLogger = this.opts.logger.child({ id: node.attrs.id });
87
+ iqLogger.trace('pairing flow received iq:set', { from: node.attrs.from });
90
88
  const firstChild = getFirstNodeChild(node);
91
89
  if (!firstChild) {
92
90
  return false;
93
91
  }
94
92
  if (firstChild.tag === WA_NODE_TAGS.PAIR_DEVICE) {
95
- this.opts.logger.debug('handling pair-device stanza', { id: node.attrs.id });
93
+ iqLogger.debug('handling pair-device stanza');
96
94
  await this.handlePairDevice(node, firstChild);
97
95
  return true;
98
96
  }
99
97
  if (firstChild.tag === WA_NODE_TAGS.PAIR_SUCCESS) {
100
- this.opts.logger.debug('handling pair-success stanza', { id: node.attrs.id });
98
+ iqLogger.debug('handling pair-success stanza');
101
99
  await this.handlePairSuccess(node, firstChild);
102
100
  return true;
103
101
  }
@@ -124,7 +122,7 @@ export class WaPairingFlow {
124
122
  }
125
123
  const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'refresh_code.link_code_pairing_ref');
126
124
  if (uint8Equal(ref, this.pairingSession.ref)) {
127
- this.opts.logger.info('received pairing refresh notification', {
125
+ this.opts.logger.debug('received pairing refresh notification', {
128
126
  forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
129
127
  });
130
128
  this.opts.callbacks.emitPairingRefresh(linkCodeNode.attrs.force_manual_refresh === 'true');
@@ -150,7 +148,7 @@ export class WaPairingFlow {
150
148
  node,
151
149
  typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
152
150
  }));
153
- this.opts.logger.info('handled companion_reg_refresh notification');
151
+ this.opts.logger.debug('handled companion_reg_refresh notification');
154
152
  this.opts.qrFlow.refreshCurrentQr();
155
153
  return true;
156
154
  }
@@ -160,10 +158,10 @@ export class WaPairingFlow {
160
158
  await this.rotateAdvSecret(this.requireCredentials());
161
159
  await this.opts.socket.sendNode(buildIqResultNode(iqNode));
162
160
  this.opts.qrFlow.setRefs(refs);
163
- this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
161
+ this.opts.logger.debug('pair-device refs updated', { refsCount: refs.length });
164
162
  }
165
163
  async handlePairSuccess(iqNode, pairSuccessNode) {
166
- this.opts.logger.info('processing pair-success node');
164
+ this.opts.logger.debug('processing pair-success node');
167
165
  const credentials = this.requireCredentials();
168
166
  const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
169
167
  if (!deviceIdentityNode || !deviceNode || !platformNode) {
@@ -183,13 +181,18 @@ export class WaPairingFlow {
183
181
  const hmacInput = isHosted
184
182
  ? concatBytes([ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
185
183
  : wrappedDetails;
186
- const expectedHmac = await computeAdvIdentityHmac(credentials.advSecretKey, hmacInput);
187
- if (!uint8Equal(expectedHmac, wrappedHmac)) {
188
- this.opts.logger.error('pair-success hmac mismatch');
184
+ const expectedHmac = computeAdvIdentityHmac(credentials.advSecretKey, hmacInput);
185
+ if (!uint8TimingSafeEqual(expectedHmac, wrappedHmac)) {
186
+ this.opts.logger.error('pair-success hmac mismatch', {
187
+ meJid: deviceNode.attrs.jid,
188
+ meLid: deviceNode.attrs.lid,
189
+ platform: platformNode.attrs.name,
190
+ isHosted
191
+ });
189
192
  throw new Error('pair-success HMAC validation failed');
190
193
  }
191
194
  }
192
- const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted);
195
+ const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails);
193
196
  const nextCredentials = {
194
197
  ...credentials,
195
198
  signedIdentity,
@@ -230,21 +233,25 @@ export class WaPairingFlow {
230
233
  this.opts.callbacks.emitPaired(nextCredentials);
231
234
  this.opts.logger.debug('pair-success completed and paired event emitted');
232
235
  }
233
- async buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted) {
236
+ async buildPairSuccessResponseIdentity(credentials, wrappedDetails) {
234
237
  const signedIdentity = proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
235
238
  const details = decodeProtoBytes(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
236
239
  const accountSignature = decodeProtoBytes(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
237
240
  const accountSignatureKey = decodeProtoBytes(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
238
241
  const localIdentity = credentials.registrationInfo.identityKeyPair;
242
+ const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
243
+ const isDeviceHosted = advDeviceIdentity.deviceType === proto.ADVEncryptionType.HOSTED;
239
244
  if (this.opts.dangerous?.disableAdvSignatureVerification !== true) {
240
- const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isHosted);
245
+ const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isDeviceHosted);
241
246
  if (!validAccountSignature) {
242
- this.opts.logger.error('pair-success account signature invalid');
247
+ this.opts.logger.error('pair-success account signature invalid', {
248
+ keyIndex: advDeviceIdentity.keyIndex ?? 0,
249
+ isDeviceHosted
250
+ });
243
251
  throw new Error('pair-success account signature validation failed');
244
252
  }
245
253
  }
246
- signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, isHosted);
247
- const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
254
+ signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, false);
248
255
  const responseIdentityBytes = proto.ADVSignedDeviceIdentity.encode({
249
256
  details: signedIdentity.details,
250
257
  accountSignature: signedIdentity.accountSignature,
@@ -280,7 +287,9 @@ export class WaPairingFlow {
280
287
  }
281
288
  const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'primary_hello.link_code_pairing_ref');
282
289
  if (!pairingSession.ref || !uint8Equal(ref, pairingSession.ref)) {
283
- this.opts.logger.warn('primary_hello ref mismatch ignored');
290
+ this.opts.logger.warn('primary_hello ref mismatch ignored', {
291
+ phoneJid: pairingSession.phoneJid
292
+ });
284
293
  return;
285
294
  }
286
295
  const nowSeconds = Math.floor(Date.now() / 1000);
@@ -309,7 +318,7 @@ export class WaPairingFlow {
309
318
  advSecretKey: finish.advSecret
310
319
  });
311
320
  pairingSession.finished = true;
312
- this.opts.logger.info('primary_hello completed with companion_finish success');
321
+ this.opts.logger.debug('primary_hello completed with companion_finish success');
313
322
  }
314
323
  async rotateAdvSecret(credentials) {
315
324
  const nextCredentials = {
@@ -1,9 +1,10 @@
1
- import { aesCtrDecrypt, aesCtrEncrypt, aesGcmEncrypt, hkdf, importAesGcmKey, pbkdf2DeriveAesCtrKey, randomBytesAsync } from '../../crypto/index.js';
1
+ import { aesCtrDecrypt, aesCtrEncrypt, aesGcmEncrypt, hkdf, pbkdf2Sha256, randomBytesAsync } from '../../crypto/index.js';
2
2
  import { X25519 } from '../../crypto/curves/X25519.js';
3
3
  import { WA_PAIRING_KDF_INFO } from '../../protocol/constants.js';
4
4
  import { concatBytes, TEXT_ENCODER } from '../../util/bytes.js';
5
- export const CROCKFORD_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTVWXYZ';
5
+ const CROCKFORD_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTVWXYZ';
6
6
  export const PBKDF2_ITERATIONS = 2 << 16;
7
+ const PAIRING_AES_KEY_BYTES = 32;
7
8
  function bytesToCrockford(bytes) {
8
9
  let bitCount = 0;
9
10
  let value = 0;
@@ -42,8 +43,8 @@ export async function createCompanionHello(options = {}) {
42
43
  normalizedCustomCode !== null ? Promise.resolve(null) : randomBytesAsync(5)
43
44
  ]);
44
45
  const pairingCode = normalizedCustomCode ?? bytesToCrockford(codeBytes);
45
- const cipher = await pbkdf2DeriveAesCtrKey(TEXT_ENCODER.encode(pairingCode), salt, PBKDF2_ITERATIONS);
46
- const encrypted = await aesCtrEncrypt(cipher, counter, companionEphemeralKeyPair.pubKey);
46
+ const cipherKey = await pbkdf2Sha256(TEXT_ENCODER.encode(pairingCode), salt, PBKDF2_ITERATIONS, PAIRING_AES_KEY_BYTES);
47
+ const encrypted = aesCtrEncrypt(cipherKey, counter, companionEphemeralKeyPair.pubKey);
47
48
  return {
48
49
  pairingCode,
49
50
  companionEphemeralKeyPair,
@@ -54,31 +55,28 @@ export async function completeCompanionFinish(args) {
54
55
  if (args.wrappedPrimaryEphemeralPub.length <= 48) {
55
56
  throw new Error('invalid wrapped primary payload');
56
57
  }
57
- const pairingCipher = await pbkdf2DeriveAesCtrKey(TEXT_ENCODER.encode(args.pairingCode), args.wrappedPrimaryEphemeralPub.subarray(0, 32), PBKDF2_ITERATIONS);
58
- const primaryEphemeralPub = await aesCtrDecrypt(pairingCipher, args.wrappedPrimaryEphemeralPub.subarray(32, 48), args.wrappedPrimaryEphemeralPub.subarray(48));
58
+ const pairingCipherKey = await pbkdf2Sha256(TEXT_ENCODER.encode(args.pairingCode), args.wrappedPrimaryEphemeralPub.subarray(0, 32), PBKDF2_ITERATIONS, PAIRING_AES_KEY_BYTES);
59
+ const primaryEphemeralPub = aesCtrDecrypt(pairingCipherKey, args.wrappedPrimaryEphemeralPub.subarray(32, 48), args.wrappedPrimaryEphemeralPub.subarray(48));
59
60
  if (primaryEphemeralPub.length === 0) {
60
61
  throw new Error('empty primary ephemeral public key');
61
62
  }
62
- const [sharedEphemeral, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
63
+ const [sharedEphemeral, sharedIdentity, bundleSalt, bundleSecret, bundleIv] = await Promise.all([
63
64
  X25519.scalarMult(args.companionEphemeralPrivKey, primaryEphemeralPub),
65
+ X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub),
64
66
  randomBytesAsync(32),
65
67
  randomBytesAsync(32),
66
68
  randomBytesAsync(12)
67
69
  ]);
68
- const bundleEncryptionKeyRaw = await hkdf(sharedEphemeral, bundleSalt, WA_PAIRING_KDF_INFO.LINK_CODE_BUNDLE, 32);
69
- const bundleEncryptionKey = await importAesGcmKey(bundleEncryptionKeyRaw, ['encrypt']);
70
+ const bundleEncryptionKey = hkdf(sharedEphemeral, bundleSalt, WA_PAIRING_KDF_INFO.LINK_CODE_BUNDLE, 32);
70
71
  const plaintextBundle = concatBytes([
71
72
  args.registrationIdentityKeyPair.pubKey,
72
73
  args.primaryIdentityPub,
73
74
  bundleSecret
74
75
  ]);
75
- const [encryptedBundle, sharedIdentity] = await Promise.all([
76
- aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle),
77
- X25519.scalarMult(args.registrationIdentityKeyPair.privKey, args.primaryIdentityPub)
78
- ]);
76
+ const encryptedBundle = aesGcmEncrypt(bundleEncryptionKey, bundleIv, plaintextBundle);
79
77
  const wrappedKeyBundle = concatBytes([bundleSalt, bundleIv, encryptedBundle]);
80
78
  const advMaterial = concatBytes([sharedEphemeral, sharedIdentity, bundleSecret]);
81
- const advSecret = await hkdf(advMaterial, null, WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
79
+ const advSecret = hkdf(advMaterial, null, WA_PAIRING_KDF_INFO.ADV_SECRET, 32);
82
80
  return {
83
81
  wrappedKeyBundle,
84
82
  companionIdentityPublic: args.registrationIdentityKeyPair.pubKey,