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,133 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { Readable } from 'node:stream';
3
+ import { TEXT_ENCODER } from '../../util/bytes.js';
4
+ const SIGNATURE_LOCAL_FILE = 0x04034b50;
5
+ const SIGNATURE_CENTRAL_DIR = 0x02014b50;
6
+ const SIGNATURE_END_OF_CENTRAL_DIR = 0x06054b50;
7
+ const COMPRESSION_STORED = 0;
8
+ const VERSION_NEEDED = 20;
9
+ const LOCAL_HEADER_SIZE = 30;
10
+ const CENTRAL_HEADER_SIZE = 46;
11
+ const EOCD_SIZE = 22;
12
+ const CRC32_TABLE = (() => {
13
+ const table = new Array(256);
14
+ for (let i = 0; i < 256; i += 1) {
15
+ let c = i;
16
+ for (let k = 0; k < 8; k += 1) {
17
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
18
+ }
19
+ table[i] = c >>> 0;
20
+ }
21
+ return table;
22
+ })();
23
+ function crc32(bytes) {
24
+ let crc = 0xffffffff;
25
+ for (let i = 0; i < bytes.byteLength; i += 1) {
26
+ crc = CRC32_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);
27
+ }
28
+ return (crc ^ 0xffffffff) >>> 0;
29
+ }
30
+ function validateEntries(entries) {
31
+ if (entries.length === 0) {
32
+ throw new Error('sticker pack zip requires at least one entry');
33
+ }
34
+ const seen = new Set();
35
+ for (const entry of entries) {
36
+ if (!entry.fileName) {
37
+ throw new Error('sticker pack zip entry requires a non-empty fileName');
38
+ }
39
+ if (seen.has(entry.fileName)) {
40
+ throw new Error(`sticker pack zip has duplicate fileName: ${entry.fileName}`);
41
+ }
42
+ seen.add(entry.fileName);
43
+ }
44
+ }
45
+ async function loadEntryBytes(source) {
46
+ if (typeof source === 'string') {
47
+ const buf = await readFile(source);
48
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
49
+ }
50
+ return source;
51
+ }
52
+ function buildLocalHeader(name, crc, dataLength) {
53
+ const out = new Uint8Array(LOCAL_HEADER_SIZE + name.byteLength);
54
+ const view = new DataView(out.buffer, out.byteOffset, out.byteLength);
55
+ view.setUint32(0, SIGNATURE_LOCAL_FILE, true);
56
+ view.setUint16(4, VERSION_NEEDED, true);
57
+ view.setUint16(6, 0, true);
58
+ view.setUint16(8, COMPRESSION_STORED, true);
59
+ view.setUint16(10, 0, true);
60
+ view.setUint16(12, 0, true);
61
+ view.setUint32(14, crc, true);
62
+ view.setUint32(18, dataLength, true);
63
+ view.setUint32(22, dataLength, true);
64
+ view.setUint16(26, name.byteLength, true);
65
+ view.setUint16(28, 0, true);
66
+ out.set(name, LOCAL_HEADER_SIZE);
67
+ return out;
68
+ }
69
+ function buildCentralDirectory(entries) {
70
+ let totalSize = 0;
71
+ for (const entry of entries)
72
+ totalSize += CENTRAL_HEADER_SIZE + entry.name.byteLength;
73
+ const out = new Uint8Array(totalSize);
74
+ const view = new DataView(out.buffer, out.byteOffset, out.byteLength);
75
+ let offset = 0;
76
+ for (const entry of entries) {
77
+ view.setUint32(offset, SIGNATURE_CENTRAL_DIR, true);
78
+ view.setUint16(offset + 4, VERSION_NEEDED, true);
79
+ view.setUint16(offset + 6, VERSION_NEEDED, true);
80
+ view.setUint16(offset + 8, 0, true);
81
+ view.setUint16(offset + 10, COMPRESSION_STORED, true);
82
+ view.setUint16(offset + 12, 0, true);
83
+ view.setUint16(offset + 14, 0, true);
84
+ view.setUint32(offset + 16, entry.crc, true);
85
+ view.setUint32(offset + 20, entry.dataLength, true);
86
+ view.setUint32(offset + 24, entry.dataLength, true);
87
+ view.setUint16(offset + 28, entry.name.byteLength, true);
88
+ view.setUint16(offset + 30, 0, true);
89
+ view.setUint16(offset + 32, 0, true);
90
+ view.setUint16(offset + 34, 0, true);
91
+ view.setUint16(offset + 36, 0, true);
92
+ view.setUint32(offset + 38, 0, true);
93
+ view.setUint32(offset + 42, entry.localOffset, true);
94
+ offset += CENTRAL_HEADER_SIZE;
95
+ out.set(entry.name, offset);
96
+ offset += entry.name.byteLength;
97
+ }
98
+ return out;
99
+ }
100
+ function buildEocd(entryCount, centralDirSize, centralDirOffset) {
101
+ const out = new Uint8Array(EOCD_SIZE);
102
+ const view = new DataView(out.buffer, out.byteOffset, out.byteLength);
103
+ view.setUint32(0, SIGNATURE_END_OF_CENTRAL_DIR, true);
104
+ view.setUint16(4, 0, true);
105
+ view.setUint16(6, 0, true);
106
+ view.setUint16(8, entryCount, true);
107
+ view.setUint16(10, entryCount, true);
108
+ view.setUint32(12, centralDirSize, true);
109
+ view.setUint32(16, centralDirOffset, true);
110
+ view.setUint16(20, 0, true);
111
+ return out;
112
+ }
113
+ export function createStickerPackZipStream(entries) {
114
+ validateEntries(entries);
115
+ return Readable.from(zipChunks(entries));
116
+ }
117
+ async function* zipChunks(entries) {
118
+ const central = [];
119
+ let offset = 0;
120
+ for (const entry of entries) {
121
+ const data = await loadEntryBytes(entry.source);
122
+ const name = TEXT_ENCODER.encode(entry.fileName);
123
+ const crc = crc32(data);
124
+ const header = buildLocalHeader(name, crc, data.byteLength);
125
+ yield header;
126
+ yield data;
127
+ central.push({ name, crc, dataLength: data.byteLength, localOffset: offset });
128
+ offset += header.byteLength + data.byteLength;
129
+ }
130
+ const centralDir = buildCentralDirectory(central);
131
+ yield centralDir;
132
+ yield buildEocd(central.length, centralDir.byteLength, offset);
133
+ }
@@ -1,10 +1,10 @@
1
- import { Readable } from 'node:stream';
2
- import { DEFAULT_MEDIA_HOSTS } from './constants.js';
3
- import { WaMediaCrypto } from './WaMediaCrypto.js';
4
- import { WA_DEFAULTS } from '../protocol/constants.js';
5
- import { EMPTY_BYTES, readAllBytes } from '../util/bytes.js';
6
- import { toError } from '../util/primitives.js';
7
- const GOT_OPTIONAL_MODULE = 'got';
1
+ import http from 'node:http';
2
+ import https from 'node:https';
3
+ import { DEFAULT_MEDIA_HOSTS } from '../constants.js';
4
+ import { WaMediaCrypto } from '../crypto/WaMediaCrypto.js';
5
+ import { WA_DEFAULTS } from '../../protocol/constants.js';
6
+ import { EMPTY_BYTES, readAllBytes } from '../../util/bytes.js';
7
+ import { toError } from '../../util/primitives.js';
8
8
  function normalizeHeaderRecord(headers) {
9
9
  if (!headers) {
10
10
  return {};
@@ -15,56 +15,11 @@ function normalizeHeaderRecord(headers) {
15
15
  }
16
16
  return normalized;
17
17
  }
18
- function asOptionalGotModule(loaded) {
19
- if (loaded && typeof loaded === 'object') {
20
- const direct = loaded.stream;
21
- if (typeof direct === 'function') {
22
- return loaded;
23
- }
24
- const fallback = loaded.default;
25
- if (fallback &&
26
- typeof fallback === 'object' &&
27
- 'stream' in fallback &&
28
- typeof fallback.stream === 'function') {
29
- return fallback;
30
- }
31
- if (typeof fallback === 'function' && 'stream' in fallback) {
32
- const maybeStream = fallback.stream;
33
- if (typeof maybeStream === 'function') {
34
- return fallback;
35
- }
36
- }
37
- }
38
- if (typeof loaded === 'function' && 'stream' in loaded) {
39
- const maybeStream = loaded.stream;
40
- if (typeof maybeStream === 'function') {
41
- return loaded;
42
- }
43
- }
44
- return null;
45
- }
46
- async function loadOptionalGotModule() {
47
- try {
48
- const loaded = await import(GOT_OPTIONAL_MODULE);
49
- const module = asOptionalGotModule(loaded);
50
- if (module) {
51
- return module;
52
- }
53
- throw new Error('invalid got module export');
54
- }
55
- catch (error) {
56
- const normalized = toError(error);
57
- const code = normalized.code;
58
- const message = normalized.message ?? '';
59
- const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
60
- (message.includes(`'${GOT_OPTIONAL_MODULE}'`) ||
61
- message.includes(`"${GOT_OPTIONAL_MODULE}"`));
62
- if (isModuleNotFound) {
63
- throw new Error('optional dependency "got" is not installed. Install with: npm i got');
64
- }
65
- throw normalized;
66
- }
67
- }
18
+ /**
19
+ * Streaming media uploader/downloader. Handles host failover, encryption
20
+ * (`WaMediaCrypto`), and MAC verification. Used internally by the message
21
+ * coordinator and exposed for direct media transfer use cases.
22
+ */
68
23
  export class WaMediaTransferClient {
69
24
  constructor(options = {}) {
70
25
  this.logger = options.logger;
@@ -72,31 +27,29 @@ export class WaMediaTransferClient {
72
27
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.MEDIA_TIMEOUT_MS;
73
28
  this.defaultMaxReadBytes = options.defaultMaxReadBytes;
74
29
  this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
75
- this.defaultUploadDispatcher = options.defaultUploadDispatcher;
76
- this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
77
30
  this.defaultUploadAgent = options.defaultUploadAgent;
78
31
  this.defaultDownloadAgent = options.defaultDownloadAgent;
79
- this.gotModulePromise = null;
32
+ this.skipMacVerification = options.skipMacVerification === true;
80
33
  }
34
+ /**
35
+ * Streams an encrypted media payload from the first responsive media host.
36
+ * Returns the raw transfer response – caller is responsible for piping the body.
37
+ */
81
38
  async downloadStream(request) {
82
39
  const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
83
- const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
84
40
  const agent = request.agent ?? this.defaultDownloadAgent;
85
41
  this.logger?.debug('media download stream start', {
86
42
  urls: urls.length,
87
43
  timeoutMs
88
44
  });
89
- const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.transferRequest(url, {
90
- method: 'GET',
91
- headers,
92
- signal
93
- }, dispatcher, agent));
45
+ const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method: 'GET', headers, signal }, agent));
94
46
  this.logger?.trace('media download stream response', {
95
47
  url: result.url,
96
48
  status: result.status
97
49
  });
