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,384 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createReadStream, createWriteStream } from 'node:fs';
3
+ import { open, stat, unlink } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { Transform } from 'node:stream';
7
+ import { pipeline } from 'node:stream/promises';
8
+ import { randomIntAsync, sha256 } from '../crypto/core/index.js';
9
+ import { bytesToBase64UrlSafe, TEXT_DECODER, toBytesView, toChunkBytes } from '../util/bytes.js';
10
+ import { toError } from '../util/primitives.js';
11
+ export async function readFileHead(filePath, bytes) {
12
+ const fh = await open(filePath, 'r');
13
+ try {
14
+ const buf = new Uint8Array(bytes);
15
+ const { bytesRead } = await fh.read(buf, 0, bytes, 0);
16
+ return buf.subarray(0, bytesRead);
17
+ }
18
+ finally {
19
+ await fh.close();
20
+ }
21
+ }
22
+ const RIFF_HEADER_SIZE = 12;
23
+ const CHUNK_HEADER_SIZE = 8;
24
+ const CHUNK_ID_SIZE = 4;
25
+ const ANMF_ID = [0x41, 0x4e, 0x4d, 0x46];
26
+ export function parseWebpAnimation(data) {
27
+ if (data.byteLength < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE)
28
+ return null;
29
+ let offset = RIFF_HEADER_SIZE;
30
+ if (data[offset] !== 0x56 ||
31
+ data[offset + 1] !== 0x50 ||
32
+ data[offset + 2] !== 0x38 ||
33
+ data[offset + 3] !== 0x58) {
34
+ return null;
35
+ }
36
+ // Skip VP8X chunk: 8 byte header + 10 byte payload
37
+ offset += CHUNK_HEADER_SIZE + 10;
38
+ while (offset + CHUNK_HEADER_SIZE <= data.byteLength) {
39
+ const isAnmf = data[offset] === ANMF_ID[0] &&
40
+ data[offset + 1] === ANMF_ID[1] &&
41
+ data[offset + 2] === ANMF_ID[2] &&
42
+ data[offset + 3] === ANMF_ID[3];
43
+ const sizeOffset = offset + CHUNK_ID_SIZE;
44
+ if (sizeOffset + 4 > data.byteLength)
45
+ return null;
46
+ let chunkSize = (data[sizeOffset] |
47
+ (data[sizeOffset + 1] << 8) |
48
+ (data[sizeOffset + 2] << 16) |
49
+ (data[sizeOffset + 3] << 24)) >>>
50
+ 0;
51
+ if (chunkSize % 2 !== 0)
52
+ chunkSize += 1;
53
+ const nextOffset = offset + CHUNK_HEADER_SIZE + chunkSize;
54
+ if (nextOffset <= offset || nextOffset > data.byteLength)
55
+ return null;
56
+ if (isAnmf) {
57
+ return { isAnimated: true, firstFrameLength: nextOffset };
58
+ }
59
+ offset = nextOffset;
60
+ }
61
+ return null;
62
+ }
63
+ const IMAGE_THUMB_MAX_EDGE = 320;
64
+ const VIDEO_THUMB_MAX_EDGE = 48;
65
+ const STICKER_THUMB_MAX_EDGE = 100;
66
+ const EMPTY_PROCESSED = {};
67
+ export function isReadableStream(value) {
68
+ return (!!value &&
69
+ typeof value === 'object' &&
70
+ 'pipe' in value &&
71
+ typeof value.pipe === 'function');
72
+ }
73
+ async function streamToTempFile(source) {
74
+ const filePath = join(tmpdir(), `zapo-media-${Date.now()}-${Math.random().toString(36).slice(2)}`);
75
+ try {
76
+ await pipeline(source, createWriteStream(filePath));
77
+ }
78
+ catch (error) {
79
+ await unlink(filePath).catch(() => undefined);
80
+ throw error;
81
+ }
82
+ return filePath;
83
+ }
84
+ export async function cleanupTempFile(filePath) {
85
+ await unlink(filePath).catch(() => undefined);
86
+ }
87
+ function createSha256SizeMeter() {
88
+ const hash = createHash('sha256');
89
+ let byteLength = 0;
90
+ const transform = new Transform({
91
+ transform(chunk, _enc, cb) {
92
+ const bytes = chunk instanceof Uint8Array ? chunk : toChunkBytes(chunk);
93
+ hash.update(bytes);
94
+ byteLength += bytes.byteLength;
95
+ cb(null, bytes);
96
+ }
97
+ });
98
+ return {
99
+ transform,
100
+ finalize: () => ({ fileSha256: toBytesView(hash.digest()), byteLength })
101
+ };
102
+ }
103
+ async function streamToTempFileWithSha256(source) {
104
+ const filePath = join(tmpdir(), `zapo-media-${Date.now()}-${Math.random().toString(36).slice(2)}`);
105
+ const meter = createSha256SizeMeter();
106
+ try {
107
+ await pipeline(source, meter.transform, createWriteStream(filePath));
108
+ }
109
+ catch (error) {
110
+ await unlink(filePath).catch(() => undefined);
111
+ throw error;
112
+ }
113
+ return { filePath, ...meter.finalize() };
114
+ }
115
+ async function preparePlaintextUploadSource(media) {
116
+ if (media instanceof Uint8Array) {
117
+ return { fileSha256: sha256(media), byteLength: media.byteLength, body: media };
118
+ }
119
+ if (typeof media === 'string') {
120
+ await assertReadableFile(media);
121
+ const result = await streamToTempFileWithSha256(createReadStream(media));
122
+ return {
123
+ fileSha256: result.fileSha256,
124
+ byteLength: result.byteLength,
125
+ body: createReadStream(result.filePath),
126
+ cleanup: () => cleanupTempFile(result.filePath)
127
+ };
128
+ }
129
+ if (isReadableStream(media)) {
130
+ const result = await streamToTempFileWithSha256(media);
131
+ return {
132
+ fileSha256: result.fileSha256,
133
+ byteLength: result.byteLength,
134
+ body: createReadStream(result.filePath),
135
+ cleanup: () => cleanupTempFile(result.filePath)
136
+ };
137
+ }
138
+ throw new Error('media upload received unsupported source type');
139
+ }
140
+ // node:crypto randomInt caps max at 2**48 - 1; well within JS safe integer range.
141
+ const MEDIA_UPLOAD_ID_MAX = 281474976710655;
142
+ async function generateMediaUploadId() {
143
+ const value = await randomIntAsync(0, MEDIA_UPLOAD_ID_MAX);
144
+ return value.toString(10);
145
+ }
146
+ export function selectMediaUploadHost(mediaConn) {
147
+ return mediaConn.hosts.find((host) => !host.isFallback)?.hostname ?? mediaConn.hosts[0].hostname;
148
+ }
149
+ export function buildMediaUploadUrl(host, path, auth, fileSha256, mediaId) {
150
+ const hashToken = bytesToBase64UrlSafe(fileSha256);
151
+ const base = `https://${host}${path}/${hashToken}?auth=${encodeURIComponent(auth)}&token=${encodeURIComponent(hashToken)}`;
152
+ return mediaId !== undefined ? `${base}&media_id=${mediaId}` : base;
153
+ }
154
+ export function assertMediaUploadStatus(status, label) {
155
+ if (status < 200 || status >= 300) {
156
+ throw new Error(`${label} failed with status ${status}`);
157
+ }
158
+ }
159
+ export function parseMediaUploadJsonBody(body, label) {
160
+ try {
161
+ return JSON.parse(TEXT_DECODER.decode(body));
162
+ }
163
+ catch (error) {
164
+ throw new Error(`${label} returned invalid json: ${toError(error).message}`);
165
+ }
166
+ }
167
+ export async function performPlaintextMediaUpload(deps, input) {
168
+ const prepared = await preparePlaintextUploadSource(input.source);
169
+ try {
170
+ const host = selectMediaUploadHost(deps.mediaConn);
171
+ const mediaId = await generateMediaUploadId();
172
+ const url = buildMediaUploadUrl(host, input.path, deps.mediaConn.auth, prepared.fileSha256, mediaId);
173
+ deps.logger.debug(input.logLabel ?? 'sending media upload', {
174
+ host,
175
+ path: input.path,
176
+ size: prepared.byteLength
177
+ });
178
+ const response = await deps.mediaTransfer.uploadStream({
179
+ url,
180
+ method: 'POST',
181
+ body: prepared.body,
182
+ contentLength: prepared.byteLength,
183
+ contentType: input.mimetype
184
+ });
185
+ const responseBytes = await deps.mediaTransfer.readResponseBytes(response);
186
+ return {
187
+ responseBytes,
188
+ status: response.status,
189
+ fileSha256: prepared.fileSha256,
190
+ byteLength: prepared.byteLength,
191
+ mediaId
192
+ };
193
+ }
194
+ finally {
195
+ await prepared.cleanup?.();
196
+ }
197
+ }
198
+ async function assertReadableFile(filePath) {
199
+ try {
200
+ const stats = await stat(filePath);
201
+ if (!stats.isFile()) {
202
+ throw new Error(`media path is not a regular file: ${filePath}`);
203
+ }
204
+ }
205
+ catch (error) {
206
+ const err = toError(error);
207
+ if (err.code === 'ENOENT') {
208
+ throw new Error(`media file not found: ${filePath}`);
209
+ }
210
+ throw err;
211
+ }
212
+ }
213
+ export async function resolveMediaInputs(shouldProcess, raw) {
214
+ if (typeof raw === 'string') {
215
+ await assertReadableFile(raw);
216
+ return {
217
+ processorInput: raw,
218
+ uploadMedia: createReadStream(raw)
219
+ };
220
+ }
221
+ if (isReadableStream(raw)) {
222
+ if (shouldProcess) {
223
+ const tempFilePath = await streamToTempFile(raw);
224
+ return {
225
+ processorInput: tempFilePath,
226
+ uploadMedia: createReadStream(tempFilePath),
227
+ tempFilePath
228
+ };
229
+ }
230
+ return { uploadMedia: raw };
231
+ }
232
+ const bytes = toBytesView(raw);
233
+ return { processorInput: bytes, uploadMedia: bytes };
234
+ }
235
+ function shouldGenerateThumbnail(media, content) {
236
+ if (!media?.processor || media.generateThumbnail === false) {
237
+ return false;
238
+ }
239
+ switch (content.type) {
240
+ case 'image':
241
+ return content.jpegThumbnail === undefined && !!media.processor.generateImageThumbnail;
242
+ case 'video':
243
+ case 'ptv':
244
+ return content.jpegThumbnail === undefined && !!media.processor.generateVideoThumbnail;
245
+ case 'document':
246
+ return !!media.processor.generateImageThumbnail;
247
+ default:
248
+ return false;
249
+ }
250
+ }
251
+ function shouldProbeMedia(media, content) {
252
+ if (!media?.processor?.probeMedia || media.generateProbe === false) {
253
+ return false;
254
+ }
255
+ switch (content.type) {
256
+ case 'video':
257
+ case 'ptv':
258
+ return (content.seconds === undefined ||
259
+ content.width === undefined ||
260
+ content.height === undefined);
261
+ case 'audio':
262
+ return content.seconds === undefined;
263
+ default:
264
+ return false;
265
+ }
266
+ }
267
+ function shouldGenerateWaveform(media, content) {
268
+ return (!!media?.processor?.computeWaveform &&
269
+ media.generateWaveform !== false &&
270
+ content.type === 'audio' &&
271
+ content.waveform === undefined);
272
+ }
273
+ export function shouldNormalizeVoiceNote(media, content) {
274
+ return (!!media?.processor?.normalizeVoiceNote &&
275
+ media.normalizeVoiceNote === true &&
276
+ content.type === 'audio' &&
277
+ content.ptt === true);
278
+ }
279
+ function shouldGenerateStickerThumbnail(media, content) {
280
+ return (!!media?.processor?.generateStickerThumbnail &&
281
+ media.generateStickerThumbnail !== false &&
282
+ content.type === 'sticker' &&
283
+ content.pngThumbnail === undefined);
284
+ }
285
+ export function hasMediaProcessingTasks(media, content) {
286
+ return (shouldGenerateThumbnail(media, content) ||
287
+ shouldProbeMedia(media, content) ||
288
+ shouldGenerateWaveform(media, content) ||
289
+ shouldGenerateStickerThumbnail(media, content));
290
+ }
291
+ async function runProcessorStep(step, content, logger, fn) {
292
+ try {
293
+ return await fn();
294
+ }
295
+ catch (error) {
296
+ logger.error('media processor step failed, skipping step', {
297
+ type: content.type,
298
+ step,
299
+ message: toError(error).message
300
+ });
301
+ return null;
302
+ }
303
+ }
304
+ // Reuse one scoped child logger per parent. The processor is allowed to be
305
+ // shared across WaClient sessions; without this cache, each call would mint
306
+ // a fresh child logger and any package-side dedup keyed by Logger identity
307
+ // (e.g. ffmpeg's missing-binary warn) would reset on every send.
308
+ const SCOPED_MEDIA_LOGGER_CACHE = new WeakMap();
309
+ export function getScopedMediaLogger(parent) {
310
+ let scoped = SCOPED_MEDIA_LOGGER_CACHE.get(parent);
311
+ if (!scoped) {
312
+ scoped = parent.child({ scope: 'media-utils' });
313
+ SCOPED_MEDIA_LOGGER_CACHE.set(parent, scoped);
314
+ }
315
+ return scoped;
316
+ }
317
+ export async function runMediaProcessor(media, input, content, logger) {
318
+ const processor = media?.processor;
319
+ if (!processor || !hasMediaProcessingTasks(media, content) || !input)
320
+ return EMPTY_PROCESSED;
321
+ const result = {};
322
+ const ctx = { logger: getScopedMediaLogger(logger) };
323
+ const isVideo = content.type === 'video' || content.type === 'ptv';
324
+ const thumbFn = isVideo ? processor.generateVideoThumbnail : processor.generateImageThumbnail;
325
+ const thumbMaxEdge = isVideo ? VIDEO_THUMB_MAX_EDGE : IMAGE_THUMB_MAX_EDGE;
326
+ const thumbTask = shouldGenerateThumbnail(media, content)
327
+ ? runProcessorStep('thumbnail', content, logger, () => thumbFn(input, thumbMaxEdge, ctx))
328
+ : null;
329
+ const probeTask = shouldProbeMedia(media, content)
330
+ ? runProcessorStep('probe', content, logger, () => processor.probeMedia(input, ctx))
331
+ : null;
332
+ const [thumb, probe] = await Promise.all([thumbTask, probeTask]);
333
+ if (thumb) {
334
+ result.jpegThumbnail = thumb.jpegThumbnail;
335
+ if (!isVideo && !probe) {
336
+ result.width = thumb.width;
337
+ result.height = thumb.height;
338
+ }
339
+ }
340
+ if (probe) {
341
+ if (probe.durationSeconds !== undefined &&
342
+ !('seconds' in content && content.seconds !== undefined)) {
343
+ result.seconds = Math.floor(probe.durationSeconds);
344
+ }
345
+ if (!('width' in content && content.width !== undefined) && probe.width !== undefined) {
346
+ result.width = probe.width;
347
+ }
348
+ if (!('height' in content && content.height !== undefined) && probe.height !== undefined) {
349
+ result.height = probe.height;
350
+ }
351
+ }
352
+ if (shouldGenerateWaveform(media, content)) {
353
+ const waveformResult = await runProcessorStep('waveform', content, logger, () => processor.computeWaveform(input, ctx));
354
+ if (waveformResult) {
355
+ result.waveform = waveformResult.waveform;
356
+ if (result.seconds === undefined &&
357
+ !('seconds' in content && content.seconds !== undefined)) {
358
+ result.seconds = Math.floor(waveformResult.durationSeconds);
359
+ }
360
+ }
361
+ }
362
+ if (content.type === 'sticker') {
363
+ if (shouldGenerateStickerThumbnail(media, content)) {
364
+ const stickerThumb = await runProcessorStep('stickerThumbnail', content, logger, () => processor.generateStickerThumbnail(input, STICKER_THUMB_MAX_EDGE, ctx));
365
+ if (stickerThumb) {
366
+ result.pngThumbnail = stickerThumb.pngThumbnail;
367
+ result.width = stickerThumb.width;
368
+ result.height = stickerThumb.height;
369
+ }
370
+ }
371
+ if (content.isAnimated === undefined) {
372
+ const header = typeof input === 'string' ? await readFileHead(input, 100) : input;
373
+ const anim = parseWebpAnimation(header);
374
+ if (anim) {
375
+ result.isAnimated = true;
376
+ result.firstFrameLength = anim.firstFrameLength;
377
+ }
378
+ else {
379
+ result.isAnimated = false;
380
+ }
381
+ }
382
+ }
383
+ return result;
384
+ }
@@ -1,8 +1,8 @@
1
1
  import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
