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,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignalDeviceSyncApi = void 0;
4
+ const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
4
5
  const constants_1 = require("../../protocol/constants");
5
6
  const jid_1 = require("../../protocol/jid");
6
7
  const usync_1 = require("../../transport/node/builders/usync");
@@ -9,6 +10,7 @@ const query_1 = require("../../transport/node/query");
9
10
  const usync_2 = require("../../transport/node/usync");
10
11
  class SignalDeviceSyncApi {
11
12
  constructor(options) {
13
+ this.syncDedup = new PromiseDedup_1.PromiseDedup();
12
14
  this.logger = options.logger;
13
15
  this.query = options.query;
14
16
  this.deviceListStore = options.deviceListStore;
@@ -17,11 +19,15 @@ class SignalDeviceSyncApi {
17
19
  this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
18
20
  this.generateSid = options.generateSid ?? (0, usync_2.createUsyncSidGenerator)();
19
21
  }
20
- async syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
22
+ syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
21
23
  const normalizedUsers = this.normalizeUsers(userJids);
22
24
  if (normalizedUsers.length === 0) {
23
- return [];
25
+ return Promise.resolve([]);
24
26
  }
27
+ const dedupKey = normalizedUsers.join(',');
28
+ return this.syncDedup.run(dedupKey, () => this.syncDeviceListInternal(normalizedUsers, timeoutMs));
29
+ }
30
+ async syncDeviceListInternal(normalizedUsers, timeoutMs) {
25
31
  const nowMs = Date.now();
26
32
  const cachedByUser = new Map();
27
33
  const usersToQuery = this.deviceListStore
@@ -126,16 +132,19 @@ class SignalDeviceSyncApi {
126
132
  }
127
133
  async collectUsersToQuery(normalizedUsers, nowMs, cachedByUser, store) {
128
134
  const records = await store.getUserDevicesBatch(normalizedUsers, nowMs);
129
- const usersToQuery = [];
135
+ const usersToQuery = new Array(normalizedUsers.length);
136
+ let usersToQueryCount = 0;
130
137
  for (let index = 0; index < normalizedUsers.length; index += 1) {
131
138
  const userJid = normalizedUsers[index];
132
139
  const record = records[index];
133
140
  if (!record) {
134
- usersToQuery.push(userJid);
141
+ usersToQuery[usersToQueryCount] = userJid;
142
+ usersToQueryCount += 1;
135
143
  continue;
136
144
  }
137
145
  cachedByUser.set(userJid, record.deviceJids);
138
146
  }
147
+ usersToQuery.length = usersToQueryCount;
139
148
  return usersToQuery;
140
149
  }
141
150
  makeDeviceSyncRequest(userJids, sid) {
@@ -204,7 +213,8 @@ class SignalDeviceSyncApi {
204
213
  }
205
214
  const requestedSet = new Set(requestedUsers);
206
215
  const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
207
- const parsed = [];
216
+ const parsed = new Array(userNodes.length);
217
+ let parsedCount = 0;
208
218
  for (let index = 0; index < userNodes.length; index += 1) {
209
219
  const userNode = userNodes[index];
210
220
  const userJid = userNode.attrs.jid;
@@ -215,11 +225,13 @@ class SignalDeviceSyncApi {
215
225
  if (!requestedSet.has(normalizedUserJid)) {
216
226
  continue;
217
227
  }
218
- parsed.push({
228
+ parsed[parsedCount] = {
219
229
  jid: normalizedUserJid,
220
- deviceJids: this.parseUserDeviceJids(userNode, normalizedUserJid)
221
- });
230
+ deviceJids: this.parseUserDeviceJids(userNode, userJid, normalizedUserJid)
231
+ };
232
+ parsedCount += 1;
222
233
  }
234
+ parsed.length = parsedCount;
223
235
  return parsed;
224
236
  }
225
237
  parseLidSyncResponse(node, requestedUsers) {
@@ -234,7 +246,8 @@ class SignalDeviceSyncApi {
234
246
  }
235
247
  const requestedSet = new Set(requestedUsers);
236
248
  const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
237
- const parsed = [];
249
+ const parsed = new Array(userNodes.length);
250
+ let parsedCount = 0;
238
251
  for (let index = 0; index < userNodes.length; index += 1) {
239
252
  const userNode = userNodes[index];
240
253
  const userJid = userNode.attrs.jid;
@@ -253,7 +266,8 @@ class SignalDeviceSyncApi {
253
266
  const lidNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.LID);
254
267
  const contactNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.CONTACT);
255
268
  if (!lidNode) {
256
- parsed.push(this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null));
269
+ parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null);
270
+ parsedCount += 1;
257
271
  continue;
258
272
  }
259
273
  const errorNode = (0, helpers_1.findNodeChild)(lidNode, constants_1.WA_NODE_TAGS.ERROR);
@@ -263,12 +277,15 @@ class SignalDeviceSyncApi {
263
277
  code: errorNode.attrs.code,
264
278
  text: errorNode.attrs.text
265
279
  });
266
- parsed.push(this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null));
280
+ parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, null);
281
+ parsedCount += 1;
267
282
  continue;