98
50
  return result;
99
51
  }
52
+ /** Convenience wrapper: downloads the encrypted body and returns it as a Uint8Array. */
100
53
  async downloadBytes(request) {
101
54
  const response = await this.downloadStream(request);
102
55
  await this.assertSuccessfulResponse(response);
@@ -107,6 +60,10 @@ export class WaMediaTransferClient {
107
60
  maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
108
61
  });
109
62
  }
63
+ /**
64
+ * Uploads a raw (already-encrypted or plaintext) body to the requested
65
+ * media URL. Returns the server's transfer response unchanged.
66
+ */
110
67
  async uploadStream(request) {
111
68
  const bodyIsBytes = request.body instanceof Uint8Array;
112
69
  const { urls, headers, timeoutMs } = this.resolveTransferRequest(request, {
@@ -115,7 +72,6 @@ export class WaMediaTransferClient {
115
72
  ? String(request.contentLength)
116
73
  : undefined
117
74
  });
118
- const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
119
75
  const agent = request.agent ?? this.defaultUploadAgent;
120
76
  const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
121
77
  if (!bodyIsBytes && urls.length > 1) {
@@ -129,29 +85,18 @@ export class WaMediaTransferClient {
129
85
  timeoutMs,
130
86
  method
131
87
  });
132
- const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, async (url, signal) => {
133
- if (bodyIsBytes) {
134
- return this.transferRequest(url, {
135
- method,
136
- headers,
137
- signal,
138
- body: request.body
139
- }, dispatcher, agent);
140
- }
141
- return this.transferRequest(url, {
142
- method,
143
- headers,
144
- signal,
145
- body: request.body,
146
- duplex: 'half'
147
- }, dispatcher, agent);
148
- });
88
+ const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method, headers, signal, body: request.body }, agent));
149
89
  this.logger?.trace('media upload stream response', {
150
90
  url: result.url,
151
91
  status: result.status
152
92
  });
