zapo-js 0.1.2 → 0.3.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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,16 +1,25 @@
1
1
  import { WaAppStateSyncClient } from '../appstate/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 { createBusinessCoordinator } from './coordinators/WaBusinessCoordinator.js';
8
+ import { createEmailCoordinator } from './coordinators/WaEmailCoordinator.js';
7
9
  import { createGroupCoordinator } from './coordinators/WaGroupCoordinator.js';
8
10
  import { WaIncomingNodeCoordinator } from './coordinators/WaIncomingNodeCoordinator.js';
9
11
  import { WaMessageDispatchCoordinator } from './coordinators/WaMessageDispatchCoordinator.js';
12
+ import { WaOfflineResumeCoordinator } from './coordinators/WaOfflineResumeCoordinator.js';
10
13
  import { WaPassiveTasksCoordinator } from './coordinators/WaPassiveTasksCoordinator.js';
14
+ import { createPrivacyCoordinator } from './coordinators/WaPrivacyCoordinator.js';
15
+ import { createProfileCoordinator } from './coordinators/WaProfileCoordinator.js';
11
16
  import { WaRetryCoordinator } from './coordinators/WaRetryCoordinator.js';
12
17
  import { createStreamControlHandler } from './coordinators/WaStreamControlCoordinator.js';
18
+ import { WaTrustedContactTokenCoordinator } from './coordinators/WaTrustedContactTokenCoordinator.js';
13
19
  import { handleDirtyBits, parseDirtyBits } from './dirty.js';
20
+ import { DEVICE_NOTIFICATION_ACTIONS, parseDeviceNotification } from './events/devices.js';
21
+ import { parseIdentityChangeNotification } from './events/identity.js';
22
+ import { parsePrivacyTokenNotification } from './events/privacy-token.js';
14
23
  import { buildMediaMessageContent, getMediaConn as getClientMediaConn } from './messages.js';
15
24
  import { createDeviceFanoutResolver } from './messaging/fanout.js';
16
25
  import { createAppStateSyncKeyProtocol } from './messaging/key-protocol.js';
@@ -18,7 +27,8 @@ import { createGroupParticipantsCache } from './messaging/participants.js';
18
27
  import { WaMediaTransferClient } from '../media/WaMediaTransferClient.js';
19
28
  import { handleIncomingMessageAck } from '../message/incoming.js';
20
29
  import { WaMessageClient } from '../message/WaMessageClient.js';
21
- import { getWaCompanionPlatformId, WA_DEFAULTS } from '../protocol/constants.js';
30
+ import { getWaCompanionPlatformId, WA_DEFAULTS, WA_DISCONNECT_REASONS, WA_NODE_TAGS, WA_NOTIFICATION_TYPES, WA_PRIVACY_TOKEN_NOTIFICATION_TYPE } from '../protocol/constants.js';
31
+ import { parseSignalAddressFromJid, toUserJid } from '../protocol/jid.js';
22
32
  import { createOutboundRetryTracker } from '../retry/tracker.js';
23
33
  import { SignalDeviceSyncApi } from '../signal/api/SignalDeviceSyncApi.js';
24
34
  import { SignalDigestSyncApi } from '../signal/api/SignalDigestSyncApi.js';
@@ -30,10 +40,13 @@ import { SenderKeyManager } from '../signal/group/SenderKeyManager.js';
30
40
  import { createSignalSessionResolver } from '../signal/session/resolver.js';
31
41
  import { SignalProtocol } from '../signal/session/SignalProtocol.js';
32
42
  import { WaKeepAlive } from '../transport/keepalive/WaKeepAlive.js';
43
+ import { buildAckNode } from '../transport/node/builders/global.js';
44
+ import { buildPresenceNode } from '../transport/node/builders/presence.js';
45
+ import { getFirstNodeChild } from '../transport/node/helpers.js';
33
46
  import { createUsyncSidGenerator } from '../transport/node/usync.js';
34
47
  import { WaNodeOrchestrator } from '../transport/node/WaNodeOrchestrator.js';
35
48
  import { WaNodeTransport } from '../transport/node/WaNodeTransport.js';
36
- import { isProxyTransport, toProxyAgent, toProxyDispatcher } from '../transport/proxy.js';
49
+ import { isProxyTransport, toProxyAgent } from '../transport/proxy.js';
37
50
  import { toError } from '../util/primitives.js';
