zapo-js 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +7 -3
  2. package/dist/appstate/WaAppStateCrypto.js +49 -41
  3. package/dist/appstate/WaAppStateSyncClient.js +79 -42
  4. package/dist/appstate/index.js +2 -2
  5. package/dist/auth/WaAuthClient.js +20 -11
  6. package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  7. package/dist/auth/pairing/WaPairingFlow.js +26 -29
  8. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
  9. package/dist/client/WaClient.js +115 -75
  10. package/dist/client/WaClientFactory.js +113 -30
  11. package/dist/client/connection/WaConnectionManager.js +4 -1
  12. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  13. package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
  14. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  15. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
  16. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
  17. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  18. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  19. package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
  20. package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
  21. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
  22. package/dist/client/dirty.js +1 -1
  23. package/dist/client/events/abprops.js +43 -0
  24. package/dist/client/events/privacy-token.js +1 -2
  25. package/dist/client/events/registration.js +42 -0
  26. package/dist/client/incoming.js +37 -0
  27. package/dist/client/mailbox.js +17 -1
  28. package/dist/client/media.js +243 -0
  29. package/dist/client/messages.js +163 -86
  30. package/dist/crypto/core/index.js +4 -1
  31. package/dist/crypto/core/random.js +3 -9
  32. package/dist/crypto/core/xeddsa.js +57 -0
  33. package/dist/crypto/curves/X25519.js +18 -0
  34. package/dist/crypto/curves/constants.js +2 -1
  35. package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
  36. package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
  37. package/dist/esm/appstate/index.js +1 -1
  38. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  39. package/dist/esm/auth/WaAuthClient.js +17 -8
  40. package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  41. package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
  42. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
  43. package/dist/esm/client/WaClient.js +116 -76
  44. package/dist/esm/client/WaClientFactory.js +114 -31
  45. package/dist/esm/client/connection/WaConnectionManager.js +4 -1
  46. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  47. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
  48. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  49. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
  50. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
  51. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  52. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  53. package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
  54. package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
  55. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
  56. package/dist/esm/client/dirty.js +1 -1
  57. package/dist/esm/client/events/abprops.js +40 -0
  58. package/dist/esm/client/events/privacy-token.js +1 -2
  59. package/dist/esm/client/events/registration.js +39 -0
  60. package/dist/esm/client/incoming.js +36 -0
  61. package/dist/esm/client/mailbox.js +17 -1
  62. package/dist/esm/client/media.js +234 -0
  63. package/dist/esm/client/messages.js +162 -85
  64. package/dist/esm/crypto/core/index.js +1 -0
  65. package/dist/esm/crypto/core/random.js +2 -7
  66. package/dist/esm/crypto/core/xeddsa.js +53 -0
  67. package/dist/esm/crypto/curves/X25519.js +20 -2
  68. package/dist/esm/crypto/curves/constants.js +1 -0
  69. package/dist/esm/infra/perf/StoreLock.js +7 -4
  70. package/dist/esm/media/WaMediaCrypto.js +257 -62
  71. package/dist/esm/media/WaMediaTransferClient.js +47 -190
  72. package/dist/esm/media/constants.js +2 -0
  73. package/dist/esm/media/processor.js +1 -0
  74. package/dist/esm/message/addon-crypto.js +130 -3
  75. package/dist/esm/message/content.js +12 -6
  76. package/dist/esm/message/icdc.js +8 -8
  77. package/dist/esm/message/incoming.js +14 -12
  78. package/dist/esm/message/phash.js +32 -12
  79. package/dist/esm/message/reporting-token.js +3 -3
  80. package/dist/esm/message/use-case-secret.js +1 -1
  81. package/dist/esm/protocol/abprops.js +159 -0
  82. package/dist/esm/protocol/browser.js +14 -0
  83. package/dist/esm/protocol/constants.js +3 -1
  84. package/dist/esm/protocol/email.js +30 -0
  85. package/dist/esm/protocol/jid.js +44 -10
  86. package/dist/esm/protocol/nodes.js +6 -2
  87. package/dist/esm/protocol/notification.js +7 -1
  88. package/dist/esm/retry/reason.js +1 -1
  89. package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
  90. package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
  91. package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
  92. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
  93. package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
  94. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
  95. package/dist/esm/signal/crypto/constants.js +0 -4
  96. package/dist/esm/signal/encoding.js +11 -54
  97. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  98. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  99. package/dist/esm/signal/group/SenderKeyManager.js +13 -10
  100. package/dist/esm/signal/registration/keygen.js +2 -3
  101. package/dist/esm/signal/registration/utils.js +2 -2
  102. package/dist/esm/signal/session/SignalProtocol.js +18 -17
  103. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  104. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  105. package/dist/esm/signal/session/SignalSession.js +11 -9
  106. package/dist/esm/signal/session/resolver.js +6 -6
  107. package/dist/esm/store/contracts/identity.store.js +1 -0
  108. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  109. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  110. package/dist/esm/store/contracts/session.store.js +1 -0
  111. package/dist/esm/store/createStore.js +48 -12
  112. package/dist/esm/store/index.js +4 -0
  113. package/dist/esm/store/locks/identity.lock.js +16 -0
  114. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  115. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  116. package/dist/esm/store/locks/session.lock.js +19 -0
  117. package/dist/esm/store/locks/signal.lock.js +0 -24
  118. package/dist/esm/store/noop.store.js +20 -0
  119. package/dist/esm/store/providers/memory/device-list.store.js +3 -0
  120. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  121. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  122. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  123. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  124. package/dist/esm/store/providers/memory/retry.store.js +25 -11
  125. package/dist/esm/store/providers/memory/session.store.js +45 -0
  126. package/dist/esm/store/providers/memory/signal.store.js +1 -164
  127. package/dist/esm/transport/WaComms.js +4 -3
  128. package/dist/esm/transport/WaWebSocket.js +9 -1
  129. package/dist/esm/transport/index.js +6 -0
  130. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  131. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  132. package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
  133. package/dist/esm/transport/node/builders/abprops.js +20 -0
  134. package/dist/esm/transport/node/builders/device.js +11 -0
  135. package/dist/esm/transport/node/builders/email.js +65 -0
  136. package/dist/esm/transport/node/builders/offline.js +14 -0
  137. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  138. package/dist/esm/transport/node/builders/presence.js +13 -0
  139. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  140. package/dist/esm/transport/node/builders/retry.js +1 -1
  141. package/dist/esm/transport/node/helpers.js +24 -0
  142. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  143. package/dist/esm/transport/node/mex/client.js +83 -0
  144. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  145. package/dist/esm/transport/noise/WaClientPayload.js +15 -10
  146. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  147. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  148. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  149. package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
  150. package/dist/infra/perf/StoreLock.js +7 -4
  151. package/dist/media/WaMediaCrypto.js +253 -58
  152. package/dist/media/WaMediaTransferClient.js +50 -223
  153. package/dist/media/constants.js +3 -1
  154. package/dist/media/processor.js +2 -0
  155. package/dist/message/addon-crypto.js +131 -0
  156. package/dist/message/content.js +13 -5
  157. package/dist/message/icdc.js +8 -8
  158. package/dist/message/incoming.js +14 -12
  159. package/dist/message/phash.js +32 -12
  160. package/dist/message/reporting-token.js +2 -2
  161. package/dist/message/use-case-secret.js +1 -1
  162. package/dist/protocol/abprops.js +163 -0
  163. package/dist/protocol/browser.js +15 -0
  164. package/dist/protocol/constants.js +14 -2
  165. package/dist/protocol/email.js +33 -0
  166. package/dist/protocol/jid.js +45 -10
  167. package/dist/protocol/nodes.js +6 -2
  168. package/dist/protocol/notification.js +8 -2
  169. package/dist/retry/reason.js +1 -1
  170. package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
  171. package/dist/signal/api/SignalDigestSyncApi.js +8 -6
  172. package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
  173. package/dist/signal/crypto/WaAdvSignature.js +2 -50
  174. package/dist/signal/crypto/constants.js +1 -5
  175. package/dist/signal/encoding.js +11 -49
  176. package/dist/signal/group/SenderKeyChain.js +2 -2
  177. package/dist/signal/group/SenderKeyCodec.js +4 -5
  178. package/dist/signal/group/SenderKeyManager.js +12 -9
  179. package/dist/signal/registration/keygen.js +1 -2
  180. package/dist/signal/registration/utils.js +2 -2
  181. package/dist/signal/session/SignalProtocol.js +18 -17
  182. package/dist/signal/session/SignalRatchet.js +19 -8
  183. package/dist/signal/session/SignalSerializer.js +5 -6
  184. package/dist/signal/session/SignalSession.js +11 -9
  185. package/dist/signal/session/resolver.js +6 -6
  186. package/dist/store/contracts/identity.store.js +2 -0
  187. package/dist/store/contracts/message-secret.store.js +2 -0
  188. package/dist/store/contracts/pre-key.store.js +2 -0
  189. package/dist/store/contracts/session.store.js +2 -0
  190. package/dist/store/createStore.js +47 -11
  191. package/dist/store/index.js +9 -1
  192. package/dist/store/locks/identity.lock.js +19 -0
  193. package/dist/store/locks/message-secret.lock.js +20 -0
  194. package/dist/store/locks/pre-key.lock.js +30 -0
  195. package/dist/store/locks/session.lock.js +22 -0
  196. package/dist/store/locks/signal.lock.js +0 -24
  197. package/dist/store/noop.store.js +21 -1
  198. package/dist/store/providers/memory/device-list.store.js +3 -0
  199. package/dist/store/providers/memory/identity.store.js +35 -0
  200. package/dist/store/providers/memory/message-secret.store.js +85 -0
  201. package/dist/store/providers/memory/participants.store.js +3 -0
  202. package/dist/store/providers/memory/pre-key.store.js +101 -0
  203. package/dist/store/providers/memory/retry.store.js +24 -10
  204. package/dist/store/providers/memory/session.store.js +49 -0
  205. package/dist/store/providers/memory/signal.store.js +1 -164
  206. package/dist/transport/WaComms.js +4 -3
  207. package/dist/transport/WaWebSocket.js +9 -1
  208. package/dist/transport/index.js +17 -1
  209. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  210. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  211. package/dist/transport/node/WaNodeOrchestrator.js +16 -7
  212. package/dist/transport/node/builders/abprops.js +23 -0
  213. package/dist/transport/node/builders/device.js +14 -0
  214. package/dist/transport/node/builders/email.js +72 -0
  215. package/dist/transport/node/builders/offline.js +17 -0
  216. package/dist/transport/node/builders/prekeys.js +36 -39
  217. package/dist/transport/node/builders/presence.js +16 -0
  218. package/dist/transport/node/builders/privacy-token.js +18 -22
  219. package/dist/transport/node/builders/retry.js +1 -1
  220. package/dist/transport/node/helpers.js +26 -0
  221. package/dist/transport/node/mex/argo-decoder.js +189 -0
  222. package/dist/transport/node/mex/client.js +86 -0
  223. package/dist/transport/node/mex/persist-ids.js +13 -0
  224. package/dist/transport/noise/WaClientPayload.js +14 -9
  225. package/dist/transport/noise/WaFrameCodec.js +1 -1
  226. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  227. package/dist/transport/noise/WaNoiseCert.js +8 -26
  228. package/dist/transport/noise/WaNoiseSession.js +11 -10
  229. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  230. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  231. package/dist/types/appstate/index.d.ts +1 -1
  232. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  233. package/dist/types/appstate/types.d.ts +1 -1
  234. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  235. package/dist/types/auth/credentials-flow.d.ts +20 -0
  236. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  237. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  238. package/dist/types/auth/types.d.ts +40 -0
  239. package/dist/types/client/WaClient.d.ts +19 -8
  240. package/dist/types/client/WaClientFactory.d.ts +10 -4
  241. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  242. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
  243. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  244. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
  245. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
  246. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  247. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
  248. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
  249. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
  250. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  251. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
  252. package/dist/types/client/dirty.d.ts +3 -1
  253. package/dist/types/client/events/abprops.d.ts +14 -0
  254. package/dist/types/client/events/registration.d.ts +17 -0
  255. package/dist/types/client/incoming.d.ts +6 -1
  256. package/dist/types/client/mailbox.d.ts +2 -0
  257. package/dist/types/client/media.d.ts +31 -0
  258. package/dist/types/client/messages.d.ts +2 -0
  259. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
  260. package/dist/types/client/types.d.ts +100 -1
  261. package/dist/types/crypto/core/index.d.ts +1 -0
  262. package/dist/types/crypto/core/primitives.d.ts +1 -1
  263. package/dist/types/crypto/core/random.d.ts +1 -1
  264. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  265. package/dist/types/crypto/curves/constants.d.ts +1 -0
  266. package/dist/types/crypto/index.d.ts +1 -0
  267. package/dist/types/index.d.ts +2 -1
  268. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  269. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  270. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  271. package/dist/types/media/WaMediaCrypto.d.ts +15 -6
  272. package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
  273. package/dist/types/media/constants.d.ts +2 -0
  274. package/dist/types/media/index.d.ts +1 -0
  275. package/dist/types/media/processor.d.ts +28 -0
  276. package/dist/types/media/types.d.ts +9 -3
  277. package/dist/types/message/addon-crypto.d.ts +34 -3
  278. package/dist/types/message/content.d.ts +3 -1
  279. package/dist/types/message/icdc.d.ts +4 -4
  280. package/dist/types/message/types.d.ts +16 -24
  281. package/dist/types/protocol/abprops.d.ts +142 -0
  282. package/dist/types/protocol/browser.d.ts +1 -0
  283. package/dist/types/protocol/constants.d.ts +5 -1
  284. package/dist/types/protocol/email.d.ts +32 -0
  285. package/dist/types/protocol/jid.d.ts +1 -0
  286. package/dist/types/protocol/nodes.d.ts +4 -0
  287. package/dist/types/protocol/notification.d.ts +6 -0
  288. package/dist/types/protocol/stream.d.ts +1 -0
  289. package/dist/types/retry/reason.d.ts +1 -1
  290. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
  291. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
  292. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  293. package/dist/types/signal/crypto/constants.d.ts +0 -1
  294. package/dist/types/signal/encoding.d.ts +7 -1
  295. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  296. package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
  297. package/dist/types/signal/registration/utils.d.ts +2 -1
  298. package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
  299. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  300. package/dist/types/signal/session/resolver.d.ts +4 -2
  301. package/dist/types/signal/types.d.ts +16 -4
  302. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  303. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  304. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  305. package/dist/types/store/contracts/session.store.d.ts +14 -0
  306. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  307. package/dist/types/store/index.d.ts +9 -1
  308. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  309. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  310. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  311. package/dist/types/store/locks/session.lock.d.ts +3 -0
  312. package/dist/types/store/noop.store.d.ts +4 -0
  313. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  314. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  315. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  316. package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
  317. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  318. package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
  319. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  320. package/dist/types/store/types.d.ts +21 -1
  321. package/dist/types/transport/WaWebSocket.d.ts +1 -0
  322. package/dist/types/transport/index.d.ts +8 -1
  323. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  324. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  325. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
  326. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  327. package/dist/types/transport/node/builders/device.d.ts +2 -0
  328. package/dist/types/transport/node/builders/email.d.ts +11 -0
  329. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  330. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  331. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  332. package/dist/types/transport/node/helpers.d.ts +3 -0
  333. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  334. package/dist/types/transport/node/mex/client.d.ts +18 -0
  335. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  336. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  337. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  338. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  339. package/dist/types/transport/types.d.ts +8 -0
  340. package/package.json +6 -4
  341. package/dist/auth/pairing/constants.js +0 -5
  342. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  343. package/dist/esm/auth/pairing/constants.js +0 -2
  344. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  345. package/dist/esm/transport/node/builders/index.js +0 -11
  346. package/dist/transport/node/builders/index.js +0 -51
  347. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  348. package/dist/types/auth/pairing/constants.d.ts +0 -2
  349. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  350. package/dist/types/transport/node/builders/index.d.ts +0 -11
  351. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,46 +1,16 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.WaMediaTransferClient = void 0;
