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