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,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WaAppStateSyncClient = exports.WaAppStateMissingKeyError = void 0;
4
- const constants_1 = require("./constants");
5
- const WaAppStateCrypto_1 = require("./WaAppStateCrypto");
6
- const WaAppStateSyncResponseParser_1 = require("./WaAppStateSyncResponseParser");
7
- const _proto_1 = require("../proto.js");
8
- const constants_2 = require("../protocol/constants");
9
- const jid_1 = require("../protocol/jid");
10
- const query_1 = require("../transport/node/query");
11
- const bytes_1 = require("../util/bytes");
12
- const bytes_2 = require("../util/bytes");
13
- const primitives_1 = require("../util/primitives");
3
+ exports.WaAppStateSyncClient = void 0;
4
+ const constants_1 = require("../constants");
5
+ const WaAppStateCrypto_1 = require("../crypto/WaAppStateCrypto");
6
+ const response_parser_1 = require("../parsers/response-parser");
7
+ const _crypto_1 = require("../../crypto/index.js");
8
+ const _proto_1 = require("../../proto.js");
9
+ const constants_2 = require("../../protocol/constants");
10
+ const jid_1 = require("../../protocol/jid");
11
+ const query_1 = require("../../transport/node/query");
12
+ const bytes_1 = require("../../util/bytes");
13
+ const primitives_1 = require("../../util/primitives");
14
14
  class WaAppStateMissingKeyError extends Error {
15
15
  constructor(message, keyId, collection) {
16
16
  super(message);
@@ -19,24 +19,56 @@ class WaAppStateMissingKeyError extends Error {
19
19
  this.name = 'WaAppStateMissingKeyError';
20
20
  }
21
21
  }
22
- exports.WaAppStateMissingKeyError = WaAppStateMissingKeyError;
22
+ /**
23
+ * App-state synchronization client. Owns the sync key inventory, processes
24
+ * snapshots/patches, encrypts pending mutations, and persists the resulting
25
+ * collection state in the {@link WaAppStateStore}.
26
+ */
23
27
  class WaAppStateSyncClient {
24
28
  constructor(options) {
25
29
  this.logger = options.logger;
26
30
  this.query = options.query;
27
31
  this.store = options.store;
32
+ this.serverClock = options.serverClock;
28
33
  this.getCurrentMeJid = options.getCurrentMeJid;
29
34
  this.hostDomain = options.hostDomain ?? constants_2.WA_DEFAULTS.HOST_DOMAIN;
30
35
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.APP_STATE_SYNC_TIMEOUT_MS;
31
36
  this.onMissingKeys = options.onMissingKeys;
32
- this.crypto = new WaAppStateCrypto_1.WaAppStateCrypto();
37
+ this.isOwnAccountDevice = options.isOwnAccountDevice;
38
+ this.sendKeyShare = options.sendKeyShare;
39
+ this.triggerSync = options.triggerSync;
40
+ this.crypto = new WaAppStateCrypto_1.WaAppStateCrypto(undefined, options.skipMacVerification === true);
41
+ this.mobilePrimary = options.mobilePrimary ?? false;
33
42
  this.syncContext = null;
34
43
  this.syncPromise = null;
35
44
  }
36
- async exportState() {
37
- this.logger.trace('app-state export requested');
38
- return this.store.exportData();
45
+ /**
46
+ * Returns the active app-state sync key, generating and persisting a new
47
+ * one when the store is empty (used during initial setup).
48
+ */
49
+ async ensureInitialSyncKey() {
50
+ const existing = await this.store.getActiveSyncKey();
51
+ if (existing) {
52
+ return existing;
53
+ }
54
+ const keyIdBytes = await (0, _crypto_1.randomBytesAsync)(2);
55
+ const keyData = await (0, _crypto_1.randomBytesAsync)(32);
56
+ const rawId = await (0, _crypto_1.randomIntAsync)(0, 4294967295);
57
+ const key = {
58
+ keyId: keyIdBytes,
59
+ keyData,
60
+ timestamp: this.serverClock.nowMs(),
61
+ fingerprint: { rawId, currentIndex: 0, deviceIndexes: [0] }
62
+ };
63
+ await this.store.upsertSyncKeys([key]);
64
+ this.crypto.clearCache();
65
+ this.logger.info('app-state initial sync key generated (mobile primary)', {
66
+ keyId: (0, bytes_1.bytesToHex)(keyIdBytes),
67
+ rawId
68
+ });
69
+ return key;
39
70
  }
71
+ /** Imports peer-shared sync keys into the store; returns the count actually added. */
40
72
  async importSyncKeys(keys) {
41
73
  this.logger.debug('app-state importing sync keys', { count: keys.length });
42
74
  const inserted = await this.store.upsertSyncKeys(keys);
@@ -46,13 +78,126 @@ class WaAppStateSyncClient {
46
78
  }
47
79
  return inserted;
48
80
  }
81
+ /** Handler for `AppStateSyncKeyShare` protocol messages – stores received keys and triggers a sync. */
82
+ async handleIncomingKeyShare(context, protocolMessage) {
83
+ const log = this.logger.child({ id: context.id, from: context.remoteJid });
84
+ const share = protocolMessage.appStateSyncKeyShare;
85
+ if (!share) {
86
+ log.warn('incoming app-state key share protocol message without payload');
87
+ return;
88
+ }
89
+ try {
90
+ const imported = await this.importSyncKeyShare(share);
91
+ log.info('imported app-state sync key share from protocol message', { imported });
92
+ if (imported > 0 && this.triggerSync) {
93
+ void this.triggerSync().catch((error) => {
94
+ log.warn('failed to sync app-state after key share import', {
95
+ message: (0, primitives_1.toError)(error).message
96
+ });
97
+ });
98
+ }
99
+ }
100
+ catch (error) {
101
+ log.warn('failed to import app-state sync key share from protocol message', {
102
+ message: (0, primitives_1.toError)(error).message
103
+ });
104
+ }
105
+ }
106
+ /** Handler for `AppStateSyncKeyRequest` protocol messages – replies with the requested keys via `sendKeyShare`. */
107
+ async handleIncomingKeyRequest(context, protocolMessage) {
108
+ const log = this.logger.child({ id: context.id, from: context.remoteJid });
109
+ const request = protocolMessage.appStateSyncKeyRequest;
110
+ if (!request) {
111
+ log.warn('incoming app-state key request protocol message without payload');
112
+ return;
113
+ }
114
+ const senderJid = context.participant ?? context.remoteJid;
115
+ if (!senderJid) {
116
+ log.warn('incoming app-state key request missing sender jid');
117
+ return;
118
+ }
119
+ let requesterDeviceJid;
120
+ try {
121
+ const requesterRaw = (0, jid_1.applyDeviceToJid)(senderJid, context.senderDevice);
122
+ requesterDeviceJid = (0, jid_1.normalizeDeviceJid)(requesterRaw);
123
+ }
124
+ catch (error) {
125
+ log.warn('incoming app-state key request has malformed sender jid', {
126
+ senderJid,
127
+ message: (0, primitives_1.toError)(error).message
128
+ });
129
+ return;
130
+ }
131
+ const deviceLog = log.child({ to: requesterDeviceJid });
132
+ if (this.isOwnAccountDevice && !this.isOwnAccountDevice(requesterDeviceJid)) {
133
+ deviceLog.warn('incoming app-state key request ignored: sender is not own account');
134
+ return;
135
+ }
136
+ const requestedKeyIds = this.extractKeyRequestIds(request);
137
+ if (requestedKeyIds.length === 0) {
138
+ deviceLog.warn('incoming app-state key request has no valid key ids');
139
+ return;
140
+ }
141
+ if (!this.sendKeyShare) {
142
+ deviceLog.warn('incoming app-state key request received but no sendKeyShare wired');
143
+ return;
144
+ }
145
+ const requestedKeys = await this.store.getSyncKeysBatch(requestedKeyIds);
146
+ const availableKeys = [];
147
+ const missingKeyIds = [];
148
+ for (let i = 0; i < requestedKeys.length; i += 1) {
149
+ const key = requestedKeys[i];
150
+ if (key !== null) {
151
+ availableKeys.push(key);
152
+ }
153
+ else {
154
+ missingKeyIds.push(requestedKeyIds[i]);
155
+ }
156
+ }
157
+ try {
158
+ await this.sendKeyShare(requesterDeviceJid, availableKeys, missingKeyIds);
159
+ deviceLog.info('responded to app-state key request', {
160
+ requested: requestedKeyIds.length,
161
+ shared: availableKeys.length,
162
+ missing: missingKeyIds.length
163
+ });
164
+ }
165
+ catch (error) {
166
+ deviceLog.warn('failed to respond to app-state key request', {
167
+ requested: requestedKeyIds.length,
168
+ shared: availableKeys.length,
169
+ missing: missingKeyIds.length,
170
+ message: (0, primitives_1.toError)(error).message
171
+ });
172
+ }
173
+ }
174
+ extractKeyRequestIds(request) {
175
+ const deduped = new Map();
176
+ for (const key of request.keyIds ?? []) {
177
+ try {
178
+ const keyId = (0, bytes_1.decodeProtoBytes)(key.keyId, 'appStateSyncKeyRequest.keyIds[].keyId');
179
+ const keyHex = (0, bytes_1.bytesToHex)(keyId);
180
+ if (deduped.has(keyHex)) {
181
+ continue;
182
+ }
183
+ deduped.set(keyHex, keyId);
184
+ }
185
+ catch (error) {
186
+ this.logger.trace('ignoring malformed app-state key id request entry', {
187
+ message: (0, primitives_1.toError)(error).message
188
+ });
189
+ }
190
+ }
191
+ return [...deduped.values()];
192
+ }
193
+ /** Imports the keys from a decoded `AppStateSyncKeyShare` proto message. */
49
194
  async importSyncKeyShare(share) {
50
195
  const keys = [];
51
196
  for (const item of share.keys ?? []) {
52
197
  const keyId = (0, bytes_1.decodeProtoBytes)(item.keyId?.keyId, 'appStateSyncKeyShare.keys[].keyId.keyId');
53
198
  if (!item.keyData?.keyData) {
54
199
  this.logger.debug('app-state sync key share entry missing key data', {
55
- keyId: (0, bytes_2.bytesToHex)(keyId)
200
+ keyId: (0, bytes_1.bytesToHex)(keyId)
56
201
  });
57
202
  continue;
58
203
  }
@@ -61,13 +206,19 @@ class WaAppStateSyncClient {
61
206
  keyId,
62
207
  keyData,
63
208
  timestamp: item.keyData?.timestamp === null || item.keyData?.timestamp === undefined
64
- ? Date.now()
209
+ ? this.serverClock.nowMs()
65
210
  : this.normalizeProtoLong(item.keyData?.timestamp, 'appStateSyncKeyShare.keys[].keyData.timestamp'),
66
211
  fingerprint: item.keyData?.fingerprint ?? undefined
67
212
  });
68
213
  }
69
214
  return this.importSyncKeys(keys);
70
215
  }
216
+ /**
217
+ * Runs one app-state sync round across the requested collections,
218
+ * applying any `pendingMutations` and downloading external snapshots
219
+ * via `options.downloadExternalBlob` when present. Concurrent calls
220
+ * share the in-flight promise.
221
+ */
71
222
  async sync(options = {}) {
72
223
  if (this.syncPromise) {
73
224
  this.logger.debug('app-state sync already in flight, joining existing run');
@@ -99,7 +250,7 @@ class WaAppStateSyncClient {
99
250
  for (let index = 0; index < collections.length; index += 1) {
100
251
  context.collections.set(collections[index], initialCollectionStates[index]);
101
252
  }
102
- this.logger.info('app-state sync start', {
253
+ this.logger.debug('app-state sync start', {
103
254
  collections: collections.length,
104
255
  pendingMutations: options.pendingMutations?.length ?? 0
105
256
  });
@@ -149,13 +300,13 @@ class WaAppStateSyncClient {
149
300
  }
150
301
  if (stateChanged && context.dirtyCollections.size > 0) {
151
302
  await this.persistCollectionUpdates();
152
- this.logger.info('app-state sync persisted updated state');
303
+ this.logger.debug('app-state sync persisted updated state');
153
304
  }
154
305
  const orderedResults = collections.map((collection) => resultMap.get(collection) ?? {
155
306
  collection,
156
307
  state: constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY
157
308
  });
158
- this.logger.info('app-state sync finished', {
309
+ this.logger.debug('app-state sync finished', {
159
310
  collections: orderedResults.length,
160
311
  stateChanged
161
312
  });
@@ -220,7 +371,7 @@ class WaAppStateSyncClient {
220
371
  blockedCollections.push(entry.collection);
221
372
  }
222
373
  if (entry.missingKeyId) {
223
- const keyHex = (0, bytes_2.bytesToHex)(entry.missingKeyId);
374
+ const keyHex = (0, bytes_1.bytesToHex)(entry.missingKeyId);
224
375
  if (!missingKeyIdHexes.has(keyHex)) {
225
376
  missingKeyIdHexes.add(keyHex);
226
377
  missingKeyIds.push(entry.missingKeyId);
@@ -287,7 +438,7 @@ class WaAppStateSyncClient {
287
438
  content: [
288
439
  {
289
440
  tag: constants_2.WA_NODE_TAGS.SYNC,
290
- attrs: {},
441
+ attrs: this.mobilePrimary ? { data_namespace: '3' } : {},
291
442
  content: collectionNodes
292
443
  }
293
444
  ]
@@ -300,7 +451,7 @@ class WaAppStateSyncClient {
300
451
  type: responseNode.attrs.type
301
452
  });
302
453
  (0, query_1.assertIqResult)(responseNode, 'app-state sync');
303
- const payloads = (0, WaAppStateSyncResponseParser_1.parseSyncResponse)(responseNode);
454
+ const payloads = (0, response_parser_1.parseSyncResponse)(responseNode);
304
455
  this.logger.debug('app-state sync payloads parsed', { count: payloads.length });
305
456
  const payloadByCollection = new Map();
306
457
  for (const payload of payloads) {
@@ -309,11 +460,12 @@ class WaAppStateSyncClient {
309
460
  return payloadByCollection;
310
461
  }
311
462
  async processCollectionRound({ collection, payloadByCollection, pendingByCollection, options, outgoingContexts, skippedUploadCollections }) {
463
+ const collectionLogger = this.logger.child({ collection });
312
464
  const payload = payloadByCollection.get(collection);
313
465
  let shouldRefetch = false;
314
466
  let collectionStateChanged = false;
315
467
  if (!payload) {
316
- this.logger.warn('app-state sync response missing collection payload', { collection });
468
+ collectionLogger.warn('app-state sync response missing collection payload');
317
469
  return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY);
318
470
  }
319
471
  if (payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_FATAL ||
@@ -373,8 +525,7 @@ class WaAppStateSyncClient {
373
525
  payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS_HAS_MORE ||
374
526
  (payload.state === constants_2.WA_APP_STATE_COLLECTION_STATES.SUCCESS &&
375
527
  skippedUploadCollections.has(collection));
376
- this.logger.debug('app-state collection processed', {
377
- collection: payload.collection,
528
+ collectionLogger.debug('app-state collection processed', {
378
529
  state: payload.state,
379
530
  version: payload.version,
380
531
  appliedMutations: appliedMutations.length
@@ -383,16 +534,13 @@ class WaAppStateSyncClient {
383
534
  }
384
535
  catch (error) {
385
536
  if (error instanceof WaAppStateMissingKeyError) {
386
- this.logger.warn('app-state blocked by missing key', {
387
- collection: payload.collection,
537
+ collectionLogger.debug('app-state blocked by missing key', {
388
538
  message: error.message
389
539
  });
390
540
  return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.BLOCKED, payload.version, shouldRefetch, collectionStateChanged, undefined, error.keyId);
391
541
  }
392
- const message = error instanceof Error ? error.message : String(error);
393
- this.logger.warn('app-state collection processing failed', {
394
- collection: payload.collection,
395
- message
542
+ collectionLogger.debug('app-state collection processing failed', {
543
+ message: (0, primitives_1.toError)(error).message
396
544
  });
397
545
  return this.createCollectionOutcome(collection, constants_2.WA_APP_STATE_COLLECTION_STATES.ERROR_RETRY, payload.version, true, collectionStateChanged);
398
546
  }
@@ -417,12 +565,14 @@ class WaAppStateSyncClient {
417
565
  if (keyIds.length === 0 || collections.length === 0) {
418
566
  return;
419
567
  }
420
- const keyIdsHex = keyIds.map((keyId) => (0, bytes_2.bytesToHex)(keyId));
421
- this.logger.info('app-state requesting missing sync keys', {
568
+ const keyIdsHex = keyIds.map((keyId) => (0, bytes_1.bytesToHex)(keyId));
569
+ const requestLogger = this.logger.child({
422
570
  keys: keyIdsHex.length,
423
- keyIds: keyIdsHex.join(','),
424
571
  collections: collections.join(',')
425
572
  });
573
+ requestLogger.debug('app-state requesting missing sync keys', {
574
+ keyIds: keyIdsHex.join(',')
575
+ });
426
576
  try {
427
577
  await input.onMissingKeys({
428
578
  keyIds,
@@ -430,10 +580,8 @@ class WaAppStateSyncClient {
430
580
  });
431
581
  }
432
582
  catch (error) {
433
- this.logger.warn('app-state missing key callback failed', {
434
- keys: keyIdsHex.length,
435
- collections: collections.join(','),
436
- message: error instanceof Error ? error.message : String(error)
583
+ requestLogger.warn('app-state missing key callback failed', {
584
+ message: (0, primitives_1.toError)(error).message
437
585
  });
438
586
  }
439
587
  }
@@ -456,7 +604,8 @@ class WaAppStateSyncClient {
456
604
  const decodedMutations = _proto_1.proto.SyncdMutations.decode(patchBytes);
457
605
  readyPatch = {
458
606
  ...readyPatch,
459
- mutations: decodedMutations.mutations ?? []
607
+ mutations: decodedMutations.mutations ?? [],
608
+ externalMutations: undefined
460
609
  };
461
610
  }
462
611
  return this.validatePatch(payload.collection, readyPatch);
@@ -466,11 +615,13 @@ class WaAppStateSyncClient {
466
615
  if (!snapshot.version?.version) {
467
616
  throw new Error(`snapshot for ${collection} is missing version`);
468
617
  }
469
- if (!snapshot.mac) {
470
- throw new Error(`snapshot for ${collection} is missing mac`);
471
- }
472
- if (!snapshot.keyId?.id) {
473
- throw new Error(`snapshot for ${collection} is missing keyId`);
618
+ if (!this.crypto.isMacVerificationSkipped) {
619
+ if (!snapshot.mac) {
620
+ throw new Error(`snapshot for ${collection} is missing mac`);
621
+ }
622
+ if (!snapshot.keyId?.id) {
623
+ throw new Error(`snapshot for ${collection} is missing keyId`);
624
+ }
474
625
  }
475
626
  return snapshot;
476
627
  }
@@ -485,14 +636,16 @@ class WaAppStateSyncClient {
485
636
  if (!patch.version?.version) {
486
637
  throw new Error(`patch for ${collection} is missing version`);
487
638
  }
488
- if (!patch.snapshotMac) {
489
- throw new Error(`patch for ${collection} is missing snapshotMac`);
490
- }
491
- if (!patch.patchMac) {
492
- throw new Error(`patch for ${collection} is missing patchMac`);
493
- }
494
- if (!patch.keyId?.id) {
495
- throw new Error(`patch for ${collection} is missing keyId`);
639
+ if (!this.crypto.isMacVerificationSkipped) {
640
+ if (!patch.snapshotMac) {
641
+ throw new Error(`patch for ${collection} is missing snapshotMac`);
642
+ }
643
+ if (!patch.patchMac) {
644
+ throw new Error(`patch for ${collection} is missing patchMac`);
645
+ }
646
+ if (!patch.keyId?.id) {
647
+ throw new Error(`patch for ${collection} is missing keyId`);
648
+ }
496
649
  }
497
650
  if (patch.mutations && patch.mutations.length > 0 && patch.externalMutations) {
498
651
  throw new Error(`patch for ${collection} has inline and external mutations together`);
@@ -506,16 +659,19 @@ class WaAppStateSyncClient {
506
659
  }
507
660
  async applySnapshot(collection, snapshot) {
508
661
  const version = this.normalizeProtoLong(snapshot.version?.version, `snapshot.version.version (${collection})`);
509
- const keyId = (0, bytes_1.decodeProtoBytes)(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
510
- const keyData = await this.getKeyData(keyId);
511
- if (!keyData) {
512
- throw new WaAppStateMissingKeyError(`missing snapshot key ${(0, bytes_2.bytesToHex)(keyId)} for ${collection}`, keyId, collection);
662
+ let keyData = null;
663
+ if (!this.crypto.isMacVerificationSkipped) {
664
+ const keyId = (0, bytes_1.decodeProtoBytes)(snapshot.keyId?.id, `snapshot.keyId.id (${collection})`);
665
+ keyData = await this.getKeyData(keyId);
666
+ if (!keyData) {
667
+ throw new WaAppStateMissingKeyError(`missing snapshot key ${(0, bytes_1.bytesToHex)(keyId)} for ${collection}`, keyId, collection);
668
+ }
513
669
  }
514
670
  const indexValueMap = new Map();
515
671
  const mutations = [];
516
672
  const decryptedRecords = await this.decryptSnapshotRecords(collection, snapshot);
517
673
  for (const { decrypted, recordKeyId } of decryptedRecords) {
518
- const indexMacHex = (0, bytes_2.bytesToHex)(decrypted.indexMac);
674
+ const indexMacHex = (0, bytes_1.bytesToHex)(decrypted.indexMac);
519
675
  indexValueMap.set(indexMacHex, decrypted.valueMac);
520
676
  mutations.push({
521
677
  collection,
@@ -537,9 +693,11 @@ class WaAppStateSyncClient {
537
693
  ltHashInputIndex += 1;
538
694
  }
539
695
  const ltHash = await this.crypto.ltHashAdd(constants_1.APP_STATE_EMPTY_LT_HASH, ltHashInput);
540
- const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
541
- if (!(0, bytes_2.uint8Equal)(expectedSnapshotMac, snapshot.mac)) {
542
- throw new Error(`snapshot MAC mismatch for ${collection}`);
696
+ if (keyData !== null) {
697
+ const expectedSnapshotMac = await this.crypto.generateSnapshotMac(keyData, ltHash, version, collection);
698
+ if (!(0, bytes_1.uint8TimingSafeEqual)(expectedSnapshotMac, snapshot.mac)) {
699
+ throw new Error(`snapshot MAC mismatch for ${collection}`);
700
+ }
543
701
  }
544
702
  this.setCollectionState(collection, version, ltHash, indexValueMap);
545
703
  return mutations;
@@ -550,10 +708,13 @@ class WaAppStateSyncClient {
550
708
  if (current.version !== patchVersion - 1) {
551
709
  throw new Error(`patch version mismatch for ${collection}: local=${current.version}, incoming=${patchVersion}`);
552
710
  }
553
- const patchKeyId = (0, bytes_1.decodeProtoBytes)(patch.keyId?.id, `patch.keyId.id (${collection})`);
554
- const patchKeyData = await this.getKeyData(patchKeyId);
555
- if (!patchKeyData) {
556
- throw new WaAppStateMissingKeyError(`missing patch key ${(0, bytes_2.bytesToHex)(patchKeyId)} for ${collection}`, patchKeyId, collection);
711
+ let patchKeyData = null;
712
+ if (!this.crypto.isMacVerificationSkipped) {
713
+ const patchKeyId = (0, bytes_1.decodeProtoBytes)(patch.keyId?.id, `patch.keyId.id (${collection})`);
714
+ patchKeyData = await this.getKeyData(patchKeyId);
715
+ if (!patchKeyData) {
716
+ throw new WaAppStateMissingKeyError(`missing patch key ${(0, bytes_1.bytesToHex)(patchKeyId)} for ${collection}`, patchKeyId, collection);
717
+ }
557
718
  }
558
719
  const decryptedMutations = await this.decryptPatchMutations(collection, patch);
559
720
  const macMutations = new Array(decryptedMutations.length);
@@ -568,7 +729,9 @@ class WaAppStateSyncClient {
568
729
  };
569
730
  }
570
731
  const nextState = await this.computeNextCollectionState(current.hash, current.indexValueMap, macMutations, collection);
571
- await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
732
+ if (patchKeyData !== null) {
733
+ await this.assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextState.hash, valueMacs);
734
+ }
572
735
  this.setCollectionState(collection, patchVersion, nextState.hash, nextState.indexValueMap);
573
736
  return decryptedMutations;
574
737
  }
@@ -593,7 +756,7 @@ class WaAppStateSyncClient {
593
756
  decryptTasks[i] = (async () => {
594
757
  const recordKeyData = await this.getKeyData(recordKeyId);
595
758
  if (!recordKeyData) {
596
- throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${(0, bytes_2.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
759
+ throw new WaAppStateMissingKeyError(`missing snapshot mutation key ${(0, bytes_1.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
597
760
  }
598
761
  const decrypted = await this.crypto.decryptMutation({
599
762
  operation: _proto_1.proto.SyncdMutation.SyncdOperation.SET,
@@ -640,7 +803,7 @@ class WaAppStateSyncClient {
640
803
  decryptTasks[i] = (async () => {
641
804
  const recordKeyData = await this.getKeyData(recordKeyId);
642
805
  if (!recordKeyData) {
643
- throw new WaAppStateMissingKeyError(`missing mutation key ${(0, bytes_2.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
806
+ throw new WaAppStateMissingKeyError(`missing mutation key ${(0, bytes_1.bytesToHex)(recordKeyId)} for ${collection}`, recordKeyId, collection);
644
807
  }
645
808
  const decrypted = await this.crypto.decryptMutation({
646
809
  operation: operationCode,
@@ -671,12 +834,16 @@ class WaAppStateSyncClient {
671
834
  async assertPatchMacsMatch(patch, collection, patchKeyData, patchVersion, nextHash, valueMacs) {
672
835
  const snapshotMac = (0, bytes_1.decodeProtoBytes)(patch.snapshotMac, `patch.snapshotMac (${collection})`);
673
836
  const expectedSnapshotMac = await this.crypto.generateSnapshotMac(patchKeyData, nextHash, patchVersion, collection);
674
- if (!(0, bytes_2.uint8Equal)(expectedSnapshotMac, snapshotMac)) {
675
- throw new Error(`patch snapshot MAC mismatch for ${collection}`);
837
+ // non-fatal: wa-mob/wa-web tolerate this – patchMac below covers payload integrity.
838
+ if (!(0, bytes_1.uint8TimingSafeEqual)(expectedSnapshotMac, snapshotMac)) {
839
+ this.logger.debug('patch snapshot MAC mismatch (tolerated)', {
840
+ collection,
841
+ patchVersion
842
+ });
676
843
  }
677
844
  const patchMac = (0, bytes_1.decodeProtoBytes)(patch.patchMac, `patch.patchMac (${collection})`);
678
845
  const expectedPatchMac = await this.crypto.generatePatchMac(patchKeyData, snapshotMac, valueMacs, patchVersion, collection);
679
- if (!(0, bytes_2.uint8Equal)(expectedPatchMac, patchMac)) {
846
+ if (!(0, bytes_1.uint8TimingSafeEqual)(expectedPatchMac, patchMac)) {
680
847
  throw new Error(`patch MAC mismatch for ${collection}`);
681
848
  }
682
849
  }
@@ -685,7 +852,7 @@ class WaAppStateSyncClient {
685
852
  throw new WaAppStateMissingKeyError(`no sync key available to upload ${collection}`, null, collection);
686
853
  }
687
854
  const encryptedResults = await Promise.all(pendingMutations.map(async (mutation) => {
688
- const value = mutation.operation === 'set' ? mutation.value : mutation.previousValue;
855
+ const value = mutation.operation === 'set' ? mutation.value : null;
689
856
  const operationCode = mutation.operation === 'remove'
690
857
  ? _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE
691
858
  : _proto_1.proto.SyncdMutation.SyncdOperation.SET;
@@ -724,14 +891,12 @@ class WaAppStateSyncClient {
724
891
  const snapshotMac = await this.crypto.generateSnapshotMac(activeKey.keyData, nextState.hash, patchVersion, collection);
725
892
  const patchMac = await this.crypto.generatePatchMac(activeKey.keyData, snapshotMac, valueMacs, patchVersion, collection);
726
893
  const deviceIndex = this.resolveDeviceIndex();
727
- const clientDebugData = this.buildPatchClientDebugData();
728
894
  const encodedPatch = _proto_1.proto.SyncdPatch.encode({
729
895
  mutations: encryptedMutations,
730
896
  snapshotMac,
731
897
  patchMac,
732
898
  keyId: { id: activeKey.keyId },
733
- ...(deviceIndex === undefined ? {} : { deviceIndex }),
734
- clientDebugData
899
+ ...(deviceIndex === undefined ? {} : { deviceIndex })
735
900
  }).finish();
736
901
  return {
737
902
  encodedPatch,
@@ -759,19 +924,13 @@ class WaAppStateSyncClient {
759
924
  return undefined;
760
925
  }
761
926
  }
762
- buildPatchClientDebugData() {
763
- return _proto_1.proto.PatchDebugData.encode({
764
- isSenderPrimary: false,
765
- senderPlatform: _proto_1.proto.PatchDebugData.Platform.WEB
766
- }).finish();
767
- }
768
927
  async computeNextCollectionState(baseHash, baseMap, mutations, collection) {
769
928
  const indexValueMap = new Map(baseMap);
770
929
  const addValues = [];
771
930
  const removeValues = [];
772
931
  let missingRemoveCount = 0;
773
932
  for (const mutation of mutations) {
774
- const indexMacHex = (0, bytes_2.bytesToHex)(mutation.indexMac);
933
+ const indexMacHex = (0, bytes_1.bytesToHex)(mutation.indexMac);
775
934
  const existing = indexValueMap.get(indexMacHex);
776
935
  if (mutation.operation === _proto_1.proto.SyncdMutation.SyncdOperation.REMOVE) {
777
936
  if (!existing) {
@@ -805,8 +964,7 @@ class WaAppStateSyncClient {
805
964
  return (0, primitives_1.longToNumber)(value);
806
965
  }
807
966
  catch (error) {
808
- const reason = error instanceof Error ? error.message : String(error);
809
- throw new Error(`invalid ${field}: ${reason}`);
967
+ throw new Error(`invalid ${field}: ${(0, primitives_1.toError)(error).message}`);
810
968
  }
811
969
  }
812
970
  groupPendingMutations(pendingMutations) {
@@ -845,7 +1003,7 @@ class WaAppStateSyncClient {
845
1003
  const missingKeyHexes = new Set();
846
1004
  for (let index = 0; index < keyIds.length; index += 1) {
847
1005
  const keyId = keyIds[index];
848
- const keyHex = (0, bytes_2.bytesToHex)(keyId);
1006
+ const keyHex = (0, bytes_1.bytesToHex)(keyId);
849
1007
  if (context.keys.has(keyHex) || missingKeyHexes.has(keyHex)) {
850
1008
  continue;
851
1009
  }
@@ -857,12 +1015,12 @@ class WaAppStateSyncClient {
857
1015
  }
858
1016
  const loadedKeyData = await this.store.getSyncKeyDataBatch(missingKeyIds);
859
1017
  for (let index = 0; index < missingKeyIds.length; index += 1) {
860
- context.keys.set((0, bytes_2.bytesToHex)(missingKeyIds[index]), loadedKeyData[index] ?? null);
1018
+ context.keys.set((0, bytes_1.bytesToHex)(missingKeyIds[index]), loadedKeyData[index] ?? null);
861
1019
  }
862
1020
  }
863
1021
  async getKeyData(keyId) {
864
1022
  const context = this.requireSyncContext();
865
- const keyHex = (0, bytes_2.bytesToHex)(keyId);
1023
+ const keyHex = (0, bytes_1.bytesToHex)(keyId);
866
1024
  if (context.keys.has(keyHex)) {
867
1025
  return context.keys.get(keyHex) ?? null;
868
1026
  }
@@ -7,17 +7,29 @@ exports.downloadExternalBlobReference = downloadExternalBlobReference;
7
7
  const constants_1 = require("../protocol/constants");
8
8
  const bytes_1 = require("../util/bytes");
9
9
  const APP_STATE_COLLECTION_NAMES = new Set(Object.values(constants_1.WA_APP_STATE_COLLECTIONS));
10
+ /**
11
+ * Returns `value` typed as a known {@link AppStateCollectionName}, or `null`
12
+ * when the string is unrecognized.
13
+ */
10
14
  function parseCollectionName(value) {
11
15
  return value && APP_STATE_COLLECTION_NAMES.has(value) ? value : null;
12
16
  }
13
17
  function keyDeviceId(keyId) {
14
18
  return keyId.byteLength < 6 ? null : (keyId[0] << 8) | keyId[1];
15
19
  }
20
+ /**
21
+ * Reads the 32-bit big-endian epoch encoded in bytes 2..5 of an app-state key id.
22
+ * Returns `-1` when the key id is too short.
23
+ */
16
24
  function keyEpoch(keyId) {
17
25
  return keyId.byteLength < 6
18
26
  ? -1
19
27
  : keyId[2] * 16777216 + keyId[3] * 65536 + keyId[4] * 256 + keyId[5];
20
28
  }
29
+ /**
30
+ * Picks the highest-epoch app-state sync key from `keys`. Ties are broken by
31
+ * the lower device id. Returns `null` when the iterable is empty.
32
+ */
21
33
  function pickActiveSyncKey(keys) {
22
34
  let active = null;
23
35
  for (const key of keys) {
@@ -42,6 +54,10 @@ function pickActiveSyncKey(keys) {
42
54
  }
43
55
  return active;
44
56
  }
57
+ /**
58
+ * Downloads and decrypts an external app-state blob via the media transfer
59
+ * client. Throws when the reference is missing required fields.
60
+ */
45
61
  async function downloadExternalBlobReference(mediaTransfer, reference) {
46
62
  if (!reference.directPath) {
47
63
  throw new Error('external blob reference is missing directPath');