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
@@ -1,5 +1,7 @@
1
- import { createIncomingBaseEvent, createIncomingFailureHandler, createIncomingGroupNotificationHandler, createIncomingNotificationHandler, createIncomingReceiptHandler, createIncomingRegistrationNotificationHandler, createInfoBulletinNotificationEvent, createUnhandledIncomingNodeEvent } from '../incoming.js';
2
- import { WA_IQ_TYPES, WA_MESSAGE_TAGS, WA_NODE_TAGS, WA_NOTIFICATION_TYPES, WA_SIGNALING } from '../../protocol/constants.js';
1
+ import { parseChatstateNode } from '../events/chatstate.js';
2
+ import { buildInboundAck, createIncomingBaseEvent, createIncomingBusinessNotificationHandler, createIncomingCallHandler, createIncomingFailureHandler, createIncomingGroupNotificationHandler, createIncomingNotificationHandler, createIncomingPictureNotificationHandler, createIncomingReceiptHandler, createIncomingRegistrationNotificationHandler, createInfoBulletinNotificationEvent, createUnhandledIncomingNodeEvent, sendSafeAck } from '../events/incoming.js';
3
+ import { parsePresenceNode } from '../events/presence.js';
4
+ import { WA_IQ_TYPES, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_NODE_TAGS, WA_NOTIFICATION_TYPES, WA_SIGNALING } from '../../protocol/constants.js';
3
5
  import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildren, getNodeChildrenByTag } from '../../transport/node/helpers.js';
4
6
  import { parseStreamControlNode, parseSuccessPersistAttributes } from '../../transport/stream/parse.js';
5
7
  import { parseOptionalInt, toError } from '../../util/primitives.js';
@@ -11,12 +13,14 @@ const INFO_BULLETIN_CHILD_TAGS = new Set([
11
13
  'thread_metadata',
12
14
  'client_expiration'
13
15
  ]);
16
+ const FILTER_PROTECTED_TAGS = new Set([WA_NODE_TAGS.SUCCESS, 'failure']);
14
17
  export class WaIncomingNodeCoordinator {
15
18
  constructor(options) {
16
19
  this.logger = options.logger;
17
20
  this.runtime = options.runtime;
18
21
  this.offlineResume = options.offlineResume;
19
22
  this.nodeHandlerRegistry = new Map();
23
+ this.stanzaFilters = [];
20
24
  this.registerDefaultIncomingHandlers();
21
25
  this.mediaConnWarmupPromise = null;
22
26
  }
@@ -34,6 +38,9 @@ export class WaIncomingNodeCoordinator {
34
38
  await this.runtime.handleStreamControlResult(streamControlResult);
35
39
  return;
36
40
  }
41
+ if (await this.applyStanzaFilters(node)) {
42
+ return;
43
+ }
37
44
  if (await this.handleSuccessNode(node)) {
38
45
  return;
39
46
  }
@@ -46,6 +53,46 @@ export class WaIncomingNodeCoordinator {
46
53
  }
47
54
  this.runtime.emitUnhandledIncomingNode(createUnhandledIncomingNodeEvent(node));
48
55
  }
