zapo-js 0.1.1 → 0.2.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 (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.WaMediaTransferClient = void 0;
4
37
  const node_stream_1 = require("node:stream");
@@ -7,28 +40,98 @@ const WaMediaCrypto_1 = require("./WaMediaCrypto");
7
40
  const constants_2 = require("../protocol/constants");
8
41
  const bytes_1 = require("../util/bytes");
9
42
  const primitives_1 = require("../util/primitives");
43
+ const GOT_OPTIONAL_MODULE = 'got';
44
+ function normalizeHeaderRecord(headers) {
45
+ if (!headers) {
46
+ return {};
47
+ }
48
+ const normalized = {};
49
+ for (const key in headers) {
50
+ normalized[key.toLowerCase()] = headers[key];
51
+ }
52
+ return normalized;
53
+ }
54
+ function asOptionalGotModule(loaded) {
55
+ if (loaded && typeof loaded === 'object') {
56
+ const direct = loaded.stream;
57
+ if (typeof direct === 'function') {
58
+ return loaded;
59
+ }
60
+ const fallback = loaded.default;
61
+ if (fallback &&
62
+ typeof fallback === 'object' &&
63
+ 'stream' in fallback &&
64
+ typeof fallback.stream === 'function') {
65
+ return fallback;
66
+ }
67
+ if (typeof fallback === 'function' && 'stream' in fallback) {
68
+ const maybeStream = fallback.stream;
69
+ if (typeof maybeStream === 'function') {
70
+ return fallback;
71
+ }
72
+ }
73
+ }
74
+ if (typeof loaded === 'function' && 'stream' in loaded) {
75
+ const maybeStream = loaded.stream;
76
+ if (typeof maybeStream === 'function') {
77
+ return loaded;
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ async function loadOptionalGotModule() {
83
+ try {
84
+ const loaded = await Promise.resolve(`${GOT_OPTIONAL_MODULE}`).then(s => __importStar(require(s)));
85
+ const module = asOptionalGotModule(loaded);
86
+ if (module) {
87
+ return module;
88
+ }
89
+ throw new Error('invalid got module export');
90
+ }
91
+ catch (error) {
92
+ const normalized = (0, primitives_1.toError)(error);
93
+ const code = normalized.code;
94
+ const message = normalized.message ?? '';
95
+ const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
96
+ (message.includes(`'${GOT_OPTIONAL_MODULE}'`) ||
97
+ message.includes(`"${GOT_OPTIONAL_MODULE}"`));
98
+ if (isModuleNotFound) {
99
+ throw new Error('optional dependency "got" is not installed. Install with: npm i got');
100
+ }
101
+ throw normalized;
102
+ }
103
+ }
10
104
  class WaMediaTransferClient {
11
105
  constructor(options = {}) {
12
106
  this.logger = options.logger;
13
107
  this.defaultHosts = options.defaultHosts ?? constants_1.DEFAULT_MEDIA_HOSTS;
14
108
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.MEDIA_TIMEOUT_MS;
15
109
  this.defaultMaxReadBytes = options.defaultMaxReadBytes;
16
- this.defaultHeaders = options.defaultHeaders ?? {};
110
+ this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
111
+ this.defaultUploadDispatcher = options.defaultUploadDispatcher;
112
+ this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
113
+ this.defaultUploadAgent = options.defaultUploadAgent;
114
+ this.defaultDownloadAgent = options.defaultDownloadAgent;
115
+ this.gotModulePromise = null;
17
116
  }
18
117
  async downloadStream(request) {
19
118
  const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
119
+ const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
120
+ const agent = request.agent ?? this.defaultDownloadAgent;
20
121
  this.logger?.debug('media download stream start', {
21
122
  urls: urls.length,
22
123
  timeoutMs
23
124
  });
24
- return this.executeTransfer(urls, timeoutMs, request.signal, {
25
- responseLog: 'media download stream response',
26
- send: (url, signal) => fetch(url, {
27
- method: 'GET',
28
- headers,
29
- signal
30
- })
125
+ const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.transferRequest(url, {
126
+ method: 'GET',
127
+ headers,
128
+ signal
129
+ }, dispatcher, agent));
130
+ this.logger?.trace('media download stream response', {
131
+ url: result.url,
132
+ status: result.status
31
133
  });
134
+ return result;
32
135
  }
33
136
  async downloadBytes(request) {
34
137
  const response = await this.downloadStream(request);
@@ -36,7 +139,9 @@ class WaMediaTransferClient {
36
139
  if (!response.body) {
37
140
  return bytes_1.EMPTY_BYTES;
38
141
  }
39
- return this.readAllBytesWithLimit(response.body, request.maxBytes);
142
+ return (0, bytes_1.readAllBytes)(response.body, {
143
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
144
+ });
40
145
  }
41
146
  async uploadStream(request) {
42
147
  const bodyIsBytes = request.body instanceof Uint8Array;
@@ -46,6 +151,8 @@ class WaMediaTransferClient {
46
151
  ? String(request.contentLength)
47
152
  : undefined
48
153
  });
154
+ const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
155
+ const agent = request.agent ?? this.defaultUploadAgent;
49
156
  const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
50
157
  if (!bodyIsBytes && urls.length > 1) {
51
158
  this.logger?.warn('upload stream fallback disabled for non-replayable body', {
@@ -58,26 +165,28 @@ class WaMediaTransferClient {
58
165
  timeoutMs,
59
166
  method
60
167
  });
61
- return this.executeTransfer(uploadUrls, timeoutMs, request.signal, {
62
- responseLog: 'media upload stream response',
63
- send: async (url, signal) => {
64
- if (bodyIsBytes) {
65
- return fetch(url, {
66
- method,
67
- headers,
68
- signal,
69
- body: request.body
70
- });
71
- }
72
- return fetch(url, {
168
+ const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, async (url, signal) => {
169
+ if (bodyIsBytes) {
170
+ return this.transferRequest(url, {
73
171
  method,
74
172
  headers,
75
173
  signal,
76
- body: request.body,
77
- duplex: 'half'
78
- });
174
+ body: request.body
175
+ }, dispatcher, agent);
79
176
  }
177
+ return this.transferRequest(url, {
178
+ method,
179
+ headers,
180
+ signal,
181
+ body: request.body,
182
+ duplex: 'half'
183
+ }, dispatcher, agent);
184
+ });
185
+ this.logger?.trace('media upload stream response', {
186
+ url: result.url,
187
+ status: result.status
80
188
  });
189
+ return result;
81
190
  }
82
191
  async uploadEncrypted(request) {
83
192
  this.logger?.info('media encrypted upload start', {
@@ -92,6 +201,8 @@ class WaMediaTransferClient {
92
201
  directPath: request.directPath,
93
202
  hosts: request.hosts,
94
203
  headers: request.headers,
204
+ dispatcher: request.dispatcher,
205
+ agent: request.agent,
95
206
  timeoutMs: request.timeoutMs,
96
207
  signal: request.signal,
97
208
  method: request.method,
@@ -112,7 +223,8 @@ class WaMediaTransferClient {
112
223
  transfer,
113
224
  mediaKey,
114
225
  fileSha256: metadata.fileSha256,
115
- fileEncSha256: metadata.fileEncSha256
226
+ fileEncSha256: metadata.fileEncSha256,
227
+ plaintextLength: metadata.plaintextLength
116
228
  };
117
229
  }
118
230
  async downloadAndDecrypt(request) {
@@ -122,7 +234,9 @@ class WaMediaTransferClient {
122
234
  const decrypted = await this.downloadAndDecryptStream(request);
123
235
  try {
124
236
  const [plaintext] = await Promise.all([
125
- this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes),
237
+ (0, bytes_1.readAllBytes)(decrypted.plaintext, {
238
+ maxBytes: request.maxBytes ?? this.defaultMaxReadBytes
239
+ }),
126
240
  decrypted.metadata
127
241
  ]);
128
242
  this.logger?.info('media encrypted download completed', {
@@ -158,13 +272,135 @@ class WaMediaTransferClient {
158
272
  if (!response.body) {
159
273
  return bytes_1.EMPTY_BYTES;
160
274
  }
161
- return this.readAllBytesWithLimit(response.body, maxBytes);
275
+ return (0, bytes_1.readAllBytes)(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
276
+ }
277
+ async transferRequest(url, init, dispatcher, agent) {
278
+ if (agent) {
279
+ return this.gotWithAgent(url, init, agent);
280
+ }
281
+ return this.fetchWithDispatcher(url, init, dispatcher);
282
+ }
283
+ async fetchWithDispatcher(url, init, dispatcher) {
284
+ const response = !dispatcher
285
+ ? await fetch(url, init)
286
+ : await fetch(url, {
287
+ ...init,
288
+ dispatcher
289
+ });
290
+ return this.toFetchTransferResponse(response);
291
+ }
292
+ toFetchTransferResponse(response) {
293
+ return {
294
+ status: response.status,
295
+ ok: response.ok,
296
+ headers: Object.fromEntries(response.headers.entries()),
297
+ body: response.body
298
+ ? node_stream_1.Readable.fromWeb(response.body)
299
+ : null,
300
+ cancel: async () => {
301
+ if (!response.body) {
302
+ return;
303
+ }
304
+ try {
305
+ await response.body.cancel();
306
+ }
307
+ catch {
308
+ // ignore cancel errors from remote resets
309
+ }
310
+ }
311
+ };
312
+ }
313
+ async gotWithAgent(url, init, agent) {
314
+ const got = await this.loadGotModule();
315
+ const urlObj = new URL(url);
316
+ const gotAgent = urlObj.protocol === 'http:'
317
+ ? { http: agent }
318
+ : urlObj.protocol === 'https:'
319
+ ? { https: agent }
320
+ : { http: agent, https: agent };
321
+ return new Promise((resolve, reject) => {
322
+ const request = got.stream(url, {
323
+ method: init.method,
324
+ headers: (init.headers ?? {}),
325
+ body: init.body,
326
+ signal: init.signal,
327
+ throwHttpErrors: false,
328
+ retry: { limit: 0 },
329
+ agent: gotAgent
330
+ });
331
+ const onError = (error) => {
332
+ request.off('response', onResponse);
333
+ reject((0, primitives_1.toError)(error));
334
+ };
335
+ const onResponse = (incoming) => {
336
+ request.off('error', onError);
337
+ resolve(this.toGotTransferResponse(incoming));
338
+ };
339
+ request.once('error', onError);
340
+ request.once('response', onResponse);
341
+ });
342
+ }
343
+ async loadGotModule() {
344
+ if (!this.gotModulePromise) {
345
+ this.gotModulePromise = loadOptionalGotModule().catch((error) => {
346
+ this.gotModulePromise = null;
347
+ throw error;
348
+ });
349
+ }
350
+ return this.gotModulePromise;
351
+ }
352
+ toGotTransferResponse(incoming) {
353
+ if (!incoming || typeof incoming !== 'object') {
354
+ throw new Error('invalid got response object');
355
+ }
356
+ const stream = incoming;
357
+ const status = typeof stream.statusCode === 'number' &&
358
+ Number.isFinite(stream.statusCode) &&
359
+ stream.statusCode >= 100 &&
360
+ stream.statusCode <= 599
361
+ ? stream.statusCode
362
+ : 500;
363
+ const headers = {};
364
+ if (stream.headers && typeof stream.headers === 'object') {
365
+ const input = stream.headers;
366
+ for (const key in input) {
367
+ const value = input[key];
368
+ if (typeof value === 'string') {
369
+ headers[key] = value;
370
+ continue;
371
+ }
372
+ if (Array.isArray(value)) {
373
+ headers[key] = value.join(', ');
374
+ continue;
375
+ }
376
+ if (value !== undefined && value !== null) {
377
+ headers[key] = String(value);
378
+ }
379
+ }
380
+ }
381
+ return {
382
+ status,
383
+ ok: status >= 200 && status < 300,
384
+ headers,
385
+ body: stream,
386
+ cancel: async () => {
387
+ stream.destroy();
388
+ }
389
+ };
162
390
  }
163
391
  resolveTransferRequest(request, extraHeaders) {
164
- const headers = this.mergeHeaders(request.headers);
165
- for (const [key, value] of Object.entries(extraHeaders ?? {})) {
166
- if (value !== undefined) {
167
- headers[key.toLowerCase()] = value;
392
+ const headers = { ...this.defaultHeaders };
393
+ if (request.headers) {
394
+ for (const key in request.headers) {
395
+ headers[key.toLowerCase()] = request.headers[key];
396
+ }
397
+ }
398
+ if (extraHeaders) {
399
+ for (const key in extraHeaders) {
400
+ const value = extraHeaders[key];
401
+ if (value !== undefined) {
402
+ headers[key.toLowerCase()] = value;
403
+ }
168
404
  }
169
405
  }
170
406
  return {
@@ -173,14 +409,6 @@ class WaMediaTransferClient {
173
409
  timeoutMs: request.timeoutMs ?? this.defaultTimeoutMs
174
410
  };
175
411
  }
176
- async executeTransfer(urls, timeoutMs, signal, options) {
177
- const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
178
- this.logger?.trace(options.responseLog, {
179
- url: result.url,
180
- status: result.response.status
181
- });
182
- return this.toResponse(result.url, result.response);
183
- }
184
412
  async prepareEncryptedUpload(request, mediaKey) {
185
413
  if (request.plaintext instanceof Uint8Array) {
186
414
  const encrypted = await WaMediaCrypto_1.WaMediaCrypto.encryptBytes(request.mediaType, mediaKey, request.plaintext);
@@ -189,7 +417,8 @@ class WaMediaTransferClient {
189
417
  contentLength: encrypted.ciphertextHmac.byteLength,
190
418
  metadata: Promise.resolve({
191
419
  fileSha256: encrypted.fileSha256,
192
- fileEncSha256: encrypted.fileEncSha256
420
+ fileEncSha256: encrypted.fileEncSha256,
421
+ plaintextLength: request.plaintext.byteLength
193
422
  }),
194
423
  cleanup: async () => undefined
195
424
  };
@@ -222,39 +451,26 @@ class WaMediaTransferClient {
222
451
  }
223
452
  resolveUrls(url, directPath, hosts) {
224
453
  const resolved = [];
225
- if (url) {
454
+ if (url && resolved.indexOf(url) === -1)
226
455
  resolved.push(url);
227
- }
228
456
  if (directPath) {
229
457
  if (directPath.startsWith('https://') || directPath.startsWith('http://')) {
230
- resolved.push(directPath);
458
+ if (resolved.indexOf(directPath) === -1)
459
+ resolved.push(directPath);
231
460
  }
232
461
  else {
233
462
  const normalizedPath = directPath.startsWith('/') ? directPath : `/${directPath}`;
234
463
  for (const host of hosts ?? this.defaultHosts) {
235
- resolved.push(`https://${host}${normalizedPath}`);
464
+ const candidate = `https://${host}${normalizedPath}`;
465
+ if (resolved.indexOf(candidate) === -1)
466
+ resolved.push(candidate);
236
467
  }
237
468
  }
238
469
  }
239
470
  if (resolved.length === 0) {
240
471
  throw new Error('missing transfer url/directPath');
241
472
  }
242
- return Array.from(new Set(resolved));
243
- }
244
- mergeHeaders(headers) {
245
- const merged = {};
246
- for (const [key, value] of Object.entries(this.defaultHeaders)) {
247
- merged[key.toLowerCase()] = value;
248
- }
249
- for (const [key, value] of Object.entries(headers ?? {})) {
250
- merged[key.toLowerCase()] = value;
251
- }
252
- return merged;
253
- }
254
- readAllBytesWithLimit(stream, maxBytes) {
255
- return (0, bytes_1.readAllBytes)(stream, {
256
- maxBytes: maxBytes ?? this.defaultMaxReadBytes
257
- });
473
+ return resolved;
258
474
  }
259
475
  async fetchWithFallback(urls, timeoutMs, signal, send) {
260
476
  let lastError = null;
@@ -265,9 +481,15 @@ class WaMediaTransferClient {
265
481
  const response = await send(url, abort.signal);
266
482
  const shouldFallback = response.status >= 500 && index < urls.length - 1;
267
483
  if (!shouldFallback) {
268
- return { url, response };
484
+ return {
485
+ url,
486
+ status: response.status,
487
+ ok: response.ok,
488
+ headers: response.headers,
489
+ body: response.body
490
+ };
269
491
  }
270
- await this.cancelWebBody(response.body);
492
+ await response.cancel();
271
493
  this.logger?.warn('transfer fallback to next host', {
272
494
  url,
273
495
  status: response.status
@@ -319,35 +541,6 @@ class WaMediaTransferClient {
319
541
  }
320
542
  };
321
543
  }
322
- toResponse(url, response) {
323
- return {
324
- url,
325
- status: response.status,
326
- ok: response.ok,
327
- headers: this.headersToRecord(response.headers),
328
- body: response.body
329
- ? node_stream_1.Readable.fromWeb(response.body)
330
- : null
331
- };
332
- }
333
- headersToRecord(headers) {
334
- const output = {};
335
- for (const [key, value] of headers.entries()) {
336
- output[key] = value;
337
- }
338
- return output;
339
- }
340
- async cancelWebBody(body) {
341
- if (!body) {
342
- return;
343
- }
344
- try {
345
- await body.cancel();
346
- }
347
- catch {
348
- // ignore cancel errors from remote resets
349
- }
350
- }
351
544
  async drainBody(body) {
352
545
  if (!body) {
353
546
  return;
@@ -19,12 +19,16 @@ function parseMediaConnResponse(node, nowMs) {
19
19
  throw new Error('media_conn response has invalid ttl');
20
20
  }
21
21
  const expiresAtMs = ttlRaw >= 1000000000 ? ttlRaw * 1000 : nowMs + ttlRaw * 1000;
22
- const hosts = (0, helpers_1.getNodeChildrenByTag)(mediaConnNode, constants_1.WA_NODE_TAGS.HOST)
23
- .map((host) => ({
24
- hostname: host.attrs.hostname ?? '',
25
- isFallback: host.attrs.type === 'fallback'
26
- }))
27
- .filter((host) => host.hostname.length > 0);
22
+ const hosts = [];
23
+ for (const host of (0, helpers_1.getNodeChildrenByTag)(mediaConnNode, constants_1.WA_NODE_TAGS.HOST)) {
24
+ const hostname = host.attrs.hostname;
25
+ if (hostname) {
26
+ hosts.push({
27
+ hostname,
28
+ isFallback: host.attrs.type === 'fallback'
29
+ });
30
+ }
31
+ }
28
32
  if (hosts.length === 0) {
29
33
  throw new Error('media_conn response contains no hosts');
30
34
  }
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MEDIA_UPLOAD_PATHS = exports.HMAC_TRUNCATED_SIZE = exports.MAC_KEY_END = exports.MAC_KEY_START = exports.ENC_KEY_END = exports.ENC_KEY_START = exports.IV_SIZE = exports.MEDIA_HKDF_SIZE = exports.MEDIA_CONN_CACHE_GRACE_MS = exports.DEFAULT_MEDIA_HOSTS = void 0;
4
- exports.DEFAULT_MEDIA_HOSTS = ['mmg.whatsapp.net', 'mmg-fallback.whatsapp.net'];
4
+ exports.DEFAULT_MEDIA_HOSTS = Object.freeze([
5
+ 'mmg.whatsapp.net',
6
+ 'mmg-fallback.whatsapp.net'
7
+ ]);
5
8
  exports.MEDIA_CONN_CACHE_GRACE_MS = 30000;
6
9
  exports.MEDIA_HKDF_SIZE = 112;
7
10
  exports.IV_SIZE = 16;
@@ -17,5 +20,6 @@ exports.MEDIA_UPLOAD_PATHS = Object.freeze({
17
20
  document: '/mms/document',
18
21
  sticker: '/mms/sticker',
19
22
  gif: '/mms/gif',
20
- ptt: '/mms/ptt'
23
+ ptt: '/mms/ptt',
24
+ ptv: '/mms/video'
21
25
  });
@@ -3,9 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaMessageClient = void 0;
4
4
  const ack_1 = require("./ack");
5
5
  const constants_1 = require("../protocol/constants");
6
- const parse_1 = require("../transport/stream/parse");
6
+ const global_1 = require("../transport/node/builders/global");
7
7
  const async_1 = require("../util/async");
8
8
  const primitives_1 = require("../util/primitives");
9
+ const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
9
10
  class MessagePublishNackError extends Error {
10
11
  constructor(message, retryable) {
11
12
  super(message);
@@ -105,12 +106,7 @@ class WaMessageClient {
105
106
  }
106
107
  async sendEncrypted(input) {
107
108
  const node = this.buildEncryptedMessageNode(input);
108
- this.logger.debug('encrypted message sent without waiting for ack', {
109
- to: node.attrs.to,
110
- type: node.attrs.type,
111
- id: node.attrs.id
112
- });
113
- await this.sendNode(node);
109
+ await this.sendMessageNode(node);
114
110
  }
115
111
  buildEncryptedMessageNode(input) {
116
112
  const attrs = {
@@ -120,6 +116,9 @@ class WaMessageClient {
120
116
  if (input.id) {
121
117
  attrs.id = input.id;
122
118
  }
119
+ if (input.edit) {
120
+ attrs.edit = input.edit;
121
+ }
123
122
  if (input.category) {
124
123
  attrs.category = input.category;
125
124
  }
@@ -139,6 +138,9 @@ class WaMessageClient {
139
138
  v: constants_1.WA_MESSAGE_TYPES.ENC_VERSION,
140
139
  type: input.encType
141
140
  };
141
+ if (input.mediatype) {
142
+ encAttrs.mediatype = input.mediatype;
143
+ }
142
144
  if (input.encCount !== undefined && input.encCount > 0) {
143
145
  encAttrs.count = String(Math.trunc(input.encCount));
144
146
  }
@@ -156,6 +158,9 @@ class WaMessageClient {
156
158
  content: input.deviceIdentity
157
159
  });
158
160
  }
161
+ if (input.metaNode) {
162
+ content.push(input.metaNode);
163
+ }
159
164
  const node = {
160
165
  tag: constants_1.WA_MESSAGE_TAGS.MESSAGE,
161
166
  attrs,
@@ -164,36 +169,29 @@ class WaMessageClient {
164
169
  return node;
165
170
  }
166
171
  async sendReceipt(input) {
167
- const attrs = {
172
+ const node = (0, global_1.buildReceiptNode)({
173
+ kind: 'outbound',
168
174
  to: input.to,
169
175
  id: input.id,
170
- type: input.type ?? 'read'
171
- };
172
- if (input.participant) {
173
- attrs.participant = input.participant;
174
- }
175
- if (input.from) {
176
- attrs.from = input.from;
177
- }
178
- if (input.t) {
179
- attrs.t = input.t;
180
- }
181
- this.logger.debug('sending receipt node', {
182
- to: attrs.to,
183
- id: attrs.id,
184
- type: attrs.type
176
+ type: input.type ?? 'read',
177
+ participant: input.participant,
178
+ recipient: input.recipient,
179
+ category: input.category,
180
+ from: input.from,
181
+ t: input.t,
182
+ peerParticipantPn: input.peerParticipantPn,
183
+ listIds: input.listIds,
184
+ content: input.content ? [...input.content] : undefined
185
185
  });
186
- await this.sendNode({
187
- tag: constants_1.WA_MESSAGE_TAGS.RECEIPT,
188
- attrs
186
+ this.logger.debug('sending receipt node', {
187
+ to: node.attrs.to,
188
+ id: node.attrs.id,
189
+ type: node.attrs.type
189
190
  });
191
+ await this.sendNode(node);
190
192
  }
191
193
  isRetryablePublishError(error) {
192
- const message = error.message.toLowerCase();
193
- return (message.includes('timeout') ||
194
- message.includes('socket') ||
195
- message.includes('connection') ||
196
- message.includes('closed'));
194
+ return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
197
195
  }
198
196
  extractAckMetadata(ackNode) {
199
197
  const addressingModeRaw = ackNode.attrs.addressing_mode;
@@ -206,8 +204,8 @@ class WaMessageClient {
206
204
  phash: ackNode.attrs.phash,
207
205
  refreshLid: ackNode.attrs.refresh_lid === 'true',
208
206
  addressingMode,
209
- count: (0, parse_1.parseOptionalInt)(ackNode.attrs.count),
210
- error: (0, parse_1.parseOptionalInt)(ackNode.attrs.error)
207
+ count: (0, primitives_1.parseOptionalInt)(ackNode.attrs.count),
208
+ error: (0, primitives_1.parseOptionalInt)(ackNode.attrs.error)
211
209
  };
212
210
  }
213
211
  }