zapo-js 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -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,8 @@ 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 parsedRawUser = (0, jid_1.splitJid)(rawUserJid);
316
334
  const dedup = new Set();
317
335
  for (const deviceNode of (0, helpers_1.getNodeChildrenByTag)(deviceListNode, 'device')) {
318
336
  const parsedId = deviceNode.attrs.id
@@ -321,16 +339,17 @@ class SignalDeviceSyncApi {
321
339
  if (!Number.isSafeInteger(parsedId) || parsedId < 0) {
322
340
  continue;
323
341
  }
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);
342
+ const isHostedDevice = (0, jid_1.isHostedDeviceId)(parsedId) || deviceNode.attrs.is_hosted === 'true';
343
+ dedup.add((0, jid_1.buildDeviceJid)(parsedNormalizedUser.user, parsedNormalizedUser.server, parsedId, {
344
+ rawServer: parsedRawUser.server,
345
+ isHosted: isHostedDevice
346
+ }));
329
347
  }
330
- return deviceJids;
348
+ return Array.from(dedup);
331
349
  }
332
350
  normalizeUsers(userJids) {
333
- const normalized = [];
351
+ const normalized = new Array(userJids.length);
352
+ let normalizedCount = 0;
334
353
  const dedup = new Set();
335
354
  for (let index = 0; index < userJids.length; index += 1) {
336
355
  const normalizedJid = this.normalizeUserJid(userJids[index]);
@@ -338,19 +357,17 @@ class SignalDeviceSyncApi {
338
357
  continue;
339
358
  }
340
359
  dedup.add(normalizedJid);
341
- normalized.push(normalizedJid);
360
+ normalized[normalizedCount] = normalizedJid;
361
+ normalizedCount += 1;
342
362
  }
363
+ normalized.length = normalizedCount;
343
364
  return normalized;
344
365
  }
345
366
  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}`;
367
+ return (0, jid_1.toUserJid)(jid, {
368
+ canonicalizeSignalServer: true,
369
+ hostDomain: this.hostDomain
370
+ });
354
371
  }
355
372
  }
356
373
  exports.SignalDeviceSyncApi = SignalDeviceSyncApi;
@@ -17,8 +17,10 @@ class SignalDigestSyncApi {
17
17
  options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
18
18
  this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
19
19
  }
20
- async validateLocalKeyBundle(timeoutMs = this.defaultTimeoutMs) {
21
- this.logger.debug('signal digest query request', { timeoutMs });
20
+ async validateLocalKeyBundle(prefetchedOrTimeout, timeoutMs = this.defaultTimeoutMs) {
21
+ const prefetched = typeof prefetchedOrTimeout === 'number' ? undefined : prefetchedOrTimeout;
22
+ const effectiveTimeoutMs = typeof prefetchedOrTimeout === 'number' ? prefetchedOrTimeout : timeoutMs;
23
+ this.logger.debug('signal digest query request', { timeoutMs: effectiveTimeoutMs });
22
24
  const response = await this.query({
23
25
  tag: constants_1.WA_NODE_TAGS.IQ,
24
26
  attrs: {
@@ -32,7 +34,7 @@ class SignalDigestSyncApi {
32
34
  attrs: {}
33
35
  }
34
36
  ]
35
- }, timeoutMs);
37
+ }, effectiveTimeoutMs);
36
38
  if (response.tag !== constants_1.WA_NODE_TAGS.IQ) {
37
39
  throw new Error(`invalid signal digest response tag: ${response.tag}`);
38
40
  }
@@ -61,10 +63,12 @@ class SignalDigestSyncApi {
61
63
  preKeyCount: digest.preKeyIds.length
62
64
  };
63
65
  }
64
- const [registrationInfo, signedPreKey] = await Promise.all([
65
- this.signalStore.getRegistrationInfo(),
66
- this.signalStore.getSignedPreKey()
67
- ]);
66
+ const [registrationInfo, signedPreKey] = prefetched
67
+ ? [prefetched.registrationInfo, prefetched.signedPreKey]
68
+ : await Promise.all([
69
+ this.signalStore.getRegistrationInfo(),
70
+ this.signalStore.getSignedPreKey()
71
+ ]);
68
72
  if (!registrationInfo || !signedPreKey) {
69
73
  return {
70
74
  valid: false,
@@ -164,11 +168,11 @@ class SignalDigestSyncApi {
164
168
  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
169
  const signedKeyPublicKey = (0, codec_1.decodeExactLength)(signedKeyValueNode.content, 'signal digest skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH);
166
170
  const signedKeySignature = (0, codec_1.decodeExactLength)(signedKeySignatureNode.content, 'signal digest skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH);
167
- const preKeyIds = [];
168
171
  const listChildren = (0, helpers_1.getNodeChildren)(listNode);
172
+ const preKeyIds = new Array(listChildren.length);
169
173
  for (let index = 0; index < listChildren.length; index += 1) {
170
174
  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}]`));
175
+ 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
176
  }
173
177
  const hash = (0, helpers_1.decodeNodeContentBase64OrBytes)(hashNode.content, 'signal digest hash');
174
178
  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,6 +11,7 @@ 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
17
  this.signalStore = options.signalStore;
@@ -17,17 +19,24 @@ class SignalIdentitySyncApi {
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
  }
@@ -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;
@@ -19,18 +19,24 @@ Object.defineProperty(exports, "ADV_PREFIX_DEVICE_SIGNATURE", { enumerable: true
19
19
  Object.defineProperty(exports, "ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE; } });
20
20
  Object.defineProperty(exports, "ADV_PREFIX_HOSTED_DEVICE_SIGNATURE", { enumerable: true, get: function () { return constants_2.ADV_PREFIX_HOSTED_DEVICE_SIGNATURE; } });
21
21
  async function verifySignalSignature(publicKey, message, signature) {
22
- if (!(0, bytes_1.assertByteLength)(signature, 64, 'invalid signal signature length', false)) {
22
+ if (signature.length !== 64) {
23
23
  return false;
24
24
  }
25
25
  if ((signature[63] & 0x60) !== 0) {
26
26
  return false;
27
27
  }
28
- const signalSignature = new Uint8Array(signature);
29
- const signBit = signalSignature[63] & 0x80;
30
- signalSignature[63] &= 0x7f;
28
+ const signatureLastByteIndex = 63;
29
+ const originalSignatureLastByte = signature[signatureLastByteIndex];
30
+ const signBit = originalSignatureLastByte & 0x80;
31
+ signature[signatureLastByteIndex] = originalSignatureLastByte & 0x7f;
31
32
  const curvePublic = (0, _crypto_1.toRawPubKey)(publicKey);
32
33
  const edPublic = (0, X25519_1.montgomeryToEdwardsPublic)(curvePublic, signBit);
33
- return (0, _crypto_1.ed25519VerifyRaw)(edPublic, signalSignature, message);
34
+ try {
35
+ return await _crypto_1.Ed25519.verify(message, signature, edPublic);
36
+ }
37
+ finally {
38
+ signature[signatureLastByteIndex] = originalSignatureLastByte;
39
+ }
34
40
  }
35
41
  async function signSignalMessage(privateKey, message) {
36
42
  (0, bytes_1.assertByteLength)(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);