56
+ registerIncomingStanzaFilter(filter) {
57
+ this.stanzaFilters.push(filter);
58
+ return () => {
59
+ const index = this.stanzaFilters.indexOf(filter);
60
+ if (index !== -1) {
61
+ this.stanzaFilters.splice(index, 1);
62
+ }
63
+ };
64
+ }
65
+ async applyStanzaFilters(node) {
66
+ if (this.stanzaFilters.length === 0 || FILTER_PROTECTED_TAGS.has(node.tag)) {
67
+ return false;
68
+ }
69
+ const filterLogger = this.logger.child({ tag: node.tag, id: node.attrs.id });
70
+ for (let i = 0; i < this.stanzaFilters.length; i += 1) {
71
+ let verdict;
72
+ try {
73
+ verdict = await this.stanzaFilters[i](node);
74
+ }
75
+ catch (error) {
76
+ filterLogger.warn('incoming stanza filter threw', {
77
+ message: toError(error).message
78
+ });
79
+ continue;
80
+ }
81
+ if (!verdict) {
82
+ continue;
83
+ }
84
+ filterLogger.trace('incoming stanza dropped by filter', {
85
+ type: node.attrs.type,
86
+ from: node.attrs.from
87
+ });
88
+ const ack = buildInboundAck(node);
89
+ if (ack) {
90
+ await sendSafeAck(this.logger, this.runtime.sendNode, ack);
91
+ }
92
+ return true;
93
+ }
94
+ return false;
95
+ }
49
96
  registerIncomingHandler(registration) {
50
97
  const handlersByTag = this.nodeHandlerRegistry.get(registration.tag);
51
98
  const entry = {
@@ -120,7 +167,8 @@ export class WaIncomingNodeCoordinator {
120
167
  return false;
121
168
  }
122
169
  isRetryReceiptType(type) {
123
- return type === 'retry' || type === 'enc_rekey_retry';
170
+ return (type === WA_MESSAGE_TYPES.RECEIPT_TYPE_RETRY ||
171
+ type === WA_MESSAGE_TYPES.RECEIPT_TYPE_ENC_REKEY_RETRY);
124
172
  }
125
173
  registerDefaultIncomingHandlers() {
126
174
  const runtime = this.runtime;
@@ -148,6 +196,26 @@ export class WaIncomingNodeCoordinator {
148
196
  emitUnhandledStanza: runtime.emitUnhandledIncomingNode
149
197
  })
150
198
  });
199
+ this.registerIncomingHandler({
200
+ tag: WA_NODE_TAGS.NOTIFICATION,
201
+ subtype: WA_NOTIFICATION_TYPES.BUSINESS,
202
+ handler: createIncomingBusinessNotificationHandler({
203
+ logger: this.logger,
204
+ sendNode: runtime.sendNode,
205
+ emitBusinessEvent: runtime.emitBusinessEvent,
206
+ emitUnhandledStanza: runtime.emitUnhandledIncomingNode
207
+ })
208
+ });
209
+ this.registerIncomingHandler({
210
+ tag: WA_NODE_TAGS.NOTIFICATION,
211
+ subtype: WA_NOTIFICATION_TYPES.PICTURE,
212
+ handler: createIncomingPictureNotificationHandler({
213
+ logger: this.logger,
214
+ sendNode: runtime.sendNode,
215
+ emitPictureEvent: runtime.emitPictureEvent,
216
+ emitUnhandledStanza: runtime.emitUnhandledIncomingNode
217
+ })
218
+ });
151
219
  this.registerIncomingHandler({
152
220
  tag: WA_NODE_TAGS.NOTIFICATION,
153
221
  subtype: WA_NOTIFICATION_TYPES.REGISTRATION,
@@ -164,6 +232,7 @@ export class WaIncomingNodeCoordinator {
164
232
  logger: this.logger,
165
233
  sendNode: runtime.sendNode,
166
234
  emitIncomingNotification: runtime.emitIncomingNotification,
235
+ emitMexNotification: runtime.emitMexNotification,
167
236
  emitUnhandledStanza: runtime.emitUnhandledIncomingNode,
168
237
  syncAppState: runtime.syncAppState
169
238
  })
@@ -183,28 +252,39 @@ export class WaIncomingNodeCoordinator {
183
252
  })
184
253
  });
185
254
  this.registerIncomingHandler({
186
- tag: 'presence',
255
+ tag: WA_NODE_TAGS.PRESENCE,
256
+ // eslint-disable-next-line @typescript-eslint/require-await
187
257
  handler: async (node) => {
188
- runtime.emitIncomingPresence(createIncomingBaseEvent(node));
258
+ runtime.emitIncomingPresence({
259
+ ...createIncomingBaseEvent(node),
260
+ ...parsePresenceNode(node)
261
+ });
189
262
  return true;
190
263
  }
191
264
  });
192
265
  this.registerIncomingHandler({
193
- tag: 'chatstate',
266
+ tag: WA_NODE_TAGS.CHATSTATE,
267
+ // eslint-disable-next-line @typescript-eslint/require-await
194
268
  handler: async (node) => {
269
+ const parsed = parseChatstateNode(node);
270
+ if (!parsed) {
271
+ return false;
272
+ }
195
273
  runtime.emitIncomingChatstate({
196
274
  ...createIncomingBaseEvent(node),
197
- participantJid: node.attrs.participant
275
+ ...parsed
198
276
  });
199
277
  return true;
200
278
  }
201
279
  });
