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
@@ -6,14 +6,19 @@ const utils_1 = require("../appstate/utils");
6
6
  const chat_1 = require("./events/chat");
7
7
  const history_sync_1 = require("./history-sync");
8
8
  const mailbox_1 = require("./mailbox");
9
+ const WriteBehindPersistence_1 = require("./persistence/WriteBehindPersistence");
9
10
  const WaClientFactory_1 = require("./WaClientFactory");
10
11
  const ConsoleLogger_1 = require("../infra/log/ConsoleLogger");
12
+ const addon_crypto_1 = require("../message/addon-crypto");
11
13
  const _proto_1 = require("../proto.js");
12
14
  const constants_1 = require("../protocol/constants");
13
15
  const jid_1 = require("../protocol/jid");
16
+ const stream_1 = require("../protocol/stream");
17
+ const noop_store_1 = require("../store/noop.store");
18
+ const device_1 = require("../transport/node/builders/device");
19
+ const presence_1 = require("../transport/node/builders/presence");
14
20
  const query_1 = require("../transport/node/query");
15
21
  const bytes_1 = require("../util/bytes");
16
- const bytes_2 = require("../util/bytes");
17
22
  const primitives_1 = require("../util/primitives");
18
23
  const SYNC_RELATED_PROTOCOL_TYPES = new Set([
19
24
  _proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_REQUEST,
@@ -21,29 +26,45 @@ const SYNC_RELATED_PROTOCOL_TYPES = new Set([
21
26
  _proto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_MESSAGE,
22
27
  _proto_1.proto.Message.ProtocolMessage.Type.PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE
23
28
  ]);
24
- const WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS = 15000;
25
- const WA_APP_STATE_KEY_SHARE_MAX_RETRIES = 2;
26
29
  class WaClient extends node_events_1.EventEmitter {
27
30
  constructor(options, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
28
31
  super();
29
32
  this.connectPromise = null;
33
+ this.acceptingIncomingEvents = true;
34
+ this.activeIncomingHandlers = 0;
35
+ this.incomingHandlersDrainedWaiters = [];
30
36
  const base = (0, WaClientFactory_1.resolveWaClientBase)(options, logger);
31
37
  this.options = base.options;
32
38
  this.logger = base.logger;
33
39
  this.appStateStore = base.sessionStore.appState;
34
40
  this.contactStore = base.sessionStore.contacts;
35
41
  this.messageStore = base.sessionStore.messages;
42
+ this.messageSecretStore = base.sessionStore.messageSecret;
36
43
  this.participantsStore = base.sessionStore.participants;
44
+ this.privacyTokenStore = base.sessionStore.privacyToken;
37
45
  this.deviceListStore = base.sessionStore.deviceList;
38
46
  this.retryStore = base.sessionStore.retry;
39
47
  this.signalStore = base.sessionStore.signal;
48
+ this.preKeyStore = base.sessionStore.preKey;
49
+ this.sessionStore = base.sessionStore.session;
50
+ this.identityStore = base.sessionStore.identity;
40
51
  this.senderKeyStore = base.sessionStore.senderKey;
41
52
  this.threadStore = base.sessionStore.threads;
53
+ this.writeBehind = new WriteBehindPersistence_1.WriteBehindPersistence({
54
+ messageStore: this.messageStore,
55
+ threadStore: this.threadStore,
56
+ contactStore: this.contactStore
57
+ }, this.logger, this.options.writeBehind);
58
+ if (this.options.addons?.autoDecrypt &&
59
+ this.messageSecretStore === noop_store_1.NOOP_MESSAGE_SECRET_STORE) {
60
+ this.logger.warn('addons.autoDecrypt is enabled but messageSecret cache is noop — ' +
61
+ 'addon decryption will only work if secrets are in the message store');
62
+ }
42
63
  const dependencies = (0, WaClientFactory_1.buildWaClientDependencies)({
43
64
  base,
44
65
  runtime: {
45
66
  sendNode: (node) => this.sendNode(node),
46
- query: (node, timeoutMs) => this.query(node, timeoutMs),
67
+ query: (node, timeoutMs, options) => this.query(node, timeoutMs, options),
47
68
  queryWithContext: this.queryWithContext.bind(this),
48
69
  syncAppState: () => this.syncAppState().then(() => { }),
49
70
  syncAppStateWithOptions: (syncOptions) => this.syncAppState(syncOptions),
@@ -51,7 +72,10 @@ class WaClient extends node_events_1.EventEmitter {
51
72
  handleIncomingMessageEvent: this.handleIncomingMessageEvent.bind(this),
52
73
  handleError: this.handleError.bind(this),
53
74
  handleIncomingFrame: this.handleIncomingFrame.bind(this),
54
- clearStoredState: this.clearStoredState.bind(this)
75
+ clearStoredState: this.clearStoredState.bind(this),
76
+ resumeIncomingEvents: () => {
77
+ this.acceptingIncomingEvents = true;
78
+ }
55
79
  }
56
80
  });
57
81
  Object.assign(this, dependencies);
@@ -99,12 +123,16 @@ class WaClient extends node_events_1.EventEmitter {
99
123
  throw normalized;
100
124
  }
101
125
  }
102
- async query(node, timeoutMs = this.options.iqTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS) {
126
+ async sendPresence(type) {
127
+ const credentials = this.authClient.getCurrentCredentials();
128
+ await this.nodeOrchestrator.sendNode((0, presence_1.buildPresenceNode)({ type, name: credentials?.meDisplayName ?? undefined }), false);
129
+ }
130
+ async query(node, timeoutMs = this.options.iqTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, options = {}) {
103
131
  if (!this.connectionManager.isConnected()) {
104
132
  throw new Error('client is not connected');
105
133
  }
106
134
  this.logger.debug('wa client query', { tag: node.tag, id: node.attrs.id, timeoutMs });
107
- return this.nodeOrchestrator.query(node, timeoutMs);
135
+ return this.nodeOrchestrator.query(node, timeoutMs, options);
108
136
  }
109
137
  registerIncomingHandler(registration) {
110
138
  return this.incomingNode.registerIncomingHandler(registration);
@@ -122,63 +150,74 @@ class WaClient extends node_events_1.EventEmitter {
122
150
  this.handleError(error);
123
151
  });
124
152
  }
125
- getMailboxPersistenceDeps() {
126
- return {
127
- logger: this.logger,
128
- contactStore: this.contactStore,
129
- messageStore: this.messageStore
130
- };
131
- }
132
153
  async handleIncomingMessageEvent(event) {
133
- this.emit('message', event);
134
- void (0, mailbox_1.persistIncomingMailboxEntities)({
135
- ...this.getMailboxPersistenceDeps(),
136
- event
137
- });
138
- const protocolMessage = event.message?.protocolMessage;
139
- if (!protocolMessage) {
154
+ if (!this.tryEnterIncomingHandler()) {
140
155
  return;
141
156
  }
142
- const protocolEvent = {
143
- ...event,
144
- protocolMessage
145
- };
146
- this.emit('message_protocol', protocolEvent);
147
- const protocolType = protocolMessage.type;
148
- if (protocolType === null || protocolType === undefined) {
149
- this.logger.debug('incoming protocol message without type', {
150
- id: event.stanzaId,
151
- from: event.chatJid
157
+ try {
158
+ this.emit('message', event);
159
+ void (0, mailbox_1.persistIncomingMailboxEntities)({
160
+ logger: this.logger,
161
+ writeBehind: this.writeBehind,
162
+ messageSecretStore: this.messageSecretStore,
163
+ event
152
164
  });
153
- return;
154
- }
155
- if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_REQUEST) {
156
- await this.handleIncomingAppStateSyncKeyRequest(event, protocolMessage);
157
- return;
158
- }
159
- if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE) {
160
- await this.handleIncomingAppStateSyncKeyShare(event, protocolMessage);
161
- return;
162
- }
163
- if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION) {
164
- if (this.options.history?.enabled && protocolMessage.historySyncNotification) {
165
- await this.handleHistorySyncNotification(protocolMessage.historySyncNotification);
165
+ if (this.options.addons?.autoDecrypt && event.message) {
166
+ void this.tryDecryptAddon(event).catch((err) => {
167
+ this.logger.warn('addon auto-decrypt failed', {
168
+ id: event.stanzaId,
169
+ message: (0, primitives_1.toError)(err).message
170
+ });
171
+ });
166
172
  }
167
- return;
168
- }
169
- if (SYNC_RELATED_PROTOCOL_TYPES.has(protocolType)) {
170
- this.logger.info('incoming sync-related protocol message', {
173
+ const protocolMessage = event.message?.protocolMessage;
174
+ if (!protocolMessage) {
175
+ return;
176
+ }
177
+ const protocolEvent = {
178
+ ...event,
179
+ protocolMessage
180
+ };
181
+ this.emit('message_protocol', protocolEvent);
182
+ const protocolType = protocolMessage.type;
183
+ if (protocolType === null || protocolType === undefined) {
184
+ this.logger.debug('incoming protocol message without type', {
185
+ id: event.stanzaId,
186
+ from: event.chatJid
187
+ });
188
+ return;
189
+ }
190
+ if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_REQUEST) {
191
+ await this.handleIncomingAppStateSyncKeyRequest(event, protocolMessage);
192
+ return;
193
+ }
194
+ if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE) {
195
+ await this.handleIncomingAppStateSyncKeyShare(event, protocolMessage);
196
+ return;
197
+ }
198
+ if (protocolType === _proto_1.proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION) {
199
+ if (this.options.history?.enabled && protocolMessage.historySyncNotification) {
200
+ await this.handleHistorySyncNotification(protocolMessage.historySyncNotification);
201
+ }
202
+ return;
203
+ }
204
+ if (SYNC_RELATED_PROTOCOL_TYPES.has(protocolType)) {
205
+ this.logger.info('incoming sync-related protocol message', {
206
+ id: event.stanzaId,
207
+ from: event.chatJid,
208
+ protocolType
209
+ });
210
+ return;
211
+ }
212
+ this.logger.debug('incoming protocol message received', {
171
213
  id: event.stanzaId,
172
214
  from: event.chatJid,
173
215
  protocolType
174
216
  });
175
- return;
176
217
  }
177
- this.logger.debug('incoming protocol message received', {
178
- id: event.stanzaId,
179
- from: event.chatJid,
180
- protocolType
181
- });
218
+ finally {
219
+ this.leaveIncomingHandler();
220
+ }
182
221
  }
183
222
  async handleIncomingAppStateSyncKeyShare(event, protocolMessage) {
184
223
  const share = protocolMessage.appStateSyncKeyShare;
@@ -197,16 +236,6 @@ class WaClient extends node_events_1.EventEmitter {
197
236
  imported
198
237
  });
199
238
  if (imported > 0) {
200
- const hadWaiters = this.keyShareCoordinator.hasWaiters();
201
- this.keyShareCoordinator.notifyReceived();
202
- if (hadWaiters) {
203
- this.logger.debug('app-state key share imported and waiters released', {
204
- id: event.stanzaId,
205
- from: event.chatJid,
206
- imported
207
- });
208
- return;
209
- }
210
239
  void this.syncAppState().catch((error) => {
211
240
  this.logger.warn('failed to sync app-state after key share import', {
212
241
  id: event.stanzaId,
@@ -267,9 +296,18 @@ class WaClient extends node_events_1.EventEmitter {
267
296
  });
268
297
  return;
269
298
  }
270
- const requestedKeys = await Promise.all(requestedKeyIds.map((keyId) => this.appStateStore.getSyncKey(keyId)));
271
- const availableKeys = requestedKeys.filter((key) => key !== null);
272
- const missingKeyIds = requestedKeyIds.filter((_, index) => requestedKeys[index] === null);
299
+ const requestedKeys = await this.appStateStore.getSyncKeysBatch(requestedKeyIds);
300
+ const availableKeys = [];
301
+ const missingKeyIds = [];
302
+ for (let i = 0; i < requestedKeys.length; i += 1) {
303
+ const key = requestedKeys[i];
304
+ if (key !== null) {
305
+ availableKeys.push(key);
306
+ }
307
+ else {
308
+ missingKeyIds.push(requestedKeyIds[i]);
309
+ }
310
+ }
273
311
  try {
274
312
  await this.messageDispatch.sendAppStateSyncKeyShare(requesterDeviceJid, availableKeys, missingKeyIds);
275
313
  this.logger.info('responded to app-state key request', {
@@ -296,7 +334,7 @@ class WaClient extends node_events_1.EventEmitter {
296
334
  for (const key of request.keyIds ?? []) {
297
335
  try {
298
336
  const keyId = (0, bytes_1.decodeProtoBytes)(key.keyId, 'appStateSyncKeyRequest.keyIds[].keyId');
299
- const keyHex = (0, bytes_2.bytesToHex)(keyId);
337
+ const keyHex = (0, bytes_1.bytesToHex)(keyId);
300
338
  if (deduped.has(keyHex)) {
301
339
  continue;
302
340
  }
@@ -316,18 +354,18 @@ class WaClient extends node_events_1.EventEmitter {
316
354
  return false;
317
355
  }
318
356
  const candidateUser = (0, jid_1.toUserJid)(candidateJid);
319
- const meUsers = [credentials.meJid, credentials.meLid]
320
- .filter((value) => !!value)
321
- .map((jid) => (0, jid_1.toUserJid)(jid));
322
- return meUsers.includes(candidateUser);
357
+ return ((!!credentials.meJid && (0, jid_1.toUserJid)(credentials.meJid) === candidateUser) ||
358
+ (!!credentials.meLid && (0, jid_1.toUserJid)(credentials.meLid) === candidateUser));
323
359
  }
324
360
  async handleHistorySyncNotification(notification) {
325
361
  try {
326
362
  await (0, history_sync_1.processHistorySyncNotification)({
327
- ...this.getMailboxPersistenceDeps(),
363
+ logger: this.logger,
328
364
  mediaTransfer: this.mediaTransfer,
329
- threadStore: this.threadStore,
330
- emitEvent: this.emit.bind(this)
365
+ writeBehind: this.writeBehind,
366
+ emitEvent: this.emit.bind(this),
367
+ onPrivacyTokens: (conversations) => this.trustedContactToken.hydrateFromHistorySync(conversations),
368
+ onNctSalt: (salt) => this.trustedContactToken.hydrateNctSaltFromHistorySync(salt)
331
369
  }, notification);
332
370
  }
333
371
  catch (error) {
@@ -338,8 +376,8 @@ class WaClient extends node_events_1.EventEmitter {
338
376
  });
339
377
  }
340
378
  }
341
- async queryWithContext(context, node, timeoutMs = this.options.iqTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, contextData = {}) {
342
- return (0, query_1.queryWithContext)(async (queryNode, queryTimeoutMs) => this.query(queryNode, queryTimeoutMs), this.logger, context, node, timeoutMs, contextData);
379
+ async queryWithContext(context, node, timeoutMs = this.options.iqTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, contextData = {}, options = {}) {
380
+ return (0, query_1.queryWithContext)(async (queryNode, queryTimeoutMs) => this.query(queryNode, queryTimeoutMs, options), this.logger, context, node, timeoutMs, contextData);
343
381
  }
344
382
  async handleIncomingFrame(frame) {
345
383
  try {
@@ -354,10 +392,17 @@ class WaClient extends node_events_1.EventEmitter {
354
392
  this.logger.trace('wa client connect already in-flight');
355
393
  return this.connectPromise;
356
394
  }
395
+ this.acceptingIncomingEvents = true;
357
396
  this.connectPromise = this.connectionManager
358
397
  .connect((frame) => this.handleIncomingFrame(frame))
359
398
  .then(() => {
360
- this.emit('connection_open', {});
399
+ this.emit('connection', {
400
+ status: 'open',
401
+ reason: 'connected',
402
+ code: null,
403
+ isLogout: false,
404
+ isNewLogin: this.connectionManager.wasNewLogin()
405
+ });
361
406
  })
362
407
  .finally(() => {
363
408
  this.connectPromise = null;
@@ -365,16 +410,28 @@ class WaClient extends node_events_1.EventEmitter {
365
410
  return this.connectPromise;
366
411
  }
367
412
  async disconnect() {
368
- this.keyShareCoordinator.notifyDisconnected();
413
+ await this.pauseIncomingEventsAndWaitDrain();
414
+ const writeBehindFlush = await this.writeBehind.flush(this.options.writeBehind?.flushTimeoutMs);
415
+ if (writeBehindFlush.remaining > 0) {
416
+ this.logger.warn('disconnect continuing with pending write-behind entries', {
417
+ remaining: writeBehindFlush.remaining
418
+ });
419
+ }
369
420
  await this.connectionManager.disconnect();
370
- this.emit('connection_close', {});
421
+ this.emit('connection', {
422
+ status: 'close',
423
+ reason: 'client_disconnected',
424
+ code: null,
425
+ isLogout: false,
426
+ isNewLogin: false
427
+ });
371
428
  }
372
- async requestPairingCode(phoneNumber, shouldShowPushNotification = false) {
429
+ async requestPairingCode(phoneNumber, shouldShowPushNotification = false, customCode) {
373
430
  if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
374
431
  throw new Error('client is not connected');
375
432
  }
376
433
  this.logger.debug('wa client request pairing code');
377
- return this.authClient.requestPairingCode(phoneNumber, shouldShowPushNotification);
434
+ return this.authClient.requestPairingCode(phoneNumber, shouldShowPushNotification, customCode);
378
435
  }
379
436
  async fetchPairingCountryCodeIso() {
380
437
  if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
@@ -387,7 +444,10 @@ class WaClient extends node_events_1.EventEmitter {
387
444
  if (!this.connectionManager.isConnected() || !this.authClient.getCurrentCredentials()) {
388
445
  throw new Error('client is not connected');
389
446
  }
390
- const normalizedPhoneJids = phoneNumbers.map(jid_1.parsePhoneJid);
447
+ const normalizedPhoneJids = new Array(phoneNumbers.length);
448
+ for (let index = 0; index < phoneNumbers.length; index += 1) {
449
+ normalizedPhoneJids[index] = (0, jid_1.parsePhoneJid)(phoneNumbers[index]);
450
+ }
391
451
  this.logger.trace('wa client query lids by phone numbers', {
392
452
  phones: normalizedPhoneJids.length
393
453
  });
@@ -396,41 +456,54 @@ class WaClient extends node_events_1.EventEmitter {
396
456
  sendMessage(to, content, options = {}) {
397
457
  return this.messageDispatch.sendMessage(to, content, options);
398
458
  }
399
- syncSignalSession(jid, reasonIdentity = false) {
400
- return this.messageDispatch.syncSignalSession(jid, reasonIdentity);
401
- }
402
- sendReceipt(input) {
403
- return this.messageDispatch.sendReceipt(input);
404
- }
405
- setChatMute(chatJid, muted, muteEndTimestampMs) {
406
- return this.appStateMutations.setChatMute(chatJid, muted, muteEndTimestampMs);
459
+ async syncSignalSession(jid, reasonIdentity = false) {
460
+ await this.messageDispatch.syncSignalSession(jid, reasonIdentity);
461
+ if (reasonIdentity) {
462
+ this.trustedContactToken.reissueOnIdentityChange(jid).catch((err) => this.logger.warn('tc token reissue on identity change failed', {
463
+ jid,
464
+ message: (0, primitives_1.toError)(err).message
465
+ }));
466
+ }
407
467
  }
408
- setChatRead(chatJid, read) {
409
- return this.appStateMutations.setChatRead(chatJid, read);
468
+ get chat() {
469
+ return this.chatCoordinator;
410
470
  }
411
- setChatPin(chatJid, pinned) {
412
- return this.appStateMutations.setChatPin(chatJid, pinned);
471
+ get group() {
472
+ return this.groupCoordinator;
413
473
  }
414
- setChatArchive(chatJid, archived) {
415
- return this.appStateMutations.setChatArchive(chatJid, archived);
474
+ get privacy() {
475
+ return this.privacyCoordinator;
416
476
  }
417
- clearChat(chatJid, options = {}) {
418
- return this.appStateMutations.clearChat(chatJid, options);
477
+ get profile() {
478
+ return this.profileCoordinator;
419
479
  }
420
- deleteChat(chatJid, options = {}) {
421
- return this.appStateMutations.deleteChat(chatJid, options);
480
+ get business() {
481
+ return this.businessCoordinator;
422
482
  }
423
- setChatLock(chatJid, locked) {
424
- return this.appStateMutations.setChatLock(chatJid, locked);
483
+ get email() {
484
+ return this.emailCoordinator;
425
485
  }
426
- setMessageStar(message, starred) {
427
- return this.appStateMutations.setMessageStar(message, starred);
486
+ async logout(reason = stream_1.WA_LOGOUT_REASONS.USER_INITIATED) {
487
+ const meJid = this.authClient.getCurrentCredentials()?.meJid;
488
+ if (!meJid) {
489
+ throw new Error('cannot logout: client is not authenticated');
490
+ }
491
+ const deviceJid = (0, jid_1.normalizeDeviceJid)(meJid);
492
+ const node = (0, device_1.buildRemoveCompanionDeviceIq)(deviceJid, reason);
493
+ const result = await this.queryWithContext('client.logout', node, undefined, {
494
+ jid: deviceJid,
495
+ reason
496
+ });
497
+ (0, query_1.assertIqResult)(result, 'client.logout');
428
498
  }
429
- deleteMessageForMe(message, options = {}) {
430
- return this.appStateMutations.deleteMessageForMe(message, options);
499
+ sendReceipt(input) {
500
+ return this.messageDispatch.sendReceipt(input);
431
501
  }
432
502
  flushAppStateMutations() {
433
- return this.appStateMutations.flushMutations();
503
+ return this.chatCoordinator.flushMutations();
504
+ }
505
+ flushWriteBehind(timeoutMs) {
506
+ return this.writeBehind.flush(timeoutMs);
434
507
  }
435
508
  async exportAppState() {
436
509
  return this.appStateSync.exportState();
@@ -439,60 +512,11 @@ class WaClient extends node_events_1.EventEmitter {
439
512
  if (!this.connectionManager.isConnected()) {
440
513
  throw new Error('client is not connected');
441
514
  }
442
- const shouldWaitForKeyShare = (await this.appStateStore.getActiveSyncKey()) === null;
443
- if (shouldWaitForKeyShare && !this.keyShareCoordinator.isBootstrapDone()) {
444
- this.keyShareCoordinator.markBootstrapDone();
445
- this.logger.info('app-state bootstrap pre-sync waiting for key share', {
446
- timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS
447
- });
448
- const received = await this.keyShareCoordinator.waitForShare(WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS);
449
- if (received) {
450
- this.logger.info('app-state bootstrap pre-sync received key share, continuing sync');
451
- }
452
- else {
453
- this.logger.warn('app-state bootstrap pre-sync key share wait timed out, continuing sync', {
454
- timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS
455
- });
456
- }
457
- }
458
- let syncResult = await this.executeAppStateSync(options);
459
- let blockedCollections = this.getBlockedAppStateCollections(syncResult);
460
- if (!shouldWaitForKeyShare || blockedCollections.length === 0) {
461
- this.emitChatEventsFromAppStateSyncResult(syncResult);
462
- return syncResult;
463
- }
464
- let retryCount = 0;
465
- let observedKeyShareVersion = this.keyShareCoordinator.getVersion();
466
- while (blockedCollections.length > 0 && retryCount < WA_APP_STATE_KEY_SHARE_MAX_RETRIES) {
467
- const hasFreshShare = this.keyShareCoordinator.getVersion() !== observedKeyShareVersion;
468
- if (!hasFreshShare) {
469
- this.logger.info('app-state bootstrap waiting for key share', {
470
- blockedCollections: blockedCollections.join(','),
471
- timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS,
472
- retryCount: retryCount + 1
473
- });
474
- const received = await this.keyShareCoordinator.waitForShare(WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS);
475
- if (!received) {
476
- this.logger.warn('app-state bootstrap key share wait timed out', {
477
- blockedCollections: blockedCollections.join(','),
478
- timeoutMs: WA_APP_STATE_KEY_SHARE_WAIT_TIMEOUT_MS
479
- });
480
- break;
481
- }
482
- }
483
- observedKeyShareVersion = this.keyShareCoordinator.getVersion();
484
- retryCount += 1;
485
- this.logger.info('app-state bootstrap retrying sync after key share', {
486
- retryCount,
487
- blockedCollections: blockedCollections.join(',')
488
- });
489
- syncResult = await this.executeAppStateSync(options);
490
- blockedCollections = this.getBlockedAppStateCollections(syncResult);
491
- }
515
+ const syncResult = await this.executeAppStateSync(options);
516
+ const blockedCollections = this.getBlockedAppStateCollections(syncResult);
492
517
  if (blockedCollections.length > 0) {
493
- this.logger.warn('app-state bootstrap still blocked after waiting for key share', {
494
- blockedCollections: blockedCollections.join(','),
495
- retries: retryCount
518
+ this.logger.warn('app-state sync has blocked collections', {
519
+ blockedCollections: blockedCollections.join(',')
496
520
  });
497
521
  }
498
522
  this.emitChatEventsFromAppStateSyncResult(syncResult);
@@ -507,9 +531,13 @@ class WaClient extends node_events_1.EventEmitter {
507
531
  });
508
532
  }
509
533
  getBlockedAppStateCollections(syncResult) {
510
- return syncResult.collections
511
- .filter((entry) => entry.state === constants_1.WA_APP_STATE_COLLECTION_STATES.BLOCKED)
512
- .map((entry) => entry.collection);
534
+ const blocked = [];
535
+ for (const entry of syncResult.collections) {
536
+ if (entry.state === constants_1.WA_APP_STATE_COLLECTION_STATES.BLOCKED) {
537
+ blocked.push(entry.collection);
538
+ }
539
+ }
540
+ return blocked;
513
541
  }
514
542
  emitChatEventsFromAppStateSyncResult(syncResult) {
515
543
  const shouldEmitSnapshotMutations = this.options.chatEvents?.emitSnapshotMutations === true;
@@ -533,6 +561,7 @@ class WaClient extends node_events_1.EventEmitter {
533
561
  continue;
534
562
  }
535
563
  try {
564
+ this.handleNctSaltMutation(mutation);
536
565
  const event = (0, chat_1.parseChatEventFromAppStateMutation)(mutation);
537
566
  if (!event) {
538
567
  continue;
@@ -550,23 +579,158 @@ class WaClient extends node_events_1.EventEmitter {
550
579
  }
551
580
  }
552
581
  }
582
+ handleNctSaltMutation(mutation) {
583
+ const nctAction = mutation.value?.nctSaltSyncAction;
584
+ if (!nctAction) {
585
+ return;
586
+ }
587
+ if (mutation.operation === 'set' && nctAction.salt) {
588
+ this.trustedContactToken.handleNctSaltSync(nctAction.salt).catch((err) => this.logger.warn('nct salt sync set failed', {
589
+ message: (0, primitives_1.toError)(err).message
590
+ }));
591
+ }
592
+ else if (mutation.operation === 'remove') {
593
+ this.trustedContactToken.handleNctSaltSync(null).catch((err) => this.logger.warn('nct salt sync remove failed', {
594
+ message: (0, primitives_1.toError)(err).message
595
+ }));
596
+ }
597
+ }
553
598
  async clearStoredState() {
599
+ await this.pauseIncomingEventsAndWaitDrain();
600
+ const writeBehindDestroy = await this.writeBehind.destroy(this.options.writeBehind?.flushTimeoutMs);
601
+ if (writeBehindDestroy.remaining > 0) {
602
+ throw new Error(`clear stored state aborted: write-behind did not fully drain (remaining=${writeBehindDestroy.remaining})`);
603
+ }
554
604
  const danglingReceipts = this.receiptQueue.take();
555
605
  if (danglingReceipts.length > 0) {
556
606
  this.logger.debug('cleared dangling receipts while clearing stored state', {
557
607
  count: danglingReceipts.length
558
608
  });
559
609
  }
560
- await this.authClient.clearStoredCredentials();
561
- await this.appStateStore.clear();
562
- await this.contactStore.clear();
563
- await this.messageStore.clear();
564
- await this.participantsStore.clear();
565
- await this.deviceListStore.clear();
566
- await this.retryStore.clear();
567
- await this.signalStore.clear();
568
- await this.senderKeyStore.clear();
569
- await this.threadStore.clear();
610
+ const s = this.options.logoutStoreClear;
611
+ const shouldClear = (key) => s === undefined || s[key] !== false;
612
+ if (shouldClear('auth'))
613
+ await this.authClient.clearStoredCredentials();
614
+ if (shouldClear('appState'))
615
+ await this.appStateStore.clear();
616
+ if (shouldClear('contacts'))
617
+ await this.contactStore.clear();
618
+ if (shouldClear('messages'))
619
+ await this.messageStore.clear();
620
+ if (shouldClear('messageSecret'))
621
+ await this.messageSecretStore.clear();
622
+ if (shouldClear('participants'))
623
+ await this.participantsStore.clear();
624
+ if (shouldClear('deviceList'))
625
+ await this.deviceListStore.clear();
626
+ if (shouldClear('retry'))
627
+ await this.retryStore.clear();
628
+ if (shouldClear('signal'))
629
+ await this.signalStore.clear();
630
+ if (shouldClear('preKey'))
631
+ await this.preKeyStore.clear();
632
+ if (shouldClear('session'))
633
+ await this.sessionStore.clear();
634
+ if (shouldClear('identity'))
635
+ await this.identityStore.clear();
636
+ if (shouldClear('senderKey'))
637
+ await this.senderKeyStore.clear();
638
+ if (shouldClear('threads'))
639
+ await this.threadStore.clear();
640
+ if (shouldClear('privacyToken'))
641
+ await this.privacyTokenStore.clear();
642
+ }
643
+ async tryDecryptAddon(event) {
644
+ const message = event.message;
645
+ if (!message)
646
+ return;
647
+ const addon = (0, addon_crypto_1.identifyEncryptedAddon)(message);
648
+ if (!addon)
649
+ return;
650
+ const targetMessageId = addon.targetMessageKey.id;
651
+ if (!targetMessageId)
652
+ return;
653
+ const parentEntry = await (0, addon_crypto_1.resolveParentMessageSecret)(targetMessageId, this.messageSecretStore, this.messageStore);
654
+ if (!parentEntry) {
655
+ this.logger.debug('addon parent message secret not found', {
656
+ id: event.stanzaId,
657
+ targetId: targetMessageId
658
+ });
659
+ return;
660
+ }
661
+ const parentMsgOriginalSender = parentEntry.senderJid;
662
+ const modificationSender = event.senderJid ?? '';
663
+ const plaintext = await (0, addon_crypto_1.decryptAddonPayload)({
664
+ messageSecret: parentEntry.secret,
665
+ stanzaId: targetMessageId,
666
+ parentMsgOriginalSender,
667
+ modificationSender,
668
+ modificationType: addon.modificationType,
669
+ ciphertext: addon.encPayload,
670
+ iv: addon.encIv,
671
+ additionalData: (0, addon_crypto_1.shouldUseAddonAdditionalData)(addon.modificationType)
672
+ ? (0, addon_crypto_1.buildAddonAdditionalData)(targetMessageId, modificationSender)
673
+ : undefined
674
+ });
675
+ let decrypted = (0, addon_crypto_1.decodeAddonPlaintext)(addon.kind, plaintext);
676
+ if (decrypted.kind === 'poll_vote' && decrypted.pollVote.selectedOptions) {
677
+ const names = await (0, addon_crypto_1.resolvePollOptionNames)(decrypted.pollVote.selectedOptions, targetMessageId, this.messageStore);
678
+ if (names) {
679
+ decrypted = { ...decrypted, selectedOptionNames: names };
680
+ }
681
+ }
682
+ const addonEvent = {
683
+ rawNode: event.rawNode,
684
+ stanzaId: event.stanzaId,
685
+ chatJid: event.chatJid,
686
+ stanzaType: event.stanzaType,
687
+ kind: addon.kind,
688
+ targetMessageId,
689
+ senderJid: modificationSender,
690
+ decrypted,
691
+ raw: message
692
+ };
693
+ this.emit('message_addon', addonEvent);
694
+ }
695
+ tryEnterIncomingHandler() {
696
+ if (!this.acceptingIncomingEvents) {
697
+ return false;
698
+ }
699
+ this.activeIncomingHandlers += 1;
700
+ if (this.acceptingIncomingEvents) {
701
+ return true;
702
+ }
703
+ this.leaveIncomingHandler();
704
+ return false;
705
+ }
706
+ leaveIncomingHandler() {
707
+ if (this.activeIncomingHandlers <= 0) {
708
+ return;
709
+ }
710
+ this.activeIncomingHandlers -= 1;
711
+ if (this.activeIncomingHandlers === 0) {
712
+ this.notifyIncomingHandlersDrained();
713
+ }
714
+ }
715
+ async pauseIncomingEventsAndWaitDrain() {
716
+ this.acceptingIncomingEvents = false;
717
+ if (this.activeIncomingHandlers === 0) {
718
+ return;
719
+ }
720
+ await new Promise((resolve) => {
721
+ this.incomingHandlersDrainedWaiters[this.incomingHandlersDrainedWaiters.length] =
722
+ resolve;
723
+ });
724
+ }
725
+ notifyIncomingHandlersDrained() {
726
+ if (this.incomingHandlersDrainedWaiters.length === 0) {
727
+ return;
728
+ }
729
+ const waitersLength = this.incomingHandlersDrainedWaiters.length;
730
+ for (let index = 0; index < waitersLength; index += 1) {
731
+ this.incomingHandlersDrainedWaiters[index]();
732
+ }
733
+ this.incomingHandlersDrainedWaiters.length = 0;
570
734
  }
571
735
  handleError(error) {
572
736
  this.logger.error('wa client error', { message: error.message });