zapo-js 0.1.1 → 0.1.2

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 (363) hide show
  1. package/README.md +8 -0
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +26 -5
  354. package/dist/crypto/core/encoding.js +0 -29
  355. package/dist/esm/crypto/core/encoding.js +0 -25
  356. package/dist/esm/util/base64.js +0 -18
  357. package/dist/esm/util/signal-address.js +0 -5
  358. package/dist/types/crypto/core/encoding.d.ts +0 -11
  359. package/dist/types/util/base64.d.ts +0 -4
  360. package/dist/types/util/signal-address.d.ts +0 -2
  361. package/dist/util/base64.js +0 -24
  362. package/dist/util/signal-address.js +0 -8
  363. /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,27 +40,95 @@ 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
125
  return this.executeTransfer(urls, timeoutMs, request.signal, {
25
126
  responseLog: 'media download stream response',
26
- send: (url, signal) => fetch(url, {
127
+ send: (url, signal) => this.transferRequest(url, {
27
128
  method: 'GET',
28
129
  headers,
29
130
  signal
30
- })
131
+ }, dispatcher, agent)
31
132
  });
32
133
  }
33
134
  async downloadBytes(request) {
@@ -46,6 +147,8 @@ class WaMediaTransferClient {
46
147
  ? String(request.contentLength)
47
148
  : undefined
48
149
  });
150
+ const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
151
+ const agent = request.agent ?? this.defaultUploadAgent;
49
152
  const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
50
153
  if (!bodyIsBytes && urls.length > 1) {
51
154
  this.logger?.warn('upload stream fallback disabled for non-replayable body', {
@@ -62,20 +165,20 @@ class WaMediaTransferClient {
62
165
  responseLog: 'media upload stream response',
63
166
  send: async (url, signal) => {
64
167
  if (bodyIsBytes) {
65
- return fetch(url, {
168
+ return this.transferRequest(url, {
66
169
  method,
67
170
  headers,
68
171
  signal,
69
172
  body: request.body
70
- });
173
+ }, dispatcher, agent);
71
174
  }
72
- return fetch(url, {
175
+ return this.transferRequest(url, {
73
176
  method,
74
177
  headers,
75
178
  signal,
76
179
  body: request.body,
77
180
  duplex: 'half'
78
- });
181
+ }, dispatcher, agent);
79
182
  }
80
183
  });
81
184
  }
@@ -92,6 +195,8 @@ class WaMediaTransferClient {
92
195
  directPath: request.directPath,
93
196
  hosts: request.hosts,
94
197
  headers: request.headers,
198
+ dispatcher: request.dispatcher,
199
+ agent: request.agent,
95
200
  timeoutMs: request.timeoutMs,
96
201
  signal: request.signal,
97
202
  method: request.method,
@@ -121,10 +226,8 @@ class WaMediaTransferClient {
121
226
  });
122
227
  const decrypted = await this.downloadAndDecryptStream(request);
123
228
  try {
124
- const [plaintext] = await Promise.all([
125
- this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes),
126
- decrypted.metadata
127
- ]);
229
+ const plaintext = await this.readAllBytesWithLimit(decrypted.plaintext, request.maxBytes);
230
+ await decrypted.metadata;
128
231
  this.logger?.info('media encrypted download completed', {
129
232
  byteLength: plaintext.byteLength
130
233
  });
@@ -160,11 +263,133 @@ class WaMediaTransferClient {
160
263
  }
161
264
  return this.readAllBytesWithLimit(response.body, maxBytes);
162
265
  }
