zapo-js 0.1.2 → 0.3.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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,10 +1,10 @@
1
- import { Readable } from 'node:stream';
1
+ import http from 'node:http';
2
+ import https from 'node:https';
2
3
  import { DEFAULT_MEDIA_HOSTS } from './constants.js';
3
4
  import { WaMediaCrypto } from './WaMediaCrypto.js';
4
5
  import { WA_DEFAULTS } from '../protocol/constants.js';
5
6
  import { EMPTY_BYTES, readAllBytes } from '../util/bytes.js';
6
7
  import { toError } from '../util/primitives.js';
7
- const GOT_OPTIONAL_MODULE = 'got';
8
8
  function normalizeHeaderRecord(headers) {
9
9
  if (!headers) {
10
10
  return {};
@@ -15,56 +15,6 @@ 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
- }
68
18
  export class WaMediaTransferClient {
69
19
  constructor(options = {}) {
70
20
  this.logger = options.logger;
@@ -72,28 +22,23 @@ export class WaMediaTransferClient {
72
22
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.MEDIA_TIMEOUT_MS;
73
23
  this.defaultMaxReadBytes = options.defaultMaxReadBytes;
74
24
  this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
75
- this.defaultUploadDispatcher = options.defaultUploadDispatcher;
76
- this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
77
25
  this.defaultUploadAgent = options.defaultUploadAgent;
78
26
  this.defaultDownloadAgent = options.defaultDownloadAgent;
79
- this.gotModulePromise = null;
27
+ this.skipMacVerification = options.skipMacVerification === true;
80
28
  }
81
29
  async downloadStream(request) {
82
30
  const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
83
- const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
84
31
  const agent = request.agent ?? this.defaultDownloadAgent;
85
32
  this.logger?.debug('media download stream start', {
86
33
  urls: urls.length,
87
34
  timeoutMs
88
35
  });
89
- return this.executeTransfer(urls, timeoutMs, request.signal, {
90
- responseLog: 'media download stream response',
91
- send: (url, signal) => this.transferRequest(url, {
92
- method: 'GET',
93
- headers,
94
- signal
95
- }, dispatcher, agent)
36
+ const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method: 'GET', headers, signal }, agent));
37
+ this.logger?.trace('media download stream response', {
38
+ url: result.url,
39
+ status: result.status
96
40
  });
41
+ return result;
97
42
  }
98
43
  async downloadBytes(request) {
99
44
  const response = await this.downloadStream(request);
@@ -101,7 +46,9 @@ export class WaMediaTransferClient {
101
46
  if (!response.body) {
102
47
  return EMPTY_BYTES;
103
48
  }
104
- return this.readAllBytesWithLimit(response.body, request.maxBytes);
49
+ return readAllBytes(response.body, {
50
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
51
+ });
105
52
  }
106
53
  async uploadStream(request) {
107
54
  const bodyIsBytes = request.body instanceof Uint8Array;
@@ -111,7 +58,6 @@ export class WaMediaTransferClient {
111
58
  ? String(request.contentLength)
112
59
  : undefined
113
60
  });
114
- const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
115
61
  const agent = request.agent ?? this.defaultUploadAgent;
116
62
  const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
117
63
  if (!bodyIsBytes && urls.length > 1) {
@@ -125,26 +71,12 @@ export class WaMediaTransferClient {
125
71
  timeoutMs,
126
72
  method
127
73
  });
128
- return this.executeTransfer(uploadUrls, timeoutMs, request.signal, {
129
- responseLog: 'media upload stream response',
130
- send: async (url, signal) => {
131
- if (bodyIsBytes) {
132
- return this.transferRequest(url, {
133
- method,
134
- headers,
135
- signal,
136
- body: request.body
137
- }, dispatcher, agent);
138
- }
139
- return this.transferRequest(url, {
140
- method,
141
- headers,
142
- signal,
143
- body: request.body,
144
- duplex: 'half'
145
- }, dispatcher, agent);
146
- }
74
+ const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method, headers, signal, body: request.body }, agent));
75
+ this.logger?.trace('media upload stream response', {
76
+ url: result.url,
77
+ status: result.status
147
78
  });
79
+ return result;
148
80
  }
149
81
  async uploadEncrypted(request) {
150
82
  this.logger?.info('media encrypted upload start', {
@@ -159,7 +91,6 @@ export class WaMediaTransferClient {
159
91
  directPath: request.directPath,
160
92
  hosts: request.hosts,
161
93
  headers: request.headers,
162
- dispatcher: request.dispatcher,
163
94
  agent: request.agent,
164
95
  timeoutMs: request.timeoutMs,
165
96
  signal: request.signal,
@@ -181,7 +112,8 @@ export class WaMediaTransferClient {
181
112
  transfer,
182
113
  mediaKey,
183
114
  fileSha256: metadata.fileSha256,
184
- fileEncSha256: metadata.fileEncSha256
115
+ fileEncSha256: metadata.fileEncSha256,
116
+ plaintextLength: metadata.plaintextLength
185
117
  };
186
118
  }
187
119
  async downloadAndDecrypt(request) {
@@ -190,8 +122,12 @@ export class WaMediaTransferClient {
190
122
  });
191
123
  const decrypted = await this.downloadAndDecryptStream(request);
192
124
  try {
193
- const plaintext = await this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes);
194
- await decrypted.metadata;
125
+ const [plaintext] = await Promise.all([
126
+ readAllBytes(decrypted.plaintext, {
127
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
128
+ }),
129
+ decrypted.metadata
130
+ ]);
195
131
  this.logger?.info('media encrypted download completed', {
196
132
  byteLength: plaintext.byteLength
197
133
  });
@@ -210,7 +146,8 @@ export class WaMediaTransferClient {
210
146
  mediaType: request.mediaType,
211
147
  mediaKey: request.mediaKey,
212
148
  expectedFileSha256: request.fileSha256,
213
- expectedFileEncSha256: request.fileEncSha256
149
+ expectedFileEncSha256: request.fileEncSha256,
150
+ skipMacVerification: this.skipMacVerification
214
151
  });
215
152
  decrypted.metadata.catch(() => undefined);
216
153
  this.logger?.debug('media encrypted download stream ready', {
@@ -225,121 +162,52 @@ export class WaMediaTransferClient {
225
162
  if (!response.body) {
226
163
  return EMPTY_BYTES;
227
164
  }
228
- return this.readAllBytesWithLimit(response.body, maxBytes);
229
- }
230
- async transferRequest(url, init, dispatcher, agent) {
231
- if (agent) {
232
- return this.gotWithAgent(url, init, agent);
233
- }
234
- return this.fetchWithDispatcher(url, init, dispatcher);
235
- }
236
- async fetchWithDispatcher(url, init, dispatcher) {
237
- const response = !dispatcher
238
- ? await fetch(url, init)
239
- : await fetch(url, {
240
- ...init,
241
- dispatcher
242
- });
243
- return this.toFetchTransferResponse(response);
165
+ return readAllBytes(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
244
166
  }
245
- toFetchTransferResponse(response) {
246
- return {
247
- status: response.status,
248
- ok: response.ok,
249
- headers: this.headersToRecord(response.headers),
250
- body: response.body
251
- ? Readable.fromWeb(response.body)
252
- : null,
253
- cancel: async () => {
254
- if (!response.body) {
255
- return;
256
- }
257
- try {
258
- await response.body.cancel();
259
- }
260
- catch {
261
- // ignore cancel errors from remote resets
262
- }
263
- }
264
- };
265
- }
266
- async gotWithAgent(url, init, agent) {
267
- const got = await this.loadGotModule();
268
- const urlObj = new URL(url);
269
- const gotAgent = urlObj.protocol === 'http:'
270
- ? { http: agent }
271
- : urlObj.protocol === 'https:'
272
- ? { https: agent }
273
- : { http: agent, https: agent };
167
+ async httpRequest(url, init, agent) {
168
+ const parsed = new URL(url);
169
+ const transport = parsed.protocol === 'https:' ? https : http;
274
170
  return new Promise((resolve, reject) => {
275
- const request = got.stream(url, {
276
- method: init.method,
277
- headers: (init.headers ?? {}),
278
- body: init.body,
279
- signal: init.signal,
280
- throwHttpErrors: false,
281
- retry: { limit: 0 },
282
- agent: gotAgent
283
- });
284
- const onError = (error) => {
285
- request.off('response', onResponse);
286
- reject(toError(error));
287
- };
288
- const onResponse = (incoming) => {
289
- request.off('error', onError);
290
- resolve(this.toGotTransferResponse(incoming));
291
- };
292
- request.once('error', onError);
293
- request.once('response', onResponse);
294
- });
295
- }
296
- async loadGotModule() {
297
- if (!this.gotModulePromise) {
298
- this.gotModulePromise = loadOptionalGotModule().catch((error) => {
299
- this.gotModulePromise = null;
300
- throw error;
301
- });
302
- }
303
- return this.gotModulePromise;
304
- }
305
- toGotTransferResponse(incoming) {
306
- if (!incoming || typeof incoming !== 'object') {
307
- throw new Error('invalid got response object');
308
- }
309
- const stream = incoming;
310
- const status = typeof stream.statusCode === 'number' &&
311
- Number.isFinite(stream.statusCode) &&
312
- stream.statusCode >= 100 &&
313
- stream.statusCode <= 599
314
- ? stream.statusCode
315
- : 500;
316
- const headers = {};
317
- if (stream.headers && typeof stream.headers === 'object') {
318
- const input = stream.headers;
319
- for (const key in input) {
320
- const value = input[key];
321
- if (typeof value === 'string') {
322
- headers[key] = value;
323
- continue;
324
- }
325
- if (Array.isArray(value)) {
326
- headers[key] = value.join(', ');
327
- continue;
328
- }
329
- if (value !== undefined && value !== null) {
330
- headers[key] = String(value);
171
+ const req = transport.request(url, {
172
+ method: init.method ?? 'GET',
173
+ headers: init.headers,
174
+ signal: init.signal ?? undefined,
175
+ agent: agent ?? undefined
176
+ }, (res) => {
177
+ const status = res.statusCode ?? 500;
178
+ const headers = {};
179
+ for (const key in res.headers) {
180
+ const value = res.headers[key];
181
+ if (typeof value === 'string') {
182
+ headers[key] = value;
183
+ }
184
+ else if (Array.isArray(value)) {
185
+ headers[key] = value.join(', ');
186
+ }
331
187
  }
188
+ resolve({
189
+ status,
190
+ ok: status >= 200 && status < 300,
191
+ headers,
192
+ body: res,
193
+ cancel: async () => {
194
+ res.destroy();
195
+ }
196
+ });
197
+ });
198
+ req.on('error', (error) => reject(toError(error)));
199
+ const body = init.body;
200
+ if (body instanceof Uint8Array) {
201
+ req.end(body);
332
202
  }
333
- }
334
- return {
335
- status,
336
- ok: status >= 200 && status < 300,
337
- headers,
338
- body: stream,
339
- cancel: async () => {
340
- stream.destroy();
203
+ else if (body) {
204
+ body.on('error', (err) => req.destroy(toError(err)));
205
+ body.pipe(req);
341
206
  }
342
- };
207
+ else {
208
+ req.end();
209
+ }
210
+ });
343
211
  }
344
212
  resolveTransferRequest(request, extraHeaders) {
345
213
  const headers = { ...this.defaultHeaders };
@@ -362,14 +230,6 @@ export class WaMediaTransferClient {
362
230
  timeoutMs: request.timeoutMs ?? this.defaultTimeoutMs
363
231
  };
364
232
  }
365
- async executeTransfer(urls, timeoutMs, signal, options) {
366
- const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
367
- this.logger?.trace(options.responseLog, {
368
- url: result.url,
369
- status: result.status
370
- });
371
- return result;
372
- }
373
233
  async prepareEncryptedUpload(request, mediaKey) {
374
234
  if (request.plaintext instanceof Uint8Array) {
375
235
  const encrypted = await WaMediaCrypto.encryptBytes(request.mediaType, mediaKey, request.plaintext);
@@ -378,7 +238,8 @@ export class WaMediaTransferClient {
378
238
  contentLength: encrypted.ciphertextHmac.byteLength,
379
239
  metadata: Promise.resolve({
380
240
  fileSha256: encrypted.fileSha256,
381
- fileEncSha256: encrypted.fileEncSha256
241
+ fileEncSha256: encrypted.fileEncSha256,
242
+ plaintextLength: request.plaintext.byteLength
382
243
  }),
383
244
  cleanup: async () => undefined
384
245
  };
@@ -432,11 +293,6 @@ export class WaMediaTransferClient {
432
293
  }
433
294
  return resolved;
434
295
  }
435
- readAllBytesWithLimit(stream, maxBytes) {
436
- return readAllBytes(stream, {
437
- maxBytes: maxBytes ?? this.defaultMaxReadBytes
438
- });
439
- }
440
296
  async fetchWithFallback(urls, timeoutMs, signal, send) {
441
297
  let lastError = null;
442
298
  for (let index = 0; index < urls.length; index += 1) {
@@ -506,13 +362,6 @@ export class WaMediaTransferClient {
506
362
  }
507
363
  };
508
364
  }
509
- headersToRecord(headers) {
510
- const output = {};
511
- headers.forEach((value, key) => {
512
- output[key] = value;
513
- });
514
- return output;
515
- }
516
365
  async drainBody(body) {
517
366
  if (!body) {
518
367
  return;
@@ -10,6 +10,8 @@ export const ENC_KEY_END = 48;
10
10
  export const MAC_KEY_START = 48;
11
11
  export const MAC_KEY_END = 80;
12
12
  export const HMAC_TRUNCATED_SIZE = 10;
13
+ export const SIDECAR_CHUNK_SIZE = 65536;
14
+ export const SIDECAR_HMAC_SIZE = 10;
13
15
  export const MEDIA_UPLOAD_PATHS = Object.freeze({
14
16
  image: '/mms/image',
15
17
  video: '/mms/video',
@@ -17,5 +19,6 @@ export const MEDIA_UPLOAD_PATHS = Object.freeze({
17
19
  document: '/mms/document',
18
20
  sticker: '/mms/sticker',
19
21
  gif: '/mms/gif',
20
- ptt: '/mms/ptt'
22
+ ptt: '/mms/ptt',
23
+ ptv: '/mms/video'
21
24
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { describeAckNode, isAckOrReceiptNode, isNegativeAckNode, isRetryableNegativeAck } from './ack.js';
2
2
  import { WA_DEFAULTS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_NODE_TAGS } from '../protocol/constants.js';
3
+ import { buildReceiptNode } from '../transport/node/builders/global.js';
3
4
  import { delay } from '../util/async.js';
4
5
  import { parseOptionalInt, toError } from '../util/primitives.js';
5
6
  const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
@@ -112,6 +113,9 @@ export class WaMessageClient {
112
113
  if (input.id) {
113
114
  attrs.id = input.id;
114
115
  }
116
+ if (input.edit) {
117
+ attrs.edit = input.edit;
118
+ }
115
119
  if (input.category) {
116
120
  attrs.category = input.category;
117
121
  }
@@ -131,6 +135,9 @@ export class WaMessageClient {
131
135
  v: WA_MESSAGE_TYPES.ENC_VERSION,
132
136
  type: input.encType
133
137
  };
138
+ if (input.mediatype) {
139
+ encAttrs.mediatype = input.mediatype;
140
+ }
134
141
  if (input.encCount !== undefined && input.encCount > 0) {
135
142
  encAttrs.count = String(Math.trunc(input.encCount));
136
143
  }
@@ -148,6 +155,9 @@ export class WaMessageClient {
148
155
  content: input.deviceIdentity
149
156
  });
150
157
  }
158
+ if (input.metaNode) {
159
+ content.push(input.metaNode);
160
+ }
151
161
  const node = {
152
162
  tag: WA_MESSAGE_TAGS.MESSAGE,
153
163
  attrs,
@@ -156,29 +166,26 @@ export class WaMessageClient {
156
166
  return node;
157
167
  }
158
168
  async sendReceipt(input) {
159
- const attrs = {
169
+ const node = buildReceiptNode({
170
+ kind: 'outbound',
160
171
  to: input.to,
161
172
  id: input.id,
162
- type: input.type ?? 'read'
163
- };
164
- if (input.participant) {
165
- attrs.participant = input.participant;
166
- }
167
- if (input.from) {
168
- attrs.from = input.from;
169
- }
170
- if (input.t) {
171
- attrs.t = input.t;
172
- }
173
- this.logger.debug('sending receipt node', {
174
- to: attrs.to,
175
- id: attrs.id,
176
- type: attrs.type
173
+ type: input.type ?? 'read',
174
+ participant: input.participant,
175
+ recipient: input.recipient,
176
+ category: input.category,
177
+ from: input.from,
178
+ t: input.t,
179
+ peerParticipantPn: input.peerParticipantPn,
180
+ listIds: input.listIds,
181
+ content: input.content ? [...input.content] : undefined
177
182
  });
178
- await this.sendNode({
179
- tag: WA_MESSAGE_TAGS.RECEIPT,
180
- attrs
183
+ this.logger.debug('sending receipt node', {
184
+ to: node.attrs.to,
185
+ id: node.attrs.id,
186
+ type: node.attrs.type
181
187
  });
188
+ await this.sendNode(node);
182
189
  }
183
190
  isRetryablePublishError(error) {
184
191
  return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
@@ -1,6 +1,8 @@
1
- import { aesGcmDecrypt, aesGcmEncrypt, importAesGcmKey } from '../crypto/index.js';
2
- import { assertMessageSecret, createUseCaseSecret, WA_USE_CASE_SECRET_MODIFICATION_TYPES } from './use-case-secret.js';
3
- import { EMPTY_BYTES, TEXT_ENCODER, toBytesView } from '../util/bytes.js';
1
+ import { aesGcmDecrypt, aesGcmEncrypt, importAesGcmKey, sha256 } from '../crypto/index.js';
2
+ import { unwrapMessage } from './content.js';
3
+ import { assertMessageSecret, createUseCaseSecret, WA_MESSAGE_SECRET_BYTES, WA_USE_CASE_SECRET_MODIFICATION_TYPES } from './use-case-secret.js';
4
+ import { proto } from '../proto.js';
5
+ import { bytesToHex, EMPTY_BYTES, TEXT_ENCODER, toBytesView } from '../util/bytes.js';
4
6
  const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
5
7
  export function shouldUseAddonAdditionalData(modificationType) {
6
8
  return (modificationType === WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE ||
@@ -41,6 +43,131 @@ export async function decryptAddonPayload(input) {
41
43
  const additionalData = resolveAddonAdditionalData(input);
42
44
  return aesGcmDecrypt(key, iv, toBytesView(input.ciphertext), additionalData);
43
45
  }
46
+ export function identifyEncryptedAddon(message) {
47
+ const msg = unwrapMessage(message);
48
+ if (msg.encReactionMessage) {
49
+ const { targetMessageKey, encPayload, encIv } = msg.encReactionMessage;
50
+ if (targetMessageKey && encPayload && encIv) {
51
+ return {
52
+ kind: 'reaction',
53
+ targetMessageKey,
54
+ encPayload: encPayload,
55
+ encIv: encIv,
56
+ modificationType: WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_REACTION,
57
+ raw: message
58
+ };
59
+ }
60
+ }
61
+ if (msg.pollUpdateMessage) {
62
+ const { pollCreationMessageKey, vote } = msg.pollUpdateMessage;
63
+ if (pollCreationMessageKey && vote?.encPayload && vote.encIv) {
64
+ return {
65
+ kind: 'poll_vote',
66
+ targetMessageKey: pollCreationMessageKey,
67
+ encPayload: vote.encPayload,
68
+ encIv: vote.encIv,
69
+ modificationType: WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE,
70
+ raw: message
71
+ };
72
+ }
73
+ }
74
+ if (msg.encEventResponseMessage) {
75
+ const { eventCreationMessageKey, encPayload, encIv } = msg.encEventResponseMessage;
76
+ if (eventCreationMessageKey && encPayload && encIv) {
77
+ return {
78
+ kind: 'event_response',
79
+ targetMessageKey: eventCreationMessageKey,
80
+ encPayload: encPayload,
81
+ encIv: encIv,
82
+ modificationType: WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE,
83
+ raw: message
84
+ };
85
+ }
86
+ }
87
+ if (msg.encCommentMessage) {
88
+ const { targetMessageKey, encPayload, encIv } = msg.encCommentMessage;
89
+ if (targetMessageKey && encPayload && encIv) {
90
+ return {
91
+ kind: 'comment',
92
+ targetMessageKey,
93
+ encPayload: encPayload,
94
+ encIv: encIv,
95
+ modificationType: WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_COMMENT,
96
+ raw: message
97
+ };
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ export function decodeAddonPlaintext(kind, plaintext) {
103
+ switch (kind) {
104
+ case 'reaction':
105
+ return { kind, reaction: proto.Message.ReactionMessage.decode(plaintext) };
106
+ case 'poll_vote':
107
+ return {
108
+ kind,
109
+ pollVote: proto.Message.PollVoteMessage.decode(plaintext),
110
+ selectedOptionNames: null
111
+ };
112
+ case 'event_response':
113
+ return { kind, eventResponse: proto.Message.EventResponseMessage.decode(plaintext) };
114
+ case 'comment':
115
+ return { kind, comment: proto.Message.CommentMessage.decode(plaintext) };
116
+ }
117
+ }
118
+ export async function resolveParentMessageSecret(targetMessageId, messageSecretStore, messageStore) {
119
+ const cached = await messageSecretStore.get(targetMessageId);
120
+ if (cached)
121
+ return cached;
122
+ const record = await messageStore.getById(targetMessageId);
123
+ if (!record?.messageBytes)
124
+ return null;
125
+ try {
126
+ const decoded = proto.Message.decode(record.messageBytes);
127
+ const secret = decoded.messageContextInfo?.messageSecret;
128
+ if (!secret || secret.byteLength !== WA_MESSAGE_SECRET_BYTES)
129
+ return null;
130
+ return { secret, senderJid: record.senderJid ?? '' };
131
+ }
132
+ catch {
133
+ return null;
134
+ }
135
+ }
136
+ export async function resolvePollOptionNames(selectedOptions, pollCreationMessageId, messageStore) {
137
+ const record = await messageStore.getById(pollCreationMessageId);
138
+ if (!record?.messageBytes)
139
+ return null;
140
+ let decoded;
141
+ try {
142
+ decoded = proto.Message.decode(record.messageBytes);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ const pollMsg = unwrapMessage(decoded);
148
+ const options = pollMsg.pollCreationMessage?.options ??
149
+ pollMsg.pollCreationMessageV2?.options ??
150
+ pollMsg.pollCreationMessageV3?.options ??
151
+ pollMsg.pollCreationMessageV5?.options;
152
+ if (!options || options.length === 0)
153
+ return null;
154
+ const hashToName = new Map();
155
+ for (const option of options) {
156
+ if (!option.optionName)
157
+ continue;
158
+ const hash = await sha256(TEXT_ENCODER.encode(option.optionName));
159
+ hashToName.set(bytesToHex(hash), option.optionName);
160
+ }
161
+ const names = [];
162
+ for (const selected of selectedOptions) {
163
+ const hex = bytesToHex(selected);
164
+ const name = hashToName.get(hex);
165
+ if (!name)
166
+ return null;
167
+ names.push(name);
168
+ }
169
+ return names;
170
+ }
44
171
  function assertAddonIv(iv) {
45
172
  const normalized = toBytesView(iv);
46
173
  if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {