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
@@ -1,12 +1,22 @@
1
- import { buildCommsConfig, loadOrCreateCredentials, persistCredentials } from './flow/WaAuthCredentialsFlow.js';
1
+ import { buildCommsConfig, loadOrCreateCredentials, persistCredentials } from './credentials-flow.js';
2
2
  import { WaPairingFlow } from './pairing/WaPairingFlow.js';
3
3
  import { WaQrFlow } from './pairing/WaQrFlow.js';
4
4
  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,
@@ -24,6 +34,8 @@ export class WaAuthClient {
24
34
  this.callbacks = deps.callbacks ?? {};
25
35
  this.authStore = deps.authStore;
26
36
  this.signalStore = deps.signalStore;
37
+ this.preKeyStore = deps.preKeyStore;
38
+ this.isConnected = deps.isConnected;
27
39
  this.credentials = null;
28
40
  this.qrFlow = new WaQrFlow({
29
41
  logger: this.logger,
@@ -44,9 +56,14 @@ export class WaAuthClient {
44
56
  emitPairingCode: (code) => this.callbacks.onPairingCode?.(code),
45
57
  emitPairingRefresh: (forceManual) => this.callbacks.onPairingRefresh?.(forceManual),
46
58
  emitPaired: (credentials) => this.callbacks.onPaired?.(credentials)
47
- }
59
+ },
60
+ dangerous: options.dangerous
48
61
  });
49
62
  }
