zapo-js 0.1.1 → 0.2.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 (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -4,18 +4,34 @@ exports.resolveWaClientBase = resolveWaClientBase;
4
4
  exports.buildWaClientDependencies = buildWaClientDependencies;
5
5
  const WaAppStateSyncClient_1 = require("../appstate/WaAppStateSyncClient");
6
6
  const WaAuthClient_1 = require("../auth/WaAuthClient");
7
+ const WaConnectionManager_1 = require("./connection/WaConnectionManager");
8
+ const WaKeyShareCoordinator_1 = require("./connection/WaKeyShareCoordinator");
9
+ const WaReceiptQueue_1 = require("./connection/WaReceiptQueue");
10
+ const WaAppStateMutationCoordinator_1 = require("./coordinators/WaAppStateMutationCoordinator");
11
+ const WaBusinessCoordinator_1 = require("./coordinators/WaBusinessCoordinator");
7
12
  const WaGroupCoordinator_1 = require("./coordinators/WaGroupCoordinator");
8
13
  const WaIncomingNodeCoordinator_1 = require("./coordinators/WaIncomingNodeCoordinator");
9
14
  const WaMessageDispatchCoordinator_1 = require("./coordinators/WaMessageDispatchCoordinator");
10
15
  const WaPassiveTasksCoordinator_1 = require("./coordinators/WaPassiveTasksCoordinator");
16
+ const WaPrivacyCoordinator_1 = require("./coordinators/WaPrivacyCoordinator");
17
+ const WaProfileCoordinator_1 = require("./coordinators/WaProfileCoordinator");
11
18
  const WaRetryCoordinator_1 = require("./coordinators/WaRetryCoordinator");
12
19
  const WaStreamControlCoordinator_1 = require("./coordinators/WaStreamControlCoordinator");
20
+ const WaTrustedContactTokenCoordinator_1 = require("./coordinators/WaTrustedContactTokenCoordinator");
13
21
  const dirty_1 = require("./dirty");
22
+ const devices_1 = require("./events/devices");
23
+ const identity_1 = require("./events/identity");
24
+ const privacy_token_1 = require("./events/privacy-token");
14
25
  const messages_1 = require("./messages");
26
+ const fanout_1 = require("./messaging/fanout");
27
+ const key_protocol_1 = require("./messaging/key-protocol");
28
+ const participants_1 = require("./messaging/participants");
15
29
  const WaMediaTransferClient_1 = require("../media/WaMediaTransferClient");
16
30
  const incoming_1 = require("../message/incoming");
17
31
  const WaMessageClient_1 = require("../message/WaMessageClient");
18
32
  const constants_1 = require("../protocol/constants");
33
+ const jid_1 = require("../protocol/jid");
34
+ const tracker_1 = require("../retry/tracker");
19
35
  const SignalDeviceSyncApi_1 = require("../signal/api/SignalDeviceSyncApi");
20
36
  const SignalDigestSyncApi_1 = require("../signal/api/SignalDigestSyncApi");
21
37
  const SignalIdentitySyncApi_1 = require("../signal/api/SignalIdentitySyncApi");
@@ -23,13 +39,40 @@ const SignalMissingPreKeysSyncApi_1 = require("../signal/api/SignalMissingPreKey
23
39
  const SignalRotateKeyApi_1 = require("../signal/api/SignalRotateKeyApi");
24
40
  const SignalSessionSyncApi_1 = require("../signal/api/SignalSessionSyncApi");
25
41
  const SenderKeyManager_1 = require("../signal/group/SenderKeyManager");
42
+ const resolver_1 = require("../signal/session/resolver");
26
43
  const SignalProtocol_1 = require("../signal/session/SignalProtocol");
27
44
  const WaKeepAlive_1 = require("../transport/keepalive/WaKeepAlive");
45
+ const global_1 = require("../transport/node/builders/global");
46
+ const helpers_1 = require("../transport/node/helpers");
47
+ const usync_1 = require("../transport/node/usync");
28
48
  const WaNodeOrchestrator_1 = require("../transport/node/WaNodeOrchestrator");
29
49
  const WaNodeTransport_1 = require("../transport/node/WaNodeTransport");
50
+ const proxy_1 = require("../transport/proxy");
30
51
  const primitives_1 = require("../util/primitives");
31
52
  const runtime_1 = require("../util/runtime");
53
+ function assertProxyTransport(value, path) {
54
+ if (value === undefined) {
55
+ return;
56
+ }
57
+ if (!(0, proxy_1.isProxyTransport)(value)) {
58
+ throw new Error(`${path} must be a proxy transport instance (dispatcher with dispatch(...) or agent with addRequest(...))`);
59
+ }
60
+ }
61
+ function validateProxyOptions(options) {
62
+ const rawProxy = options.proxy;
63
+ if (rawProxy === undefined) {
64
+ return;
65
+ }
66
+ if (typeof rawProxy !== 'object' || rawProxy === null || Array.isArray(rawProxy)) {
67
+ throw new Error('proxy must be an object with optional ws/mediaUpload/mediaDownload');
68
+ }
69
+ const proxy = rawProxy;
70
+ assertProxyTransport(proxy?.ws, 'proxy.ws');
71
+ assertProxyTransport(proxy?.mediaUpload, 'proxy.mediaUpload');
72
+ assertProxyTransport(proxy?.mediaDownload, 'proxy.mediaDownload');
73
+ }
32
74
  function resolveWaClientBase(options, logger) {
75
+ validateProxyOptions(options);
33
76
  const deviceBrowser = options.deviceBrowser ?? constants_1.WA_DEFAULTS.DEVICE_BROWSER;
34
77
  const sessionId = options.sessionId.trim();
35
78
  if (sessionId.length === 0) {
@@ -61,79 +104,14 @@ function resolveWaClientBase(options, logger) {
61
104
  sessionStore
62
105
  };
63
106
  }
64
- function createAuthClient(input) {
65
- const { options, logger, sessionStore, host } = input;
66
- return new WaAuthClient_1.WaAuthClient({
67
- deviceBrowser: options.deviceBrowser,
68
- deviceOsDisplayName: options.deviceOsDisplayName,
69
- devicePlatform: options.devicePlatform,
70
- requireFullSync: options.requireFullSync
71
- }, {
72
- logger,
73
- authStore: sessionStore.auth,
74
- signalStore: sessionStore.signal,
75
- socket: {
76
- sendNode: host.sendNode,
77
- query: host.query
78
- },
79
- callbacks: {
80
- onQr: (qr, ttlMs) => host.emitEvent('auth_qr', { qr, ttlMs }),
81
- onPairingCode: (code) => host.emitEvent('auth_pairing_code', { code }),
82
- onPairingRefresh: (forceManual) => host.emitEvent('auth_pairing_refresh', { forceManual }),
83
- onPaired: (credentials) => {
84
- host.emitEvent('auth_paired', { credentials });
85
- host.scheduleReconnectAfterPairing();
86
- },
87
- onError: (error) => host.handleError(error)
88
- }
89
- });
90
- }
91
- function createCurrentAuthGetters(authClient) {
92
- const getCurrentCredentials = () => authClient.getCurrentCredentials();
93
- return {
94
- getCurrentCredentials,
95
- getCurrentMeJid: () => getCurrentCredentials()?.meJid,
96
- getCurrentMeLid: () => getCurrentCredentials()?.meLid,
97
- getCurrentSignedIdentity: () => getCurrentCredentials()?.signedIdentity
98
- };
99
- }
100
- function createIncomingMessageAckOptions(input) {
101
- const { logger, host, getCurrentMeJid, signalProtocol, senderKeyManager, retryCoordinator } = input;
102
- return {
103
- logger,
104
- sendNode: host.sendNode,
105
- getMeJid: getCurrentMeJid,
106
- signalProtocol,
107
- senderKeyManager,
108
- onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
109
- emitIncomingMessage: (event) => {
110
- void host
111
- .handleIncomingMessageEvent(event)
112
- .catch((err) => host.handleError((0, primitives_1.toError)(err)));
113
- },
114
- emitUnhandledStanza: (event) => host.emitEvent('stanza_unhandled', event)
115
- };
116
- }
117
- function createHandleClientDirtyBits(input) {
118
- const { logger, host, getCurrentCredentials } = input;
119
- return (dirtyBits) => (0, dirty_1.handleDirtyBits)({
120
- logger,
121
- queryWithContext: host.queryWithContext,
122
- getCurrentCredentials,
123
- syncAppState: host.syncAppState
124
- }, dirtyBits);
125
- }
126
107
  function createIncomingNodeRuntime(input) {
127
- const { logger, host, authClient, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
108
+ const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
128
109
  return {
129
110
  handleStreamControlResult: streamControl.handleStreamControlResult,
130
111
  persistSuccessAttributes: (attributes) => authClient.persistSuccessAttributes(attributes),
131
- emitSuccessNode: (node) => host.emitEvent('connection_success', { node }),
132
- updateClockSkewFromSuccess: host.updateClockSkewFromSuccess,
133
- shouldWarmupMediaConn: () => {
134
- const comms = host.getComms();
135
- return !!(getCurrentMeJid() && comms && comms.getCommsState().connected);
136
- },
112
+ emitSuccessNode: (node) => emitEvent('connection_success', { node }),
113
+ updateClockSkewFromSuccess: (serverUnixSeconds) => connectionManager.updateClockSkewFromSuccess(serverUnixSeconds),
114
+ shouldWarmupMediaConn: () => !!(getCurrentMeJid() && connectionManager.isConnected()),
137
115
  warmupMediaConn: async () => {
138
116
  await (0, messages_1.getMediaConn)(mediaMessageBuildOptions, true);
139
117
  },
@@ -144,18 +122,18 @@ function createIncomingNodeRuntime(input) {
144
122
  handleLinkCodeNotificationNode: (node) => authClient.handleLinkCodeNotification(node),
145
123
  handleCompanionRegRefreshNotificationNode: (node) => authClient.handleCompanionRegRefreshNotification(node),
146
124
  handleIncomingMessageNode: (node) => (0, incoming_1.handleIncomingMessageAck)(node, incomingMessageAckOptions),
147
- sendNode: host.sendNode,
125
+ sendNode,
148
126
  handleIncomingRetryReceipt: (node) => retryCoordinator.handleIncomingRetryReceipt(node),
149
127
  trackOutboundReceipt: (node) => retryCoordinator.trackOutboundReceipt(node),
150
- emitIncomingReceipt: (event) => host.emitEvent('message_receipt', event),
151
- emitIncomingPresence: (event) => host.emitEvent('presence', event),
152
- emitIncomingChatstate: (event) => host.emitEvent('chatstate', event),
153
- emitIncomingCall: (event) => host.emitEvent('call', event),
154
- emitIncomingFailure: (event) => host.emitEvent('failure', event),
155
- emitIncomingErrorStanza: (event) => host.emitEvent('stanza_error', event),
156
- emitIncomingNotification: (event) => host.emitEvent('notification', event),
128
+ emitIncomingReceipt: (event) => emitEvent('message_receipt', event),
129
+ emitIncomingPresence: (event) => emitEvent('presence', event),
130
+ emitIncomingChatstate: (event) => emitEvent('chatstate', event),
131
+ emitIncomingCall: (event) => emitEvent('call', event),
132
+ emitIncomingFailure: (event) => emitEvent('failure', event),
133
+ emitIncomingErrorStanza: (event) => emitEvent('stanza_error', event),
134
+ emitIncomingNotification: (event) => emitEvent('notification', event),
157
135
  emitGroupEvent: (event) => {
158
- host.emitEvent('group_event', event);
136
+ emitEvent('group_event', event);
159
137
  void messageDispatch.mutateParticipantsCacheFromGroupEvent(event).catch((error) => {
160
138
  logger.warn('failed to mutate participants cache from group event', {
161
139
  action: event.action,
@@ -165,29 +143,38 @@ function createIncomingNodeRuntime(input) {
165
143
  });
166
144
  });
167
145
  },
168
- emitUnhandledIncomingNode: (event) => host.emitEvent('stanza_unhandled', event),
169
- syncAppState: host.syncAppState,
170
- disconnect: host.disconnect,
171
- clearStoredCredentials: host.clearStoredState,
146
+ emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
147
+ syncAppState,
148
+ stopComms: () => {
149
+ void connectionManager.getComms()?.stopComms();
150
+ },
151
+ disconnect,
152
+ clearStoredCredentials,
172
153
  parseDirtyBits: (nodes) => (0, dirty_1.parseDirtyBits)(nodes, logger),
173
154
  handleDirtyBits: (dirtyBits) => handleClientDirtyBits(dirtyBits)
174
155
  };
175
156
  }
176
157
  function createPassiveTasksRuntime(input) {
177
- const { host, authClient, nodeOrchestrator, getCurrentCredentials } = input;
158
+ const { queryWithContext, authClient, nodeOrchestrator, receiptQueue, getCurrentCredentials } = input;
178
159
  return {
179
- queryWithContext: host.queryWithContext,
160
+ queryWithContext,
180
161
  getCurrentCredentials,
181
162
  persistServerHasPreKeys: (serverHasPreKeys) => authClient.persistServerHasPreKeys(serverHasPreKeys),
182
163
  sendNodeDirect: (node) => nodeOrchestrator.sendNode(node),
183
- takeDanglingReceipts: host.takeDanglingReceipts,
184
- requeueDanglingReceipt: host.enqueueDanglingReceipt,
185
- shouldQueueDanglingReceipt: host.shouldQueueDanglingReceipt
164
+ takeDanglingReceipts: () => receiptQueue.take(),
165
+ requeueDanglingReceipt: (node) => receiptQueue.enqueue(node),
166
+ shouldQueueDanglingReceipt: (node, error) => receiptQueue.shouldQueue(node, error)
186
167
  };
187
168
  }
188
169
  function buildWaClientDependencies(input) {
189
- const { base, host } = input;
170
+ const { base, runtime } = input;
190
171
  const { options, logger, sessionStore } = base;
172
+ const receiptQueue = new WaReceiptQueue_1.WaReceiptQueue();
173
+ const keyShareCoordinator = new WaKeyShareCoordinator_1.WaKeyShareCoordinator();
174
+ let connectionManager = null;
175
+ let passiveTasks = null;
176
+ let mediaConnCacheFallback = null;
177
+ let scheduleReconnectAfterPairing = () => undefined;
191
178
  const nodeTransport = new WaNodeTransport_1.WaNodeTransport(logger);
192
179
  const nodeOrchestrator = new WaNodeOrchestrator_1.WaNodeOrchestrator({
193
180
  sendNode: async (node) => nodeTransport.sendNode(node),
@@ -198,27 +185,39 @@ function buildWaClientDependencies(input) {
198
185
  const keepAlive = new WaKeepAlive_1.WaKeepAlive({
199
186
  logger,
200
187
  nodeOrchestrator,
201
- getComms: host.getComms,
188
+ getComms: () => connectionManager?.getComms() ?? null,
202
189
  intervalMs: options.keepAliveIntervalMs,
203
190
  timeoutMs: options.deadSocketTimeoutMs,
204
191
  hostDomain: constants_1.WA_DEFAULTS.HOST_DOMAIN
205
192
  });
206
193
  const mediaTransfer = new WaMediaTransferClient_1.WaMediaTransferClient({
207
194
  logger,
208
- defaultTimeoutMs: options.mediaTimeoutMs
195
+ defaultTimeoutMs: options.mediaTimeoutMs,
196
+ defaultUploadDispatcher: (0, proxy_1.toProxyDispatcher)(options.proxy?.mediaUpload),
197
+ defaultDownloadDispatcher: (0, proxy_1.toProxyDispatcher)(options.proxy?.mediaDownload),
198
+ defaultUploadAgent: (0, proxy_1.toProxyAgent)(options.proxy?.mediaUpload),
199
+ defaultDownloadAgent: (0, proxy_1.toProxyAgent)(options.proxy?.mediaDownload)
209
200
  });
210
201
  const mediaMessageBuildOptions = {
211
202
  logger,
212
203
  mediaTransfer,
213
204
  iqTimeoutMs: options.iqTimeoutMs,
214
- queryWithContext: host.queryWithContext,
215
- getMediaConnCache: host.getMediaConnCache,
216
- setMediaConnCache: host.setMediaConnCache
205
+ queryWithContext: runtime.queryWithContext,
206
+ getMediaConnCache: () => {
207
+ if (connectionManager) {
208
+ return connectionManager.getMediaConnCache();
209
+ }
210
+ return mediaConnCacheFallback;
211
+ },
212
+ setMediaConnCache: (mediaConn) => {
213
+ mediaConnCacheFallback = mediaConn;
214
+ connectionManager?.setMediaConnCache(mediaConn);
215
+ }
217
216
  };
218
217
  const messageClient = new WaMessageClient_1.WaMessageClient({
219
218
  logger,
220
- sendNode: host.sendNode,
221
- query: host.query,
219
+ sendNode: runtime.sendNode,
220
+ query: runtime.query,
222
221
  defaultAckTimeoutMs: options.messageAckTimeoutMs,
223
222
  defaultMaxAttempts: options.messageMaxAttempts,
224
223
  defaultRetryDelayMs: options.messageRetryDelayMs
@@ -227,59 +226,156 @@ function buildWaClientDependencies(input) {
227
226
  const signalProtocol = new SignalProtocol_1.SignalProtocol(sessionStore.signal, logger);
228
227
  const signalDigestSync = new SignalDigestSyncApi_1.SignalDigestSyncApi({
229
228
  logger,
230
- query: host.query,
229
+ query: runtime.query,
231
230
  signalStore: sessionStore.signal,
232
231
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
233
232
  });
233
+ const generateUsyncSid = (0, usync_1.createUsyncSidGenerator)();
234
234
  const signalDeviceSync = new SignalDeviceSyncApi_1.SignalDeviceSyncApi({
235
235
  logger,
236
- query: host.query,
236
+ query: runtime.query,
237
237
  deviceListStore: sessionStore.deviceList,
238
- defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
238
+ defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs,
239
+ generateSid: generateUsyncSid
239
240
  });
240
241
  const signalIdentitySync = new SignalIdentitySyncApi_1.SignalIdentitySyncApi({
241
242
  logger,
242
- query: host.query,
243
+ query: runtime.query,
243
244
  signalStore: sessionStore.signal,
244
245
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
245
246
  });
246
247
  const signalMissingPreKeysSync = new SignalMissingPreKeysSyncApi_1.SignalMissingPreKeysSyncApi({
247
248
  logger,
248
- query: host.query,
249
+ query: runtime.query,
249
250
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
250
251
  });
251
252
  const signalRotateKey = new SignalRotateKeyApi_1.SignalRotateKeyApi({
252
253
  logger,
253
- query: host.query,
254
+ query: runtime.query,
254
255
  signalStore: sessionStore.signal,
255
256
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
256
257
  });
257
258
  const signalSessionSync = new SignalSessionSyncApi_1.SignalSessionSyncApi({
258
259
  logger,
259
- query: host.query,
260
+ query: runtime.query,
260
261
  defaultTimeoutMs: options.signalFetchKeyBundlesTimeoutMs
261
262
  });
262
- const authClient = createAuthClient({ options, logger, sessionStore, host });
263
- const { getCurrentCredentials, getCurrentMeJid, getCurrentMeLid, getCurrentSignedIdentity } = createCurrentAuthGetters(authClient);
263
+ const authClient = new WaAuthClient_1.WaAuthClient({
264
+ deviceBrowser: options.deviceBrowser,
265
+ deviceOsDisplayName: options.deviceOsDisplayName,
266
+ devicePlatform: options.devicePlatform,
267
+ requireFullSync: options.requireFullSync,
268
+ version: options.version
269
+ }, {
270
+ logger,
271
+ authStore: sessionStore.auth,
272
+ signalStore: sessionStore.signal,
273
+ socket: {
274
+ sendNode: runtime.sendNode,
275
+ query: runtime.query
276
+ },
277
+ callbacks: {
278
+ onQr: (qr, ttlMs) => runtime.emitEvent('auth_qr', { qr, ttlMs }),
279
+ onPairingCode: (code) => runtime.emitEvent('auth_pairing_code', { code }),
280
+ onPairingRefresh: (forceManual) => runtime.emitEvent('auth_pairing_refresh', { forceManual }),
281
+ onPaired: (credentials) => {
282
+ runtime.emitEvent('auth_paired', { credentials });
283
+ scheduleReconnectAfterPairing();
284
+ },
285
+ onError: (error) => runtime.handleError(error)
286
+ }
287
+ });
288
+ const getCurrentCredentials = authClient.getCurrentCredentials.bind(authClient);
289
+ const getCurrentMeJid = () => getCurrentCredentials()?.meJid;
290
+ const getCurrentMeLid = () => getCurrentCredentials()?.meLid;
291
+ const getCurrentSignedIdentity = () => getCurrentCredentials()?.signedIdentity;
264
292
  const groupCoordinator = (0, WaGroupCoordinator_1.createGroupCoordinator)({
265
- queryWithContext: host.queryWithContext
293
+ queryWithContext: runtime.queryWithContext
266
294
  });
267
- const messageDispatch = new WaMessageDispatchCoordinator_1.WaMessageDispatchCoordinator({
268
- logger,
269
- messageClient,
295
+ const privacyCoordinator = (0, WaPrivacyCoordinator_1.createPrivacyCoordinator)({
296
+ queryWithContext: runtime.queryWithContext
297
+ });
298
+ const profileCoordinator = (0, WaProfileCoordinator_1.createProfileCoordinator)({
299
+ queryWithContext: runtime.queryWithContext,
300
+ generateSid: generateUsyncSid
301
+ });
302
+ const businessCoordinator = (0, WaBusinessCoordinator_1.createBusinessCoordinator)({
303
+ queryWithContext: runtime.queryWithContext
304
+ });
305
+ const retryTracker = (0, tracker_1.createOutboundRetryTracker)({
270
306
  retryStore: sessionStore.retry,
307
+ logger
308
+ });
309
+ const sessionResolver = (0, resolver_1.createSignalSessionResolver)({
310
+ signalProtocol,
311
+ signalStore: sessionStore.signal,
312
+ signalIdentitySync,
313
+ signalSessionSync,
314
+ logger
315
+ });
316
+ const fanoutResolver = (0, fanout_1.createDeviceFanoutResolver)({
317
+ signalDeviceSync,
318
+ getCurrentMeJid,
319
+ getCurrentMeLid,
320
+ logger
321
+ });
322
+ const participantsCache = (0, participants_1.createGroupParticipantsCache)({
271
323
  participantsStore: sessionStore.participants,
324
+ queryGroupParticipantJids: async (groupJid) => {
325
+ const metadata = await groupCoordinator.queryGroupMetadata(groupJid);
326
+ const participantJids = new Array(metadata.participants.length);
327
+ for (let index = 0; index < metadata.participants.length; index += 1) {
328
+ participantJids[index] = metadata.participants[index].jid;
329
+ }
330
+ return participantJids;
331
+ },
332
+ logger
333
+ });
334
+ const trustedContactToken = new WaTrustedContactTokenCoordinator_1.WaTrustedContactTokenCoordinator({
335
+ logger,
336
+ store: sessionStore.privacyToken,
337
+ runtime: {
338
+ queryWithContext: runtime.queryWithContext,
339
+ emitEvent: runtime.emitEvent,
340
+ getCurrentMeLid: () => getCurrentMeLid() ?? null
341
+ },
342
+ durationS: options.privacyToken?.tcTokenDurationS,
343
+ numBuckets: options.privacyToken?.tcTokenNumBuckets,
344
+ senderDurationS: options.privacyToken?.tcTokenSenderDurationS,
345
+ senderNumBuckets: options.privacyToken?.tcTokenSenderNumBuckets,
346
+ maxDurationS: options.privacyToken?.tcTokenMaxDurationS
347
+ });
348
+ let messageDispatch;
349
+ const appStateSyncKeyProtocol = (0, key_protocol_1.createAppStateSyncKeyProtocol)({
350
+ publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
351
+ fanoutResolver,
352
+ getCurrentMeJid,
353
+ getCurrentMeLid,
354
+ logger
355
+ });
356
+ messageDispatch = new WaMessageDispatchCoordinator_1.WaMessageDispatchCoordinator({
357
+ logger,
358
+ messageClient,
359
+ retryTracker,
360
+ sessionResolver,
361
+ fanoutResolver,
362
+ participantsCache,
363
+ appStateSyncKeyProtocol,
272
364
  buildMessageContent: async (content) => (0, messages_1.buildMediaMessageContent)(mediaMessageBuildOptions, content),
273
- queryGroupParticipantJids: async (groupJid) => (await groupCoordinator.queryGroupMetadata(groupJid)).participants.map((participant) => participant.jid),
274
365
  senderKeyManager,
275
366
  signalProtocol,
276
367
  signalStore: sessionStore.signal,
277
- signalDeviceSync,
278
- signalIdentitySync,
279
- signalSessionSync,
368
+ deviceListStore: sessionStore.deviceList,
280
369
  getCurrentMeJid,
281
370
  getCurrentMeLid,
282
- getCurrentSignedIdentity
371
+ getCurrentSignedIdentity,
372
+ resolvePrivacyTokenNode: (recipientJid) => trustedContactToken.resolveTokenForMessage(recipientJid),
373
+ onDirectMessageSent: (recipientJid) => {
374
+ trustedContactToken.maybeIssueSenderToken(recipientJid).catch((err) => logger.warn('sender token issue failed', {
375
+ to: recipientJid,
376
+ message: (0, primitives_1.toError)(err).message
377
+ }));
378
+ }
283
379
  });
284
380
  const retryCoordinator = new WaRetryCoordinator_1.WaRetryCoordinator({
285
381
  logger,
@@ -290,67 +386,330 @@ function buildWaClientDependencies(input) {
290
386
  signalDeviceSync,
291
387
  signalMissingPreKeysSync,
292
388
  messageClient,
293
- sendNode: host.sendNode,
389
+ sendNode: runtime.sendNode,
294
390
  getCurrentMeJid,
295
391
  getCurrentMeLid,
296
392
  getCurrentSignedIdentity
297
393
  });
298
394
  const appStateSync = new WaAppStateSyncClient_1.WaAppStateSyncClient({
299
395
  logger,
300
- query: host.query,
396
+ query: runtime.query,
397
+ getCurrentMeJid,
301
398
  defaultTimeoutMs: options.appStateSyncTimeoutMs,
302
399
  store: sessionStore.appState,
303
400
  onMissingKeys: async ({ keyIds }) => {
304
401
  await messageDispatch.requestAppStateSyncKeys(keyIds);
305
402
  }
306
403
  });
404
+ const appStateMutations = new WaAppStateMutationCoordinator_1.WaAppStateMutationCoordinator({
405
+ logger,
406
+ messageStore: sessionStore.messages,
407
+ syncAppState: runtime.syncAppStateWithOptions
408
+ });
409
+ connectionManager = new WaConnectionManager_1.WaConnectionManager({
410
+ logger,
411
+ options,
412
+ authClient,
413
+ keepAlive,
414
+ nodeOrchestrator,
415
+ nodeTransport,
416
+ getPassiveTasks: () => passiveTasks,
417
+ clearStoredCredentials: runtime.clearStoredState
418
+ });
419
+ if (mediaConnCacheFallback !== null) {
420
+ connectionManager.setMediaConnCache(mediaConnCacheFallback);
421
+ }
422
+ scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
423
+ const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
424
+ keyShareCoordinator.notifyDisconnected();
425
+ await connectionManager?.disconnect();
426
+ runtime.emitEvent('connection', {
427
+ status: 'close',
428
+ reason,
429
+ code,
430
+ isLogout,
431
+ isNewLogin: false
432
+ });
433
+ };
434
+ const connectWithClientSideEffects = async (reason) => {
435
+ runtime.resumeIncomingEvents();
436
+ await connectionManager?.connect(runtime.handleIncomingFrame);
437
+ runtime.emitEvent('connection', {
438
+ status: 'open',
439
+ reason,
440
+ code: null,
441
+ isLogout: false,
442
+ isNewLogin: connectionManager?.wasNewLogin() ?? false
443
+ });
444
+ };
445
+ const clearStoredCredentialsWithClientSideEffects = async () => {
446
+ await connectionManager?.clearStoredCredentials();
447
+ };
307
448
  const streamControl = (0, WaStreamControlCoordinator_1.createStreamControlHandler)({
308
449
  logger,
309
- getComms: host.getComms,
450
+ getComms: () => connectionManager?.getComms() ?? null,
310
451
  clearPendingQueries: (error) => nodeOrchestrator.clearPending(error),
311
- clearMediaConnCache: () => host.setMediaConnCache(null),
312
- disconnect: host.disconnect,
313
- clearStoredCredentials: host.clearStoredState,
314
- connect: host.connect
452
+ clearMediaConnCache: () => {
453
+ mediaConnCacheFallback = null;
454
+ connectionManager?.setMediaConnCache(null);
455
+ },
456
+ disconnect: disconnectWithClientSideEffects,
457
+ clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
458
+ connect: connectWithClientSideEffects
315
459
  });
316
- const incomingMessageAckOptions = createIncomingMessageAckOptions({
460
+ const incomingMessageAckOptions = {
317
461
  logger,
318
- host,
319
- getCurrentMeJid,
462
+ sendNode: runtime.sendNode,
463
+ getMeJid: getCurrentMeJid,
320
464
  signalProtocol,
321
465
  senderKeyManager,
322
- retryCoordinator
323
- });
324
- const handleClientDirtyBits = createHandleClientDirtyBits({
466
+ onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
467
+ emitIncomingMessage: (event) => {
468
+ void runtime
469
+ .handleIncomingMessageEvent(event)
470
+ .catch((err) => runtime.handleError((0, primitives_1.toError)(err)));
471
+ },
472
+ emitUnhandledStanza: (event) => runtime.emitEvent('stanza_unhandled', event)
473
+ };
474
+ const handleClientDirtyBits = (dirtyBits) => (0, dirty_1.handleDirtyBits)({
325
475
  logger,
326
- host,
327
- getCurrentCredentials
328
- });
476
+ queryWithContext: runtime.queryWithContext,
477
+ getCurrentCredentials,
478
+ syncAppState: runtime.syncAppState,
479
+ generateUsyncSid
480
+ }, dirtyBits);
329
481
  const incomingNode = new WaIncomingNodeCoordinator_1.WaIncomingNodeCoordinator({
330
482
  logger,
331
483
  runtime: createIncomingNodeRuntime({
332
484
  logger,
333
- host,
485
+ emitEvent: runtime.emitEvent,
334
486
  authClient,
487
+ connectionManager,
335
488
  nodeOrchestrator,
336
489
  streamControl,
337
490
  mediaMessageBuildOptions,
338
491
  retryCoordinator,
339
492
  messageDispatch,
493
+ sendNode: runtime.sendNode,
494
+ syncAppState: runtime.syncAppState,
495
+ disconnect: disconnectWithClientSideEffects,
496
+ clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
340
497
  getCurrentMeJid,
341
498
  handleClientDirtyBits,
342
499
  incomingMessageAckOptions
343
500
  })
344
501
  });
345
- const passiveTasks = new WaPassiveTasksCoordinator_1.WaPassiveTasksCoordinator({
502
+ incomingNode.registerIncomingHandler({
503
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
504
+ subtype: constants_1.WA_NOTIFICATION_TYPES.ENCRYPT,
505
+ prepend: true,
506
+ handler: async (node) => {
507
+ const firstChild = (0, helpers_1.getFirstNodeChild)(node);
508
+ if (!firstChild) {
509
+ return false;
510
+ }
511
+ const childTag = firstChild.tag;
512
+ // <count value="N"/> — server prekeys running low
513
+ if (childTag === 'count') {
514
+ const ackNode = (0, global_1.buildAckNode)({
515
+ kind: 'notification',
516
+ node,
517
+ includeType: false
518
+ });
519
+ await runtime.sendNode(ackNode);
520
+ const tasks = passiveTasks;
521
+ if (!tasks) {
522
+ logger.warn('encrypt-count: passive tasks not available');
523
+ return true;
524
+ }
525
+ await tasks.handlePreKeyLowNotification().catch((error) => {
526
+ logger.warn('encrypt-count: prekey upload failed', {
527
+ message: (0, primitives_1.toError)(error).message
528
+ });
529
+ });
530
+ return true;
531
+ }
532
+ // <digest/> — digest key sync
533
+ if (childTag === 'digest') {
534
+ const ackNode = (0, global_1.buildAckNode)({
535
+ kind: 'notification',
536
+ node,
537
+ includeType: false
538
+ });
539
+ await runtime.sendNode(ackNode);
540
+ const tasks = passiveTasks;
541
+ if (!tasks) {
542
+ logger.warn('encrypt-digest: passive tasks not available');
543
+ return true;
544
+ }
545
+ await tasks.handleDigestNotification().catch((error) => {
546
+ logger.warn('encrypt-digest: digest sync failed', {
547
+ message: (0, primitives_1.toError)(error).message
548
+ });
549
+ });
550
+ return true;
551
+ }
552
+ // <identity/> — contact identity key changed
553
+ if (childTag === 'identity') {
554
+ const parsed = (0, identity_1.parseIdentityChangeNotification)(node);
555
+ if (!parsed) {
556
+ return false;
557
+ }
558
+ const ackNode = (0, global_1.buildAckNode)({
559
+ kind: 'notification',
560
+ node,
561
+ includeType: false
562
+ });
563
+ await runtime.sendNode(ackNode);
564
+ const address = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
565
+ // ignore companion devices (non-primary)
566
+ if (address.device !== 0) {
567
+ logger.debug('identity-change: ignoring companion device', {
568
+ jid: parsed.fromJid
569
+ });
570
+ return true;
571
+ }
572
+ // self-primary identity change → must disconnect
573
+ const meJid = getCurrentMeJid();
574
+ if (meJid) {
575
+ const meUser = (0, jid_1.toUserJid)(meJid);
576
+ const fromUser = (0, jid_1.toUserJid)(parsed.fromJid);
577
+ if (meUser === fromUser) {
578
+ logger.error('self primary identity changed, disconnecting');
579
+ void connectionManager?.getComms()?.stopComms();
580
+ await disconnectWithClientSideEffects(constants_1.WA_DISCONNECT_REASONS.PRIMARY_IDENTITY_KEY_CHANGE, true, null);
581
+ await clearStoredCredentialsWithClientSideEffects();
582
+ return true;
583
+ }
584
+ }
585
+ const oldIdentity = await sessionStore.signal.getRemoteIdentity(address);
586
+ if (oldIdentity) {
587
+ logger.info('identity-change: clearing session', {
588
+ jid: parsed.fromJid
589
+ });
590
+ await sessionStore.signal.deleteSession(address);
591
+ const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
592
+ await trustedContactToken.reissueOnIdentityChange(userJid).catch((error) => {
593
+ logger.warn('identity-change: reissue tc token failed', {
594
+ message: (0, primitives_1.toError)(error).message
595
+ });
596
+ });
597
+ }
598
+ runtime.emitEvent('notification', {
599
+ rawNode: node,
600
+ stanzaId: parsed.stanzaId,
601
+ chatJid: parsed.fromJid,
602
+ stanzaType: 'encrypt',
603
+ notificationType: 'encrypt',
604
+ classification: 'core',
605
+ details: {
606
+ kind: 'identity_change',
607
+ displayName: parsed.displayName,
608
+ lid: parsed.lid,
609
+ hadPreviousIdentity: !!oldIdentity
610
+ }
611
+ });
612
+ return true;
613
+ }
614
+ return false;
615
+ }
616
+ });
617
+ incomingNode.registerIncomingHandler({
618
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
619
+ subtype: constants_1.WA_NOTIFICATION_TYPES.DEVICES,
620
+ prepend: true,
621
+ handler: async (node) => {
622
+ const parsed = (0, devices_1.parseDeviceNotification)(node);
623
+ if (!parsed) {
624
+ return false;
625
+ }
626
+ const ackNode = (0, global_1.buildAckNode)({
627
+ kind: 'notification',
628
+ node,
629
+ includeType: false
630
+ });
631
+ await runtime.sendNode(ackNode);
632
+ const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
633
+ if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.REMOVE) {
634
+ const baseAddress = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
635
+ for (const device of parsed.devices) {
636
+ const address = {
637
+ user: baseAddress.user,
638
+ server: baseAddress.server,
639
+ device: device.deviceId
640
+ };
641
+ await sessionStore.signal.deleteSession(address).catch((error) => {
642
+ logger.warn('devices-notification: delete session failed', {
643
+ message: (0, primitives_1.toError)(error).message
644
+ });
645
+ });
646
+ }
647
+ }
648
+ // invalidate device list cache so next fanout fetches fresh list
649
+ if (sessionStore.deviceList) {
650
+ await sessionStore.deviceList.deleteUserDevices(userJid).catch((error) => {
651
+ logger.warn('devices-notification: invalidate cache failed', {
652
+ message: (0, primitives_1.toError)(error).message
653
+ });
654
+ });
655
+ }
656
+ // for update notifications, re-sync immediately
657
+ if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.UPDATE) {
658
+ signalDeviceSync.syncDeviceList([userJid]).catch((error) => {
659
+ logger.warn('devices-notification: sync device list failed', {
660
+ message: (0, primitives_1.toError)(error).message
661
+ });
662
+ });
663
+ }
664
+ runtime.emitEvent('notification', {
665
+ rawNode: node,
666
+ stanzaId: parsed.stanzaId,
667
+ chatJid: parsed.fromJid,
668
+ stanzaType: 'devices',
669
+ notificationType: 'devices',
670
+ classification: 'core',
671
+ details: {
672
+ kind: 'device_list_change',
673
+ action: parsed.action,
674
+ devices: parsed.devices
675
+ }
676
+ });
677
+ return true;
678
+ }
679
+ });
680
+ incomingNode.registerIncomingHandler({
681
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
682
+ subtype: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE,
683
+ prepend: true,
684
+ handler: async (node) => {
685
+ const fromJid = node.attrs.from ?? node.attrs.sender_lid;
686
+ if (!fromJid) {
687
+ return false;
688
+ }
689
+ const tokens = (0, privacy_token_1.parsePrivacyTokenNotification)(node);
690
+ if (tokens.length === 0) {
691
+ return false;
692
+ }
693
+ await trustedContactToken.handleIncomingToken(fromJid, tokens);
694
+ const ackNode = (0, global_1.buildAckNode)({
695
+ kind: 'notification',
696
+ node,
697
+ typeOverride: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE
698
+ });
699
+ await runtime.sendNode(ackNode);
700
+ return true;
701
+ }
702
+ });
703
+ passiveTasks = new WaPassiveTasksCoordinator_1.WaPassiveTasksCoordinator({
346
704
  logger,
347
705
  signalStore: sessionStore.signal,
348
706
  signalDigestSync,
349
707
  signalRotateKey,
350
708
  runtime: createPassiveTasksRuntime({
351
- host,
709
+ queryWithContext: runtime.queryWithContext,
352
710
  authClient,
353
711
  nodeOrchestrator,
712
+ receiptQueue,
354
713
  getCurrentCredentials
355
714
  })
356
715
  });
@@ -373,9 +732,17 @@ function buildWaClientDependencies(input) {
373
732
  messageDispatch,
374
733
  retryCoordinator,
375
734
  appStateSync,
735
+ chatCoordinator: appStateMutations,
376
736
  streamControl,
377
737
  incomingNode,
378
738
  passiveTasks,
379
- groupCoordinator
739
+ groupCoordinator,
740
+ privacyCoordinator,
741
+ profileCoordinator,
742
+ businessCoordinator,
743
+ receiptQueue,
744
+ keyShareCoordinator,
745
+ connectionManager,
746
+ trustedContactToken
380
747
  };
381
748
  }