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
@@ -0,0 +1,41 @@
1
+ import { isGroupJid } from '../../protocol/jid.js';
2
+ import { WA_PRESENCE_LAST_SENTINELS, WA_PRESENCE_TYPES } from '../../protocol/presence.js';
3
+ import { parseOptionalInt } from '../../util/primitives.js';
4
+ function parseLastSeen(value) {
5
+ if (value === WA_PRESENCE_LAST_SENTINELS.DENY) {
6
+ return { kind: 'privacy_denied' };
7
+ }
8
+ if (value === WA_PRESENCE_LAST_SENTINELS.NONE) {
9
+ return { kind: 'never_online' };
10
+ }
11
+ if (value === WA_PRESENCE_LAST_SENTINELS.ERROR) {
12
+ return { kind: 'unknown' };
13
+ }
14
+ const unixSeconds = parseOptionalInt(value);
15
+ if (unixSeconds === undefined) {
16
+ return { kind: 'unknown' };
17
+ }
18
+ return { kind: 'timestamp', unixSeconds };
19
+ }
20
+ export function parsePresenceNode(node) {
21
+ const from = node.attrs.from;
22
+ const isGroup = from !== undefined && isGroupJid(from);
23
+ const type = node.attrs.type === WA_PRESENCE_TYPES.UNAVAILABLE
24
+ ? WA_PRESENCE_TYPES.UNAVAILABLE
25
+ : WA_PRESENCE_TYPES.AVAILABLE;
26
+ const result = { type };
27
+ if (isGroup) {
28
+ const count = parseOptionalInt(node.attrs.count);
29
+ if (count !== undefined) {
30
+ result.groupOnlineCount = count;
31
+ }
32
+ else if (type === WA_PRESENCE_TYPES.UNAVAILABLE) {
33
+ result.groupOnlineCount = 0;
34
+ }
35
+ return result;
36
+ }
37
+ if (type === WA_PRESENCE_TYPES.UNAVAILABLE && node.attrs.last !== undefined) {
38
+ result.lastSeen = parseLastSeen(node.attrs.last);
39
+ }
40
+ return result;
41
+ }
@@ -0,0 +1,23 @@
1
+ import { isGroupOrBroadcastJid } from '../../protocol/jid.js';
2
+ function needsParticipant(target) {
3
+ if (target.isGroupChat !== undefined || target.isBroadcastChat !== undefined) {
4
+ return target.isGroupChat === true || target.isBroadcastChat === true;
5
+ }
6
+ return isGroupOrBroadcastJid(target.chatJid);
7
+ }
8
+ export function aggregateReceiptTargets(targets) {
9
+ const groups = new Map();
10
+ for (const target of targets) {
11
+ const participant = needsParticipant(target) && target.senderJid && target.senderJid !== target.chatJid
12
+ ? target.senderJid
13
+ : undefined;
14
+ const key = `${target.chatJid}|${participant ?? ''}`;
15
+ let group = groups.get(key);
16
+ if (!group) {
17
+ group = { jid: target.chatJid, participant, ids: [] };
18
+ groups.set(key, group);
19
+ }
20
+ group.ids.push(target.id);
21
+ }
22
+ return [...groups.values()];
23
+ }
@@ -1,9 +1,12 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import { createReadStream, createWriteStream } from 'node:fs';
2
- import { open, unlink } from 'node:fs/promises';
3
+ import { open, stat, unlink } from 'node:fs/promises';
3
4
  import { tmpdir } from 'node:os';
4
5
  import { join } from 'node:path';
6
+ import { Transform } from 'node:stream';
5
7
  import { pipeline } from 'node:stream/promises';
6
- import { toBytesView } from '../util/bytes.js';
8
+ import { randomIntAsync, sha256 } from '../crypto/core/index.js';
9
+ import { bytesToBase64UrlSafe, TEXT_DECODER, toBytesView, toChunkBytes } from '../util/bytes.js';
7
10
  import { toError } from '../util/primitives.js';
8
11
  export async function readFileHead(filePath, bytes) {
9
12
  const fh = await open(filePath, 'r');
@@ -57,8 +60,8 @@ export function parseWebpAnimation(data) {
57
60
  }
58
61
  return null;
59
62
  }