63
+ /**
64
+ * Returns a snapshot of auth readiness flags (connection, registration,
65
+ * pending QR/pairing prompts).
66
+ */
50
67
  getState(connected = false) {
51
68
  return {
52
69
  connected,
@@ -55,16 +72,23 @@ export class WaAuthClient {
55
72
  hasPairingCode: this.pairingFlow.hasPairingSession()
56
73
  };
57
74
  }
75
+ /** Returns the currently-loaded credentials, or `null` before initialization. */
58
76
  getCurrentCredentials() {
59
77
  return this.credentials;
60
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
+ */
61
83
  async loadOrCreateCredentials() {
62
84
  return this.runHandled(async () => {
63
85
  this.logger.debug('auth client loadOrCreateCredentials start');
64
86
  this.credentials = await loadOrCreateCredentials({
65
87
  logger: this.logger,
66
88
  authStore: this.authStore,
67
- signalStore: this.signalStore
89
+ signalStore: this.signalStore,
90
+ preKeyStore: this.preKeyStore,
91
+ skipSignedPreKeySignatureVerification: this.options.dangerous?.disableSignedPreKeySignatureVerification
68
92
  });
69
93
  this.logger.info('auth client credentials ready', {
70
94
  registered: this.credentials?.meJid !== null && this.credentials?.meJid !== undefined
@@ -72,25 +96,56 @@ export class WaAuthClient {
72
96
  return this.credentials;
73
97
  });
74
98
  }
75
- buildCommsConfig(socketOptions) {
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 = {}) {
76
104
  this.logger.trace('auth client building comms config');
105
+ const override = this.versionOverride;
106
+ this.versionOverride = null;
77
107
  return buildCommsConfig(this.logger, this.requireCredentials(), socketOptions, {
78
108
  deviceBrowser: this.options.deviceBrowser,
79
109
  deviceOsDisplayName: this.options.deviceOsDisplayName,
80
110
  requireFullSync: this.options.requireFullSync,
81
- version: this.options.version
111
+ version: override ?? this.options.version,
112
+ mobileTransport: this.options.mobileTransport,
113
+ noiseTrustedRootCa: overrides.noiseTrustedRootCa,
114
+ disableNoiseCertificateChainVerification: overrides.disableNoiseCertificateChainVerification ??
115
+ this.options.dangerous?.disableNoiseCertificateChainVerification
82
116
  });
83
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
84
130
  async clearTransientState() {
85
131
  this.logger.trace('auth client clear transient state');
86
132
  this.qrFlow.clear();
87
133
  this.pairingFlow.clearSession();
88
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
+ */
89
143
  async clearStoredCredentials() {
90
144
  this.logger.warn('auth client clearing stored credentials');
91
145
  this.credentials = null;
92
146
  await Promise.all([this.authStore.clear(), this.clearTransientState()]);
93
147
  }
148
+ /** Stores the server's noise static key for subsequent handshakes. */
94
149
  async persistServerStaticKey(serverStaticKey) {
95
150
  this.logger.debug('persisting server static key', {
96
151
  keyLength: serverStaticKey.byteLength
@@ -100,6 +155,7 @@ export class WaAuthClient {
100
155
  serverStaticKey
101
156
  }));
102
157
  }
158
+ /** Stores the "server holds prekeys" flag; persists only when the value changes. */
103
159
  async persistServerHasPreKeys(serverHasPreKeys) {
104
160
  await this.patchCredentials((credentials) => ({
105
161
  ...credentials,
@@ -113,6 +169,10 @@ export class WaAuthClient {
113
169
  }
114
170
  });
115
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
+ */
116
176
  async persistRoutingInfo(routingInfo) {
117
177
  this.logger.trace('persisting routing info', {
118
178
  byteLength: routingInfo.byteLength
@@ -130,6 +190,7 @@ export class WaAuthClient {
130
190
  }
131
191
  });
132
192
  }
193
+ /** Clears the persisted routing-info blob (used after a routing error). */
133
194
  async clearRoutingInfo() {
134
195
  return this.patchCredentials((credentials) => ({
135
196
  ...credentials,
@@ -141,6 +202,11 @@ export class WaAuthClient {
141
202
  }
142
203
  });
143
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
+ */
144
210
  async persistSuccessAttributes(attributes) {
145
211
  let persistDiff;
146
212
  const computeDiff = (current, next) => ({
@@ -177,24 +243,56 @@ export class WaAuthClient {
177
243
  }
178
244
  });
179
245
  }
180
- async requestPairingCode(phoneNumber, shouldShowPushNotification = false) {
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();
181
274
  this.requireCredentials();
182
- this.logger.info('auth client requesting pairing code');
183
- return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification));
275
+ this.logger.debug('auth client requesting pairing code');
276
+ return this.runHandled(() => this.pairingFlow.requestPairingCode(phoneNumber, shouldShowPushNotification, customCode));
184
277
  }
278
+ /** Fetches the ISO country code the server resolved for the current account. */
185
279
  async fetchPairingCountryCodeIso() {
280
+ this.requireConnected();
186
281
  this.requireCredentials();
187
282
  this.logger.trace('auth client fetching pairing country code ISO');
188
283
  return this.runHandled(() => this.pairingFlow.fetchPairingCountryCodeIso());
189
284
  }
285
+ /** Dispatcher: returns `true` when `node` is a pairing-related IQ-set we handled. */
190
286
  async handleIncomingIqSet(node) {
191
287
  this.logger.trace('auth client handleIncomingIqSet', { id: node.attrs.id });
192
288
  return this.runHandled(() => this.pairingFlow.handleIncomingIqSet(node));
193
289
  }
290
+ /** Dispatcher: returns `true` when `node` is a link-code companion notification. */
194
291
  async handleLinkCodeNotification(node) {
195
292
  this.logger.trace('auth client handleLinkCodeNotification', { id: node.attrs.id });
196
293
  return this.runHandled(() => this.pairingFlow.handleLinkCodeNotification(node));
197
294
  }
295
+ /** Dispatcher: returns `true` when `node` is a companion-registration refresh notification. */
198
296
  async handleCompanionRegRefreshNotification(node) {
199
297
  this.logger.trace('auth client handleCompanionRegRefreshNotification', {
200
298
  id: node.attrs.id
@@ -222,15 +320,21 @@ export class WaAuthClient {
222
320
  }
223
321
  async updateCredentials(credentials) {
224
322
  this.logger.trace('auth client update credentials', {
225
- registered: credentials?.meJid !== null && credentials?.meJid !== undefined
323
+ registered: !!credentials?.meJid
226
324
  });
227
325
  this.credentials = credentials;
228
326
  await persistCredentials({
229
327
  logger: this.logger,
230
328
  authStore: this.authStore,
231
- signalStore: this.signalStore
329
+ signalStore: this.signalStore,
330
+ preKeyStore: this.preKeyStore
232
331
  }, credentials);
233
332
  }
333
+ requireConnected() {
334
+ if (this.isConnected && !this.isConnected()) {
335
+ throw new Error('client is not connected');
336
+ }
337
+ }
234
338
  requireCredentials() {
235
339
  if (!this.credentials) {
236
340
  throw new Error('credentials are not initialized');
@@ -0,0 +1,202 @@
1
+ import { randomBytesAsync, toRawPubKey, xeddsaVerify } from '../crypto/index.js';
2
+ import { toSerializedPubKey } from '../crypto/core/keys.js';
3
+ import { X25519 } from '../crypto/curves/X25519.js';
4
+ import { getLoginIdentity } from '../protocol/jid.js';
5
+ import { createAndStoreInitialKeys } from '../signal/index.js';
6
+ import { WaMobileTcpSocketCtor } from '../transport/node/WaMobileTcpSocket.js';
7
+ import { buildMobileLoginPayload } from '../transport/noise/WaMobileClientPayload.js';
8
+ import { toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
9
+ import { toError } from '../util/primitives.js';
10
+ export async function loadOrCreateCredentials(args) {
11
+ args.logger.trace('auth credentials loadOrCreate start');
12
+ const existing = await args.authStore.load();
13
+ if (!existing) {
14
+ const credentials = await createFreshAndPersistCredentials(args);
15
+ args.logger.info('created fresh auth credentials');
16
+ return credentials;
17
+ }
18
+ args.logger.debug('auth credentials loaded from store', {
19
+ registered: existing.meJid !== null && existing.meJid !== undefined,
20
+ hasServerStaticKey: existing.serverStaticKey !== null && existing.serverStaticKey !== undefined
21
+ });
22
+ const skipSignedPreKeyCheck = args.skipSignedPreKeySignatureVerification === true;
23
+ if (!existing.meJid &&
24
+ !skipSignedPreKeyCheck &&
25
+ !(await hasValidSignedPreKey(args.logger, existing))) {
26
+ args.logger.warn('signed pre-key is invalid, regenerating credentials');
27
+ const fresh = await createFreshAndPersistCredentials(args);
28
+ args.logger.info('regenerated credentials due to invalid signed pre-key');
29
+ return fresh;
30
+ }
31
+ await restoreSignalStore(args.signalStore, args.preKeyStore, existing);
32
+ args.logger.trace('auth credentials restored into signal store');
33
+ return existing;
34
+ }
35
+ export async function persistCredentials(args, credentials) {
36
+ args.logger.trace('persisting auth credentials', {
37
+ registered: credentials.meJid !== null && credentials.meJid !== undefined
38
+ });
39
+ await args.authStore.save(credentials);
40
+ }
41
+ function mobileTransportFromCredentials(credentials) {
42
+ if (!credentials.deviceInfo)
43
+ return undefined;
44
+ return {
45
+ deviceInfo: credentials.deviceInfo,
46
+ ...(credentials.pushName !== undefined ? { pushName: credentials.pushName } : {}),
47
+ ...(credentials.yearClass !== undefined ? { yearClass: credentials.yearClass } : {}),
48
+ ...(credentials.memClass !== undefined ? { memClass: credentials.memClass } : {})
49
+ };
50
+ }
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) {
63
+ const meJid = credentials.meJid;
64
+ const registered = meJid !== null && meJid !== undefined;
65
+ const loginIdentity = registered ? getLoginIdentity(meJid) : null;
66
+ const wsProxy = socketOptions.proxy?.ws;
67
+ // Resolve the effective mobile transport: explicit option wins, otherwise
68
+ // synthesize one from persisted credentials.deviceInfo so a registered
69
+ // mobile session boots in mobile mode without the caller re-passing
70
+ // deviceInfo on every `new WaClient(...)` call.
71
+ const effectiveMobileTransport = clientOptions.mobileTransport ?? mobileTransportFromCredentials(credentials);
72
+ logger.debug('building comms config from credentials', {
73
+ registered,
74
+ hasServerStaticKey: credentials.serverStaticKey !== null && credentials.serverStaticKey !== undefined,
75
+ mobile: Boolean(effectiveMobileTransport),
76
+ mobileSource: clientOptions.mobileTransport
77
+ ? 'option'
78
+ : effectiveMobileTransport
79
+ ? 'credentials'
80
+ : 'none'
81
+ });
82
+ if (effectiveMobileTransport) {
83
+ if (wsProxy) {
84
+ throw new Error('mobileTransport does not support socketOptions.proxy.ws – remove the proxy option or open an issue to add TCP proxy support');
85
+ }
86
+ if (!loginIdentity) {
87
+ throw new Error('mobileTransport requires registered credentials (meJid) – run the mobile bridge flow first');
88
+ }
89
+ const loginPayload = buildMobileLoginPayload({
90
+ username: loginIdentity.username,
91
+ device: loginIdentity.device,
92
+ passive: effectiveMobileTransport.passive ?? false,
93
+ deviceInfo: effectiveMobileTransport.deviceInfo,
94
+ pushName: effectiveMobileTransport.pushName,
95
+ yearClass: effectiveMobileTransport.yearClass,
96
+ memClass: effectiveMobileTransport.memClass
97
+ });
98
+ return {
99
+ url: effectiveMobileTransport.tcpUrl ?? 'tcp://g.whatsapp.net:443',
100
+ rawWebSocketConstructor: WaMobileTcpSocketCtor,
101
+ connectTimeoutMs: socketOptions.connectTimeoutMs,
102
+ reconnectIntervalMs: socketOptions.reconnectIntervalMs,
103
+ timeoutIntervalMs: socketOptions.timeoutIntervalMs,
104
+ maxReconnectAttempts: socketOptions.maxReconnectAttempts,
105
+ noise: {
106
+ clientStaticKeyPair: credentials.noiseKeyPair,
107
+ isRegistered: true,
108
+ serverStaticKey: credentials.serverStaticKey,
109
+ routingInfo: credentials.routingInfo,
110
+ trustedRootCa: clientOptions.noiseTrustedRootCa,
111
+ verifyCertificateChain: clientOptions.disableNoiseCertificateChainVerification
112
+ ? false
113
+ : undefined,
114
+ loginPayload
115
+ }
116
+ };
117
+ }
118
+ const versionBase = await resolveVersion(clientOptions.version);
119
+ return {
120
+ url: socketOptions.url,
121
+ urls: socketOptions.urls,
122
+ protocols: socketOptions.protocols,
123
+ dispatcher: toProxyDispatcher(wsProxy),
124
+ agent: toProxyAgent(wsProxy),
125
+ connectTimeoutMs: socketOptions.connectTimeoutMs,
126
+ reconnectIntervalMs: socketOptions.reconnectIntervalMs,
127
+ timeoutIntervalMs: socketOptions.timeoutIntervalMs,
128
+ maxReconnectAttempts: socketOptions.maxReconnectAttempts,
129
+ noise: {
130
+ clientStaticKeyPair: credentials.noiseKeyPair,
131
+ isRegistered: registered,
132
+ serverStaticKey: credentials.serverStaticKey,
133
+ routingInfo: credentials.routingInfo,
134
+ trustedRootCa: clientOptions.noiseTrustedRootCa,
135
+ verifyCertificateChain: clientOptions.disableNoiseCertificateChainVerification
136
+ ? false
137
+ : undefined,
138
+ loginPayloadConfig: loginIdentity
139
+ ? {
140
+ username: loginIdentity.username,
141
+ device: loginIdentity.device,
142
+ deviceBrowser: clientOptions.deviceBrowser,
143
+ deviceOsDisplayName: clientOptions.deviceOsDisplayName,
144
+ versionBase
145
+ }
146
+ : undefined,
147
+ registrationPayloadConfig: !loginIdentity
148
+ ? {
149
+ registrationInfo: credentials.registrationInfo,
150
+ signedPreKey: credentials.signedPreKey,
151
+ deviceBrowser: clientOptions.deviceBrowser,
152
+ deviceOsDisplayName: clientOptions.deviceOsDisplayName,
153
+ requireFullSync: clientOptions.requireFullSync,
154
+ versionBase
155
+ }
156
+ : undefined
157
+ }
158
+ };
159
+ }
160
+ async function createFreshCredentials(signalStore, preKeyStore, logger) {
161
+ logger.trace('creating fresh credentials');
162
+ const [noiseKeyPair, registrationBundle, advSecretKey] = await Promise.all([
163
+ X25519.generateKeyPair(),
164
+ createAndStoreInitialKeys(signalStore, preKeyStore),
165
+ randomBytesAsync(32)
166
+ ]);
167
+ return {
168
+ noiseKeyPair,
169
+ registrationInfo: registrationBundle.registrationInfo,
170
+ signedPreKey: registrationBundle.signedPreKey,
171
+ serverHasPreKeys: false,
172
+ advSecretKey
173
+ };
174
+ }
175
+ async function createFreshAndPersistCredentials(args) {
176
+ const credentials = await createFreshCredentials(args.signalStore, args.preKeyStore, args.logger);
177
+ // Persist credentials first so signal restore never commits state for credentials that failed to save.
178
+ await args.authStore.save(credentials);
179
+ await restoreSignalStore(args.signalStore, args.preKeyStore, credentials);
180
+ return credentials;
181
+ }
182
+ async function hasValidSignedPreKey(logger, credentials) {
183
+ try {
184
+ const serializedPubKey = toSerializedPubKey(credentials.signedPreKey.keyPair.pubKey);
185
+ const valid = await xeddsaVerify(toRawPubKey(credentials.registrationInfo.identityKeyPair.pubKey), serializedPubKey, credentials.signedPreKey.signature);
186
+ logger.trace('signed pre-key validation completed', { valid });
187
+ return valid;
188
+ }
189
+ catch (error) {
190
+ logger.warn('signed pre-key validation failed with exception', {
191
+ message: toError(error).message
192
+ });
193
+ return false;
194
+ }
195
+ }
196
+ async function restoreSignalStore(signalStore, preKeyStore, credentials) {
197
+ await Promise.all([
198
+ signalStore.setRegistrationInfo(credentials.registrationInfo),
199
+ signalStore.setSignedPreKey(credentials.signedPreKey),
200
+ preKeyStore.setServerHasPreKeys(credentials.serverHasPreKeys === true)
201
+ ]);
202
+ }
@@ -1,14 +1,14 @@
1
- import { completeCompanionFinish, createCompanionHello } from '../pairing/WaPairingCodeCrypto.js';
1
+ import { completeCompanionFinish, createCompanionHello, normalizeCustomPairingCode } from '../pairing/pairing-code-crypto.js';
2
2
  import { randomBytesAsync } from '../../crypto/index.js';
3
3
  import { proto } from '../../proto.js';
4
+ import { getWaBrowserDisplayName } from '../../protocol/browser.js';
4
5
  import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_SIGNALING } from '../../protocol/constants.js';
5
6
  import { parsePhoneJid } from '../../protocol/jid.js';
6
- 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';
7
8
  import { buildAckNode, buildIqResultNode } from '../../transport/node/builders/global.js';
8
9
  import { buildCompanionFinishRequestNode, buildCompanionHelloRequestNode, buildGetCountryCodeRequestNode } from '../../transport/node/builders/pairing.js';
9
- import { decodeNodeContentUtf8OrBytes, findNodeChildrenByTags, findNodeChild, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.js';
10
- import { decodeProtoBytes } from '../../util/bytes.js';
11
- import { concatBytes, uint8Equal } from '../../util/bytes.js';
10
+ import { decodeNodeContentUtf8OrBytes, findNodeChild, findNodeChildrenByTags, getFirstNodeChild, getNodeChildrenNonEmptyUtf8ByTag, hasNodeChild } from '../../transport/node/helpers.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,26 +21,19 @@ 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) {
24
+ async requestPairingCode(phoneNumber, shouldShowPushNotification = true, customCode) {
25
25
  this.opts.logger.info('requesting pairing code', {
26
- shouldShowPushNotification
26
+ shouldShowPushNotification,
27
+ hasCustomCode: customCode !== undefined
27
28
  });
29
+ const normalizedCustomCode = customCode !== undefined ? normalizeCustomPairingCode(customCode) : undefined;
28
30
  const credentials = this.requireCredentials();
29
31
  const phoneJid = parsePhoneJid(phoneNumber);
30
32
  const [companionHello, refreshedCredentials] = await Promise.all([
31
- createCompanionHello(),
33
+ createCompanionHello({ customCode: normalizedCustomCode }),
32
34
  this.rotateAdvSecret(credentials)
33
35
  ]);
34
- const browser = this.opts.device.browser;
35
- const browserDisplayName = {
36
- chrome: 'Chrome',
37
- firefox: 'Firefox',
38
- ie: 'IE',
39
- opera: 'Opera',
40
- safari: 'Safari',
41
- edge: 'Edge',
42
- chromium: 'Chromium'
43
- }[browser.trim().toLowerCase()] ?? browser;
36
+ const browserDisplayName = getWaBrowserDisplayName(this.opts.device.browser);
44
37
  const response = await this.opts.socket.query(buildCompanionHelloRequestNode({
45
38
  phoneJid,
46
39
  shouldShowPushNotification,
@@ -72,7 +65,7 @@ export class WaPairingFlow {
72
65
  finished: false
73
66
  };
74
67
  this.opts.callbacks.emitPairingCode(companionHello.pairingCode);
75
- this.opts.logger.info('pairing code emitted', {
68
+ this.opts.logger.debug('pairing code emitted', {
76
69
  phoneJid,
77
70
  createdAtSeconds: this.pairingSession.createdAtSeconds
78
71
  });
@@ -90,21 +83,19 @@ export class WaPairingFlow {
90
83
  return iso;
91
84
  }
92
85
  async handleIncomingIqSet(node) {
93
- this.opts.logger.trace('pairing flow received iq:set', {
94
- id: node.attrs.id,
95
- from: node.attrs.from
96
- });
86
+ const iqLogger = this.opts.logger.child({ id: node.attrs.id });
87
+ iqLogger.trace('pairing flow received iq:set', { from: node.attrs.from });
97
88
  const firstChild = getFirstNodeChild(node);
98
89
  if (!firstChild) {
99
90
  return false;
100
91
  }
101
92
  if (firstChild.tag === WA_NODE_TAGS.PAIR_DEVICE) {
102
- this.opts.logger.debug('handling pair-device stanza', { id: node.attrs.id });
93
+ iqLogger.debug('handling pair-device stanza');
103
94
  await this.handlePairDevice(node, firstChild);
104
95
  return true;
105
96
  }
106
97
  if (firstChild.tag === WA_NODE_TAGS.PAIR_SUCCESS) {
107
- this.opts.logger.debug('handling pair-success stanza', { id: node.attrs.id });
98
+ iqLogger.debug('handling pair-success stanza');
108
99
  await this.handlePairSuccess(node, firstChild);
109
100
  return true;
110
101
  }
@@ -131,7 +122,7 @@ export class WaPairingFlow {
131
122
  }
132
123
  const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'refresh_code.link_code_pairing_ref');
133
124
  if (uint8Equal(ref, this.pairingSession.ref)) {
134
- this.opts.logger.info('received pairing refresh notification', {
125
+ this.opts.logger.debug('received pairing refresh notification', {
135
126
  forceManualRefresh: linkCodeNode.attrs.force_manual_refresh === 'true'
136
127
  });
137
128
  this.opts.callbacks.emitPairingRefresh(linkCodeNode.attrs.force_manual_refresh === 'true');
@@ -157,7 +148,7 @@ export class WaPairingFlow {
157
148
  node,
158
149
  typeOverride: WA_SIGNALING.COMPANION_REG_REFRESH_NOTIFICATION
159
150
  }));
160
- this.opts.logger.info('handled companion_reg_refresh notification');
151
+ this.opts.logger.debug('handled companion_reg_refresh notification');
161
152
  this.opts.qrFlow.refreshCurrentQr();
162
153
  return true;
163
154
  }
@@ -167,10 +158,10 @@ export class WaPairingFlow {
167
158
  await this.rotateAdvSecret(this.requireCredentials());
168
159
  await this.opts.socket.sendNode(buildIqResultNode(iqNode));
169
160
  this.opts.qrFlow.setRefs(refs);
170
- this.opts.logger.info('pair-device refs updated', { refsCount: refs.length });
161
+ this.opts.logger.debug('pair-device refs updated', { refsCount: refs.length });
171
162
  }
172
163
  async handlePairSuccess(iqNode, pairSuccessNode) {
173
- this.opts.logger.info('processing pair-success node');
164
+ this.opts.logger.debug('processing pair-success node');
174
165
  const credentials = this.requireCredentials();
175
166
  const [deviceIdentityNode, deviceNode, platformNode] = findNodeChildrenByTags(pairSuccessNode, [WA_NODE_TAGS.DEVICE_IDENTITY, 'device', WA_NODE_TAGS.PLATFORM]);
176
167
  if (!deviceIdentityNode || !deviceNode || !platformNode) {
@@ -186,15 +177,22 @@ export class WaPairingFlow {
186
177
  const wrappedHmac = decodeProtoBytes(wrappedIdentity.hmac, 'ADVSignedDeviceIdentityHMAC.hmac');
187
178
  const accountType = wrappedIdentity.accountType ?? proto.ADVEncryptionType.E2EE;
188
179
  const isHosted = accountType === proto.ADVEncryptionType.HOSTED;
189
- const hmacInput = isHosted
190
- ? concatBytes([ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
191
- : wrappedDetails;
192
- const expectedHmac = await computeAdvIdentityHmac(credentials.advSecretKey, hmacInput);
193
- if (!uint8Equal(expectedHmac, wrappedHmac)) {
194
- this.opts.logger.error('pair-success hmac mismatch');
195
- throw new Error('pair-success HMAC validation failed');
180
+ if (this.opts.dangerous?.disablePairSuccessHmacVerification !== true) {
181
+ const hmacInput = isHosted
182
+ ? concatBytes([ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, wrappedDetails])
183
+ : wrappedDetails;
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
+ });
192
+ throw new Error('pair-success HMAC validation failed');
193
+ }
196
194
  }
197
- const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted);
195
+ const { signedIdentity, keyIndex, responseIdentityBytes } = await this.buildPairSuccessResponseIdentity(credentials, wrappedDetails);
198
196
  const nextCredentials = {
199
197
  ...credentials,
200
198
  signedIdentity,
@@ -235,19 +233,25 @@ export class WaPairingFlow {
235
233
  this.opts.callbacks.emitPaired(nextCredentials);
236
234
  this.opts.logger.debug('pair-success completed and paired event emitted');
237
235
  }
238
- async buildPairSuccessResponseIdentity(credentials, wrappedDetails, isHosted) {
236
+ async buildPairSuccessResponseIdentity(credentials, wrappedDetails) {
239
237
  const signedIdentity = proto.ADVSignedDeviceIdentity.decode(wrappedDetails);
240
238
  const details = decodeProtoBytes(signedIdentity.details, 'ADVSignedDeviceIdentity.details');
241
239
  const accountSignature = decodeProtoBytes(signedIdentity.accountSignature, 'ADVSignedDeviceIdentity.accountSignature');
242
240
  const accountSignatureKey = decodeProtoBytes(signedIdentity.accountSignatureKey, 'ADVSignedDeviceIdentity.accountSignatureKey');
243
241
  const localIdentity = credentials.registrationInfo.identityKeyPair;
244
- const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isHosted);
245
- if (!validAccountSignature) {
246
- this.opts.logger.error('pair-success account signature invalid');
247
- throw new Error('pair-success account signature validation failed');
248
- }
249
- signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, isHosted);
250
242
  const advDeviceIdentity = proto.ADVDeviceIdentity.decode(details);
243
+ const isDeviceHosted = advDeviceIdentity.deviceType === proto.ADVEncryptionType.HOSTED;
244
+ if (this.opts.dangerous?.disableAdvSignatureVerification !== true) {
245
+ const validAccountSignature = await verifyDeviceIdentityAccountSignature(details, accountSignature, localIdentity.pubKey, accountSignatureKey, isDeviceHosted);
246
+ if (!validAccountSignature) {
247
+ this.opts.logger.error('pair-success account signature invalid', {
248
+ keyIndex: advDeviceIdentity.keyIndex ?? 0,
249
+ isDeviceHosted
250
+ });
251
+ throw new Error('pair-success account signature validation failed');
252
+ }
253
+ }
254
+ signedIdentity.deviceSignature = await generateDeviceSignature(details, localIdentity, accountSignatureKey, false);
251
255
  const responseIdentityBytes = proto.ADVSignedDeviceIdentity.encode({
252
256
  details: signedIdentity.details,
253
257
  accountSignature: signedIdentity.accountSignature,
@@ -283,7 +287,9 @@ export class WaPairingFlow {
283
287
  }
284
288
  const ref = decodeNodeContentUtf8OrBytes(refNode.content, 'primary_hello.link_code_pairing_ref');
285
289
  if (!pairingSession.ref || !uint8Equal(ref, pairingSession.ref)) {
286
- this.opts.logger.warn('primary_hello ref mismatch ignored');
290
+ this.opts.logger.warn('primary_hello ref mismatch ignored', {
291
+ phoneJid: pairingSession.phoneJid
292
+ });
287
293
  return;
288
294
  }
289
295
  const nowSeconds = Math.floor(Date.now() / 1000);
@@ -312,7 +318,7 @@ export class WaPairingFlow {
312
318
  advSecretKey: finish.advSecret
313
319
  });
314
320
  pairingSession.finished = true;
315
- this.opts.logger.info('primary_hello completed with companion_finish success');
321
+ this.opts.logger.debug('primary_hello completed with companion_finish success');
316
322
  }
317
323
  async rotateAdvSecret(credentials) {
318
324
  const nextCredentials = {