zapo-js 0.2.0 → 1.0.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 (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaAppStateMutationCoordinator = void 0;
4
+ const utils_1 = require("../../appstate/utils");
5
+ const _appstate_spec_1 = require("../../appstate-spec.js");
6
+ const appstate_mutation_1 = require("../events/appstate-mutation");
7
+ const _proto_1 = require("../../proto.js");
4
8
  const constants_1 = require("../../protocol/constants");
5
9
  const jid_1 = require("../../protocol/jid");
6
10
  const coercion_1 = require("../../util/coercion");
@@ -10,18 +14,364 @@ const WA_APP_STATE_MUTATION_FLUSH_SUCCESS_STATES = new Set([
10
14
  constants_1.WA_APP_STATE_COLLECTION_STATES.SUCCESS_HAS_MORE
11
15
  ]);
12
16
  const WA_APP_STATE_ARCHIVE_RANGE_DEFAULT_LIMIT = 256;
17
+ function buildMutationIndexFromSchema(schema, indexArgs) {
18
+ const parts = new Array(schema.indexParts.length);
19
+ const args = indexArgs;
20
+ for (let i = 0; i < schema.indexParts.length; i += 1) {
21
+ const part = schema.indexParts[i];
22
+ if (part.type === 'literal') {
23
+ parts[i] = part.value;
24
+ continue;
25
+ }
26
+ const arg = args[part.name];
27
+ if (part.type === 'boolString') {
28
+ parts[i] = arg ? '1' : '0';
29
+ continue;
30
+ }
31
+ if (part.type === 'jidOrZero') {
32
+ if (arg === null || arg === undefined) {
33
+ const fromMeSlot = schema.indexParts.find((p) => p.type === 'boolString' && p.name === 'fromMe');
34
+ if (fromMeSlot && args['fromMe'] !== true) {
35
+ throw new Error(`app-state index arg "${part.name}" for schema "${schema.name}" requires a JID when fromMe is not true`);
36
+ }
37
+ parts[i] = '0';
38
+ continue;
39
+ }
40
+ parts[i] = arg;
41
+ continue;
42
+ }
43
+ if (part.type === 'enum') {
44
+ if (typeof arg === 'number') {
45
+ parts[i] = String(arg);
46
+ continue;
47
+ }
48
+ if (typeof arg !== 'string') {
49
+ throw new Error(`app-state enum index arg "${part.name}" for schema "${schema.name}" must be a string`);
50
+ }
51
+ const numeric = (0, _appstate_spec_1.encodeEnumValue)(part.protoEnum, arg);
52
+ if (numeric === null) {
53
+ throw new Error(`app-state enum index arg "${part.name}"="${arg}" is not in enum ${part.protoEnum}`);
54
+ }
55
+ parts[i] = String(numeric);
56
+ continue;
57
+ }
58
+ if (typeof arg !== 'string') {
59
+ throw new Error(`app-state index arg "${part.name}" for schema "${schema.name}" must be a string`);
60
+ }
61
+ parts[i] = arg;
62
+ }
63
+ return JSON.stringify(parts);
64
+ }
65
+ function buildSetMutationFromSchema(input) {
66
+ return {
67
+ collection: input.schema.collection,
68
+ operation: 'set',
69
+ index: buildMutationIndexFromSchema(input.schema, input.indexArgs),
70
+ value: { ...input.value, timestamp: input.timestamp },
71
+ version: input.schema.version,
72
+ timestamp: input.timestamp
73
+ };
74
+ }
75
+ function splitFlatInput(schema, input) {
76
+ const indexNames = new Set();
77
+ for (const part of schema.indexParts) {
78
+ if (part.type !== 'literal') {
79
+ indexNames.add(part.name);
80
+ }
81
+ }
82
+ const indexArgs = {};
83
+ const data = {};
84
+ for (const key of Object.keys(input)) {
85
+ if (key === 'schema')
86
+ continue;
87
+ if (indexNames.has(key)) {
88
+ indexArgs[key] = input[key];
89
+ }
90
+ else {
91
+ data[key] = input[key];
92
+ }
93
+ }
94
+ return { indexArgs, data };
95
+ }
96
+ function wrapData(schema, data) {
97
+ const encoded = applyEnumEncodeToData(schema.valueEnumFields, data);
98
+ const field = schema.valueField;
99
+ if (field === null) {
100
+ return encoded;
101
+ }
102
+ return { [field]: encoded };
103
+ }
104
+ function applyEnumEncodeToData(enumFields, data) {
105
+ if (!enumFields)
106
+ return { ...data };
107
+ const out = { ...data };
108
+ for (const [fieldPath, enumPath] of Object.entries(enumFields)) {
109
+ applyEnumAtPath(out, fieldPath.split('.'), (raw) => {
110
+ if (typeof raw === 'number')
111
+ return raw;
112
+ if (typeof raw !== 'string')
113
+ return raw;
114
+ const numeric = (0, _appstate_spec_1.encodeEnumValue)(enumPath, raw);
115
+ if (numeric === null) {
116
+ throw new Error(`enum value "${raw}" not in ${enumPath}`);
117
+ }
118
+ return numeric;
119
+ });
120
+ }
121
+ return out;
122
+ }
123
+ function applyEnumAtPath(obj, segments, transform) {
124
+ if (segments.length === 0)
125
+ return;
126
+ const [head, ...rest] = segments;
127
+ if (rest.length === 0) {
128
+ if (head in obj) {
129
+ const value = obj[head];
130
+ if (Array.isArray(value)) {
131
+ obj[head] = value.map(transform);
132
+ }
133
+ else if (value !== null && value !== undefined) {
134
+ obj[head] = transform(value);
135
+ }
136
+ }
137
+ return;
138
+ }
139
+ const next = obj[head];
140
+ if (Array.isArray(next)) {
141
+ const cloned = next.map((item) => {
142
+ if (item && typeof item === 'object') {
143
+ const itemCopy = { ...item };
144
+ applyEnumAtPath(itemCopy, rest, transform);
145
+ return itemCopy;
146
+ }
147
+ return item;
148
+ });
149
+ obj[head] = cloned;
150
+ return;
151
+ }
152
+ if (next && typeof next === 'object') {
153
+ const nextCopy = { ...next };
154
+ applyEnumAtPath(nextCopy, rest, transform);
155
+ obj[head] = nextCopy;
156
+ }
157
+ }
158
+ function buildRemoveMutationFromSchema(input) {
159
+ return {
160
+ collection: input.schema.collection,
161
+ operation: 'remove',
162
+ index: buildMutationIndexFromSchema(input.schema, input.indexArgs),
163
+ previousValue: { timestamp: input.timestamp },
164
+ version: input.schema.version,
165
+ timestamp: input.timestamp
166
+ };
167
+ }
168
+ /**
169
+ * Coordinates app-state mutations (mute/star/read/pin/archive/clear/delete/
170
+ * lock chats, status privacy, broadcast lists) and emits parsed mutation
171
+ * events on sync. Accessed via {@link WaClient.chat}.
172
+ */
13
173
  class WaAppStateMutationCoordinator {
14
174
  constructor(options) {
15
175
  this.logger = options.logger;
16
176
  this.messageStore = options.messageStore;
17
- this.syncAppState = options.syncAppState;
177
+ this.appStateSync = options.appStateSync;
178
+ this.mediaTransfer = options.mediaTransfer;
179
+ this.isConnected = options.isConnected;
180
+ this.serverClock = options.serverClock;
18
181
  this.archiveRangeLimit = (0, coercion_1.resolvePositive)(options.archiveRangeLimit, WA_APP_STATE_ARCHIVE_RANGE_DEFAULT_LIMIT, 'WaAppStateMutationCoordinatorOptions.archiveRangeLimit');
182
+ this.emitMutation = options.emitMutation;
183
+ this.emitSnapshotMutations = options.emitSnapshotMutations === true;
184
+ this.nctSaltSink = options.nctSaltSink;
185
+ this.contactSink = options.contactSink;
19
186
  this.pendingMutations = new Map();
20
187
  this.flushPromise = null;
21
188
  }
189
+ /**
190
+ * Runs an app-state sync round, optionally applying pending mutations.
191
+ * Throws when the client is not connected. Returns the per-collection
192
+ * result; blocked collections are logged.
193
+ */
194
+ async sync(options = {}) {
195
+ if (!this.isConnected()) {
196
+ throw new Error('client is not connected');
197
+ }
198
+ const syncOptions = options.downloadExternalBlob
199
+ ? options
200
+ : {
201
+ ...options,
202
+ downloadExternalBlob: async (_collection, _kind, reference) => (0, utils_1.downloadExternalBlobReference)(this.mediaTransfer, reference)
203
+ };
204
+ const syncResult = await this.appStateSync.sync(syncOptions);
205
+ const blockedCollections = this.getBlockedCollections(syncResult);
206
+ if (blockedCollections.length > 0) {
207
+ this.logger.warn('app-state sync has blocked collections', {
208
+ blockedCollections: blockedCollections.join(',')
209
+ });
210
+ }
211
+ this.emitEventsFromSyncResult(syncResult);
212
+ return syncResult;
213
+ }
214
+ /** Returns the names of collections reported as `BLOCKED` in `syncResult`. */
215
+ getBlockedCollections(syncResult) {
216
+ const blocked = [];
217
+ for (const entry of syncResult.collections) {
218
+ if (entry.state === constants_1.WA_APP_STATE_COLLECTION_STATES.BLOCKED) {
219
+ blocked.push(entry.collection);
220
+ }
221
+ }
222
+ return blocked;
223
+ }
224
+ /**
225
+ * Walks a sync result and emits one `app_state_mutation` event per
226
+ * distinct (collection, index) – only the last mutation per key wins.
227
+ * Snapshot-source mutations are skipped unless `emitSnapshotMutations`
228
+ * was enabled at construction.
229
+ */
230
+ emitEventsFromSyncResult(syncResult) {
231
+ for (const collectionResult of syncResult.collections) {
232
+ const mutations = collectionResult.mutations ?? [];
233
+ // Persistence sinks (contact store, ...): run on the last-wins
234
+ // mutation per key INCLUDING snapshot sources, so pair-time
235
+ // bootstrap of the address book always lands in the store even
236
+ // when public events are suppressed for snapshot mutations.
237
+ if (this.contactSink) {
238
+ const sinkLastIndex = new Map();
239
+ for (let i = 0; i < mutations.length; i += 1) {
240
+ const m = mutations[i];
241
+ sinkLastIndex.set(`${m.collection}\u0001${m.index}`, i);
242
+ }
243
+ for (let i = 0; i < mutations.length; i += 1) {
244
+ const m = mutations[i];
245
+ if (sinkLastIndex.get(`${m.collection}\u0001${m.index}`) !== i) {
246
+ continue;
247
+ }
248
+ try {
249
+ this.handleContactMutation(m);
250
+ }
251
+ catch (error) {
252
+ this.logger.debug('contact sink failed', {
253
+ collection: m.collection,
254
+ index: m.index,
255
+ message: (0, primitives_1.toError)(error).message
256
+ });
257
+ }
258
+ }
259
+ }
260
+ const lastMutationIndexByKey = new Map();
261
+ for (let mutationIndex = 0; mutationIndex < mutations.length; mutationIndex += 1) {
262
+ const mutation = mutations[mutationIndex];
263
+ if (!this.emitSnapshotMutations && mutation.source === 'snapshot') {
264
+ continue;
265
+ }
266
+ lastMutationIndexByKey.set(`${mutation.collection}\u0001${mutation.index}`, mutationIndex);
267
+ }
268
+ for (let mutationIndex = 0; mutationIndex < mutations.length; mutationIndex += 1) {
269
+ const mutation = mutations[mutationIndex];
270
+ if (!this.emitSnapshotMutations && mutation.source === 'snapshot') {
271
+ continue;
272
+ }
273
+ const coalesceKey = `${mutation.collection}\u0001${mutation.index}`;
274
+ if (lastMutationIndexByKey.get(coalesceKey) !== mutationIndex) {
275
+ continue;
276
+ }
277
+ try {
278
+ this.handleNctSaltMutation(mutation);
279
+ const event = (0, appstate_mutation_1.parseAppStateMutationEvent)(mutation);
280
+ if (!event) {
281
+ continue;
282
+ }
283
+ this.emitMutation?.(event);
284
+ }
285
+ catch (error) {
286
+ this.logger.debug('failed to parse app-state mutation event', {
287
+ collection: mutation.collection,
288
+ source: mutation.source,
289
+ index: mutation.index,
290
+ message: (0, primitives_1.toError)(error).message
291
+ });
292
+ }
293
+ }
294
+ }
295
+ }
296
+ handleNctSaltMutation(mutation) {
297
+ if (!this.nctSaltSink)
298
+ return;
299
+ const nctAction = mutation.value?.nctSaltSyncAction;
300
+ if (!nctAction) {
301
+ return;
302
+ }
303
+ if (mutation.operation === 'set' && nctAction.salt) {
304
+ this.nctSaltSink(nctAction.salt).catch((err) => this.logger.warn('nct salt sync set failed', {
305
+ message: (0, primitives_1.toError)(err).message
306
+ }));
307
+ }
308
+ else if (mutation.operation === 'remove') {
309
+ this.nctSaltSink(null).catch((err) => this.logger.warn('nct salt sync remove failed', {
310
+ message: (0, primitives_1.toError)(err).message
311
+ }));
312
+ }
313
+ }
314
+ handleContactMutation(mutation) {
315
+ if (!this.contactSink)
316
+ return;
317
+ // Cheap reject before JSON.parse: Contact mutations always carry
318
+ // the literal "contact" as their first index segment.
319
+ if (!mutation.index.includes('"contact"'))
320
+ return;
321
+ let parts;
322
+ try {
323
+ parts = JSON.parse(mutation.index);
324
+ }
325
+ catch {
326
+ return;
327
+ }
328
+ if (!Array.isArray(parts) || parts[0] !== 'contact' || typeof parts[1] !== 'string') {
329
+ return;
330
+ }
331
+ const indexJid = parts[1];
332
+ const lastUpdatedMs = mutation.timestamp > 0 ? mutation.timestamp : Date.now();
333
+ // Remove operations are a no-op for the contact store: `mergeContact`
334
+ // preserves prior displayName when incoming.displayName is undefined,
335
+ // and the row should stay around (the chat may still be open). The
336
+ // public mutation event still fires below so consumers can react.
337
+ if (mutation.operation === 'remove')
338
+ return;
339
+ const action = mutation.value?.contactAction;
340
+ if (!action)
341
+ return;
342
+ // Resolve canonical (LID-preferred) jid + cross-reference: the index
343
+ // typically carries the PN form, and `contactAction.lidJid` carries
344
+ // the LID counterpart. Store one row keyed by LID when both are known
345
+ // (mirrors what the contact store does for history-sync writes), with
346
+ // `phoneNumber` populated so PN-form lookups still resolve.
347
+ const lid = action.lidJid && (0, jid_1.isLidJid)(action.lidJid) ? action.lidJid : undefined;
348
+ const indexIsPn = (0, jid_1.isUserJid)(indexJid);
349
+ const indexIsLid = (0, jid_1.isLidJid)(indexJid);
350
+ const jid = lid ?? indexJid;
351
+ const phoneNumber = indexIsPn ? indexJid : undefined;
352
+ const lidField = lid ?? (indexIsLid ? indexJid : undefined);
353
+ const displayName = action.fullName || action.firstName || undefined;
354
+ this.contactSink({
355
+ jid,
356
+ displayName,
357
+ lid: lidField,
358
+ phoneNumber,
359
+ lastUpdatedMs
360
+ });
361
+ }
362
+ /**
363
+ * Mutes or unmutes a chat. `muteEndTimestampMs` is required when
364
+ * `muted` is `true` and must be a non-negative safe-integer epoch.
365
+ *
366
+ * For a "mute forever" entry, pass a very large epoch value (the
367
+ * official client uses year-9999 epochs). The mute end is the absolute
368
+ * timestamp when WhatsApp will re-enable notifications - the client
369
+ * does **not** unmute automatically when the timer expires (you'll see
370
+ * the chat un-muted on the phone, but no `mutation` event re-fires).
371
+ */
22
372
  async setChatMute(chatJid, muted, muteEndTimestampMs) {
23
373
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
24
- const timestamp = Date.now();
374
+ const timestamp = this.serverClock.nowMs();
25
375
  const normalizedMuteEnd = muteEndTimestampMs;
26
376
  if (normalizedMuteEnd !== undefined &&
27
377
  (!Number.isFinite(normalizedMuteEnd) ||
@@ -32,66 +382,63 @@ class WaAppStateMutationCoordinator {
32
382
  if (muted && normalizedMuteEnd === undefined) {
33
383
  throw new Error('setChatMute requires muteEndTimestampMs when muted is true');
34
384
  }
35
- const mutation = this.createSetMutation({
36
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.MUTE,
37
- chatIndexJid,
38
- value: {
39
- muteAction: {
40
- muted,
41
- ...(normalizedMuteEnd === undefined
42
- ? {}
43
- : { muteEndTimestamp: normalizedMuteEnd })
44
- }
45
- },
46
- timestamp
47
- });
48
- await this.enqueueAndFlush([mutation]);
385
+ await this.enqueueAndFlush([
386
+ buildSetMutationFromSchema({
387
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Mute,
388
+ indexArgs: { chatJid: chatIndexJid },
389
+ value: {
390
+ muteAction: {
391
+ muted,
392
+ ...(normalizedMuteEnd === undefined
393
+ ? {}
394
+ : { muteEndTimestamp: normalizedMuteEnd })
395
+ }
396
+ },
397
+ timestamp
398
+ })
399
+ ]);
49
400
  }
401
+ /** Stars or un-stars a specific message. */
50
402
  async setMessageStar(message, starred) {
51
403
  const messageIndex = this.buildMessageMutationIndex(message);
52
- const timestamp = Date.now();
53
- const mutation = this.createSetMutation({
54
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.STAR,
55
- chatIndexJid: messageIndex.chatIndexJid,
56
- value: {
57
- starAction: {
58
- starred
59
- }
60
- },
61
- timestamp,
62
- indexPartsTail: messageIndex.indexPartsTail
63
- });
64
- await this.enqueueAndFlush([mutation]);
404
+ const timestamp = this.serverClock.nowMs();
405
+ await this.enqueueAndFlush([
406
+ buildSetMutationFromSchema({
407
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Star,
408
+ indexArgs: messageIndex,
409
+ value: { starAction: { starred } },
410
+ timestamp
411
+ })
412
+ ]);
65
413
  }
414
+ /** Marks the chat as read or unread. */
66
415
  async setChatRead(chatJid, read) {
67
416
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
68
- const timestamp = Date.now();
417
+ const timestamp = this.serverClock.nowMs();
69
418
  const messageRange = await this.buildChatMessageRange(chatIndexJid);
70
- const mutation = this.createSetMutation({
71
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.MARK_CHAT_AS_READ,
72
- chatIndexJid,
73
- value: {
74
- markChatAsReadAction: {
75
- read,
76
- messageRange
77
- }
78
- },
79
- timestamp
80
- });
81
- await this.enqueueAndFlush([mutation]);
419
+ await this.enqueueAndFlush([
420
+ buildSetMutationFromSchema({
421
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.MarkChatAsRead,
422
+ indexArgs: { chatJid: chatIndexJid },
423
+ value: { markChatAsReadAction: { read, messageRange } },
424
+ timestamp
425
+ })
426
+ ]);
82
427
  }
428
+ /**
429
+ * Pins or unpins the chat. Pinning also clears any active archive flag
430
+ * (the two states are mutually exclusive on the client). WhatsApp
431
+ * imposes a server-side cap on pinned chats - extra pins sync but the
432
+ * official UI will hide / reject them.
433
+ */
83
434
  async setChatPin(chatJid, pinned) {
84
435
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
85
- const timestamp = Date.now();
436
+ const timestamp = this.serverClock.nowMs();
86
437
  const pending = [
87
- this.createSetMutation({
88
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.PIN,
89
- chatIndexJid,
90
- value: {
91
- pinAction: {
92
- pinned
93
- }
94
- },
438
+ buildSetMutationFromSchema({
439
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Pin,
440
+ indexArgs: { chatJid: chatIndexJid },
441
+ value: { pinAction: { pinned } },
95
442
  timestamp
96
443
  })
97
444
  ];
@@ -100,66 +447,82 @@ class WaAppStateMutationCoordinator {
100
447
  }
101
448
  await this.enqueueAndFlush(pending);
102
449
  }
450
+ /** Archives or unarchives the chat. Archiving also clears any pin. */
103
451
  async setChatArchive(chatJid, archived) {
104
452
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
105
- const timestamp = Date.now();
453
+ const timestamp = this.serverClock.nowMs();
106
454
  const pending = [
107
455
  await this.createArchiveMutation(chatIndexJid, archived, timestamp)
108
456
  ];
109
457
  if (archived) {
110
- pending.push(this.createSetMutation({
111
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.PIN,
112
- chatIndexJid,
113
- value: {
114
- pinAction: {
115
- pinned: false
116
- }
117
- },
458
+ pending.push(buildSetMutationFromSchema({
459
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Pin,
460
+ indexArgs: { chatJid: chatIndexJid },
461
+ value: { pinAction: { pinned: false } },
118
462
  timestamp
119
463
  }));
120
464
  }
121
465
  await this.enqueueAndFlush(pending);
122
466
  }
467
+ /**
468
+ * Clears the chat history (without deleting the chat itself - it stays
469
+ * in the chat list, just empty). Defaults to **preserving** starred
470
+ * messages and media; set `options.deleteStarred`/`deleteMedia` to wipe
471
+ * those too. The clear is local-only - other participants keep their
472
+ * copies.
473
+ */
123
474
  async clearChat(chatJid, options = {}) {
124
475
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
125
- const timestamp = Date.now();
476
+ const timestamp = this.serverClock.nowMs();
126
477
  const deleteStarred = options.deleteStarred === true;
127
478
  const deleteMedia = options.deleteMedia === true;
128
479
  const messageRange = await this.buildChatMessageRange(chatIndexJid);
129
- const mutation = this.createSetMutation({
130
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.CLEAR_CHAT,
131
- chatIndexJid,
132
- value: {
133
- clearChatAction: {
134
- messageRange
135
- }
136
- },
137
- timestamp,
138
- indexPartsTail: [deleteStarred ? '1' : '0', deleteMedia ? '1' : '0']
139
- });
140
- await this.enqueueAndFlush([mutation]);
480
+ await this.enqueueAndFlush([
481
+ buildSetMutationFromSchema({
482
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.ClearChat,
483
+ indexArgs: {
484
+ chatJid: chatIndexJid,
485
+ deleteStarred: deleteStarred ? '1' : '0',
486
+ deleteMedia: deleteMedia ? '1' : '0'
487
+ },
488
+ value: { clearChatAction: { messageRange } },
489
+ timestamp
490
+ })
491
+ ]);
141
492
  }
493
+ /**
494
+ * Deletes the chat entirely (removes from the chat list + drops every
495
+ * stored message). Local-only - the conversation continues to exist on
496
+ * the peer's device. For groups, this does **not** leave the group;
497
+ * use {@link WaGroupCoordinator.leaveGroup} for that.
498
+ */
142
499
  async deleteChat(chatJid, options = {}) {
143
500
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
144
- const timestamp = Date.now();
501
+ const timestamp = this.serverClock.nowMs();
145
502
  const deleteMedia = options.deleteMedia === true;
146
503
  const messageRange = await this.buildChatMessageRange(chatIndexJid);
147
- const mutation = this.createSetMutation({
148
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.DELETE_CHAT,
149
- chatIndexJid,
150
- value: {
151
- deleteChatAction: {
152
- messageRange
153
- }
154
- },
155
- timestamp,
156
- indexPartsTail: [deleteMedia ? '1' : '0']
157
- });
158
- await this.enqueueAndFlush([mutation]);
504
+ await this.enqueueAndFlush([
505
+ buildSetMutationFromSchema({
506
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.DeleteChat,
507
+ indexArgs: {
508
+ chatJid: chatIndexJid,
509
+ deleteMedia: deleteMedia ? '1' : '0'
510
+ },
511
+ value: { deleteChatAction: { messageRange } },
512
+ timestamp
513
+ })
514
+ ]);
159
515
  }
516
+ /**
517
+ * Deletes a single message **locally** - removes it from your own
518
+ * device(s) only. The recipient(s) still see it. Use a `revoke`
519
+ * outgoing message ({@link WaMessageCoordinator.send} with
520
+ * `{ type: 'revoke', ... }`) to delete-for-everyone instead.
521
+ * `messageTimestampMs` must be a non-negative safe-integer epoch when set.
522
+ */
160
523
  async deleteMessageForMe(message, options = {}) {
161
524
  const messageIndex = this.buildMessageMutationIndex(message);
162
- const timestamp = Date.now();
525
+ const timestamp = this.serverClock.nowMs();
163
526
  const deleteMedia = options.deleteMedia === true;
164
527
  const messageTimestampMs = options.messageTimestampMs;
165
528
  let messageTimestamp;
@@ -171,49 +534,47 @@ class WaAppStateMutationCoordinator {
171
534
  }
172
535
  messageTimestamp = Math.floor(messageTimestampMs / 1000);
173
536
  }
174
- const mutation = this.createSetMutation({
175
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.DELETE_MESSAGE_FOR_ME,
176
- chatIndexJid: messageIndex.chatIndexJid,
177
- value: {
178
- deleteMessageForMeAction: {
179
- deleteMedia,
180
- ...(messageTimestamp === undefined ? {} : { messageTimestamp })
181
- }
182
- },
183
- timestamp,
184
- indexPartsTail: messageIndex.indexPartsTail
185
- });
186
- await this.enqueueAndFlush([mutation]);
537
+ await this.enqueueAndFlush([
538
+ buildSetMutationFromSchema({
539
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.DeleteMessageForMe,
540
+ indexArgs: messageIndex,
541
+ value: {
542
+ deleteMessageForMeAction: {
543
+ deleteMedia,
544
+ ...(messageTimestamp === undefined ? {} : { messageTimestamp })
545
+ }
546
+ },
547
+ timestamp
548
+ })
549
+ ]);
187
550
  }
551
+ /** Locks or unlocks the chat. Locking also clears archive and pin. */
188
552
  async setChatLock(chatJid, locked) {
189
553
  const chatIndexJid = this.normalizeChatMutationJid(chatJid);
190
- const timestamp = Date.now();
554
+ const timestamp = this.serverClock.nowMs();
191
555
  const pending = [];
192
556
  if (locked) {
193
557
  pending.push(await this.createArchiveMutation(chatIndexJid, false, timestamp));
194
- pending.push(this.createSetMutation({
195
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.PIN,
196
- chatIndexJid,
197
- value: {
198
- pinAction: {
199
- pinned: false
200
- }
201
- },
558
+ pending.push(buildSetMutationFromSchema({
559
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Pin,
560
+ indexArgs: { chatJid: chatIndexJid },
561
+ value: { pinAction: { pinned: false } },
202
562
  timestamp
203
563
  }));
204
564
  }
205
- pending.push(this.createSetMutation({
206
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.LOCK_CHAT,
207
- chatIndexJid,
208
- value: {
209
- lockChatAction: {
210
- locked
211
- }
212
- },
565
+ pending.push(buildSetMutationFromSchema({
566
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.LockChat,
567
+ indexArgs: { chatJid: chatIndexJid },
568
+ value: { lockChatAction: { locked } },
213
569
  timestamp
214
570
  }));
215
571
  await this.enqueueAndFlush(pending);
216
572
  }
573
+ /**
574
+ * Drains any queued mutations through a sync round. Concurrent callers
575
+ * share the in-flight flush promise. Failed collections are re-queued
576
+ * before the error is rethrown.
577
+ */
217
578
  async flushMutations() {
218
579
  if (this.flushPromise) {
219
580
  return this.flushPromise;
@@ -271,7 +632,7 @@ class WaAppStateMutationCoordinator {
271
632
  seenCollections.add(mutation.collection);
272
633
  collections.push(mutation.collection);
273
634
  }
274
- syncResult = await this.syncAppState({
635
+ syncResult = await this.sync({
275
636
  collections,
276
637
  pendingMutations: batch
277
638
  });
@@ -323,30 +684,190 @@ class WaAppStateMutationCoordinator {
323
684
  this.enqueueMutation(mutation);
324
685
  }
325
686
  }
326
- createSetMutation(input) {
327
- return {
328
- collection: input.spec.collection,
329
- operation: 'set',
330
- index: this.buildMutationIndex(input.spec.action, input.chatIndexJid, input.indexPartsTail ?? []),
331
- value: {
332
- ...input.value,
333
- timestamp: input.timestamp
334
- },
335
- version: input.spec.version,
336
- timestamp: input.timestamp
687
+ /**
688
+ * Sets the account-wide status-broadcast distribution policy. `mode`
689
+ * accepts either the proto enum number or its string name; allow/deny
690
+ * lists are provided via `userJids`.
691
+ */
692
+ async setStatusPrivacy(input) {
693
+ const modeValue = typeof input.mode === 'number'
694
+ ? input.mode
695
+ : _proto_1.proto.SyncActionValue.StatusPrivacyAction.StatusDistributionMode[input.mode];
696
+ if (typeof modeValue !== 'number' || !Number.isInteger(modeValue)) {
697
+ throw new Error(`setStatusPrivacy: invalid mode ${String(input.mode)}`);
698
+ }
699
+ const userJid = input.userJids ? [...input.userJids] : [];
700
+ const value = {
701
+ statusPrivacy: {
702
+ mode: modeValue,
703
+ userJid,
704
+ ...(input.shareToFB === undefined ? {} : { shareToFB: input.shareToFB }),
705
+ ...(input.shareToIG === undefined ? {} : { shareToIG: input.shareToIG })
706
+ }
707
+ };
708
+ const timestamp = this.serverClock.nowMs();
709
+ await this.enqueueAndFlush([
710
+ buildSetMutationFromSchema({
711
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.StatusPrivacy,
712
+ indexArgs: {},
713
+ value,
714
+ timestamp
715
+ })
716
+ ]);
717
+ }
718
+ /** Mutes/unmutes a single user's status broadcasts. Rejects group/broadcast JIDs. */
719
+ async setUserStatusMute(jid, muted) {
720
+ const indexJid = this.normalizeChatMutationJid(jid);
721
+ if ((0, jid_1.isGroupOrBroadcastJid)(indexJid)) {
722
+ throw new Error(`setUserStatusMute requires a user jid, got ${jid}`);
723
+ }
724
+ const timestamp = this.serverClock.nowMs();
725
+ await this.enqueueAndFlush([
726
+ buildSetMutationFromSchema({
727
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.UserStatusMute,
728
+ indexArgs: { id: indexJid },
729
+ value: { userStatusMuteAction: { muted } },
730
+ timestamp
731
+ })
732
+ ]);
733
+ }
734
+ /** Creates or updates the broadcast list identified by `input.id`. */
735
+ async setBroadcastList(input) {
736
+ const participants = input.participants.map((entry) => ({
737
+ lidJid: entry.lidJid,
738
+ ...(entry.pnJid === undefined ? {} : { pnJid: entry.pnJid })
739
+ }));
740
+ const value = {
741
+ businessBroadcastListAction: {
742
+ participants,
743
+ listName: input.listName,
744
+ labelIds: input.labelIds ? [...input.labelIds] : []
745
+ }
337
746
  };
747
+ const timestamp = this.serverClock.nowMs();
748
+ await this.enqueueAndFlush([
749
+ buildSetMutationFromSchema({
750
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.BusinessBroadcastList,
751
+ indexArgs: { id: input.id },
752
+ value,
753
+ timestamp
754
+ })
755
+ ]);
756
+ }
757
+ /** Deletes the broadcast list identified by `id`. */
758
+ async removeBroadcastList(id) {
759
+ const timestamp = this.serverClock.nowMs();
760
+ await this.enqueueAndFlush([
761
+ buildRemoveMutationFromSchema({
762
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.BusinessBroadcastList,
763
+ indexArgs: { id },
764
+ timestamp
765
+ })
766
+ ]);
767
+ }
768
+ /**
769
+ * Applies a `set` mutation against any registered app-state schema. This
770
+ * is the way to reach schemas that don't have a typed helper on this
771
+ * coordinator (Contact, LabelEdit, LabelJid, QuickReply, AiThreadPin,
772
+ * Favorites, Nux, ...). For the common chat actions there's a dedicated
773
+ * method ({@link setChatMute}, {@link setChatRead}, {@link setMessageStar},
774
+ * {@link setChatPin}, {@link setChatArchive}, etc.) – use those instead.
775
+ *
776
+ * `input` is flat – pick a `schema` name from {@link WA_APPSTATE_SCHEMAS},
777
+ * fill the index fields (`id`, `chatJid`, `labelId`, ...) and the value
778
+ * fields side-by-side, and the coordinator routes them to the right
779
+ * SyncActionValue subfield.
780
+ *
781
+ * @example
782
+ * ```ts
783
+ * // Add a contact to the address book
784
+ * await client.chat.set({
785
+ * schema: 'Contact',
786
+ * id: '5511999999999@s.whatsapp.net',
787
+ * contactAction: { fullName: 'Maria Silva', firstName: 'Maria' }
788
+ * })
789
+ *
790
+ * // Create a chat label (color is a server-side palette index)
791
+ * await client.chat.set({
792
+ * schema: 'LabelEdit',
793
+ * id: 'label-1',
794
+ * labelEditAction: { name: 'Pendente', color: 0, isActive: true }
795
+ * })
796
+ *
797
+ * // Apply that label to a chat
798
+ * await client.chat.set({
799
+ * schema: 'LabelJid',
800
+ * labelId: 'label-1',
801
+ * chatJid: '5511999999999@s.whatsapp.net',
802
+ * labelAssociationAction: { labeled: true }
803
+ * })
804
+ *
805
+ * // Save a business quick reply
806
+ * await client.chat.set({
807
+ * schema: 'QuickReply',
808
+ * id: 'qr-greeting',
809
+ * quickReplyAction: { shortcut: '/oi', message: 'Olá! Tudo bem?' }
810
+ * })
811
+ * ```
812
+ */
813
+ async set(input) {
814
+ const resolved = _appstate_spec_1.WA_APPSTATE_SCHEMAS[input.schema];
815
+ const { indexArgs, data } = splitFlatInput(resolved, input);
816
+ const value = wrapData(resolved, data);
817
+ const timestamp = this.serverClock.nowMs();
818
+ const mutation = buildSetMutationFromSchema({
819
+ schema: resolved,
820
+ indexArgs: indexArgs,
821
+ value,
822
+ timestamp
823
+ });
824
+ await this.enqueueAndFlush([mutation]);
825
+ }
826
+ /**
827
+ * Applies a `remove` mutation against any registered app-state schema -
828
+ * same shape as {@link set} but without the value fields (only the schema
829
+ * name + index args). Use this for schemas without a typed helper.
830
+ *
831
+ * @example
832
+ * ```ts
833
+ * // Drop a contact from the address book
834
+ * await client.chat.remove({
835
+ * schema: 'Contact',
836
+ * id: '5511999999999@s.whatsapp.net'
837
+ * })
838
+ *
839
+ * // Remove a label from a chat (the label itself stays – use LabelEdit
840
+ * // with `deleted: true` to delete the label definition entirely)
841
+ * await client.chat.remove({
842
+ * schema: 'LabelJid',
843
+ * labelId: 'label-1',
844
+ * chatJid: '5511999999999@s.whatsapp.net'
845
+ * })
846
+ *
847
+ * // Delete a quick reply
848
+ * await client.chat.remove({
849
+ * schema: 'QuickReply',
850
+ * id: 'qr-greeting'
851
+ * })
852
+ * ```
853
+ */
854
+ async remove(input) {
855
+ const resolved = _appstate_spec_1.WA_APPSTATE_SCHEMAS[input.schema];
856
+ const { indexArgs } = splitFlatInput(resolved, input);
857
+ const timestamp = this.serverClock.nowMs();
858
+ const mutation = buildRemoveMutationFromSchema({
859
+ schema: resolved,
860
+ indexArgs: indexArgs,
861
+ timestamp
862
+ });
863
+ await this.enqueueAndFlush([mutation]);
338
864
  }
339
865
  async createArchiveMutation(chatIndexJid, archived, timestamp) {
340
866
  const messageRange = await this.buildChatMessageRange(chatIndexJid);
341
- return this.createSetMutation({
342
- spec: constants_1.WA_APP_STATE_CHAT_MUTATION_SPECS.ARCHIVE,
343
- chatIndexJid,
344
- value: {
345
- archiveChatAction: {
346
- archived,
347
- messageRange
348
- }
349
- },
867
+ return buildSetMutationFromSchema({
868
+ schema: _appstate_spec_1.WA_APPSTATE_SCHEMAS.Archive,
869
+ indexArgs: { chatJid: chatIndexJid },
870
+ value: { archiveChatAction: { archived, messageRange } },
350
871
  timestamp
351
872
  });
352
873
  }
@@ -431,8 +952,10 @@ class WaAppStateMutationCoordinator {
431
952
  const fromMe = message.fromMe === true;
432
953
  const participant = this.resolveMessageMutationParticipant(chatIndexJid, fromMe, message.participantJid);
433
954
  return {
434
- chatIndexJid,
435
- indexPartsTail: [messageId, fromMe ? '1' : '0', participant]
955
+ remote: chatIndexJid,
956
+ id: messageId,
957
+ fromMe,
958
+ participant
436
959
  };
437
960
  }
438
961
  resolveMessageMutationParticipant(chatIndexJid, fromMe, participantJid) {
@@ -448,9 +971,6 @@ class WaAppStateMutationCoordinator {
448
971
  }
449
972
  return (0, jid_1.normalizeDeviceJid)(normalized);
450
973
  }
451
- buildMutationIndex(action, chatIndexJid, indexPartsTail) {
452
- return JSON.stringify([action, chatIndexJid, ...indexPartsTail]);
453
- }
454
974
  describeMutationActions(mutations) {
455
975
  return mutations
456
976
  .map((mutation) => {