zapo-js 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,20 +1,212 @@
1
+ import { proto } from '../proto.js';
2
+ import { WA_EDIT_ATTRS, WA_ENC_MEDIA_TYPES, WA_EVENT_META_TYPES, WA_POLL_META_TYPES, WA_STANZA_MSG_TYPES } from '../protocol/constants.js';
1
3
  export function isSendMediaMessage(content) {
2
- return (!!content &&
3
- typeof content === 'object' &&
4
- 'type' in content &&
5
- 'media' in content &&
6
- 'mimetype' in content);
4
+ return !!content && typeof content === 'object' && 'type' in content && 'media' in content;
5
+ }
6
+ export function unwrapMessage(message) {
7
+ let msg = message;
8
+ for (;;) {
9
+ const inner = msg.ephemeralMessage?.message ??
10
+ msg.groupMentionedMessage?.message ??
11
+ msg.botInvokeMessage?.message ??
12
+ msg.deviceSentMessage?.message ??
13
+ msg.viewOnceMessage?.message ??
14
+ msg.viewOnceMessageV2?.message ??
15
+ msg.documentWithCaptionMessage?.message;
16
+ if (!inner)
17
+ return msg;
18
+ msg = inner;
19
+ }
7
20
  }
8
21
  export function resolveMessageTypeAttr(message) {
9
- if (message.reactionMessage) {
10
- return 'reaction';
22
+ const msg = unwrapMessage(message);
23
+ if (msg.reactionMessage || msg.encReactionMessage) {
24
+ return WA_STANZA_MSG_TYPES.REACTION;
25
+ }
26
+ if (msg.eventMessage ||
27
+ msg.encEventResponseMessage ||
28
+ msg.secretEncryptedMessage?.secretEncType ===
29
+ proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
30
+ return WA_STANZA_MSG_TYPES.EVENT;
31
+ }
32
+ if (msg.pollCreationMessage ||
33
+ msg.pollCreationMessageV2 ||
34
+ msg.pollCreationMessageV3 ||
35
+ msg.pollCreationMessageV5 ||
36
+ msg.pollUpdateMessage ||
37
+ msg.secretEncryptedMessage?.secretEncType ===
38
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT ||
39
+ msg.secretEncryptedMessage?.secretEncType ===
40
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
41
+ return WA_STANZA_MSG_TYPES.POLL;
42
+ }
43
+ if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
44
+ return WA_STANZA_MSG_TYPES.MEDIA;
45
+ }
46
+ if ((msg.conversation !== undefined && msg.conversation !== null) ||
47
+ (msg.extendedTextMessage && !msg.extendedTextMessage.matchedText) ||
48
+ msg.protocolMessage ||
49
+ msg.interactiveMessage ||
50
+ msg.keepInChatMessage ||
51
+ msg.requestPhoneNumberMessage ||
52
+ msg.editedMessage ||
53
+ msg.pinInChatMessage ||
54
+ msg.encCommentMessage ||
55
+ msg.newsletterAdminInviteMessage ||
56
+ msg.pollResultSnapshotMessage ||
57
+ msg.pollResultSnapshotMessageV3 ||
58
+ msg.templateButtonReplyMessage ||
59
+ msg.messageHistoryNotice ||
60
+ msg.secretEncryptedMessage?.secretEncType ===
61
+ proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT ||
62
+ msg.secretEncryptedMessage?.secretEncType ===
63
+ proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_SCHEDULE) {
64
+ return WA_STANZA_MSG_TYPES.TEXT;
65
+ }
66
+ return WA_STANZA_MSG_TYPES.MEDIA;
67
+ }
68
+ const REVOKED_REACTION_TEXT = '';
69
+ export function needsSecretPersistence(message) {
70
+ const msg = unwrapMessage(message);
71
+ return !!(msg.pollCreationMessage ||
72
+ msg.pollCreationMessageV2 ||
73
+ msg.pollCreationMessageV3 ||
74
+ msg.pollCreationMessageV4 ||
75
+ msg.pollCreationMessageV5 ||
76
+ msg.pollCreationMessageV6 ||
77
+ msg.eventMessage);
78
+ }
79
+ export function resolveEditAttr(message, subtype) {
80
+ const msg = unwrapMessage(message);
81
+ if (msg.protocolMessage) {
82
+ const protocolType = msg.protocolMessage.type;
83
+ if (protocolType === proto.Message.ProtocolMessage.Type.REVOKE) {
84
+ return subtype === 'admin_revoke'
85
+ ? WA_EDIT_ATTRS.ADMIN_REVOKE
86
+ : WA_EDIT_ATTRS.SENDER_REVOKE;
87
+ }
88
+ if (protocolType === proto.Message.ProtocolMessage.Type.MESSAGE_EDIT) {
89
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
90
+ }
91
+ return null;
92
+ }
93
+ if (msg.secretEncryptedMessage) {
94
+ const encType = msg.secretEncryptedMessage.secretEncType;
95
+ if (encType === proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT ||
96
+ encType === proto.Message.SecretEncryptedMessage.SecretEncType.MESSAGE_EDIT) {
97
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
98
+ }
99
+ }
100
+ if (msg.editedMessage) {
101
+ return WA_EDIT_ATTRS.MESSAGE_EDIT;
102
+ }
103
+ if (msg.reactionMessage) {
104
+ if (msg.reactionMessage.text === REVOKED_REACTION_TEXT) {
105
+ return WA_EDIT_ATTRS.SENDER_REVOKE;
106
+ }
107
+ return null;
108
+ }
109
+ if (msg.keepInChatMessage) {
110
+ if (msg.keepInChatMessage.key?.fromMe === true &&
111
+ msg.keepInChatMessage.keepType === proto.KeepType.UNDO_KEEP_FOR_ALL) {
112
+ return WA_EDIT_ATTRS.SENDER_REVOKE;
113
+ }
114
+ return null;
115
+ }
116
+ if (msg.pinInChatMessage) {
117
+ return WA_EDIT_ATTRS.PIN_IN_CHAT;
118
+ }
119
+ return null;
120
+ }
121
+ export function resolveEncMediaType(message) {
122
+ const msg = unwrapMessage(message);
123
+ if (msg.imageMessage)
124
+ return WA_ENC_MEDIA_TYPES.IMAGE;
125
+ if (msg.stickerMessage)
126
+ return WA_ENC_MEDIA_TYPES.STICKER;
127
+ if (msg.locationMessage) {
128
+ return msg.locationMessage.isLive
129
+ ? WA_ENC_MEDIA_TYPES.LIVE_LOCATION
130
+ : WA_ENC_MEDIA_TYPES.LOCATION;
131
+ }
132
+ if (msg.contactMessage)
133
+ return WA_ENC_MEDIA_TYPES.VCARD;
134
+ if (msg.contactsArrayMessage)
135
+ return WA_ENC_MEDIA_TYPES.CONTACT_ARRAY;
136
+ if (msg.documentMessage)
137
+ return WA_ENC_MEDIA_TYPES.DOCUMENT;
138
+ if (msg.audioMessage) {
139
+ return msg.audioMessage.ptt ? WA_ENC_MEDIA_TYPES.PTT : WA_ENC_MEDIA_TYPES.AUDIO;
140
+ }
141
+ if (msg.videoMessage) {
142
+ return msg.videoMessage.gifPlayback ? WA_ENC_MEDIA_TYPES.GIF : WA_ENC_MEDIA_TYPES.VIDEO;
143
+ }
144
+ if (msg.ptvMessage)
145
+ return WA_ENC_MEDIA_TYPES.PTV;
146
+ if (msg.buttonsMessage)
147
+ return WA_ENC_MEDIA_TYPES.BUTTON;
148
+ if (msg.buttonsResponseMessage)
149
+ return WA_ENC_MEDIA_TYPES.BUTTON_RESPONSE;
150
+ if (msg.listMessage)
151
+ return WA_ENC_MEDIA_TYPES.LIST;
152
+ if (msg.listResponseMessage)
153
+ return WA_ENC_MEDIA_TYPES.LIST_RESPONSE;
154
+ if (msg.orderMessage)
155
+ return WA_ENC_MEDIA_TYPES.ORDER;
156
+ if (msg.productMessage)
157
+ return WA_ENC_MEDIA_TYPES.PRODUCT;
158
+ if (msg.groupInviteMessage)
159
+ return WA_ENC_MEDIA_TYPES.URL;
160
+ if (msg.interactiveResponseMessage)
161
+ return WA_ENC_MEDIA_TYPES.NATIVE_FLOW_RESPONSE;
162
+ if (msg.messageHistoryBundle)
163
+ return WA_ENC_MEDIA_TYPES.GROUP_HISTORY;
164
+ if (msg.extendedTextMessage?.matchedText && msg.extendedTextMessage.matchedText.trim() !== '') {
165
+ return WA_ENC_MEDIA_TYPES.URL;
166
+ }
167
+ return null;
168
+ }
169
+ export function resolveMetaAttrs(message) {
170
+ const msg = unwrapMessage(message);
171
+ let polltype;
172
+ let eventType;
173
+ let viewOnce;
174
+ if (msg.pollCreationMessage || msg.pollCreationMessageV2 || msg.pollCreationMessageV3) {
175
+ polltype = WA_POLL_META_TYPES.CREATION;
176
+ }
177
+ else if (msg.pollUpdateMessage) {
178
+ polltype = WA_POLL_META_TYPES.VOTE;
179
+ }
180
+ else if (msg.secretEncryptedMessage?.secretEncType ===
181
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_EDIT) {
182
+ polltype = WA_POLL_META_TYPES.EDIT;
183
+ }
184
+ else if (msg.secretEncryptedMessage?.secretEncType ===
185
+ proto.Message.SecretEncryptedMessage.SecretEncType.POLL_ADD_OPTION) {
186
+ polltype = WA_POLL_META_TYPES.EDIT;
187
+ }
188
+ if (msg.eventMessage) {
189
+ eventType = WA_EVENT_META_TYPES.CREATION;
190
+ }
191
+ else if (msg.encEventResponseMessage) {
192
+ eventType = WA_EVENT_META_TYPES.RESPONSE;
193
+ }
194
+ else if (msg.secretEncryptedMessage?.secretEncType ===
195
+ proto.Message.SecretEncryptedMessage.SecretEncType.EVENT_EDIT) {
196
+ eventType = WA_EVENT_META_TYPES.EDIT;
197
+ }
198
+ if (message.viewOnceMessage || message.viewOnceMessageV2) {
199
+ viewOnce = 'true';
11
200
  }
12
- if (message.imageMessage ||
13
- message.videoMessage ||
14
- message.audioMessage ||
15
- message.documentMessage ||
16
- message.stickerMessage) {
17
- return 'media';
201
+ if (!polltype && !eventType && !viewOnce) {
202
+ return null;
18
203
  }
19
- return 'text';
204
+ const attrs = {};
205
+ if (polltype)
206
+ attrs.polltype = polltype;
207
+ if (eventType)
208
+ attrs.event_type = eventType;
209
+ if (viewOnce)
210
+ attrs.view_once = viewOnce;
211
+ return attrs;
20
212
  }
@@ -0,0 +1,76 @@
1
+ import { sha256, toRawPubKey } from '../crypto/index.js';
2
+ import { parseSignalAddressFromJid } from '../protocol/jid.js';
3
+ import { concatBytes } from '../util/bytes.js';
4
+ const ICDC_DEFAULT_HASH_LENGTH = 8;
5
+ const ICDC_FRESHNESS_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
6
+ const DEVICE_LIST_METADATA_VERSION = 2;
7
+ export async function computeDeviceKeyHash(identityKeys, hashLength) {
8
+ const length = hashLength ?? ICDC_DEFAULT_HASH_LENGTH;
9
+ if (identityKeys.length === 0) {
10
+ return new Uint8Array(length);
11
+ }
12
+ const rawKeys = new Array(identityKeys.length);
13
+ for (let i = 0; i < identityKeys.length; i += 1) {
14
+ rawKeys[i] =
15
+ identityKeys[i].byteLength === 33 ? toRawPubKey(identityKeys[i]) : identityKeys[i];
16
+ }
17
+ const combined = concatBytes(rawKeys);
18
+ const hash = await sha256(combined);
19
+ return hash.subarray(0, length);
20
+ }
21
+ export async function resolveIcdcMeta(deviceJids, identityStore, updatedAtMs, localIdentity, hashLength) {
22
+ if (deviceJids.length === 0) {
23
+ return null;
24
+ }
25
+ const addresses = new Array(deviceJids.length);
26
+ for (let i = 0; i < deviceJids.length; i += 1) {
27
+ addresses[i] = parseSignalAddressFromJid(deviceJids[i]);
28
+ }
29
+ const remoteKeys = await identityStore.getRemoteIdentities(addresses);
30
+ const keys = [];
31
+ for (let i = 0; i < addresses.length; i += 1) {
32
+ const key = remoteKeys[i];
33
+ if (key) {
34
+ keys.push(key);
35
+ }
36
+ else if (localIdentity &&
37
+ addresses[i].user === localIdentity.address.user &&
38
+ addresses[i].device === localIdentity.address.device) {
39
+ keys.push(localIdentity.pubKey);
40
+ }
41
+ }
42
+ if (keys.length === 0) {
43
+ return null;
44
+ }
45
+ const keyHash = await computeDeviceKeyHash(keys, hashLength);
46
+ const timestamp = updatedAtMs !== undefined && Date.now() - updatedAtMs < ICDC_FRESHNESS_THRESHOLD_MS
47
+ ? Math.floor(updatedAtMs / 1000)
48
+ : undefined;
49
+ return { keyHash, timestamp };
50
+ }
51
+ export function injectDeviceListMetadata(message, senderIcdc, recipientIcdc) {
52
+ if (!senderIcdc && !recipientIcdc) {
53
+ return message;
54
+ }
55
+ const deviceListMetadata = {};
56
+ if (senderIcdc) {
57
+ deviceListMetadata.senderKeyHash = senderIcdc.keyHash;
58
+ if (senderIcdc.timestamp !== undefined) {
59
+ deviceListMetadata.senderTimestamp = senderIcdc.timestamp;
60
+ }
61
+ }
62
+ if (recipientIcdc) {
63
+ deviceListMetadata.recipientKeyHash = recipientIcdc.keyHash;
64
+ if (recipientIcdc.timestamp !== undefined) {
65
+ deviceListMetadata.recipientTimestamp = recipientIcdc.timestamp;
66
+ }
67
+ }
68
+ return {
69
+ ...message,
70
+ messageContextInfo: {
71
+ ...message.messageContextInfo,
72
+ deviceListMetadata,
73
+ deviceListMetadataVersion: DEVICE_LIST_METADATA_VERSION
74
+ }
75
+ };
76
+ }
@@ -3,12 +3,9 @@ import { unpadPkcs7 } from './padding.js';
3
3
  import { proto } from '../proto.js';
4
4
  import { WA_MESSAGE_TAGS, WA_MESSAGE_TYPES } from '../protocol/constants.js';
5
5
  import { isBroadcastJid, isGroupJid, parseSignalAddressFromJid } from '../protocol/jid.js';
6
- import { buildInboundDeliveryReceiptNode, buildInboundMessageAckNode, buildInboundRetryReceiptNode } from '../transport/node/builders/message.js';
6
+ import { buildAckNode, buildReceiptNode } from '../transport/node/builders/global.js';
7
7
  import { decodeNodeContentBase64OrBytes, findNodeChild } from '../transport/node/helpers.js';
8
8
  import { parseOptionalInt, toError } from '../util/primitives.js';
9
- function parseMessageTimestamp(value) {
10
- return parseOptionalInt(value);
11
- }
12
9
  function pickNextRetryCount(node) {
13
10
  const retryNode = findNodeChild(node, 'retry');
14
11
  const parsed = parseOptionalInt(retryNode?.attrs.count);
@@ -51,14 +48,6 @@ function buildIncomingEventRawNode(node) {
51
48
  content: children
52
49
  };
53
50
  }
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
51
  function pickSenderKeyDistributionPayload(message) {
63
52
  const direct = pickDirectSenderKeyDistributionPayload(message);
64
53
  if (direct) {
@@ -125,7 +114,13 @@ async function sendRetryReceiptForDecryptFailure(node, options, error, encType)
125
114
  if (options.onDecryptFailure) {
126
115
  return options.onDecryptFailure(retryContext, error);
127
116
  }
128
- const retryReceiptNode = buildInboundRetryReceiptNode(node, stanzaId, from, options.getMeJid?.(), pickNextRetryCount(node));
117
+ const retryReceiptNode = buildReceiptNode({
118
+ kind: 'retry',
119
+ node,
120
+ id: stanzaId,
121
+ to: from,
122
+ retryCount: pickNextRetryCount(node)
123
+ });
129
124
  try {
130
125
  await options.sendNode(retryReceiptNode);
131
126
  options.logger.debug('sent retry receipt for undecryptable incoming message', {
@@ -152,7 +147,8 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
152
147
  const senderAddress = parseSignalAddressFromJid(senderJid);
153
148
  const decryptedPayload = await decrypt(decodeNodeContentBase64OrBytes(encNode.content, 'message.enc'), senderAddress);
154
149
  const unpaddedPlaintext = unpadPkcs7(decryptedPayload);
155
- const message = normalizeIncomingDecryptedMessage(proto.Message.decode(unpaddedPlaintext));
150
+ const decodedMessage = proto.Message.decode(unpaddedPlaintext);
151
+ const message = unwrapDeviceSentMessage(decodedMessage) ?? decodedMessage;
156
152
  const senderKeyDistribution = pickSenderKeyDistributionPayload(message);
157
153
  if (senderKeyDistribution && options.senderKeyManager) {
158
154
  try {
@@ -177,8 +173,11 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
177
173
  if (shouldEmitIncomingMessage(message)) {
178
174
  const chatJid = node.attrs.from;
179
175
  options.emitIncomingMessage?.({
180
- ...buildBaseIncomingEvent(node),
181
- timestampSeconds: parseMessageTimestamp(node.attrs.t),
176
+ rawNode: buildIncomingEventRawNode(node),
177
+ stanzaId: node.attrs.id,
178
+ chatJid,
179
+ stanzaType: node.attrs.type,
180
+ timestampSeconds: parseOptionalInt(node.attrs.t),
182
181
  senderJid,
183
182
  encryptionType: encType,
184
183
  isGroupChat: chatJid ? isGroupJid(chatJid) : false,
@@ -198,7 +197,10 @@ async function decryptAndProcessEncNode(node, encNode, encType, senderJid, optio
198
197
  message: toError(error).message
199
198
  });
200
199
  options.emitUnhandledStanza?.({
201
- ...buildBaseIncomingEvent(node),
200
+ rawNode: buildIncomingEventRawNode(node),
201
+ stanzaId: node.attrs.id,
202
+ chatJid: node.attrs.from,
203
+ stanzaType: node.attrs.type,
202
204
  reason: `message.decrypt_failed.${encType}`
203
205
  });
204
206
  return { success: false, encType, error };
@@ -229,7 +231,10 @@ export async function handleIncomingMessageAck(node, options) {
229
231
  case 'skmsg': {
230
232
  if (!senderJid || !node.attrs.from || !options.senderKeyManager) {
231
233
  options.emitUnhandledStanza?.({
232
- ...buildBaseIncomingEvent(node),
234
+ rawNode: buildIncomingEventRawNode(node),
235
+ stanzaId: node.attrs.id,
236
+ chatJid: node.attrs.from,
237
+ stanzaType: node.attrs.type,
233
238
  reason: 'message.skmsg.missing_group_context'
234
239
  });
235
240
  continue;
@@ -271,7 +276,8 @@ export async function handleIncomingMessageAck(node, options) {
271
276
  });
272
277
  }
273
278
  if (encCount > 0 && !hasSuccessfulDecrypt && firstDecryptFailure) {
274
- shouldSendStandardReceipt = !(await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType));
279
+ await sendRetryReceiptForDecryptFailure(node, options, firstDecryptFailure.error, firstDecryptFailure.encType);
280
+ shouldSendStandardReceipt = false;
275
281
  }
276
282
  }
277
283
  const id = node.attrs.id;
@@ -285,7 +291,13 @@ export async function handleIncomingMessageAck(node, options) {
285
291
  return true;
286
292
  }
287
293
  if (node.attrs.type === WA_MESSAGE_TYPES.MEDIA_NOTIFY) {
288
- const ackNode = buildInboundMessageAckNode(node, id, from, options.getMeJid?.());
294
+ const ackNode = buildAckNode({
295
+ kind: 'message',
296
+ node,
297
+ id,
298
+ to: from,
299
+ from: options.getMeJid?.()
300
+ });
289
301
  options.logger.debug('sending inbound message ack', {
290
302
  id,
291
303
  to: from,
@@ -298,7 +310,12 @@ export async function handleIncomingMessageAck(node, options) {
298
310
  if (!shouldSendStandardReceipt) {
299
311
  return true;
300
312
  }
301
- const receiptNode = buildInboundDeliveryReceiptNode(node, id, from);
313
+ const receiptNode = buildReceiptNode({
314
+ kind: 'delivery',
315
+ node,
316
+ id,
317
+ to: from
318
+ });
302
319
  options.logger.debug('sending inbound message receipt', {
303
320
  id,
304
321
  to: from,
@@ -308,6 +325,3 @@ export async function handleIncomingMessageAck(node, options) {
308
325
  await options.sendNode(receiptNode);
309
326
  return true;
310
327
  }
311
- function normalizeIncomingDecryptedMessage(message) {
312
- return unwrapDeviceSentMessage(message) ?? message;
313
- }
@@ -1,25 +1,47 @@
1
1
  import { sha256 } from '../crypto/core/index.js';
2
- import { splitJid } from '../protocol/jid.js';
3
2
  import { bytesToBase64, TEXT_ENCODER } from '../util/bytes.js';
4
3
  export async function computePhashV2(participants) {
5
4
  if (participants.length === 0) {
6
5
  return '2:';
7
6
  }
8
- const canonical = participants.map((participant) => toPhashCanonicalWid(participant));
7
+ const canonical = new Array(participants.length);
8
+ for (let i = 0; i < participants.length; i += 1)
9
+ canonical[i] = toPhashCanonicalWid(participants[i]);
9
10
  const joined = canonical.sort().join('');
10
11
  const digest = await sha256(TEXT_ENCODER.encode(joined));
11
12
  return `2:${bytesToBase64(digest.subarray(0, 6))}`;
12
13
  }
13
14
  function toPhashCanonicalWid(jid) {
14
- const { user, server } = splitJid(jid);
15
- const normalizedServer = server === 'c.us' ? 's.whatsapp.net' : server;
16
- const colonIndex = user.indexOf(':');
17
- const userWithOptionalAgent = colonIndex >= 0 ? user.slice(0, colonIndex) : user;
18
- const baseUser = userWithOptionalAgent.endsWith('.0')
19
- ? userWithOptionalAgent.slice(0, userWithOptionalAgent.length - 2)
20
- : userWithOptionalAgent;
21
- const deviceRaw = colonIndex >= 0 ? user.slice(colonIndex + 1) : '0';
22
- const device = Number.parseInt(deviceRaw, 10);
23
- const normalizedDevice = Number.isSafeInteger(device) && device >= 0 ? device : 0;
24
- return `${baseUser}.0:${normalizedDevice}@${normalizedServer}`;
15
+ const atIndex = jid.indexOf('@');
16
+ if (atIndex < 1 || atIndex >= jid.length - 1)
17
+ return jid;
18
+ const colonIndex = jid.indexOf(':', 0);
19
+ const userEnd = colonIndex >= 0 && colonIndex < atIndex ? colonIndex : atIndex;
20
+ const hasZeroAgent = userEnd >= 2 && jid.charCodeAt(userEnd - 2) === 46 && jid.charCodeAt(userEnd - 1) === 48;
21
+ const baseUserEnd = hasZeroAgent ? userEnd - 2 : userEnd;
22
+ const baseUser = jid.slice(0, baseUserEnd);
23
+ let device = 0;
24
+ if (colonIndex >= 0 && colonIndex < atIndex) {
25
+ for (let i = colonIndex + 1; i < atIndex; i += 1) {
26
+ const digit = jid.charCodeAt(i) - 48;
27
+ if (digit < 0 || digit > 9) {
28
+ device = 0;
29
+ break;
30
+ }
31
+ device = device * 10 + digit;
32
+ if (device > Number.MAX_SAFE_INTEGER) {
33
+ device = 0;
34
+ break;
35
+ }
36
+ }
37
+ }
38
+ const serverStart = atIndex + 1;
39
+ const serverLen = jid.length - serverStart;
40
+ const isCUs = serverLen === 4 &&
41
+ jid.charCodeAt(serverStart) === 99 &&
42
+ jid.charCodeAt(serverStart + 1) === 46 &&
43
+ jid.charCodeAt(serverStart + 2) === 117 &&
44
+ jid.charCodeAt(serverStart + 3) === 115;
45
+ const normalizedServer = isCUs ? 's.whatsapp.net' : jid.slice(serverStart);
46
+ return `${baseUser}.0:${device}@${normalizedServer}`;
25
47
  }
@@ -1,6 +1,6 @@
1
1
  import { hkdf, hmacSign, importHmacKey } from '../crypto/index.js';
2
2
  import { proto } from '../proto.js';
3
- import { base64ToBytesChecked, concatBytes, EMPTY_BYTES, TEXT_ENCODER, toBytesView } from '../util/bytes.js';
3
+ import { base64ToBytesChecked, concatBytes, EMPTY_BYTES, TEXT_ENCODER } from '../util/bytes.js';
4
4
  const WA_REPORTING_TOKEN_BYTES = 16;
5
5
  const WA_REPORTING_TOKEN_KEY_BYTES = 32;
6
6
  const WA_REPORTING_TOKEN_USE_CASE = 'Report Token';
@@ -9,30 +9,21 @@ const WA_REPORTING_TOKEN_CONFIG_BYTES = base64ToBytesChecked(WA_REPORTING_TOKEN_
9
9
  export const WA_REPORTING_TOKEN_VERSION = 2;
10
10
  let reportingTokenConfigSpec = null;
11
11
  const reportingTokenConfigCache = new Map();
12
- export async function buildReportingTokenNode(input) {
13
- const artifacts = await buildReportingTokenArtifacts(input);
14
- return artifacts?.node ?? null;
15
- }
16
12
  export async function buildReportingTokenArtifacts(input) {
17
13
  const stanzaId = input.stanzaId.trim();
18
14
  if (!stanzaId || !isMessageReportingTokenCompatible(input.message)) {
19
15
  return null;
20
16
  }
21
17
  const messageSecret = input.message.messageContextInfo?.messageSecret;
22
- if (!messageSecret || toBytesView(messageSecret).byteLength === 0) {
18
+ if (!messageSecret || messageSecret.byteLength === 0) {
23
19
  return null;
24
20
  }
25
21
  const reportingTokenContent = computeReportingTokenContent(proto.Message.encode(input.message).finish(), input.version ?? WA_REPORTING_TOKEN_VERSION);
26
22
  if (reportingTokenContent.byteLength === 0) {
27
23
  return null;
28
24
  }
29
- const secretInfo = concatBytes([
30
- TEXT_ENCODER.encode(stanzaId),
31
- TEXT_ENCODER.encode(input.senderUserJid),
32
- TEXT_ENCODER.encode(input.remoteJid),
33
- TEXT_ENCODER.encode(WA_REPORTING_TOKEN_USE_CASE)
34
- ]);
35
- const reportingTokenKey = await hkdf(toBytesView(messageSecret), null, secretInfo, WA_REPORTING_TOKEN_KEY_BYTES);
25
+ const secretInfo = TEXT_ENCODER.encode(stanzaId + input.senderUserJid + input.remoteJid + WA_REPORTING_TOKEN_USE_CASE);
26
+ const reportingTokenKey = await hkdf(messageSecret, null, secretInfo, WA_REPORTING_TOKEN_KEY_BYTES);
36
27
  const hmacKey = await importHmacKey(reportingTokenKey);
37
28
  const reportingToken = (await hmacSign(hmacKey, reportingTokenContent)).subarray(0, WA_REPORTING_TOKEN_BYTES);
38
29
  const version = input.version ?? WA_REPORTING_TOKEN_VERSION;
@@ -68,13 +59,11 @@ function computeReportingTokenContent(messageBytes, version) {
68
59
  if (extracted.totalSize === 0) {
69
60
  return EMPTY_BYTES;
70
61
  }
71
- const output = new Uint8Array(extracted.totalSize);
72
- let offset = 0;
73
- for (const part of extracted.parts) {
74
- output.set(part.bytes, offset);
75
- offset += part.bytes.length;
62
+ const parts = new Array(extracted.parts.length);
63
+ for (let index = 0; index < extracted.parts.length; index += 1) {
64
+ parts[index] = extracted.parts[index].bytes;
76
65
  }
77
- return output;
66
+ return concatBytes(parts);
78
67
  }
79
68
  function getReportingTokenConfig(version) {
80
69
  const cached = reportingTokenConfigCache.get(version);
@@ -251,7 +240,8 @@ function extractProtobufFieldParts(bytes, start, end, config, rootConfig) {
251
240
  if (!configuredField) {
252
241
  continue;
253
242
  }
254
- if (!configuredField.isMessage && isExtractWholeField(configuredField)) {
243
+ if (!configuredField.isMessage &&
244
+ (!configuredField.subfields || configuredField.subfields.fields.size === 0)) {
255
245
  const fieldBytes = bytes.subarray(parsedField.start, parsedField.next);
256
246
  parts.push({
257
247
  fieldNumber: parsedField.fieldNumber,
@@ -293,9 +283,6 @@ function extractProtobufFieldParts(bytes, start, end, config, rootConfig) {
293
283
  totalSize
294
284
  };
295
285
  }
296
- function isExtractWholeField(field) {
297
- return !field.subfields || field.subfields.fields.size === 0;
298
- }
299
286
  function parseProtobufField(bytes, start, end) {
300
287
  const tag = readVarint(bytes, start, end);
301
288
  const tagValue = tag.value;
@@ -424,15 +411,15 @@ function encodeVarint(value) {
424
411
  if (!Number.isSafeInteger(value) || value < 0) {
425
412
  throw new Error(`invalid varint value: ${value}`);
426
413
  }
427
- if (value === 0) {
428
- return new Uint8Array([0]);
429
- }
430
- const bytes = [];
414
+ const bytes = new Uint8Array(10);
415
+ let length = 0;
431
416
  let current = value;
432
417
  while (current >= 128) {
433
- bytes.push((current % 128) + 128);
418
+ bytes[length] = (current % 128) + 128;
419
+ length += 1;
434
420
  current = Math.floor(current / 128);
435
421
  }
436
- bytes.push(current);
437
- return new Uint8Array(bytes);
422
+ bytes[length] = current;
423
+ length += 1;
424
+ return bytes.subarray(0, length);
438
425
  }
@@ -19,7 +19,7 @@ export function assertMessageSecret(messageSecret, context = 'message secret') {
19
19
  }
20
20
  export async function ensureMessageSecret(message) {
21
21
  const messageSecret = message.messageContextInfo?.messageSecret;
22
- if (messageSecret && toBytesView(messageSecret).byteLength > 0) {
22
+ if (messageSecret && messageSecret.byteLength > 0) {
23
23
  return message;
24
24
  }
25
25
  const generatedMessageSecret = await randomBytesAsync(WA_MESSAGE_SECRET_BYTES);