202
280
  this.registerIncomingHandler({
203
- tag: 'call',
204
- handler: async (node) => {
205
- runtime.emitIncomingCall(createIncomingBaseEvent(node));
206
- return true;
207
- }
281
+ tag: WA_NODE_TAGS.CALL,
282
+ handler: createIncomingCallHandler({
283
+ logger: this.logger,
284
+ sendNode: runtime.sendNode,
285
+ emitIncomingCall: runtime.emitIncomingCall,
286
+ getCurrentCredentials: runtime.getCurrentCredentials
287
+ })
208
288
  });
209
289
  this.registerIncomingHandler({
210
290
  tag: 'failure',
@@ -218,8 +298,13 @@ export class WaIncomingNodeCoordinator {
218
298
  });
219
299
  this.registerIncomingHandler({
220
300
  tag: WA_NODE_TAGS.ERROR,
301
+ // eslint-disable-next-line @typescript-eslint/require-await
221
302
  handler: async (node) => {
222
- runtime.emitIncomingErrorStanza(createIncomingBaseEvent(node));
303
+ runtime.emitIncomingErrorStanza({
304
+ ...createIncomingBaseEvent(node),
305
+ code: parseOptionalInt(node.attrs.code),
306
+ text: node.attrs.text
307
+ });
223
308
  return true;
224
309
  }
225
310
  });
@@ -0,0 +1,38 @@
1
+ import { WA_DEFAULTS } from '../../protocol/constants.js';
2
+ import { toError } from '../../util/primitives.js';
3
+ /** Builds a {@link WaLowLevelCoordinator} from its transport dependencies. */
4
+ export function createLowLevelCoordinator(options) {
5
+ const { logger, nodeOrchestrator, incomingNode, receiptQueue, isConnected } = options;
6
+ const defaultIqTimeoutMs = options.defaultIqTimeoutMs ?? WA_DEFAULTS.IQ_TIMEOUT_MS;
7
+ return {
8
+ sendNode: async (node) => {
9
+ try {
10
+ await nodeOrchestrator.sendNode(node);
11
+ }
12
+ catch (error) {
13
+ const normalized = toError(error);
14
+ if (receiptQueue.shouldQueue(node, normalized)) {
15
+ receiptQueue.enqueue(node);
16
+ logger.warn('queued dangling receipt after send failure', {
17
+ id: node.attrs.id,
18
+ to: node.attrs.to,
19
+ message: normalized.message,
20
+ queueSize: receiptQueue.size()
21
+ });
22
+ return;
23
+ }
24
+ throw normalized;
25
+ }
26
+ },
27
+ query: async (node, timeoutMs = defaultIqTimeoutMs, queryOptions = {}) => {
28
+ if (!isConnected()) {
29
+ throw new Error('client is not connected');
30
+ }
31
+ logger.debug('wa client query', { tag: node.tag, id: node.attrs.id, timeoutMs });
32
+ return nodeOrchestrator.query(node, timeoutMs, queryOptions);
33
+ },
34
+ registerIncomingHandler: (registration) => incomingNode.registerIncomingHandler(registration),
35
+ unregisterIncomingHandler: (registration) => incomingNode.unregisterIncomingHandler(registration),
36
+ registerIncomingStanzaFilter: (filter) => incomingNode.registerIncomingStanzaFilter(filter)
37
+ };
38
+ }
@@ -0,0 +1,361 @@
1
+ import { createWriteStream } from 'node:fs';
2
+ import { pipeline } from 'node:stream/promises';
3
+ import { aggregateReceiptTargets } from '../events/receipt.js';
4
+ import { buildAddonAdditionalData, decodeAddonPlaintext, decryptAddonPayload, identifyEncryptedAddon, resolveParentMessageSecret, resolvePollOptionNames, shouldUseAddonAdditionalData } from '../../message/crypto/addon-crypto.js';
5
+ import { unwrapMessage } from '../../message/encode/content.js';
6
+ import { resolveMediaPayload } from '../../message/encode/media-payload.js';
7
+ import { proto } from '../../proto.js';
8
+ import { applyDeviceToJid, normalizeRecipientJid } from '../../protocol/jid.js';
9
+ import { runMexQuery } from '../../transport/node/mex/client.js';
10
+ import { readAllBytes } from '../../util/bytes.js';
11
+ import { tryAsNumber, tryAsString } from '../../util/coercion.js';
12
+ import { toError } from '../../util/primitives.js';
13
+ function parseReachoutTimelockMexResponse(data) {
14
+ const root = data?.xwa2_fetch_account_reachout_timelock;
15
+ return {
16
+ isActive: root?.is_active === true,
17
+ enforcementType: tryAsString(root?.enforcement_type),
18
+ enforcementEndsAt: tryAsNumber(root?.time_enforcement_ends)
19
+ };
20
+ }
21
+ function parseMessageCappingMexResponse(data) {
22
+ const root = data?.xwa2_message_capping_info;
23
+ return {
24
+ totalQuota: tryAsNumber(root?.total_quota),
25
+ usedQuota: tryAsNumber(root?.used_quota),
26
+ cycleStartAt: tryAsNumber(root?.cycle_start_timestamp),
27
+ cycleEndAt: tryAsNumber(root?.cycle_end_timestamp),
28
+ serverSentAt: tryAsNumber(root?.server_sent_timestamp),
29
+ oteStatus: tryAsString(root?.ote_status),
30
+ mvStatus: tryAsString(root?.mv_status),
31
+ cappingStatus: tryAsString(root?.capping_status)
32
+ };
33
+ }
34
+ /**
35
+ * Coordinates outbound message sending, receipts, addon decryption, media
36
+ * download, and the related MEX account queries. Accessed via
37
+ * {@link WaClient.message}.
38
+ */
39
+ export class WaMessageCoordinator {
40
+ constructor(deps) {
41
+ this.messageDispatch = deps.messageDispatch;
42
+ this.mediaTransfer = deps.mediaTransfer;
43
+ this.logger = deps.logger;
44
+ this.messageStore = deps.messageStore;
45
+ this.messageSecretStore = deps.messageSecretStore;
46
+ this.trustedContactToken = deps.trustedContactToken;
47
+ this.emitAddon = deps.emitAddon;
48
+ this.mexSocket = deps.mexSocket;
49
+ this.peerDataOperation = deps.peerDataOperation;
50
+ }
51
+ /**
52
+ * Asks the server to backfill older messages for `chatJid` beyond what
53
+ * arrived in the initial history-sync. Implemented as a
54
+ * `PeerDataOperationRequestMessage` (type `HISTORY_SYNC_ON_DEMAND`)
55
+ * sent to this account's own user JID; the response arrives later as
56
+ * a `history_sync_chunk` event the same way the bootstrap chunks do -
57
+ * subscribe before calling if you need to react to the chunk.
58
+ *
59
+ * The method returns once the request is dispatched (with the protocol
60
+ * message id), **not** when the chunk arrives. Pair `oldestMsgId` +
61
+ * `oldestMsgTimestampMs` + `oldestMsgFromMe` from the topmost message
62
+ * currently visible to page backwards correctly.
63
+ */
64
+ async requestHistorySync(input) {
65
+ const chatJid = normalizeRecipientJid(input.chatJid);
66
+ if (input.count !== undefined) {
67
+ if (!Number.isFinite(input.count) ||
68
+ !Number.isSafeInteger(input.count) ||
69
+ input.count <= 0) {
70
+ throw new Error(`invalid count: ${input.count}`);
71
+ }
72
+ }
73
+ if (input.oldestMsgTimestampMs !== undefined) {
74
+ if (!Number.isFinite(input.oldestMsgTimestampMs) ||
75
+ !Number.isSafeInteger(input.oldestMsgTimestampMs) ||
76
+ input.oldestMsgTimestampMs < 0) {
77
+ throw new Error(`invalid oldestMsgTimestampMs: ${input.oldestMsgTimestampMs}`);
78
+ }
79
+ }
80
+ const historySyncOnDemandRequest = {
81
+ chatJid,
82
+ supportInlineResponse: true,
83
+ ...(input.oldestMsgId === undefined ? {} : { oldestMsgId: input.oldestMsgId }),
84
+ ...(input.oldestMsgFromMe === undefined
85
+ ? {}
86
+ : { oldestMsgFromMe: input.oldestMsgFromMe }),
87
+ ...(input.oldestMsgTimestampMs === undefined
88
+ ? {}
89
+ : { oldestMsgTimestampMs: input.oldestMsgTimestampMs }),
90
+ ...(input.count === undefined ? {} : { onDemandMsgCount: input.count })
91
+ };
92
+ return this.peerDataOperation.send(proto.Message.PeerDataOperationRequestType.HISTORY_SYNC_ON_DEMAND, { historySyncOnDemandRequest });
93
+ }
94
+ /**
95
+ * Fetches the server-side "reachout" timelock that throttles cold outreach
96
+ * to non-contacts, returning the active window when enforcement is on.
97
+ */
98
+ async getReachoutTimelock() {
99
+ const data = await runMexQuery(this.mexSocket, 'FetchReachoutTimelock', {});
100
+ return parseReachoutTimelockMexResponse(data);
101
+ }
102
+ /**
103
+ * Fetches the per-cycle message capping info applied to new-chat threads
104
+ * (quota, used, cycle boundaries, status flags).
105
+ */
106
+ async getNewChatMessageCapping(type = 'INDIVIDUAL_NEW_CHAT_THREAD') {
107
+ const data = await runMexQuery(this.mexSocket, 'FetchNewChatMessageCappingInfo', {
108
+ input: { type }
109
+ });
110
+ return parseMessageCappingMexResponse(data);
111
+ }
112
+ /**
113
+ * Force-refreshes the Signal session(s) for `jid`. Set `reasonIdentity` to
114
+ * `true` when the trigger was an identity change – this also queues a
115
+ * trusted-contact-token reissue.
116
+ */
117
+ async syncSignalSession(jid, reasonIdentity = false) {
118
+ await this.messageDispatch.syncSignalSession(jid, reasonIdentity);
119
+ if (reasonIdentity) {
120
+ this.trustedContactToken.reissueOnIdentityChange(jid).catch((err) => this.logger.warn('tc token reissue on identity change failed', {
121
+ jid,
122
+ message: toError(err).message
123
+ }));
124
+ }
125
+ }
126
+ /**
127
+ * Sends a message (any {@link WaSendMessageContent} kind – text, media,
128
+ * poll, reaction, edit, revoke, etc.) to `to` and returns the publish
129
+ * result containing the stanza id and ack metadata.
130
+ *
131
+ * `to` accepts any JID accepted by {@link normalizeRecipientJid}: bare
132
+ * digits (`'5511999999999'`), a phone JID (`'5511…@s.whatsapp.net'`),
133
+ * a group JID (`'…@g.us'`), or a LID. See the {@link WaSendMessageContent}
134
+ * union for the full kind list.
135
+ *
136
+ * **Gotchas:**
137
+ * - The stanza id is auto-generated unless you set `options.id`. Reusing
138
+ * an id manually makes the send idempotent on the server but is also how
139
+ * internal retries (`maxAttempts`) work – don't reuse ids across
140
+ * logically distinct messages.
141
+ * - Sending to a `@newsletter` JID routes through a separate code path
142
+ * that ignores most of `options` (no quote/forward/edit semantics).
143
+ * - Addon-crypto kinds (poll-vote, reaction, message-edit, ...) require an
144
+ * authenticated session (`meJid` present) – throws otherwise.
145
+ * - Group sends fan out to every cached member device. If your
146
+ * `groupMetadata` cache is empty/disabled, this triggers a metadata IQ
147
+ * per send (rate-limited server-side, see {@link WaCreateStoreOptions}).
148
+ *
149
+ * @example
150
+ * ```ts
151
+ * // 1. Plain text (string shorthand)
152
+ * await client.message.send('5511999999999', 'hello!')
153
+ *
154
+ * // 2. Reply with mention
155
+ * await client.message.send(groupJid, {
156
+ * type: 'text',
157
+ * text: '@5511999999999 ping',
158
+ * contextInfo: {
159
+ * mentionedJid: ['5511999999999@s.whatsapp.net'],
160
+ * quoted: { key: { remoteJid: groupJid, fromMe: false, id: incomingId } }
161
+ * }
162
+ * })
163
+ *
164
+ * // 3. Image from a file path (the encoder opens + streams it for you)
165
+ * await client.message.send(jid, {
166
+ * type: 'image',
167
+ * media: '/tmp/photo.jpg',
168
+ * mimetype: 'image/jpeg',
169
+ * caption: 'check this out'
170
+ * })
171
+ *
172
+ * // 4. React to an incoming message (empty emoji = unreact)
173
+ * await client.message.send(event.key.remoteJid, {
174
+ * type: 'reaction',
175
+ * emoji: '👍',
176
+ * target: event.key // or pass the whole event
177
+ * })
178
+ *
179
+ * // 5. Poll
180
+ * const result = await client.message.send(jid, {
181
+ * type: 'poll',
182
+ * name: 'lunch?',
183
+ * options: ['pizza', 'sushi', 'burger'],
184
+ * selectableCount: 1
185
+ * })
186
+ * console.log('sent as', result.id)
187
+ * ```
188
+ */
189
+ send(to, content, options = {}) {
190
+ return this.messageDispatch.sendMessage(to, content, options);
191
+ }
192
+ async sendReceipt(first, second, third) {
193
+ if (typeof first === 'string') {
194
+ const ids = second;
195
+ await this.dispatchReceipt(first, ids, third ?? {});
196
+ return;
197
+ }
198
+ const events = Array.isArray(first) ? first : [first];
199
+ const options = second ?? {};
200
+ const targets = events.map((event) => {
201
+ if (!event.key.remoteJid || !event.key.id) {
202
+ throw new Error('sendReceipt event is missing key.remoteJid or key.id');
203
+ }
204
+ const senderJid = event.key.participant ?? event.key.remoteJid;
205
+ return {
206
+ chatJid: event.key.remoteJid,
207
+ id: event.key.id,
208
+ senderJid: senderJid
209
+ ? applyDeviceToJid(senderJid, event.key.senderDevice)
210
+ : undefined,
211
+ isGroupChat: event.key.isGroup,
212
+ isBroadcastChat: event.key.isBroadcast
213
+ };
214
+ });
215
+ for (const group of aggregateReceiptTargets(targets)) {
216
+ await this.dispatchReceipt(group.jid, group.ids, {
217
+ ...options,
218
+ participant: group.participant
219
+ });
220
+ }
221
+ }
222
+ /**
223
+ * Resolves the media payload inside `source` and returns a `Readable`
224
+ * stream of the decrypted bytes. Throws when the message has no
225
+ * downloadable media.
226
+ *
227
+ * **Caller owns the stream** - pipe it somewhere or call `.destroy()` to
228
+ * release the underlying socket; an unconsumed stream leaks the connection.
229
+ * MAC + SHA-256 verification runs **as bytes are consumed**, so if you
230
+ * abort mid-read you've consumed unverified bytes. Pass `options.signal`
231
+ * to cancel cleanly, or use {@link downloadBytes} / {@link downloadToFile}
232
+ * for one-shot verified downloads.
233
+ */
234
+ async download(source, options = {}) {
235
+ const message = 'rawNode' in source ? source.message : source;
236
+ const payload = resolveMediaPayload(message);
237
+ if (!payload) {
238
+ throw new Error('message has no downloadable media');
239
+ }
240
+ const { plaintext, metadata } = await this.mediaTransfer.downloadAndDecryptStream({
241
+ directPath: payload.directPath,
242
+ mediaType: payload.mediaType,
243
+ mediaKey: payload.mediaKey,
244
+ fileSha256: payload.fileSha256,
245
+ fileEncSha256: payload.fileEncSha256,
246
+ timeoutMs: options.timeoutMs,
247
+ signal: options.signal,
248
+ maxBytes: options.maxBytes
249
+ });
250
+ metadata.catch(() => undefined);
251
+ return plaintext;
252
+ }
253
+ /**
254
+ * Convenience wrapper around {@link download} that streams the decrypted
255
+ * media directly to `filePath`. On failure the **partial file is not
256
+ * cleaned up** - delete it yourself in the error handler if you don't
257
+ * want to leak corrupted artifacts.
258
+ */
259
+ async downloadToFile(source, filePath, options = {}) {
260
+ const stream = await this.download(source, options);
261
+ await pipeline(stream, createWriteStream(filePath));
262
+ }
263
+ /**
264
+ * Convenience wrapper around {@link download} that buffers the decrypted
265
+ * media into a single `Uint8Array`. Use only for small media – caps via
266
+ * `options.maxBytes`.
267
+ */
268
+ async downloadBytes(source, options = {}) {
269
+ const stream = await this.download(source, options);
270
+ return readAllBytes(stream, { maxBytes: options.maxBytes });
271
+ }
272
+ /**
273
+ * Attempts to decrypt an addon payload (poll vote, reaction, edit, ...)
274
+ * attached to `event` and, on success, emits a typed
275
+ * `WaIncomingAddonEvent`. Silently returns when the parent message
276
+ * secret is missing or the payload is not an addon.
277
+ *
278
+ * Called automatically by the client unless `options.addons.autoDecrypt`
279
+ * is explicitly `false` - you rarely need to invoke it directly. The
280
+ * parent secret is looked up in the in-memory `messageSecret` cache
281
+ * first, then in the `messages` store. If both are `'none'`/missing,
282
+ * decryption fails and the event never fires; failures are logged at
283
+ * `warn` for `secretEncryptedMessage` addons (whose parent can be
284
+ * any message type, so the secret is only available when the
285
+ * `messages` mailbox is active) and at `debug` for the dedicated
286
+ * addon types (reactions, poll votes, event responses, comments)
287
+ * whose parent always carries a persisted secret or is itself
288
+ * short-lived.
289
+ */
290
+ async tryDecryptAddon(event) {
291
+ const message = event.message;
292
+ if (!message)
293
+ return;
294
+ const addon = identifyEncryptedAddon(message);
295
+ if (!addon)
296
+ return;
297
+ const targetMessageId = addon.targetMessageKey.id;
298
+ if (!targetMessageId)
299
+ return;
300
+ const parentEntry = await resolveParentMessageSecret(targetMessageId, this.messageSecretStore, this.messageStore);
301
+ if (!parentEntry) {
302
+ const logCtx = {
303
+ id: event.key.id,
304
+ targetId: targetMessageId,
305
+ kind: addon.kind
306
+ };
307
+ if (unwrapMessage(message).secretEncryptedMessage) {
308
+ this.logger.warn('addon parent message secret not found - enable the `messages` mailbox to support decryption of secretEncryptedMessage addons on arbitrary parents', logCtx);
309
+ }
310
+ else {
311
+ this.logger.debug('addon parent message secret not found', logCtx);
312
+ }
313
+ return;
314
+ }
315
+ const parentMsgOriginalSender = parentEntry.senderJid;
316
+ const modificationSender = event.key.participant ?? event.key.remoteJid;
317
+ const plaintext = await decryptAddonPayload({
318
+ messageSecret: parentEntry.secret,
319
+ stanzaId: targetMessageId,
320
+ parentMsgOriginalSender,
321
+ modificationSender,
322
+ modificationType: addon.modificationType,
323
+ ciphertext: addon.encPayload,
324
+ iv: addon.encIv,
325
+ additionalData: shouldUseAddonAdditionalData(addon.modificationType)
326
+ ? buildAddonAdditionalData(targetMessageId, modificationSender)
327
+ : undefined
328
+ });
329
+ let decrypted = decodeAddonPlaintext(addon.kind, plaintext);
330
+ if (decrypted.kind === 'poll_vote' && decrypted.pollVote.selectedOptions) {
331
+ const names = await resolvePollOptionNames(decrypted.pollVote.selectedOptions, targetMessageId, this.messageStore);
332
+ if (names) {
333
+ decrypted = { ...decrypted, selectedOptionNames: names };
334
+ }
335
+ }
336
+ this.emitAddon({
337
+ rawNode: event.rawNode,
338
+ key: event.key,
339
+ stanzaType: event.stanzaType,
340
+ offline: event.offline,
341
+ kind: addon.kind,
342
+ targetMessageId,
343
+ decrypted,
344
+ raw: message
345
+ });
346
+ }
347
+ dispatchReceipt(jid, ids, options) {
348
+ const idArray = typeof ids === 'string' ? [ids] : ids;
349
+ if (idArray.length === 0) {
350
+ throw new Error('sendReceipt requires at least one message id');
351
+ }
352
+ const [id, ...rest] = idArray;
353
+ const input = {
354
+ ...options,
355
+ to: jid,
356
+ id,
357
+ listIds: rest.length > 0 ? rest : undefined
358
+ };
359
+ return this.messageDispatch.sendReceipt(input);
360
+ }
361
+ }