zapo-js 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -5,12 +5,14 @@ const _crypto_1 = require("../../crypto/index.js");
5
5
  const primitives_1 = require("../../crypto/core/primitives");
6
6
  const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
7
7
  const _message_1 = require("../../message/index.js");
8
- const content_1 = require("../../message/content");
9
- const device_sent_1 = require("../../message/device-sent");
10
- const icdc_1 = require("../../message/icdc");
11
- const padding_1 = require("../../message/padding");
12
- const phash_1 = require("../../message/phash");
13
- const reporting_token_1 = require("../../message/reporting-token");
8
+ const context_info_1 = require("../../message/context-info");
9
+ const icdc_1 = require("../../message/crypto/icdc");
10
+ const phash_1 = require("../../message/crypto/phash");
11
+ const reporting_token_1 = require("../../message/crypto/reporting-token");
12
+ const content_1 = require("../../message/encode/content");
13
+ const device_sent_1 = require("../../message/encode/device-sent");
14
+ const padding_1 = require("../../message/encode/padding");
15
+ const bot_1 = require("../../message/kinds/bot");
14
16
  const _proto_1 = require("../../proto.js");
15
17
  const constants_1 = require("../../protocol/constants");
16
18
  const jid_1 = require("../../protocol/jid");
@@ -23,51 +25,28 @@ class WaMessageDispatchCoordinator {
23
25
  this.icdcDedup = new PromiseDedup_1.PromiseDedup();
24
26
  this.privacyTokenDedup = new PromiseDedup_1.PromiseDedup();
25
27
  this.distributionDedup = new PromiseDedup_1.PromiseDedup();
26
- this.logger = options.logger;
27
- this.messageClient = options.messageClient;
28
- this.retryTracker = options.retryTracker;
29
- this.sessionResolver = options.sessionResolver;
30
- this.fanoutResolver = options.fanoutResolver;
31
- this.participantsCache = options.participantsCache;
32
- this.appStateSyncKeyProtocol = options.appStateSyncKeyProtocol;
33
- this.buildMessageContent = options.buildMessageContent;
34
- this.senderKeyManager = options.senderKeyManager;
35
- this.signalProtocol = options.signalProtocol;
36
- this.signalStore = options.signalStore;
37
- this.sessionStore = options.sessionStore;
38
- this.identityStore = options.identityStore;
39
- this.deviceListStore = options.deviceListStore;
40
- this.messageSecretStore = options.messageSecretStore;
41
- this.getCurrentMeJid = options.getCurrentMeJid;
42
- this.getCurrentMeLid = options.getCurrentMeLid;
43
- this.getCurrentSignedIdentity = options.getCurrentSignedIdentity;
44
- this.resolvePrivacyTokenNode = options.resolvePrivacyTokenNode;
45
- this.onDirectMessageSent = options.onDirectMessageSent;
46
- this.getIcdcHashLength = options.getIcdcHashLength;
28
+ this.deps = options;
47
29
  this.mobileMessageIdFormat = options.mobileMessageIdFormat ?? false;
30
+ this.serverClock = options.serverClock;
48
31
  }
