zapo-js 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,32 +1,46 @@
1
- import { WaAppStateSyncClient } from '../appstate/WaAppStateSyncClient.js';
1
+ import { WaAppStateSyncClient } from '../appstate/sync/WaAppStateSyncClient.js';
2
2
  import { WaAuthClient } from '../auth/WaAuthClient.js';
3
3
  import { WaConnectionManager } from './connection/WaConnectionManager.js';
4
- import { WaKeyShareCoordinator } from './connection/WaKeyShareCoordinator.js';
5
4
  import { WaReceiptQueue } from './connection/WaReceiptQueue.js';
5
+ import { WaAbPropsCoordinator } from './coordinators/WaAbPropsCoordinator.js';
6
6
  import { WaAppStateMutationCoordinator } from './coordinators/WaAppStateMutationCoordinator.js';
7
+ import { createBotCoordinator } from './coordinators/WaBotCoordinator.js';
8
+ import { createBroadcastListCoordinator } from './coordinators/WaBroadcastListCoordinator.js';
7
9
  import { createBusinessCoordinator } from './coordinators/WaBusinessCoordinator.js';
10
+ import { createEmailCoordinator } from './coordinators/WaEmailCoordinator.js';
8
11
  import { createGroupCoordinator } from './coordinators/WaGroupCoordinator.js';
9
12
  import { WaIncomingNodeCoordinator } from './coordinators/WaIncomingNodeCoordinator.js';
13
+ import { createLowLevelCoordinator } from './coordinators/WaLowLevelCoordinator.js';
14
+ import { WaMessageCoordinator } from './coordinators/WaMessageCoordinator.js';
10
15
  import { WaMessageDispatchCoordinator } from './coordinators/WaMessageDispatchCoordinator.js';
16
+ import { createNewsletterCoordinator } from './coordinators/WaNewsletterCoordinator.js';
17
+ import { WaOfflineResumeCoordinator } from './coordinators/WaOfflineResumeCoordinator.js';
11
18
  import { WaPassiveTasksCoordinator } from './coordinators/WaPassiveTasksCoordinator.js';
19
+ import { createPresenceCoordinator } from './coordinators/WaPresenceCoordinator.js';
12
20
  import { createPrivacyCoordinator } from './coordinators/WaPrivacyCoordinator.js';
13
21
  import { createProfileCoordinator } from './coordinators/WaProfileCoordinator.js';
14
22
  import { WaRetryCoordinator } from './coordinators/WaRetryCoordinator.js';
23
+ import { createStatusCoordinator } from './coordinators/WaStatusCoordinator.js';
15
24
  import { createStreamControlHandler } from './coordinators/WaStreamControlCoordinator.js';
16
25
  import { WaTrustedContactTokenCoordinator } from './coordinators/WaTrustedContactTokenCoordinator.js';
17
- import { handleDirtyBits, parseDirtyBits } from './dirty.js';
18
26
  import { DEVICE_NOTIFICATION_ACTIONS, parseDeviceNotification } from './events/devices.js';
27
+ import { handleDirtyBits, parseDirtyBits } from './events/dirty.js';
19
28
  import { parseIdentityChangeNotification } from './events/identity.js';
20
29
  import { parsePrivacyTokenNotification } from './events/privacy-token.js';
21
- import { buildMediaMessageContent, getMediaConn as getClientMediaConn } from './messages.js';
22
30
  import { createDeviceFanoutResolver } from './messaging/fanout.js';
31
+ import { createGroupMetadataCache } from './messaging/group-metadata.js';
23
32
  import { createAppStateSyncKeyProtocol } from './messaging/key-protocol.js';
24
- import { createGroupParticipantsCache } from './messaging/participants.js';
25
- import { WaMediaTransferClient } from '../media/WaMediaTransferClient.js';
26
- import { handleIncomingMessageAck } from '../message/incoming.js';
33
+ import { resolveLinkPreview } from './messaging/link-preview.js';
34
+ import { buildMediaMessageContent, getMediaConn as getClientMediaConn } from './messaging/messages.js';
35
+ import { WaMediaTransferClient } from '../media/transfer/WaMediaTransferClient.js';
36
+ import { createDefaultLinkPreviewFetcher } from '../message/addons/link-preview/fetcher.js';
37
+ import { processNewsletterLiveUpdates } from '../message/kinds/newsletter.js';
38
+ import { handleIncomingMessageAck } from '../message/primitives/incoming.js';
39
+ import { createPeerDataOperationRequester } from '../message/primitives/peer-data-operation.js';
27
40
  import { WaMessageClient } from '../message/WaMessageClient.js';
28
- import { getWaCompanionPlatformId, WA_DEFAULTS, WA_DISCONNECT_REASONS, WA_NODE_TAGS, WA_NOTIFICATION_TYPES, WA_PRIVACY_TOKEN_NOTIFICATION_TYPE } from '../protocol/constants.js';
29
- import { parseSignalAddressFromJid, toUserJid } from '../protocol/jid.js';
41
+ import { getWaCompanionPlatformId, WA_DEFAULTS, WA_DISCONNECT_REASONS, WA_NEWSLETTER_NOTIFICATION_TAGS, WA_NODE_TAGS, WA_NOTIFICATION_TYPES, WA_PRIVACY_TOKEN_NOTIFICATION_TYPE } from '../protocol/constants.js';
42
+ import { isNewsletterJid, parseSignalAddressFromJid, toUserJid } from '../protocol/jid.js';
43
+ import { WA_PRESENCE_TYPES } from '../protocol/presence.js';
30
44
  import { createOutboundRetryTracker } from '../retry/tracker.js';
31
45
  import { SignalDeviceSyncApi } from '../signal/api/SignalDeviceSyncApi.js';
32
46
  import { SignalDigestSyncApi } from '../signal/api/SignalDigestSyncApi.js';
@@ -39,11 +53,13 @@ import { createSignalSessionResolver } from '../signal/session/resolver.js';
39
53
  import { SignalProtocol } from '../signal/session/SignalProtocol.js';
40
54
  import { WaKeepAlive } from '../transport/keepalive/WaKeepAlive.js';
41
55
  import { buildAckNode } from '../transport/node/builders/global.js';
