zapo-js 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -31,6 +31,16 @@ export class WaPassiveTasksCoordinator {
31
31
  this.passiveTasksPromise = null;
32
32
  });
33
33
  }
34
+ async handlePreKeyLowNotification() {
35
+ await Promise.all([
36
+ this.signalStore.setServerHasPreKeys(false),
37
+ this.runtime.persistServerHasPreKeys(false)
38
+ ]);
39
+ await this.uploadPreKeysIfMissing(false);
40
+ }
41
+ async handleDigestNotification() {
42
+ await this.validateDigestAndRecoverPreKeys();
43
+ }
34
44
  resetInFlightState() {
35
45
  if (!this.passiveTasksPromise) {
36
46
  return;
@@ -44,14 +54,18 @@ export class WaPassiveTasksCoordinator {
44
54
  this.logger.trace('passive connect tasks skipped: session is not registered');
45
55
  return;
46
56
  }
47
- await this.uploadPreKeysIfMissing();
48
- await this.validateDigestAndRecoverPreKeys();
49
- await this.rotateSignedPreKeyIfDue();
57
+ const signalMeta = await this.signalStore.getSignalMeta();
58
+ const prefetchedLocalKeyBundle = this.resolveLocalKeyBundle(signalMeta);
59
+ await this.uploadPreKeysIfMissing(signalMeta.serverHasPreKeys, prefetchedLocalKeyBundle);
60
+ await this.validateDigestAndRecoverPreKeys(prefetchedLocalKeyBundle);
61
+ await this.rotateSignedPreKeyIfDue(signalMeta.signedPreKeyRotationTs);
50
62
  await this.flushDanglingReceipts();
51
63
  }
52
- async validateDigestAndRecoverPreKeys() {
64
+ async validateDigestAndRecoverPreKeys(prefetchedLocalKeyBundle) {
53
65
  try {
54
- const validation = await this.signalDigestSync.validateLocalKeyBundle();
66
+ const validation = prefetchedLocalKeyBundle
67
+ ? await this.signalDigestSync.validateLocalKeyBundle(prefetchedLocalKeyBundle)
68
+ : await this.signalDigestSync.validateLocalKeyBundle();
55
69
  if (validation.valid) {
56
70
  this.logger.debug('signal digest validated', {
57
71
  preKeyCount: validation.preKeyCount
@@ -70,7 +84,7 @@ export class WaPassiveTasksCoordinator {
70
84
  this.signalStore.setServerHasPreKeys(false),
71
85
  this.runtime.persistServerHasPreKeys(false)
72
86
  ]);
73
- await this.uploadPreKeysIfMissing();
87
+ await this.uploadPreKeysIfMissing(false, prefetchedLocalKeyBundle);
74
88
  }
75
89
  catch (error) {
76
90
  this.logger.warn('signal digest validation failed with exception', {
@@ -78,20 +92,18 @@ export class WaPassiveTasksCoordinator {
78
92
  });
79
93
  }
80
94
  }
81
- async uploadPreKeysIfMissing() {
82
- const serverHasPreKeys = await this.signalStore.getServerHasPreKeys();
95
+ async uploadPreKeysIfMissing(serverHasPreKeysHint, prefetchedLocalKeyBundle) {
96
+ const serverHasPreKeys = serverHasPreKeysHint ?? (await this.signalStore.getServerHasPreKeys());
83
97
  if (serverHasPreKeys) {
84
98
  this.logger.trace('prekey upload skipped: server already has prekeys');
85
99
  return;
86
100
  }
87
- const [registrationInfo, signedPreKey] = await Promise.all([
88
- this.signalStore.getRegistrationInfo(),
89
- this.signalStore.getSignedPreKey()
90
- ]);
91
- if (!registrationInfo || !signedPreKey) {
101
+ const resolvedLocalKeyBundle = prefetchedLocalKeyBundle ?? (await this.resolveLocalKeyBundleFromStore());
102
+ if (!resolvedLocalKeyBundle) {
92
103
  this.logger.warn('prekey upload skipped: registration info is missing');
93
104
  return;
94
105
  }
106
+ const { registrationInfo, signedPreKey } = resolvedLocalKeyBundle;
95
107
  const preKeys = await this.signalStore.getOrGenPreKeys(SIGNAL_UPLOAD_PREKEYS_COUNT, generatePreKeyPair);
96
108
  if (preKeys.length === 0) {
97
109
  throw new Error('no prekey available for upload');
@@ -103,6 +115,7 @@ export class WaPassiveTasksCoordinator {
103
115
  lastPreKeyId
104
116
  });
105
117
  if (response.attrs.type === 'result') {
118
+ // Mark uploaded key first so the serverHasPreKeys flag never commits ahead of local key progress.
106
119
  await this.signalStore.markKeyAsUploaded(lastPreKeyId);
107
120
  await Promise.all([
108
121
  this.signalStore.setServerHasPreKeys(true),
@@ -121,10 +134,12 @@ export class WaPassiveTasksCoordinator {
121
134
  errorText: failure.errorText
122
135
  });
123
136
  }
124
- async rotateSignedPreKeyIfDue() {
137
+ async rotateSignedPreKeyIfDue(signedPreKeyRotationTsHint) {
125
138
  try {
126
139
  const nowMs = Date.now();
127
- const lastRotationTs = await this.signalStore.getSignedPreKeyRotationTs();
140
+ const lastRotationTs = signedPreKeyRotationTsHint === undefined
141
+ ? await this.signalStore.getSignedPreKeyRotationTs()
142
+ : signedPreKeyRotationTsHint;
128
143
  if (lastRotationTs === null) {
129
144
  await this.signalStore.setSignedPreKeyRotationTs(nowMs);
130
145
  this.logger.trace('signal rotate key skipped on first run');
@@ -150,6 +165,19 @@ export class WaPassiveTasksCoordinator {
150
165
  });
151
166
  }
152
167
  }
168
+ resolveLocalKeyBundle(signalMeta) {
169
+ const { registrationInfo, signedPreKey } = signalMeta;
170
+ if (!registrationInfo || !signedPreKey) {
171
+ return null;
172
+ }
173
+ return {
174
+ registrationInfo,
175
+ signedPreKey
176
+ };
177
+ }
178
+ async resolveLocalKeyBundleFromStore() {
179
+ return this.resolveLocalKeyBundle(await this.signalStore.getSignalMeta());
180
+ }
153
181
  resolveRotationTimestamp(nowMs, errorCode) {
154
182
  if (errorCode !== undefined && errorCode >= 500) {
155
183
  const retryInMs = Math.min(this.signedPreKeyServerErrorBackoffMs, this.signedPreKeyRotationIntervalMs);
@@ -167,29 +195,44 @@ export class WaPassiveTasksCoordinator {
167
195
  return;
168
196
  }
169
197
  this.logger.info('flushing dangling receipts', { count: pending.length });
170
- for (let index = 0; index < pending.length; index += 1) {
171
- const node = pending[index];
172
- try {
173
- await this.runtime.sendNodeDirect(node);
198
+ let cursor = 0;
199
+ while (cursor < pending.length) {
200
+ const batchEnd = Math.min(cursor + 4, pending.length);
201
+ const promises = [];
202
+ for (let i = cursor; i < batchEnd; i += 1) {
203
+ promises.push(this.runtime.sendNodeDirect(pending[i]));
174
204
  }
175
- catch (error) {
176
- const normalized = toError(error);
205
+ const results = await Promise.allSettled(promises);
206
+ let transientCount = 0;
207
+ for (let i = 0; i < results.length; i += 1) {
208
+ const result = results[i];
209
+ if (result.status === 'fulfilled') {
210
+ continue;
211
+ }
212
+ const node = pending[cursor + i];
213
+ const normalized = toError(result.reason);
177
214
  if (this.runtime.shouldQueueDanglingReceipt(node, normalized)) {
178
- for (let restoreIndex = index; restoreIndex < pending.length; restoreIndex += 1) {
179
- this.runtime.requeueDanglingReceipt(pending[restoreIndex]);
180
- }
181
- this.logger.warn('stopped dangling receipt flush due transient send error', {
182
- remaining: pending.length - index,
215
+ this.runtime.requeueDanglingReceipt(node);
216
+ transientCount += 1;
217
+ }
218
+ else {
219
+ this.logger.warn('dropping dangling receipt due non-retryable send error', {
220
+ id: node.attrs.id,
221
+ to: node.attrs.to,
183
222
  message: normalized.message
184
223
  });
185
- return;
186
224
  }
187
- this.logger.warn('dropping dangling receipt due non-retryable send error', {
188
- id: node.attrs.id,
189
- to: node.attrs.to,
190
- message: normalized.message
225
+ }
226
+ if (transientCount > 0) {
227
+ for (let i = batchEnd; i < pending.length; i += 1) {
228
+ this.runtime.requeueDanglingReceipt(pending[i]);
229
+ }
230
+ this.logger.warn('stopped dangling receipt flush due transient send error', {
231
+ remaining: transientCount + (pending.length - batchEnd)
191
232
  });
233
+ return;
192
234
  }
235
+ cursor = batchEnd;
193
236
  }
194
237
  this.logger.info('dangling receipts flushed');
195
238
  }
@@ -0,0 +1,131 @@
1
+ import { WA_PRIVACY_CATEGORY_TO_SETTING, WA_PRIVACY_SETTING_TO_CATEGORY, WA_PRIVACY_TAGS, WA_PRIVACY_VALUES } from '../../protocol/privacy.js';
2
+ import { buildBlocklistChangeIq, buildGetBlocklistIq, buildGetPrivacyDisallowedListIq, buildGetPrivacySettingsIq, buildSetPrivacyCategoryIq } from '../../transport/node/builders/privacy.js';
3
+ import { findNodeChild, getNodeChildren, getNodeChildrenByTag } from '../../transport/node/helpers.js';
4
+ import { assertIqResult } from '../../transport/node/query.js';
5
+ const IGNORED_SERVER_CATEGORIES = new Set([
6
+ 'pix',
7
+ 'linked_profiles',
8
+ 'stickers',
9
+ 'dependentaccountmessages',
10
+ 'cover_photo',
11
+ 'dependent_account_calling',
12
+ 'groupcreation'
13
+ ]);
14
+ function isValidPrivacyValue(value) {
15
+ return (value !== WA_PRIVACY_VALUES.ERROR &&
16
+ Object.values(WA_PRIVACY_VALUES).includes(value));
17
+ }
18
+ function parsePrivacySettings(result) {
19
+ const privacyNode = findNodeChild(result, 'privacy');
20
+ if (!privacyNode) {
21
+ return {};
22
+ }
23
+ const settings = {};
24
+ const categories = getNodeChildrenByTag(privacyNode, WA_PRIVACY_TAGS.CATEGORY);
25
+ for (let i = 0; i < categories.length; i += 1) {
26
+ const node = categories[i];
27
+ const name = node.attrs.name;
28
+ const value = node.attrs.value;
29
+ if (!name || !value) {
30
+ continue;
31
+ }
32
+ if (IGNORED_SERVER_CATEGORIES.has(name)) {
33
+ continue;
34
+ }
35
+ if (!isValidPrivacyValue(value)) {
36
+ continue;
37
+ }
38
+ const settingName = WA_PRIVACY_CATEGORY_TO_SETTING[name];
39
+ if (settingName) {
40
+ settings[settingName] = value;
41
+ }
42
+ }
43
+ return settings;
44
+ }
45
+ function parseDisallowedList(result) {
46
+ const privacyNode = findNodeChild(result, 'privacy');
47
+ if (!privacyNode) {
48
+ return { jids: [] };
49
+ }
50
+ const listNode = findNodeChild(privacyNode, WA_PRIVACY_TAGS.LIST);
51
+ if (!listNode) {
52
+ return { jids: [] };
53
+ }
54
+ const dhash = listNode.attrs.dhash;
55
+ const userNodes = getNodeChildrenByTag(listNode, WA_PRIVACY_TAGS.USER);
56
+ const jids = new Array(userNodes.length);
57
+ let jidsCount = 0;
58
+ for (let i = 0; i < userNodes.length; i += 1) {
59
+ const jid = userNodes[i].attrs.jid;
60
+ if (jid) {
61
+ jids[jidsCount] = jid;
62
+ jidsCount += 1;
63
+ }
64
+ }
65
+ jids.length = jidsCount;
66
+ return { jids, dhash };
67
+ }
68
+ function parseBlocklist(result) {
69
+ const listNode = findNodeChild(result, 'list');
70
+ if (!listNode) {
71
+ return { jids: [] };
72
+ }
73
+ const dhash = listNode.attrs.dhash;
74
+ const itemNodes = getNodeChildren(listNode);
75
+ const jids = new Array(itemNodes.length);
76
+ let jidsCount = 0;
77
+ for (let i = 0; i < itemNodes.length; i += 1) {
78
+ const jid = itemNodes[i].attrs.jid;
79
+ if (jid) {
80
+ jids[jidsCount] = jid;
81
+ jidsCount += 1;
82
+ }
83
+ }
84
+ jids.length = jidsCount;
85
+ return { jids, dhash };
86
+ }
87
+ export function createPrivacyCoordinator(options) {
88
+ const { queryWithContext } = options;
89
+ return {
90
+ getPrivacySettings: async () => {
91
+ const node = buildGetPrivacySettingsIq();
92
+ const result = await queryWithContext('privacy.getSettings', node);
93
+ assertIqResult(result, 'privacy.getSettings');
94
+ return parsePrivacySettings(result);
95
+ },
96
+ setPrivacySetting: async (setting, value) => {
97
+ const category = WA_PRIVACY_SETTING_TO_CATEGORY[setting];
98
+ const node = buildSetPrivacyCategoryIq(category, value);
99
+ const result = await queryWithContext('privacy.setSetting', node, undefined, {
100
+ category,
101
+ value
102
+ });
103
+ assertIqResult(result, 'privacy.setSetting');
104
+ },
105
+ getDisallowedList: async (setting) => {
106
+ const category = WA_PRIVACY_SETTING_TO_CATEGORY[setting];
107
+ const node = buildGetPrivacyDisallowedListIq(category);
108
+ const result = await queryWithContext('privacy.getDisallowedList', node, undefined, {
109
+ category
110
+ });
111
+ assertIqResult(result, 'privacy.getDisallowedList');
112
+ return parseDisallowedList(result);
113
+ },
114
+ getBlocklist: async () => {
115
+ const node = buildGetBlocklistIq();
116
+ const result = await queryWithContext('privacy.getBlocklist', node);
117
+ assertIqResult(result, 'privacy.getBlocklist');
118
+ return parseBlocklist(result);
119
+ },
120
+ blockUser: async (jid) => {
121
+ const node = buildBlocklistChangeIq(jid, 'block');
122
+ const result = await queryWithContext('privacy.blockUser', node, undefined, { jid });
123
+ assertIqResult(result, 'privacy.blockUser');
124
+ },
125
+ unblockUser: async (jid) => {
126
+ const node = buildBlocklistChangeIq(jid, 'unblock');
127
+ const result = await queryWithContext('privacy.unblockUser', node, undefined, { jid });
128
+ assertIqResult(result, 'privacy.unblockUser');
129
+ }
130
+ };
131
+ }
@@ -0,0 +1,209 @@
1
+ import { buildDeleteProfilePictureIq, buildGetDisappearingModeUsyncQueryNode, buildGetProfilePictureIq, buildGetStatusUsyncQueryNodes, buildSetProfilePictureIq, buildSetStatusIq } from '../../transport/node/builders/profile.js';
2
+ import { buildUsyncIq } from '../../transport/node/builders/usync.js';
3
+ import { findNodeChild, getNodeChildren } from '../../transport/node/helpers.js';
4
+ import { assertIqResult } from '../../transport/node/query.js';
5
+ import { TEXT_DECODER } from '../../util/bytes.js';
6
+ function parseProfilePicture(result) {
7
+ const pictureNode = findNodeChild(result, 'picture');
8
+ if (!pictureNode) {
9
+ return {};
10
+ }
11
+ return {
12
+ url: pictureNode.attrs.url,
13
+ directPath: pictureNode.attrs.direct_path,
14
+ id: pictureNode.attrs.id,
15
+ type: pictureNode.attrs.type
16
+ };
17
+ }
18
+ function parseSetPictureResult(result) {
19
+ const pictureNode = findNodeChild(result, 'picture');
20
+ return pictureNode?.attrs.id ?? null;
21
+ }
22
+ function parseUsyncProfiles(result) {
23
+ const usyncNode = findNodeChild(result, 'usync');
24
+ if (!usyncNode) {
25
+ return [];
26
+ }
27
+ const listNode = findNodeChild(usyncNode, 'list');
28
+ if (!listNode) {
29
+ return [];
30
+ }
31
+ const userNodes = getNodeChildren(listNode);
32
+ const profiles = new Array(userNodes.length);
33
+ let count = 0;
34
+ for (let i = 0; i < userNodes.length; i += 1) {
35
+ const userNode = userNodes[i];
36
+ if (userNode.tag !== 'user') {
37
+ continue;
38
+ }
39
+ const jid = userNode.attrs.jid;
40
+ if (!jid) {
41
+ continue;
42
+ }
43
+ const info = { jid };
44
+ const userContent = userNode.content;
45
+ if (!Array.isArray(userContent)) {
46
+ profiles[count] = info;
47
+ count += 1;
48
+ continue;
49
+ }
50
+ for (let j = 0; j < userContent.length; j += 1) {
51
+ const child = userContent[j];
52
+ if (child.tag === 'picture') {
53
+ const idAttr = child.attrs.id;
54
+ if (idAttr) {
55
+ const parsed = Number.parseInt(idAttr, 10);
56
+ if (Number.isSafeInteger(parsed)) {
57
+ info.pictureId = parsed;
58
+ }
59
+ }
60
+ }
61
+ else if (child.tag === 'status') {
62
+ const code = child.attrs.code;
63
+ if (code !== undefined && Number.parseInt(code, 10) === 401) {
64
+ info.status = '';
65
+ }
66
+ else {
67
+ const content = child.content;
68
+ if (content instanceof Uint8Array) {
69
+ const decoded = TEXT_DECODER.decode(content);
70
+ info.status = decoded.length > 0 ? decoded : null;
71
+ }
72
+ else if (typeof content === 'string') {
73
+ info.status = content.length > 0 ? content : null;
74
+ }
75
+ else {
76
+ info.status = null;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ profiles[count] = info;
82
+ count += 1;
83
+ }
84
+ profiles.length = count;
85
+ return profiles;
86
+ }
87
+ function parseUsyncDisappearingModes(result) {
88
+ const usyncNode = findNodeChild(result, 'usync');
89
+ if (!usyncNode)
90
+ return [];
91
+ const listNode = findNodeChild(usyncNode, 'list');
92
+ if (!listNode)
93
+ return [];
94
+ const userNodes = getNodeChildren(listNode);
95
+ const results = new Array(userNodes.length);
96
+ let count = 0;
97
+ for (let i = 0; i < userNodes.length; i += 1) {
98
+ const userNode = userNodes[i];
99
+ if (userNode.tag !== 'user')
100
+ continue;
101
+ const userContent = userNode.content;
102
+ if (!Array.isArray(userContent))
103
+ continue;
104
+ for (let j = 0; j < userContent.length; j += 1) {
105
+ const child = userContent[j];
106
+ if (child.tag !== 'disappearing_mode')
107
+ continue;
108
+ const errorNode = findNodeChild(child, 'error');
109
+ if (errorNode)
110
+ continue;
111
+ const duration = Number.parseInt(child.attrs.duration ?? '0', 10);
112
+ const timestamp = Number.parseInt(child.attrs.t ?? '0', 10);
113
+ const entry = { duration, timestamp };
114
+ if (child.attrs.ephemerality_disabled === 'true') {
115
+ entry.ephemeralityDisabled = true;
116
+ }
117
+ results[count] = entry;
118
+ count += 1;
119
+ }
120
+ }
121
+ results.length = count;
122
+ return results;
123
+ }
124
+ function parseUsyncStatus(result) {
125
+ const profiles = parseUsyncProfiles(result);
126
+ if (profiles.length === 0) {
127
+ return { status: null };
128
+ }
129
+ return { status: profiles[0].status ?? null };
130
+ }
131
+ export function createProfileCoordinator(options) {
132
+ const { queryWithContext, generateSid } = options;
133
+ return {
134
+ getProfilePicture: async (jid, type, existingId) => {
135
+ const node = buildGetProfilePictureIq(jid, type, existingId);
136
+ const result = await queryWithContext('profile.getPicture', node, undefined, {
137
+ jid,
138
+ type: type ?? 'preview'
139
+ });
140
+ assertIqResult(result, 'profile.getPicture');
141
+ return parseProfilePicture(result);
142
+ },
143
+ setProfilePicture: async (imageBytes, targetJid) => {
144
+ const node = buildSetProfilePictureIq(imageBytes, targetJid);
145
+ const result = await queryWithContext('profile.setPicture', node, undefined, {
146
+ targetJid,
147
+ size: imageBytes.length
148
+ });
149
+ assertIqResult(result, 'profile.setPicture');
150
+ return parseSetPictureResult(result);
151
+ },
152
+ deleteProfilePicture: async (targetJid) => {
153
+ const node = buildDeleteProfilePictureIq(targetJid);
154
+ const result = await queryWithContext('profile.deletePicture', node, undefined, {
155
+ targetJid
156
+ });
157
+ assertIqResult(result, 'profile.deletePicture');
158
+ },
159
+ getStatus: async (jid) => {
160
+ const sid = await generateSid();
161
+ const queryNodes = buildGetStatusUsyncQueryNodes();
162
+ const usyncNode = buildUsyncIq({
163
+ sid,
164
+ queryProtocolNodes: [queryNodes[1]],
165
+ users: [{ jid }]
166
+ });
167
+ const result = await queryWithContext('profile.getStatus', usyncNode, undefined, {
168
+ jid
169
+ });
170
+ assertIqResult(result, 'profile.getStatus');
171
+ return parseUsyncStatus(result);
172
+ },
173
+ setStatus: async (text) => {
174
+ const node = buildSetStatusIq(text);
175
+ const result = await queryWithContext('profile.setStatus', node);
176
+ assertIqResult(result, 'profile.setStatus');
177
+ },
178
+ getProfiles: async (jids) => {
179
+ if (jids.length === 0) {
180
+ return [];
181
+ }
182
+ const sid = await generateSid();
183
+ const queryProtocolNodes = buildGetStatusUsyncQueryNodes();
184
+ const usyncNode = buildUsyncIq({
185
+ sid,
186
+ queryProtocolNodes,
187
+ users: jids.map((jid) => ({ jid }))
188
+ });
189
+ const result = await queryWithContext('profile.getProfiles', usyncNode, undefined, {
190
+ count: jids.length
191
+ });
192
+ assertIqResult(result, 'profile.getProfiles');
193
+ return parseUsyncProfiles(result);
194
+ },
195
+ getDisappearingMode: async (jids) => {
196
+ if (jids.length === 0)
197
+ return [];
198
+ const sid = await generateSid();
199
+ const usyncNode = buildUsyncIq({
200
+ sid,
201
+ queryProtocolNodes: [buildGetDisappearingModeUsyncQueryNode()],
202
+ users: jids.map((jid) => ({ jid }))
203
+ });
204
+ const result = await queryWithContext('profile.getDisappearingMode', usyncNode, undefined, { count: jids.length });
205
+ assertIqResult(result, 'profile.getDisappearingMode');
206
+ return parseUsyncDisappearingModes(result);
207
+ }
208
+ };
209
+ }