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
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaOfflineResumeCoordinator = void 0;
4
+ const offline_1 = require("../../transport/node/builders/offline");
5
+ const primitives_1 = require("../../util/primitives");
6
+ const WA_OFFLINE_RESUME = Object.freeze({
7
+ BATCH_SIZE: 200,
8
+ STANZA_TIMEOUT_MS: 60000
9
+ });
10
+ const WA_OFFLINE_RESUME_STATE = Object.freeze({
11
+ INIT: 'init',
12
+ RESUMING: 'resuming',
13
+ COMPLETE: 'complete'
14
+ });
15
+ class WaOfflineResumeCoordinator {
16
+ constructor(options) {
17
+ this.logger = options.logger;
18
+ this.runtime = options.runtime;
19
+ this.state = WA_OFFLINE_RESUME_STATE.INIT;
20
+ this.totalStanzas = 0;
21
+ this.pendingStanzas = 0;
22
+ this.stanzaTimeout = null;
23
+ }
24
+ get isComplete() {
25
+ return this.state === WA_OFFLINE_RESUME_STATE.COMPLETE;
26
+ }
27
+ get isResuming() {
28
+ return this.state === WA_OFFLINE_RESUME_STATE.RESUMING;
29
+ }
30
+ handleOfflinePreview(stanzaCount) {
31
+ this.clearTimers();
32
+ this.state = WA_OFFLINE_RESUME_STATE.RESUMING;
33
+ this.totalStanzas = stanzaCount;
34
+ this.pendingStanzas = stanzaCount;
35
+ this.logger.info('offline resume started', {
36
+ totalStanzas: stanzaCount
37
+ });
38
+ this.runtime.emitOfflineResume({
39
+ status: 'resuming',
40
+ totalStanzas: stanzaCount,
41
+ remainingStanzas: stanzaCount,
42
+ forced: false
43
+ });
44
+ void this.sendOfflineBatch();
45
+ this.resetStanzaTimeout();
46
+ }
47
+ handleOfflineComplete(serverStanzaCount) {
48
+ if (this.state !== WA_OFFLINE_RESUME_STATE.RESUMING) {
49
+ return;
50
+ }
51
+ this.completeResume(false, serverStanzaCount);
52
+ }
53
+ trackOfflineStanza() {
54
+ if (this.state !== WA_OFFLINE_RESUME_STATE.RESUMING) {
55
+ return;
56
+ }
57
+ this.pendingStanzas = Math.max(0, this.pendingStanzas - 1);
58
+ this.resetStanzaTimeout();
59
+ }
60
+ reset() {
61
+ this.clearTimers();
62
+ this.state = WA_OFFLINE_RESUME_STATE.INIT;
63
+ this.totalStanzas = 0;
64
+ this.pendingStanzas = 0;
65
+ }
66
+ completeResume(forced, serverStanzaCount) {
67
+ this.clearTimers();
68
+ this.state = WA_OFFLINE_RESUME_STATE.COMPLETE;
69
+ this.logger.info('offline resume complete', {
70
+ totalStanzas: this.totalStanzas,
71
+ remainingStanzas: this.pendingStanzas,
72
+ serverStanzaCount,
73
+ forced
74
+ });
75
+ this.runtime.emitOfflineResume({
76
+ status: 'complete',
77
+ totalStanzas: this.totalStanzas,
78
+ remainingStanzas: this.pendingStanzas,
79
+ forced
80
+ });
81
+ }
82
+ async sendOfflineBatch() {
83
+ try {
84
+ await this.runtime.sendNode((0, offline_1.buildOfflineBatchNode)(WA_OFFLINE_RESUME.BATCH_SIZE));
85
+ }
86
+ catch (err) {
87
+ this.logger.warn('offline batch request failed', {
88
+ message: (0, primitives_1.toError)(err).message
89
+ });
90
+ }
91
+ }
92
+ resetStanzaTimeout() {
93
+ if (this.stanzaTimeout !== null) {
94
+ clearTimeout(this.stanzaTimeout);
95
+ }
96
+ this.stanzaTimeout = setTimeout(() => {
97
+ this.stanzaTimeout = null;
98
+ if (this.state === WA_OFFLINE_RESUME_STATE.RESUMING) {
99
+ this.logger.warn('offline resume forced complete due to stanza timeout', {
100
+ totalStanzas: this.totalStanzas,
101
+ remainingStanzas: this.pendingStanzas
102
+ });
103
+ this.completeResume(true);
104
+ }
105
+ }, WA_OFFLINE_RESUME.STANZA_TIMEOUT_MS);
106
+ }
107
+ clearTimers() {
108
+ if (this.stanzaTimeout !== null) {
109
+ clearTimeout(this.stanzaTimeout);
110
+ this.stanzaTimeout = null;
111
+ }
112
+ }
113
+ }
114
+ exports.WaOfflineResumeCoordinator = WaOfflineResumeCoordinator;
@@ -10,6 +10,7 @@ class WaPassiveTasksCoordinator {
10
10
  constructor(options) {
11
11
  this.logger = options.logger;
12
12
  this.signalStore = options.signalStore;
13
+ this.preKeyStore = options.preKeyStore;
13
14
  this.signalDigestSync = options.signalDigestSync;
14
15
  this.signalRotateKey = options.signalRotateKey;
15
16
  this.signedPreKeyRotationIntervalMs =
@@ -17,6 +18,8 @@ class WaPassiveTasksCoordinator {
17
18
  this.signedPreKeyServerErrorBackoffMs =
18
19
  options.signedPreKeyServerErrorBackoffMs ?? constants_2.SIGNAL_SIGNED_PREKEY_SERVER_ERROR_BACKOFF_MS;
19
20
  this.runtime = options.runtime;
21
+ this.mobilePrimary = options.mobilePrimary ?? false;
22
+ this.appStateSync = options.appStateSync;
20
23
  this.passiveTasksPromise = null;
21
24
  }
22
25
  startPassiveTasksAfterConnect() {
@@ -34,6 +37,16 @@ class WaPassiveTasksCoordinator {
34
37
  this.passiveTasksPromise = null;
35
38
  });
36
39
  }
40
+ async handlePreKeyLowNotification() {
41
+ await Promise.all([
42
+ this.preKeyStore.setServerHasPreKeys(false),
43
+ this.runtime.persistServerHasPreKeys(false)
44
+ ]);
45
+ await this.uploadPreKeysIfMissing(false);
46
+ }
47
+ async handleDigestNotification() {
48
+ await this.validateDigestAndRecoverPreKeys();
49
+ }
37
50
  resetInFlightState() {
38
51
  if (!this.passiveTasksPromise) {
39
52
  return;
@@ -47,14 +60,36 @@ class WaPassiveTasksCoordinator {
47
60
  this.logger.trace('passive connect tasks skipped: session is not registered');
48
61
  return;
49
62
  }
50
- await this.uploadPreKeysIfMissing();
51
- await this.validateDigestAndRecoverPreKeys();
52
- await this.rotateSignedPreKeyIfDue();
63
+ this.runtime.syncAbProps();
64
+ if (this.mobilePrimary && this.appStateSync) {
65
+ await this.appStateSync.ensureInitialSyncKey().catch((error) => {
66
+ this.logger.warn('app-state initial key generation failed', {
67
+ message: (0, primitives_1.toError)(error).message
68
+ });
69
+ });
70
+ }
71
+ await this.runtime.sendPresenceAvailable().catch((error) => {
72
+ this.logger.warn('presence available send failed', {
73
+ message: (0, primitives_1.toError)(error).message
74
+ });
75
+ });
76
+ const [registrationInfo, signedPreKey, serverHasPreKeys, signedPreKeyRotationTs] = await Promise.all([
77
+ this.signalStore.getRegistrationInfo(),
78
+ this.signalStore.getSignedPreKey(),
79
+ this.preKeyStore.getServerHasPreKeys(),
80
+ this.signalStore.getSignedPreKeyRotationTs()
81
+ ]);
82
+ const prefetchedLocalKeyBundle = registrationInfo && signedPreKey ? { registrationInfo, signedPreKey } : null;
83
+ await this.uploadPreKeysIfMissing(serverHasPreKeys, prefetchedLocalKeyBundle);
84
+ await this.validateDigestAndRecoverPreKeys(prefetchedLocalKeyBundle);
85
+ await this.rotateSignedPreKeyIfDue(signedPreKeyRotationTs);
53
86
  await this.flushDanglingReceipts();
54
87
  }
55
- async validateDigestAndRecoverPreKeys() {
88
+ async validateDigestAndRecoverPreKeys(prefetchedLocalKeyBundle) {
56
89
  try {
57
- const validation = await this.signalDigestSync.validateLocalKeyBundle();
90
+ const validation = prefetchedLocalKeyBundle
91
+ ? await this.signalDigestSync.validateLocalKeyBundle(prefetchedLocalKeyBundle)
92
+ : await this.signalDigestSync.validateLocalKeyBundle();
58
93
  if (validation.valid) {
59
94
  this.logger.debug('signal digest validated', {
60
95
  preKeyCount: validation.preKeyCount
@@ -70,10 +105,10 @@ class WaPassiveTasksCoordinator {
70
105
  return;
71
106
  }
72
107
  await Promise.all([
73
- this.signalStore.setServerHasPreKeys(false),
108
+ this.preKeyStore.setServerHasPreKeys(false),
74
109
  this.runtime.persistServerHasPreKeys(false)
75
110
  ]);
76
- await this.uploadPreKeysIfMissing();
111
+ await this.uploadPreKeysIfMissing(false, prefetchedLocalKeyBundle);
77
112
  }
78
113
  catch (error) {
79
114
  this.logger.warn('signal digest validation failed with exception', {
@@ -81,21 +116,19 @@ class WaPassiveTasksCoordinator {
81
116
  });
82
117
  }
83
118
  }
84
- async uploadPreKeysIfMissing() {
85
- const serverHasPreKeys = await this.signalStore.getServerHasPreKeys();
119
+ async uploadPreKeysIfMissing(serverHasPreKeysHint, prefetchedLocalKeyBundle) {
120
+ const serverHasPreKeys = serverHasPreKeysHint ?? (await this.preKeyStore.getServerHasPreKeys());
86
121
  if (serverHasPreKeys) {
87
122
  this.logger.trace('prekey upload skipped: server already has prekeys');
88
123
  return;
89
124
  }
90
- const [registrationInfo, signedPreKey] = await Promise.all([
91
- this.signalStore.getRegistrationInfo(),
92
- this.signalStore.getSignedPreKey()
93
- ]);
94
- if (!registrationInfo || !signedPreKey) {
125
+ const resolvedLocalKeyBundle = prefetchedLocalKeyBundle ?? (await this.resolveLocalKeyBundleFromStore());
126
+ if (!resolvedLocalKeyBundle) {
95
127
  this.logger.warn('prekey upload skipped: registration info is missing');
96
128
  return;
97
129
  }
98
- const preKeys = await this.signalStore.getOrGenPreKeys(constants_2.SIGNAL_UPLOAD_PREKEYS_COUNT, keygen_1.generatePreKeyPair);
130
+ const { registrationInfo, signedPreKey } = resolvedLocalKeyBundle;
131
+ const preKeys = await this.preKeyStore.getOrGenPreKeys(constants_2.SIGNAL_UPLOAD_PREKEYS_COUNT, keygen_1.generatePreKeyPair);
99
132
  if (preKeys.length === 0) {
100
133
  throw new Error('no prekey available for upload');
101
134
  }
@@ -104,11 +137,12 @@ class WaPassiveTasksCoordinator {
104
137
  const response = await this.runtime.queryWithContext('prekeys.upload', uploadNode, constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, {
105
138
  count: preKeys.length,
106
139
  lastPreKeyId
107
- });
140
+ }, this.mobilePrimary ? { useSystemId: true } : undefined);
108
141
  if (response.attrs.type === 'result') {
109
- await this.signalStore.markKeyAsUploaded(lastPreKeyId);
142
+ // Mark uploaded key first so the serverHasPreKeys flag never commits ahead of local key progress.
143
+ await this.preKeyStore.markKeyAsUploaded(lastPreKeyId);
110
144
  await Promise.all([
111
- this.signalStore.setServerHasPreKeys(true),
145
+ this.preKeyStore.setServerHasPreKeys(true),
112
146
  this.runtime.persistServerHasPreKeys(true)
113
147
  ]);
114
148
  this.logger.info('uploaded prekeys to server', {
@@ -124,10 +158,12 @@ class WaPassiveTasksCoordinator {
124
158
  errorText: failure.errorText
125
159
  });
126
160
  }
127
- async rotateSignedPreKeyIfDue() {
161
+ async rotateSignedPreKeyIfDue(signedPreKeyRotationTsHint) {
128
162
  try {
129
163
  const nowMs = Date.now();
130
- const lastRotationTs = await this.signalStore.getSignedPreKeyRotationTs();
164
+ const lastRotationTs = signedPreKeyRotationTsHint === undefined
165
+ ? await this.signalStore.getSignedPreKeyRotationTs()
166
+ : signedPreKeyRotationTsHint;
131
167
  if (lastRotationTs === null) {
132
168
  await this.signalStore.setSignedPreKeyRotationTs(nowMs);
133
169
  this.logger.trace('signal rotate key skipped on first run');
@@ -153,6 +189,16 @@ class WaPassiveTasksCoordinator {
153
189
  });
154
190
  }
155
191
  }
192
+ async resolveLocalKeyBundleFromStore() {
193
+ const [registrationInfo, signedPreKey] = await Promise.all([
194
+ this.signalStore.getRegistrationInfo(),
195
+ this.signalStore.getSignedPreKey()
196
+ ]);
197
+ if (!registrationInfo || !signedPreKey) {
198
+ return null;
199
+ }
200
+ return { registrationInfo, signedPreKey };
201
+ }
156
202
  resolveRotationTimestamp(nowMs, errorCode) {
157
203
  if (errorCode !== undefined && errorCode >= 500) {
158
204
  const retryInMs = Math.min(this.signedPreKeyServerErrorBackoffMs, this.signedPreKeyRotationIntervalMs);
@@ -170,29 +216,44 @@ class WaPassiveTasksCoordinator {
170
216
  return;
171
217
  }
172
218
  this.logger.info('flushing dangling receipts', { count: pending.length });
173
- for (let index = 0; index < pending.length; index += 1) {
174
- const node = pending[index];
175
- try {
176
- await this.runtime.sendNodeDirect(node);
219
+ let cursor = 0;
220
+ while (cursor < pending.length) {
221
+ const batchEnd = Math.min(cursor + 4, pending.length);
222
+ const promises = [];
223
+ for (let i = cursor; i < batchEnd; i += 1) {
224
+ promises.push(this.runtime.sendNodeDirect(pending[i]));
177
225
  }
178
- catch (error) {
179
- const normalized = (0, primitives_1.toError)(error);
226
+ const results = await Promise.allSettled(promises);
227
+ let transientCount = 0;
228
+ for (let i = 0; i < results.length; i += 1) {
229
+ const result = results[i];
230
+ if (result.status === 'fulfilled') {
231
+ continue;
232
+ }
233
+ const node = pending[cursor + i];
234
+ const normalized = (0, primitives_1.toError)(result.reason);
180
235
  if (this.runtime.shouldQueueDanglingReceipt(node, normalized)) {
181
- for (let restoreIndex = index; restoreIndex < pending.length; restoreIndex += 1) {
182
- this.runtime.requeueDanglingReceipt(pending[restoreIndex]);
183
- }
184
- this.logger.warn('stopped dangling receipt flush due transient send error', {
185
- remaining: pending.length - index,
236
+ this.runtime.requeueDanglingReceipt(node);
237
+ transientCount += 1;
238
+ }
239
+ else {
240
+ this.logger.warn('dropping dangling receipt due non-retryable send error', {
241
+ id: node.attrs.id,
242
+ to: node.attrs.to,
186
243
  message: normalized.message
187
244
  });
188
- return;
189
245
  }
190
- this.logger.warn('dropping dangling receipt due non-retryable send error', {
191
- id: node.attrs.id,
192
- to: node.attrs.to,
193
- message: normalized.message
246
+ }
247
+ if (transientCount > 0) {
248
+ for (let i = batchEnd; i < pending.length; i += 1) {
249
+ this.runtime.requeueDanglingReceipt(pending[i]);
250
+ }
251
+ this.logger.warn('stopped dangling receipt flush due transient send error', {
252
+ remaining: transientCount + (pending.length - batchEnd)
194
253
  });
254
+ return;
195
255
  }
256
+ cursor = batchEnd;
196
257
  }
197
258
  this.logger.info('dangling receipts flushed');
198
259
  }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPrivacyCoordinator = createPrivacyCoordinator;
4
+ const privacy_1 = require("../../protocol/privacy");
5
+ const privacy_2 = require("../../transport/node/builders/privacy");
6
+ const helpers_1 = require("../../transport/node/helpers");
7
+ const query_1 = require("../../transport/node/query");
8
+ const IGNORED_SERVER_CATEGORIES = new Set([
9
+ 'pix',
10
+ 'linked_profiles',
11
+ 'stickers',
12
+ 'dependentaccountmessages',
13
+ 'cover_photo',
14
+ 'dependent_account_calling',
15
+ 'groupcreation'
16
+ ]);
17
+ function isValidPrivacyValue(value) {
18
+ return (value !== privacy_1.WA_PRIVACY_VALUES.ERROR &&
19
+ Object.values(privacy_1.WA_PRIVACY_VALUES).includes(value));
20
+ }
21
+ function parsePrivacySettings(result) {
22
+ const privacyNode = (0, helpers_1.findNodeChild)(result, 'privacy');
23
+ if (!privacyNode) {
24
+ return {};
25
+ }
26
+ const settings = {};
27
+ const categories = (0, helpers_1.getNodeChildrenByTag)(privacyNode, privacy_1.WA_PRIVACY_TAGS.CATEGORY);
28
+ for (let i = 0; i < categories.length; i += 1) {
29
+ const node = categories[i];
30
+ const name = node.attrs.name;
31
+ const value = node.attrs.value;
32
+ if (!name || !value) {
33
+ continue;
34
+ }
35
+ if (IGNORED_SERVER_CATEGORIES.has(name)) {
36
+ continue;
37
+ }
38
+ if (!isValidPrivacyValue(value)) {
39
+ continue;
40
+ }
41
+ const settingName = privacy_1.WA_PRIVACY_CATEGORY_TO_SETTING[name];
42
+ if (settingName) {
43
+ settings[settingName] = value;
44
+ }
45
+ }
46
+ return settings;
47
+ }
48
+ function parseDisallowedList(result) {
49
+ const privacyNode = (0, helpers_1.findNodeChild)(result, 'privacy');
50
+ if (!privacyNode) {
51
+ return { jids: [] };
52
+ }
53
+ const listNode = (0, helpers_1.findNodeChild)(privacyNode, privacy_1.WA_PRIVACY_TAGS.LIST);
54
+ if (!listNode) {
55
+ return { jids: [] };
56
+ }
57
+ const dhash = listNode.attrs.dhash;
58
+ const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, privacy_1.WA_PRIVACY_TAGS.USER);
59
+ const jids = new Array(userNodes.length);
60
+ let jidsCount = 0;
61
+ for (let i = 0; i < userNodes.length; i += 1) {
62
+ const jid = userNodes[i].attrs.jid;
63
+ if (jid) {
64
+ jids[jidsCount] = jid;
65
+ jidsCount += 1;
66
+ }
67
+ }
68
+ jids.length = jidsCount;
69
+ return { jids, dhash };
70
+ }
71
+ function parseBlocklist(result) {
72
+ const listNode = (0, helpers_1.findNodeChild)(result, 'list');
73
+ if (!listNode) {
74
+ return { jids: [] };
75
+ }
76
+ const dhash = listNode.attrs.dhash;
77
+ const itemNodes = (0, helpers_1.getNodeChildren)(listNode);
78
+ const jids = new Array(itemNodes.length);
79
+ let jidsCount = 0;
80
+ for (let i = 0; i < itemNodes.length; i += 1) {
81
+ const jid = itemNodes[i].attrs.jid;
82
+ if (jid) {
83
+ jids[jidsCount] = jid;
84
+ jidsCount += 1;
85
+ }
86
+ }
87
+ jids.length = jidsCount;
88
+ return { jids, dhash };
89
+ }
90
+ function createPrivacyCoordinator(options) {
91
+ const { queryWithContext } = options;
92
+ return {
93
+ getPrivacySettings: async () => {
94
+ const node = (0, privacy_2.buildGetPrivacySettingsIq)();
95
+ const result = await queryWithContext('privacy.getSettings', node);
96
+ (0, query_1.assertIqResult)(result, 'privacy.getSettings');
97
+ return parsePrivacySettings(result);
98
+ },
99
+ setPrivacySetting: async (setting, value) => {
100
+ const category = privacy_1.WA_PRIVACY_SETTING_TO_CATEGORY[setting];
101
+ const node = (0, privacy_2.buildSetPrivacyCategoryIq)(category, value);
102
+ const result = await queryWithContext('privacy.setSetting', node, undefined, {
103
+ category,
104
+ value
105
+ });
106
+ (0, query_1.assertIqResult)(result, 'privacy.setSetting');
107
+ },
108
+ getDisallowedList: async (setting) => {
109
+ const category = privacy_1.WA_PRIVACY_SETTING_TO_CATEGORY[setting];
110
+ const node = (0, privacy_2.buildGetPrivacyDisallowedListIq)(category);
111
+ const result = await queryWithContext('privacy.getDisallowedList', node, undefined, {
112
+ category
113
+ });
114
+ (0, query_1.assertIqResult)(result, 'privacy.getDisallowedList');
115
+ return parseDisallowedList(result);
116
+ },
117
+ getBlocklist: async () => {
118
+ const node = (0, privacy_2.buildGetBlocklistIq)();
119
+ const result = await queryWithContext('privacy.getBlocklist', node);
120
+ (0, query_1.assertIqResult)(result, 'privacy.getBlocklist');
121
+ return parseBlocklist(result);
122
+ },
123
+ blockUser: async (jid) => {
124
+ const node = (0, privacy_2.buildBlocklistChangeIq)(jid, 'block');
125
+ const result = await queryWithContext('privacy.blockUser', node, undefined, { jid });
126
+ (0, query_1.assertIqResult)(result, 'privacy.blockUser');
127
+ },
128
+ unblockUser: async (jid) => {
129
+ const node = (0, privacy_2.buildBlocklistChangeIq)(jid, 'unblock');
130
+ const result = await queryWithContext('privacy.unblockUser', node, undefined, { jid });
131
+ (0, query_1.assertIqResult)(result, 'privacy.unblockUser');
132
+ }
133
+ };
134
+ }
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProfileCoordinator = createProfileCoordinator;
4
+ const profile_1 = require("../../transport/node/builders/profile");
5
+ const usync_1 = require("../../transport/node/builders/usync");
6
+ const helpers_1 = require("../../transport/node/helpers");
7
+ const query_1 = require("../../transport/node/query");
8
+ const bytes_1 = require("../../util/bytes");
9
+ function parseProfilePicture(result) {
10
+ const pictureNode = (0, helpers_1.findNodeChild)(result, 'picture');
11
+ if (!pictureNode) {
12
+ return {};
13
+ }
14
+ return {
15
+ url: pictureNode.attrs.url,
16
+ directPath: pictureNode.attrs.direct_path,
17
+ id: pictureNode.attrs.id,
18
+ type: pictureNode.attrs.type
19
+ };
20
+ }
21
+ function parseSetPictureResult(result) {
22
+ const pictureNode = (0, helpers_1.findNodeChild)(result, 'picture');
23
+ return pictureNode?.attrs.id ?? null;
24
+ }
25
+ function parseUsyncProfiles(result) {
26
+ const usyncNode = (0, helpers_1.findNodeChild)(result, 'usync');
27
+ if (!usyncNode) {
28
+ return [];
29
+ }
30
+ const listNode = (0, helpers_1.findNodeChild)(usyncNode, 'list');
31
+ if (!listNode) {
32
+ return [];
33
+ }
34
+ const userNodes = (0, helpers_1.getNodeChildren)(listNode);
35
+ const profiles = new Array(userNodes.length);
36
+ let count = 0;
37
+ for (let i = 0; i < userNodes.length; i += 1) {
38
+ const userNode = userNodes[i];
39
+ if (userNode.tag !== 'user') {
40
+ continue;
41
+ }
42
+ const jid = userNode.attrs.jid;
43
+ if (!jid) {
44
+ continue;
45
+ }
46
+ const info = { jid };
47
+ const userContent = userNode.content;
48
+ if (!Array.isArray(userContent)) {
49
+ profiles[count] = info;
50
+ count += 1;
51
+ continue;
52
+ }
53
+ for (let j = 0; j < userContent.length; j += 1) {
54
+ const child = userContent[j];
55
+ if (child.tag === 'picture') {
56
+ const idAttr = child.attrs.id;
57
+ if (idAttr) {
58
+ const parsed = Number.parseInt(idAttr, 10);
59
+ if (Number.isSafeInteger(parsed)) {
60
+ info.pictureId = parsed;
61
+ }
62
+ }
63
+ }
64
+ else if (child.tag === 'status') {
65
+ const code = child.attrs.code;
66
+ if (code !== undefined && Number.parseInt(code, 10) === 401) {
67
+ info.status = '';
68
+ }
69
+ else {
70
+ const content = child.content;
71
+ if (content instanceof Uint8Array) {
72
+ const decoded = bytes_1.TEXT_DECODER.decode(content);
73
+ info.status = decoded.length > 0 ? decoded : null;
74
+ }
75
+ else if (typeof content === 'string') {
76
+ info.status = content.length > 0 ? content : null;
77
+ }
78
+ else {
79
+ info.status = null;
80
+ }
81
+ }
82
+ }
83
+ }
84
+ profiles[count] = info;
85
+ count += 1;
86
+ }
87
+ profiles.length = count;
88
+ return profiles;
89
+ }
90
+ function parseUsyncDisappearingModes(result) {
91
+ const usyncNode = (0, helpers_1.findNodeChild)(result, 'usync');
92
+ if (!usyncNode)
93
+ return [];
94
+ const listNode = (0, helpers_1.findNodeChild)(usyncNode, 'list');
95
+ if (!listNode)
96
+ return [];
97
+ const userNodes = (0, helpers_1.getNodeChildren)(listNode);
98
+ const results = new Array(userNodes.length);
99
+ let count = 0;
100
+ for (let i = 0; i < userNodes.length; i += 1) {
101
+ const userNode = userNodes[i];
102
+ if (userNode.tag !== 'user')
103
+ continue;
104
+ const userContent = userNode.content;
105
+ if (!Array.isArray(userContent))
106
+ continue;
107
+ for (let j = 0; j < userContent.length; j += 1) {
108
+ const child = userContent[j];
109
+ if (child.tag !== 'disappearing_mode')
110
+ continue;
111
+ const errorNode = (0, helpers_1.findNodeChild)(child, 'error');
112
+ if (errorNode)
113
+ continue;
114
+ const duration = Number.parseInt(child.attrs.duration ?? '0', 10);
115
+ const timestamp = Number.parseInt(child.attrs.t ?? '0', 10);
116
+ const entry = { duration, timestamp };
117
+ if (child.attrs.ephemerality_disabled === 'true') {
118
+ entry.ephemeralityDisabled = true;
119
+ }
120
+ results[count] = entry;
121
+ count += 1;
122
+ }
123
+ }
124
+ results.length = count;
125
+ return results;
126
+ }
127
+ function parseUsyncStatus(result) {
128
+ const profiles = parseUsyncProfiles(result);
129
+ if (profiles.length === 0) {
130
+ return { status: null };
131
+ }
132
+ return { status: profiles[0].status ?? null };
133
+ }
134
+ function createProfileCoordinator(options) {
135
+ const { queryWithContext, generateSid } = options;
136
+ return {
137
+ getProfilePicture: async (jid, type, existingId) => {
138
+ const node = (0, profile_1.buildGetProfilePictureIq)(jid, type, existingId);
139
+ const result = await queryWithContext('profile.getPicture', node, undefined, {
140
+ jid,
141
+ type: type ?? 'preview'
142
+ });
143
+ (0, query_1.assertIqResult)(result, 'profile.getPicture');
144
+ return parseProfilePicture(result);
145
+ },
146
+ setProfilePicture: async (imageBytes, targetJid) => {
147
+ const node = (0, profile_1.buildSetProfilePictureIq)(imageBytes, targetJid);
148
+ const result = await queryWithContext('profile.setPicture', node, undefined, {
149
+ targetJid,
150
+ size: imageBytes.length
151
+ });
152
+ (0, query_1.assertIqResult)(result, 'profile.setPicture');
153
+ return parseSetPictureResult(result);
154
+ },
155
+ deleteProfilePicture: async (targetJid) => {
156
+ const node = (0, profile_1.buildDeleteProfilePictureIq)(targetJid);
157
+ const result = await queryWithContext('profile.deletePicture', node, undefined, {
158
+ targetJid
159
+ });
160
+ (0, query_1.assertIqResult)(result, 'profile.deletePicture');
161
+ },
162
+ getStatus: async (jid) => {
163
+ const sid = await generateSid();
164
+ const queryNodes = (0, profile_1.buildGetStatusUsyncQueryNodes)();
165
+ const usyncNode = (0, usync_1.buildUsyncIq)({
166
+ sid,
167
+ queryProtocolNodes: [queryNodes[1]],
168
+ users: [{ jid }]
169
+ });
170
+ const result = await queryWithContext('profile.getStatus', usyncNode, undefined, {
171
+ jid
172
+ });
173
+ (0, query_1.assertIqResult)(result, 'profile.getStatus');
174
+ return parseUsyncStatus(result);
175
+ },
176
+ setStatus: async (text) => {
177
+ const node = (0, profile_1.buildSetStatusIq)(text);
178
+ const result = await queryWithContext('profile.setStatus', node, undefined, undefined, {
179
+ useSystemId: true
180
+ });
181
+ (0, query_1.assertIqResult)(result, 'profile.setStatus');
182
+ },
183
+ getProfiles: async (jids) => {
184
+ if (jids.length === 0) {
185
+ return [];
186
+ }
187
+ const sid = await generateSid();
188
+ const queryProtocolNodes = (0, profile_1.buildGetStatusUsyncQueryNodes)();
189
+ const usyncNode = (0, usync_1.buildUsyncIq)({
190
+ sid,
191
+ queryProtocolNodes,
192
+ users: jids.map((jid) => ({ jid }))
193
+ });
194
+ const result = await queryWithContext('profile.getProfiles', usyncNode, undefined, {
195
+ count: jids.length
196
+ });
197
+ (0, query_1.assertIqResult)(result, 'profile.getProfiles');
198
+ return parseUsyncProfiles(result);
199
+ },
200
+ getDisappearingMode: async (jids) => {
201
+ if (jids.length === 0)
202
+ return [];
203
+ const sid = await generateSid();
204
+ const usyncNode = (0, usync_1.buildUsyncIq)({
205
+ sid,
206
+ queryProtocolNodes: [(0, profile_1.buildGetDisappearingModeUsyncQueryNode)()],
207
+ users: jids.map((jid) => ({ jid }))
208
+ });
209
+ const result = await queryWithContext('profile.getDisappearingMode', usyncNode, undefined, { count: jids.length });
210
+ (0, query_1.assertIqResult)(result, 'profile.getDisappearingMode');
211
+ return parseUsyncDisappearingModes(result);
212
+ }
213
+ };
214
+ }