38
51
  import { getRuntimeOsDisplayName } from '../util/runtime.js';
39
52
  function assertProxyTransport(value, path) {
@@ -90,31 +103,6 @@ export function resolveWaClientBase(options, logger) {
90
103
  sessionStore
91
104
  };
92
105
  }
93
- function createIncomingMessageAckOptions(input) {
94
- const { logger, sendNode, emitEvent, handleIncomingMessageEvent, handleError, getCurrentMeJid, signalProtocol, senderKeyManager, retryCoordinator } = input;
95
- return {
96
- logger,
97
- sendNode,
98
- getMeJid: getCurrentMeJid,
99
- signalProtocol,
100
- senderKeyManager,
101
- onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
102
- emitIncomingMessage: (event) => {
103
- void handleIncomingMessageEvent(event).catch((err) => handleError(toError(err)));
104
- },
105
- emitUnhandledStanza: (event) => emitEvent('stanza_unhandled', event)
106
- };
107
- }
108
- function createHandleClientDirtyBits(input) {
109
- const { logger, queryWithContext, syncAppState, getCurrentCredentials, generateUsyncSid } = input;
110
- return (dirtyBits) => handleDirtyBits({
111
- logger,
112
- queryWithContext,
113
- getCurrentCredentials,
114
- syncAppState,
115
- generateUsyncSid
116
- }, dirtyBits);
117
- }
118
106
  function createIncomingNodeRuntime(input) {
119
107
  const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
120
108
  return {
@@ -143,6 +131,8 @@ function createIncomingNodeRuntime(input) {
143
131
  emitIncomingFailure: (event) => emitEvent('failure', event),
144
132
  emitIncomingErrorStanza: (event) => emitEvent('stanza_error', event),
145
133
  emitIncomingNotification: (event) => emitEvent('notification', event),
134
+ emitRegistrationCode: (event) => emitEvent('registration_code_received', event),
135
+ emitAccountTakeoverNotice: (event) => emitEvent('account_takeover_notice', event),
146
136
  emitGroupEvent: (event) => {
147
137
  emitEvent('group_event', event);
148
138
  void messageDispatch.mutateParticipantsCacheFromGroupEvent(event).catch((error) => {
@@ -156,6 +146,9 @@ function createIncomingNodeRuntime(input) {
156
146
  },
157
147
  emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
158
148
  syncAppState,
149
+ stopComms: () => {
150
+ void connectionManager.getComms()?.stopComms();
151
+ },
159
152
  disconnect,
160
153
  clearStoredCredentials,
161
154
  parseDirtyBits: (nodes) => parseDirtyBits(nodes, logger),
@@ -163,7 +156,7 @@ function createIncomingNodeRuntime(input) {
163
156
  };
164
157
  }
165
158
  function createPassiveTasksRuntime(input) {
166
- const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials } = input;
159
+ const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials, abPropsCoordinator } = input;
167
160
  return {
168
161
  queryWithContext,
169
162
  getCurrentCredentials,
@@ -171,14 +164,18 @@ function createPassiveTasksRuntime(input) {
171
164
  sendNodeDirect: (node) => nodeOrchestrator.sendNode(node),
172
165
  takeDanglingReceipts: () => receiptQueue.take(),
173
166
  requeueDanglingReceipt: (node) => receiptQueue.enqueue(node),
174
- shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error)
167
+ shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error),
168
+ syncAbProps: () => abPropsCoordinator.sync(),
169
+ sendPresenceAvailable: async () => {
170
+ const credentials = getCurrentCredentials();
171
+ await nodeOrchestrator.sendNode(buildPresenceNode({ name: credentials?.meDisplayName ?? undefined }), false);
172
+ }
175
173
  };
176
174
  }
177
175
  export function buildWaClientDependencies(input) {
178
176
  const { base, runtime } = input;
179
177
  const { options, logger, sessionStore } = base;
180
178
  const receiptQueue = new WaReceiptQueue();
181
- const keyShareCoordinator = new WaKeyShareCoordinator();
182
179
  let connectionManager = null;
183
180
  let passiveTasks = null;
184
181
  let mediaConnCacheFallback = null;
@@ -188,23 +185,24 @@ export function buildWaClientDependencies(input) {
188
185
  sendNode: async (node) => nodeTransport.sendNode(node),
189
186
  logger,
190
187
  defaultTimeoutMs: options.nodeQueryTimeoutMs,
191
- hostDomain: WA_DEFAULTS.HOST_DOMAIN
188
+ hostDomain: WA_DEFAULTS.HOST_DOMAIN,
189
+ mobileIqIdFormat: options.mobileTransport !== undefined
192
190
  });
193
191
  const keepAlive = new WaKeepAlive({
194
192
  logger,
195
193
  nodeOrchestrator,
196
194
  getComms: () => connectionManager?.getComms() ?? null,
197
195
  intervalMs: options.keepAliveIntervalMs,
196
+ getIntervalMs: () => abPropsCoordinator.getConfigValue('heartbeat_interval_s') * 1000,
198
197
  timeoutMs: options.deadSocketTimeoutMs,
199
198
  hostDomain: WA_DEFAULTS.HOST_DOMAIN
200
199
  });
201
200
  const mediaTransfer = new WaMediaTransferClient({
202
201
  logger,
203
202
  defaultTimeoutMs: options.mediaTimeoutMs,
204
- defaultUploadDispatcher: toProxyDispatcher(options.proxy?.mediaUpload),
205
- defaultDownloadDispatcher: toProxyDispatcher(options.proxy?.mediaDownload),
206
203
  defaultUploadAgent: toProxyAgent(options.proxy?.mediaUpload),
207
- defaultDownloadAgent: toProxyAgent(options.proxy?.mediaDownload)
204
+ defaultDownloadAgent: toProxyAgent(options.proxy?.mediaDownload),
205
+ skipMacVerification: options.dangerous?.disableMediaMacVerification
208
206
  });
209
207
  const mediaMessageBuildOptions = {
210
208
  logger,
@@ -220,7 +218,8 @@ export function buildWaClientDependencies(input) {
220
218
  setMediaConnCache: (mediaConn) => {
221
219
  mediaConnCacheFallback = mediaConn;
222
220
  connectionManager?.setMediaConnCache(mediaConn);
223
- }
221
+ },
222
+ media: options.media
224
223
  };
225
224
  const messageClient = new WaMessageClient({
226
225
  logger,
@@ -230,12 +229,22 @@ export function buildWaClientDependencies(input) {
230
229
  defaultMaxAttempts: options.messageMaxAttempts,
231
230
  defaultRetryDelayMs: options.messageRetryDelayMs
232
231
  });
233
- const senderKeyManager = new SenderKeyManager(sessionStore.senderKey);
234
- const signalProtocol = new SignalProtocol(sessionStore.signal, logger);
232
+ const senderKeyManager = new SenderKeyManager(sessionStore.senderKey, {
233
+ getFutureMessagesMax: () => abPropsCoordinator.getConfigValue('web_signal_future_messages_max'),
234
+ skipSignatureVerification: options.dangerous?.disableSenderKeySignatureVerification
235
+ });
236
+ const signalProtocol = new SignalProtocol({
237
+ signal: sessionStore.signal,
238
+ preKey: sessionStore.preKey,
239
+ session: sessionStore.session,
240
+ identity: sessionStore.identity
241
+ }, logger);
242
+ const signalSystemQuery = (node, timeoutMs) => runtime.query(node, timeoutMs, { useSystemId: true });
235
243
  const signalDigestSync = new SignalDigestSyncApi({
236
244
  logger,
237
- query: runtime.query,
245
+ query: signalSystemQuery,
238
246
  signalStore: sessionStore.signal,
247
+ preKeyStore: sessionStore.preKey,
239
248
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
240
249
  });
241
250
  const generateUsyncSid = createUsyncSidGenerator();
@@ -248,35 +257,39 @@ export function buildWaClientDependencies(input) {
248
257
  });
249
258
  const signalIdentitySync = new SignalIdentitySyncApi({
250
259
  logger,
251
- query: runtime.query,
252
- signalStore: sessionStore.signal,
260
+ query: signalSystemQuery,
261
+ identityStore: sessionStore.identity,
253
262
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
254
263
  });
255
264
  const signalMissingPreKeysSync = new SignalMissingPreKeysSyncApi({
256
265
  logger,
257
- query: runtime.query,
266
+ query: signalSystemQuery,
258
267
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
259
268
  });
260
269
  const signalRotateKey = new SignalRotateKeyApi({
261
270
  logger,
262
- query: runtime.query,
271
+ query: signalSystemQuery,
263
272
  signalStore: sessionStore.signal,
264
273
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
265
274
  });
266
275
  const signalSessionSync = new SignalSessionSyncApi({
267
276
  logger,
268
- query: runtime.query,
277
+ query: signalSystemQuery,
269
278
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
270
279
  });
271
280
  const authClient = new WaAuthClient({
272
281
  deviceBrowser: options.deviceBrowser,
273
282
  deviceOsDisplayName: options.deviceOsDisplayName,
274
283
  devicePlatform: options.devicePlatform,
275
- requireFullSync: options.requireFullSync
284
+ requireFullSync: options.requireFullSync,
285
+ version: options.version,
286
+ dangerous: options.dangerous,
287
+ mobileTransport: options.mobileTransport
276
288
  }, {
277
289
  logger,
278
290
  authStore: sessionStore.auth,
279
291
  signalStore: sessionStore.signal,
292
+ preKeyStore: sessionStore.preKey,
280
293
  socket: {
281
294
  sendNode: runtime.sendNode,
282
295
  query: runtime.query
@@ -299,13 +312,27 @@ export function buildWaClientDependencies(input) {
299
312
  const groupCoordinator = createGroupCoordinator({
300
313
  queryWithContext: runtime.queryWithContext
301
314
  });
315
+ const privacyCoordinator = createPrivacyCoordinator({
316
+ queryWithContext: runtime.queryWithContext
317
+ });
318
+ const profileCoordinator = createProfileCoordinator({
319
+ queryWithContext: runtime.queryWithContext,
320
+ generateSid: generateUsyncSid
321
+ });
322
+ const businessCoordinator = createBusinessCoordinator({
323
+ queryWithContext: runtime.queryWithContext
324
+ });
325
+ const emailCoordinator = createEmailCoordinator({
326
+ queryWithContext: runtime.queryWithContext
327
+ });
302
328
  const retryTracker = createOutboundRetryTracker({
303
329
  retryStore: sessionStore.retry,
304
330
  logger
305
331
  });
306
332
  const sessionResolver = createSignalSessionResolver({
307
333
  signalProtocol,
308
- signalStore: sessionStore.signal,
334
+ sessionStore: sessionStore.session,
335
+ identityStore: sessionStore.identity,
309
336
  signalIdentitySync,
310
337
  signalSessionSync,
311
338
  logger
@@ -318,9 +345,42 @@ export function buildWaClientDependencies(input) {
318
345
  });
319
346
  const participantsCache = createGroupParticipantsCache({
320
347
  participantsStore: sessionStore.participants,
321
- queryGroupParticipantJids: async (groupJid) => (await groupCoordinator.queryGroupMetadata(groupJid)).participants.map((participant) => participant.jid),
348
+ queryGroupParticipantJids: async (groupJid) => {
349
+ const metadata = await groupCoordinator.queryGroupMetadata(groupJid);
350
+ const participantJids = new Array(metadata.participants.length);
351
+ for (let index = 0; index < metadata.participants.length; index += 1) {
352
+ participantJids[index] = metadata.participants[index].jid;
353
+ }
354
+ return participantJids;
355
+ },
322
356
  logger
323
357
  });
358
+ const trustedContactToken = new WaTrustedContactTokenCoordinator({
359
+ logger,
360
+ store: sessionStore.privacyToken,
361
+ runtime: {
362
+ queryWithContext: runtime.queryWithContext,
363
+ emitEvent: runtime.emitEvent,
364
+ getCurrentMeLid: () => getCurrentMeLid() ?? null
365
+ },
366
+ durationS: options.privacyToken?.tcTokenDurationS,
367
+ numBuckets: options.privacyToken?.tcTokenNumBuckets,
368
+ senderDurationS: options.privacyToken?.tcTokenSenderDurationS,
369
+ senderNumBuckets: options.privacyToken?.tcTokenSenderNumBuckets,
370
+ maxDurationS: options.privacyToken?.tcTokenMaxDurationS,
371
+ getConfigOverrides: () => ({
372
+ durationS: abPropsCoordinator.getConfigValue('tctoken_duration'),
373
+ numBuckets: abPropsCoordinator.getConfigValue('tctoken_num_buckets'),
374
+ senderDurationS: abPropsCoordinator.getConfigValue('tctoken_duration_sender'),
375
+ senderNumBuckets: abPropsCoordinator.getConfigValue('tctoken_num_buckets_sender')
376
+ })
377
+ });
378
+ const abPropsCoordinator = new WaAbPropsCoordinator({
379
+ logger,
380
+ runtime: {
381
+ queryWithContext: runtime.queryWithContext
382
+ }
383
+ });
324
384
  let messageDispatch;
325
385
  const appStateSyncKeyProtocol = createAppStateSyncKeyProtocol({
326
386
  publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
@@ -340,14 +400,30 @@ export function buildWaClientDependencies(input) {
340
400
  buildMessageContent: async (content) => buildMediaMessageContent(mediaMessageBuildOptions, content),
341
401
  senderKeyManager,
342
402
  signalProtocol,
403
+ signalStore: sessionStore.signal,
404
+ sessionStore: sessionStore.session,
405
+ identityStore: sessionStore.identity,
406
+ deviceListStore: sessionStore.deviceList,
407
+ messageSecretStore: sessionStore.messageSecret,
343
408
  getCurrentMeJid,
344
409
  getCurrentMeLid,
345
- getCurrentSignedIdentity
410
+ getCurrentSignedIdentity,
411
+ resolvePrivacyTokenNode: (recipientJid) => trustedContactToken.resolveTokenForMessage(recipientJid),
412
+ onDirectMessageSent: (recipientJid) => {
413
+ trustedContactToken.maybeIssueSenderToken(recipientJid).catch((err) => logger.warn('sender token issue failed', {
414
+ to: recipientJid,
415
+ message: toError(err).message
416
+ }));
417
+ },
418
+ getIcdcHashLength: () => abPropsCoordinator.getConfigValue('md_icdc_hash_length'),
419
+ mobileMessageIdFormat: options.mobileTransport !== undefined
346
420
  });
347
421
  const retryCoordinator = new WaRetryCoordinator({
348
422
  logger,
349
423
  retryStore: sessionStore.retry,
350
424
  signalStore: sessionStore.signal,
425
+ preKeyStore: sessionStore.preKey,
426
+ sessionStore: sessionStore.session,
351
427
  senderKeyStore: sessionStore.senderKey,
352
428
  signalProtocol,
353
429
  signalDeviceSync,
@@ -366,7 +442,9 @@ export function buildWaClientDependencies(input) {
366
442
  store: sessionStore.appState,
367
443
  onMissingKeys: async ({ keyIds }) => {
368
444
  await messageDispatch.requestAppStateSyncKeys(keyIds);
369
- }
445
+ },
446
+ skipMacVerification: options.dangerous?.disableAppStateMacVerification,
447
+ mobilePrimary: options.mobileTransport !== undefined
370
448
  });
371
449
  const appStateMutations = new WaAppStateMutationCoordinator({
372
450
  logger,
@@ -387,14 +465,28 @@ export function buildWaClientDependencies(input) {
387
465
  connectionManager.setMediaConnCache(mediaConnCacheFallback);
388
466
  }
389
467
  scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
390
- const disconnectWithClientSideEffects = async () => {
391
- keyShareCoordinator.notifyDisconnected();
468
+ const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
469
+ abPropsCoordinator.reset();
470
+ offlineResume.reset();
392
471
  await connectionManager?.disconnect();
393
- runtime.emitEvent('connection_close', {});
472
+ runtime.emitEvent('connection', {
473
+ status: 'close',
474
+ reason,
475
+ code,
476
+ isLogout,
477
+ isNewLogin: false
478
+ });
394
479
  };
395
- const connectWithClientSideEffects = async () => {
480
+ const connectWithClientSideEffects = async (reason) => {
481
+ runtime.resumeIncomingEvents();
396
482
  await connectionManager?.connect(runtime.handleIncomingFrame);
397
- runtime.emitEvent('connection_open', {});
483
+ runtime.emitEvent('connection', {
484
+ status: 'open',
485
+ reason,
486
+ code: null,
487
+ isLogout: false,
488
+ isNewLogin: connectionManager?.wasNewLogin() ?? false
489
+ });
398
490
  };
399
491
  const clearStoredCredentialsWithClientSideEffects = async () => {
400
492
  await connectionManager?.clearStoredCredentials();
@@ -411,26 +503,37 @@ export function buildWaClientDependencies(input) {
411
503
  clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
412
504
  connect: connectWithClientSideEffects
413
505
  });
414
- const incomingMessageAckOptions = createIncomingMessageAckOptions({
506
+ const incomingMessageAckOptions = {
415
507
  logger,
416
508
  sendNode: runtime.sendNode,
417
- emitEvent: runtime.emitEvent,
418
- handleIncomingMessageEvent: runtime.handleIncomingMessageEvent,
419
- handleError: runtime.handleError,
420
- getCurrentMeJid,
509
+ getMeJid: getCurrentMeJid,
421
510
  signalProtocol,
422
511
  senderKeyManager,
423
- retryCoordinator
424
- });
425
- const handleClientDirtyBits = createHandleClientDirtyBits({
512
+ onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
513
+ emitIncomingMessage: (event) => {
514
+ void runtime
515
+ .handleIncomingMessageEvent(event)
516
+ .catch((err) => runtime.handleError(toError(err)));
517
+ },
518
+ emitUnhandledStanza: (event) => runtime.emitEvent('stanza_unhandled', event)
519
+ };
520
+ const handleClientDirtyBits = (dirtyBits) => handleDirtyBits({
426
521
  logger,
427
522
  queryWithContext: runtime.queryWithContext,
428
- syncAppState: runtime.syncAppState,
429
523
  getCurrentCredentials,
524
+ syncAppState: runtime.syncAppState,
430
525
  generateUsyncSid
526
+ }, dirtyBits);
527
+ const offlineResume = new WaOfflineResumeCoordinator({
528
+ logger,
529
+ runtime: {
530
+ sendNode: (node) => nodeOrchestrator.sendNode(node, false),
531
+ emitOfflineResume: (event) => runtime.emitEvent('offline_resume', event)
532
+ }
431
533
  });
432
534
  const incomingNode = new WaIncomingNodeCoordinator({
433
535
  logger,
536
+ offlineResume,
434
537
  runtime: createIncomingNodeRuntime({
435
538
  logger,
436
539
  emitEvent: runtime.emitEvent,
@@ -450,9 +553,231 @@ export function buildWaClientDependencies(input) {
450
553
  incomingMessageAckOptions
451
554
  })
452
555
  });
556
+ incomingNode.registerIncomingHandler({
557
+ tag: WA_NODE_TAGS.NOTIFICATION,
558
+ subtype: WA_NOTIFICATION_TYPES.ENCRYPT,
559
+ prepend: true,
560
+ handler: async (node) => {
561
+ const firstChild = getFirstNodeChild(node);
562
+ if (!firstChild) {
563
+ return false;
564
+ }
565
+ const childTag = firstChild.tag;
566
+ // <count value="N"/> — server prekeys running low
567
+ if (childTag === 'count') {
568
+ const ackNode = buildAckNode({
569
+ kind: 'notification',
570
+ node,
571
+ includeType: false
572
+ });
573
+ await runtime.sendNode(ackNode);
574
+ const tasks = passiveTasks;
575
+ if (!tasks) {
576
+ logger.warn('encrypt-count: passive tasks not available');
577
+ return true;
578
+ }
579
+ await tasks.handlePreKeyLowNotification().catch((error) => {
580
+ logger.warn('encrypt-count: prekey upload failed', {
581
+ message: toError(error).message
582
+ });
583
+ });
584
+ return true;
585
+ }
586
+ // <digest/> — digest key sync
587
+ if (childTag === 'digest') {
588
+ const ackNode = buildAckNode({
589
+ kind: 'notification',
590
+ node,
591
+ includeType: false
592
+ });
593
+ await runtime.sendNode(ackNode);
594
+ const tasks = passiveTasks;
595
+ if (!tasks) {
596
+ logger.warn('encrypt-digest: passive tasks not available');
597
+ return true;
598
+ }
599
+ await tasks.handleDigestNotification().catch((error) => {
600
+ logger.warn('encrypt-digest: digest sync failed', {
601
+ message: toError(error).message
602
+ });
603
+ });
604
+ return true;
605
+ }
606
+ // <identity/> — contact identity key changed
607
+ if (childTag === 'identity') {
608
+ const parsed = parseIdentityChangeNotification(node);
609
+ if (!parsed) {
610
+ return false;
611
+ }
612
+ const ackNode = buildAckNode({
613
+ kind: 'notification',
614
+ node,
615
+ includeType: false
616
+ });
617
+ await runtime.sendNode(ackNode);
618
+ const address = parseSignalAddressFromJid(parsed.fromJid);
619
+ // ignore companion devices (non-primary)
620
+ if (address.device !== 0) {
621
+ logger.debug('identity-change: ignoring companion device', {
622
+ jid: parsed.fromJid
623
+ });
624
+ return true;
625
+ }
626
+ // self-primary identity change → must disconnect
627
+ const meJid = getCurrentMeJid();
628
+ if (meJid) {
629
+ const meUser = toUserJid(meJid);
630
+ const fromUser = toUserJid(parsed.fromJid);
631
+ if (meUser === fromUser) {
632
+ logger.error('self primary identity changed, disconnecting');
633
+ void connectionManager?.getComms()?.stopComms();
634
+ await disconnectWithClientSideEffects(WA_DISCONNECT_REASONS.PRIMARY_IDENTITY_KEY_CHANGE, true, null);
635
+ await clearStoredCredentialsWithClientSideEffects();
636
+ return true;
637
+ }
638
+ }
639
+ const oldIdentity = await sessionStore.identity.getRemoteIdentity(address);
640
+ if (oldIdentity) {
641
+ logger.info('identity-change: clearing session', {
642
+ jid: parsed.fromJid
643
+ });
644
+ await sessionStore.session.deleteSession(address);
645
+ const userJid = toUserJid(parsed.fromJid);
646
+ await trustedContactToken.reissueOnIdentityChange(userJid).catch((error) => {
647
+ logger.warn('identity-change: reissue tc token failed', {
648
+ message: toError(error).message
649
+ });
650
+ });
651
+ }
652
+ runtime.emitEvent('notification', {
653
+ rawNode: node,
654
+ stanzaId: parsed.stanzaId,
655
+ chatJid: parsed.fromJid,
656
+ stanzaType: 'encrypt',
657
+ notificationType: 'encrypt',
658
+ classification: 'core',
659
+ details: {
660
+ kind: 'identity_change',
661
+ displayName: parsed.displayName,
662
+ lid: parsed.lid,
663
+ hadPreviousIdentity: !!oldIdentity
664
+ }
665
+ });
666
+ return true;
667
+ }
668
+ return false;
669
+ }
670
+ });
671
+ incomingNode.registerIncomingHandler({
672
+ tag: WA_NODE_TAGS.NOTIFICATION,
673
+ subtype: WA_NOTIFICATION_TYPES.DEVICES,
674
+ prepend: true,
675
+ handler: async (node) => {
676
+ const parsed = parseDeviceNotification(node);
677
+ if (!parsed) {
678
+ return false;
679
+ }
680
+ const ackNode = buildAckNode({
681
+ kind: 'notification',
682
+ node,
683
+ includeType: false
684
+ });
685
+ await runtime.sendNode(ackNode);
686
+ const userJid = toUserJid(parsed.fromJid);
687
+ if (parsed.action === DEVICE_NOTIFICATION_ACTIONS.REMOVE) {
688
+ const baseAddress = parseSignalAddressFromJid(parsed.fromJid);
689
+ for (const device of parsed.devices) {
690
+ const address = {
691
+ user: baseAddress.user,
692
+ server: baseAddress.server,
693
+ device: device.deviceId
694
+ };
695
+ await sessionStore.session.deleteSession(address).catch((error) => {
696
+ logger.warn('devices-notification: delete session failed', {
697
+ message: toError(error).message
698
+ });
699
+ });
700
+ }
701
+ }
702
+ // invalidate device list cache so next fanout fetches fresh list
703
+ if (sessionStore.deviceList) {
704
+ await sessionStore.deviceList.deleteUserDevices(userJid).catch((error) => {
705
+ logger.warn('devices-notification: invalidate cache failed', {
706
+ message: toError(error).message
707
+ });
708
+ });
709
+ }
710
+ // for update notifications, re-sync immediately
711
+ if (parsed.action === DEVICE_NOTIFICATION_ACTIONS.UPDATE) {
712
+ signalDeviceSync.syncDeviceList([userJid]).catch((error) => {
713
+ logger.warn('devices-notification: sync device list failed', {
714
+ message: toError(error).message
715
+ });
716
+ });
717
+ }
718
+ runtime.emitEvent('notification', {
719
+ rawNode: node,
720
+ stanzaId: parsed.stanzaId,
721
+ chatJid: parsed.fromJid,
722
+ stanzaType: 'devices',
723
+ notificationType: 'devices',
724
+ classification: 'core',
725
+ details: {
726
+ kind: 'device_list_change',
727
+ action: parsed.action,
728
+ devices: parsed.devices
729
+ }
730
+ });
731
+ return true;
732
+ }
733
+ });
734
+ incomingNode.registerIncomingHandler({
735
+ tag: WA_NODE_TAGS.NOTIFICATION,
736
+ subtype: WA_PRIVACY_TOKEN_NOTIFICATION_TYPE,
737
+ prepend: true,
738
+ handler: async (node) => {
739
+ const fromJid = node.attrs.from ?? node.attrs.sender_lid;
740
+ if (!fromJid) {
741
+ return false;
742
+ }
743
+ const tokens = parsePrivacyTokenNotification(node);
744
+ if (tokens.length === 0) {
745
+ return false;
746
+ }
747
+ await trustedContactToken.handleIncomingToken(fromJid, tokens);
748
+ const ackNode = buildAckNode({
749
+ kind: 'notification',
750
+ node,
751
+ typeOverride: WA_PRIVACY_TOKEN_NOTIFICATION_TYPE
752
+ });
753
+ await runtime.sendNode(ackNode);
754
+ return true;
755
+ }
756
+ });
757
+ // AB Props: sync after successful login and on server notification
758
+ incomingNode.registerIncomingHandler({
759
+ tag: WA_NODE_TAGS.NOTIFICATION,
760
+ subtype: WA_NOTIFICATION_TYPES.SERVER,
761
+ prepend: true,
762
+ handler: async (node) => {
763
+ const firstChild = getFirstNodeChild(node);
764
+ if (!firstChild || firstChild.tag !== WA_NODE_TAGS.ABPROPS) {
765
+ return false;
766
+ }
767
+ const ackNode = buildAckNode({
768
+ kind: 'notification',
769
+ node,
770
+ includeType: false
771
+ });
772
+ await runtime.sendNode(ackNode);
773
+ abPropsCoordinator.sync();
774
+ return true;
775
+ }
776
+ });
453
777
  passiveTasks = new WaPassiveTasksCoordinator({
454
778
  logger,
455
779
  signalStore: sessionStore.signal,
780
+ preKeyStore: sessionStore.preKey,
456
781
  signalDigestSync,
457
782
  signalRotateKey,
458
783
  runtime: createPassiveTasksRuntime({
@@ -460,8 +785,11 @@ export function buildWaClientDependencies(input) {
460
785
  authClient,
461
786
  nodeOrchestrator,
462
787
  receiptQueue,
463
- getCurrentCredentials
464
- })
788
+ getCurrentCredentials,
789
+ abPropsCoordinator
790
+ }),
791
+ mobilePrimary: options.mobileTransport !== undefined,
792
+ appStateSync
465
793
  });
466
794
  return {
467
795
  nodeTransport,
@@ -482,13 +810,18 @@ export function buildWaClientDependencies(input) {
482
810
  messageDispatch,
483
811
  retryCoordinator,
484
812
  appStateSync,
485
- appStateMutations,
813
+ chatCoordinator: appStateMutations,
486
814
  streamControl,
487
815
  incomingNode,
488
816
  passiveTasks,
489
817
  groupCoordinator,
818
+ privacyCoordinator,
819
+ profileCoordinator,
820
+ businessCoordinator,
821
+ emailCoordinator,
490
822
  receiptQueue,
491
- keyShareCoordinator,
492
- connectionManager
823
+ connectionManager,
824
+ trustedContactToken,
825
+ abPropsCoordinator
493
826
  };
494
827
  }