266
+ async transferRequest(url, init, dispatcher, agent) {
267
+ if (agent) {
268
+ return this.gotWithAgent(url, init, agent);
269
+ }
270
+ return this.fetchWithDispatcher(url, init, dispatcher);
271
+ }
272
+ async fetchWithDispatcher(url, init, dispatcher) {
273
+ const response = !dispatcher
274
+ ? await fetch(url, init)
275
+ : await fetch(url, {
276
+ ...init,
277
+ dispatcher
278
+ });
279
+ return this.toFetchTransferResponse(response);
280
+ }
281
+ toFetchTransferResponse(response) {
282
+ return {
283
+ status: response.status,
284
+ ok: response.ok,
285
+ headers: this.headersToRecord(response.headers),
286
+ body: response.body
287
+ ? node_stream_1.Readable.fromWeb(response.body)
288
+ : null,
289
+ cancel: async () => {
290
+ if (!response.body) {
291
+ return;
292
+ }
293
+ try {
294
+ await response.body.cancel();
295
+ }
296
+ catch {
297
+ // ignore cancel errors from remote resets
298
+ }
299
+ }
300
+ };
301
+ }
302
+ async gotWithAgent(url, init, agent) {
303
+ const got = await this.loadGotModule();
304
+ const urlObj = new URL(url);
305
+ const gotAgent = urlObj.protocol === 'http:'
306
+ ? { http: agent }
307
+ : urlObj.protocol === 'https:'
308
+ ? { https: agent }
309
+ : { http: agent, https: agent };
310
+ return new Promise((resolve, reject) => {
311
+ const request = got.stream(url, {
312
+ method: init.method,
313
+ headers: (init.headers ?? {}),
314
+ body: init.body,
315
+ signal: init.signal,
316
+ throwHttpErrors: false,
317
+ retry: { limit: 0 },
318
+ agent: gotAgent
319
+ });
320
+ const onError = (error) => {
321
+ request.off('response', onResponse);
322
+ reject((0, primitives_1.toError)(error));
323
+ };
324
+ const onResponse = (incoming) => {
325
+ request.off('error', onError);
326
+ resolve(this.toGotTransferResponse(incoming));
327
+ };
328
+ request.once('error', onError);
329
+ request.once('response', onResponse);
330
+ });
331
+ }
332
+ async loadGotModule() {
333
+ if (!this.gotModulePromise) {
334
+ this.gotModulePromise = loadOptionalGotModule().catch((error) => {
335
+ this.gotModulePromise = null;
336
+ throw error;
337
+ });
338
+ }
339
+ return this.gotModulePromise;
340
+ }
341
+ toGotTransferResponse(incoming) {
342
+ if (!incoming || typeof incoming !== 'object') {
343
+ throw new Error('invalid got response object');
344
+ }
345
+ const stream = incoming;
346
+ const status = typeof stream.statusCode === 'number' &&
347
+ Number.isFinite(stream.statusCode) &&
348
+ stream.statusCode >= 100 &&
349
+ stream.statusCode <= 599
350
+ ? stream.statusCode
351
+ : 500;
352
+ const headers = {};
353
+ if (stream.headers && typeof stream.headers === 'object') {
354
+ const input = stream.headers;
355
+ for (const key in input) {
356
+ const value = input[key];
357
+ if (typeof value === 'string') {
358
+ headers[key] = value;
359
+ continue;
360
+ }
361
+ if (Array.isArray(value)) {
362
+ headers[key] = value.join(', ');
363
+ continue;
364
+ }
365
+ if (value !== undefined && value !== null) {
366
+ headers[key] = String(value);
367
+ }
368
+ }
369
+ }
370
+ return {
371
+ status,
372
+ ok: status >= 200 && status < 300,
373
+ headers,
374
+ body: stream,
375
+ cancel: async () => {
376
+ stream.destroy();
377
+ }
378
+ };
379
+ }
163
380
  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;
381
+ const headers = { ...this.defaultHeaders };
382
+ if (request.headers) {
383
+ for (const key in request.headers) {
384
+ headers[key.toLowerCase()] = request.headers[key];
385
+ }
386
+ }
387
+ if (extraHeaders) {
388
+ for (const key in extraHeaders) {
389
+ const value = extraHeaders[key];
390
+ if (value !== undefined) {
391
+ headers[key.toLowerCase()] = value;
392
+ }
168
393
  }
169
394
  }
