zapo-js 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -0,0 +1,400 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readFileHead = readFileHead;
4
+ exports.parseWebpAnimation = parseWebpAnimation;
5
+ exports.isReadableStream = isReadableStream;
6
+ exports.cleanupTempFile = cleanupTempFile;
7
+ exports.selectMediaUploadHost = selectMediaUploadHost;
8
+ exports.buildMediaUploadUrl = buildMediaUploadUrl;
9
+ exports.assertMediaUploadStatus = assertMediaUploadStatus;
10
+ exports.parseMediaUploadJsonBody = parseMediaUploadJsonBody;
11
+ exports.performPlaintextMediaUpload = performPlaintextMediaUpload;
12
+ exports.resolveMediaInputs = resolveMediaInputs;
13
+ exports.shouldNormalizeVoiceNote = shouldNormalizeVoiceNote;
14
+ exports.hasMediaProcessingTasks = hasMediaProcessingTasks;
15
+ exports.getScopedMediaLogger = getScopedMediaLogger;
16
+ exports.runMediaProcessor = runMediaProcessor;
17
+ const node_crypto_1 = require("node:crypto");
18
+ const node_fs_1 = require("node:fs");
19
+ const promises_1 = require("node:fs/promises");
20
+ const node_os_1 = require("node:os");
21
+ const node_path_1 = require("node:path");
22
+ const node_stream_1 = require("node:stream");
23
+ const promises_2 = require("node:stream/promises");
24
+ const core_1 = require("../crypto/core");
25
+ const bytes_1 = require("../util/bytes");
26
+ const primitives_1 = require("../util/primitives");
27
+ async function readFileHead(filePath, bytes) {
28
+ const fh = await (0, promises_1.open)(filePath, 'r');
29
+ try {
30
+ const buf = new Uint8Array(bytes);
31
+ const { bytesRead } = await fh.read(buf, 0, bytes, 0);
32
+ return buf.subarray(0, bytesRead);
33
+ }
34
+ finally {
35
+ await fh.close();
36
+ }
37
+ }
38
+ const RIFF_HEADER_SIZE = 12;
39
+ const CHUNK_HEADER_SIZE = 8;
40
+ const CHUNK_ID_SIZE = 4;
41
+ const ANMF_ID = [0x41, 0x4e, 0x4d, 0x46];
42
+ function parseWebpAnimation(data) {
43
+ if (data.byteLength < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE)
44
+ return null;
45
+ let offset = RIFF_HEADER_SIZE;
46
+ if (data[offset] !== 0x56 ||
47
+ data[offset + 1] !== 0x50 ||
48
+ data[offset + 2] !== 0x38 ||
49
+ data[offset + 3] !== 0x58) {
50
+ return null;
51
+ }
52
+ // Skip VP8X chunk: 8 byte header + 10 byte payload
53
+ offset += CHUNK_HEADER_SIZE + 10;
54
+ while (offset + CHUNK_HEADER_SIZE <= data.byteLength) {
55
+ const isAnmf = data[offset] === ANMF_ID[0] &&
56
+ data[offset + 1] === ANMF_ID[1] &&
57
+ data[offset + 2] === ANMF_ID[2] &&
58
+ data[offset + 3] === ANMF_ID[3];
59
+ const sizeOffset = offset + CHUNK_ID_SIZE;
60
+ if (sizeOffset + 4 > data.byteLength)
61
+ return null;
62
+ let chunkSize = (data[sizeOffset] |
63
+ (data[sizeOffset + 1] << 8) |
64
+ (data[sizeOffset + 2] << 16) |
65
+ (data[sizeOffset + 3] << 24)) >>>
66
+ 0;
67
+ if (chunkSize % 2 !== 0)
68
+ chunkSize += 1;
69
+ const nextOffset = offset + CHUNK_HEADER_SIZE + chunkSize;
70
+ if (nextOffset <= offset || nextOffset > data.byteLength)
71
+ return null;
72
+ if (isAnmf) {
73
+ return { isAnimated: true, firstFrameLength: nextOffset };
74
+ }
75
+ offset = nextOffset;
76
+ }
77
+ return null;
78
+ }
79
+ const IMAGE_THUMB_MAX_EDGE = 320;
80
+ const VIDEO_THUMB_MAX_EDGE = 48;
81
+ const STICKER_THUMB_MAX_EDGE = 100;
82
+ const EMPTY_PROCESSED = {};
83
+ function isReadableStream(value) {
84
+ return (!!value &&
85
+ typeof value === 'object' &&
86
+ 'pipe' in value &&
87
+ typeof value.pipe === 'function');
88
+ }
89
+ async function streamToTempFile(source) {
90
+ const filePath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `zapo-media-${Date.now()}-${Math.random().toString(36).slice(2)}`);
91
+ try {
92
+ await (0, promises_2.pipeline)(source, (0, node_fs_1.createWriteStream)(filePath));
93
+ }
94
+ catch (error) {
95
+ await (0, promises_1.unlink)(filePath).catch(() => undefined);
96
+ throw error;
97
+ }
98
+ return filePath;
99
+ }
100
+ async function cleanupTempFile(filePath) {
101
+ await (0, promises_1.unlink)(filePath).catch(() => undefined);
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
+ }
229
+ async function resolveMediaInputs(shouldProcess, raw) {
230
+ if (typeof raw === 'string') {
231
+ await assertReadableFile(raw);
232
+ return {
233
+ processorInput: raw,
234
+ uploadMedia: (0, node_fs_1.createReadStream)(raw)
235
+ };
236
+ }
237
+ if (isReadableStream(raw)) {
238
+ if (shouldProcess) {
239
+ const tempFilePath = await streamToTempFile(raw);
240
+ return {
241
+ processorInput: tempFilePath,
242
+ uploadMedia: (0, node_fs_1.createReadStream)(tempFilePath),
243
+ tempFilePath
244
+ };
245
+ }
246
+ return { uploadMedia: raw };
247
+ }
248
+ const bytes = (0, bytes_1.toBytesView)(raw);
249
+ return { processorInput: bytes, uploadMedia: bytes };
250
+ }
251
+ function shouldGenerateThumbnail(media, content) {
252
+ if (!media?.processor || media.generateThumbnail === false) {
253
+ return false;
254
+ }
255
+ switch (content.type) {
256
+ case 'image':
257
+ return content.jpegThumbnail === undefined && !!media.processor.generateImageThumbnail;
258
+ case 'video':
259
+ case 'ptv':
260
+ return content.jpegThumbnail === undefined && !!media.processor.generateVideoThumbnail;
261
+ case 'document':
262
+ return !!media.processor.generateImageThumbnail;
263
+ default:
264
+ return false;
265
+ }
266
+ }
267
+ function shouldProbeMedia(media, content) {
268
+ if (!media?.processor?.probeMedia || media.generateProbe === false) {
269
+ return false;
270
+ }
271
+ switch (content.type) {
272
+ case 'video':
273
+ case 'ptv':
274
+ return (content.seconds === undefined ||
275
+ content.width === undefined ||
276
+ content.height === undefined);
277
+ case 'audio':
278
+ return content.seconds === undefined;
279
+ default:
280
+ return false;
281
+ }
282
+ }
283
+ function shouldGenerateWaveform(media, content) {
284
+ return (!!media?.processor?.computeWaveform &&
285
+ media.generateWaveform !== false &&
286
+ content.type === 'audio' &&
287
+ content.waveform === undefined);
288
+ }
289
+ function shouldNormalizeVoiceNote(media, content) {
290
+ return (!!media?.processor?.normalizeVoiceNote &&
291
+ media.normalizeVoiceNote === true &&
292
+ content.type === 'audio' &&
293
+ content.ptt === true);
294
+ }
295
+ function shouldGenerateStickerThumbnail(media, content) {
296
+ return (!!media?.processor?.generateStickerThumbnail &&
297
+ media.generateStickerThumbnail !== false &&
298
+ content.type === 'sticker' &&
299
+ content.pngThumbnail === undefined);
300
+ }
301
+ function hasMediaProcessingTasks(media, content) {
302
+ return (shouldGenerateThumbnail(media, content) ||
303
+ shouldProbeMedia(media, content) ||
304
+ shouldGenerateWaveform(media, content) ||
305
+ shouldGenerateStickerThumbnail(media, content));
306
+ }
307
+ async function runProcessorStep(step, content, logger, fn) {
308
+ try {
309
+ return await fn();
310
+ }
311
+ catch (error) {
312
+ logger.error('media processor step failed, skipping step', {
313
+ type: content.type,
314
+ step,
315
+ message: (0, primitives_1.toError)(error).message
316
+ });
317
+ return null;
318
+ }
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
+ }
333
+ async function runMediaProcessor(media, input, content, logger) {
334
+ const processor = media?.processor;
335
+ if (!processor || !hasMediaProcessingTasks(media, content) || !input)
336
+ return EMPTY_PROCESSED;
337
+ const result = {};
338
+ const ctx = { logger: getScopedMediaLogger(logger) };
339
+ const isVideo = content.type === 'video' || content.type === 'ptv';
340
+ const thumbFn = isVideo ? processor.generateVideoThumbnail : processor.generateImageThumbnail;
341
+ const thumbMaxEdge = isVideo ? VIDEO_THUMB_MAX_EDGE : IMAGE_THUMB_MAX_EDGE;
342
+ const thumbTask = shouldGenerateThumbnail(media, content)
343
+ ? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge, ctx))
344
+ : null;
345
+ const probeTask = shouldProbeMedia(media, content)
346
+ ? runProcessorStep('probe', content, logger, () => processor.probeMedia(input, ctx))
347
+ : null;
348
+ const [thumb, probe] = await Promise.all([thumbTask, probeTask]);
349
+ if (thumb) {
350
+ result.jpegThumbnail = thumb.jpegThumbnail;
351
+ if (!isVideo && !probe) {
352
+ result.width = thumb.width;
353
+ result.height = thumb.height;
354
+ }
355
+ }
356
+ if (probe) {
357
+ if (probe.durationSeconds !== undefined &&
358
+ !('seconds' in content && content.seconds !== undefined)) {
359
+ result.seconds = Math.floor(probe.durationSeconds);
360
+ }
361
+ if (!('width' in content && content.width !== undefined) && probe.width !== undefined) {
362
+ result.width = probe.width;
363
+ }
364
+ if (!('height' in content && content.height !== undefined) && probe.height !== undefined) {
365
+ result.height = probe.height;
366
+ }
367
+ }
368
+ if (shouldGenerateWaveform(media, content)) {
369
+ const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input, ctx));
370
+ if (waveformResult) {
371
+ result.waveform = waveformResult.waveform;
372
+ if (result.seconds === undefined &&
373
+ !('seconds' in content && content.seconds !== undefined)) {
374
+ result.seconds = Math.floor(waveformResult.durationSeconds);
375
+ }
376
+ }
377
+ }
378
+ if (content.type === 'sticker') {
379
+ if (shouldGenerateStickerThumbnail(media, content)) {
380
+ const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE, ctx));
381
+ if (stickerThumb) {
382
+ result.pngThumbnail = stickerThumb.pngThumbnail;
383
+ result.width = stickerThumb.width;
384
+ result.height = stickerThumb.height;
385
+ }
386
+ }
387
+ if (content.isAnimated === undefined) {
388
+ const header = typeof input === 'string' ? await readFileHead(input, 100) : input;
389
+ const anim = parseWebpAnimation(header);
390
+ if (anim) {
391
+ result.isAnimated = true;
392
+ result.firstFrameLength = anim.firstFrameLength;
393
+ }
394
+ else {
395
+ result.isAnimated = false;
396
+ }
397
+ }
398
+ }
399
+ return result;
400
+ }
@@ -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,11 +1,11 @@
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
10
  const sanitizeParticipantUsers = (participants) => {
11
11
  const deduped = new Set();
@@ -36,10 +36,19 @@ function createGroupParticipantsCache(options) {
36
36
  }
37
37
  return true;
38
38
  };