153
93
  return result;
154
94
  }
95
+ /**
96
+ * Encrypts the plaintext body with the per-`mediaType` HKDF keys (a new
97
+ * media key is generated when none is supplied) and uploads it. Returns
98
+ * the upload response plus the derived key/hashes for the message stanza.
99
+ */
155
100
  async uploadEncrypted(request) {
156
101
  this.logger?.info('media encrypted upload start', {
157
102
  mediaType: request.mediaType
@@ -165,7 +110,6 @@ export class WaMediaTransferClient {
165
110
  directPath: request.directPath,
166
111
  hosts: request.hosts,
167
112
  headers: request.headers,
168
- dispatcher: request.dispatcher,
169
113
  agent: request.agent,
170
114
  timeoutMs: request.timeoutMs,
171
115
  signal: request.signal,
@@ -191,6 +135,10 @@ export class WaMediaTransferClient {
191
135
  plaintextLength: metadata.plaintextLength
192
136
  };
193
137
  }
138
+ /**
139
+ * Downloads an encrypted media payload, decrypts it, and verifies the MAC
140
+ * + file SHA-256s. Returns the decrypted bytes.
141
+ */
194
142
  async downloadAndDecrypt(request) {
195
143
  this.logger?.info('media encrypted download start', {
196
144
  mediaType: request.mediaType
@@ -213,6 +161,11 @@ export class WaMediaTransferClient {
213
161
  throw error;
214
162
  }
215
163
  }
164
+ /**
165
+ * Streaming variant of {@link downloadAndDecrypt}: returns a `plaintext`
166
+ * Readable plus a `metadata` promise that resolves after the stream ends
167
+ * with the verified hashes (or rejects on MAC/size failure).
168
+ */
216
169
  async downloadAndDecryptStream(request) {
217
170
  const response = await this.downloadStream(request);
218
171
  await this.assertSuccessfulResponse(response);
@@ -221,7 +174,8 @@ export class WaMediaTransferClient {
221
174
  mediaType: request.mediaType,
222
175
  mediaKey: request.mediaKey,
223
176
  expectedFileSha256: request.fileSha256,
224
- expectedFileEncSha256: request.fileEncSha256
177
+ expectedFileEncSha256: request.fileEncSha256,
178
+ skipMacVerification: this.skipMacVerification
225
179
  });
226
180
  decrypted.metadata.catch(() => undefined);
227
181
  this.logger?.debug('media encrypted download stream ready', {
@@ -232,125 +186,58 @@ export class WaMediaTransferClient {
232
186
  metadata: decrypted.metadata
233
187
  };
234
188
  }
189
+ /** Drains a streaming response body to a Uint8Array (respects `maxBytes`). */
235
190
  async readResponseBytes(response, maxBytes) {
236
191
  if (!response.body) {
237
192
  return EMPTY_BYTES;
238
193
  }
239
194
  return readAllBytes(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
240
195
  }
241
- async transferRequest(url, init, dispatcher, agent) {
242
- if (agent) {
243
- return this.gotWithAgent(url, init, agent);
244
- }
245
- return this.fetchWithDispatcher(url, init, dispatcher);
246
- }
247
- async fetchWithDispatcher(url, init, dispatcher) {
248
- const response = !dispatcher
249
- ? await fetch(url, init)
250
- : await fetch(url, {
251
- ...init,
252
- dispatcher
253
- });
254
- return this.toFetchTransferResponse(response);
255
- }
256
- toFetchTransferResponse(response) {
257
- return {
258
- status: response.status,
259
- ok: response.ok,
260
- headers: Object.fromEntries(response.headers.entries()),
261
- body: response.body
262
- ? Readable.fromWeb(response.body)
263
- : null,
264
- cancel: async () => {
265
- if (!response.body) {
266
- return;
267
- }
268
- try {
269
- await response.body.cancel();
270
- }
271
- catch {
272
- // ignore cancel errors from remote resets
273
- }
274
- }
275
- };
276
- }
277
- async gotWithAgent(url, init, agent) {
278
- const got = await this.loadGotModule();
279
- const urlObj = new URL(url);
280
- const gotAgent = urlObj.protocol === 'http:'
281
- ? { http: agent }
282
- : urlObj.protocol === 'https:'
283
- ? { https: agent }
284
- : { http: agent, https: agent };
196
+ async httpRequest(url, init, agent) {
197
+ const parsed = new URL(url);
198
+ const transport = parsed.protocol === 'https:' ? https : http;
285
199
  return new Promise((resolve, reject) => {
286
- const request = got.stream(url, {
287
- method: init.method,
288
- headers: (init.headers ?? {}),
289
- body: init.body,
290
- signal: init.signal,
291
- throwHttpErrors: false,
292
- retry: { limit: 0 },
293
- agent: gotAgent
294
- });
295
- const onError = (error) => {
296
- request.off('response', onResponse);
297
- reject(toError(error));
298
- };
299
- const onResponse = (incoming) => {
300
- request.off('error', onError);
301
- resolve(this.toGotTransferResponse(incoming));
302
- };
303
- request.once('error', onError);
304
- request.once('response', onResponse);
305
- });
306
- }
307
- async loadGotModule() {
308
- if (!this.gotModulePromise) {
309
- this.gotModulePromise = loadOptionalGotModule().catch((error) => {
310
- this.gotModulePromise = null;
311
- throw error;
312
- });
313
- }
314
- return this.gotModulePromise;
315
- }
316
- toGotTransferResponse(incoming) {
317
- if (!incoming || typeof incoming !== 'object') {
318
- throw new Error('invalid got response object');
319
- }
320
- const stream = incoming;
321
- const status = typeof stream.statusCode === 'number' &&
322
- Number.isFinite(stream.statusCode) &&
323
- stream.statusCode >= 100 &&
324
- stream.statusCode <= 599
325
- ? stream.statusCode
326
- : 500;
327
- const headers = {};
328
- if (stream.headers && typeof stream.headers === 'object') {
329
- const input = stream.headers;
330
- for (const key in input) {
331
- const value = input[key];
332
- if (typeof value === 'string') {
333
- headers[key] = value;
334
- continue;
335
- }
336
- if (Array.isArray(value)) {
337
- headers[key] = value.join(', ');
338
- continue;
339
- }
340
- if (value !== undefined && value !== null) {
341
- headers[key] = String(value);
200
+ const req = transport.request(url, {
201
+ method: init.method ?? 'GET',
202
+ headers: init.headers,
203
+ signal: init.signal ?? undefined,
204
+ agent: agent ?? undefined
205
+ }, (res) => {
206
+ const status = res.statusCode ?? 500;
207
+ const headers = {};
208
+ for (const key in res.headers) {
209
+ const value = res.headers[key];
210
+ if (typeof value === 'string') {
211
+ headers[key] = value;
212
+ }
213
+ else if (Array.isArray(value)) {
214
+ headers[key] = value.join(', ');
215
+ }
342
216
  }
217
+ resolve({
218
+ status,
219
+ ok: status >= 200 && status < 300,
220
+ headers,
221
+ body: res,
222
+ // eslint-disable-next-line @typescript-eslint/require-await
223
+ cancel: async () => {
224
+ res.destroy();
225
+ }
226
+ });
227
+ });
228
+ req.on('error', (error) => reject(toError(error)));
229
+ const body = init.body;
230
+ if (body instanceof Uint8Array) {
231
+ req.end(body);
343
232
  }
344
- }
345
- return {
346
- status,
347
- ok: status >= 200 && status < 300,
348
- headers,
349
- body: stream,
350
- cancel: async () => {
351
- stream.destroy();
233
+ else if (body) {
234
+ body.on('error', (err) => req.destroy(toError(err)));
235
+ body.pipe(req);
352
236
  }
353
- };
237
+ else {
238
+ req.end();
239
+ }
240
+ });
354
241
  }
355
242
  resolveTransferRequest(request, extraHeaders) {
356
243
  const headers = { ...this.defaultHeaders };
@@ -384,10 +271,11 @@ export class WaMediaTransferClient {
384
271
  fileEncSha256: encrypted.fileEncSha256,
385
272
  plaintextLength: request.plaintext.byteLength
386
273
  }),
274
+ // eslint-disable-next-line @typescript-eslint/require-await
387
275
  cleanup: async () => undefined
388
276
  };
389
277
  }
390
- const prepared = await WaMediaCrypto.encryptReadable(request.mediaType, mediaKey, request.plaintext);
278
+ const prepared = await WaMediaCrypto.encryptReadable(request.mediaType, mediaKey, request.plaintext, { expectedFileSize: request.contentLength ?? undefined });
391
279
  return {
392
280
  body: prepared.encrypted,
393
281
  contentLength: request.contentLength !== null && request.contentLength !== undefined
@@ -1,6 +1,11 @@
1
- import { WA_NODE_TAGS } from '../protocol/constants.js';
2
- import { findNodeChild, getNodeChildrenByTag } from '../transport/node/helpers.js';
3
- import { assertIqResult } from '../transport/node/query.js';
1
+ import { WA_NODE_TAGS } from '../../protocol/constants.js';
2
+ import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
3
+ import { assertIqResult } from '../../transport/node/query.js';
4
+ import { parseOptionalInt } from '../../util/primitives.js';
5
+ /**
6
+ * Parses a `media_conn` IQ response into a {@link WaMediaConn} (auth token,
7
+ * absolute expiry, and host list). Throws on missing auth/ttl/hosts.
8
+ */
4
9
  export function parseMediaConnResponse(node, nowMs) {
5
10
  assertIqResult(node, 'media_conn');
6
11
  const mediaConnNode = findNodeChild(node, WA_NODE_TAGS.MEDIA_CONN);
@@ -11,8 +16,8 @@ export function parseMediaConnResponse(node, nowMs) {
11
16
  if (!auth) {
12
17
  throw new Error('media_conn response is missing auth');
13
18
  }
14
- const ttlRaw = Number.parseInt(mediaConnNode.attrs.ttl ?? '0', 10);
15
- if (!Number.isFinite(ttlRaw) || ttlRaw <= 0) {
19
+ const ttlRaw = parseOptionalInt(mediaConnNode.attrs.ttl) ?? 0;
20
+ if (ttlRaw <= 0) {
16
21
  throw new Error('media_conn response has invalid ttl');
17
22
  }
18
23
  const expiresAtMs = ttlRaw >= 1000000000 ? ttlRaw * 1000 : nowMs + ttlRaw * 1000;
@@ -1,4 +1,4 @@
1
- import { describeAckNode, isAckOrReceiptNode, isNegativeAckNode, isRetryableNegativeAck } from './ack.js';
1
+ import { describeAckNode, isAckOrReceiptNode, isNegativeAckNode, isRetryableNegativeAck } from './primitives/ack.js';
2
2
  import { WA_DEFAULTS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
3
3
  import { buildReceiptNode } from '../transport/node/builders/global.js';
4
4
  import { delay } from '../util/async.js';
@@ -11,6 +11,11 @@ class MessagePublishNackError extends Error {
11
11
  this.retryable = retryable;
12
12
  }
13
13
  }
14
+ /**
15
+ * Low-level message-publishing client. Sends pre-built message/receipt nodes,
16
+ * handles ack timeouts and retry on negative-ack failures, and is the
17
+ * transport hook used by {@link WaMessageCoordinator}.
18
+ */
14
19
  export class WaMessageClient {
15
20
  constructor(options) {
16
21
  this.logger = options.logger;
@@ -20,6 +25,11 @@ export class WaMessageClient {
20
25
  this.defaultMaxAttempts = options.defaultMaxAttempts ?? WA_DEFAULTS.MESSAGE_MAX_ATTEMPTS;
21
26
  this.defaultRetryDelayMs = options.defaultRetryDelayMs ?? WA_DEFAULTS.MESSAGE_RETRY_DELAY_MS;
22
27
  }
28
+ /**
29
+ * Publishes a `<message>` stanza and awaits its ack/receipt, retrying on
30
+ * retryable negative-ack errors up to `maxAttempts`. Returns the ack
31
+ * metadata extracted from the server response.
32
+ */
23
33
  async publishNode(node, options = {}) {
24
34
  if (node.tag !== WA_MESSAGE_TAGS.MESSAGE) {
25
35
  throw new Error(`invalid node tag for message publish: ${node.tag}`);
@@ -51,14 +61,25 @@ export class WaMessageClient {
51
61
  if (isNegativeAckNode(ackNode)) {
52
62
  throw new MessagePublishNackError(`negative publish ack: ${describeAckNode(ackNode)}`, isRetryableNegativeAck(ackNode));
53
63
  }
54
- this.logger.info('message publish acknowledged', {
55
- id,
56
- tag: ackNode.tag,
57
- type: ackNode.attrs.type,
58
- phash: ackNode.attrs.phash,
59
- addressingMode: ackNode.attrs.addressing_mode,
60
- attempts: attempt
61
- });
64
+ if (attempt > 1) {
65
+ this.logger.info('message publish acknowledged after retry', {
66
+ id,
67
+ tag: ackNode.tag,
68
+ type: ackNode.attrs.type,
69
+ phash: ackNode.attrs.phash,
70
+ addressingMode: ackNode.attrs.addressing_mode,
71
+ attempts: attempt
72
+ });
73
+ }
74
+ else {
75
+ this.logger.trace('message publish acknowledged', {
76
+ id,
77
+ tag: ackNode.tag,
78
+ type: ackNode.attrs.type,
79
+ phash: ackNode.attrs.phash,
80
+ addressingMode: ackNode.attrs.addressing_mode
81
+ });
82
+ }
62
83
  return {
63
84
  id,
64
85
  attempts: attempt,
@@ -71,25 +92,33 @@ export class WaMessageClient {
71
92
  const nackRetryable = error instanceof MessagePublishNackError ? error.retryable : false;
72
93
  const canRetry = attempt < maxAttempts &&
73
94
  (this.isRetryablePublishError(lastError) || nackRetryable);
95
+ if (canRetry) {
96
+ this.logger.debug('message publish attempt failed, will retry', {
97
+ attempt,
98
+ maxAttempts,
99
+ nackRetryable,
100
+ message: lastError.message
101
+ });
102
+ await delay(retryDelayMs * attempt);
103
+ continue;
104
+ }
74
105
  this.logger.warn('message publish attempt failed', {
75
106
  attempt,
76
107
  maxAttempts,
77
- canRetry,
78
108
  nackRetryable,
79
109
  message: lastError.message
80
110
  });
81
- if (!canRetry) {
82
- throw lastError;
83
- }
84
- await delay(retryDelayMs * attempt);
111
+ throw lastError;
85
112
  }
86
113
  }
87
114
  throw lastError ?? new Error('message publish failed');
88
115
  }
116
+ /** Builds the encrypted message envelope from `input` and publishes it via {@link publishNode}. */
89
117
  async publishEncrypted(input, options = {}) {
90
118
  const node = this.buildEncryptedMessageNode(input);
91
119
  return this.publishNode(node, options);
92
120
  }
121
+ /** Fire-and-forget variant: sends a `<message>` stanza without awaiting an ack. */
93
122
  async sendMessageNode(node) {
94
123
  if (node.tag !== WA_MESSAGE_TAGS.MESSAGE) {
95
124
  throw new Error(`invalid node tag for message send: ${node.tag}`);
@@ -101,6 +130,7 @@ export class WaMessageClient {
101
130
  });
102
131
  await this.sendNode(node);
103
132
  }
133
+ /** Builds and sends an encrypted message envelope without awaiting an ack. */
104
134
  async sendEncrypted(input) {
105
135
  const node = this.buildEncryptedMessageNode(input);
106
136
  await this.sendMessageNode(node);
@@ -165,12 +195,13 @@ export class WaMessageClient {
165
195
  };
166
196
  return node;
167
197
  }
198
+ /** Builds and sends a `<receipt>` stanza (delivery/read/played/etc.). */
168
199
  async sendReceipt(input) {
169
200
  const node = buildReceiptNode({
170
201
  kind: 'outbound',
171
202
  to: input.to,
172
203
  id: input.id,
173
- type: input.type ?? 'read',
204
+ type: input.type ?? WA_MESSAGE_TYPES.RECEIPT_TYPE_READ,
174
205
  participant: input.participant,
175
206
  recipient: input.recipient,
176
207
  category: input.category,