56
+ import { buildPresenceNode } from '../transport/node/builders/presence.js';
42
57
  import { getFirstNodeChild } from '../transport/node/helpers.js';
43
58
  import { createUsyncSidGenerator } from '../transport/node/usync.js';
44
59
  import { WaNodeOrchestrator } from '../transport/node/WaNodeOrchestrator.js';
45
60
  import { WaNodeTransport } from '../transport/node/WaNodeTransport.js';
46
- import { isProxyTransport, toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
61
+ import { isProxyTransport, toProxyAgent } from '../transport/proxy.js';
62
+ import { createServerClock } from '../util/clock.js';
47
63
  import { toError } from '../util/primitives.js';
48
64
  import { getRuntimeOsDisplayName } from '../util/runtime.js';
49
65
  function assertProxyTransport(value, path) {
@@ -101,13 +117,13 @@ export function resolveWaClientBase(options, logger) {
101
117
  };
102
118
  }
103
119
  function createIncomingNodeRuntime(input) {
104
- const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
120
+ const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentCredentials, handleClientDirtyBits, incomingMessageAckOptions } = input;
105
121
  return {
106
122
  handleStreamControlResult: streamControl.handleStreamControlResult,
107
123
  persistSuccessAttributes: (attributes) => authClient.persistSuccessAttributes(attributes),
108
- emitSuccessNode: (node) => emitEvent('connection_success', { node }),
124
+ emitSuccessNode: (node) => emitEvent('debug_connection_success', { node }),
109
125
  updateClockSkewFromSuccess: (serverUnixSeconds) => connectionManager.updateClockSkewFromSuccess(serverUnixSeconds),
110
- shouldWarmupMediaConn: () => !!(getCurrentMeJid() && connectionManager.isConnected()),
126
+ shouldWarmupMediaConn: () => !!(getCurrentCredentials()?.meJid && connectionManager.isConnected()),
111
127
  warmupMediaConn: async () => {
112
128
  await getClientMediaConn(mediaMessageBuildOptions, true);
113
129
  },
@@ -121,17 +137,21 @@ function createIncomingNodeRuntime(input) {
121
137
  sendNode,
122
138
  handleIncomingRetryReceipt: (node) => retryCoordinator.handleIncomingRetryReceipt(node),
123
139
  trackOutboundReceipt: (node) => retryCoordinator.trackOutboundReceipt(node),
124
- emitIncomingReceipt: (event) => emitEvent('message_receipt', event),
140
+ emitIncomingReceipt: (event) => emitEvent('receipt', event),
125
141
  emitIncomingPresence: (event) => emitEvent('presence', event),
126
142
  emitIncomingChatstate: (event) => emitEvent('chatstate', event),
127
143
  emitIncomingCall: (event) => emitEvent('call', event),
128
- emitIncomingFailure: (event) => emitEvent('failure', event),
144
+ getCurrentCredentials,
145
+ emitIncomingFailure: (event) => emitEvent('stream_failure', event),
129
146
  emitIncomingErrorStanza: (event) => emitEvent('stanza_error', event),
130
- emitIncomingNotification: (event) => emitEvent('notification', event),
147
+ emitIncomingNotification: (event) => emitEvent('debug_notification', event),
148
+ emitMexNotification: (event) => emitEvent('mex_notification', event),
149
+ emitRegistrationCode: (event) => emitEvent('mobile_registration_code', event),
150
+ emitAccountTakeoverNotice: (event) => emitEvent('mobile_account_takeover_notice', event),
131
151
  emitGroupEvent: (event) => {
132
- emitEvent('group_event', event);
133
- void messageDispatch.mutateParticipantsCacheFromGroupEvent(event).catch((error) => {
134
- logger.warn('failed to mutate participants cache from group event', {
152
+ emitEvent('group', event);
153
+ void messageDispatch.mutateGroupMetadataCacheFromGroupEvent(event).catch((error) => {
154
+ logger.warn('failed to mutate group metadata cache from group event', {
135
155
  action: event.action,
136
156
  groupJid: event.groupJid,
137
157
  contextGroupJid: event.contextGroupJid,
@@ -139,7 +159,9 @@ function createIncomingNodeRuntime(input) {
139
159
  });
140
160
  });
141
161
  },
142
- emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
162
+ emitBusinessEvent: (event) => emitEvent('business', event),
163
+ emitPictureEvent: (event) => emitEvent('picture', event),
164
+ emitUnhandledIncomingNode: (event) => emitEvent('debug_unhandled_stanza', event),
143
165
  syncAppState,
144
166
  stopComms: () => {
145
167
  void connectionManager.getComms()?.stopComms();
@@ -151,7 +173,7 @@ function createIncomingNodeRuntime(input) {
151
173
  };
152
174
  }
153
175
  function createPassiveTasksRuntime(input) {
154
- const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials } = input;
176
+ const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials, abPropsCoordinator, markOnlineOnConnect } = input;
155
177
  return {
156
178
  queryWithContext,
157
179
  getCurrentCredentials,
@@ -159,41 +181,63 @@ function createPassiveTasksRuntime(input) {
159
181
  sendNodeDirect: (node) => nodeOrchestrator.sendNode(node),
160
182
  takeDanglingReceipts: () => receiptQueue.take(),
161
183
  requeueDanglingReceipt: (node) => receiptQueue.enqueue(node),
162
- shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error)
184
+ shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error),
185
+ syncAbProps: () => abPropsCoordinator.sync(),
186
+ sendInitialPresence: async () => {
187
+ const credentials = getCurrentCredentials();
188
+ const name = credentials?.meDisplayName ?? undefined;
189
+ const node = markOnlineOnConnect
190
+ ? buildPresenceNode({ name })
191
+ : buildPresenceNode({ type: WA_PRESENCE_TYPES.UNAVAILABLE, name });
192
+ await nodeOrchestrator.sendNode(node, false);
193
+ }
163
194
  };
164
195
  }
165
196
  export function buildWaClientDependencies(input) {
166
197
  const { base, runtime } = input;
167
198
  const { options, logger, sessionStore } = base;
168
199
  const receiptQueue = new WaReceiptQueue();
169
- const keyShareCoordinator = new WaKeyShareCoordinator();
170
200
  let connectionManager = null;
171
201
  let passiveTasks = null;
172
202
  let mediaConnCacheFallback = null;
173
203
  let scheduleReconnectAfterPairing = () => undefined;
204
+ const serverClock = createServerClock(() => connectionManager?.getClockSkewMs() ?? null);
174
205
  const nodeTransport = new WaNodeTransport(logger);
175
206
  const nodeOrchestrator = new WaNodeOrchestrator({
176
207
  sendNode: async (node) => nodeTransport.sendNode(node),
177
208
  logger,
178
209
  defaultTimeoutMs: options.nodeQueryTimeoutMs,
179
- hostDomain: WA_DEFAULTS.HOST_DOMAIN
210
+ hostDomain: WA_DEFAULTS.HOST_DOMAIN,
211
+ mobileIqIdFormat: options.mobileTransport !== undefined
180
212
  });
181
213
  const keepAlive = new WaKeepAlive({
182
214
  logger,
183
215
  nodeOrchestrator,
184
216
  getComms: () => connectionManager?.getComms() ?? null,
185
217
  intervalMs: options.keepAliveIntervalMs,
218
+ getIntervalMs: () => abPropsCoordinator.getConfigValue('heartbeat_interval_s') * 1000,
186
219
  timeoutMs: options.deadSocketTimeoutMs,
187
- hostDomain: WA_DEFAULTS.HOST_DOMAIN
220
+ hostDomain: WA_DEFAULTS.HOST_DOMAIN,
221
+ onClockSkewMs: (clockSkewMs) => connectionManager?.setClockSkewMs(clockSkewMs, 'keepalive')
188
222
  });
189
223
  const mediaTransfer = new WaMediaTransferClient({
190
224
  logger,
191
225
  defaultTimeoutMs: options.mediaTimeoutMs,
192
- defaultUploadDispatcher: toProxyDispatcher(options.proxy?.mediaUpload),
193
- defaultDownloadDispatcher: toProxyDispatcher(options.proxy?.mediaDownload),
194
226
  defaultUploadAgent: toProxyAgent(options.proxy?.mediaUpload),
195
- defaultDownloadAgent: toProxyAgent(options.proxy?.mediaDownload)
227
+ defaultDownloadAgent: toProxyAgent(options.proxy?.mediaDownload),
228
+ skipMacVerification: options.dangerous?.disableMediaMacVerification
196
229
  });
230
+ const linkPreviewOptions = options.linkPreview ?? {};
231
+ const linkPreviewFetcher = linkPreviewOptions.fetcher ??
232
+ createDefaultLinkPreviewFetcher({
233
+ mediaTransfer,
234
+ userAgent: linkPreviewOptions.userAgent,
235
+ fetchTimeoutMs: linkPreviewOptions.fetchTimeoutMs,
236
+ maxHtmlBytes: linkPreviewOptions.maxHtmlBytes,
237
+ maxThumbnailBytes: linkPreviewOptions.maxThumbnailBytes,
238
+ allowPrivateHosts: linkPreviewOptions.allowPrivateHosts,
239
+ proxy: linkPreviewOptions.proxy ?? options.proxy?.linkPreview
240
+ });
197
241
  const mediaMessageBuildOptions = {
198
242
  logger,
199
243
  mediaTransfer,
@@ -208,7 +252,17 @@ export function buildWaClientDependencies(input) {
208
252
  setMediaConnCache: (mediaConn) => {
209
253
  mediaConnCacheFallback = mediaConn;
210
254
  connectionManager?.setMediaConnCache(mediaConn);
211
- }
255
+ },
256
+ serverClock,
257
+ media: options.media,
258
+ linkPreviewResolver: (content) => resolveLinkPreview(content.text, content.linkPreview, {
259
+ logger,
260
+ mediaTransfer,
261
+ getMediaConn: () => getClientMediaConn(mediaMessageBuildOptions),
262
+ fetcher: linkPreviewFetcher,
263
+ options: linkPreviewOptions,
264
+ serverClock
265
+ })
212
266
  };
213
267
  const messageClient = new WaMessageClient({
214
268
  logger,
@@ -218,12 +272,22 @@ export function buildWaClientDependencies(input) {
218
272
  defaultMaxAttempts: options.messageMaxAttempts,
219
273
  defaultRetryDelayMs: options.messageRetryDelayMs
220
274
  });
221
- const senderKeyManager = new SenderKeyManager(sessionStore.senderKey);
222
- const signalProtocol = new SignalProtocol(sessionStore.signal, logger);
275
+ const senderKeyManager = new SenderKeyManager(sessionStore.senderKey, {
276
+ getFutureMessagesMax: () => abPropsCoordinator.getConfigValue('web_signal_future_messages_max'),
277
+ skipSignatureVerification: options.dangerous?.disableSenderKeySignatureVerification
278
+ });
279
+ const signalProtocol = new SignalProtocol({
280
+ signal: sessionStore.signal,
281
+ preKey: sessionStore.preKey,
282
+ session: sessionStore.session,
283
+ identity: sessionStore.identity
284
+ }, logger);
285
+ const signalSystemQuery = (node, timeoutMs) => runtime.query(node, timeoutMs, { useSystemId: true });
223
286
  const signalDigestSync = new SignalDigestSyncApi({
224
287
  logger,
225
- query: runtime.query,
288
+ query: signalSystemQuery,
226
289
  signalStore: sessionStore.signal,
290
+ preKeyStore: sessionStore.preKey,
227
291
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
228
292
  });
229
293
  const generateUsyncSid = createUsyncSidGenerator();
@@ -236,24 +300,24 @@ export function buildWaClientDependencies(input) {
236
300
  });
237
301
  const signalIdentitySync = new SignalIdentitySyncApi({
238
302
  logger,
239
- query: runtime.query,
240
- signalStore: sessionStore.signal,
303
+ query: signalSystemQuery,
304
+ identityStore: sessionStore.identity,
241
305
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
242
306
  });
243
307
  const signalMissingPreKeysSync = new SignalMissingPreKeysSyncApi({
244
308
  logger,
245
- query: runtime.query,
309
+ query: signalSystemQuery,
246
310
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
247
311
  });
248
312
  const signalRotateKey = new SignalRotateKeyApi({
249
313
  logger,
250
- query: runtime.query,
314
+ query: signalSystemQuery,
251
315
  signalStore: sessionStore.signal,
252
316
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
253
317
  });
254
318
  const signalSessionSync = new SignalSessionSyncApi({
255
319
  logger,
256
- query: runtime.query,
320
+ query: signalSystemQuery,
257
321
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
258
322
  });
259
323
  const authClient = new WaAuthClient({
@@ -261,19 +325,23 @@ export function buildWaClientDependencies(input) {
261
325
  deviceOsDisplayName: options.deviceOsDisplayName,
262
326
  devicePlatform: options.devicePlatform,
263
327
  requireFullSync: options.requireFullSync,
264
- version: options.version
328
+ version: options.version,
329
+ dangerous: options.dangerous,
330
+ mobileTransport: options.mobileTransport
265
331
  }, {
266
332
  logger,
267
333
  authStore: sessionStore.auth,
268
334
  signalStore: sessionStore.signal,
335
+ preKeyStore: sessionStore.preKey,
269
336
  socket: {
270
337
  sendNode: runtime.sendNode,
271
338
  query: runtime.query
272
339
  },
340
+ isConnected: () => connectionManager?.isConnected() ?? false,
273
341
  callbacks: {
274
342
  onQr: (qr, ttlMs) => runtime.emitEvent('auth_qr', { qr, ttlMs }),
275
343
  onPairingCode: (code) => runtime.emitEvent('auth_pairing_code', { code }),
276
- onPairingRefresh: (forceManual) => runtime.emitEvent('auth_pairing_refresh', { forceManual }),
344
+ onPairingRefresh: (forceManual) => runtime.emitEvent('auth_pairing_required', { forceManual }),
277
345
  onPaired: (credentials) => {
278
346
  runtime.emitEvent('auth_paired', { credentials });
279
347
  scheduleReconnectAfterPairing();
@@ -282,20 +350,32 @@ export function buildWaClientDependencies(input) {
282
350
  }
283
351
  });
284
352
  const getCurrentCredentials = authClient.getCurrentCredentials.bind(authClient);
285
- const getCurrentMeJid = () => getCurrentCredentials()?.meJid;
286
- const getCurrentMeLid = () => getCurrentCredentials()?.meLid;
287
- const getCurrentSignedIdentity = () => getCurrentCredentials()?.signedIdentity;
288
353
  const groupCoordinator = createGroupCoordinator({
289
- queryWithContext: runtime.queryWithContext
354
+ queryWithContext: runtime.queryWithContext,
355
+ mexSocket: { query: runtime.query }
356
+ });
357
+ const newsletterCoordinator = createNewsletterCoordinator({
358
+ mexSocket: { query: runtime.query },
359
+ sendNode: runtime.sendNode,
360
+ publishMessageNode: (node, opts) => messageDispatch.publishMessageNode(node, opts),
361
+ queryWithContext: runtime.queryWithContext,
362
+ generateStanzaId: () => messageDispatch.generateOutgoingMessageId(),
363
+ mediaTransfer,
364
+ getMediaConn: () => getClientMediaConn(mediaMessageBuildOptions),
365
+ getAbPropString: (name) => abPropsCoordinator.getConfigValue(name),
366
+ logger
290
367
  });
291
368
  const privacyCoordinator = createPrivacyCoordinator({
292
369
  queryWithContext: runtime.queryWithContext
293
370
  });
294
- const profileCoordinator = createProfileCoordinator({
371
+ const businessCoordinator = createBusinessCoordinator({
295
372
  queryWithContext: runtime.queryWithContext,
373
+ mediaTransfer,
374
+ getMediaConn: () => getClientMediaConn(mediaMessageBuildOptions),
375
+ logger,
296
376
  generateSid: generateUsyncSid
297
377
  });
298
- const businessCoordinator = createBusinessCoordinator({
378
+ const emailCoordinator = createEmailCoordinator({
299
379
  queryWithContext: runtime.queryWithContext
300
380
  });
301
381
  const retryTracker = createOutboundRetryTracker({
@@ -304,26 +384,29 @@ export function buildWaClientDependencies(input) {
304
384
  });
305
385
  const sessionResolver = createSignalSessionResolver({
306
386
  signalProtocol,
307
- signalStore: sessionStore.signal,
387
+ sessionStore: sessionStore.session,
388
+ identityStore: sessionStore.identity,
308
389
  signalIdentitySync,
309
390
  signalSessionSync,
310
391
  logger
311
392
  });
312
393
  const fanoutResolver = createDeviceFanoutResolver({
313
394
  signalDeviceSync,
314
- getCurrentMeJid,
315
- getCurrentMeLid,
395
+ getCurrentCredentials,
316
396
  logger
317
397
  });
318
- const participantsCache = createGroupParticipantsCache({
319
- participantsStore: sessionStore.participants,
320
- queryGroupParticipantJids: async (groupJid) => {
398
+ const groupMetadataCache = createGroupMetadataCache({
399
+ groupMetadataStore: sessionStore.groupMetadata,
400
+ queryGroupMetadata: async (groupJid) => {
321
401
  const metadata = await groupCoordinator.queryGroupMetadata(groupJid);
322
402
  const participantJids = new Array(metadata.participants.length);
323
403
  for (let index = 0; index < metadata.participants.length; index += 1) {
324
404
  participantJids[index] = metadata.participants[index].jid;
325
405
  }
326
- return participantJids;
406
+ return {
407
+ participants: participantJids,
408
+ ephemeral: metadata.ephemeral
409
+ };
327
410
  },
328
411
  logger
329
412
  });
@@ -333,20 +416,32 @@ export function buildWaClientDependencies(input) {
333
416
  runtime: {
334
417
  queryWithContext: runtime.queryWithContext,
335
418
  emitEvent: runtime.emitEvent,
336
- getCurrentMeLid: () => getCurrentMeLid() ?? null
419
+ getCurrentCredentials
337
420
  },
421
+ serverClock,
338
422
  durationS: options.privacyToken?.tcTokenDurationS,
339
423
  numBuckets: options.privacyToken?.tcTokenNumBuckets,
340
424
  senderDurationS: options.privacyToken?.tcTokenSenderDurationS,
341
425
  senderNumBuckets: options.privacyToken?.tcTokenSenderNumBuckets,
342
- maxDurationS: options.privacyToken?.tcTokenMaxDurationS
426
+ maxDurationS: options.privacyToken?.tcTokenMaxDurationS,
427
+ getConfigOverrides: () => ({
428
+ durationS: abPropsCoordinator.getConfigValue('tctoken_duration'),
429
+ numBuckets: abPropsCoordinator.getConfigValue('tctoken_num_buckets'),
430
+ senderDurationS: abPropsCoordinator.getConfigValue('tctoken_duration_sender'),
431
+ senderNumBuckets: abPropsCoordinator.getConfigValue('tctoken_num_buckets_sender')
432
+ })
433
+ });
434
+ const abPropsCoordinator = new WaAbPropsCoordinator({
435
+ logger,
436
+ runtime: {
437
+ queryWithContext: runtime.queryWithContext
438
+ }
343
439
  });
344
440
  let messageDispatch;
345
441
  const appStateSyncKeyProtocol = createAppStateSyncKeyProtocol({
346
- publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
442
+ publishProtocolMessageToDevice: (deviceJid, protocolMessage, opts) => messageDispatch.publishProtocolMessageToDevice(deviceJid, protocolMessage, opts),
347
443
  fanoutResolver,
348
- getCurrentMeJid,
349
- getCurrentMeLid,
444
+ getCurrentCredentials,
350
445
  logger
351
446
  });
352
447
  messageDispatch = new WaMessageDispatchCoordinator({
@@ -355,52 +450,143 @@ export function buildWaClientDependencies(input) {
355
450
  retryTracker,
356
451
  sessionResolver,
357
452
  fanoutResolver,
358
- participantsCache,
453
+ groupMetadataCache,
359
454
  appStateSyncKeyProtocol,
360
- buildMessageContent: async (content) => buildMediaMessageContent(mediaMessageBuildOptions, content),
455
+ buildMessageContent: async (content, ctx) => buildMediaMessageContent(mediaMessageBuildOptions, content, ctx),
361
456
  senderKeyManager,
362
457
  signalProtocol,
363
458
  signalStore: sessionStore.signal,
459
+ sessionStore: sessionStore.session,
460
+ identityStore: sessionStore.identity,
364
461
  deviceListStore: sessionStore.deviceList,
365
- getCurrentMeJid,
366
- getCurrentMeLid,
367
- getCurrentSignedIdentity,
462
+ signalDeviceSync,
463
+ messageSecretStore: sessionStore.messageSecret,
464
+ getCurrentCredentials,
368
465
  resolvePrivacyTokenNode: (recipientJid) => trustedContactToken.resolveTokenForMessage(recipientJid),
369
466
  onDirectMessageSent: (recipientJid) => {
370
467
  trustedContactToken.maybeIssueSenderToken(recipientJid).catch((err) => logger.warn('sender token issue failed', {
371
468
  to: recipientJid,
372
469
  message: toError(err).message
373
470
  }));
374
- }
471
+ },
472
+ sendNewsletterMessage: (newsletterJid, content, sendOptions, contextInfo) => newsletterCoordinator.send(newsletterJid, content, {
473
+ stanzaId: sendOptions.id,
474
+ contextInfo,
475
+ additionalAttributes: sendOptions.additionalAttributes
476
+ }),
477
+ getIcdcHashLength: () => abPropsCoordinator.getConfigValue('md_icdc_hash_length'),
478
+ mobileMessageIdFormat: options.mobileTransport !== undefined,
479
+ serverClock
480
+ });
481
+ const presenceCoordinator = createPresenceCoordinator({
482
+ sendNode: (node) => nodeOrchestrator.sendNode(node, false),
483
+ getCurrentCredentials
484
+ });
485
+ const peerDataOperation = createPeerDataOperationRequester({
486
+ logger,
487
+ publishProtocolMessageToDevice: (deviceJid, protocolMessage, opts) => messageDispatch.publishProtocolMessageToDevice(deviceJid, protocolMessage, opts),
488
+ getCurrentCredentials,
489
+ generateOutgoingMessageId: () => messageDispatch.generateOutgoingMessageId(),
490
+ subscribeToProtocolMessage: runtime.subscribeProtocolMessage
491
+ });
492
+ const messageCoordinator = new WaMessageCoordinator({
493
+ messageDispatch,
494
+ mediaTransfer,
495
+ logger,
496
+ messageStore: sessionStore.messages,
497
+ messageSecretStore: sessionStore.messageSecret,
498
+ trustedContactToken,
499
+ emitAddon: (event) => runtime.emitEvent('message_addon', event),
500
+ mexSocket: { query: runtime.query },
501
+ peerDataOperation
375
502
  });
376
503
  const retryCoordinator = new WaRetryCoordinator({
377
504
  logger,
378
505
  retryStore: sessionStore.retry,
379
506
  signalStore: sessionStore.signal,
507
+ preKeyStore: sessionStore.preKey,
508
+ sessionStore: sessionStore.session,
380
509
  senderKeyStore: sessionStore.senderKey,
381
510
  signalProtocol,
511
+ sessionResolver,
382
512
  signalDeviceSync,
383
513
  signalMissingPreKeysSync,
384
514
  messageClient,
385
515
  sendNode: runtime.sendNode,
386
- getCurrentMeJid,
387
- getCurrentMeLid,
388
- getCurrentSignedIdentity
516
+ getCurrentCredentials,
517
+ resolveUserIcdc: (userJid) => messageDispatch.resolveUserIcdc(userJid),
518
+ peerDataOperation,
519
+ emitIncomingMessage: (event) => {
520
+ void runtime
521
+ .handleIncomingMessageEvent(event)
522
+ .catch((err) => runtime.handleError(toError(err)));
523
+ }
524
+ });
525
+ const botCoordinator = createBotCoordinator({
526
+ logger,
527
+ queryWithContext: runtime.queryWithContext,
528
+ buildMessageContent: async (content) => buildMediaMessageContent(mediaMessageBuildOptions, content),
529
+ sendMessage: (to, content, sendOptions) => messageDispatch.sendMessage(to, content, sendOptions ?? {}),
530
+ messageStore: sessionStore.messages,
531
+ messageSecretStore: sessionStore.messageSecret,
532
+ getCurrentCredentials,
533
+ emitBotChunk: (event) => runtime.emitEvent('message_bot_chunk', event),
534
+ generateSid: generateUsyncSid
389
535
  });
390
536
  const appStateSync = new WaAppStateSyncClient({
391
537
  logger,
392
538
  query: runtime.query,
393
- getCurrentMeJid,
539
+ getCurrentMeJid: () => getCurrentCredentials()?.meJid,
394
540
  defaultTimeoutMs: options.appStateSyncTimeoutMs,
395
541
  store: sessionStore.appState,
542
+ serverClock,
396
543
  onMissingKeys: async ({ keyIds }) => {
397
544
  await messageDispatch.requestAppStateSyncKeys(keyIds);
545
+ },
546
+ skipMacVerification: options.dangerous?.disableAppStateMacVerification,
547
+ mobilePrimary: options.mobileTransport !== undefined,
548
+ isOwnAccountDevice: (deviceJid) => {
549
+ const credentials = getCurrentCredentials();
550
+ if (!credentials)
551
+ return false;
552
+ const candidateUser = toUserJid(deviceJid);
553
+ return ((!!credentials.meJid && toUserJid(credentials.meJid) === candidateUser) ||
554
+ (!!credentials.meLid && toUserJid(credentials.meLid) === candidateUser));
555
+ },
556
+ sendKeyShare: (toDeviceJid, keys, missingKeyIds) => messageDispatch.sendAppStateSyncKeyShare(toDeviceJid, keys, missingKeyIds),
557
+ triggerSync: async () => {
558
+ await runtime.syncAppState();
398
559
  }
399
560
  });
400
561
  const appStateMutations = new WaAppStateMutationCoordinator({
401
562
  logger,
402
563
  messageStore: sessionStore.messages,
403
- syncAppState: runtime.syncAppStateWithOptions
564
+ appStateSync,
565
+ mediaTransfer,
566
+ isConnected: () => connectionManager?.isConnected() ?? false,
567
+ serverClock,
568
+ emitSnapshotMutations: options.chatEvents?.emitSnapshotMutations === true,
569
+ emitMutation: (event) => runtime.emitEvent('mutation', event),
570
+ nctSaltSink: (salt) => trustedContactToken.handleNctSaltSync(salt),
571
+ contactSink: runtime.persistContact
572
+ });
573
+ const profileCoordinator = createProfileCoordinator({
574
+ queryWithContext: runtime.queryWithContext,
575
+ generateSid: generateUsyncSid,
576
+ mexSocket: { query: runtime.query },
577
+ queryLidsByPhoneJids: (phoneJids) => signalDeviceSync.queryLidsByPhoneJids(phoneJids),
578
+ mutations: appStateMutations,
579
+ logger
580
+ });
581
+ const statusCoordinator = createStatusCoordinator({
582
+ appStateMutations,
583
+ buildMessageContent: async (content) => buildMediaMessageContent(mediaMessageBuildOptions, content),
584
+ publishStatusMessage: (input) => messageDispatch.publishStatusMessage(input)
585
+ });
586
+ const broadcastListCoordinator = createBroadcastListCoordinator({
587
+ appStateMutations,
588
+ buildMessageContent: async (content) => buildMediaMessageContent(mediaMessageBuildOptions, content),
589
+ publishBroadcastListMessage: (input) => messageDispatch.publishBroadcastListMessage(input)
404
590
  });
405
591
  connectionManager = new WaConnectionManager({
406
592
  logger,
@@ -410,14 +596,24 @@ export function buildWaClientDependencies(input) {
410
596
  nodeOrchestrator,
411
597
  nodeTransport,
412
598
  getPassiveTasks: () => passiveTasks,
413
- clearStoredCredentials: runtime.clearStoredState
599
+ clearStoredCredentials: runtime.clearStoredState,
600
+ onPostPairReconnected: () => {
601
+ runtime.emitEvent('connection', {
602
+ status: 'open',
603
+ reason: 'connected',
604
+ code: null,
605
+ isLogout: false,
606
+ isNewLogin: true
607
+ });
608
+ }
414
609
  });
415
610
  if (mediaConnCacheFallback !== null) {
416
611
  connectionManager.setMediaConnCache(mediaConnCacheFallback);
417
612
  }
418
613
  scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
419
614
  const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
420
- keyShareCoordinator.notifyDisconnected();
615
+ abPropsCoordinator.reset();
616
+ offlineResume.reset();
421
617
  await connectionManager?.disconnect();
422
618
  runtime.emitEvent('connection', {
423
619
  status: 'close',
@@ -430,12 +626,15 @@ export function buildWaClientDependencies(input) {
430
626
  const connectWithClientSideEffects = async (reason) => {
431
627
  runtime.resumeIncomingEvents();
432
628
  await connectionManager?.connect(runtime.handleIncomingFrame);
629
+ if (!authClient.getCurrentCredentials()?.meJid) {
630
+ return;
631
+ }
433
632
  runtime.emitEvent('connection', {
434
633
  status: 'open',
435
634
  reason,
436
635
  code: null,
437
636
  isLogout: false,
438
- isNewLogin: connectionManager?.wasNewLogin() ?? false
637
+ isNewLogin: false
439
638
  });
440
639
  };
441
640
  const clearStoredCredentialsWithClientSideEffects = async () => {
@@ -456,7 +655,7 @@ export function buildWaClientDependencies(input) {
456
655
  const incomingMessageAckOptions = {
457
656
  logger,
458
657
  sendNode: runtime.sendNode,
459
- getMeJid: getCurrentMeJid,
658
+ getMeJid: () => getCurrentCredentials()?.meJid,
460
659
  signalProtocol,
461
660
  senderKeyManager,
462
661
  onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
@@ -465,17 +664,27 @@ export function buildWaClientDependencies(input) {
465
664
  .handleIncomingMessageEvent(event)
466
665
  .catch((err) => runtime.handleError(toError(err)));
467
666
  },
468
- emitUnhandledStanza: (event) => runtime.emitEvent('stanza_unhandled', event)
667
+ emitNewsletterMessageUpdate: (event) => runtime.emitEvent('newsletter_message_update', event),
668
+ emitUnhandledStanza: (event) => runtime.emitEvent('debug_unhandled_stanza', event)
469
669
  };
470
670
  const handleClientDirtyBits = (dirtyBits) => handleDirtyBits({
471
671
  logger,
472
672
  queryWithContext: runtime.queryWithContext,
473
673
  getCurrentCredentials,
474
674
  syncAppState: runtime.syncAppState,
475
- generateUsyncSid
675
+ generateUsyncSid,
676
+ newsletterListSubscribed: () => newsletterCoordinator.listSubscribed()
476
677
  }, dirtyBits);
678
+ const offlineResume = new WaOfflineResumeCoordinator({
679
+ logger,
680
+ runtime: {
681
+ sendNode: (node) => nodeOrchestrator.sendNode(node, false),
682
+ emitOfflineResume: (event) => runtime.emitEvent('offline_resume', event)
683
+ }
684
+ });
477
685
  const incomingNode = new WaIncomingNodeCoordinator({
478
686
  logger,
687
+ offlineResume,
479
688
  runtime: createIncomingNodeRuntime({
480
689
  logger,
481
690
  emitEvent: runtime.emitEvent,
@@ -490,11 +699,47 @@ export function buildWaClientDependencies(input) {
490
699
  syncAppState: runtime.syncAppState,
491
700
  disconnect: disconnectWithClientSideEffects,
492
701
  clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
493
- getCurrentMeJid,
702
+ getCurrentCredentials,
494
703
  handleClientDirtyBits,
495
704
  incomingMessageAckOptions
496
705
  })
497
706
  });
707
+ incomingNode.registerIncomingHandler({
708
+ tag: WA_NODE_TAGS.NOTIFICATION,
709
+ subtype: WA_NOTIFICATION_TYPES.NEWSLETTER,
710
+ prepend: true,
711
+ // eslint-disable-next-line @typescript-eslint/require-await
712
+ handler: async (node) => {
713
+ const newsletterJid = node.attrs.from;
714
+ if (!newsletterJid || !isNewsletterJid(newsletterJid)) {
715
+ return false;
716
+ }
717
+ const firstChild = getFirstNodeChild(node);
718
+ const childTag = firstChild?.tag;
719
+ const action = childTag === WA_NEWSLETTER_NOTIFICATION_TAGS.LIVE_UPDATES
720
+ ? 'live_updates'
721
+ : 'unknown';
722
+ runtime.emitEvent('newsletter', {
723
+ rawNode: node,
724
+ stanzaId: node.attrs.id,
725
+ chatJid: newsletterJid,
726
+ stanzaType: node.attrs.type,
727
+ offline: node.attrs.offline !== undefined,
728
+ newsletterJid,
729
+ action,
730
+ subType: childTag
731
+ });
732
+ if (action === 'live_updates') {
733
+ processNewsletterLiveUpdates(node, {
734
+ logger,
735
+ emitIncomingMessage: incomingMessageAckOptions.emitIncomingMessage,
736
+ emitNewsletterMessageUpdate: incomingMessageAckOptions.emitNewsletterMessageUpdate,
737
+ emitUnhandledStanza: incomingMessageAckOptions.emitUnhandledStanza
738
+ });
739
+ }
740
+ return false;
741
+ }
742
+ });
498
743
  incomingNode.registerIncomingHandler({
499
744
  tag: WA_NODE_TAGS.NOTIFICATION,
500
745
  subtype: WA_NOTIFICATION_TYPES.ENCRYPT,
@@ -505,7 +750,7 @@ export function buildWaClientDependencies(input) {
505
750
  return false;
506
751
  }
507
752
  const childTag = firstChild.tag;
508
- // <count value="N"/> server prekeys running low
753
+ // <count value="N"/> server prekeys running low
509
754
  if (childTag === 'count') {
510
755
  const ackNode = buildAckNode({
511
756
  kind: 'notification',
@@ -525,7 +770,7 @@ export function buildWaClientDependencies(input) {
525
770
  });
526
771
  return true;
527
772
  }
528
- // <digest/> digest key sync
773
+ // <digest/> digest key sync
529
774
  if (childTag === 'digest') {
530
775
  const ackNode = buildAckNode({
531
776
  kind: 'notification',
@@ -545,7 +790,7 @@ export function buildWaClientDependencies(input) {
545
790
  });
546
791
  return true;
547
792
  }
548
- // <identity/> contact identity key changed
793
+ // <identity/> contact identity key changed
549
794
  if (childTag === 'identity') {
550
795
  const parsed = parseIdentityChangeNotification(node);
551
796
  if (!parsed) {
@@ -558,15 +803,13 @@ export function buildWaClientDependencies(input) {
558
803
  });
559
804
  await runtime.sendNode(ackNode);
560
805
  const address = parseSignalAddressFromJid(parsed.fromJid);
561
- // ignore companion devices (non-primary)
562
806
  if (address.device !== 0) {
563
807
  logger.debug('identity-change: ignoring companion device', {
564
808
  jid: parsed.fromJid
565
809
  });
566
810
  return true;
567
811
  }
568
- // self-primary identity change → must disconnect
569
- const meJid = getCurrentMeJid();
812
+ const meJid = getCurrentCredentials()?.meJid;
570
813
  if (meJid) {
571
814
  const meUser = toUserJid(meJid);
572
815
  const fromUser = toUserJid(parsed.fromJid);
@@ -578,12 +821,12 @@ export function buildWaClientDependencies(input) {
578
821
  return true;
579
822
  }
580
823
  }
581
- const oldIdentity = await sessionStore.signal.getRemoteIdentity(address);
824
+ const oldIdentity = await sessionStore.identity.getRemoteIdentity(address);
582
825
  if (oldIdentity) {
583
826
  logger.info('identity-change: clearing session', {
584
827
  jid: parsed.fromJid
585
828
  });
586
- await sessionStore.signal.deleteSession(address);
829
+ await sessionStore.session.deleteSession(address);
587
830
  const userJid = toUserJid(parsed.fromJid);
588
831
  await trustedContactToken.reissueOnIdentityChange(userJid).catch((error) => {
589
832
  logger.warn('identity-change: reissue tc token failed', {
@@ -591,12 +834,13 @@ export function buildWaClientDependencies(input) {
591
834
  });
592
835
  });
593
836
  }
594
- runtime.emitEvent('notification', {
837
+ runtime.emitEvent('debug_notification', {
595
838
  rawNode: node,
596
839
  stanzaId: parsed.stanzaId,
597
840
  chatJid: parsed.fromJid,
598
- stanzaType: 'encrypt',
599
- notificationType: 'encrypt',
841
+ stanzaType: WA_NOTIFICATION_TYPES.ENCRYPT,
842
+ offline: node.attrs.offline !== undefined,
843
+ notificationType: WA_NOTIFICATION_TYPES.ENCRYPT,
600
844
  classification: 'core',
601
845
  details: {
602
846
  kind: 'identity_change',
@@ -634,14 +878,13 @@ export function buildWaClientDependencies(input) {
634
878
  server: baseAddress.server,
635
879
  device: device.deviceId
636
880
  };
637
- await sessionStore.signal.deleteSession(address).catch((error) => {
881
+ await sessionStore.session.deleteSession(address).catch((error) => {
638
882
  logger.warn('devices-notification: delete session failed', {
639
883
  message: toError(error).message
640
884
  });
641
885
  });
642
886
  }
643
887
  }
644
- // invalidate device list cache so next fanout fetches fresh list
645
888
  if (sessionStore.deviceList) {
646
889
  await sessionStore.deviceList.deleteUserDevices(userJid).catch((error) => {
647
890
  logger.warn('devices-notification: invalidate cache failed', {
@@ -649,7 +892,6 @@ export function buildWaClientDependencies(input) {
649
892
  });
650
893
  });
651
894
  }
652
- // for update notifications, re-sync immediately
653
895
  if (parsed.action === DEVICE_NOTIFICATION_ACTIONS.UPDATE) {
654
896
  signalDeviceSync.syncDeviceList([userJid]).catch((error) => {
655
897
  logger.warn('devices-notification: sync device list failed', {
@@ -657,12 +899,13 @@ export function buildWaClientDependencies(input) {
657
899
  });
658
900
  });
659
901
  }
660
- runtime.emitEvent('notification', {
902
+ runtime.emitEvent('debug_notification', {
661
903
  rawNode: node,
662
904
  stanzaId: parsed.stanzaId,
663
905
  chatJid: parsed.fromJid,
664
- stanzaType: 'devices',
665
- notificationType: 'devices',
906
+ stanzaType: WA_NOTIFICATION_TYPES.DEVICES,
907
+ offline: node.attrs.offline !== undefined,
908
+ notificationType: WA_NOTIFICATION_TYPES.DEVICES,
666
909
  classification: 'core',
667
910
  details: {
668
911
  kind: 'device_list_change',
@@ -696,9 +939,29 @@ export function buildWaClientDependencies(input) {
696
939
  return true;
697
940
  }
698
941
  });
942
+ incomingNode.registerIncomingHandler({
943
+ tag: WA_NODE_TAGS.NOTIFICATION,
944
+ subtype: WA_NOTIFICATION_TYPES.SERVER,
945
+ prepend: true,
946
+ handler: async (node) => {
947
+ const firstChild = getFirstNodeChild(node);
948
+ if (!firstChild || firstChild.tag !== WA_NODE_TAGS.ABPROPS) {
949
+ return false;
950
+ }
951
+ const ackNode = buildAckNode({
952
+ kind: 'notification',
953
+ node,
954
+ includeType: false
955
+ });
956
+ await runtime.sendNode(ackNode);
957
+ abPropsCoordinator.sync();
958
+ return true;
959
+ }
960
+ });
699
961
  passiveTasks = new WaPassiveTasksCoordinator({
700
962
  logger,
701
963
  signalStore: sessionStore.signal,
964
+ preKeyStore: sessionStore.preKey,
702
965
  signalDigestSync,
703
966
  signalRotateKey,
704
967
  runtime: createPassiveTasksRuntime({
@@ -706,8 +969,20 @@ export function buildWaClientDependencies(input) {
706
969
  authClient,
707
970
  nodeOrchestrator,
708
971
  receiptQueue,
709
- getCurrentCredentials
710
- })
972
+ getCurrentCredentials,
973
+ abPropsCoordinator,
974
+ markOnlineOnConnect: options.markOnlineOnConnect ?? false
975
+ }),
976
+ mobilePrimary: options.mobileTransport !== undefined,
977
+ appStateSync
978
+ });
979
+ const lowLevelCoordinator = createLowLevelCoordinator({
980
+ logger,
981
+ nodeOrchestrator,
982
+ incomingNode,
983
+ receiptQueue,
984
+ isConnected: () => connectionManager?.isConnected() ?? false,
985
+ defaultIqTimeoutMs: options.iqTimeoutMs
711
986
  });
712
987
  return {
713
988
  nodeTransport,
@@ -726,19 +1001,28 @@ export function buildWaClientDependencies(input) {
726
1001
  signalSessionSync,
727
1002
  authClient,
728
1003
  messageDispatch,
1004
+ messageCoordinator,
1005
+ presenceCoordinator,
729
1006
  retryCoordinator,
730
1007
  appStateSync,
731
1008
  chatCoordinator: appStateMutations,
732
1009
  streamControl,
733
1010
  incomingNode,
1011
+ lowLevelCoordinator,
734
1012
  passiveTasks,
735
1013
  groupCoordinator,
1014
+ statusCoordinator,
1015
+ broadcastListCoordinator,
1016
+ newsletterCoordinator,
736
1017
  privacyCoordinator,
737
1018
  profileCoordinator,
738
1019
  businessCoordinator,
1020
+ botCoordinator,
1021
+ emailCoordinator,
739
1022
  receiptQueue,
740
- keyShareCoordinator,
741
1023
  connectionManager,
742
- trustedContactToken
1024
+ trustedContactToken,
1025
+ abPropsCoordinator,
1026
+ peerDataOperation
743
1027
  };
744
1028
  }