zapo-js 0.3.0 → 1.0.1

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 (781) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -178
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +20 -8
  12. package/dist/auth/pairing/WaPairingFlow.js +35 -26
  13. package/dist/auth/pairing/pairing-code-crypto.js +17 -19
  14. package/dist/client/WaClient.js +343 -474
  15. package/dist/client/WaClientFactory.js +281 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  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 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  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 +685 -207
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +257 -126
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +8 -9
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +163 -6
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +93 -44
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +4 -18
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +282 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +8 -9
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +158 -8
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +92 -43
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +69 -20
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +8 -1
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/locks/pre-key.lock.js +4 -1
  245. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  246. package/dist/esm/store/memory/auth.store.js +24 -0
  247. package/dist/esm/store/memory/contact.store.js +79 -0
  248. package/dist/esm/store/memory/device-list.store.js +103 -0
  249. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  250. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  251. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  252. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  254. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  255. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  256. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  258. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  259. package/dist/esm/store/noop.store.js +6 -4
  260. package/dist/esm/transport/WaComms.js +14 -5
  261. package/dist/esm/transport/WaWebSocket.js +32 -8
  262. package/dist/esm/transport/binary/constants.js +10 -4
  263. package/dist/esm/transport/binary/decoder.js +21 -15
  264. package/dist/esm/transport/binary/encoder.js +96 -21
  265. package/dist/esm/transport/binary/tokens.js +12 -12
  266. package/dist/esm/transport/index.js +1 -0
  267. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  268. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  269. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  270. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  271. package/dist/esm/transport/node/builders/abprops.js +2 -2
  272. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  273. package/dist/esm/transport/node/builders/bot.js +38 -0
  274. package/dist/esm/transport/node/builders/business.js +30 -30
  275. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  276. package/dist/esm/transport/node/builders/community.js +53 -0
  277. package/dist/esm/transport/node/builders/device.js +2 -2
  278. package/dist/esm/transport/node/builders/email.js +6 -5
  279. package/dist/esm/transport/node/builders/global.js +1 -1
  280. package/dist/esm/transport/node/builders/group.js +114 -4
  281. package/dist/esm/transport/node/builders/media.js +2 -2
  282. package/dist/esm/transport/node/builders/message.js +83 -49
  283. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  284. package/dist/esm/transport/node/builders/passive.js +7 -0
  285. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  286. package/dist/esm/transport/node/builders/presence.js +27 -1
  287. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  288. package/dist/esm/transport/node/builders/privacy.js +6 -6
  289. package/dist/esm/transport/node/builders/profile.js +28 -8
  290. package/dist/esm/transport/node/builders/tos.js +58 -0
  291. package/dist/esm/transport/node/builders/usync.js +51 -2
  292. package/dist/esm/transport/node/helpers.js +3 -1
  293. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  294. package/dist/esm/transport/node/mex/client.js +22 -0
  295. package/dist/esm/transport/node/query.js +17 -0
  296. package/dist/esm/transport/node/usync.js +12 -0
  297. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  298. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  300. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  301. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  302. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  303. package/dist/esm/transport/noise/constants.js +0 -1
  304. package/dist/esm/transport/proxy.js +5 -0
  305. package/dist/esm/transport/stream/parse.js +3 -7
  306. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  307. package/dist/esm/util/async.js +4 -0
  308. package/dist/esm/util/bytes.js +37 -2
  309. package/dist/esm/util/clock.js +15 -0
  310. package/dist/esm/util/coercion.js +45 -3
  311. package/dist/esm/util/collections.js +11 -0
  312. package/dist/esm/util/index.js +2 -2
  313. package/dist/esm/util/primitives.js +19 -0
  314. package/dist/esm/util/runtime.js +5 -0
  315. package/dist/esm/version-spec.js +1 -0
  316. package/dist/index.js +35 -5
  317. package/dist/infra/log/ConsoleLogger.js +30 -6
  318. package/dist/infra/log/PinoLogger.js +64 -0
  319. package/dist/infra/log/types.js +4 -2
  320. package/dist/infra/perf/BackgroundQueue.js +55 -13
  321. package/dist/media/constants.js +34 -3
  322. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  323. package/dist/media/index.js +9 -4
  324. package/dist/media/sticker/sticker-pack.js +136 -0
  325. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  326. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  327. package/dist/message/WaMessageClient.js +46 -15
  328. package/dist/message/addons/link-preview/builder.js +39 -0
  329. package/dist/message/addons/link-preview/detect.js +58 -0
  330. package/dist/message/addons/link-preview/fetcher.js +394 -0
  331. package/dist/message/addons/link-preview/types.js +2 -0
  332. package/dist/message/context-info.js +129 -0
  333. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  334. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  335. package/dist/message/crypto/phash.js +136 -0
  336. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  337. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  338. package/dist/message/{content.js → encode/content.js} +192 -7
  339. package/dist/message/encode/media-payload.js +45 -0
  340. package/dist/message/{padding.js → encode/padding.js} +9 -3
  341. package/dist/message/index.js +2 -2
  342. package/dist/message/kinds/bot.js +120 -0
  343. package/dist/message/kinds/newsletter.js +248 -0
  344. package/dist/message/kinds/sticker-pack.js +34 -0
  345. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  346. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  347. package/dist/message/primitives/peer-data-operation.js +96 -0
  348. package/dist/mex.js +6 -0
  349. package/dist/proto.js +1 -1
  350. package/dist/protocol/abprops.js +10 -0
  351. package/dist/protocol/appstate.js +7 -31
  352. package/dist/protocol/auth.js +3 -2
  353. package/dist/protocol/bot.js +81 -0
  354. package/dist/protocol/browser.js +8 -0
  355. package/dist/protocol/business.js +22 -0
  356. package/dist/protocol/call.js +51 -0
  357. package/dist/protocol/constants.js +39 -3
  358. package/dist/protocol/defaults.js +3 -0
  359. package/dist/protocol/index.js +12 -3
  360. package/dist/protocol/jid.js +107 -5
  361. package/dist/protocol/media.js +25 -12
  362. package/dist/protocol/message.js +4 -1
  363. package/dist/protocol/newsletter.js +64 -0
  364. package/dist/protocol/nodes.js +22 -2
  365. package/dist/protocol/notification.js +19 -3
  366. package/dist/protocol/presence.js +16 -0
  367. package/dist/protocol/status.js +9 -0
  368. package/dist/retry/codec.js +5 -0
  369. package/dist/retry/parse.js +16 -34
  370. package/dist/retry/reason.js +5 -0
  371. package/dist/retry/replay.js +130 -36
  372. package/dist/retry/tracker.js +3 -7
  373. package/dist/signal/api/SignalDeviceSyncApi.js +67 -18
  374. package/dist/signal/api/SignalDigestSyncApi.js +7 -2
  375. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  376. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  377. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  378. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  379. package/dist/signal/api/codec.js +52 -0
  380. package/dist/signal/api/prekeys.js +4 -0
  381. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +6 -8
  382. package/dist/signal/constants.js +4 -1
  383. package/dist/signal/encoding.js +5 -303
  384. package/dist/signal/group/SenderKeyChain.js +18 -33
  385. package/dist/signal/group/SenderKeyCodec.js +2 -2
  386. package/dist/signal/group/SenderKeyManager.js +26 -9
  387. package/dist/signal/group/encoding.js +101 -0
  388. package/dist/signal/index.js +13 -10
  389. package/dist/signal/registration/encoding.js +39 -0
  390. package/dist/signal/registration/keygen.js +11 -1
  391. package/dist/signal/registration/utils.js +8 -1
  392. package/dist/signal/session/SignalProtocol.js +113 -11
  393. package/dist/signal/session/SignalRatchet.js +26 -56
  394. package/dist/signal/session/SignalSerializer.js +2 -2
  395. package/dist/signal/session/SignalSession.js +7 -15
  396. package/dist/signal/session/encoding.js +183 -0
  397. package/dist/signal/session/resolver.js +139 -30
  398. package/dist/store/cache/identity.cache.js +78 -0
  399. package/dist/store/cache/privacy-token.cache.js +60 -0
  400. package/dist/store/cache/sender-key.cache.js +104 -0
  401. package/dist/store/cache/session.cache.js +95 -0
  402. package/dist/store/contracts/group-metadata.store.js +2 -0
  403. package/dist/store/createStore.js +90 -36
  404. package/dist/store/index.js +18 -16
  405. package/dist/store/locks/contact.lock.js +1 -0
  406. package/dist/store/locks/device-list.lock.js +1 -0
  407. package/dist/store/locks/group-metadata.lock.js +23 -0
  408. package/dist/store/locks/pre-key.lock.js +4 -1
  409. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  410. package/dist/store/memory/auth.store.js +28 -0
  411. package/dist/store/memory/contact.store.js +83 -0
  412. package/dist/store/memory/device-list.store.js +107 -0
  413. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  414. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  415. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  416. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  417. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  418. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  419. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  420. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  421. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  422. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  423. package/dist/store/noop.store.js +7 -5
  424. package/dist/transport/WaComms.js +14 -5
  425. package/dist/transport/WaWebSocket.js +32 -8
  426. package/dist/transport/binary/constants.js +11 -5
  427. package/dist/transport/binary/decoder.js +24 -18
  428. package/dist/transport/binary/encoder.js +109 -34
  429. package/dist/transport/binary/tokens.js +12 -12
  430. package/dist/transport/index.js +3 -1
  431. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  432. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  433. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  434. package/dist/transport/node/WaNodeTransport.js +13 -0
  435. package/dist/transport/node/builders/abprops.js +1 -1
  436. package/dist/transport/node/builders/account-sync.js +7 -16
  437. package/dist/transport/node/builders/bot.js +43 -0
  438. package/dist/transport/node/builders/business.js +31 -31
  439. package/dist/transport/node/builders/chatstate.js +31 -0
  440. package/dist/transport/node/builders/community.js +59 -0
  441. package/dist/transport/node/builders/device.js +1 -1
  442. package/dist/transport/node/builders/email.js +6 -5
  443. package/dist/transport/node/builders/global.js +2 -2
  444. package/dist/transport/node/builders/group.js +121 -3
  445. package/dist/transport/node/builders/media.js +1 -1
  446. package/dist/transport/node/builders/message.js +84 -49
  447. package/dist/transport/node/builders/newsletter.js +183 -0
  448. package/dist/transport/node/builders/passive.js +10 -0
  449. package/dist/transport/node/builders/prekeys.js +3 -3
  450. package/dist/transport/node/builders/presence.js +28 -1
  451. package/dist/transport/node/builders/privacy-token.js +1 -1
  452. package/dist/transport/node/builders/privacy.js +5 -5
  453. package/dist/transport/node/builders/profile.js +30 -7
  454. package/dist/transport/node/builders/tos.js +63 -0
  455. package/dist/transport/node/builders/usync.js +52 -1
  456. package/dist/transport/node/helpers.js +3 -2
  457. package/dist/transport/node/mex/argo-decoder.js +2 -2
  458. package/dist/transport/node/mex/client.js +23 -0
  459. package/dist/transport/node/query.js +17 -0
  460. package/dist/transport/node/usync.js +13 -0
  461. package/dist/transport/noise/WaClientPayload.js +9 -9
  462. package/dist/transport/noise/WaMobileClientPayload.js +6 -1
  463. package/dist/transport/noise/WaNoiseCert.js +7 -2
  464. package/dist/transport/noise/WaNoiseHandshake.js +26 -24
  465. package/dist/transport/noise/WaNoiseSession.js +41 -61
  466. package/dist/transport/noise/WaNoiseSocket.js +19 -13
  467. package/dist/transport/noise/constants.js +1 -2
  468. package/dist/transport/proxy.js +5 -0
  469. package/dist/transport/stream/parse.js +3 -7
  470. package/dist/transport/wa-web-version-fetcher.js +94 -0
  471. package/dist/types/appstate/constants.d.ts +1 -1
  472. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  473. package/dist/types/appstate/index.d.ts +5 -5
  474. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  475. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  476. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  477. package/dist/types/appstate/types.d.ts +1 -1
  478. package/dist/types/appstate/utils.d.ts +18 -2
  479. package/dist/types/appstate-spec.d.ts +24 -0
  480. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  481. package/dist/types/auth/credentials-flow.d.ts +4 -3
  482. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  483. package/dist/types/auth/types.d.ts +49 -2
  484. package/dist/types/client/WaClient.d.ts +178 -71
  485. package/dist/types/client/WaClientFactory.d.ts +30 -5
  486. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  487. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  488. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  489. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  490. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  491. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  492. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  493. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  494. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  495. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  496. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  497. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +55 -32
  498. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  499. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  500. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  501. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  502. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  503. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  504. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  505. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  506. package/dist/types/client/events/abprops.d.ts +2 -1
  507. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  508. package/dist/types/client/events/business.d.ts +10 -0
  509. package/dist/types/client/events/call.d.ts +31 -0
  510. package/dist/types/client/events/chatstate.d.ts +9 -0
  511. package/dist/types/client/events/devices.d.ts +5 -4
  512. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  513. package/dist/types/client/events/group.d.ts +2 -1
  514. package/dist/types/client/events/identity.d.ts +2 -1
  515. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  516. package/dist/types/client/events/mex-notification.d.ts +6 -0
  517. package/dist/types/client/events/picture.d.ts +8 -0
  518. package/dist/types/client/events/presence.d.ts +28 -0
  519. package/dist/types/client/events/receipt.d.ts +14 -0
  520. package/dist/types/client/events/registration.d.ts +4 -3
  521. package/dist/types/client/index.d.ts +1 -1
  522. package/dist/types/client/media.d.ts +35 -1
  523. package/dist/types/client/messaging/fanout.d.ts +2 -2
  524. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  525. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  526. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  527. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  528. package/dist/types/client/messaging/messages.d.ts +28 -0
  529. package/dist/types/client/newsletter/admin.d.ts +71 -0
  530. package/dist/types/client/newsletter/content.d.ts +42 -0
  531. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  532. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  533. package/dist/types/client/newsletter/mex.d.ts +14 -0
  534. package/dist/types/client/newsletter/parse.d.ts +19 -0
  535. package/dist/types/client/newsletter/types.d.ts +190 -0
  536. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  537. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  538. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  539. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  540. package/dist/types/client/types.d.ts +844 -72
  541. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  542. package/dist/types/crypto/core/index.d.ts +2 -2
  543. package/dist/types/crypto/core/keys.d.ts +0 -4
  544. package/dist/types/crypto/core/nonce.d.ts +4 -5
  545. package/dist/types/crypto/core/primitives.d.ts +31 -20
  546. package/dist/types/crypto/core/random.d.ts +6 -0
  547. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  548. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  549. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  550. package/dist/types/crypto/curves/constants.d.ts +4 -3
  551. package/dist/types/crypto/curves/types.d.ts +0 -5
  552. package/dist/types/crypto/math/constants.d.ts +0 -1
  553. package/dist/types/crypto/math/mod.d.ts +0 -1
  554. package/dist/types/index.d.ts +34 -8
  555. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  556. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  557. package/dist/types/infra/log/types.d.ts +6 -0
  558. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  559. package/dist/types/media/constants.d.ts +7 -2
  560. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  561. package/dist/types/media/index.d.ts +7 -5
  562. package/dist/types/media/processor.d.ts +27 -5
  563. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  564. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  565. package/dist/types/media/transfer/conn.d.ts +7 -0
  566. package/dist/types/media/types.d.ts +1 -2
  567. package/dist/types/message/WaMessageClient.d.ts +14 -0
  568. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  569. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  570. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  571. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  572. package/dist/types/message/context-info.d.ts +66 -0
  573. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  574. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  575. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  576. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  577. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  578. package/dist/types/message/encode/content.d.ts +43 -0
  579. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  580. package/dist/types/message/encode/media-payload.d.ts +12 -0
  581. package/dist/types/message/index.d.ts +2 -2
  582. package/dist/types/message/kinds/bot.d.ts +31 -0
  583. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  584. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  585. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  586. package/dist/types/message/primitives/incoming.d.ts +21 -0
  587. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  588. package/dist/types/message/types.d.ts +209 -11
  589. package/dist/types/mex.d.ts +2 -0
  590. package/dist/types/proto.d.ts +2 -2
  591. package/dist/types/protocol/abprops.d.ts +9 -0
  592. package/dist/types/protocol/appstate.d.ts +4 -49
  593. package/dist/types/protocol/auth.d.ts +2 -2
  594. package/dist/types/protocol/bot.d.ts +45 -0
  595. package/dist/types/protocol/browser.d.ts +8 -0
  596. package/dist/types/protocol/business.d.ts +21 -0
  597. package/dist/types/protocol/call.d.ts +44 -0
  598. package/dist/types/protocol/constants.d.ts +16 -3
  599. package/dist/types/protocol/defaults.d.ts +3 -0
  600. package/dist/types/protocol/group.d.ts +1 -1
  601. package/dist/types/protocol/index.d.ts +2 -1
  602. package/dist/types/protocol/jid.d.ts +78 -0
  603. package/dist/types/protocol/media.d.ts +21 -13
  604. package/dist/types/protocol/message.d.ts +4 -0
  605. package/dist/types/protocol/newsletter.d.ts +65 -0
  606. package/dist/types/protocol/nodes.d.ts +20 -0
  607. package/dist/types/protocol/notification.d.ts +16 -0
  608. package/dist/types/protocol/presence.d.ts +16 -0
  609. package/dist/types/protocol/status.d.ts +7 -0
  610. package/dist/types/retry/codec.d.ts +5 -0
  611. package/dist/types/retry/index.d.ts +1 -1
  612. package/dist/types/retry/parse.d.ts +9 -0
  613. package/dist/types/retry/reason.d.ts +5 -0
  614. package/dist/types/retry/replay.d.ts +19 -5
  615. package/dist/types/retry/tracker.d.ts +10 -3
  616. package/dist/types/retry/types.d.ts +3 -8
  617. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  618. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  619. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  620. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  621. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  622. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  623. package/dist/types/signal/api/codec.d.ts +20 -0
  624. package/dist/types/signal/api/constants.d.ts +1 -1
  625. package/dist/types/signal/api/prekeys.d.ts +4 -0
  626. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  627. package/dist/types/signal/attestation/constants.d.ts +4 -0
  628. package/dist/types/signal/constants.d.ts +7 -4
  629. package/dist/types/signal/encoding.d.ts +6 -68
  630. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  631. package/dist/types/signal/group/SenderKeyManager.d.ts +18 -1
  632. package/dist/types/signal/group/encoding.d.ts +25 -0
  633. package/dist/types/signal/index.d.ts +4 -1
  634. package/dist/types/signal/registration/encoding.d.ts +30 -0
  635. package/dist/types/signal/registration/keygen.d.ts +10 -0
  636. package/dist/types/signal/registration/utils.d.ts +5 -0
  637. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  638. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  639. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  640. package/dist/types/signal/session/encoding.d.ts +28 -0
  641. package/dist/types/signal/session/resolver.d.ts +14 -0
  642. package/dist/types/signal/types.d.ts +1 -1
  643. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  644. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  645. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  646. package/dist/types/store/cache/session.cache.d.ts +23 -0
  647. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  648. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  649. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  650. package/dist/types/store/contracts/message.store.d.ts +0 -2
  651. package/dist/types/store/createStore.d.ts +54 -2
  652. package/dist/types/store/index.d.ts +17 -16
  653. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  654. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  655. package/dist/types/store/memory/auth.store.d.ts +18 -0
  656. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  657. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  658. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  659. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  661. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  662. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  663. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  664. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  665. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  666. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  667. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  668. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  669. package/dist/types/store/noop.store.d.ts +2 -2
  670. package/dist/types/store/types.d.ts +250 -6
  671. package/dist/types/transport/WaComms.d.ts +5 -0
  672. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  673. package/dist/types/transport/binary/constants.d.ts +8 -2
  674. package/dist/types/transport/binary/decoder.d.ts +5 -0
  675. package/dist/types/transport/binary/encoder.d.ts +5 -0
  676. package/dist/types/transport/binary/tokens.d.ts +6 -6
  677. package/dist/types/transport/index.d.ts +3 -1
  678. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  679. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  680. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  681. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  682. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  683. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  684. package/dist/types/transport/node/builders/business.d.ts +21 -4
  685. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  686. package/dist/types/transport/node/builders/community.d.ts +17 -0
  687. package/dist/types/transport/node/builders/group.d.ts +44 -2
  688. package/dist/types/transport/node/builders/message.d.ts +11 -6
  689. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  690. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  691. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  692. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  693. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  694. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  695. package/dist/types/transport/node/helpers.d.ts +1 -2
  696. package/dist/types/transport/node/mex/client.d.ts +12 -1
  697. package/dist/types/transport/node/query.d.ts +19 -1
  698. package/dist/types/transport/node/usync.d.ts +3 -0
  699. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +6 -1
  700. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  701. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  702. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  703. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  704. package/dist/types/transport/noise/constants.d.ts +4 -5
  705. package/dist/types/transport/noise/types.d.ts +1 -1
  706. package/dist/types/transport/proxy.d.ts +5 -0
  707. package/dist/types/transport/types.d.ts +14 -7
  708. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  709. package/dist/types/util/async.d.ts +4 -0
  710. package/dist/types/util/bytes.d.ts +36 -1
  711. package/dist/types/util/clock.d.ts +6 -0
  712. package/dist/types/util/coercion.d.ts +25 -0
  713. package/dist/types/util/collections.d.ts +8 -0
  714. package/dist/types/util/index.d.ts +2 -2
  715. package/dist/types/util/primitives.d.ts +11 -0
  716. package/dist/types/util/runtime.d.ts +5 -0
  717. package/dist/types/version-spec.d.ts +1 -0
  718. package/dist/util/async.js +4 -0
  719. package/dist/util/bytes.js +37 -2
  720. package/dist/util/clock.js +18 -0
  721. package/dist/util/coercion.js +48 -3
  722. package/dist/util/collections.js +12 -0
  723. package/dist/util/index.js +7 -1
  724. package/dist/util/primitives.js +20 -0
  725. package/dist/util/runtime.js +5 -0
  726. package/dist/version-spec.js +5 -0
  727. package/package.json +32 -8
  728. package/spec/appstate/index.d.ts +188 -0
  729. package/spec/appstate/index.js +850 -0
  730. package/spec/mex/index.d.ts +4172 -0
  731. package/spec/mex/index.js +261 -0
  732. package/spec/proto/index.d.ts +16305 -0
  733. package/spec/proto/index.js +1 -0
  734. package/spec/version/index.d.ts +4 -0
  735. package/spec/version/index.js +9 -0
  736. package/spec/version/version.json +3 -0
  737. package/dist/client/events/chat.js +0 -227
  738. package/dist/client/incoming.js +0 -306
  739. package/dist/client/mailbox.js +0 -66
  740. package/dist/client/messages.js +0 -305
  741. package/dist/esm/client/events/chat.js +0 -224
  742. package/dist/esm/client/incoming.js +0 -296
  743. package/dist/esm/client/mailbox.js +0 -63
  744. package/dist/esm/client/messages.js +0 -301
  745. package/dist/esm/media/WaMediaCrypto.js +0 -499
  746. package/dist/esm/message/phash.js +0 -47
  747. package/dist/esm/store/locks/participants.lock.js +0 -20
  748. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  749. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  750. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  751. package/dist/media/WaMediaCrypto.js +0 -503
  752. package/dist/message/phash.js +0 -50
  753. package/dist/store/locks/participants.lock.js +0 -23
  754. package/dist/store/providers/memory/contact.store.js +0 -32
  755. package/dist/store/providers/memory/device-list.store.js +0 -71
  756. package/dist/transport/node/mex/persist-ids.js +0 -13
  757. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  758. package/dist/types/client/events/chat.d.ts +0 -3
  759. package/dist/types/client/history-sync.d.ts +0 -20
  760. package/dist/types/client/messages.d.ts +0 -18
  761. package/dist/types/client/messaging/participants.d.ts +0 -13
  762. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  763. package/dist/types/media/conn.d.ts +0 -3
  764. package/dist/types/message/content.d.ts +0 -14
  765. package/dist/types/message/incoming.d.ts +0 -18
  766. package/dist/types/signal/crypto/constants.d.ts +0 -4
  767. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  768. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  769. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  770. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  771. package/proto/index.d.ts +0 -10903
  772. package/proto/index.js +0 -1
  773. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  774. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  775. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  776. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  777. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  778. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  779. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  780. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  781. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 vinikjkkj <contact@vinicius.email>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src=".github/assets/logo.png" alt="zapo" width="400" />