170
395
  return {
@@ -177,9 +402,9 @@ class WaMediaTransferClient {
177
402
  const result = await this.fetchWithFallback(urls, timeoutMs, signal, options.send);
178
403
  this.logger?.trace(options.responseLog, {
179
404
  url: result.url,
180
- status: result.response.status
405
+ status: result.status
181
406
  });
182
- return this.toResponse(result.url, result.response);
407
+ return result;
183
408
  }
184
409
  async prepareEncryptedUpload(request, mediaKey) {
185
410
  if (request.plaintext instanceof Uint8Array) {
@@ -222,34 +447,26 @@ class WaMediaTransferClient {
222
447
  }
223
448
  resolveUrls(url, directPath, hosts) {
224
449
  const resolved = [];
225
- if (url) {
450
+ if (url && resolved.indexOf(url) === -1)
226
451
  resolved.push(url);
227
- }
228
452
  if (directPath) {
229
453
  if (directPath.startsWith('https://') || directPath.startsWith('http://')) {
230
- resolved.push(directPath);
454
+ if (resolved.indexOf(directPath) === -1)
455
+ resolved.push(directPath);
231
456
  }
232
457
  else {
233
458
  const normalizedPath = directPath.startsWith('/') ? directPath : `/${directPath}`;
234
459
  for (const host of hosts ?? this.defaultHosts) {
235
- resolved.push(`https://${host}${normalizedPath}`);
460
+ const candidate = `https://${host}${normalizedPath}`;
461
+ if (resolved.indexOf(candidate) === -1)
462
+ resolved.push(candidate);
236
463
  }
237
464
  }
238
465
  }
239
466
  if (resolved.length === 0) {
240
467
  throw new Error('missing transfer url/directPath');
241
468
  }
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;
469
+ return resolved;
253
470
  }
254
471
  readAllBytesWithLimit(stream, maxBytes) {
255
472
  return (0, bytes_1.readAllBytes)(stream, {
@@ -265,9 +482,15 @@ class WaMediaTransferClient {
265
482
  const response = await send(url, abort.signal);
266
483
  const shouldFallback = response.status >= 500 && index < urls.length - 1;
267
484
  if (!shouldFallback) {
268
- return { url, response };
485
+ return {
486
+ url,
487
+ status: response.status,
488
+ ok: response.ok,
489
+ headers: response.headers,
490
+ body: response.body
491
+ };
269
492
  }
270
- await this.cancelWebBody(response.body);
493
+ await response.cancel();
271
494
  this.logger?.warn('transfer fallback to next host', {
272
495
  url,
273
496
  status: response.status
@@ -319,35 +542,13 @@ class WaMediaTransferClient {
319
542
  }
320
543
  };
321
544
  }
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
545
  headersToRecord(headers) {
334
546
  const output = {};
335
- for (const [key, value] of headers.entries()) {
547
+ headers.forEach((value, key) => {
336
548
  output[key] = value;
337
- }
549
+ });
338
550
  return output;
339
551
  }
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
552
  async drainBody(body) {
352
553
  if (!body) {
353
554
  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;
@@ -3,9 +3,9 @@ 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");
7
6
  const async_1 = require("../util/async");
8
7
  const primitives_1 = require("../util/primitives");
8
+ const WA_RETRYABLE_PUBLISH_ERROR_RE = /timeout|socket|connection|closed/i;
9
9
  class MessagePublishNackError extends Error {
10
10
  constructor(message, retryable) {
11
11
  super(message);
@@ -105,12 +105,7 @@ class WaMessageClient {
105
105
  }
106
106
  async sendEncrypted(input) {
107
107
  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);
108
+ await this.sendMessageNode(node);
114
109
  }
115
110
  buildEncryptedMessageNode(input) {
116
111
  const attrs = {
@@ -189,11 +184,7 @@ class WaMessageClient {
189
184
  });
190
185
  }
191
186
  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'));
187
+ return WA_RETRYABLE_PUBLISH_ERROR_RE.test(error.message);
197
188
  }
198
189
  extractAckMetadata(ackNode) {
199
190
  const addressingModeRaw = ackNode.attrs.addressing_mode;
@@ -206,8 +197,8 @@ class WaMessageClient {
206
197
  phash: ackNode.attrs.phash,
207
198
  refreshLid: ackNode.attrs.refresh_lid === 'true',
208
199
  addressingMode,
209
- count: (0, parse_1.parseOptionalInt)(ackNode.attrs.count),
210
- error: (0, parse_1.parseOptionalInt)(ackNode.attrs.error)
200
+ count: (0, primitives_1.parseOptionalInt)(ackNode.attrs.count),
201
+ error: (0, primitives_1.parseOptionalInt)(ackNode.attrs.error)
211
202
  };
212
203
  }
213
204
  }
@@ -31,22 +31,22 @@ function isRetryableNegativeAck(node) {
31
31
  return false;
32
32
  }
33
33
  function describeAckNode(node) {
34
- const parts = [`tag=${node.tag}`];
34
+ let description = `tag=${node.tag}`;
35
35
  const id = node.attrs.id;
36
36
  const type = node.attrs.type;
37
37
  const ackClass = node.attrs.class;
38
38
  const code = node.attrs.code;
39
39
  if (id) {
40
- parts.push(`id=${id}`);
40
+ description += ` id=${id}`;
41
41
  }
42
42
  if (type) {
43
- parts.push(`type=${type}`);
43
+ description += ` type=${type}`;
44
44
  }
45
45
  if (ackClass) {
46
- parts.push(`class=${ackClass}`);
46
+ description += ` class=${ackClass}`;
47
47
  }
48
48
  if (code) {
49
- parts.push(`code=${code}`);
49
+ description += ` code=${code}`;
50
50
  }
51
- return parts.join(' ');
51
+ return description;
52
52
  }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldUseAddonAdditionalData = shouldUseAddonAdditionalData;
4
+ exports.buildAddonAdditionalData = buildAddonAdditionalData;
5
+ exports.encryptAddonPayload = encryptAddonPayload;
6
+ exports.decryptAddonPayload = decryptAddonPayload;
7
+ const _crypto_1 = require("../crypto/index.js");
8
+ const use_case_secret_1 = require("./use-case-secret");
9
+ const bytes_1 = require("../util/bytes");
10
+ const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
11
+ function shouldUseAddonAdditionalData(modificationType) {
12
+ return (modificationType === use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE ||
13
+ modificationType === use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE);
14
+ }
15
+ function buildAddonAdditionalData(stanzaId, addOnSenderJid) {
16
+ if (!stanzaId.trim()) {
17
+ throw new Error('stanza id must be a non-empty string');
18
+ }
19
+ if (!addOnSenderJid.trim()) {
20
+ throw new Error('addon sender jid must be a non-empty string');
21
+ }
22
+ return bytes_1.TEXT_ENCODER.encode(`${stanzaId}\u0000${addOnSenderJid}`);
23
+ }
24
+ async function encryptAddonPayload(input) {
25
+ const secret = await (0, use_case_secret_1.createUseCaseSecret)({
26
+ messageSecret: (0, use_case_secret_1.assertMessageSecret)(input.messageSecret),
27
+ stanzaId: input.stanzaId,
28
+ parentMsgOriginalSender: input.parentMsgOriginalSender,
29
+ modificationSender: input.modificationSender,
30
+ modificationType: input.modificationType
31
+ });
32
+ const key = await (0, _crypto_1.importAesGcmKey)(secret, ['encrypt']);
33
+ const iv = assertAddonIv(input.iv);
34
+ const additionalData = resolveAddonAdditionalData(input);
35
+ return (0, _crypto_1.aesGcmEncrypt)(key, iv, (0, bytes_1.toBytesView)(input.payload), additionalData);
36
+ }
37
+ async function decryptAddonPayload(input) {
38
+ const secret = await (0, use_case_secret_1.createUseCaseSecret)({
39
+ messageSecret: (0, use_case_secret_1.assertMessageSecret)(input.messageSecret),
40
+ stanzaId: input.stanzaId,
41
+ parentMsgOriginalSender: input.parentMsgOriginalSender,
42
+ modificationSender: input.modificationSender,
43
+ modificationType: input.modificationType
44
+ });
45
+ const key = await (0, _crypto_1.importAesGcmKey)(secret, ['decrypt']);
46
+ const iv = assertAddonIv(input.iv);
47
+ const additionalData = resolveAddonAdditionalData(input);
48
+ return (0, _crypto_1.aesGcmDecrypt)(key, iv, (0, bytes_1.toBytesView)(input.ciphertext), additionalData);
49
+ }
50
+ function assertAddonIv(iv) {
51
+ const normalized = (0, bytes_1.toBytesView)(iv);
52
+ if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {
53
+ throw new Error(`addon iv must be ${WA_ADDON_ENCRYPTION_NONCE_BYTES} bytes (got ${normalized.byteLength})`);
54
+ }
55
+ return normalized;
56
+ }
57
+ function resolveAddonAdditionalData(input) {
58
+ if (input.additionalData) {
59
+ return (0, bytes_1.toBytesView)(input.additionalData);
60
+ }
61
+ if (!shouldUseAddonAdditionalData(input.modificationType)) {
62
+ return bytes_1.EMPTY_BYTES;
63
+ }
64
+ return buildAddonAdditionalData(input.stanzaId, input.modificationSender);
65
+ }