39
- const mergeParticipantUsersIntoCache = async (groupJid, cachedParticipants, participantsToAdd) => {
39
+ const upsertParticipants = async (cached, groupJid, participants) => {
40
+ await groupMetadataStore.upsertGroupMetadata({
41
+ groupJid,
42
+ participants,
43
+ ephemeral: cached?.ephemeral,
44
+ updatedAtMs: Date.now()
45
+ });
46
+ };
47
+ const mergeParticipantUsersIntoCache = async (groupJid, cached, participantsToAdd) => {
40
48
  if (participantsToAdd.length === 0) {
41
49
  return;
42
50
  }
51
+ const cachedParticipants = cached.participants;
43
52
  const nextParticipants = [...cachedParticipants];
44
53
  const existing = new Set(cachedParticipants);
45
54
  for (const participant of participantsToAdd) {
@@ -52,33 +61,27 @@ function createGroupParticipantsCache(options) {
52
61
  if (nextParticipants.length === cachedParticipants.length) {
53
62
  return;
54
63
  }
55
- await participantsStore.upsertGroupParticipants({
56
- groupJid,
57
- participants: nextParticipants,
58
- updatedAtMs: Date.now()
59
- });
64
+ await upsertParticipants(cached, groupJid, nextParticipants);
60
65
  };
61
- const removeParticipantUsersFromCache = async (groupJid, cachedParticipants, participantsToRemove) => {
66
+ const removeParticipantUsersFromCache = async (groupJid, cached, participantsToRemove) => {
62
67
  if (participantsToRemove.length === 0) {
63
68
  return;
64
69
  }
65
70
  const removed = new Set(participantsToRemove);
71
+ const cachedParticipants = cached.participants;
66
72
  const nextParticipants = cachedParticipants.filter((participant) => !removed.has(participant));
67
73
  if (nextParticipants.length === cachedParticipants.length) {
68
74
  return;
69
75
  }
70
76
  if (nextParticipants.length === 0) {
71
- await participantsStore.deleteGroupParticipants(groupJid);
77
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
72
78
  return;
73
79
  }
74
- await participantsStore.upsertGroupParticipants({
75
- groupJid,
76
- participants: nextParticipants,
77
- updatedAtMs: Date.now()
78
- });
80
+ await upsertParticipants(cached, groupJid, nextParticipants);
79
81
  };
80
- const replaceParticipantUsersInCache = async (groupJid, cachedParticipants, participantsToReplace, replacementParticipants) => {
82
+ const replaceParticipantUsersInCache = async (groupJid, cached, participantsToReplace, replacementParticipants) => {
81
83
  const toReplace = new Set(participantsToReplace);
84
+ const cachedParticipants = cached.participants;
82
85
  const nextParticipants = cachedParticipants.filter((participant) => !toReplace.has(participant));
83
86
  const existing = new Set(nextParticipants);
84
87
  for (const participant of replacementParticipants) {
@@ -92,16 +95,12 @@ function createGroupParticipantsCache(options) {
92
95
  return;
93
96
  }
94
97
  if (nextParticipants.length === 0) {
95
- await participantsStore.deleteGroupParticipants(groupJid);
98
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
96
99
  return;
97
100
  }
98
- await participantsStore.upsertGroupParticipants({
99
- groupJid,
100
- participants: nextParticipants,
101
- updatedAtMs: Date.now()
102
- });
101
+ await upsertParticipants(cached, groupJid, nextParticipants);
103
102
  };
104
- const resolveGroupJidForParticipantCacheEvent = (event) => {
103
+ const resolveGroupJidForGroupCacheEvent = (event) => {
105
104
  if (event.action === 'linked_group_promote' || event.action === 'linked_group_demote') {
106
105
  return event.contextGroupJid ?? event.groupJid ?? null;
107
106
  }
@@ -123,29 +122,60 @@ function createGroupParticipantsCache(options) {
123
122
  return sanitizeParticipantUsers(candidates);
124
123
  };
125
124
  const refreshParticipantUsers = (groupJid) => dedup.run(`refresh:${groupJid}`, async () => {
126
- const queried = await queryGroupParticipantJids(groupJid);
127
- const participants = sanitizeParticipantUsers(queried);
128
- await participantsStore.upsertGroupParticipants({
125
+ const queried = await queryGroupMetadata(groupJid);
126
+ const participants = sanitizeParticipantUsers(queried.participants);
127
+ await groupMetadataStore.upsertGroupMetadata({
129
128
  groupJid,
130
129
  participants,
130
+ ephemeral: queried.ephemeral,
131
131
  updatedAtMs: Date.now()
132
132
  });
133
133
  return participants;
134
134
  });
135
135
  const resolveParticipantUsers = (groupJid) => dedup.run(`resolve:${groupJid}`, async () => {
136
- const cached = await participantsStore.getGroupParticipants(groupJid);
136
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
137
137
  if (cached && cached.participants.length > 0) {
138
138
  return sanitizeParticipantUsers(cached.participants);
139
139
  }
140
140
  return refreshParticipantUsers(groupJid);
141
141
  });
142
+ const getEphemeral = async (groupJid) => {
143
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
144
+ return cached?.ephemeral ?? null;
145
+ };
146
+ const resolveEphemeral = async (groupJid) => {
147
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
148
+ if (cached) {
149
+ return cached.ephemeral ?? null;
150
+ }
151
+ await refreshParticipantUsers(groupJid);
152
+ const refreshed = await groupMetadataStore.getGroupMetadata(groupJid);
153
+ return refreshed?.ephemeral ?? null;
154
+ };
142
155
  const mutateFromGroupEvent = async (event) => {
143
- const groupJid = resolveGroupJidForParticipantCacheEvent(event);
156
+ const groupJid = resolveGroupJidForGroupCacheEvent(event);
144
157
  if (!groupJid) {
145
158
  return;
146
159
  }
147
160
  if (event.action === 'delete') {
148
- await participantsStore.deleteGroupParticipants(groupJid);
161
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
162
+ return;
163
+ }
164
+ if (event.action === 'ephemeral') {
165
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
166
+ if (!cached) {
167
+ return;
168
+ }
169
+ const nextEphemeral = event.expirationSeconds;
170
+ if (cached.ephemeral === nextEphemeral) {
171
+ return;
172
+ }
173
+ await groupMetadataStore.upsertGroupMetadata({
174
+ groupJid,
175
+ participants: cached.participants,
176
+ ephemeral: nextEphemeral,
177
+ updatedAtMs: Date.now()
178
+ });
149
179
  return;
150
180
  }
151
181
  const participantUsers = extractParticipantUsersFromGroupEvent(event);
@@ -153,14 +183,16 @@ function createGroupParticipantsCache(options) {
153
183
  if (participantUsers.length === 0) {
154
184
  return;
155
185
  }
156
- await participantsStore.upsertGroupParticipants({
186
+ const existing = await groupMetadataStore.getGroupMetadata(groupJid);
187
+ await groupMetadataStore.upsertGroupMetadata({
157
188
  groupJid,
158
189
  participants: participantUsers,
190
+ ephemeral: existing?.ephemeral,
159
191
  updatedAtMs: Date.now()
160
192
  });
161
193
  return;
162
194
  }
163
- const cached = await participantsStore.getGroupParticipants(groupJid);
195
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
164
196
  if (!cached || cached.participants.length === 0) {
165
197
  return;
166
198
  }
@@ -168,26 +200,32 @@ function createGroupParticipantsCache(options) {
168
200
  if (cachedParticipants.length === 0) {
169
201
  return;
170
202
  }
203
+ const cachedWithSanitized = {
204
+ ...cached,
205
+ participants: cachedParticipants
206
+ };
171
207
  if (event.action === 'add' ||
172
208
  event.action === 'promote' ||
173
209
  event.action === 'demote' ||
174
210
  event.action === 'linked_group_promote' ||
175
211
  event.action === 'linked_group_demote') {
176
- await mergeParticipantUsersIntoCache(groupJid, cachedParticipants, participantUsers);
212
+ await mergeParticipantUsersIntoCache(groupJid, cachedWithSanitized, participantUsers);
177
213
  return;
178
214
  }
179
215
  if (event.action === 'remove') {
180
- await removeParticipantUsersFromCache(groupJid, cachedParticipants, participantUsers);
216
+ await removeParticipantUsersFromCache(groupJid, cachedWithSanitized, participantUsers);
181
217
  return;
182
218
  }
183
219
  if (event.action === 'modify') {
184
220
  const authorUsers = event.authorJid ? sanitizeParticipantUsers([event.authorJid]) : [];
185
- await replaceParticipantUsersInCache(groupJid, cachedParticipants, authorUsers, participantUsers);
221
+ await replaceParticipantUsersInCache(groupJid, cachedWithSanitized, authorUsers, participantUsers);
186
222
  }
187
223
  };
188
224
  return {
189
225
  resolveParticipantUsers,
190
226
  refreshParticipantUsers,
227
+ getEphemeral,
228
+ resolveEphemeral,
191
229
  mutateFromGroupEvent
192
230
  };
193
231
  }