2
+ <img src="https://raw.githubusercontent.com/vinikjkkj/zapo/master/.github/assets/logo.png" alt="zapo" width="400" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -16,117 +16,55 @@
16
16
  <img alt="focus" src="https://img.shields.io/badge/focus-high--scale%20%2B%20multi--session-0A7EA4" />
17
17
  </p>
18
18
 
19
- ## Table of Contents
20
-
21
- - [Stability Notice](#stability-notice)
22
- - [What Makes This Project Different](#what-makes-this-project-different)
23
- - [Core Principles](#core-principles)
24
- - [Architecture at a Glance](#architecture-at-a-glance)
25
- - [Requirements](#requirements)
26
- - [Quick Start](#quick-start)
27
- - [Minimal Usage](#minimal-usage)
28
- - [Useful Scripts](#useful-scripts)
29
- - [Versioning and Releases](#versioning-and-releases)
30
- - [GitHub Release Notes](#github-release-notes)
31
- - [Protobuf Generation](#protobuf-generation)
32
- - [Support the Project](#support-the-project)
33
- - [Contribution Notes](#contribution-notes)
34
- - [Disclaimer](#disclaimer)
35
-
36
- ## Stability Notice
37
-
38
- > Frequent breaking changes are expected until the first major release.
39
- > If you run `zapo` in long-lived environments, pin exact versions and validate upgrades carefully.
40
-
41
- ## What Makes This Project Different
42
-
43
- `zapo` is an independent runtime implementation (not a wrapper/fork of an existing WhatsApp library).
44
-
45
- - No wrappers around third-party WhatsApp SDKs
46
- - No forks of existing WhatsApp client libraries
47
- - No copied protocol abstractions from community libraries
48
- - `WAProto.proto` is sourced from `wppconnect-team/wa-proto` and compiled locally for runtime/types
49
-
50
- The protocol source of truth is the deobfuscated WhatsApp Web.
51
- The target is behavior parity with WhatsApp Web, while improving internal performance and memory efficiency.
52
-
53
- ## Core Principles
54
-
55
- These principles drive implementation decisions:
56
-
57
- - `index-first`: validate protocol behavior against WhatsApp Web before implementing anything
58
- - `performance-first`: optimize for low CPU, low RAM, low allocations, and zero-copy in hot paths
59
- - `async-first`: I/O, network, and crypto operations are async
60
-
61
- ## Architecture at a Glance
62
-
63
- ### Patterns
64
-
65
- - Coordinator-first feature design in `src/client/coordinators/`
66
- - Pure node builders in `src/transport/node/builders/` for reusable protocol stanzas
67
- - Incoming parsers/normalizers in `src/client/events/`, with coordinators handling orchestration only
68
- - Typed store contracts in `src/store/contracts/` with `memory` and `sqlite` providers
69
- - Protocol constants in `src/protocol/` using `Object.freeze({...} as const)`
70
-
71
- ### Engineering conventions
72
-
73
- - `Uint8Array` everywhere for binary data (`Buffer` is avoided)
74
- - Zero-copy (`subarray`, byte views) in critical paths
75
- - Bounded in-memory structures to prevent unbounded growth
76
- - Path aliases (`@client`, `@crypto`, `@store`, etc.), no relative `../` imports
77
- - Named exports only, no default exports
78
- - No enums (`Object.freeze` + `as const` instead)
79
-
80
- ## Requirements
81
-
82
- - Node.js `>= 20.9.0`
83
- - npm
84
-
85
- Runtime dependencies:
86
-
87
- - Mandatory: none
19
+ <p align="center">
20
+ 📚 <strong>Documentation:</strong> <a href="https://zapo.to/">zapo.to</a> ·
21
+ 🛠 <strong>Contributing:</strong> <a href="CONTRIBUTING.md">CONTRIBUTING.md</a> ·
22
+ 💛 <strong>Sponsor:</strong> <a href="https://github.com/sponsors/vinikjkkj">GitHub Sponsors</a>
23
+ </p>
88
24
 
89
- Optional peer dependencies:
25
+ ---
90
26
 
91
- - `better-sqlite3` for SQLite-backed stores
92
- - `pino` and `pino-pretty` for structured logging
27
+ ## Stability Notice
93
28
 
94
- ## Quick Start
29
+ > `zapo-js` is stable as of `1.0.0`. The public API follows SemVer:
30
+ > breaking changes ship only in a major release; minors add features,
31
+ > patches fix bugs.
95
32
 
96
- 1. Install dependencies.
33
+ ## Install
97
34
 
98
35
  ```bash
99
- npm install
36
+ npm install zapo-js
100
37
  ```
101
38
 
102
- 2. Run the real-flow example.
39
+ Zero mandatory runtime dependencies. Pick the optional packages you need
40
+ on top: a persistent store and (optionally) the media processor for
41
+ thumbnails / voice-note metadata.
103
42
 
104
43
  ```bash
105
- npm run example
44
+ # Persistent store - choose one
45
+ npm install @zapo-js/store-sqlite better-sqlite3
46
+ # or @zapo-js/store-redis ioredis
47
+ # or @zapo-js/store-postgres pg
48
+ # or @zapo-js/store-mysql mysql2
49
+ # or @zapo-js/store-mongo mongodb
50
+
51
+ # Optional - thumbnails + waveforms + voice-note normalization
52
+ npm install @zapo-js/media-utils sharp
53
+ # plus a system `ffmpeg` + `ffprobe` on PATH (see media-utils README)
54
+
55
+ # Optional - structured logging
56
+ npm install pino pino-pretty
106
57
  ```
107
58
 
108
- 3. Scan the QR code emitted by `auth_qr`.
109
- 4. Send `ping` to the connected session, the example replies with `pong`.
110
-
111
- Auth state is persisted in `.auth/state.sqlite`.
112
-
113
- ## Minimal Usage
59
+ ## Quick Start
114
60
 
115
61
  ```ts
116
- import { createPinoLogger, createStore, WaClient } from 'zapo-js'
62
+ import { ConsoleLogger, createStore, WaClient } from 'zapo-js'
117
63
  import { createSqliteStore } from '@zapo-js/store-sqlite'
118
64
 
119
- const logger = await createPinoLogger({
120
- level: 'info',
121
- pretty: true
122
- })
123
-
124
65
  const store = createStore({
125
66
  backends: {
126
- sqlite: createSqliteStore({
127
- path: '.auth/state.sqlite',
128
- driver: 'auto'
129
- })
67
+ sqlite: createSqliteStore({ path: '.auth/state.sqlite' })
130
68
  },
131
69
  providers: {
132
70
  auth: 'sqlite',
@@ -136,117 +74,99 @@ const store = createStore({
136
74
  identity: 'sqlite',
137
75
  senderKey: 'sqlite',
138
76
  appState: 'sqlite',
139
- messages: 'sqlite',
140
- threads: 'sqlite',
141
- contacts: 'sqlite'
77
+ privacyToken: 'sqlite',
78
+ messages: 'sqlite', // 'none' to skip the message archive
79
+ threads: 'sqlite', // 'none' to skip
80
+ contacts: 'sqlite' // 'none' to skip
142
81
  }
143
82
  })
144
83
 
145
- const client = new WaClient(
146
- {
147
- store,
148
- sessionId: 'default',
149
- connectTimeoutMs: 15_000,
150
- nodeQueryTimeoutMs: 30_000,
151
- history: {
152
- enabled: true,
153
- requireFullSync: true
154
- }
155
- },
156
- logger
157
- )
84
+ const client = new WaClient({ store, sessionId: 'default' }, new ConsoleLogger('info'))
158
85
 
159
- client.on('auth_qr', ({ qr, ttlMs }) => {
160
- console.log('qr', { qr, ttlMs })
86
+ client.on('auth_qr', ({ qr }) => {
87
+ console.log('scan this:', qr)
161
88
  })
162
89
 
163
- client.on('message', (event) => {
164
- console.log('incoming', {
165
- chatJid: event.chatJid,
166
- senderJid: event.senderJid
167
- })
90
+ client.on('auth_paired', ({ credentials }) => {
91
+ console.log('paired as', credentials.meJid)
92
+ })
93
+
94
+ client.on('message', async (event) => {
95
+ if (event.message?.conversation === 'ping') {
96
+ await client.message.send(event.key.remoteJid, 'pong')
97
+ }
168
98
  })
169
99
 
170
100
  await client.connect()
171
101
  ```
172
102
 
173
- ## Useful Scripts
174
-
175
- - `npm run build` - build CJS, ESM, and types
176
- - `npm run test` - run unit tests (non-flow)
177
- - `npm run test:flow` - run real-flow tests
178
- - `npm run test:coverage` - run coverage report
179
- - `npm run typecheck` - type-check project
180
- - `npm run lint` - lint source files
181
- - `npm run format` - format codebase
182
- - `npm run proto:generate` - regenerate protobuf runtime/types from `proto/WAProto.proto`
183
- - `npm run changeset` - create a versioning entry (`patch`/`minor`/`major`)
184
- - `npm run changeset:status` - show pending versioning entries
185
- - `npm run version:packages` - apply pending versions and update `CHANGELOG.md`
186
- - `npm run release:publish` - build and publish to npm with Changesets
103
+ That's the minimum to pair, listen for messages, and reply. For everything
104
+ else - sending media, reactions, polls, groups, newsletters, app-state
105
+ mutations, business profile, events catalog, store providers, the typed
106
+ event map, and the architectural reasoning - read the guides at
107
+ **[zapo.to](https://zapo.to/)**.
187
108
 
188
- ## Versioning and Releases
109
+ ## Packages
189
110
 
190
- Versioning is managed with [Changesets](https://github.com/changesets/changesets).
111
+ The core lives at the repo root (`zapo-js`). Optional packages live in
112
+ [`packages/`](packages/) and ship under the `@zapo-js/*` scope. Install
113
+ only what you need.
191
114
 
192
- Release flow:
115
+ | Package | Peer dependency | Purpose |
116
+ | ---------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
117
+ | [`@zapo-js/store-sqlite`](packages/store-sqlite) | `better-sqlite3` | SQLite persistent store (single-process bots, dev sessions, small-to-medium prod). |
118
+ | [`@zapo-js/store-redis`](packages/store-redis) | `ioredis` | Redis-backed store with native TTL eviction. |
119
+ | [`@zapo-js/store-mongo`](packages/store-mongo) | `mongodb` | MongoDB-backed store with TTL-index eviction. |
120
+ | [`@zapo-js/store-mysql`](packages/store-mysql) | `mysql2` | MySQL / MariaDB-backed store with background cleanup poller. |
121
+ | [`@zapo-js/store-postgres`](packages/store-postgres) | `pg` | PostgreSQL-backed store with background cleanup poller. |
122
+ | [`@zapo-js/media-utils`](packages/media-utils) | `sharp` + `ffmpeg` | `WaMediaProcessor`: thumbnails, waveforms, voice-note normalization. |
123
+ | [`@zapo-js/fake-server`](packages/fake-server) | (none) | In-process fake WhatsApp Web server for end-to-end testing. |
124
+ | [`@zapo-js/mcp-server`](packages/mcp-server) | `@modelcontextprotocol/sdk` | **Dev-only.** MCP server exposing multi-session `WaClient`s as dynamic tools for an LLM agent (Claude Code / Cursor / etc.). Not for production. |
193
125
 
194
- ```bash
195
- npm run changeset
196
- npm run changeset:status
197
- npm run version:packages
198
- npm run release:publish
199
- ```
200
-
201
- Notes:
126
+ Each package's README has the install + config + integration notes.
202
127
 
203
- - Changesets are stored in `.changeset/*.md`
204
- - Multiple changesets are merged automatically into the next release
205
- - SemVer is manual and intentional: `patch`, `minor`, `major`
128
+ ## Documentation
206
129
 
207
- ## GitHub Release Notes
130
+ - **[zapo.to](https://zapo.to/)** - guides, full API reference, examples,
131
+ protocol notes ([llms.txt](https://zapo.to/llms.txt) index or
132
+ [llms-full.txt](https://zapo.to/llms-full.txt) for LLM context)
133
+ - **[`vinikjkkj/zapo-docs`](https://github.com/vinikjkkj/zapo-docs)** -
134
+ source of zapo.to (open issues/PRs there for doc fixes)
135
+ - **Per-package READMEs** under [`packages/`](packages/) - one per
136
+ optional package
137
+ - **[`AGENTS.md`](AGENTS.md)** - architecture spec + coding rules
138
+ (contributor-facing)
208
139
 
209
- Release notes are generated automatically (including grouped changes and contributors) when a version tag is pushed.
140
+ ## Contributing
210
141
 
211
- - Workflow: `.github/workflows/github-release.yml`
212
- - Categories config: `.github/release.yml`
142
+ Pull requests are welcome. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for
143
+ setup, repo layout, CI, release flow, and the conventions PRs must follow.
213
144
 
214
- Trigger example:
215
-
216
- ```bash
217
- git tag v0.1.1
218
- git push origin v0.1.1
219
- ```
145
+ Contributors also agree to the [Code of Conduct](CODE_OF_CONDUCT.md),
146
+ which includes an **AI-Assisted Contributions** policy covering
147
+ disclosure, human ownership, and the rule against bundle-hallucinated
148
+ protocol claims.
220
149
 
221
- If the tag contains `-` (example: `v0.2.0-rc.1`), the release is marked as prerelease.
150
+ ## Security
222
151
 
223
- ## Protobuf Generation
152
+ Found a vulnerability in the crypto, auth, or Signal layer? Please
153
+ **do not open a public issue**. Report it privately via
154
+ [GitHub Security Advisories](https://github.com/vinikjkkj/zapo/security/advisories/new)
155
+ or email `contact@vinicius.email`. Scope, response window, and
156
+ disclosure timeline are documented in [`SECURITY.md`](SECURITY.md).
224
157
 
225
- `WAProto.proto` source: https://github.com/wppconnect-team/wa-proto
158
+ ## License
226
159
 
227
- `npm run proto:generate` runs `scripts/generate-proto.cjs`, which:
228
-
229
- - Ensures proto tooling dependencies are installed in `proto/`
230
- - Generates and minifies `proto/index.js`
231
- - Regenerates compact typings at `proto/index.d.ts`
160
+ [MIT](LICENSE) © vinikjkkj
232
161
 
233
162
  ## Support the Project
234
163
 
235
- If `zapo` is useful in your production or study setup, you can support ongoing development on GitHub Sponsors:
236
-
237
- - https://github.com/sponsors/vinikjkkj
238
-
239
- ## Contribution Notes
240
-
241
- Before opening a PR:
242
-
243
- - Validate behavior against WhatsApp Web
244
- - Keep performance and memory constraints in mind
245
- - Keep node building/parsing aligned with project patterns
246
- - Avoid API changes that diverge from observed WhatsApp Web behavior
247
- - Test real flows when touching auth, transport, app state, retry, or signal paths
164
+ If `zapo` is useful in your production or study setup, you can support
165
+ ongoing development on GitHub Sponsors:
166
+ [github.com/sponsors/vinikjkkj](https://github.com/sponsors/vinikjkkj).
248
167
 
249
168
  ## Disclaimer
250
169
 
251
- This project is an independent implementation for engineering and interoperability research.
252
- It is not affiliated with or endorsed by WhatsApp.
170
+ This project is an independent implementation for engineering and
171
+ interoperability research. It is not affiliated with or endorsed by
172
+ WhatsApp.
@@ -1,16 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaAppStateCrypto = void 0;
4
- const constants_1 = require("./constants");
5
- const hkdf_1 = require("../crypto/core/hkdf");
6
- const primitives_1 = require("../crypto/core/primitives");
7
- const random_1 = require("../crypto/core/random");
8
- const _proto_1 = require("../proto.js");
9
- const constants_2 = require("../protocol/constants");
10
- const bytes_1 = require("../util/bytes");
11
- const collections_1 = require("../util/collections");
12
- const primitives_2 = require("../util/primitives");
4
+ const constants_1 = require("../constants");
5
+ const hkdf_1 = require("../../crypto/core/hkdf");
6
+ const primitives_1 = require("../../crypto/core/primitives");
7
+ const random_1 = require("../../crypto/core/random");
8
+ const _proto_1 = require("../../proto");
9
+ const constants_2 = require("../../protocol/constants");
10
+ const bytes_1 = require("../../util/bytes");
11
+ const collections_1 = require("../../util/collections");
12
+ const primitives_2 = require("../../util/primitives");
13
13
  const DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE = 256;
14
+ /**
15
+ * Implements the app-state mutation cryptography: HKDF key derivation (with
16
+ * a bounded LRU cache), per-mutation encrypt/decrypt, snapshot/patch MAC
17
+ * generation, and the LT-hash arithmetic used to track collection state.
18
+ */
14
19
  class WaAppStateCrypto {
15
20
  constructor(derivedKeysCacheMaxSize = DEFAULT_DERIVED_KEYS_CACHE_MAX_SIZE, skipMacVerification = false) {
16
21
  this.derivedKeysCache = new Map();
@@ -20,39 +25,39 @@ class WaAppStateCrypto {
20
25
  get isMacVerificationSkipped() {
21
26
  return this.skipMacVerification;
22
27
  }
28
+ /** Empties the derived-keys LRU cache (e.g. after a session reset). */
23
29
  clearCache() {
24
30
  this.derivedKeysCache.clear();
25
31
  }
26
- async deriveKeys(keyData) {
32
+ /**
33
+ * Derives the index/value/snapshot/patch keys from an app-state sync key.
34
+ * Cached by base64 of `keyData` (LRU-bounded).
35
+ */
36
+ deriveKeys(keyData) {
27
37
  const cacheKey = (0, bytes_1.bytesToBase64)(keyData);
28
38
  const cached = this.derivedKeysCache.get(cacheKey);
29
39
  if (cached) {
30
40
  this.touchDerivedKeysCacheEntry(cacheKey, cached);
31
41
  return cached;
32
42
  }
33
- const derived = await (0, hkdf_1.hkdf)(keyData, null, constants_2.WA_APP_STATE_KDF_INFO.MUTATION_KEYS, constants_1.APP_STATE_DERIVED_KEY_LENGTH);
34
- const [indexHmacKey, valueEncryptionAesKey, valueMacHmacKey, snapshotMacHmacKey, patchMacHmacKey] = await Promise.all([
35
- (0, primitives_1.importHmacKey)(derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END)),
36
- (0, primitives_1.importAesCbcKey)(derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END)),
37
- (0, primitives_1.importHmacSha512Key)(derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END)),
38
- (0, primitives_1.importHmacKey)(derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END)),
39
- (0, primitives_1.importHmacKey)(derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END))
40
- ]);
43
+ const derived = (0, hkdf_1.hkdf)(keyData, null, constants_2.WA_APP_STATE_KDF_INFO.MUTATION_KEYS, constants_1.APP_STATE_DERIVED_KEY_LENGTH);
41
44
  const keys = {
42
- indexHmacKey,
43
- valueEncryptionAesKey,
44
- valueMacHmacKey,
45
- snapshotMacHmacKey,
46
- patchMacHmacKey
45
+ indexHmacKey: derived.subarray(0, constants_1.APP_STATE_DERIVED_INDEX_KEY_END),
46
+ valueEncryptionAesKey: derived.subarray(constants_1.APP_STATE_DERIVED_INDEX_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END),
47
+ valueMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_ENCRYPTION_KEY_END, constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END),
48
+ snapshotMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_VALUE_MAC_KEY_END, constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END),
49
+ patchMacHmacKey: derived.subarray(constants_1.APP_STATE_DERIVED_SNAPSHOT_MAC_KEY_END, constants_1.APP_STATE_DERIVED_PATCH_MAC_KEY_END)
47
50
  };
48
51
  this.touchDerivedKeysCacheEntry(cacheKey, keys);
49
52
  return keys;
50
53
  }
51
- async generateIndexMac(indexHmacKey, indexBytes) {
52
- return (0, primitives_1.hmacSign)(indexHmacKey, indexBytes);
54
+ /** Computes the HMAC-SHA-256 index MAC over `indexBytes`. */
55
+ generateIndexMac(indexHmacKey, indexBytes) {
56
+ return (0, primitives_1.hmacSha256Sign)(indexHmacKey, indexBytes);
53
57
  }
58
+ /** Encrypts a single mutation value with AES-CBC + HMAC value-MAC. */
54
59
  async encryptMutation(args) {
55
- const derivedKeys = await this.deriveKeys(args.keyData);
60
+ const derivedKeys = this.deriveKeys(args.keyData);
56
61
  const indexBytes = bytes_1.TEXT_ENCODER.encode(args.index);
57
62
  const encoded = _proto_1.proto.SyncActionData.encode({
58
63
  index: indexBytes,
@@ -64,37 +69,34 @@ class WaAppStateCrypto {
64
69
  if (iv.byteLength !== constants_1.APP_STATE_IV_LENGTH) {
65
70
  throw new Error(`invalid IV length ${iv.byteLength}`);
66
71
  }
67
- const indexMacPromise = this.generateIndexMac(derivedKeys.indexHmacKey, indexBytes);
68
- const cipherText = await (0, primitives_1.aesCbcEncrypt)(derivedKeys.valueEncryptionAesKey, iv, encoded);
69
- const cipherWithIv = (0, bytes_1.concatBytes)([iv, cipherText]);
72
+ const indexMac = this.generateIndexMac(derivedKeys.indexHmacKey, indexBytes);
73
+ const cipherText = (0, primitives_1.aesCbcEncrypt)(derivedKeys.valueEncryptionAesKey, iv, encoded);
70
74
  const associatedData = this.generateAssociatedData(args.operation, args.keyId);
71
- const [valueMac, indexMac] = await Promise.all([
72
- this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, cipherWithIv),
73
- indexMacPromise
74
- ]);
75
+ const valueMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
75
76
  return {
76
77
  indexMac,
77
- valueBlob: (0, bytes_1.concatBytes)([cipherWithIv, valueMac]),
78
+ valueBlob: (0, bytes_1.concatBytes)([iv, cipherText, valueMac]),
78
79
  valueMac
79
80
  };
80
81
  }
82
+ /** Verifies and decrypts a single app-state mutation. */
83
+ // eslint-disable-next-line @typescript-eslint/require-await
81
84
  async decryptMutation(args) {
82
85
  if (args.valueBlob.byteLength < constants_1.APP_STATE_IV_LENGTH + constants_1.APP_STATE_VALUE_MAC_LENGTH) {
83
86
  throw new Error('invalid mutation value blob');
84
87
  }
85
- const derivedKeys = await this.deriveKeys(args.keyData);
88
+ const derivedKeys = this.deriveKeys(args.keyData);
86
89
  const iv = args.valueBlob.subarray(0, constants_1.APP_STATE_IV_LENGTH);
87
90
  const mac = args.valueBlob.subarray(args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
88
91
  const cipherText = args.valueBlob.subarray(constants_1.APP_STATE_IV_LENGTH, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
89
- const cipherWithIv = args.valueBlob.subarray(0, args.valueBlob.byteLength - constants_1.APP_STATE_VALUE_MAC_LENGTH);
90
92
  if (!this.skipMacVerification) {
91
93
  const associatedData = this.generateAssociatedData(args.operation, args.keyId);
92
- const expectedMac = await this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, cipherWithIv);
94
+ const expectedMac = this.generateValueMac(derivedKeys.valueMacHmacKey, associatedData, iv, cipherText);
93
95
  if (!(0, bytes_1.uint8TimingSafeEqual)(mac, expectedMac)) {
94
96
  throw new Error('mutation value MAC mismatch');
95
97
  }
96
98
  }
97
- const plaintext = await (0, primitives_1.aesCbcDecrypt)(derivedKeys.valueEncryptionAesKey, iv, cipherText);
99
+ const plaintext = (0, primitives_1.aesCbcDecrypt)(derivedKeys.valueEncryptionAesKey, iv, cipherText);
98
100
  const syncActionData = _proto_1.proto.SyncActionData.decode(plaintext);
99
101
  if (!syncActionData.index) {
100
102
  throw new Error('missing sync action index');
@@ -103,7 +105,7 @@ class WaAppStateCrypto {
103
105
  throw new Error('missing sync action version');
104
106
  }
105
107
  if (!this.skipMacVerification) {
106
- const generatedIndexMac = await this.generateIndexMac(derivedKeys.indexHmacKey, syncActionData.index);
108
+ const generatedIndexMac = this.generateIndexMac(derivedKeys.indexHmacKey, syncActionData.index);
107
109
  if (!(0, bytes_1.uint8TimingSafeEqual)(generatedIndexMac, args.indexMac)) {
108
110
  throw new Error('mutation index MAC mismatch');
109
111
  }
@@ -116,41 +118,48 @@ class WaAppStateCrypto {
116
118
  valueMac: mac
117
119
  };
118
120
  }
121
+ /** Generates the HMAC-SHA-512 snapshot MAC over the LT-hash + version + collection name. */
122
+ // eslint-disable-next-line @typescript-eslint/require-await
119
123
  async generateSnapshotMac(keyData, ltHash, version, collectionName) {
120
- const derivedKeys = await this.deriveKeys(keyData);
121
- const payload = (0, bytes_1.concatBytes)([
124
+ const derivedKeys = this.deriveKeys(keyData);
125
+ return (0, primitives_1.hmacSha256Sign)(derivedKeys.snapshotMacHmacKey, [
122
126
  ltHash,
123
127
  (0, bytes_1.intToBytes)(8, version),
124
128
  bytes_1.TEXT_ENCODER.encode(collectionName)
125
129
  ]);
126
- return (0, primitives_1.hmacSign)(derivedKeys.snapshotMacHmacKey, payload);
127
130
  }
131
+ /** Generates the HMAC-SHA-512 patch MAC binding mutations to a collection version. */
132
+ // eslint-disable-next-line @typescript-eslint/require-await
128
133
  async generatePatchMac(keyData, snapshotMac, valueMacs, version, collectionName) {
129
- const derivedKeys = await this.deriveKeys(keyData);
130
- const payload = (0, bytes_1.concatBytes)([
134
+ const derivedKeys = this.deriveKeys(keyData);
135
+ return (0, primitives_1.hmacSha256Sign)(derivedKeys.patchMacHmacKey, [
131
136
  snapshotMac,
132
137
  ...valueMacs,
133
138
  (0, bytes_1.intToBytes)(8, version),
134
139
  bytes_1.TEXT_ENCODER.encode(collectionName)
135
140
  ]);
136
- return (0, primitives_1.hmacSign)(derivedKeys.patchMacHmacKey, payload);
137
141
  }
142
+ /** Adds value MACs into the running LT-hash digest for a collection. */
143
+ // eslint-disable-next-line @typescript-eslint/require-await
138
144
  async ltHashAdd(base, addValues) {
139
145
  return this.ltHashApply(base, addValues, (left, right) => left + right);
140
146
  }
147
+ /** Removes value MACs from the running LT-hash digest (for `remove` operations). */
148
+ // eslint-disable-next-line @typescript-eslint/require-await
141
149
  async ltHashSubtract(base, removeValues) {
142
150
  return this.ltHashApply(base, removeValues, (left, right) => left - right);
143
151
  }
152
+ /** Combined subtract+add LT-hash update used when a key's value MAC changes in place. */
144
153
  async ltHashSubtractThenAdd(base, addValues, removeValues) {
145
154
  const subtractResult = await this.ltHashSubtract(base, removeValues);
146
155
  const hash = await this.ltHashAdd(subtractResult, addValues);
147
156
  return { hash, subtractResult };
148
157
  }
149
- async ltHashApply(base, values, combine) {
158
+ ltHashApply(base, values, combine) {
150
159
  if (values.length === 0) {
151
160
  return base;
152
161
  }
153
- const expandedValues = await Promise.all(values.map((value) => (0, hkdf_1.hkdf)(value, null, constants_2.WA_APP_STATE_KDF_INFO.PATCH_INTEGRITY, constants_1.APP_STATE_EMPTY_LT_HASH.byteLength)));
162
+ const expandedValues = values.map((value) => (0, hkdf_1.hkdf)(value, null, constants_2.WA_APP_STATE_KDF_INFO.PATCH_INTEGRITY, constants_1.APP_STATE_EMPTY_LT_HASH.byteLength));
154
163
  const out = new Uint8Array(base.byteLength);
155
164
  this.pointwiseWithOverflow(base, expandedValues[0], combine, out);
156
165
  for (let index = 1; index < expandedValues.length; index += 1) {
@@ -187,10 +196,10 @@ class WaAppStateCrypto {
187
196
  out.set(keyId, 1);
188
197
  return out;
189
198
  }
190
- async generateValueMac(valueMacHmacKey, associatedData, cipherWithIv) {
199
+ generateValueMac(valueMacHmacKey, associatedData, iv, cipherText) {
191
200
  const octetLength = new Uint8Array(constants_1.APP_STATE_MAC_OCTET_LENGTH);
192
201
  octetLength[octetLength.length - 1] = associatedData.byteLength & 0xff;
193
- const full = await (0, primitives_1.hmacSign)(valueMacHmacKey, (0, bytes_1.concatBytes)([associatedData, cipherWithIv, octetLength]));
202
+ const full = (0, primitives_1.hmacSha512Sign)(valueMacHmacKey, (0, bytes_1.concatBytes)([associatedData, iv, cipherText, octetLength]));
194
203
  return full.subarray(0, constants_1.APP_STATE_VALUE_MAC_LENGTH);
195
204
  }
196
205
  touchDerivedKeysCacheEntry(cacheKey, keys) {
@@ -14,17 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = void 0;
18
- __exportStar(require("./constants"), exports);
19
- var encoding_1 = require("./encoding");
17
+ exports.WaAppStateSyncClient = exports.parseSyncResponse = exports.WaAppStateCrypto = exports.decodeAppStateSyncKeys = exports.decodeAppStateCollections = exports.decodeAppStateFingerprint = exports.encodeAppStateFingerprint = exports.APP_STATE_EMPTY_LT_HASH = void 0;
18
+ var constants_1 = require("./constants");
19
+ Object.defineProperty(exports, "APP_STATE_EMPTY_LT_HASH", { enumerable: true, get: function () { return constants_1.APP_STATE_EMPTY_LT_HASH; } });
20
+ var encoding_1 = require("./parsers/encoding");
20
21
  Object.defineProperty(exports, "encodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.encodeAppStateFingerprint; } });
21
22
  Object.defineProperty(exports, "decodeAppStateFingerprint", { enumerable: true, get: function () { return encoding_1.decodeAppStateFingerprint; } });
22
23
  Object.defineProperty(exports, "decodeAppStateCollections", { enumerable: true, get: function () { return encoding_1.decodeAppStateCollections; } });
23
24
  Object.defineProperty(exports, "decodeAppStateSyncKeys", { enumerable: true, get: function () { return encoding_1.decodeAppStateSyncKeys; } });
24
25
  __exportStar(require("./utils"), exports);
25
- var WaAppStateCrypto_1 = require("./WaAppStateCrypto");
26
+ var WaAppStateCrypto_1 = require("./crypto/WaAppStateCrypto");
26
27
  Object.defineProperty(exports, "WaAppStateCrypto", { enumerable: true, get: function () { return WaAppStateCrypto_1.WaAppStateCrypto; } });
27
- var response_parser_1 = require("./response-parser");
28
+ var response_parser_1 = require("./parsers/response-parser");
28
29
  Object.defineProperty(exports, "parseSyncResponse", { enumerable: true, get: function () { return response_parser_1.parseSyncResponse; } });
29
- var WaAppStateSyncClient_1 = require("./WaAppStateSyncClient");
30
+ var WaAppStateSyncClient_1 = require("./sync/WaAppStateSyncClient");
30
31
  Object.defineProperty(exports, "WaAppStateSyncClient", { enumerable: true, get: function () { return WaAppStateSyncClient_1.WaAppStateSyncClient; } });
@@ -4,14 +4,17 @@ exports.encodeAppStateFingerprint = encodeAppStateFingerprint;
4
4
  exports.decodeAppStateFingerprint = decodeAppStateFingerprint;
5
5
  exports.decodeAppStateSyncKeys = decodeAppStateSyncKeys;
6
6
  exports.decodeAppStateCollections = decodeAppStateCollections;
7
- const _proto_1 = require("../proto.js");
8
- const coercion_1 = require("../util/coercion");
7
+ const _proto_1 = require("../../proto");
8
+ const coercion_1 = require("../../util/coercion");
9
+ const primitives_1 = require("../../util/primitives");
10
+ /** Serializes an app-state sync key fingerprint to its protobuf bytes, or `null` when absent. */
9
11
  function encodeAppStateFingerprint(fingerprint) {
10
12
  if (!fingerprint) {
11
13
  return null;
12
14
  }
13
15
  return _proto_1.proto.Message.AppStateSyncKeyFingerprint.encode(fingerprint).finish();
14
16
  }
17
+ /** Inverse of {@link encodeAppStateFingerprint}; throws on malformed input. */
15
18
  function decodeAppStateFingerprint(raw) {
16
19
  const bytes = (0, coercion_1.asOptionalBytes)(raw, 'appstate_sync_keys.fingerprint');
17
20
  if (!bytes) {
@@ -21,10 +24,10 @@ function decodeAppStateFingerprint(raw) {
21
24
  return _proto_1.proto.Message.AppStateSyncKeyFingerprint.decode(bytes);
22
25
  }
23
26
  catch (error) {
24
- const reason = error instanceof Error ? error.message : String(error);
25
- throw new Error(`invalid appstate_sync_keys.fingerprint protobuf payload: ${reason}`);
27
+ throw new Error(`invalid appstate_sync_keys.fingerprint protobuf payload: ${(0, primitives_1.toError)(error).message}`);
26
28
  }
27
29
  }
30
+ /** Decodes app-state sync-key SQL rows into {@link WaAppStateSyncKey} records. */
28
31
  function decodeAppStateSyncKeys(rows) {
29
32
  const decoded = new Array(rows.length);
30
33
  for (let i = 0; i < rows.length; i += 1) {
@@ -38,6 +41,10 @@ function decodeAppStateSyncKeys(rows) {
38
41
  }
39
42
  return decoded;
40
43
  }
44
+ /**
45
+ * Joins app-state collection-version and index-value SQL rows into the
46
+ * `collections` shape used by the in-memory app-state store.
47
+ */
41
48
  function decodeAppStateCollections(versionRows, valueRows) {
42
49
  const valueMapByCollection = new Map();
43
50
  for (const row of valueRows) {