60
- const IMAGE_THUMB_MAX_EDGE = 320;
61
- const VIDEO_THUMB_MAX_EDGE = 48;
63
+ const IMAGE_THUMB_MAX_EDGE = 100;
64
+ const VIDEO_THUMB_MAX_EDGE = 100;
62
65
  const STICKER_THUMB_MAX_EDGE = 100;
63
66
  const EMPTY_PROCESSED = {};
64
67
  export function isReadableStream(value) {
@@ -81,8 +84,135 @@ async function streamToTempFile(source) {
81
84
  export async function cleanupTempFile(filePath) {
82
85
  await unlink(filePath).catch(() => undefined);
83
86
  }
87
+ function createSha256SizeMeter() {
88
+ const hash = createHash('sha256');
89
+ let byteLength = 0;
90
+ const transform = new Transform({
91
+ transform(chunk, _enc, cb) {
92
+ const bytes = chunk instanceof Uint8Array ? chunk : toChunkBytes(chunk);
93
+ hash.update(bytes);
94
+ byteLength += bytes.byteLength;
95
+ cb(null, bytes);
96
+ }
97
+ });
98
+ return {
99
+ transform,
100
+ finalize: () => ({ fileSha256: toBytesView(hash.digest()), byteLength })
101
+ };
102
+ }
103
+ async function streamToTempFileWithSha256(source) {
104
+ const filePath = join(tmpdir(), `zapo-media-${Date.now()}-${Math.random().toString(36).slice(2)}`);
105
+ const meter = createSha256SizeMeter();
106
+ try {
107
+ await pipeline(source, meter.transform, createWriteStream(filePath));
108
+ }
109
+ catch (error) {
110
+ await unlink(filePath).catch(() => undefined);
111
+ throw error;
112
+ }
113
+ return { filePath, ...meter.finalize() };
114
+ }
115
+ async function preparePlaintextUploadSource(media) {
116
+ if (media instanceof Uint8Array) {
117
+ return { fileSha256: sha256(media), byteLength: media.byteLength, body: media };
118
+ }
119
+ if (typeof media === 'string') {
120
+ await assertReadableFile(media);
121
+ const result = await streamToTempFileWithSha256(createReadStream(media));
122
+ return {
123
+ fileSha256: result.fileSha256,
124
+ byteLength: result.byteLength,
125
+ body: createReadStream(result.filePath),
126
+ cleanup: () => cleanupTempFile(result.filePath)
127
+ };
128
+ }
129
+ if (isReadableStream(media)) {
130
+ const result = await streamToTempFileWithSha256(media);
131
+ return {
132
+ fileSha256: result.fileSha256,
133
+ byteLength: result.byteLength,
134
+ body: createReadStream(result.filePath),
135
+ cleanup: () => cleanupTempFile(result.filePath)
136
+ };
137
+ }
138
+ throw new Error('media upload received unsupported source type');
139
+ }
140
+ // node:crypto randomInt caps max at 2**48 - 1; well within JS safe integer range.
141
+ const MEDIA_UPLOAD_ID_MAX = 281474976710655;
142
+ async function generateMediaUploadId() {
143
+ const value = await randomIntAsync(0, MEDIA_UPLOAD_ID_MAX);
144
+ return value.toString(10);
145
+ }
146
+ export function selectMediaUploadHost(mediaConn) {
147
+ return mediaConn.hosts.find((host) => !host.isFallback)?.hostname ?? mediaConn.hosts[0].hostname;
148
+ }
149
+ export function buildMediaUploadUrl(host, path, auth, fileSha256, mediaId) {
150
+ const hashToken = bytesToBase64UrlSafe(fileSha256);
151
+ const base = `https://${host}${path}/${hashToken}?auth=${encodeURIComponent(auth)}&token=${encodeURIComponent(hashToken)}`;
152
+ return mediaId !== undefined ? `${base}&media_id=${mediaId}` : base;
153
+ }
154
+ export function assertMediaUploadStatus(status, label) {
155
+ if (status < 200 || status >= 300) {
156
+ throw new Error(`${label} failed with status ${status}`);
157
+ }
158
+ }
159
+ export function parseMediaUploadJsonBody(body, label) {
160
+ try {
161
+ return JSON.parse(TEXT_DECODER.decode(body));
162
+ }
163
+ catch (error) {
164
+ throw new Error(`${label} returned invalid json: ${toError(error).message}`);
165
+ }
166
+ }
167
+ export async function performPlaintextMediaUpload(deps, input) {
168
+ const prepared = await preparePlaintextUploadSource(input.source);
169
+ try {
170
+ const host = selectMediaUploadHost(deps.mediaConn);
171
+ const mediaId = await generateMediaUploadId();
172
+ const url = buildMediaUploadUrl(host, input.path, deps.mediaConn.auth, prepared.fileSha256, mediaId);
173
+ deps.logger.debug(input.logLabel ?? 'sending media upload', {
174
+ host,
175
+ path: input.path,
176
+ size: prepared.byteLength
177
+ });
178
+ const response = await deps.mediaTransfer.uploadStream({
179
+ url,
180
+ method: 'POST',
181
+ body: prepared.body,
182
+ contentLength: prepared.byteLength,
183
+ contentType: input.mimetype
184
+ });
185
+ const responseBytes = await deps.mediaTransfer.readResponseBytes(response);
186
+ return {
187
+ responseBytes,
188
+ status: response.status,
189
+ fileSha256: prepared.fileSha256,
190
+ byteLength: prepared.byteLength,
191
+ mediaId
192
+ };
193
+ }
194
+ finally {
195
+ await prepared.cleanup?.();
196
+ }
197
+ }
198
+ async function assertReadableFile(filePath) {
199
+ try {
200
+ const stats = await stat(filePath);
201
+ if (!stats.isFile()) {
202
+ throw new Error(`media path is not a regular file: ${filePath}`);
203
+ }
204
+ }
205
+ catch (error) {
206
+ const err = toError(error);
207
+ if (err.code === 'ENOENT') {
208
+ throw new Error(`media file not found: ${filePath}`);
209
+ }
210
+ throw err;
211
+ }
212
+ }
84
213
  export async function resolveMediaInputs(shouldProcess, raw) {
85
214
  if (typeof raw === 'string') {
215
+ await assertReadableFile(raw);
86
216
  return {
87
217
  processorInput: raw,
88
218
  uploadMedia: createReadStream(raw)
@@ -140,6 +270,12 @@ function shouldGenerateWaveform(media, content) {
140
270
  content.type === 'audio' &&
141
271
  content.waveform === undefined);
142
272
  }
273
+ export function shouldNormalizeVoiceNote(media, content) {
274
+ return (!!media?.processor?.normalizeVoiceNote &&
275
+ media.normalizeVoiceNote === true &&
276
+ content.type === 'audio' &&
277
+ content.ptt === true);
278
+ }
143
279
  function shouldGenerateStickerThumbnail(media, content) {
144
280
  return (!!media?.processor?.generateStickerThumbnail &&
145
281
  media.generateStickerThumbnail !== false &&
@@ -165,19 +301,33 @@ async function runProcessorStep(step, content, logger, fn) {
165
301
  return null;
166
302
  }
167
303
  }
304
+ // Reuse one scoped child logger per parent. The processor is allowed to be
305
+ // shared across WaClient sessions; without this cache, each call would mint
306
+ // a fresh child logger and any package-side dedup keyed by Logger identity
307
+ // (e.g. ffmpeg's missing-binary warn) would reset on every send.
308
+ const SCOPED_MEDIA_LOGGER_CACHE = new WeakMap();
309
+ export function getScopedMediaLogger(parent) {
310
+ let scoped = SCOPED_MEDIA_LOGGER_CACHE.get(parent);
311
+ if (!scoped) {
312
+ scoped = parent.child({ scope: 'media-utils' });
313
+ SCOPED_MEDIA_LOGGER_CACHE.set(parent, scoped);
314
+ }
315
+ return scoped;
316
+ }
168
317
  export async function runMediaProcessor(media, input, content, logger) {
169
318
  const processor = media?.processor;
170
319
  if (!processor || !hasMediaProcessingTasks(media, content) || !input)
171
320
  return EMPTY_PROCESSED;
172
321
  const result = {};
322
+ const ctx = { logger: getScopedMediaLogger(logger) };
173
323
  const isVideo = content.type === 'video' || content.type === 'ptv';
174
324
  const thumbFn = isVideo ? processor.generateVideoThumbnail : processor.generateImageThumbnail;
175
325
  const thumbMaxEdge = isVideo ? VIDEO_THUMB_MAX_EDGE : IMAGE_THUMB_MAX_EDGE;
176
326
  const thumbTask = shouldGenerateThumbnail(media, content)
177
- ? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge))
327
+ ? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge, ctx))
178
328
  : null;
179
329
  const probeTask = shouldProbeMedia(media, content)
180
- ? runProcessorStep('probe', content, logger, () => processor.probeMedia(input))
330
+ ? runProcessorStep('probe', content, logger, () => processor.probeMedia(input, ctx))
181
331
  : null;
182
332
  const [thumb, probe] = await Promise.all([thumbTask, probeTask]);
183
333
  if (thumb) {
@@ -200,7 +350,7 @@ export async function runMediaProcessor(media, input, content, logger) {
200
350
  }
201
351
  }
202
352
  if (shouldGenerateWaveform(media, content)) {
203
- const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input));
353
+ const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input, ctx));
204
354
  if (waveformResult) {
205
355
  result.waveform = waveformResult.waveform;
206
356
  if (result.seconds === undefined &&
@@ -211,7 +361,7 @@ export async function runMediaProcessor(media, input, content, logger) {
211
361
  }
212
362
  if (content.type === 'sticker') {
213
363
  if (shouldGenerateStickerThumbnail(media, content)) {
214
- const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE));
364
+ const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE, ctx));
215
365
  if (stickerThumb) {
216
366
  result.pngThumbnail = stickerThumb.pngThumbnail;
217
367
  result.width = stickerThumb.width;
@@ -1,8 +1,8 @@
1
1
  import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
2
- import { isHostedDeviceJid, normalizeDeviceJid, splitJid, toUserJid } from '../../protocol/jid.js';
2
+ import { normalizeDeviceJid, splitJid, toUserJid } from '../../protocol/jid.js';
3
3
  import { toError } from '../../util/primitives.js';
4
4
  export function createDeviceFanoutResolver(options) {
5
- const { signalDeviceSync, getCurrentMeJid, getCurrentMeLid, logger } = options;
5
+ const { signalDeviceSync, getCurrentCredentials, logger } = options;
6
6
  const dedup = new PromiseDedup();
7
7
  const resolveDirectFanoutDeviceJids = async (recipientJid, selfDeviceJidForRecipient) => {
8
8
  const recipientUserJid = toUserJid(recipientJid);
@@ -37,7 +37,7 @@ export function createDeviceFanoutResolver(options) {
37
37
  return [...fanout];
38
38
  }
39
39
  catch (error) {
40
- logger.warn('signal device fanout sync failed, falling back to direct recipient', {
40
+ logger.debug('signal device fanout sync failed, falling back to direct recipient', {
41
41
  to: recipientJid,
42
42
  message: toError(error).message
43
43
  });
@@ -46,7 +46,8 @@ export function createDeviceFanoutResolver(options) {
46
46
  };
47
47
  const resolveGroupParticipantDeviceJidsInternal = async (participantUserJids) => {
48
48
  const meDeviceJids = new Set();
49
- const meJid = getCurrentMeJid();
49
+ const credentials = getCurrentCredentials();
50
+ const meJid = credentials?.meJid;
50
51
  if (meJid) {
51
52
  try {
52
53
  meDeviceJids.add(normalizeDeviceJid(meJid));
@@ -58,7 +59,7 @@ export function createDeviceFanoutResolver(options) {
58
59
  });
59
60
  }
60
61
  }
61
- const meLid = getCurrentMeLid();
62
+ const meLid = credentials?.meLid;
62
63
  if (meLid && meLid.includes('@')) {
63
64
  try {
64
65
  meDeviceJids.add(normalizeDeviceJid(meLid));
@@ -92,9 +93,6 @@ export function createDeviceFanoutResolver(options) {
92
93
  }
93
94
  for (const deviceJid of entry.deviceJids) {
94
95
  const normalizedDeviceJid = normalizeDeviceJid(deviceJid);
95
- if (isHostedDeviceJid(normalizedDeviceJid)) {
96
- continue;
97
- }
98
96
  if (meDeviceJids.has(normalizedDeviceJid)) {
99
97
  continue;
100
98
  }
@@ -104,7 +102,7 @@ export function createDeviceFanoutResolver(options) {
104
102
  return [...fanout];
105
103
  }
106
104
  catch (error) {
107
- logger.warn('group participant device sync failed, falling back to participant user jids', {
105
+ logger.debug('group participant device sync failed, falling back to participant user jids', {
108
106
  participants: candidateUsers.length,
109
107
  message: toError(error).message
110
108
  });
@@ -128,14 +126,15 @@ export function createDeviceFanoutResolver(options) {
128
126
  }
129
127
  };
130
128
  const resolveOwnPeerDeviceJids = async () => {
131
- const meJid = getCurrentMeJid();
129
+ const credentials = getCurrentCredentials();
130
+ const meJid = credentials?.meJid;
132
131
  if (!meJid) {
133
132
  throw new Error('resolveOwnPeerDeviceJids requires registered meJid');
134
133
  }
135
134
  const meUserJid = toUserJid(meJid);
136
135
  const meDevices = new Set();
137
136
  meDevices.add(normalizeDeviceJid(meJid));
138
- const meLid = getCurrentMeLid();
137
+ const meLid = credentials?.meLid;
139
138
  if (meLid && meLid.includes('@')) {
140
139
  try {
141
140
  meDevices.add(normalizeDeviceJid(meLid));
@@ -1,9 +1,10 @@
1
1
  import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
2
2
  import { toUserJid } from '../../protocol/jid.js';
3
3
  import { toError } from '../../util/primitives.js';
4
- export function createGroupParticipantsCache(options) {
5
- const { participantsStore, queryGroupParticipantJids, logger } = options;
4
+ export function createGroupMetadataCache(options) {
5
+ const { groupMetadataStore, queryGroupMetadata, logger } = options;
6
6
  const dedup = new PromiseDedup();
7
+ const pendingMutations = new Map();
7
8
  const sanitizeParticipantUsers = (participants) => {
8
9
  const deduped = new Set();
9
10
  for (const participant of participants) {
@@ -33,10 +34,19 @@ export function createGroupParticipantsCache(options) {
33
34
  }
34
35
  return true;
35
36
  };
36
- const mergeParticipantUsersIntoCache = async (groupJid, cachedParticipants, participantsToAdd) => {
37
+ const upsertParticipants = async (cached, groupJid, participants) => {
38
+ await groupMetadataStore.upsertGroupMetadata({
39
+ groupJid,
40
+ participants,
41
+ ephemeral: cached?.ephemeral,
42
+ updatedAtMs: Date.now()
43
+ });
44
+ };
45
+ const mergeParticipantUsersIntoCache = async (groupJid, cached, participantsToAdd) => {
37
46
  if (participantsToAdd.length === 0) {
38
47
  return;
39
48
  }
49
+ const cachedParticipants = cached.participants;
40
50
  const nextParticipants = [...cachedParticipants];
41
51
  const existing = new Set(cachedParticipants);
42
52
  for (const participant of participantsToAdd) {
@@ -49,33 +59,27 @@ export function createGroupParticipantsCache(options) {
49
59
  if (nextParticipants.length === cachedParticipants.length) {
50
60
  return;
51
61
  }
52
- await participantsStore.upsertGroupParticipants({
53
- groupJid,
54
- participants: nextParticipants,
55
- updatedAtMs: Date.now()
56
- });
62
+ await upsertParticipants(cached, groupJid, nextParticipants);
57
63
  };
58
- const removeParticipantUsersFromCache = async (groupJid, cachedParticipants, participantsToRemove) => {
64
+ const removeParticipantUsersFromCache = async (groupJid, cached, participantsToRemove) => {
59
65
  if (participantsToRemove.length === 0) {
60
66
  return;
61
67
  }
62
68
  const removed = new Set(participantsToRemove);
69
+ const cachedParticipants = cached.participants;
63
70
  const nextParticipants = cachedParticipants.filter((participant) => !removed.has(participant));
64
71
  if (nextParticipants.length === cachedParticipants.length) {
65
72
  return;
66
73
  }
67
74
  if (nextParticipants.length === 0) {
68
- await participantsStore.deleteGroupParticipants(groupJid);
75
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
69
76
  return;
70
77
  }
71
- await participantsStore.upsertGroupParticipants({
72
- groupJid,
73
- participants: nextParticipants,
74
- updatedAtMs: Date.now()
75
- });
78
+ await upsertParticipants(cached, groupJid, nextParticipants);
76
79
  };
77
- const replaceParticipantUsersInCache = async (groupJid, cachedParticipants, participantsToReplace, replacementParticipants) => {
80
+ const replaceParticipantUsersInCache = async (groupJid, cached, participantsToReplace, replacementParticipants) => {
78
81
  const toReplace = new Set(participantsToReplace);
82
+ const cachedParticipants = cached.participants;
79
83
  const nextParticipants = cachedParticipants.filter((participant) => !toReplace.has(participant));
80
84
  const existing = new Set(nextParticipants);
81
85
  for (const participant of replacementParticipants) {
@@ -89,16 +93,12 @@ export function createGroupParticipantsCache(options) {
89
93
  return;
90
94
  }
91
95
  if (nextParticipants.length === 0) {
92
- await participantsStore.deleteGroupParticipants(groupJid);
96
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
93
97
  return;
94
98
  }
95
- await participantsStore.upsertGroupParticipants({
96
- groupJid,
97
- participants: nextParticipants,
98
- updatedAtMs: Date.now()
99
- });
99
+ await upsertParticipants(cached, groupJid, nextParticipants);
100
100
  };
101
- const resolveGroupJidForParticipantCacheEvent = (event) => {
101
+ const resolveGroupJidForGroupCacheEvent = (event) => {
102
102
  if (event.action === 'linked_group_promote' || event.action === 'linked_group_demote') {
103
103
  return event.contextGroupJid ?? event.groupJid ?? null;
104
104
  }
@@ -107,42 +107,69 @@ export function createGroupParticipantsCache(options) {
107
107
  const extractParticipantUsersFromGroupEvent = (event) => {
108
108
  const candidates = [];
109
109
  for (const participant of event.participants ?? []) {
110
- if (participant.jid) {
111
- candidates.push(participant.jid);
112
- }
113
- if (participant.lidJid) {
114
- candidates.push(participant.lidJid);
115
- }
116
- if (participant.phoneJid) {
117
- candidates.push(participant.phoneJid);
110
+ const canonical = participant.jid ?? participant.lidJid ?? participant.phoneJid;
111
+ if (canonical) {
112
+ candidates.push(canonical);
118
113
  }
119
114
  }
120
115
  return sanitizeParticipantUsers(candidates);
121
116
  };
122
117
  const refreshParticipantUsers = (groupJid) => dedup.run(`refresh:${groupJid}`, async () => {
123
- const queried = await queryGroupParticipantJids(groupJid);
124
- const participants = sanitizeParticipantUsers(queried);
125
- await participantsStore.upsertGroupParticipants({
118
+ const queried = await queryGroupMetadata(groupJid);
119
+ const participants = sanitizeParticipantUsers(queried.participants);
120
+ await groupMetadataStore.upsertGroupMetadata({
126
121
  groupJid,
127
122
  participants,
123
+ ephemeral: queried.ephemeral,
128
124
  updatedAtMs: Date.now()
129
125
  });
130
126
  return participants;
131
127
  });
132
128
  const resolveParticipantUsers = (groupJid) => dedup.run(`resolve:${groupJid}`, async () => {
133
- const cached = await participantsStore.getGroupParticipants(groupJid);
129
+ await pendingMutations.get(groupJid)?.catch(() => undefined);
130
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
134
131
  if (cached && cached.participants.length > 0) {
135
132
  return sanitizeParticipantUsers(cached.participants);
136
133
  }
137
134
  return refreshParticipantUsers(groupJid);
138
135
  });
139
- const mutateFromGroupEvent = async (event) => {
140
- const groupJid = resolveGroupJidForParticipantCacheEvent(event);
136
+ const getEphemeral = async (groupJid) => {
137
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
138
+ return cached?.ephemeral ?? null;
139
+ };
140
+ const resolveEphemeral = async (groupJid) => {
141
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
142
+ if (cached) {
143
+ return cached.ephemeral ?? null;
144
+ }
145
+ await refreshParticipantUsers(groupJid);
146
+ const refreshed = await groupMetadataStore.getGroupMetadata(groupJid);
147
+ return refreshed?.ephemeral ?? null;
148
+ };
149
+ const applyGroupEvent = async (event) => {
150
+ const groupJid = resolveGroupJidForGroupCacheEvent(event);
141
151
  if (!groupJid) {
142
152
  return;
143
153
  }
144
154
  if (event.action === 'delete') {
145
- await participantsStore.deleteGroupParticipants(groupJid);
155
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
156
+ return;
157
+ }
158
+ if (event.action === 'ephemeral') {
159
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
160
+ if (!cached) {
161
+ return;
162
+ }
163
+ const nextEphemeral = event.expirationSeconds;
164
+ if (cached.ephemeral === nextEphemeral) {
165
+ return;
166
+ }
167
+ await groupMetadataStore.upsertGroupMetadata({
168
+ groupJid,
169
+ participants: cached.participants,
170
+ ephemeral: nextEphemeral,
171
+ updatedAtMs: Date.now()
172
+ });
146
173
  return;
147
174
  }
148
175
  const participantUsers = extractParticipantUsersFromGroupEvent(event);
@@ -150,14 +177,16 @@ export function createGroupParticipantsCache(options) {
150
177
  if (participantUsers.length === 0) {
151
178
  return;
152
179
  }
153
- await participantsStore.upsertGroupParticipants({
180
+ const existing = await groupMetadataStore.getGroupMetadata(groupJid);
181
+ await groupMetadataStore.upsertGroupMetadata({
154
182
  groupJid,
155
183
  participants: participantUsers,
184
+ ephemeral: existing?.ephemeral,
156
185
  updatedAtMs: Date.now()
157
186
  });
158
187
  return;
159
188
  }
160
- const cached = await participantsStore.getGroupParticipants(groupJid);
189
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
161
190
  if (!cached || cached.participants.length === 0) {
162
191
  return;
163
192
  }
@@ -165,26 +194,46 @@ export function createGroupParticipantsCache(options) {
165
194
  if (cachedParticipants.length === 0) {
166
195
  return;
167
196
  }
197
+ const cachedWithSanitized = {
198
+ ...cached,
199
+ participants: cachedParticipants
200
+ };
168
201
  if (event.action === 'add' ||
169
202
  event.action === 'promote' ||
170
203
  event.action === 'demote' ||
171
204
  event.action === 'linked_group_promote' ||
172
205
  event.action === 'linked_group_demote') {
173
- await mergeParticipantUsersIntoCache(groupJid, cachedParticipants, participantUsers);
206
+ await mergeParticipantUsersIntoCache(groupJid, cachedWithSanitized, participantUsers);
174
207
  return;
175
208
  }
176
209
  if (event.action === 'remove') {
177
- await removeParticipantUsersFromCache(groupJid, cachedParticipants, participantUsers);
210
+ await removeParticipantUsersFromCache(groupJid, cachedWithSanitized, participantUsers);
178
211
  return;
179
212
  }
180
213
  if (event.action === 'modify') {
181
214
  const authorUsers = event.authorJid ? sanitizeParticipantUsers([event.authorJid]) : [];
182
- await replaceParticipantUsersInCache(groupJid, cachedParticipants, authorUsers, participantUsers);
215
+ await replaceParticipantUsersInCache(groupJid, cachedWithSanitized, authorUsers, participantUsers);
183
216
  }
184
217
  };
218
+ const mutateFromGroupEvent = (event) => {
219
+ const groupJid = resolveGroupJidForGroupCacheEvent(event);
220
+ if (!groupJid) {
221
+ return applyGroupEvent(event);
222
+ }
223
+ const prev = pendingMutations.get(groupJid) ?? Promise.resolve();
224
+ const next = prev.then(() => applyGroupEvent(event), () => applyGroupEvent(event));
225
+ pendingMutations.set(groupJid, next);
226
+ return next.finally(() => {
227
+ if (pendingMutations.get(groupJid) === next) {
228
+ pendingMutations.delete(groupJid);
229
+ }
230
+ });
231
+ };
185
232
  return {
186
233
  resolveParticipantUsers,
187
234
  refreshParticipantUsers,
235
+ getEphemeral,
236
+ resolveEphemeral,
188
237
  mutateFromGroupEvent
189
238
  };
190
239
  }