37
- const node_stream_1 = require("node:stream");
7
+ const node_http_1 = __importDefault(require("node:http"));
8
+ const node_https_1 = __importDefault(require("node:https"));
38
9
  const constants_1 = require("./constants");
39
10
  const WaMediaCrypto_1 = require("./WaMediaCrypto");
40
11
  const constants_2 = require("../protocol/constants");
41
12
  const bytes_1 = require("../util/bytes");
42
13
  const primitives_1 = require("../util/primitives");
43
- const GOT_OPTIONAL_MODULE = 'got';
44
14
  function normalizeHeaderRecord(headers) {
45
15
  if (!headers) {
46
16
  return {};
@@ -51,56 +21,6 @@ function normalizeHeaderRecord(headers) {
51
21
  }
52
22
  return normalized;
53
23
  }
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
- }
104
24
  class WaMediaTransferClient {
105
25
  constructor(options = {}) {
106
26
  this.logger = options.logger;
@@ -108,25 +28,18 @@ class WaMediaTransferClient {
108
28
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_2.WA_DEFAULTS.MEDIA_TIMEOUT_MS;
109
29
  this.defaultMaxReadBytes = options.defaultMaxReadBytes;
110
30
  this.defaultHeaders = normalizeHeaderRecord(options.defaultHeaders);
111
- this.defaultUploadDispatcher = options.defaultUploadDispatcher;
112
- this.defaultDownloadDispatcher = options.defaultDownloadDispatcher;
113
31
  this.defaultUploadAgent = options.defaultUploadAgent;
114
32
  this.defaultDownloadAgent = options.defaultDownloadAgent;
115
- this.gotModulePromise = null;
33
+ this.skipMacVerification = options.skipMacVerification === true;
116
34
  }
117
35
  async downloadStream(request) {
118
36
  const { urls, headers, timeoutMs } = this.resolveTransferRequest(request);
119
- const dispatcher = request.dispatcher ?? this.defaultDownloadDispatcher;
120
37
  const agent = request.agent ?? this.defaultDownloadAgent;
121
38
  this.logger?.debug('media download stream start', {
122
39
  urls: urls.length,
123
40
  timeoutMs
124
41
  });
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));
42
+ const result = await this.fetchWithFallback(urls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method: 'GET', headers, signal }, agent));
130
43
  this.logger?.trace('media download stream response', {
131
44
  url: result.url,
132
45
  status: result.status
@@ -151,7 +64,6 @@ class WaMediaTransferClient {
151
64
  ? String(request.contentLength)
152
65
  : undefined
153
66
  });
154
- const dispatcher = request.dispatcher ?? this.defaultUploadDispatcher;
155
67
  const agent = request.agent ?? this.defaultUploadAgent;
156
68
  const uploadUrls = bodyIsBytes ? urls : urls.slice(0, 1);
157
69
  if (!bodyIsBytes && urls.length > 1) {
@@ -165,23 +77,7 @@ class WaMediaTransferClient {
165
77
  timeoutMs,
166
78
  method
167
79
  });
168
- const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, async (url, signal) => {
169
- if (bodyIsBytes) {
170
- return this.transferRequest(url, {
171
- method,
172
- headers,
173
- signal,
174
- body: request.body
175
- }, dispatcher, agent);
176
- }
177
- return this.transferRequest(url, {
178
- method,
179
- headers,
180
- signal,
181
- body: request.body,
182
- duplex: 'half'
183
- }, dispatcher, agent);
184
- });
80
+ const result = await this.fetchWithFallback(uploadUrls, timeoutMs, request.signal, (url, signal) => this.httpRequest(url, { method, headers, signal, body: request.body }, agent));
185
81
  this.logger?.trace('media upload stream response', {
186
82
  url: result.url,
187
83
  status: result.status
@@ -201,7 +97,6 @@ class WaMediaTransferClient {
201
97
  directPath: request.directPath,
202
98
  hosts: request.hosts,
203
99
  headers: request.headers,
204
- dispatcher: request.dispatcher,
205
100
  agent: request.agent,
206
101
  timeoutMs: request.timeoutMs,
207
102
  signal: request.signal,
@@ -257,7 +152,8 @@ class WaMediaTransferClient {
257
152
  mediaType: request.mediaType,
258
153
  mediaKey: request.mediaKey,
259
154
  expectedFileSha256: request.fileSha256,
260
- expectedFileEncSha256: request.fileEncSha256
155
+ expectedFileEncSha256: request.fileEncSha256,
156
+ skipMacVerification: this.skipMacVerification
261
157
  });
262
158
  decrypted.metadata.catch(() => undefined);
263
159
  this.logger?.debug('media encrypted download stream ready', {
@@ -274,119 +170,50 @@ class WaMediaTransferClient {
274
170
  }
275
171
  return (0, bytes_1.readAllBytes)(response.body, { maxBytes: maxBytes ?? this.defaultMaxReadBytes });
276
172
  }
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 };
173
+ async httpRequest(url, init, agent) {
174
+ const parsed = new URL(url);
175
+ const transport = parsed.protocol === 'https:' ? node_https_1.default : node_http_1.default;
321
176
  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);
177
+ const req = transport.request(url, {
178
+ method: init.method ?? 'GET',
179
+ headers: init.headers,
180
+ signal: init.signal ?? undefined,
181
+ agent: agent ?? undefined
182
+ }, (res) => {
183
+ const status = res.statusCode ?? 500;
184
+ const headers = {};
185
+ for (const key in res.headers) {
186
+ const value = res.headers[key];
187
+ if (typeof value === 'string') {
188
+ headers[key] = value;
189
+ }
190
+ else if (Array.isArray(value)) {
191
+ headers[key] = value.join(', ');
192
+ }
378
193
  }
194
+ resolve({
195
+ status,
196
+ ok: status >= 200 && status < 300,
197
+ headers,
198
+ body: res,
199
+ cancel: async () => {
200
+ res.destroy();
201
+ }
202
+ });
203
+ });
204
+ req.on('error', (error) => reject((0, primitives_1.toError)(error)));
205
+ const body = init.body;
206
+ if (body instanceof Uint8Array) {
207
+ req.end(body);
379
208
  }
380
- }
381
- return {
382
- status,
383
- ok: status >= 200 && status < 300,
384
- headers,
385
- body: stream,
386
- cancel: async () => {
387
- stream.destroy();
209
+ else if (body) {
210
+ body.on('error', (err) => req.destroy((0, primitives_1.toError)(err)));
211
+ body.pipe(req);
388
212
  }
389
- };
213
+ else {
214
+ req.end();
215
+ }
216
+ });
390
217
  }