2
- import { isHostedDeviceJid, normalizeDeviceJid, splitJid, toUserJid } from '../../protocol/jid.js';
2
+ import { normalizeDeviceJid, splitJid, toUserJid } from '../../protocol/jid.js';
3
3
  import { toError } from '../../util/primitives.js';
4
4
  export function createDeviceFanoutResolver(options) {
5
- const { signalDeviceSync, getCurrentMeJid, getCurrentMeLid, logger } = options;
5
+ const { signalDeviceSync, getCurrentCredentials, logger } = options;
6
6
  const dedup = new PromiseDedup();
7
7
  const resolveDirectFanoutDeviceJids = async (recipientJid, selfDeviceJidForRecipient) => {
8
8
  const recipientUserJid = toUserJid(recipientJid);
@@ -37,7 +37,7 @@ export function createDeviceFanoutResolver(options) {
37
37
  return [...fanout];
38
38
  }
39
39
  catch (error) {
40
- logger.warn('signal device fanout sync failed, falling back to direct recipient', {
40
+ logger.debug('signal device fanout sync failed, falling back to direct recipient', {
41
41
  to: recipientJid,
42
42
  message: toError(error).message
43
43
  });
@@ -46,7 +46,8 @@ export function createDeviceFanoutResolver(options) {
46
46
  };
47
47
  const resolveGroupParticipantDeviceJidsInternal = async (participantUserJids) => {
48
48
  const meDeviceJids = new Set();
49
- const meJid = getCurrentMeJid();
49
+ const credentials = getCurrentCredentials();
50
+ const meJid = credentials?.meJid;
50
51
  if (meJid) {
51
52
  try {
52
53
  meDeviceJids.add(normalizeDeviceJid(meJid));
@@ -58,7 +59,7 @@ export function createDeviceFanoutResolver(options) {
58
59
  });
59
60
  }
60
61
  }
61
- const meLid = getCurrentMeLid();
62
+ const meLid = credentials?.meLid;
62
63
  if (meLid && meLid.includes('@')) {
63
64
  try {
64
65
  meDeviceJids.add(normalizeDeviceJid(meLid));
@@ -92,9 +93,6 @@ export function createDeviceFanoutResolver(options) {
92
93
  }
93
94
  for (const deviceJid of entry.deviceJids) {
94
95
  const normalizedDeviceJid = normalizeDeviceJid(deviceJid);
95
- if (isHostedDeviceJid(normalizedDeviceJid)) {
96
- continue;
97
- }
98
96
  if (meDeviceJids.has(normalizedDeviceJid)) {
99
97
  continue;
100
98
  }
@@ -104,7 +102,7 @@ export function createDeviceFanoutResolver(options) {
104
102
  return [...fanout];
105
103
  }
106
104
  catch (error) {
107
- logger.warn('group participant device sync failed, falling back to participant user jids', {
105
+ logger.debug('group participant device sync failed, falling back to participant user jids', {
108
106
  participants: candidateUsers.length,
109
107
  message: toError(error).message
110
108
  });
@@ -128,14 +126,15 @@ export function createDeviceFanoutResolver(options) {
128
126
  }
129
127
  };
130
128
  const resolveOwnPeerDeviceJids = async () => {
131
- const meJid = getCurrentMeJid();
129
+ const credentials = getCurrentCredentials();
130
+ const meJid = credentials?.meJid;
132
131
  if (!meJid) {
133
132
  throw new Error('resolveOwnPeerDeviceJids requires registered meJid');
134
133
  }
135
134
  const meUserJid = toUserJid(meJid);
136
135
  const meDevices = new Set();
137
136
  meDevices.add(normalizeDeviceJid(meJid));
138
- const meLid = getCurrentMeLid();
137
+ const meLid = credentials?.meLid;
139
138
  if (meLid && meLid.includes('@')) {
140
139
  try {
141
140
  meDevices.add(normalizeDeviceJid(meLid));
@@ -1,8 +1,8 @@
1
1
  import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
2
2
  import { toUserJid } from '../../protocol/jid.js';
3
3
  import { toError } from '../../util/primitives.js';
4
- export function createGroupParticipantsCache(options) {
5
- const { participantsStore, queryGroupParticipantJids, logger } = options;
4
+ export function createGroupMetadataCache(options) {
5
+ const { groupMetadataStore, queryGroupMetadata, logger } = options;
6
6
  const dedup = new PromiseDedup();
7
7
  const sanitizeParticipantUsers = (participants) => {
8
8
  const deduped = new Set();
@@ -33,10 +33,19 @@ export function createGroupParticipantsCache(options) {
33
33
  }
34
34
  return true;
35
35
  };
36
- const mergeParticipantUsersIntoCache = async (groupJid, cachedParticipants, participantsToAdd) => {
36
+ const upsertParticipants = async (cached, groupJid, participants) => {
37
+ await groupMetadataStore.upsertGroupMetadata({
38
+ groupJid,
39
+ participants,
40
+ ephemeral: cached?.ephemeral,
41
+ updatedAtMs: Date.now()
42
+ });
43
+ };
44
+ const mergeParticipantUsersIntoCache = async (groupJid, cached, participantsToAdd) => {
37
45
  if (participantsToAdd.length === 0) {
38
46
  return;
39
47
  }
48
+ const cachedParticipants = cached.participants;
40
49
  const nextParticipants = [...cachedParticipants];
41
50
  const existing = new Set(cachedParticipants);
42
51
  for (const participant of participantsToAdd) {
@@ -49,33 +58,27 @@ export function createGroupParticipantsCache(options) {
49
58
  if (nextParticipants.length === cachedParticipants.length) {
50
59
  return;
51
60
  }
52
- await participantsStore.upsertGroupParticipants({
53
- groupJid,
54
- participants: nextParticipants,
55
- updatedAtMs: Date.now()
56
- });
61
+ await upsertParticipants(cached, groupJid, nextParticipants);
57
62
  };
58
- const removeParticipantUsersFromCache = async (groupJid, cachedParticipants, participantsToRemove) => {
63
+ const removeParticipantUsersFromCache = async (groupJid, cached, participantsToRemove) => {
59
64
  if (participantsToRemove.length === 0) {
60
65
  return;
61
66
  }
62
67
  const removed = new Set(participantsToRemove);
68
+ const cachedParticipants = cached.participants;
63
69
  const nextParticipants = cachedParticipants.filter((participant) => !removed.has(participant));
64
70
  if (nextParticipants.length === cachedParticipants.length) {
65
71
  return;
66
72
  }
67
73
  if (nextParticipants.length === 0) {
68
- await participantsStore.deleteGroupParticipants(groupJid);
74
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
69
75
  return;
70
76
  }
71
- await participantsStore.upsertGroupParticipants({
72
- groupJid,
73
- participants: nextParticipants,
74
- updatedAtMs: Date.now()
75
- });
77
+ await upsertParticipants(cached, groupJid, nextParticipants);
76
78
  };
77
- const replaceParticipantUsersInCache = async (groupJid, cachedParticipants, participantsToReplace, replacementParticipants) => {
79
+ const replaceParticipantUsersInCache = async (groupJid, cached, participantsToReplace, replacementParticipants) => {
78
80
  const toReplace = new Set(participantsToReplace);
81
+ const cachedParticipants = cached.participants;
79
82
  const nextParticipants = cachedParticipants.filter((participant) => !toReplace.has(participant));
80
83
  const existing = new Set(nextParticipants);
81
84
  for (const participant of replacementParticipants) {
@@ -89,16 +92,12 @@ export function createGroupParticipantsCache(options) {
89
92
  return;
90
93
  }
91
94
  if (nextParticipants.length === 0) {
92
- await participantsStore.deleteGroupParticipants(groupJid);
95
+ await groupMetadataStore.deleteGroupMetadata(groupJid);
93
96
  return;
94
97
  }
95
- await participantsStore.upsertGroupParticipants({
96
- groupJid,
97
- participants: nextParticipants,
98
- updatedAtMs: Date.now()
99
- });
98
+ await upsertParticipants(cached, groupJid, nextParticipants);
100
99
  };
101
- const resolveGroupJidForParticipantCacheEvent = (event) => {
100
+ const resolveGroupJidForGroupCacheEvent = (event) => {
102
101
  if (event.action === 'linked_group_promote' || event.action === 'linked_group_demote') {
103
102
  return event.contextGroupJid ?? event.groupJid ?? null;
104
103
  }
@@ -120,29 +119,60 @@ export function createGroupParticipantsCache(options) {
120
119
  return sanitizeParticipantUsers(candidates);
121
120
  };
122
121
  const refreshParticipantUsers = (groupJid) => dedup.run(`refresh:${groupJid}`, async () => {
123
- const queried = await queryGroupParticipantJids(groupJid);
124
- const participants = sanitizeParticipantUsers(queried);
125
- await participantsStore.upsertGroupParticipants({
122
+ const queried = await queryGroupMetadata(groupJid);
123
+ const participants = sanitizeParticipantUsers(queried.participants);
124
+ await groupMetadataStore.upsertGroupMetadata({
126
125
  groupJid,
127
126
  participants,
127
+ ephemeral: queried.ephemeral,
128
128
  updatedAtMs: Date.now()
129
129
  });
130
130
  return participants;
131
131
  });
132
132
  const resolveParticipantUsers = (groupJid) => dedup.run(`resolve:${groupJid}`, async () => {
133
- const cached = await participantsStore.getGroupParticipants(groupJid);
133
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
134
134
  if (cached && cached.participants.length > 0) {
135
135
  return sanitizeParticipantUsers(cached.participants);
136
136
  }
137
137
  return refreshParticipantUsers(groupJid);
138
138
  });
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
+ };
139
152
  const mutateFromGroupEvent = async (event) => {
140
- const groupJid = resolveGroupJidForParticipantCacheEvent(event);
153
+ const groupJid = resolveGroupJidForGroupCacheEvent(event);
141
154
  if (!groupJid) {
142
155
  return;
143
156
  }
144
157
  if (event.action === 'delete') {
145
- 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
+ });
146
176
  return;
147
177
  }
148
178
  const participantUsers = extractParticipantUsersFromGroupEvent(event);
@@ -150,14 +180,16 @@ export function createGroupParticipantsCache(options) {
150
180
  if (participantUsers.length === 0) {
151
181
  return;
152
182
  }
153
- await participantsStore.upsertGroupParticipants({
183
+ const existing = await groupMetadataStore.getGroupMetadata(groupJid);
184
+ await groupMetadataStore.upsertGroupMetadata({
154
185
  groupJid,
155
186
  participants: participantUsers,
187
+ ephemeral: existing?.ephemeral,
156
188
  updatedAtMs: Date.now()
157
189
  });
158
190
  return;
159
191
  }
160
- const cached = await participantsStore.getGroupParticipants(groupJid);
192
+ const cached = await groupMetadataStore.getGroupMetadata(groupJid);
161
193
  if (!cached || cached.participants.length === 0) {
162
194
  return;
163
195
  }
@@ -165,26 +197,32 @@ export function createGroupParticipantsCache(options) {
165
197
  if (cachedParticipants.length === 0) {
166
198
  return;
167
199
  }
200
+ const cachedWithSanitized = {
201
+ ...cached,
202
+ participants: cachedParticipants
203
+ };
168
204
  if (event.action === 'add' ||
169
205
  event.action === 'promote' ||
170
206
  event.action === 'demote' ||
171
207
  event.action === 'linked_group_promote' ||
172
208
  event.action === 'linked_group_demote') {
173
- await mergeParticipantUsersIntoCache(groupJid, cachedParticipants, participantUsers);
209
+ await mergeParticipantUsersIntoCache(groupJid, cachedWithSanitized, participantUsers);
174
210
  return;
175
211
  }
176
212
  if (event.action === 'remove') {
177
- await removeParticipantUsersFromCache(groupJid, cachedParticipants, participantUsers);
213
+ await removeParticipantUsersFromCache(groupJid, cachedWithSanitized, participantUsers);
178
214
  return;
179
215
  }
180
216
  if (event.action === 'modify') {
181
217
  const authorUsers = event.authorJid ? sanitizeParticipantUsers([event.authorJid]) : [];
182
- await replaceParticipantUsersInCache(groupJid, cachedParticipants, authorUsers, participantUsers);
218
+ await replaceParticipantUsersInCache(groupJid, cachedWithSanitized, authorUsers, participantUsers);
183
219
  }
184
220
  };
185
221
  return {
186
222
  resolveParticipantUsers,
187
223
  refreshParticipantUsers,
224
+ getEphemeral,
225
+ resolveEphemeral,
188
226
  mutateFromGroupEvent
189
227
  };
190
228
  }