49
32
  async publishMessageNode(node, options = {}) {
50
- this.logger.debug('wa client publish message node', {
33
+ this.deps.logger.trace('wa client publish message node', {
51
34
  tag: node.tag,
52
35
  type: node.attrs.type,
53
36
  to: node.attrs.to
54
37
  });
55
- const messageType = node.attrs.type ?? 'text';
56
38
  const replayPayload = {
57
39
  mode: 'opaque_node',
58
40
  node: (0, binary_1.encodeBinaryNode)(node)
59
41
  };
60
- return this.retryTracker.track({
42
+ return this.deps.retryTracker.track({
61
43
  messageIdHint: node.attrs.id,
62
44
  toJid: node.attrs.to,
63
- type: messageType,
64
- replayPayload,
65
- participantJid: node.attrs.participant,
66
- recipientJid: node.attrs.recipient
67
- }, async () => this.messageClient.publishNode(node, options));
45
+ replayPayload
46
+ }, async () => this.deps.messageClient.publishNode(node, options));
68
47
  }
69
48
  async publishEncryptedMessage(input, options = {}) {
70
- this.logger.debug('wa client publish encrypted message', {
49
+ this.deps.logger.trace('wa client publish encrypted message', {
71
50
  to: input.to,
72
51
  type: input.type,
73
52
  encType: input.encType
@@ -80,14 +59,12 @@ class WaMessageDispatchCoordinator {
80
59
  ciphertext: input.ciphertext,
81
60
  participant: input.participant
82
61
  };
83
- return this.retryTracker.track({
62
+ return this.deps.retryTracker.track({
84
63
  messageIdHint: input.id,
85
64
  toJid: input.to,
86
- type: input.type ?? 'text',
87
65
  replayPayload,
88
- participantJid: input.participant,
89
66
  eligibleRequesterDeviceJids: [input.to]
90
- }, async () => this.messageClient.publishEncrypted(input, options));
67
+ }, async () => this.deps.messageClient.publishEncrypted(input, options));
91
68
  }
92
69
  async publishSignalMessage(input, options = {}) {
93
70
  this.requireCurrentMeJid('publishSignalMessage');
@@ -95,30 +72,29 @@ class WaMessageDispatchCoordinator {
95
72
  if (address.server === constants_1.WA_DEFAULTS.GROUP_SERVER) {
96
73
  throw new Error('publishSignalMessage currently supports only direct chats; use sender-key flow for groups');
97
74
  }
98
- this.logger.debug('wa client publish signal message', {
75
+ this.deps.logger.trace('wa client publish signal message', {
99
76
  to: input.to,
100
77
  type: input.type
101
78
  });
102
79
  const [paddedPlaintext] = await Promise.all([
103
80
  (0, padding_1.writeRandomPadMax16)(input.plaintext),
104
- this.sessionResolver.ensureSession(address, input.to, input.expectedIdentity)
81
+ this.deps.sessionResolver.ensureSession(address, input.to, input.expectedIdentity)
105
82
  ]);
106
- const encrypted = await this.signalProtocol.encryptMessage(address, paddedPlaintext, input.expectedIdentity);
83
+ const encrypted = await this.deps.signalProtocol.encryptMessage(address, paddedPlaintext, input.expectedIdentity);
107
84
  const messageType = input.type ?? 'text';
85
+ const deviceIdentity = encrypted.type === 'pkmsg' ? this.getEncodedSignedDeviceIdentity() : undefined;
108
86
  const replayPayload = {
109
87
  mode: 'plaintext',
110
88
  to: input.to,
111
89
  type: messageType,
112
90
  plaintext: paddedPlaintext
113
91
  };
114
- return this.retryTracker.track({
92
+ return this.deps.retryTracker.track({
115
93
  messageIdHint: input.id,
116
94
  toJid: input.to,
117
- type: messageType,
118
95
  replayPayload,
119
- participantJid: input.participant,
120
96
  eligibleRequesterDeviceJids: [input.to]
121
- }, async () => this.messageClient.publishEncrypted({
97
+ }, async () => this.deps.messageClient.publishEncrypted({
122
98
  to: input.to,
123
99
  encType: encrypted.type,
124
100
  ciphertext: encrypted.ciphertext,
@@ -127,33 +103,130 @@ class WaMessageDispatchCoordinator {
127
103
  category: input.category,
128
104
  pushPriority: input.pushPriority,
129
105
  participant: input.participant,
130
- deviceFanout: input.deviceFanout
106
+ deviceFanout: input.deviceFanout,
107
+ deviceIdentity,
108
+ metaNode: input.metaNode
131
109
  }, options));
132
110
  }
133
111
  async sendMessage(to, content, options = {}) {
134
112
  const recipientJid = (0, jid_1.normalizeRecipientJid)(to);
135
- const [message, sendOptions] = await Promise.all([
136
- this.buildMessageContent(content),
137
- this.withResolvedMessageId(options)
138
- ]);
139
- const messageWithSecret = await (0, _message_1.ensureMessageSecret)(message);
113
+ if ((0, jid_1.isNewsletterJid)(recipientJid)) {
114
+ if (!this.deps.sendNewsletterMessage) {
115
+ throw new Error('newsletter sendMessage requires sendNewsletterMessage dependency');
116
+ }
117
+ const newsletterCtx = (0, context_info_1.resolveSendContextInfo)({
118
+ contentLevel: pickContentContextInfo(content),
119
+ optionsLevel: options.contextInfo,
120
+ quote: options.quote,
121
+ forward: options.forward,
122
+ mentions: options.mentions
123
+ });
124
+ assertNewsletterContextInfoCompatible(newsletterCtx);
125
+ const sendOptions = await this.withResolvedMessageId(options);
126
+ return this.deps.sendNewsletterMessage(recipientJid, content, sendOptions, newsletterCtx);
127
+ }
128
+ let built;
129
+ let sendOptions;
130
+ if ((0, content_1.isSendAddonCryptoMessage)(content)) {
131
+ sendOptions = await this.withResolvedMessageId(options);
132
+ const meJid = this.deps.getCurrentCredentials()?.meJid;
133
+ if (!meJid) {
134
+ throw new Error(`${content.type} sendMessage requires registered meJid`);
135
+ }
136
+ built = await this.deps.buildMessageContent(content, {
137
+ to: recipientJid,
138
+ outgoingStanzaId: sendOptions.id,
139
+ meJid: (0, jid_1.toUserJid)(meJid)
140
+ });
141
+ }
142
+ else {
143
+ ;
144
+ [built, sendOptions] = await Promise.all([
145
+ this.deps.buildMessageContent(content, { to: recipientJid }),
146
+ this.withResolvedMessageId(options)
147
+ ]);
148
+ }
149
+ let optionsCtx = options.contextInfo;
150
+ if (options.expirationSeconds !== undefined) {
151
+ optionsCtx = { ...optionsCtx, expirationSeconds: options.expirationSeconds };
152
+ }
153
+ if ((0, jid_1.isGroupJid)(recipientJid) &&
154
+ optionsCtx?.expirationSeconds === undefined &&
155
+ !options.disableGroupEphemeralAutoInject) {
156
+ const cachedEphemeral = await this.deps.groupMetadataCache.resolveEphemeral(recipientJid);
157
+ if (cachedEphemeral !== null && cachedEphemeral > 0) {
158
+ optionsCtx = { ...optionsCtx, expirationSeconds: cachedEphemeral };
159
+ }
160
+ }
161
+ const ctx = (0, context_info_1.resolveSendContextInfo)({
162
+ contentLevel: pickContentContextInfo(content),
163
+ optionsLevel: optionsCtx,
164
+ quote: options.quote,
165
+ forward: options.forward,
166
+ mentions: options.mentions,
167
+ meLid: this.deps.getCurrentCredentials()?.meLid
168
+ });
169
+ const withCtx = ctx ? (0, context_info_1.applyContextInfo)(built.message, ctx) : built.message;
170
+ const withViewOnce = options.viewOnce ? (0, content_1.wrapAsViewOnce)(withCtx) : withCtx;
171
+ const editKey = options.editKey;
172
+ let editId;
173
+ let editParticipant;
174
+ let editTimestamp;
175
+ if (editKey) {
176
+ if ('rawNode' in editKey) {
177
+ editId = editKey.key?.id ?? undefined;
178
+ editParticipant = editKey.key?.participant ?? undefined;
179
+ }
180
+ else {
181
+ editId = editKey.id;
182
+ editParticipant = editKey.participant;
183
+ editTimestamp = 'timestampMs' in editKey ? editKey.timestampMs : undefined;
184
+ }
185
+ }
186
+ const message = editKey
187
+ ? {
188
+ protocolMessage: {
189
+ type: _proto_1.proto.Message.ProtocolMessage.Type.MESSAGE_EDIT,
190
+ key: {
191
+ remoteJid: recipientJid,
192
+ fromMe: true,
193
+ id: editId,
194
+ ...(editParticipant ? { participant: editParticipant } : {})
195
+ },
196
+ editedMessage: withViewOnce,
197
+ timestampMs: editTimestamp ?? this.serverClock.nowMs()
198
+ }
199
+ }
200
+ : withViewOnce;
201
+ const upload = built.upload;
202
+ const messageWithOverride = options.messageSecret
203
+ ? {
204
+ ...message,
205
+ messageContextInfo: {
206
+ ...(message.messageContextInfo ?? {}),
207
+ messageSecret: (0, _message_1.assertMessageSecret)(options.messageSecret, 'options.messageSecret')
208
+ }
209
+ }
210
+ : message;
211
+ const messageWithSecret = await (0, _message_1.ensureMessageSecret)(messageWithOverride);
140
212
  const rawSecret = messageWithSecret.messageContextInfo?.messageSecret;
141
213
  if (rawSecret &&
142
214
  rawSecret.length > 0 &&
143
215
  sendOptions.id &&
144
216
  (0, content_1.needsSecretPersistence)(messageWithSecret)) {
145
- const meJid = this.getCurrentMeJid() ?? '';
146
- void this.messageSecretStore
217
+ const meJid = this.deps.getCurrentCredentials()?.meJid ?? '';
218
+ void this.deps.messageSecretStore
147
219
  .set(sendOptions.id, { secret: rawSecret, senderJid: meJid })
148
220
  .catch((error) => {
149
- this.logger.warn('failed to persist outgoing message secret', {
221
+ this.deps.logger.warn('failed to persist outgoing message secret', {
150
222
  id: sendOptions.id,
223
+ to: recipientJid,
151
224
  message: (0, primitives_2.toError)(error).message
152
225
  });
153
226
  });
154
227
  }
155
- const meJid = this.getCurrentMeJid();
156
- const regInfo = meJid ? await this.signalStore.getRegistrationInfo() : null;
228
+ const meJid = this.deps.getCurrentCredentials()?.meJid;
229
+ const regInfo = meJid ? await this.deps.signalStore.getRegistrationInfo() : null;
157
230
  const localPubKey = regInfo?.identityKeyPair.pubKey;
158
231
  const meParsed = meJid ? (0, jid_1.parseJidFull)(meJid) : undefined;
159
232
  const meUserJid = meParsed?.userJid;
@@ -165,67 +238,343 @@ class WaMessageDispatchCoordinator {
165
238
  ]);
166
239
  const messageWithIcdc = (0, icdc_1.injectDeviceListMetadata)(messageWithSecret, senderIcdc, recipientIcdc);
167
240
  const plaintext = await (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(messageWithIcdc).finish());
168
- const type = (0, content_1.resolveMessageTypeAttr)(messageWithIcdc);
169
- const edit = (0, content_1.resolveEditAttr)(messageWithIcdc, sendOptions.subtype) ?? undefined;
170
- const mediatype = (0, content_1.resolveEncMediaType)(messageWithIcdc) ?? undefined;
241
+ const buttonAddonKind = (0, content_1.resolveButtonAddonKind)(messageWithIcdc);
242
+ const buttonAddonNode = buttonAddonKind ? (0, message_1.buildButtonAddonNode)(buttonAddonKind) : undefined;
243
+ // when a <biz> companion is attached the stanza must advertise type=text and
244
+ // omit enc.mediatype; sending type=media + mediatype=list/button alongside the
245
+ // companion is rejected by the server as SMAX_INVALID (479).
246
+ const type = buttonAddonKind ? 'text' : (0, content_1.resolveMessageTypeAttr)(messageWithIcdc);
247
+ const edit = (0, content_1.resolveEditAttr)(messageWithIcdc) ?? undefined;
248
+ const mediatype = buttonAddonKind
249
+ ? undefined
250
+ : ((0, content_1.resolveEncMediaType)(messageWithIcdc) ?? undefined);
171
251
  const metaAttrs = (0, content_1.resolveMetaAttrs)(messageWithIcdc);
172
252
  const metaNode = metaAttrs ? (0, message_1.buildMetaNode)(metaAttrs) : undefined;
173
- if (isGroup) {
174
- if (this.shouldUseGroupDirectPath(messageWithIcdc)) {
175
- return this.publishGroupDirectMessage(recipientJid, messageWithIcdc, plaintext, type, sendOptions, {}, edit, mediatype, metaNode);
253
+ const customNodes = [];
254
+ if (metaNode)
255
+ customNodes.push(metaNode);
256
+ if (buttonAddonNode)
257
+ customNodes.push(buttonAddonNode);
258
+ if (options.customNodes) {
259
+ for (const node of options.customNodes) {
260
+ customNodes.push(node);
176
261
  }
177
- return this.publishGroupSenderKeyMessage(recipientJid, messageWithIcdc, plaintext, type, sendOptions, {}, edit, mediatype, metaNode);
178
262
  }
179
- const directRecipientJid = (0, jid_1.toUserJid)(recipientJid);
180
- return this.publishDirectSignalMessageWithFanout(directRecipientJid, messageWithIcdc, plaintext, type, sendOptions, edit, mediatype, metaNode);
263
+ const decryptFail = (0, content_1.resolveDecryptFailAttr)(messageWithIcdc);
264
+ const envelope = {
265
+ message: messageWithIcdc,
266
+ plaintext,
267
+ type,
268
+ edit,
269
+ mediatype,
270
+ decryptFail,
271
+ customNodes: customNodes.length > 0 ? customNodes : undefined,
272
+ sendOptions
273
+ };
274
+ const directRecipientJid = isGroup
275
+ ? recipientJid
276
+ : await this.resolveDirectRecipientLid((0, jid_1.toUserJid)(recipientJid));
277
+ const publishResult = isGroup
278
+ ? this.shouldUseGroupDirectPath(messageWithIcdc)
279
+ ? await this.publishGroupDirectMessage(recipientJid, envelope)
280
+ : await this.publishGroupSenderKeyMessage(recipientJid, envelope)
281
+ : await this.publishDirectSignalMessageWithFanout(directRecipientJid, envelope);
282
+ return upload ? { ...publishResult, upload } : publishResult;
283
+ }
284
+ /**
285
+ * For a 1:1 recipient passed in PN form, returns the LID-addressed user JID
286
+ * (cache-first; falls back to a one-shot `queryLidsByPhoneJids`). Switching
287
+ * to LID before fanout ensures the envelope, eligible-requester list, and
288
+ * retry-receipt addressing all agree, which keeps the retry tracker from
289
+ * rejecting receipts that arrive in LID form. Returns the original PN if
290
+ * no LID is known/resolvable. Inputs already in LID form pass through.
291
+ */
292
+ async resolveDirectRecipientLid(pnUserJid) {
293
+ if ((0, jid_1.isLidJid)(pnUserJid))
294
+ return pnUserJid;
295
+ const cached = await this.deps.deviceListStore.findByAnyUserJid(pnUserJid);
296
+ if (cached) {
297
+ if ((0, jid_1.isLidJid)(cached.userJid))
298
+ return cached.userJid;
299
+ if (cached.altUserJid && (0, jid_1.isLidJid)(cached.altUserJid))
300
+ return cached.altUserJid;
301
+ }
302
+ try {
303
+ const results = await this.deps.signalDeviceSync.queryLidsByPhoneJids([pnUserJid]);
304
+ const match = results.find((entry) => entry.phoneJid === pnUserJid);
305
+ if (match?.lidJid)
306
+ return match.lidJid;
307
+ }
308
+ catch (error) {
309
+ this.deps.logger.debug('lid resolution failed for direct recipient', {
310
+ pnUserJid,
311
+ message: (0, primitives_2.toError)(error).message
312
+ });
313
+ }
314
+ return pnUserJid;
181
315
  }
182
316
  async syncSignalSession(jid, reasonIdentity = false) {
183
317
  const address = (0, jid_1.parseSignalAddressFromJid)(jid);
184
318
  if (address.server === constants_1.WA_DEFAULTS.GROUP_SERVER) {
185
319
  throw new Error('syncSignalSession supports only direct chats');
186
320
  }
187
- await this.sessionResolver.ensureSession(address, jid, undefined, reasonIdentity);
321
+ await this.deps.sessionResolver.ensureSession(address, jid, undefined, reasonIdentity);
188
322
  }
189
323
  async sendReceipt(input) {
190
- await this.messageClient.sendReceipt(input);
324
+ await this.deps.messageClient.sendReceipt(input);
325
+ }
326
+ async publishProtocolMessageToDevice(deviceJid, protocolMessage, options) {
327
+ const meJid = this.deps.getCurrentCredentials()?.meJid;
328
+ const meParsed = meJid ? (0, jid_1.parseJidFull)(meJid) : undefined;
329
+ const meUserJid = meParsed?.userJid;
330
+ let senderIcdc = null;
331
+ if (meUserJid) {
332
+ const regInfo = await this.deps.signalStore.getRegistrationInfo();
333
+ const localPubKey = regInfo?.identityKeyPair.pubKey;
334
+ const localIdentity = meParsed && localPubKey
335
+ ? { address: meParsed.address, pubKey: localPubKey }
336
+ : undefined;
337
+ senderIcdc = await this.resolveUserIcdc(meUserJid, localIdentity);
338
+ }
339
+ const message = (0, icdc_1.injectDeviceListMetadata)({ protocolMessage }, senderIcdc, null);
340
+ return this.publishSignalMessage({
341
+ to: deviceJid,
342
+ plaintext: _proto_1.proto.Message.encode(message).finish(),
343
+ id: options?.id,
344
+ type: 'text',
345
+ category: 'peer',
346
+ pushPriority: options?.pushPriority ?? 'high',
347
+ metaNode: (0, message_1.buildMetaNode)({ appdata: 'default' })
348
+ });
349
+ }
350
+ async publishStatusMessage(input) {
351
+ if (input.recipients.length === 0) {
352
+ throw new Error('publishStatusMessage requires at least one recipient');
353
+ }
354
+ this.requireCurrentMeJid('publishStatusMessage');
355
+ const meLid = this.deps.getCurrentCredentials()?.meLid;
356
+ if (!meLid) {
357
+ throw new Error('publishStatusMessage requires current me lid');
358
+ }
359
+ const senderJid = (0, jid_1.normalizeDeviceJid)(meLid);
360
+ const meUserLid = (0, jid_1.toUserJid)(meLid);
361
+ const seen = new Set();
362
+ const recipientsWithSelf = [];
363
+ for (const jid of input.recipients) {
364
+ if (seen.has(jid))
365
+ continue;
366
+ seen.add(jid);
367
+ recipientsWithSelf.push(jid);
368
+ }
369
+ if (!seen.has(meUserLid)) {
370
+ recipientsWithSelf.push(meUserLid);
371
+ }
372
+ const statusSetting = input.statusSetting ?? 'contacts';
373
+ return this.publishSenderKeyFanout({
374
+ groupJid: constants_1.WA_DEFAULTS.STATUS_BROADCAST_JID,
375
+ senderJid,
376
+ recipients: recipientsWithSelf,
377
+ message: input.message,
378
+ options: input.options ?? {},
379
+ logTag: 'status',
380
+ replayStatusSetting: statusSetting,
381
+ // Bare `<to jid=user>` ack hints route the skmsg through primary
382
+ // devices that already hold the sender key.
383
+ customize: async ({ fanoutDeviceJids, distributionParticipants, messageWithSecret, sendOptions }) => {
384
+ const distributedAddressKeys = new Set();
385
+ for (let i = 0; i < distributionParticipants.length; i += 1) {
386
+ distributedAddressKeys.add((0, jid_1.signalAddressKey)(distributionParticipants[i].address));
387
+ }
388
+ const ackHints = [];
389
+ const seenAck = new Set();
390
+ for (let i = 0; i < fanoutDeviceJids.length; i += 1) {
391
+ const deviceJid = fanoutDeviceJids[i];
392
+ const address = (0, jid_1.parseSignalAddressFromJid)(deviceJid);
393
+ if (distributedAddressKeys.has((0, jid_1.signalAddressKey)(address)))
394
+ continue;
395
+ if (address.device !== 0)
396
+ continue;
397
+ const userJid = (0, jid_1.toUserJid)(deviceJid);
398
+ if (seenAck.has(userJid))
399
+ continue;
400
+ seenAck.add(userJid);
401
+ ackHints.push({ jid: userJid });
402
+ }
403
+ const reportingArtifacts = await this.tryBuildReportingTokenArtifacts({
404
+ message: messageWithSecret,
405
+ stanzaId: sendOptions.id,
406
+ senderUserJid: (0, jid_1.toUserJid)(senderJid),
407
+ remoteJid: constants_1.WA_DEFAULTS.STATUS_BROADCAST_JID,
408
+ context: 'status'
409
+ });
410
+ const customNodes = [(0, message_1.buildMetaNode)({ status_setting: statusSetting })];
411
+ if (reportingArtifacts?.node)
412
+ customNodes.push(reportingArtifacts.node);
413
+ return {
414
+ extraParticipants: ackHints,
415
+ customNodes
416
+ };
417
+ }
418
+ });
419
+ }
420
+ async publishBroadcastListMessage(input) {
421
+ if (input.recipients.length === 0) {
422
+ throw new Error('publishBroadcastListMessage requires at least one recipient');
423
+ }
424
+ const meJid = this.requireCurrentMeJid('publishBroadcastListMessage');
425
+ const senderJid = (0, jid_1.normalizeDeviceJid)(meJid);
426
+ return this.publishSenderKeyFanout({
427
+ groupJid: input.listJid,
428
+ senderJid,
429
+ recipients: input.recipients,
430
+ message: input.message,
431
+ options: input.options ?? {},
432
+ logTag: 'broadcast list',
433
+ customize: ({ fanoutDeviceJids }) => {
434
+ const phashTargets = new Array(fanoutDeviceJids.length + 1);
435
+ let phashTargetCount = 0;
436
+ for (let i = 0; i < fanoutDeviceJids.length; i += 1) {
437
+ const candidate = fanoutDeviceJids[i];
438
+ if ((0, jid_1.isHostedDeviceJid)(candidate))
439
+ continue;
440
+ phashTargets[phashTargetCount] = candidate;
441
+ phashTargetCount += 1;
442
+ }
443
+ phashTargets[phashTargetCount] = senderJid;
444
+ phashTargets.length = phashTargetCount + 1;
445
+ return Promise.resolve({ phash: (0, phash_1.computePhashV2)(phashTargets) });
446
+ }
447
+ });
448
+ }
449
+ async publishSenderKeyFanout(input) {
450
+ const sendOptions = await this.withResolvedMessageId(input.options);
451
+ const sender = (0, jid_1.parseSignalAddressFromJid)(input.senderJid);
452
+ const messageWithSecret = await (0, _message_1.ensureMessageSecret)(input.message);
453
+ const plaintext = await (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(messageWithSecret).finish());
454
+ const { distributionMessage, ciphertext: groupCiphertext, keyId: senderKeyId } = await this.deps.senderKeyManager.prepareGroupEncryption(input.groupJid, sender, plaintext);
455
+ const { fanoutDeviceJids, distributionParticipants } = await this.encryptGroupDistributionParticipants(input.groupJid, senderKeyId, distributionMessage, input.recipients);
456
+ let shouldAttachDeviceIdentity = false;
457
+ for (let i = 0; i < distributionParticipants.length; i += 1) {
458
+ if (distributionParticipants[i].encType === 'pkmsg') {
459
+ shouldAttachDeviceIdentity = true;
460
+ break;
461
+ }
462
+ }
463
+ const extras = input.customize
464
+ ? await input.customize({
465
+ fanoutDeviceJids,
466
+ distributionParticipants,
467
+ messageWithSecret,
468
+ sendOptions
469
+ })
470
+ : {};
471
+ const participants = distributionParticipants.map((p) => ({
472
+ jid: p.jid,
473
+ encType: p.encType,
474
+ ciphertext: p.ciphertext
475
+ }));
476
+ if (extras.extraParticipants) {
477
+ for (const entry of extras.extraParticipants) {
478
+ participants.push(entry);
479
+ }
480
+ }
481
+ const messageNode = (0, message_1.buildGroupSenderKeyMessageNode)({
482
+ to: input.groupJid,
483
+ type: (0, content_1.resolveMessageTypeAttr)(messageWithSecret),
484
+ id: sendOptions.id,
485
+ phash: extras.phash,
486
+ edit: (0, content_1.resolveEditAttr)(messageWithSecret) ?? undefined,
487
+ mediatype: (0, content_1.resolveEncMediaType)(messageWithSecret) ?? undefined,
488
+ decryptFail: (0, content_1.resolveDecryptFailAttr)(messageWithSecret),
489
+ groupCiphertext: groupCiphertext.ciphertext,
490
+ participants,
491
+ deviceIdentity: shouldAttachDeviceIdentity
492
+ ? this.getEncodedSignedDeviceIdentity()
493
+ : undefined,
494
+ customNodes: extras.customNodes,
495
+ additionalAttributes: sendOptions.additionalAttributes
496
+ });
497
+ const replayPayload = {
498
+ mode: 'plaintext',
499
+ to: input.groupJid,
500
+ type: messageNode.attrs.type,
501
+ plaintext,
502
+ ...(input.replayStatusSetting ? { statusSetting: input.replayStatusSetting } : {})
503
+ };
504
+ const result = await this.deps.retryTracker.track({
505
+ messageIdHint: messageNode.attrs.id ?? sendOptions.id,
506
+ toJid: input.groupJid,
507
+ replayPayload,
508
+ eligibleRequesterDeviceJids: undefined
509
+ }, async () => this.deps.messageClient.publishNode(messageNode, sendOptions));
510
+ const distributedAddresses = new Array(distributionParticipants.length);
511
+ for (let i = 0; i < distributionParticipants.length; i += 1) {
512
+ distributedAddresses[i] = distributionParticipants[i].address;
513
+ }
514
+ try {
515
+ await this.deps.senderKeyManager.markSenderKeyDistributed(input.groupJid, senderKeyId, distributedAddresses);
516
+ }
517
+ catch (error) {
518
+ this.deps.logger.warn('failed to mark sender key distribution targets', {
519
+ logTag: input.logTag,
520
+ groupJid: input.groupJid,
521
+ participants: distributedAddresses.length,
522
+ message: (0, primitives_2.toError)(error).message
523
+ });
524
+ }
525
+ return result;
191
526
  }
192
527
  async requestAppStateSyncKeys(keyIds) {
193
- return this.appStateSyncKeyProtocol.requestKeys(keyIds);
528
+ return this.deps.appStateSyncKeyProtocol.requestKeys(keyIds);
194
529
  }
195
530
  async sendAppStateSyncKeyShare(toDeviceJid, keys, missingKeyIds = []) {
196
- await this.appStateSyncKeyProtocol.sendKeyShare(toDeviceJid, keys, missingKeyIds);
531
+ await this.deps.appStateSyncKeyProtocol.sendKeyShare(toDeviceJid, keys, missingKeyIds);
197
532
  }
198
- async mutateParticipantsCacheFromGroupEvent(event) {
199
- await this.participantsCache.mutateFromGroupEvent(event);
533
+ async mutateGroupMetadataCacheFromGroupEvent(event) {
534
+ await this.deps.groupMetadataCache.mutateFromGroupEvent(event);
200
535
  }
536
+ // noop for now
201
537
  shouldUseGroupDirectPath(message) {
202
- const protocolType = message.protocolMessage?.type;
203
- if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.REVOKE ||
204
- protocolType === _proto_1.proto.Message.ProtocolMessage.Type.MESSAGE_EDIT) {
205
- return true;
206
- }
207
- return message.keepInChatMessage?.keepType === _proto_1.proto.KeepType.UNDO_KEEP_FOR_ALL;
538
+ return false;
208
539
  }
209
- async publishGroupDirectMessage(groupJid, message, plaintext, type, options, retryContext = {}, edit, mediatype, metaNode) {
210
- const sendOptions = await this.withResolvedMessageId(options);
540
+ async publishGroupDirectMessage(groupJid, envelope, retryContext = {}) {
541
+ const { message, plaintext, type, edit, mediatype, sendOptions } = envelope;
211
542
  const meJid = this.requireCurrentMeJid('sendMessage');
212
543
  const participantUserJids = retryContext.forceRefreshParticipants
213
- ? await this.participantsCache.refreshParticipantUsers(groupJid)
214
- : await this.participantsCache.resolveParticipantUsers(groupJid);
544
+ ? await this.deps.groupMetadataCache.refreshParticipantUsers(groupJid)
545
+ : await this.deps.groupMetadataCache.resolveParticipantUsers(groupJid);
215
546
  const addressingMode = retryContext.forceAddressingMode ??
216
547
  this.resolveGroupAddressingMode(participantUserJids, groupJid);
217
548
  const senderForPhash = this.resolveSenderForAddressingMode(addressingMode, meJid);
218
- const fanoutDeviceJids = await this.fanoutResolver.resolveGroupParticipantDeviceJids(participantUserJids);
549
+ const fanoutDeviceJids = await this.deps.fanoutResolver.resolveGroupParticipantDeviceJids(participantUserJids);
219
550
  if (fanoutDeviceJids.length === 0) {
220
551
  throw new Error('group direct send resolved no target devices');
221
552
  }
222
- const resolvedFanoutTargets = await this.sessionResolver.ensureSessionsBatch(fanoutDeviceJids);
553
+ const resolvedFanoutTargets = await this.deps.sessionResolver.ensureSessionsBatch(fanoutDeviceJids);
554
+ const resolvedNormalizedJids = new Set();
555
+ for (let index = 0; index < resolvedFanoutTargets.length; index += 1) {
556
+ resolvedNormalizedJids.add(resolvedFanoutTargets[index].jid);
557
+ }
223
558
  const uniqueNormalizedFanoutJids = new Set();
224
559
  for (let index = 0; index < fanoutDeviceJids.length; index += 1) {
225
560
  uniqueNormalizedFanoutJids.add((0, jid_1.normalizeDeviceJid)(fanoutDeviceJids[index]));
226
561
  }
227
- if (resolvedFanoutTargets.length !== uniqueNormalizedFanoutJids.size) {
228
- throw new Error('group direct send resolved incomplete signal sessions');
562
+ const droppedDevices = [];
563
+ for (const expected of uniqueNormalizedFanoutJids) {
564
+ if (!resolvedNormalizedJids.has(expected)) {
565
+ droppedDevices.push(expected);
566
+ }
567
+ }
568
+ if (droppedDevices.length > 0) {
569
+ this.deps.logger.warn('group direct fanout dropping devices without signal session', {
570
+ groupJid,
571
+ droppedCount: droppedDevices.length,
572
+ totalExpected: uniqueNormalizedFanoutJids.size,
573
+ sample: droppedDevices.slice(0, 3)
574
+ });
575
+ }
576
+ if (resolvedFanoutTargets.length === 0) {
577
+ throw new Error('group direct send resolved no signal sessions');
229
578
  }
230
579
  const participantEncryptRequests = new Array(resolvedFanoutTargets.length);
231
580
  for (let index = 0; index < resolvedFanoutTargets.length; index += 1) {
@@ -235,7 +584,7 @@ class WaMessageDispatchCoordinator {
235
584
  plaintext
236
585
  };
237
586
  }
238
- const encryptedParticipants = await this.signalProtocol.encryptMessagesBatch(participantEncryptRequests, resolvedFanoutTargets);
587
+ const encryptedParticipants = await this.deps.signalProtocol.encryptMessagesBatch(participantEncryptRequests, resolvedFanoutTargets);
239
588
  const participants = new Array(resolvedFanoutTargets.length);
240
589
  for (let index = 0; index < resolvedFanoutTargets.length; index += 1) {
241
590
  const target = resolvedFanoutTargets[index];
@@ -253,20 +602,27 @@ class WaMessageDispatchCoordinator {
253
602
  }
254
603
  }
255
604
  const phashTargets = new Array(resolvedFanoutTargets.length + 1);
605
+ let phashTargetCount = 0;
256
606
  for (let index = 0; index < resolvedFanoutTargets.length; index += 1) {
257
- phashTargets[index] = resolvedFanoutTargets[index].jid;
258
- }
259
- phashTargets[resolvedFanoutTargets.length] = senderForPhash;
260
- const [localPhash, reportingArtifacts] = await Promise.all([
261
- (0, phash_1.computePhashV2)(phashTargets),
262
- this.tryBuildReportingTokenArtifacts({
263
- message,
264
- stanzaId: sendOptions.id,
265
- senderUserJid: (0, jid_1.toUserJid)(senderForPhash),
266
- remoteJid: groupJid,
267
- context: 'group_direct'
268
- })
269
- ]);
607
+ const candidate = resolvedFanoutTargets[index].jid;
608
+ if ((0, jid_1.isHostedDeviceJid)(candidate))
609
+ continue;
610
+ phashTargets[phashTargetCount] = candidate;
611
+ phashTargetCount += 1;
612
+ }
613
+ phashTargets[phashTargetCount] = senderForPhash;
614
+ phashTargets.length = phashTargetCount + 1;
615
+ const localPhash = (0, phash_1.computePhashV2)(phashTargets);
616
+ const reportingArtifacts = await this.tryBuildReportingTokenArtifacts({
617
+ message,
618
+ stanzaId: sendOptions.id,
619
+ senderUserJid: (0, jid_1.toUserJid)(senderForPhash),
620
+ remoteJid: groupJid,
621
+ context: 'group_direct'
622
+ });
623
+ const customNodes = envelope.customNodes ? [...envelope.customNodes] : [];
624
+ if (reportingArtifacts?.node)
625
+ customNodes.push(reportingArtifacts.node);
270
626
  const messageNode = (0, message_1.buildDirectMessageFanoutNode)({
271
627
  to: groupJid,
272
628
  type,
@@ -278,9 +634,10 @@ class WaMessageDispatchCoordinator {
278
634
  deviceIdentity: shouldAttachDeviceIdentity
279
635
  ? this.getEncodedSignedDeviceIdentity()
280
636
  : undefined,
281
- reportingNode: reportingArtifacts?.node ?? undefined,
282
- metaNode,
283
- mediatype
637
+ customNodes: customNodes.length > 0 ? customNodes : undefined,
638
+ mediatype,
639
+ decryptFail: envelope.decryptFail,
640
+ additionalAttributes: sendOptions.additionalAttributes
284
641
  });
285
642
  const replayPayload = {
286
643
  mode: 'plaintext',
@@ -288,13 +645,12 @@ class WaMessageDispatchCoordinator {
288
645
  type,
289
646
  plaintext
290
647
  };
291
- const result = await this.retryTracker.track({
292
- messageIdHint: sendOptions.id ?? messageNode.attrs.id,
648
+ const result = await this.deps.retryTracker.track({
649
+ messageIdHint: messageNode.attrs.id ?? sendOptions.id,
293
650
  toJid: groupJid,
294
- type,
295
651
  replayPayload,
296
652
  eligibleRequesterDeviceJids: undefined
297
- }, async () => this.messageClient.publishNode(messageNode, sendOptions));
653
+ }, async () => this.deps.messageClient.publishNode(messageNode, sendOptions));
298
654
  const ackError = result.ack.error;
299
655
  const serverPhash = result.ack.phash;
300
656
  const serverAddressingMode = result.ack.addressingMode;
@@ -303,7 +659,7 @@ class WaMessageDispatchCoordinator {
303
659
  const hasAddressingError = ackError === 421;
304
660
  if (!retryContext.retried &&
305
661
  (hasPhashMismatch || hasAddressingMismatch || hasAddressingError)) {
306
- this.logger.warn('group direct publish acknowledged with mismatch metadata', {
662
+ this.deps.logger.warn('group direct publish acknowledged with mismatch metadata', {
307
663
  id: result.id,
308
664
  groupJid,
309
665
  localPhash,
@@ -312,28 +668,88 @@ class WaMessageDispatchCoordinator {
312
668
  serverAddressingMode,
313
669
  ackError
314
670
  });
315
- return this.publishGroupDirectMessage(groupJid, message, plaintext, type, {
316
- ...sendOptions,
317
- id: result.id
671
+ return this.publishGroupDirectMessage(groupJid, {
672
+ ...envelope,
673
+ sendOptions: { ...sendOptions, id: result.id }
318
674
  }, {
319
675
  retried: true,
320
676
  forceRefreshParticipants: true,
321
677
  forceAddressingMode: serverAddressingMode
322
- }, edit, mediatype, metaNode);
678
+ });
323
679
  }
324
680
  return result;
325
681
  }
326
- async publishGroupSenderKeyMessage(groupJid, message, plaintext, type, options, retryContext = {}, edit, mediatype, metaNode) {
327
- const sendOptions = await this.withResolvedMessageId(options);
682
+ // Returns null on any failure so the group send still goes out unchanged.
683
+ async buildBotSidecarParticipant(message) {
684
+ const botJid = (0, bot_1.extractInvokedBotJid)(message);
685
+ if (!botJid)
686
+ return null;
687
+ let address;
688
+ try {
689
+ address = (0, jid_1.parseSignalAddressFromJid)(botJid);
690
+ }
691
+ catch (error) {
692
+ this.deps.logger.debug('bot sidecar: failed to parse bot jid', {
693
+ botJid,
694
+ message: (0, primitives_2.toError)(error).message
695
+ });
696
+ return null;
697
+ }
698
+ let resolvedTargets;
699
+ try {
700
+ resolvedTargets = await this.deps.sessionResolver.ensureSessionsBatch([botJid]);
701
+ }
702
+ catch (error) {
703
+ this.deps.logger.debug('bot sidecar: signal session sync failed', {
704
+ botJid,
705
+ message: (0, primitives_2.toError)(error).message
706
+ });
707
+ return null;
708
+ }
709
+ if (resolvedTargets.length === 0) {
710
+ this.deps.logger.debug('bot sidecar: signal session not established', { botJid });
711
+ return null;
712
+ }
713
+ // The bot seeds its streaming-response keys from this HKDF derivation.
714
+ const parentMessageSecret = message.messageContextInfo?.messageSecret;
715
+ const botMessageSecret = parentMessageSecret && parentMessageSecret.byteLength > 0
716
+ ? (0, bot_1.genBotMsgSecret)(parentMessageSecret)
717
+ : undefined;
718
+ const botCopy = (0, bot_1.buildBotInvokeProtoCopy)(message, botMessageSecret);
719
+ const botPlaintext = await (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode(botCopy).finish());
720
+ try {
721
+ const [encrypted] = await this.deps.signalProtocol.encryptMessagesBatch([{ address, plaintext: botPlaintext }], resolvedTargets.map((target) => ({
722
+ address: target.address,
723
+ session: target.session
724
+ })));
725
+ if (!encrypted)
726
+ return null;
727
+ this.deps.logger.trace('bot sidecar encrypted', { botJid, encType: encrypted.type });
728
+ return {
729
+ jid: botJid,
730
+ encType: encrypted.type,
731
+ ciphertext: encrypted.ciphertext
732
+ };
733
+ }
734
+ catch (error) {
735
+ this.deps.logger.debug('bot sidecar: encryption failed', {
736
+ botJid,
737
+ message: (0, primitives_2.toError)(error).message
738
+ });
739
+ return null;
740
+ }
741
+ }
742
+ async publishGroupSenderKeyMessage(groupJid, envelope, retryContext = {}) {
743
+ const { message, plaintext, type, edit, mediatype, sendOptions } = envelope;
328
744
  const meJid = this.requireCurrentMeJid('sendMessage');
329
745
  const participantUserJids = retryContext.forceRefreshParticipants
330
- ? await this.participantsCache.refreshParticipantUsers(groupJid)
331
- : await this.participantsCache.resolveParticipantUsers(groupJid);
746
+ ? await this.deps.groupMetadataCache.refreshParticipantUsers(groupJid)
747
+ : await this.deps.groupMetadataCache.resolveParticipantUsers(groupJid);
332
748
  const addressingMode = retryContext.forceAddressingMode ??
333
749
  this.resolveGroupAddressingMode(participantUserJids, groupJid);
334
750
  const senderJid = this.resolveSenderForAddressingMode(addressingMode, meJid);
335
751
  const sender = (0, jid_1.parseSignalAddressFromJid)(senderJid);
336
- const { distributionMessage: senderKeyDistributionMessage, ciphertext: groupCiphertext, keyId: senderKeyId } = await this.senderKeyManager.prepareGroupEncryption(groupJid, sender, plaintext);
752
+ const { distributionMessage: senderKeyDistributionMessage, ciphertext: groupCiphertext, keyId: senderKeyId } = await this.deps.senderKeyManager.prepareGroupEncryption(groupJid, sender, plaintext);
337
753
  const distributionData = await this.distributionDedup.run(`dist:${groupJid}:${senderKeyId}`, () => this.encryptGroupDistributionParticipants(groupJid, senderKeyId, senderKeyDistributionMessage, participantUserJids));
338
754
  const { fanoutDeviceJids, distributionParticipants } = distributionData;
339
755
  let shouldAttachDeviceIdentity = false;
@@ -344,20 +760,28 @@ class WaMessageDispatchCoordinator {
344
760
  }
345
761
  }
346
762
  const phashTargets = new Array(fanoutDeviceJids.length + 1);
763
+ let phashTargetCount = 0;
347
764
  for (let index = 0; index < fanoutDeviceJids.length; index += 1) {
348
- phashTargets[index] = fanoutDeviceJids[index];
349
- }
350
- phashTargets[fanoutDeviceJids.length] = senderJid;
351
- const [localPhash, reportingArtifacts] = await Promise.all([
352
- (0, phash_1.computePhashV2)(phashTargets),
353
- this.tryBuildReportingTokenArtifacts({
354
- message,
355
- stanzaId: sendOptions.id,
356
- senderUserJid: (0, jid_1.toUserJid)(senderJid),
357
- remoteJid: groupJid,
358
- context: 'group_sender_key'
359
- })
360
- ]);
765
+ const candidate = fanoutDeviceJids[index];
766
+ if ((0, jid_1.isHostedDeviceJid)(candidate))
767
+ continue;
768
+ phashTargets[phashTargetCount] = candidate;
769
+ phashTargetCount += 1;
770
+ }
771
+ phashTargets[phashTargetCount] = senderJid;
772
+ phashTargets.length = phashTargetCount + 1;
773
+ const localPhash = (0, phash_1.computePhashV2)(phashTargets);
774
+ const reportingArtifacts = await this.tryBuildReportingTokenArtifacts({
775
+ message,
776
+ stanzaId: sendOptions.id,
777
+ senderUserJid: (0, jid_1.toUserJid)(senderJid),
778
+ remoteJid: groupJid,
779
+ context: 'group_sender_key'
780
+ });
781
+ const botSidecar = await this.buildBotSidecarParticipant(message);
782
+ const customNodes = envelope.customNodes ? [...envelope.customNodes] : [];
783
+ if (reportingArtifacts?.node)
784
+ customNodes.push(reportingArtifacts.node);
361
785
  const messageNode = (0, message_1.buildGroupSenderKeyMessageNode)({
362
786
  to: groupJid,
363
787
  type,
@@ -367,12 +791,14 @@ class WaMessageDispatchCoordinator {
367
791
  addressingMode,
368
792
  groupCiphertext: groupCiphertext.ciphertext,
369
793
  participants: distributionParticipants,
370
- deviceIdentity: shouldAttachDeviceIdentity
794
+ deviceIdentity: shouldAttachDeviceIdentity || botSidecar?.encType === 'pkmsg'
371
795
  ? this.getEncodedSignedDeviceIdentity()
372
796
  : undefined,
373
- reportingNode: reportingArtifacts?.node ?? undefined,
374
- metaNode,
375
- mediatype
797
+ customNodes: customNodes.length > 0 ? customNodes : undefined,
798
+ mediatype,
799
+ decryptFail: envelope.decryptFail,
800
+ botParticipants: botSidecar ? [botSidecar] : undefined,
801
+ additionalAttributes: sendOptions.additionalAttributes
376
802
  });
377
803
  const replayPayload = {
378
804
  mode: 'plaintext',
@@ -380,22 +806,21 @@ class WaMessageDispatchCoordinator {
380
806
  type,
381
807
  plaintext
382
808
  };
383
- const result = await this.retryTracker.track({
384
- messageIdHint: sendOptions.id ?? messageNode.attrs.id,
809
+ const result = await this.deps.retryTracker.track({
810
+ messageIdHint: messageNode.attrs.id ?? sendOptions.id,
385
811
  toJid: groupJid,
386
- type,
387
812
  replayPayload,
388
813
  eligibleRequesterDeviceJids: undefined
389
- }, async () => this.messageClient.publishNode(messageNode, sendOptions));
814
+ }, async () => this.deps.messageClient.publishNode(messageNode, sendOptions));
390
815
  const distributedAddresses = new Array(distributionParticipants.length);
391
816
  for (let index = 0; index < distributionParticipants.length; index += 1) {
392
817
  distributedAddresses[index] = distributionParticipants[index].address;
393
818
  }
394
819
  try {
395
- await this.senderKeyManager.markSenderKeyDistributed(groupJid, senderKeyId, distributedAddresses);
820
+ await this.deps.senderKeyManager.markSenderKeyDistributed(groupJid, senderKeyId, distributedAddresses);
396
821
  }
397
822
  catch (error) {
398
- this.logger.warn('failed to mark sender key distribution targets', {
823
+ this.deps.logger.warn('failed to mark sender key distribution targets', {
399
824
  groupJid,
400
825
  participants: distributedAddresses.length,
401
826
  message: (0, primitives_2.toError)(error).message
@@ -409,7 +834,7 @@ class WaMessageDispatchCoordinator {
409
834
  const hasAddressingError = ackError === 421;
410
835
  if (!retryContext.retried &&
411
836
  (hasPhashMismatch || hasAddressingMismatch || hasAddressingError)) {
412
- this.logger.warn('group message publish acknowledged with mismatch metadata', {
837
+ this.deps.logger.warn('group message publish acknowledged with mismatch metadata', {
413
838
  id: result.id,
414
839
  groupJid,
415
840
  localPhash,
@@ -418,14 +843,14 @@ class WaMessageDispatchCoordinator {
418
843
  serverAddressingMode,
419
844
  ackError
420
845
  });
421
- return this.publishGroupSenderKeyMessage(groupJid, message, plaintext, type, {
422
- ...sendOptions,
423
- id: result.id
846
+ return this.publishGroupSenderKeyMessage(groupJid, {
847
+ ...envelope,
848
+ sendOptions: { ...sendOptions, id: result.id }
424
849
  }, {
425
850
  retried: true,
426
851
  forceRefreshParticipants: true,
427
852
  forceAddressingMode: serverAddressingMode
428
- }, edit, mediatype, metaNode);
853
+ });
429
854
  }
430
855
  return result;
431
856
  }
@@ -435,7 +860,7 @@ class WaMessageDispatchCoordinator {
435
860
  return 'lid';
436
861
  }
437
862
  }
438
- this.logger.trace('group addressing mode resolved to pn (default)', {
863
+ this.deps.logger.trace('group addressing mode resolved to pn (default)', {
439
864
  groupJid,
440
865
  participants: participantUserJids.length
441
866
  });
@@ -443,13 +868,13 @@ class WaMessageDispatchCoordinator {
443
868
  }
444
869
  resolveSenderForAddressingMode(addressingMode, meJid) {
445
870
  if (addressingMode === 'lid') {
446
- const meLid = this.getCurrentMeLid();
871
+ const meLid = this.deps.getCurrentCredentials()?.meLid;
447
872
  if (meLid && meLid.includes('@')) {
448
873
  try {
449
874
  return (0, jid_1.normalizeDeviceJid)(meLid);
450
875
  }
451
876
  catch (error) {
452
- this.logger.trace('ignoring malformed me lid jid', {
877
+ this.deps.logger.trace('ignoring malformed me lid jid', {
453
878
  meLid,
454
879
  message: (0, primitives_2.toError)(error).message
455
880
  });
@@ -462,7 +887,7 @@ class WaMessageDispatchCoordinator {
462
887
  const distributionPayload = await (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode({
463
888
  senderKeyDistributionMessage
464
889
  }).finish());
465
- const fanoutDeviceJids = await this.fanoutResolver.resolveGroupParticipantDeviceJids(participantUserJids);
890
+ const fanoutDeviceJids = await this.deps.fanoutResolver.resolveGroupParticipantDeviceJids(participantUserJids);
466
891
  if (fanoutDeviceJids.length === 0) {
467
892
  return {
468
893
  fanoutDeviceJids,
@@ -477,7 +902,7 @@ class WaMessageDispatchCoordinator {
477
902
  fanoutAddresses[index] = address;
478
903
  fanoutTargetsByAddressKey.set((0, jid_1.signalAddressKey)(address), { jid, address });
479
904
  }
480
- const pendingAddresses = await this.senderKeyManager.filterParticipantsNeedingDistribution(groupJid, senderKeyId, fanoutAddresses);
905
+ const pendingAddresses = await this.deps.senderKeyManager.filterParticipantsNeedingDistribution(groupJid, senderKeyId, fanoutAddresses);
481
906
  if (pendingAddresses.length === 0) {
482
907
  return {
483
908
  fanoutDeviceJids,
@@ -510,7 +935,7 @@ class WaMessageDispatchCoordinator {
510
935
  let availableTargets = [];
511
936
  let prefetchedAvailableTargets;
512
937
  try {
513
- const resolvedTargets = await this.sessionResolver.ensureSessionsBatch(pendingTargetJids);
938
+ const resolvedTargets = await this.deps.sessionResolver.ensureSessionsBatch(pendingTargetJids);
514
939
  availableTargets = resolvedTargets;
515
940
  prefetchedAvailableTargets = resolvedTargets;
516
941
  }
@@ -519,7 +944,7 @@ class WaMessageDispatchCoordinator {
519
944
  if (normalized.message === 'identity mismatch') {
520
945
  throw normalized;
521
946
  }
522
- this.logger.warn('group sender-key distribution session sync failed, continuing with available sessions', {
947
+ this.deps.logger.warn('group sender-key distribution session sync failed, continuing with available sessions', {
523
948
  groupJid,
524
949
  requested: pendingTargetJids.length,
525
950
  message: normalized.message
@@ -528,7 +953,7 @@ class WaMessageDispatchCoordinator {
528
953
  for (let index = 0; index < pendingTargets.length; index += 1) {
529
954
  pendingTargetAddresses[index] = pendingTargets[index].address;
530
955
  }
531
- const hasPendingSessions = await this.sessionStore.hasSessions(pendingTargetAddresses);
956
+ const hasPendingSessions = await this.deps.sessionStore.hasSessions(pendingTargetAddresses);
532
957
  const nextAvailableTargets = [];
533
958
  for (let index = 0; index < pendingTargets.length; index += 1) {
534
959
  if (hasPendingSessions[index]) {
@@ -551,7 +976,7 @@ class WaMessageDispatchCoordinator {
551
976
  plaintext: distributionPayload
552
977
  };
553
978
  }
554
- const encryptedDistributionParticipants = await this.signalProtocol.encryptMessagesBatch(distributionEncryptRequests, prefetchedAvailableTargets);
979
+ const encryptedDistributionParticipants = await this.deps.signalProtocol.encryptMessagesBatch(distributionEncryptRequests, prefetchedAvailableTargets);
555
980
  const distributionParticipants = new Array(availableTargets.length);
556
981
  for (let index = 0; index < availableTargets.length; index += 1) {
557
982
  const target = availableTargets[index];
@@ -567,12 +992,12 @@ class WaMessageDispatchCoordinator {
567
992
  distributionParticipants
568
993
  };
569
994
  }
570
- async publishDirectSignalMessageWithFanout(recipientJid, message, plaintext, type, options, edit, mediatype, metaNode) {
571
- const sendOptions = await this.withResolvedMessageId(options);
995
+ async publishDirectSignalMessageWithFanout(recipientJid, envelope) {
996
+ const { message, plaintext, type, edit, mediatype, sendOptions } = envelope;
572
997
  const meJid = this.requireCurrentMeJid('sendMessage');
573
- const meLid = this.getCurrentMeLid();
574
- const selfDeviceJidForRecipient = this.fanoutResolver.resolveSelfDeviceJidForRecipient(recipientJid, meJid, meLid);
575
- const deviceJids = await this.fanoutResolver.resolveDirectFanoutDeviceJids(recipientJid, selfDeviceJidForRecipient);
998
+ const meLid = this.deps.getCurrentCredentials()?.meLid;
999
+ const selfDeviceJidForRecipient = this.deps.fanoutResolver.resolveSelfDeviceJidForRecipient(recipientJid, meJid, meLid);
1000
+ const deviceJids = await this.deps.fanoutResolver.resolveDirectFanoutDeviceJids(recipientJid, selfDeviceJidForRecipient);
576
1001
  const targets = new Array(deviceJids.length);
577
1002
  for (let index = 0; index < deviceJids.length; index += 1) {
578
1003
  const jid = deviceJids[index];
@@ -585,7 +1010,7 @@ class WaMessageDispatchCoordinator {
585
1010
  }
586
1011
  const recipientUserJid = (0, jid_1.toUserJid)(recipientJid);
587
1012
  const meUserJid = (0, jid_1.toUserJid)(selfDeviceJidForRecipient);
588
- this.logger.debug('wa client publish signal fanout', {
1013
+ this.deps.logger.trace('wa client publish signal fanout', {
589
1014
  to: recipientJid,
590
1015
  devices: deviceJids.length,
591
1016
  type
@@ -599,20 +1024,42 @@ class WaMessageDispatchCoordinator {
599
1024
  }
600
1025
  }
601
1026
  }
602
- const resolvedFanoutTargets = await this.sessionResolver.ensureSessionsBatch(deviceJids, expectedIdentityByJid);
1027
+ const resolvedFanoutTargets = await this.deps.sessionResolver.ensureSessionsBatch(deviceJids, expectedIdentityByJid);
603
1028
  const resolvedFanoutTargetsByJid = new Map();
604
1029
  for (let index = 0; index < resolvedFanoutTargets.length; index += 1) {
605
1030
  const target = resolvedFanoutTargets[index];
606
1031
  resolvedFanoutTargetsByJid.set((0, jid_1.normalizeDeviceJid)(target.jid), target);
607
1032
  }
1033
+ const liveTargets = [];
1034
+ const droppedSecondaryDevices = [];
608
1035
  for (let index = 0; index < targets.length; index += 1) {
609
- if (!resolvedFanoutTargetsByJid.has(targets[index].normalizedJid)) {
610
- throw new Error('direct fanout missing signal sessions for one or more targets');
1036
+ const target = targets[index];
1037
+ if (resolvedFanoutTargetsByJid.has(target.normalizedJid)) {
1038
+ liveTargets.push(target);
1039
+ continue;
611
1040
  }
1041
+ const isPrimaryRecipient = target.userJid === recipientUserJid && target.normalizedJid === target.userJid;
1042
+ if (isPrimaryRecipient) {
1043
+ this.deps.logger.error('direct fanout dropping primary recipient device without signal session', { to: recipientJid, device: target.jid });
1044
+ }
1045
+ else {
1046
+ droppedSecondaryDevices.push(target.jid);
1047
+ }
1048
+ }
1049
+ if (droppedSecondaryDevices.length > 0) {
1050
+ this.deps.logger.warn('direct fanout dropping secondary devices without signal session', {
1051
+ to: recipientJid,
1052
+ droppedCount: droppedSecondaryDevices.length,
1053
+ totalExpected: targets.length,
1054
+ sample: droppedSecondaryDevices.slice(0, 3)
1055
+ });
1056
+ }
1057
+ if (liveTargets.length === 0) {
1058
+ throw new Error('direct fanout missing signal sessions for all targets');
612
1059
  }
613
1060
  let hasSelfDeviceFanout = false;
614
- for (let index = 0; index < targets.length; index += 1) {
615
- if (targets[index].userJid === meUserJid) {
1061
+ for (let index = 0; index < liveTargets.length; index += 1) {
1062
+ if (liveTargets[index].userJid === meUserJid) {
616
1063
  hasSelfDeviceFanout = true;
617
1064
  break;
618
1065
  }
@@ -620,13 +1067,10 @@ class WaMessageDispatchCoordinator {
620
1067
  const selfDevicePlaintext = hasSelfDeviceFanout
621
1068
  ? await (0, padding_1.writeRandomPadMax16)(_proto_1.proto.Message.encode((0, device_sent_1.wrapDeviceSentMessage)(message, recipientUserJid)).finish())
622
1069
  : null;
623
- const participantRequests = new Array(targets.length);
624
- for (let index = 0; index < targets.length; index += 1) {
625
- const target = targets[index];
1070
+ const participantRequests = new Array(liveTargets.length);
1071
+ for (let index = 0; index < liveTargets.length; index += 1) {
1072
+ const target = liveTargets[index];
626
1073
  const resolvedTarget = resolvedFanoutTargetsByJid.get(target.normalizedJid);
627
- if (!resolvedTarget) {
628
- throw new Error('direct fanout missing signal session for target');
629
- }
630
1074
  participantRequests[index] = {
631
1075
  target,
632
1076
  address: resolvedTarget.address,
@@ -651,15 +1095,20 @@ class WaMessageDispatchCoordinator {
651
1095
  session: request.session
652
1096
  };
653
1097
  }
654
- const encryptedParticipants = await this.signalProtocol.encryptMessagesBatch(encryptRequests, prefetchedSessions);
655
- const participants = new Array(participantRequests.length);
1098
+ const encryptedParticipants = await this.deps.signalProtocol.encryptMessagesBatch(encryptRequests, prefetchedSessions);
1099
+ const isBotRecipient = (0, jid_1.isBotJid)(recipientJid);
1100
+ const participants = [];
656
1101
  for (let index = 0; index < participantRequests.length; index += 1) {
657
1102
  const request = participantRequests[index];
658
- participants[index] = {
1103
+ const entry = {
659
1104
  jid: request.target.jid,
660
1105
  encType: encryptedParticipants[index].type,
661
1106
  ciphertext: encryptedParticipants[index].ciphertext
662
1107
  };
1108
+ // wa-web direct 1:1 to bot puts the bot device alongside self devices
1109
+ // inside `<participants>`; the `<bot>` envelope is only used for group
1110
+ // mentions (the sidecar copy) or for bot feedback / revoke flows.
1111
+ participants.push(entry);
663
1112
  }
664
1113
  let shouldAttachDeviceIdentity = false;
665
1114
  for (let index = 0; index < participants.length; index += 1) {
@@ -679,16 +1128,23 @@ class WaMessageDispatchCoordinator {
679
1128
  context: 'direct_fanout'
680
1129
  });
681
1130
  let privacyTokenNode;
682
- try {
683
- privacyTokenNode =
684
- (await this.privacyTokenDedup.run(`pt:${recipientUserJid}`, () => this.resolvePrivacyTokenNode(recipientUserJid))) ?? undefined;
685
- }
686
- catch (error) {
687
- this.logger.warn('privacy token resolution failed', {
688
- to: recipientUserJid,
689
- message: (0, primitives_2.toError)(error).message
690
- });
1131
+ if (!isBotRecipient) {
1132
+ try {
1133
+ privacyTokenNode =
1134
+ (await this.privacyTokenDedup.run(`pt:${recipientUserJid}`, () => this.deps.resolvePrivacyTokenNode(recipientUserJid))) ?? undefined;
1135
+ }
1136
+ catch (error) {
1137
+ this.deps.logger.warn('privacy token resolution failed', {
1138
+ to: recipientUserJid,
1139
+ message: (0, primitives_2.toError)(error).message
1140
+ });
1141
+ }
691
1142
  }
1143
+ const customNodes = envelope.customNodes ? [...envelope.customNodes] : [];
1144
+ if (reportingArtifacts?.node)
1145
+ customNodes.push(reportingArtifacts.node);
1146
+ if (privacyTokenNode)
1147
+ customNodes.push(privacyTokenNode);
692
1148
  const messageNode = (0, message_1.buildDirectMessageFanoutNode)({
693
1149
  to: recipientJid,
694
1150
  type,
@@ -696,10 +1152,10 @@ class WaMessageDispatchCoordinator {
696
1152
  edit,
697
1153
  participants,
698
1154
  deviceIdentity,
699
- reportingNode: reportingArtifacts?.node ?? undefined,
700
- privacyTokenNode,
701
- metaNode,
702
- mediatype
1155
+ customNodes: customNodes.length > 0 ? customNodes : undefined,
1156
+ mediatype,
1157
+ decryptFail: envelope.decryptFail,
1158
+ additionalAttributes: sendOptions.additionalAttributes
703
1159
  });
704
1160
  const replayPayload = {
705
1161
  mode: 'plaintext',
@@ -707,14 +1163,13 @@ class WaMessageDispatchCoordinator {
707
1163
  type,
708
1164
  plaintext
709
1165
  };
710
- const result = await this.retryTracker.track({
711
- messageIdHint: sendOptions.id ?? messageNode.attrs.id,
1166
+ const result = await this.deps.retryTracker.track({
1167
+ messageIdHint: messageNode.attrs.id ?? sendOptions.id,
712
1168
  toJid: recipientJid,
713
- type,
714
1169
  replayPayload,
715
1170
  eligibleRequesterDeviceJids: deviceJids
716
- }, async () => this.messageClient.publishNode(messageNode, sendOptions));
717
- this.onDirectMessageSent(recipientUserJid);
1171
+ }, async () => this.deps.messageClient.publishNode(messageNode, sendOptions));
1172
+ this.deps.onDirectMessageSent(recipientUserJid);
718
1173
  return result;
719
1174
  }
720
1175
  async withResolvedMessageId(options) {
@@ -740,26 +1195,24 @@ class WaMessageDispatchCoordinator {
740
1195
  const dv = new DataView(timestampBytes.buffer, timestampBytes.byteOffset, timestampBytes.byteLength);
741
1196
  if (this.mobileMessageIdFormat) {
742
1197
  dv.setBigUint64(0, BigInt(Date.now()), false);
743
- const entropy = (0, bytes_1.concatBytes)([
1198
+ const digest = (0, primitives_1.md5Bytes)([
744
1199
  timestampBytes,
745
1200
  bytes_1.TEXT_ENCODER.encode(meUserJid),
746
1201
  await (0, _crypto_1.randomBytesAsync)(16)
747
1202
  ]);
748
- const digest = (0, primitives_1.md5Bytes)(entropy);
749
1203
  digest[0] = 0xac;
750
1204
  return (0, bytes_1.bytesToHex)(digest).toUpperCase();
751
1205
  }
752
1206
  dv.setBigUint64(0, BigInt(Math.floor(Date.now() / 1000)), false);
753
- const entropy = (0, bytes_1.concatBytes)([
1207
+ const digest = (0, _crypto_1.sha256)([
754
1208
  timestampBytes,
755
1209
  bytes_1.TEXT_ENCODER.encode(meUserJid),
756
1210
  await (0, _crypto_1.randomBytesAsync)(8)
757
1211
  ]);
758
- const digest = await (0, _crypto_1.sha256)(entropy);
759
1212
  return `3EB0${(0, bytes_1.bytesToHex)(digest.subarray(0, 9)).toUpperCase()}`;
760
1213
  }
761
1214
  catch (error) {
762
- this.logger.warn('failed to generate message id, falling back to random', {
1215
+ this.deps.logger.warn('failed to generate message id, falling back to random', {
763
1216
  message: (0, primitives_2.toError)(error).message
764
1217
  });
765
1218
  if (this.mobileMessageIdFormat) {
@@ -783,7 +1236,7 @@ class WaMessageDispatchCoordinator {
783
1236
  });
784
1237
  }
785
1238
  catch (error) {
786
- this.logger.warn('failed to generate reporting token', {
1239
+ this.deps.logger.warn('failed to generate reporting token', {
787
1240
  context: input.context,
788
1241
  id: input.stanzaId,
789
1242
  remoteJid: input.remoteJid,
@@ -793,7 +1246,7 @@ class WaMessageDispatchCoordinator {
793
1246
  }
794
1247
  }
795
1248
  getEncodedSignedDeviceIdentity() {
796
- const signedIdentity = this.getCurrentSignedIdentity();
1249
+ const signedIdentity = this.deps.getCurrentCredentials()?.signedIdentity;
797
1250
  if (!signedIdentity) {
798
1251
  return undefined;
799
1252
  }
@@ -802,15 +1255,15 @@ class WaMessageDispatchCoordinator {
802
1255
  resolveUserIcdc(userJid, localIdentity) {
803
1256
  return this.icdcDedup.run(`icdc:${userJid}:${localIdentity ? '1' : '0'}`, async () => {
804
1257
  try {
805
- const snapshots = await this.deviceListStore.getUserDevicesBatch([userJid]);
1258
+ const snapshots = await this.deps.deviceListStore.getUserDevicesBatch([userJid]);
806
1259
  const snapshot = snapshots[0];
807
1260
  if (!snapshot || snapshot.deviceJids.length === 0) {
808
1261
  return null;
809
1262
  }
810
- return (0, icdc_1.resolveIcdcMeta)(snapshot.deviceJids, this.identityStore, snapshot.updatedAtMs, localIdentity, this.getIcdcHashLength?.());
1263
+ return (0, icdc_1.resolveIcdcMeta)(snapshot.deviceJids, this.deps.identityStore, snapshot.updatedAtMs, localIdentity, this.deps.getIcdcHashLength?.());
811
1264
  }
812
1265
  catch (error) {
813
- this.logger.trace('icdc resolution failed', {
1266
+ this.deps.logger.trace('icdc resolution failed', {
814
1267
  userJid,
815
1268
  message: (0, primitives_2.toError)(error).message
816
1269
  });
@@ -819,7 +1272,7 @@ class WaMessageDispatchCoordinator {
819
1272
  });
820
1273
  }
821
1274
  requireCurrentMeJid(context) {
822
- const meJid = this.getCurrentMeJid();
1275
+ const meJid = this.deps.getCurrentCredentials()?.meJid;
823
1276
  if (meJid) {
824
1277
  return meJid;
825
1278
  }
@@ -827,3 +1280,28 @@ class WaMessageDispatchCoordinator {
827
1280
  }
828
1281
  }
829
1282
  exports.WaMessageDispatchCoordinator = WaMessageDispatchCoordinator;
1283
+ function pickContentContextInfo(content) {
1284
+ if (typeof content !== 'object' || content === null)
1285
+ return undefined;
1286
+ if ((0, content_1.isSendTextMessage)(content) || (0, content_1.isSendMediaMessage)(content)) {
1287
+ return content.contextInfo;
1288
+ }
1289
+ return undefined;
1290
+ }
1291
+ function assertNewsletterContextInfoCompatible(ctx) {
1292
+ if (!ctx)
1293
+ return;
1294
+ const unsupported = [];
1295
+ if (ctx.quotedMessageId !== undefined)
1296
+ unsupported.push('quote');
1297
+ if (ctx.mentionedJids?.length)
1298
+ unsupported.push('mentions');
1299
+ if (ctx.isSpoiler === true)
1300
+ unsupported.push('isSpoiler');
1301
+ if (ctx.groupSubject !== undefined || ctx.parentGroupJid !== undefined) {
1302
+ unsupported.push('group invite reply (groupSubject/parentGroupJid)');
1303
+ }
1304
+ if (unsupported.length > 0) {
1305
+ throw new Error(`newsletter sends do not support: ${unsupported.join(', ')}`);
1306
+ }
1307
+ }