391
218
  resolveTransferRequest(request, extraHeaders) {
392
219
  const headers = { ...this.defaultHeaders };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.MEDIA_UPLOAD_PATHS = exports.SIDECAR_HMAC_SIZE = exports.SIDECAR_CHUNK_SIZE = 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
4
  exports.DEFAULT_MEDIA_HOSTS = Object.freeze([
5
5
  'mmg.whatsapp.net',
6
6
  'mmg-fallback.whatsapp.net'
@@ -13,6 +13,8 @@ exports.ENC_KEY_END = 48;
13
13
  exports.MAC_KEY_START = 48;
14
14
  exports.MAC_KEY_END = 80;
15
15
  exports.HMAC_TRUNCATED_SIZE = 10;
16
+ exports.SIDECAR_CHUNK_SIZE = 65536;
17
+ exports.SIDECAR_HMAC_SIZE = 10;
16
18
  exports.MEDIA_UPLOAD_PATHS = Object.freeze({
17
19
  image: '/mms/image',
18
20
  video: '/mms/video',
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,8 +4,14 @@ exports.shouldUseAddonAdditionalData = shouldUseAddonAdditionalData;
4
4
  exports.buildAddonAdditionalData = buildAddonAdditionalData;
5
5
  exports.encryptAddonPayload = encryptAddonPayload;
6
6
  exports.decryptAddonPayload = decryptAddonPayload;
7
+ exports.identifyEncryptedAddon = identifyEncryptedAddon;
8
+ exports.decodeAddonPlaintext = decodeAddonPlaintext;
9
+ exports.resolveParentMessageSecret = resolveParentMessageSecret;
10
+ exports.resolvePollOptionNames = resolvePollOptionNames;
7
11
  const _crypto_1 = require("../crypto/index.js");
12
+ const content_1 = require("./content");
8
13
  const use_case_secret_1 = require("./use-case-secret");
14
+ const _proto_1 = require("../proto.js");
9
15
  const bytes_1 = require("../util/bytes");
10
16
  const WA_ADDON_ENCRYPTION_NONCE_BYTES = 12;
11
17
  function shouldUseAddonAdditionalData(modificationType) {
@@ -47,6 +53,131 @@ async function decryptAddonPayload(input) {
47
53
  const additionalData = resolveAddonAdditionalData(input);
48
54
  return (0, _crypto_1.aesGcmDecrypt)(key, iv, (0, bytes_1.toBytesView)(input.ciphertext), additionalData);
49
55
  }
56
+ function identifyEncryptedAddon(message) {
57
+ const msg = (0, content_1.unwrapMessage)(message);
58
+ if (msg.encReactionMessage) {
59
+ const { targetMessageKey, encPayload, encIv } = msg.encReactionMessage;
60
+ if (targetMessageKey && encPayload && encIv) {
61
+ return {
62
+ kind: 'reaction',
63
+ targetMessageKey,
64
+ encPayload: encPayload,
65
+ encIv: encIv,
66
+ modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_REACTION,
67
+ raw: message
68
+ };
69
+ }
70
+ }
71
+ if (msg.pollUpdateMessage) {
72
+ const { pollCreationMessageKey, vote } = msg.pollUpdateMessage;
73
+ if (pollCreationMessageKey && vote?.encPayload && vote.encIv) {
74
+ return {
75
+ kind: 'poll_vote',
76
+ targetMessageKey: pollCreationMessageKey,
77
+ encPayload: vote.encPayload,
78
+ encIv: vote.encIv,
79
+ modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.POLL_VOTE,
80
+ raw: message
81
+ };
82
+ }
83
+ }
84
+ if (msg.encEventResponseMessage) {
85
+ const { eventCreationMessageKey, encPayload, encIv } = msg.encEventResponseMessage;
86
+ if (eventCreationMessageKey && encPayload && encIv) {
87
+ return {
88
+ kind: 'event_response',
89
+ targetMessageKey: eventCreationMessageKey,
90
+ encPayload: encPayload,
91
+ encIv: encIv,
92
+ modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.EVENT_RESPONSE,
93
+ raw: message
94
+ };
95
+ }
96
+ }
97
+ if (msg.encCommentMessage) {
98
+ const { targetMessageKey, encPayload, encIv } = msg.encCommentMessage;
99
+ if (targetMessageKey && encPayload && encIv) {
100
+ return {
101
+ kind: 'comment',
102
+ targetMessageKey,
103
+ encPayload: encPayload,
104
+ encIv: encIv,
105
+ modificationType: use_case_secret_1.WA_USE_CASE_SECRET_MODIFICATION_TYPES.ENC_COMMENT,
106
+ raw: message
107
+ };
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ function decodeAddonPlaintext(kind, plaintext) {
113
+ switch (kind) {
114
+ case 'reaction':
115
+ return { kind, reaction: _proto_1.proto.Message.ReactionMessage.decode(plaintext) };
116
+ case 'poll_vote':
117
+ return {
118
+ kind,
119
+ pollVote: _proto_1.proto.Message.PollVoteMessage.decode(plaintext),
120
+ selectedOptionNames: null
121
+ };
122
+ case 'event_response':
123
+ return { kind, eventResponse: _proto_1.proto.Message.EventResponseMessage.decode(plaintext) };
124
+ case 'comment':
125
+ return { kind, comment: _proto_1.proto.Message.CommentMessage.decode(plaintext) };
126
+ }
127
+ }
128
+ async function resolveParentMessageSecret(targetMessageId, messageSecretStore, messageStore) {
129
+ const cached = await messageSecretStore.get(targetMessageId);
130
+ if (cached)
131
+ return cached;
132
+ const record = await messageStore.getById(targetMessageId);
133
+ if (!record?.messageBytes)
134
+ return null;
135
+ try {
136
+ const decoded = _proto_1.proto.Message.decode(record.messageBytes);
137
+ const secret = decoded.messageContextInfo?.messageSecret;
138
+ if (!secret || secret.byteLength !== use_case_secret_1.WA_MESSAGE_SECRET_BYTES)
139
+ return null;
140
+ return { secret, senderJid: record.senderJid ?? '' };
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ async function resolvePollOptionNames(selectedOptions, pollCreationMessageId, messageStore) {
147
+ const record = await messageStore.getById(pollCreationMessageId);
148
+ if (!record?.messageBytes)
149
+ return null;
150
+ let decoded;
151
+ try {
152
+ decoded = _proto_1.proto.Message.decode(record.messageBytes);
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ const pollMsg = (0, content_1.unwrapMessage)(decoded);
158
+ const options = pollMsg.pollCreationMessage?.options ??
159
+ pollMsg.pollCreationMessageV2?.options ??
160
+ pollMsg.pollCreationMessageV3?.options ??
161
+ pollMsg.pollCreationMessageV5?.options;
162
+ if (!options || options.length === 0)
163
+ return null;
164
+ const hashToName = new Map();
165
+ for (const option of options) {
166
+ if (!option.optionName)
167
+ continue;
168
+ const hash = await (0, _crypto_1.sha256)(bytes_1.TEXT_ENCODER.encode(option.optionName));
169
+ hashToName.set((0, bytes_1.bytesToHex)(hash), option.optionName);
170
+ }
171
+ const names = [];
172
+ for (const selected of selectedOptions) {
173
+ const hex = (0, bytes_1.bytesToHex)(selected);
174
+ const name = hashToName.get(hex);
175
+ if (!name)
176
+ return null;
177
+ names.push(name);
178
+ }
179
+ return names;
180
+ }
50
181
  function assertAddonIv(iv) {
51
182
  const normalized = (0, bytes_1.toBytesView)(iv);
52
183
  if (normalized.byteLength !== WA_ADDON_ENCRYPTION_NONCE_BYTES) {
@@ -1,18 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isSendMediaMessage = isSendMediaMessage;
4
+ exports.unwrapMessage = unwrapMessage;
4
5
  exports.resolveMessageTypeAttr = resolveMessageTypeAttr;
6
+ exports.needsSecretPersistence = needsSecretPersistence;
5
7
  exports.resolveEditAttr = resolveEditAttr;
6
8
  exports.resolveEncMediaType = resolveEncMediaType;
7
9
  exports.resolveMetaAttrs = resolveMetaAttrs;
8
10
  const _proto_1 = require("../proto.js");
9
11
  const constants_1 = require("../protocol/constants");
10
12
  function isSendMediaMessage(content) {
11
- return (!!content &&
12
- typeof content === 'object' &&
13
- 'type' in content &&
14
- 'media' in content &&
15
- 'mimetype' in content);
13
+ return !!content && typeof content === 'object' && 'type' in content && 'media' in content;
16
14
  }
17
15
  function unwrapMessage(message) {
18
16
  let msg = message;
@@ -77,6 +75,16 @@ function resolveMessageTypeAttr(message) {
77
75
  return constants_1.WA_STANZA_MSG_TYPES.MEDIA;
78
76
  }
79
77
  const REVOKED_REACTION_TEXT = '';
78
+ function needsSecretPersistence(message) {
79
+ const msg = unwrapMessage(message);
80
+ return !!(msg.pollCreationMessage ||
81
+ msg.pollCreationMessageV2 ||
82
+ msg.pollCreationMessageV3 ||
83
+ msg.pollCreationMessageV4 ||
84
+ msg.pollCreationMessageV5 ||
85
+ msg.pollCreationMessageV6 ||
86
+ msg.eventMessage);
87
+ }
80
88
  function resolveEditAttr(message, subtype) {
81
89
  const msg = unwrapMessage(message);
82
90
  if (msg.protocolMessage) {
@@ -6,13 +6,13 @@ exports.injectDeviceListMetadata = injectDeviceListMetadata;
6
6
  const _crypto_1 = require("../crypto/index.js");
7
7
  const jid_1 = require("../protocol/jid");
8
8
  const bytes_1 = require("../util/bytes");
9
- const ICDC_HASH_LENGTH = 8;
9
+ const ICDC_DEFAULT_HASH_LENGTH = 8;
10
10
  const ICDC_FRESHNESS_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
11
11
  const DEVICE_LIST_METADATA_VERSION = 2;
12
- const EMPTY_KEY_HASH = new Uint8Array(ICDC_HASH_LENGTH);
13
- async function computeDeviceKeyHash(identityKeys) {
12
+ async function computeDeviceKeyHash(identityKeys, hashLength) {
13
+ const length = hashLength ?? ICDC_DEFAULT_HASH_LENGTH;
14
14
  if (identityKeys.length === 0) {
15
- return EMPTY_KEY_HASH;
15
+ return new Uint8Array(length);
16
16
  }
17
17
  const rawKeys = new Array(identityKeys.length);
18
18
  for (let i = 0; i < identityKeys.length; i += 1) {
@@ -21,9 +21,9 @@ async function computeDeviceKeyHash(identityKeys) {
21
21
  }
22
22
  const combined = (0, bytes_1.concatBytes)(rawKeys);
23
23
  const hash = await (0, _crypto_1.sha256)(combined);
24
- return hash.subarray(0, ICDC_HASH_LENGTH);
24
+ return hash.subarray(0, length);
25
25
  }
26
- async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdentity) {
26
+ async function resolveIcdcMeta(deviceJids, identityStore, updatedAtMs, localIdentity, hashLength) {
27
27
  if (deviceJids.length === 0) {
28
28
  return null;
29
29
  }
@@ -31,7 +31,7 @@ async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdenti
31
31
  for (let i = 0; i < deviceJids.length; i += 1) {
32
32
  addresses[i] = (0, jid_1.parseSignalAddressFromJid)(deviceJids[i]);
33
33
  }
34
- const remoteKeys = await signalStore.getRemoteIdentities(addresses);
34
+ const remoteKeys = await identityStore.getRemoteIdentities(addresses);
35
35
  const keys = [];
36
36
  for (let i = 0; i < addresses.length; i += 1) {
37
37
  const key = remoteKeys[i];
@@ -47,7 +47,7 @@ async function resolveIcdcMeta(deviceJids, signalStore, updatedAtMs, localIdenti
47
47
  if (keys.length === 0) {
48
48
  return null;
49
49
  }
50
- const keyHash = await computeDeviceKeyHash(keys);
50
+ const keyHash = await computeDeviceKeyHash(keys, hashLength);
51
51
  const timestamp = updatedAtMs !== undefined && Date.now() - updatedAtMs < ICDC_FRESHNESS_THRESHOLD_MS
52
52
  ? Math.floor(updatedAtMs / 1000)
53
53
  : undefined;
@@ -51,14 +51,6 @@ function buildIncomingEventRawNode(node) {
51
51
  content: children
52
52
  };
53
53
  }
54
- function buildBaseIncomingEvent(node) {
55
- return {
56
- rawNode: buildIncomingEventRawNode(node),
57
- stanzaId: node.attrs.id,
58
- chatJid: node.attrs.from,
59
- stanzaType: node.attrs.type
60
- };
61
- }
62
54
  function pickSenderKeyDistributionPayload(message) {
63
55
  const direct = pickDirectSenderKeyDistributionPayload(message);
64
56
  if (direct) {
@@ -184,7 +176,10 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
184
176
  if (shouldEmitIncomingMessage(message)) {
185
177
  const chatJid = node.attrs.from;
186
178
  options.emitIncomingMessage?.({
187
- ...buildBaseIncomingEvent(node),
179
+ rawNode: buildIncomingEventRawNode(node),
180
+ stanzaId: node.attrs.id,
181
+ chatJid,
182
+ stanzaType: node.attrs.type,
188
183
  timestampSeconds: (0, primitives_1.parseOptionalInt)(node.attrs.t),
189
184
  senderJid,
190
185
  encryptionType: encType,
@@ -205,7 +200,10 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
205
200
  message: (0, primitives_1.toError)(error).message
206
201
  });
207
202
  options.emitUnhandledStanza?.({
208
- ...buildBaseIncomingEvent(node),
203
+ rawNode: buildIncomingEventRawNode(node),
204
+ stanzaId: node.attrs.id,
205
+ chatJid: node.attrs.from,
206
+ stanzaType: node.attrs.type,
209
207
  reason: `message.decrypt_failed.${encType}`
210
208
  });
211
209
  return { success: false, encType, error };
@@ -236,7 +234,10 @@ async function handleIncomingMessageAck(node, options) {
236
234
  case 'skmsg': {
237
235
  if (!senderJid || !node.attrs.from || !options.senderKeyManager) {
238
236
  options.emitUnhandledStanza?.({
239
- ...buildBaseIncomingEvent(node),
237
+ rawNode: buildIncomingEventRawNode(node),
238
+ stanzaId: node.attrs.id,
239
+ chatJid: node.attrs.from,
240
+ stanzaType: node.attrs.type,
240
241
  reason: 'message.skmsg.missing_group_context'
241
242
  });
242
243
  continue;
@@ -278,7 +279,8 @@ async function handleIncomingMessageAck(node, options) {
278
279
  });
279
280
  }
280
281
  if (encCount > 0 && !hasSuccessfulDecrypt && firstDecryptFailure) {
281
- shouldSendStandardReceipt = !(await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType));
282
+ await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType);
283
+ shouldSendStandardReceipt = false;
282
284
  }
283
285
  }
284
286
  const id = node.attrs.id;