268
283
  }
269
284
  const lidJid = lidNode.attrs.val ? this.normalizeUserJid(lidNode.attrs.val) : null;
270
- parsed.push(this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, lidJid));
285
+ parsed[parsedCount] = this.buildLidSyncResult(normalizedUserJid, normalizedPhoneJid, contactNode, lidJid);
286
+ parsedCount += 1;
271
287
  }
288
+ parsed.length = parsedCount;
272
289
  return parsed;
273
290
  }
274
291
  buildLidSyncResult(jid, phoneJid, contactNode, lidJid) {
@@ -294,7 +311,7 @@ class SignalDeviceSyncApi {
294
311
  }
295
312
  return contactNode.attrs.type === 'in';
296
313
  }
297
- parseUserDeviceJids(userNode, userJid) {
314
+ parseUserDeviceJids(userNode, rawUserJid, normalizedUserJid) {
298
315
  const devicesNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.DEVICES);
299
316
  if (!devicesNode) {
300
317
  return [];
@@ -302,7 +319,7 @@ class SignalDeviceSyncApi {
302
319
  const errorNode = (0, helpers_1.findNodeChild)(devicesNode, constants_1.WA_NODE_TAGS.ERROR);
303
320
  if (errorNode) {
304
321
  this.logger.warn('signal device sync user error', {
305
- jid: userJid,
322
+ jid: normalizedUserJid,
306
323
  code: errorNode.attrs.code,
307
324
  text: errorNode.attrs.text
308
325
  });
@@ -312,7 +329,11 @@ class SignalDeviceSyncApi {
312
329
  if (!deviceListNode) {
313
330
  return [];
314
331
  }
315
- const parsedUser = (0, jid_1.splitJid)(userJid);
332
+ const parsedNormalizedUser = (0, jid_1.splitJid)(normalizedUserJid);
333
+ const rawAtIndex = rawUserJid.indexOf('@');
334
+ const rawServer = rawAtIndex >= 1 && rawAtIndex < rawUserJid.length - 1
335
+ ? rawUserJid.slice(rawAtIndex + 1)
336
+ : parsedNormalizedUser.server;
316
337
  const dedup = new Set();
317
338
  for (const deviceNode of (0, helpers_1.getNodeChildrenByTag)(deviceListNode, 'device')) {
318
339
  const parsedId = deviceNode.attrs.id
@@ -321,16 +342,17 @@ class SignalDeviceSyncApi {
321
342
  if (!Number.isSafeInteger(parsedId) || parsedId < 0) {
322
343
  continue;
323
344
  }
324
- dedup.add(this.toDeviceJid(parsedUser.user, parsedUser.server, parsedId));
325
- }
326
- const deviceJids = [];
327
- for (const jid of dedup.values()) {
328
- deviceJids.push(jid);
345
+ const isHostedDevice = (0, jid_1.isHostedDeviceId)(parsedId) || deviceNode.attrs.is_hosted === 'true';
346
+ dedup.add((0, jid_1.buildDeviceJid)(parsedNormalizedUser.user, parsedNormalizedUser.server, parsedId, {
347
+ rawServer,
348
+ isHosted: isHostedDevice
349
+ }));
329
350
  }
330
- return deviceJids;
351
+ return Array.from(dedup);
331
352
  }
332
353
  normalizeUsers(userJids) {
333
- const normalized = [];
354
+ const normalized = new Array(userJids.length);
355
+ let normalizedCount = 0;
334
356
  const dedup = new Set();
335
357
  for (let index = 0; index < userJids.length; index += 1) {
336
358
  const normalizedJid = this.normalizeUserJid(userJids[index]);
@@ -338,19 +360,17 @@ class SignalDeviceSyncApi {
338
360
  continue;
339
361
  }
340
362
  dedup.add(normalizedJid);
341
- normalized.push(normalizedJid);
363
+ normalized[normalizedCount] = normalizedJid;
364
+ normalizedCount += 1;
342
365
  }
366
+ normalized.length = normalizedCount;
343
367
  return normalized;
344
368
  }
345
369
  normalizeUserJid(jid) {
346
- const address = (0, jid_1.parseSignalAddressFromJid)(jid);
347
- return `${address.user}@${address.server}`;
348
- }
349
- toDeviceJid(user, server, deviceId) {
350
- if (deviceId === 0) {
351
- return `${user}@${server}`;
352
- }
353
- return `${user}:${deviceId}@${server}`;
370
+ return (0, jid_1.toUserJid)(jid, {
371
+ canonicalizeSignalServer: true,
372
+ hostDomain: this.hostDomain
373
+ });
354
374
  }
355
375
  }
356
376
  exports.SignalDeviceSyncApi = SignalDeviceSyncApi;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignalDigestSyncApi = void 0;
4
4
  const _crypto_1 = require("../../crypto/index.js");
5
+ const keys_1 = require("../../crypto/core/keys");
5
6
  const constants_1 = require("../../protocol/constants");
6
7
  const codec_1 = require("../api/codec");
7
8
  const constants_2 = require("../api/constants");
@@ -13,12 +14,15 @@ class SignalDigestSyncApi {
13
14
  this.logger = options.logger;
14
15
  this.query = options.query;
15
16
  this.signalStore = options.signalStore;
17
+ this.preKeyStore = options.preKeyStore;
16
18
  this.defaultTimeoutMs =
17
19
  options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
18
20
  this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
19
21
  }
20
- async validateLocalKeyBundle(timeoutMs = this.defaultTimeoutMs) {
21
- this.logger.debug('signal digest query request', { timeoutMs });
22
+ async validateLocalKeyBundle(prefetchedOrTimeout, timeoutMs = this.defaultTimeoutMs) {
23
+ const prefetched = typeof prefetchedOrTimeout === 'number' ? undefined : prefetchedOrTimeout;
24
+ const effectiveTimeoutMs = typeof prefetchedOrTimeout === 'number' ? prefetchedOrTimeout : timeoutMs;
25
+ this.logger.debug('signal digest query request', { timeoutMs: effectiveTimeoutMs });
22
26
  const response = await this.query({
23
27
  tag: constants_1.WA_NODE_TAGS.IQ,
24
28
  attrs: {
@@ -32,7 +36,7 @@ class SignalDigestSyncApi {
32
36
  attrs: {}
33
37
  }
34
38
  ]
35
- }, timeoutMs);
39
+ }, effectiveTimeoutMs);
36
40
  if (response.tag !== constants_1.WA_NODE_TAGS.IQ) {
37
41
  throw new Error(`invalid signal digest response tag: ${response.tag}`);
38
42
  }
@@ -61,10 +65,12 @@ class SignalDigestSyncApi {
61
65
  preKeyCount: digest.preKeyIds.length
62
66
  };
63
67
  }
64
- const [registrationInfo, signedPreKey] = await Promise.all([
65
- this.signalStore.getRegistrationInfo(),
66
- this.signalStore.getSignedPreKey()
67
- ]);
68
+ const [registrationInfo, signedPreKey] = prefetched
69
+ ? [prefetched.registrationInfo, prefetched.signedPreKey]
70
+ : await Promise.all([
71
+ this.signalStore.getRegistrationInfo(),
72
+ this.signalStore.getSignedPreKey()
73
+ ]);
68
74
  if (!registrationInfo || !signedPreKey) {
69
75
  return {
70
76
  valid: false,
@@ -81,7 +87,7 @@ class SignalDigestSyncApi {
81
87
  preKeyCount: digest.preKeyIds.length
82
88
  };
83
89
  }
84
- if (!(0, bytes_1.uint8Equal)(registrationInfo.identityKeyPair.pubKey, digest.identity)) {
90
+ if (!(0, bytes_1.uint8Equal)((0, keys_1.toRawPubKey)(registrationInfo.identityKeyPair.pubKey), (0, keys_1.toRawPubKey)(digest.identity))) {
85
91
  return {
86
92
  valid: false,
87
93
  shouldReupload: true,
@@ -90,7 +96,7 @@ class SignalDigestSyncApi {
90
96
  };
91
97
  }
92
98
  if (signedPreKey.keyId !== digest.signedKey.id ||
93
- !(0, bytes_1.uint8Equal)(signedPreKey.keyPair.pubKey, digest.signedKey.publicKey) ||
99
+ !(0, bytes_1.uint8Equal)((0, keys_1.toRawPubKey)(signedPreKey.keyPair.pubKey), (0, keys_1.toRawPubKey)(digest.signedKey.publicKey)) ||
94
100
  !(0, bytes_1.uint8Equal)(signedPreKey.signature, digest.signedKey.signature)) {
95
101
  return {
96
102
  valid: false,
@@ -99,10 +105,10 @@ class SignalDigestSyncApi {
99
105
  preKeyCount: digest.preKeyIds.length
100
106
  };
101
107
  }
102
- const preKeys = await this.signalStore.getPreKeysById(digest.preKeyIds);
108
+ const preKeys = await this.preKeyStore.getPreKeysById(digest.preKeyIds);
103
109
  const bytesToHash = [
104
- registrationInfo.identityKeyPair.pubKey,
105
- signedPreKey.keyPair.pubKey,
110
+ (0, keys_1.toRawPubKey)(registrationInfo.identityKeyPair.pubKey),
111
+ (0, keys_1.toRawPubKey)(signedPreKey.keyPair.pubKey),
106
112
  signedPreKey.signature
107
113
  ];
108
114
  for (let index = 0; index < preKeys.length; index += 1) {
@@ -115,7 +121,7 @@ class SignalDigestSyncApi {
115
121
  preKeyCount: digest.preKeyIds.length
116
122
  };
117
123
  }
118
- bytesToHash.push(preKey.keyPair.pubKey);
124
+ bytesToHash.push((0, keys_1.toRawPubKey)(preKey.keyPair.pubKey));
119
125
  }
120
126
  const localHash = (await (0, _crypto_1.sha1)((0, bytes_1.concatBytes)(bytesToHash))).subarray(0, digest.hash.byteLength);
121
127
  if (!(0, bytes_1.uint8Equal)(localHash, digest.hash)) {
@@ -164,11 +170,11 @@ class SignalDigestSyncApi {
164
170
  const signedKeyId = (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(signedKeyIdNode.content, 'signal digest skey.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'signal digest skey.id');
165
171
  const signedKeyPublicKey = (0, codec_1.decodeExactLength)(signedKeyValueNode.content, 'signal digest skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH);
166
172
  const signedKeySignature = (0, codec_1.decodeExactLength)(signedKeySignatureNode.content, 'signal digest skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH);
167
- const preKeyIds = [];
168
173
  const listChildren = (0, helpers_1.getNodeChildren)(listNode);
174
+ const preKeyIds = new Array(listChildren.length);
169
175
  for (let index = 0; index < listChildren.length; index += 1) {
170
176
  const child = listChildren[index];
171
- preKeyIds.push((0, codec_1.parseUint)((0, codec_1.decodeExactLength)(child.content, `signal digest list[${index}]`, constants_2.SIGNAL_KEY_ID_LENGTH), `signal digest list[${index}]`));
177
+ preKeyIds[index] = (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(child.content, `signal digest list[${index}]`, constants_2.SIGNAL_KEY_ID_LENGTH), `signal digest list[${index}]`);
172
178
  }
173
179
  const hash = (0, helpers_1.decodeNodeContentBase64OrBytes)(hashNode.content, 'signal digest hash');
174
180
  return {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignalIdentitySyncApi = void 0;
4
4
  const keys_1 = require("../../crypto/core/keys");
5
+ const PromiseDedup_1 = require("../../infra/perf/PromiseDedup");
5
6
  const constants_1 = require("../../protocol/constants");
6
7
  const jid_1 = require("../../protocol/jid");
7
8
  const codec_1 = require("../api/codec");
@@ -10,24 +11,32 @@ const helpers_1 = require("../../transport/node/helpers");
10
11
  const query_1 = require("../../transport/node/query");
11
12
  class SignalIdentitySyncApi {
12
13
  constructor(options) {
14
+ this.syncDedup = new PromiseDedup_1.PromiseDedup();
13
15
  this.logger = options.logger;
14
16
  this.query = options.query;
15
- this.signalStore = options.signalStore;
17
+ this.identityStore = options.identityStore;
16
18
  this.defaultTimeoutMs =
17
19
  options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
18
20
  this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
19
21
  }
20
- async syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
21
- const normalizedTargets = [];
22
+ syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
23
+ const dedupKey = `${timeoutMs}:${targetJids.join(',')}`;
24
+ return this.syncDedup.run(dedupKey, () => this.syncIdentityKeysInternal(targetJids, timeoutMs));
25
+ }
26
+ async syncIdentityKeysInternal(targetJids, timeoutMs) {
27
+ const normalizedTargets = new Array(targetJids.length);
28
+ let normalizedTargetsCount = 0;
22
29
  const dedup = new Set();
23
30
  for (let index = 0; index < targetJids.length; index += 1) {
24
- const normalized = (0, jid_1.normalizeDeviceJid)(targetJids[index]);
31
+ const normalized = (0, jid_1.canonicalizeSignalJid)(targetJids[index], this.hostDomain);
25
32
  if (dedup.has(normalized)) {
26
33
  continue;
27
34
  }
28
35
  dedup.add(normalized);
29
- normalizedTargets.push(normalized);
36
+ normalizedTargets[normalizedTargetsCount] = normalized;
37
+ normalizedTargetsCount += 1;
30
38
  }
39
+ normalizedTargets.length = normalizedTargetsCount;
31
40
  if (normalizedTargets.length === 0) {
32
41
  return [];
33
42
  }
@@ -60,8 +69,8 @@ class SignalIdentitySyncApi {
60
69
  ]
61
70
  }, timeoutMs);
62
71
  const entries = this.parseIdentitySyncResponse(response, normalizedTargets);
63
- const { signalStore } = this;
64
- if (signalStore && entries.length > 0) {
72
+ const { identityStore } = this;
73
+ if (identityStore && entries.length > 0) {
65
74
  const identities = new Array(entries.length);
66
75
  for (let index = 0; index < entries.length; index += 1) {
67
76
  const entry = entries[index];
@@ -70,7 +79,7 @@ class SignalIdentitySyncApi {
70
79
  identityKey: (0, keys_1.toSerializedPubKey)(entry.identity)
71
80
  };
72
81
  }
73
- await signalStore.setRemoteIdentities(identities);
82
+ await identityStore.setRemoteIdentities(identities);
74
83
  }
75
84
  this.logger.debug('signal identity sync success', {
76
85
  requested: normalizedTargets.length,
@@ -86,10 +95,13 @@ class SignalIdentitySyncApi {
86
95
  }
87
96
  const requested = new Set(requestedJids);
88
97
  const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
89
- const parsed = [];
98
+ const parsed = new Array(userNodes.length);
99
+ let parsedCount = 0;
90
100
  for (let index = 0; index < userNodes.length; index += 1) {
91
101
  const userNode = userNodes[index];
92
- const jid = userNode.attrs.jid ? (0, jid_1.normalizeDeviceJid)(userNode.attrs.jid) : '';
102
+ const jid = userNode.attrs.jid
103
+ ? (0, jid_1.canonicalizeSignalJid)(userNode.attrs.jid, this.hostDomain)
104
+ : '';
93
105
  if (!jid || !requested.has(jid)) {
94
106
  continue;
95
107
  }
@@ -112,18 +124,21 @@ class SignalIdentitySyncApi {
112
124
  ? (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(typeNode.content, 'identity sync type', constants_2.SIGNAL_KEY_BUNDLE_TYPE_LENGTH), 'identity sync type')
113
125
  : undefined;
114
126
  if (parsedType === undefined) {
115
- parsed.push({
127
+ parsed[parsedCount] = {
116
128
  jid,
117
129
  identity
118
- });
130
+ };
131
+ parsedCount += 1;
119
132
  continue;
120
133
  }
121
- parsed.push({
134
+ parsed[parsedCount] = {
122
135
  jid,
123
136
  identity,
124
137
  type: parsedType
125
- });
138
+ };
139
+ parsedCount += 1;
126
140
  }
141
+ parsed.length = parsedCount;
127
142
  return parsed;
128
143
  }
129
144
  }
@@ -6,8 +6,12 @@ const jid_1 = require("../../protocol/jid");
6
6
  const codec_1 = require("../api/codec");
7
7
  const constants_2 = require("../api/constants");
8
8
  const prekeys_1 = require("../api/prekeys");
9
+ const result_map_1 = require("../api/result-map");
9
10
  const helpers_1 = require("../../transport/node/helpers");
10
11
  const query_1 = require("../../transport/node/query");
12
+ function isMissingPreKeysUserResultPreferred(result) {
13
+ return 'devices' in result;
14
+ }
11
15
  class SignalMissingPreKeysSyncApi {
12
16
  constructor(options) {
13
17
  this.logger = options.logger;
@@ -38,31 +42,38 @@ class SignalMissingPreKeysSyncApi {
38
42
  }
39
43
  const users = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
40
44
  const parsedByJid = new Map();
45
+ const parsedByCanonicalJid = new Map();
41
46
  for (let index = 0; index < users.length; index += 1) {
42
47
  const userNode = users[index];
43
48
  const userJid = userNode.attrs.jid;
44
49
  if (!userJid) {
45
50
  continue;
46
51
  }
52
+ const canonicalUserJid = (0, jid_1.toUserJid)(userJid, {
53
+ canonicalizeSignalServer: true
54
+ });
47
55
  const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
48
56
  if (userErrorNode) {
49
57
  const parsedCode = Number.parseInt(userErrorNode.attrs.code ?? '', 10);
50
- parsedByJid.set(userJid, {
58
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
51
59
  userJid,
52
60
  errorCode: Number.isSafeInteger(parsedCode) ? parsedCode : undefined,
53
61
  errorText: userErrorNode.attrs.text ?? userErrorNode.attrs.type ?? 'unknown'
54
- });
62
+ }, isMissingPreKeysUserResultPreferred);
55
63
  continue;
56
64
  }
57
- parsedByJid.set(userJid, {
65
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
58
66
  userJid,
59
- devices: this.parseUserDevices(userNode, userJid)
60
- });
67
+ devices: this.parseUserDevices(userNode, canonicalUserJid)
68
+ }, isMissingPreKeysUserResultPreferred);
61
69
  }
62
70
  const results = new Array(requestedTargets.length);
63
71
  for (let index = 0; index < requestedTargets.length; index += 1) {
64
72
  const target = requestedTargets[index];
65
- results[index] = parsedByJid.get(target.userJid) ?? {
73
+ results[index] = parsedByJid.get(target.userJid) ??
74
+ parsedByCanonicalJid.get((0, jid_1.toUserJid)(target.userJid, {
75
+ canonicalizeSignalServer: true
76
+ })) ?? {
66
77
  userJid: target.userJid,
67
78
  errorText: 'missing user in key_fetch response'
68
79
  };
@@ -13,11 +13,13 @@ class SignalRotateKeyApi {
13
13
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS;
14
14
  }
15
15
  async rotateSignedPreKey(timeoutMs = this.defaultTimeoutMs) {
16
- const registrationInfo = await this.signalStore.getRegistrationInfo();
16
+ const [registrationInfo, currentSignedPreKey] = await Promise.all([
17
+ this.signalStore.getRegistrationInfo(),
18
+ this.signalStore.getSignedPreKey()
19
+ ]);
17
20
  if (!registrationInfo) {
18
21
  throw new Error('signal rotate key requires registration info');
19
22
  }
20
- const currentSignedPreKey = await this.signalStore.getSignedPreKey();
21
23
  const nextSignedPreKey = await (0, keygen_1.generateSignedPreKey)(currentSignedPreKey ? currentSignedPreKey.keyId + 1 : 1, registrationInfo.identityKeyPair.privKey);
22
24
  await this.signalStore.setSignedPreKey(nextSignedPreKey);
23
25
  this.logger.info('signal signed prekey uploading', {
@@ -2,10 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignalSessionSyncApi = void 0;
4
4
  const constants_1 = require("../../protocol/constants");
5
+ const jid_1 = require("../../protocol/jid");
5
6
  const codec_1 = require("../api/codec");
6
7
  const constants_2 = require("../api/constants");
8
+ const result_map_1 = require("../api/result-map");
7
9
  const helpers_1 = require("../../transport/node/helpers");
8
10
  const query_1 = require("../../transport/node/query");
11
+ function isKeyBundleResultPreferred(result) {
12
+ return 'bundle' in result;
13
+ }
9
14
  class SignalSessionSyncApi {
10
15
  constructor(options) {
11
16
  this.logger = options.logger;
@@ -44,9 +49,11 @@ class SignalSessionSyncApi {
44
49
  reasonIdentity: (previous?.reasonIdentity ?? false) || target.reasonIdentity === true
45
50
  });
46
51
  }
47
- const mergedTargets = [];
52
+ const mergedTargets = new Array(targetByJid.size);
53
+ let mergedTargetsCount = 0;
48
54
  for (const target of targetByJid.values()) {
49
- mergedTargets.push(target);
55
+ mergedTargets[mergedTargetsCount] = target;
56
+ mergedTargetsCount += 1;
50
57
  }
51
58
  const userNodes = new Array(mergedTargets.length);
52
59
  for (let index = 0; index < mergedTargets.length; index += 1) {
@@ -90,6 +97,7 @@ class SignalSessionSyncApi {
90
97
  throw new Error('key bundle response list is empty');
91
98
  }
92
99
  const parsedByJid = new Map();
100
+ const parsedByCanonicalJid = new Map();
93
101
  for (let index = 0; index < userNodes.length; index += 1) {
94
102
  const userNode = userNodes[index];
95
103
  const jid = userNode.attrs.jid;
@@ -98,24 +106,25 @@ class SignalSessionSyncApi {
98
106
  }
99
107
  const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
100
108
  if (userErrorNode) {
101
- parsedByJid.set(jid, {
109
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
102
110
  jid,
103
111
  errorCode: userErrorNode.attrs.code,
104
112
  errorText: userErrorNode.attrs.text ?? 'unknown'
105
- });
113
+ }, isKeyBundleResultPreferred);
106
114
  continue;
107
115
  }
108
116
  const parsed = this.parseUserKeyBundle(userNode);
109
- parsedByJid.set(jid, {
117
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
110
118
  jid,
111
119
  bundle: parsed.bundle,
112
120
  ...(parsed.deviceIdentity ? { deviceIdentity: parsed.deviceIdentity } : {})
113
- });
121
+ }, isKeyBundleResultPreferred);
114
122
  }
115
123
  const output = new Array(requestedTargets.length);
116
124
  for (let index = 0; index < requestedTargets.length; index += 1) {
117
125
  const target = requestedTargets[index];
118
- output[index] = parsedByJid.get(target.jid) ?? {
126
+ output[index] = parsedByJid.get(target.jid) ??
127
+ parsedByCanonicalJid.get((0, jid_1.canonicalizeSignalJid)(target.jid, this.hostDomain)) ?? {
119
128
  jid: target.jid,
120
129
  errorText: 'missing key bundle user in response'
121
130
  };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerParsedResultByRawAndCanonicalKey = registerParsedResultByRawAndCanonicalKey;
4
+ function mergePreferredParsedResult(target, key, next, isPreferred) {
5
+ const current = target.get(key);
6
+ if (!current || !isPreferred(current)) {
7
+ target.set(key, next);
8
+ }
9
+ }
10
+ function registerParsedResultByRawAndCanonicalKey(parsedByRawKey, parsedByCanonicalKey, rawKey, canonicalKey, result, isPreferred) {
11
+ mergePreferredParsedResult(parsedByRawKey, rawKey, result, isPreferred);
12
+ mergePreferredParsedResult(parsedByCanonicalKey, canonicalKey, result, isPreferred);
13
+ }
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SIGNAL_PREFIX = exports.WHISPER_GROUP_INFO = exports.CHAIN_KEY_LABEL = exports.MESSAGE_KEY_LABEL = exports.SENDER_KEY_FUTURE_MESSAGES_MAX = exports.FUTURE_MESSAGES_MAX = exports.MAX_UNUSED_KEYS = exports.MAX_PREV_SESSIONS = exports.SIGNATURE_SIZE = exports.SIGNAL_MAC_SIZE = exports.KEY_TYPE_CURVE25519 = exports.SERIALIZED_PUB_KEY_PREFIX = exports.SIGNAL_GROUP_VERSION = exports.SIGNAL_VERSION = void 0;
4
- const constants_1 = require("../crypto/core/constants");
3
+ exports.SIGNAL_PREFIX = exports.WHISPER_GROUP_INFO = exports.CHAIN_KEY_LABEL = exports.MESSAGE_KEY_LABEL = exports.SENDER_KEY_FUTURE_MESSAGES_MAX = exports.FUTURE_MESSAGES_MAX = exports.MAX_UNUSED_KEYS = exports.MAX_PREV_SESSIONS = exports.SIGNAL_MAC_SIZE = exports.SIGNAL_GROUP_VERSION = exports.SIGNAL_VERSION = void 0;
5
4
  const bytes_1 = require("../util/bytes");
6
5
  exports.SIGNAL_VERSION = 3;
7
6
  exports.SIGNAL_GROUP_VERSION = 3;
8
- exports.SERIALIZED_PUB_KEY_PREFIX = constants_1.SERIALIZED_PUB_KEY_PREFIX;
9
- exports.KEY_TYPE_CURVE25519 = 5;
10
7
  exports.SIGNAL_MAC_SIZE = 8;
11
- exports.SIGNATURE_SIZE = 64;
12
8
  exports.MAX_PREV_SESSIONS = 40;
13
9
  exports.MAX_UNUSED_KEYS = 2000;
14
10
  exports.FUTURE_MESSAGES_MAX = 2000;