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