zapo-js 0.1.1 → 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 (589) hide show
  1. package/README.md +20 -4
  2. package/dist/appstate/WaAppStateCrypto.js +19 -26
  3. package/dist/appstate/WaAppStateSyncClient.js +293 -181
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  7. package/dist/appstate/index.js +8 -6
  8. package/dist/appstate/utils.js +9 -34
  9. package/dist/auth/WaAuthClient.js +43 -61
  10. package/dist/auth/flow/WaAuthCredentialsFlow.js +22 -15
  11. package/dist/auth/index.js +1 -8
  12. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  13. package/dist/auth/pairing/WaPairingFlow.js +34 -26
  14. package/dist/auth/pairing/WaQrFlow.js +37 -24
  15. package/dist/client/WaClient.js +275 -324
  16. package/dist/client/WaClientFactory.js +500 -133
  17. package/dist/client/connection/WaConnectionManager.js +301 -0
  18. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  19. package/dist/client/connection/WaReceiptQueue.js +51 -0
  20. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  22. package/dist/client/coordinators/WaGroupCoordinator.js +30 -16
  23. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  24. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +439 -701
  25. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  26. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  27. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  28. package/dist/client/coordinators/WaRetryCoordinator.js +242 -57
  29. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  30. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  31. package/dist/client/dirty.js +74 -48
  32. package/dist/client/events/chat.js +4 -3
  33. package/dist/client/events/devices.js +72 -0
  34. package/dist/client/events/group.js +62 -47
  35. package/dist/client/events/identity.js +22 -0
  36. package/dist/client/events/privacy-token.js +39 -0
  37. package/dist/client/history-sync.js +94 -63
  38. package/dist/client/incoming.js +60 -27
  39. package/dist/client/mailbox.js +24 -23
  40. package/dist/client/messages.js +107 -31
  41. package/dist/client/messaging/fanout.js +199 -0
  42. package/dist/client/messaging/key-protocol.js +130 -0
  43. package/dist/client/messaging/participants.js +193 -0
  44. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  45. package/dist/client/tokens/cs-token.js +50 -0
  46. package/dist/client/tokens/tc-token.js +25 -0
  47. package/dist/crypto/core/hkdf.js +3 -8
  48. package/dist/crypto/core/index.js +2 -5
  49. package/dist/crypto/core/keys.js +6 -7
  50. package/dist/crypto/core/nonce.js +2 -0
  51. package/dist/crypto/core/primitives.js +12 -23
  52. package/dist/crypto/core/random.js +26 -23
  53. package/dist/crypto/curves/Ed25519.js +7 -8
  54. package/dist/crypto/curves/X25519.js +38 -22
  55. package/dist/crypto/index.js +1 -3
  56. package/dist/crypto/math/constants.js +13 -36
  57. package/dist/crypto/math/edwards.js +171 -44
  58. package/dist/crypto/math/fe.js +706 -0
  59. package/dist/crypto/math/mod.js +10 -3
  60. package/dist/esm/appstate/WaAppStateCrypto.js +7 -14
  61. package/dist/esm/appstate/WaAppStateSyncClient.js +284 -172
  62. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  63. package/dist/esm/appstate/constants.js +3 -2
  64. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  65. package/dist/esm/appstate/index.js +2 -2
  66. package/dist/esm/appstate/utils.js +8 -30
  67. package/dist/esm/auth/WaAuthClient.js +43 -61
  68. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +22 -15
  69. package/dist/esm/auth/index.js +0 -3
  70. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  71. package/dist/esm/auth/pairing/WaPairingFlow.js +28 -20
  72. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  73. package/dist/esm/client/WaClient.js +275 -324
  74. package/dist/esm/client/WaClientFactory.js +501 -134
  75. package/dist/esm/client/connection/WaConnectionManager.js +297 -0
  76. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  77. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  78. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  79. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  80. package/dist/esm/client/coordinators/WaGroupCoordinator.js +23 -9
  81. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +21 -27
  82. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +443 -705
  83. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  84. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  85. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  86. package/dist/esm/client/coordinators/WaRetryCoordinator.js +244 -59
  87. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  88. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  89. package/dist/esm/client/dirty.js +69 -43
  90. package/dist/esm/client/events/chat.js +4 -3
  91. package/dist/esm/client/events/devices.js +68 -0
  92. package/dist/esm/client/events/group.js +53 -39
  93. package/dist/esm/client/events/identity.js +19 -0
  94. package/dist/esm/client/events/privacy-token.js +36 -0
  95. package/dist/esm/client/history-sync.js +91 -60
  96. package/dist/esm/client/incoming.js +61 -28
  97. package/dist/esm/client/mailbox.js +24 -23
  98. package/dist/esm/client/messages.js +108 -32
  99. package/dist/esm/client/messaging/fanout.js +196 -0
  100. package/dist/esm/client/messaging/key-protocol.js +127 -0
  101. package/dist/esm/client/messaging/participants.js +190 -0
  102. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  103. package/dist/esm/client/tokens/cs-token.js +46 -0
  104. package/dist/esm/client/tokens/tc-token.js +18 -0
  105. package/dist/esm/crypto/core/hkdf.js +3 -8
  106. package/dist/esm/crypto/core/index.js +2 -3
  107. package/dist/esm/crypto/core/keys.js +3 -4
  108. package/dist/esm/crypto/core/nonce.js +2 -0
  109. package/dist/esm/crypto/core/primitives.js +12 -22
  110. package/dist/esm/crypto/core/random.js +25 -23
  111. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  112. package/dist/esm/crypto/curves/X25519.js +35 -19
  113. package/dist/esm/crypto/index.js +0 -1
  114. package/dist/esm/crypto/math/constants.js +12 -35
  115. package/dist/esm/crypto/math/edwards.js +174 -47
  116. package/dist/esm/crypto/math/fe.js +691 -0
  117. package/dist/esm/crypto/math/mod.js +10 -1
  118. package/dist/esm/index.js +1 -1
  119. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  120. package/dist/esm/infra/log/PinoLogger.js +15 -9
  121. package/dist/esm/infra/log/types.js +11 -1
  122. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  123. package/dist/esm/infra/perf/BoundedTaskQueue.js +16 -18
  124. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  125. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  126. package/dist/esm/infra/perf/StoreLock.js +77 -0
  127. package/dist/esm/media/WaMediaCrypto.js +96 -16
  128. package/dist/esm/media/WaMediaTransferClient.js +251 -91
  129. package/dist/esm/media/conn.js +10 -6
  130. package/dist/esm/media/constants.js +6 -2
  131. package/dist/esm/message/WaMessageClient.js +30 -32
  132. package/dist/esm/message/ack.js +6 -6
  133. package/dist/esm/message/addon-crypto.js +59 -0
  134. package/dist/esm/message/content.js +195 -9
  135. package/dist/esm/message/icdc.js +76 -0
  136. package/dist/esm/message/incoming.js +129 -122
  137. package/dist/esm/message/index.js +2 -0
  138. package/dist/esm/message/phash.js +3 -1
  139. package/dist/esm/message/reporting-token.js +425 -0
  140. package/dist/esm/message/use-case-secret.js +49 -0
  141. package/dist/esm/protocol/appstate.js +27 -0
  142. package/dist/esm/protocol/browser.js +10 -18
  143. package/dist/esm/protocol/constants.js +6 -3
  144. package/dist/esm/protocol/defaults.js +6 -0
  145. package/dist/esm/protocol/index.js +2 -11
  146. package/dist/esm/protocol/jid.js +133 -52
  147. package/dist/esm/protocol/media.js +3 -3
  148. package/dist/esm/protocol/message.js +61 -1
  149. package/dist/esm/protocol/nodes.js +4 -0
  150. package/dist/esm/protocol/notification.js +3 -1
  151. package/dist/esm/protocol/privacy-token.js +17 -0
  152. package/dist/esm/protocol/privacy.js +55 -0
  153. package/dist/esm/protocol/stream.js +26 -1
  154. package/dist/esm/protocol/usync.js +11 -0
  155. package/dist/esm/retry/codec.js +216 -0
  156. package/dist/esm/retry/constants.js +1 -1
  157. package/dist/esm/retry/index.js +3 -2
  158. package/dist/esm/retry/parse.js +88 -86
  159. package/dist/esm/retry/replay.js +54 -51
  160. package/dist/esm/retry/tracker.js +94 -0
  161. package/dist/esm/signal/api/SignalDeviceSyncApi.js +276 -92
  162. package/dist/esm/signal/api/SignalDigestSyncApi.js +17 -8
  163. package/dist/esm/signal/api/SignalIdentitySyncApi.js +67 -37
  164. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +86 -67
  165. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  166. package/dist/esm/signal/api/SignalSessionSyncApi.js +36 -34
  167. package/dist/esm/signal/api/result-map.js +10 -0
  168. package/dist/esm/signal/constants.js +0 -4
  169. package/dist/esm/signal/crypto/WaAdvSignature.js +13 -9
  170. package/dist/esm/signal/{store/sqlite.js → encoding.js} +93 -60
  171. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  172. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  173. package/dist/esm/signal/group/SenderKeyManager.js +144 -115
  174. package/dist/esm/signal/index.js +2 -0
  175. package/dist/esm/signal/registration/keygen.js +6 -2
  176. package/dist/esm/signal/registration/utils.js +1 -0
  177. package/dist/esm/signal/session/SignalProtocol.js +164 -53
  178. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  179. package/dist/esm/signal/session/SignalSession.js +14 -9
  180. package/dist/esm/signal/session/resolver.js +221 -0
  181. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  182. package/dist/esm/store/createStore.js +100 -188
  183. package/dist/esm/store/index.js +1 -10
  184. package/dist/esm/store/locks/appstate.lock.js +26 -0
  185. package/dist/esm/store/locks/auth.lock.js +15 -0
  186. package/dist/esm/store/locks/contact.lock.js +20 -0
  187. package/dist/esm/store/locks/device-list.lock.js +20 -0
  188. package/dist/esm/store/locks/message.lock.js +21 -0
  189. package/dist/esm/store/locks/participants.lock.js +20 -0
  190. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  191. package/dist/esm/store/locks/retry.lock.js +29 -0
  192. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  193. package/dist/esm/store/locks/signal.lock.js +63 -0
  194. package/dist/esm/store/locks/thread.lock.js +21 -0
  195. package/dist/esm/store/noop.store.js +4 -7
  196. package/dist/esm/store/providers/memory/appstate.store.js +38 -16
  197. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  198. package/dist/esm/store/providers/memory/device-list.store.js +12 -34
  199. package/dist/esm/store/providers/memory/message.store.js +11 -5
  200. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  201. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  202. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  203. package/dist/esm/store/providers/memory/sender-key.store.js +11 -8
  204. package/dist/esm/store/providers/memory/signal.store.js +47 -18
  205. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  206. package/dist/esm/transport/WaComms.js +28 -24
  207. package/dist/esm/transport/WaWebSocket.js +115 -18
  208. package/dist/esm/transport/binary/constants.js +0 -30
  209. package/dist/esm/transport/binary/decoder.js +8 -8
  210. package/dist/esm/transport/binary/encoder.js +10 -9
  211. package/dist/esm/transport/binary/index.js +0 -1
  212. package/dist/esm/transport/index.js +1 -0
  213. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  214. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -21
  215. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  216. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  217. package/dist/esm/transport/node/builders/business.js +129 -0
  218. package/dist/esm/transport/node/builders/global.js +370 -0
  219. package/dist/esm/transport/node/builders/index.js +7 -3
  220. package/dist/esm/transport/node/builders/message.js +63 -230
  221. package/dist/esm/transport/node/builders/pairing.js +2 -27
  222. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  223. package/dist/esm/transport/node/builders/privacy.js +48 -0
  224. package/dist/esm/transport/node/builders/profile.js +70 -0
  225. package/dist/esm/transport/node/builders/retry.js +10 -22
  226. package/dist/esm/transport/node/builders/usync.js +45 -0
  227. package/dist/esm/transport/node/helpers.js +125 -5
  228. package/dist/esm/transport/node/usync.js +5 -0
  229. package/dist/esm/transport/node/xml.js +35 -14
  230. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  231. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  232. package/dist/esm/transport/noise/WaNoiseCert.js +4 -7
  233. package/dist/esm/transport/noise/WaNoiseSession.js +77 -29
  234. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  235. package/dist/esm/transport/proxy.js +27 -0
  236. package/dist/esm/transport/stream/parse.js +17 -48
  237. package/dist/esm/util/bytes.js +67 -45
  238. package/dist/esm/util/coercion.js +6 -14
  239. package/dist/esm/util/index.js +5 -0
  240. package/dist/esm/util/primitives.js +40 -14
  241. package/dist/index.js +7 -1
  242. package/dist/infra/log/ConsoleLogger.js +18 -17
  243. package/dist/infra/log/PinoLogger.js +15 -9
  244. package/dist/infra/log/types.js +12 -0
  245. package/dist/infra/perf/BackgroundQueue.js +482 -0
  246. package/dist/infra/perf/BoundedTaskQueue.js +16 -18
  247. package/dist/infra/perf/PromiseDedup.js +24 -0
  248. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  249. package/dist/infra/perf/StoreLock.js +81 -0
  250. package/dist/media/WaMediaCrypto.js +95 -15
  251. package/dist/media/WaMediaTransferClient.js +284 -91
  252. package/dist/media/conn.js +10 -6
  253. package/dist/media/constants.js +6 -2
  254. package/dist/message/WaMessageClient.js +31 -33
  255. package/dist/message/ack.js +6 -6
  256. package/dist/message/addon-crypto.js +65 -0
  257. package/dist/message/content.js +198 -9
  258. package/dist/message/icdc.js +81 -0
  259. package/dist/message/incoming.js +127 -120
  260. package/dist/message/index.js +2 -0
  261. package/dist/message/phash.js +3 -1
  262. package/dist/message/reporting-token.js +429 -0
  263. package/dist/message/use-case-secret.js +55 -0
  264. package/dist/protocol/appstate.js +28 -1
  265. package/dist/protocol/browser.js +10 -18
  266. package/dist/protocol/constants.js +26 -1
  267. package/dist/protocol/defaults.js +6 -0
  268. package/dist/protocol/index.js +23 -42
  269. package/dist/protocol/jid.js +140 -52
  270. package/dist/protocol/media.js +3 -3
  271. package/dist/protocol/message.js +62 -2
  272. package/dist/protocol/nodes.js +4 -0
  273. package/dist/protocol/notification.js +3 -1
  274. package/dist/protocol/privacy-token.js +20 -0
  275. package/dist/protocol/privacy.js +58 -0
  276. package/dist/protocol/stream.js +27 -2
  277. package/dist/protocol/usync.js +14 -0
  278. package/dist/retry/codec.js +220 -0
  279. package/dist/retry/constants.js +1 -1
  280. package/dist/retry/index.js +7 -5
  281. package/dist/retry/parse.js +88 -85
  282. package/dist/retry/replay.js +52 -49
  283. package/dist/retry/tracker.js +97 -0
  284. package/dist/signal/api/SignalDeviceSyncApi.js +273 -89
  285. package/dist/signal/api/SignalDigestSyncApi.js +17 -8
  286. package/dist/signal/api/SignalIdentitySyncApi.js +66 -36
  287. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +82 -63
  288. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  289. package/dist/signal/api/SignalSessionSyncApi.js +36 -34
  290. package/dist/signal/api/result-map.js +13 -0
  291. package/dist/signal/constants.js +1 -5
  292. package/dist/signal/crypto/WaAdvSignature.js +11 -7
  293. package/dist/signal/{store/sqlite.js → encoding.js} +94 -61
  294. package/dist/signal/group/SenderKeyChain.js +27 -22
  295. package/dist/signal/group/SenderKeyCodec.js +5 -6
  296. package/dist/signal/group/SenderKeyManager.js +144 -115
  297. package/dist/signal/index.js +15 -1
  298. package/dist/signal/registration/keygen.js +6 -2
  299. package/dist/signal/registration/utils.js +1 -0
  300. package/dist/signal/session/SignalProtocol.js +164 -53
  301. package/dist/signal/session/SignalRatchet.js +24 -15
  302. package/dist/signal/session/SignalSession.js +14 -9
  303. package/dist/signal/session/resolver.js +224 -0
  304. package/dist/store/contracts/privacy-token.store.js +2 -0
  305. package/dist/store/createStore.js +100 -188
  306. package/dist/store/index.js +15 -33
  307. package/dist/store/locks/appstate.lock.js +29 -0
  308. package/dist/store/locks/auth.lock.js +18 -0
  309. package/dist/store/locks/contact.lock.js +23 -0
  310. package/dist/store/locks/device-list.lock.js +23 -0
  311. package/dist/store/locks/message.lock.js +24 -0
  312. package/dist/store/locks/participants.lock.js +23 -0
  313. package/dist/store/locks/privacy-token.lock.js +21 -0
  314. package/dist/store/locks/retry.lock.js +32 -0
  315. package/dist/store/locks/sender-key.lock.js +55 -0
  316. package/dist/store/locks/signal.lock.js +66 -0
  317. package/dist/store/locks/thread.lock.js +24 -0
  318. package/dist/store/noop.store.js +4 -7
  319. package/dist/store/providers/memory/appstate.store.js +36 -14
  320. package/dist/store/providers/memory/contact.store.js +5 -0
  321. package/dist/store/providers/memory/device-list.store.js +12 -34
  322. package/dist/store/providers/memory/message.store.js +11 -5
  323. package/dist/store/providers/memory/participants.store.js +1 -8
  324. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  325. package/dist/store/providers/memory/retry.store.js +77 -2
  326. package/dist/store/providers/memory/sender-key.store.js +14 -11
  327. package/dist/store/providers/memory/signal.store.js +54 -25
  328. package/dist/store/providers/memory/thread.store.js +5 -0
  329. package/dist/transport/WaComms.js +30 -26
  330. package/dist/transport/WaWebSocket.js +148 -18
  331. package/dist/transport/binary/constants.js +1 -31
  332. package/dist/transport/binary/decoder.js +8 -8
  333. package/dist/transport/binary/encoder.js +10 -9
  334. package/dist/transport/binary/index.js +0 -4
  335. package/dist/transport/index.js +7 -1
  336. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  337. package/dist/transport/node/WaNodeOrchestrator.js +25 -21
  338. package/dist/transport/node/WaNodeTransport.js +0 -3
  339. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  340. package/dist/transport/node/builders/business.js +137 -0
  341. package/dist/transport/node/builders/global.js +375 -0
  342. package/dist/transport/node/builders/index.js +29 -17
  343. package/dist/transport/node/builders/message.js +64 -236
  344. package/dist/transport/node/builders/pairing.js +2 -29
  345. package/dist/transport/node/builders/privacy-token.js +46 -0
  346. package/dist/transport/node/builders/privacy.js +55 -0
  347. package/dist/transport/node/builders/profile.js +78 -0
  348. package/dist/transport/node/builders/retry.js +9 -21
  349. package/dist/transport/node/builders/usync.js +49 -0
  350. package/dist/transport/node/helpers.js +131 -4
  351. package/dist/transport/node/usync.js +8 -0
  352. package/dist/transport/node/xml.js +35 -14
  353. package/dist/transport/noise/WaClientPayload.js +13 -13
  354. package/dist/transport/noise/WaFrameCodec.js +47 -32
  355. package/dist/transport/noise/WaNoiseCert.js +5 -8
  356. package/dist/transport/noise/WaNoiseSession.js +77 -29
  357. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  358. package/dist/transport/proxy.js +34 -0
  359. package/dist/transport/stream/parse.js +20 -52
  360. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  361. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  362. package/dist/types/appstate/constants.d.ts +1 -0
  363. package/dist/types/appstate/encoding.d.ts +7 -0
  364. package/dist/types/appstate/index.d.ts +3 -3
  365. package/dist/types/appstate/utils.d.ts +0 -3
  366. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  367. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  368. package/dist/types/auth/index.d.ts +0 -4
  369. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  370. package/dist/types/auth/types.d.ts +7 -9
  371. package/dist/types/client/WaClient.d.ts +42 -25
  372. package/dist/types/client/WaClientFactory.d.ts +33 -26
  373. package/dist/types/client/connection/WaConnectionManager.d.ts +66 -0
  374. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  375. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  376. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  377. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  378. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -2
  379. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -38
  380. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  381. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  382. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  383. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +8 -0
  384. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  385. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  386. package/dist/types/client/dirty.d.ts +1 -0
  387. package/dist/types/client/events/devices.d.ts +20 -0
  388. package/dist/types/client/events/group.d.ts +2 -1
  389. package/dist/types/client/events/identity.d.ts +9 -0
  390. package/dist/types/client/events/privacy-token.d.ts +7 -0
  391. package/dist/types/client/history-sync.d.ts +9 -6
  392. package/dist/types/client/incoming.d.ts +3 -1
  393. package/dist/types/client/index.d.ts +1 -1
  394. package/dist/types/client/mailbox.d.ts +3 -5
  395. package/dist/types/client/messages.d.ts +1 -2
  396. package/dist/types/client/messaging/fanout.d.ts +14 -0
  397. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  398. package/dist/types/client/messaging/participants.d.ts +13 -0
  399. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  400. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  401. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  402. package/dist/types/client/types.d.ts +75 -4
  403. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  404. package/dist/types/crypto/core/index.d.ts +2 -3
  405. package/dist/types/crypto/core/nonce.d.ts +2 -0
  406. package/dist/types/crypto/core/primitives.d.ts +0 -1
  407. package/dist/types/crypto/core/random.d.ts +2 -7
  408. package/dist/types/crypto/index.d.ts +0 -1
  409. package/dist/types/crypto/math/constants.d.ts +4 -2
  410. package/dist/types/crypto/math/fe.d.ts +30 -0
  411. package/dist/types/crypto/math/mod.d.ts +0 -2
  412. package/dist/types/crypto/math/types.d.ts +11 -4
  413. package/dist/types/index.d.ts +5 -3
  414. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  415. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  416. package/dist/types/infra/log/types.d.ts +1 -0
  417. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  418. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  419. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  420. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  421. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  422. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  423. package/dist/types/media/WaMediaTransferClient.d.ts +16 -15
  424. package/dist/types/media/constants.d.ts +1 -1
  425. package/dist/types/media/index.d.ts +1 -1
  426. package/dist/types/media/types.d.ts +15 -2
  427. package/dist/types/message/addon-crypto.d.ts +25 -0
  428. package/dist/types/message/content.d.ts +8 -0
  429. package/dist/types/message/icdc.d.ts +13 -0
  430. package/dist/types/message/index.d.ts +2 -0
  431. package/dist/types/message/reporting-token.d.ts +18 -0
  432. package/dist/types/message/types.d.ts +45 -6
  433. package/dist/types/message/use-case-secret.d.ts +20 -0
  434. package/dist/types/protocol/appstate.d.ts +47 -0
  435. package/dist/types/protocol/constants.d.ts +8 -3
  436. package/dist/types/protocol/defaults.d.ts +6 -0
  437. package/dist/types/protocol/index.d.ts +2 -11
  438. package/dist/types/protocol/jid.d.ts +22 -5
  439. package/dist/types/protocol/message.d.ts +60 -0
  440. package/dist/types/protocol/nodes.d.ts +4 -0
  441. package/dist/types/protocol/notification.d.ts +2 -0
  442. package/dist/types/protocol/privacy-token.d.ts +17 -0
  443. package/dist/types/protocol/privacy.d.ts +75 -0
  444. package/dist/types/protocol/stream.d.ts +30 -0
  445. package/dist/types/protocol/usync.d.ts +11 -0
  446. package/dist/types/retry/codec.d.ts +3 -0
  447. package/dist/types/retry/index.d.ts +4 -3
  448. package/dist/types/retry/parse.d.ts +5 -2
  449. package/dist/types/retry/replay.d.ts +0 -4
  450. package/dist/types/retry/tracker.d.ts +20 -0
  451. package/dist/types/retry/types.d.ts +10 -4
  452. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +15 -2
  453. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  454. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  455. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  456. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  457. package/dist/types/signal/api/result-map.d.ts +1 -0
  458. package/dist/types/signal/constants.d.ts +0 -3
  459. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  460. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  461. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  462. package/dist/types/signal/index.d.ts +3 -0
  463. package/dist/types/signal/session/SignalProtocol.d.ts +19 -4
  464. package/dist/types/signal/session/resolver.d.ts +22 -0
  465. package/dist/types/store/contracts/appstate.store.d.ts +4 -1
  466. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  467. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  468. package/dist/types/store/contracts/message.store.d.ts +1 -0
  469. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  470. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  471. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  472. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  473. package/dist/types/store/contracts/signal.store.d.ts +13 -0
  474. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  475. package/dist/types/store/createStore.d.ts +1 -1
  476. package/dist/types/store/index.d.ts +5 -13
  477. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  478. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  479. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  480. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  481. package/dist/types/store/locks/message.lock.d.ts +3 -0
  482. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  483. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  484. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  485. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  486. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  487. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  488. package/dist/types/store/providers/memory/appstate.store.d.ts +3 -1
  489. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  490. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  491. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  492. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  493. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  494. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  495. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  496. package/dist/types/store/providers/memory/signal.store.d.ts +8 -1
  497. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  498. package/dist/types/store/types.d.ts +49 -58
  499. package/dist/types/transport/WaWebSocket.d.ts +3 -1
  500. package/dist/types/transport/binary/constants.d.ts +0 -30
  501. package/dist/types/transport/binary/index.d.ts +0 -1
  502. package/dist/types/transport/index.d.ts +2 -1
  503. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  504. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  505. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  506. package/dist/types/transport/node/builders/business.d.ts +29 -0
  507. package/dist/types/transport/node/builders/global.d.ts +102 -0
  508. package/dist/types/transport/node/builders/group.d.ts +4 -6
  509. package/dist/types/transport/node/builders/index.d.ts +7 -3
  510. package/dist/types/transport/node/builders/message.d.ts +20 -30
  511. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  512. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  513. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  514. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  515. package/dist/types/transport/node/builders/retry.d.ts +2 -5
  516. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  517. package/dist/types/transport/node/helpers.d.ts +13 -0
  518. package/dist/types/transport/node/usync.d.ts +2 -0
  519. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  520. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  521. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  522. package/dist/types/transport/proxy.d.ts +6 -0
  523. package/dist/types/transport/stream/parse.d.ts +0 -1
  524. package/dist/types/transport/types.d.ts +18 -1
  525. package/dist/types/util/bytes.d.ts +5 -0
  526. package/dist/types/util/index.d.ts +5 -0
  527. package/dist/types/util/primitives.d.ts +2 -0
  528. package/dist/util/bytes.js +72 -46
  529. package/dist/util/coercion.js +6 -14
  530. package/dist/util/index.js +23 -0
  531. package/dist/util/primitives.js +42 -14
  532. package/package.json +52 -9
  533. package/proto/index.js +1 -1
  534. package/dist/crypto/core/constants.js +0 -4
  535. package/dist/crypto/core/encoding.js +0 -29
  536. package/dist/esm/crypto/core/constants.js +0 -1
  537. package/dist/esm/crypto/core/encoding.js +0 -25
  538. package/dist/esm/retry/outbound.js +0 -83
  539. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  540. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -169
  541. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  542. package/dist/esm/store/providers/sqlite/connection.js +0 -240
  543. package/dist/esm/store/providers/sqlite/contact.store.js +0 -61
  544. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -155
  545. package/dist/esm/store/providers/sqlite/message.store.js +0 -119
  546. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  547. package/dist/esm/store/providers/sqlite/participants.store.js +0 -85
  548. package/dist/esm/store/providers/sqlite/retry.store.js +0 -144
  549. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -203
  550. package/dist/esm/store/providers/sqlite/signal.store.js +0 -353
  551. package/dist/esm/store/providers/sqlite/thread.store.js +0 -72
  552. package/dist/esm/util/base64.js +0 -18
  553. package/dist/esm/util/signal-address.js +0 -5
  554. package/dist/retry/outbound.js +0 -88
  555. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  556. package/dist/store/providers/sqlite/appstate.store.js +0 -173
  557. package/dist/store/providers/sqlite/auth.store.js +0 -180
  558. package/dist/store/providers/sqlite/connection.js +0 -276
  559. package/dist/store/providers/sqlite/contact.store.js +0 -65
  560. package/dist/store/providers/sqlite/device-list.store.js +0 -159
  561. package/dist/store/providers/sqlite/message.store.js +0 -123
  562. package/dist/store/providers/sqlite/migrations.js +0 -350
  563. package/dist/store/providers/sqlite/participants.store.js +0 -89
  564. package/dist/store/providers/sqlite/retry.store.js +0 -148
  565. package/dist/store/providers/sqlite/sender-key.store.js +0 -207
  566. package/dist/store/providers/sqlite/signal.store.js +0 -357
  567. package/dist/store/providers/sqlite/thread.store.js +0 -76
  568. package/dist/types/appstate/store/sqlite.d.ts +0 -21
  569. package/dist/types/crypto/core/constants.d.ts +0 -1
  570. package/dist/types/crypto/core/encoding.d.ts +0 -11
  571. package/dist/types/retry/outbound.d.ts +0 -4
  572. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  573. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -15
  574. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  575. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  576. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -10
  577. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -18
  578. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -11
  579. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  580. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -13
  581. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -16
  582. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -25
  583. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -46
  584. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -11
  585. package/dist/types/util/base64.d.ts +0 -4
  586. package/dist/types/util/signal-address.d.ts +0 -2
  587. package/dist/util/base64.js +0 -24
  588. package/dist/util/signal-address.js +0 -8
  589. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -2,13 +2,16 @@
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");
8
9
  const constants_2 = require("../api/constants");
9
10
  const helpers_1 = require("../../transport/node/helpers");
11
+ const query_1 = require("../../transport/node/query");
10
12
  class SignalIdentitySyncApi {
11
13
  constructor(options) {
14
+ this.syncDedup = new PromiseDedup_1.PromiseDedup();
12
15
  this.logger = options.logger;
13
16
  this.query = options.query;
14
17
  this.signalStore = options.signalStore;
@@ -16,11 +19,36 @@ class SignalIdentitySyncApi {
16
19
  options.defaultTimeoutMs ?? constants_1.WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
17
20
  this.hostDomain = options.hostDomain ?? constants_1.WA_DEFAULTS.HOST_DOMAIN;
18
21
  }
19
- async syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
20
- const normalizedTargets = [...new Set(targetJids.map((jid) => (0, jid_1.normalizeDeviceJid)(jid)))];
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;
29
+ const dedup = new Set();
30
+ for (let index = 0; index < targetJids.length; index += 1) {
31
+ const normalized = (0, jid_1.canonicalizeSignalJid)(targetJids[index], this.hostDomain);
32
+ if (dedup.has(normalized)) {
33
+ continue;
34
+ }
35
+ dedup.add(normalized);
36
+ normalizedTargets[normalizedTargetsCount] = normalized;
37
+ normalizedTargetsCount += 1;
38
+ }
39
+ normalizedTargets.length = normalizedTargetsCount;
21
40
  if (normalizedTargets.length === 0) {
22
41
  return [];
23
42
  }
43
+ const users = new Array(normalizedTargets.length);
44
+ for (let index = 0; index < normalizedTargets.length; index += 1) {
45
+ users[index] = {
46
+ tag: constants_1.WA_NODE_TAGS.USER,
47
+ attrs: {
48
+ jid: normalizedTargets[index]
49
+ }
50
+ };
51
+ }
24
52
  this.logger.debug('signal identity sync request', {
25
53
  targets: normalizedTargets.length,
26
54
  timeoutMs
@@ -36,20 +64,22 @@ class SignalIdentitySyncApi {
36
64
  {
37
65
  tag: constants_1.WA_NODE_TAGS.IDENTITY,
38
66
  attrs: {},
39
- content: normalizedTargets.map((jid) => ({
40
- tag: constants_1.WA_NODE_TAGS.USER,
41
- attrs: { jid }
42
- }))
67
+ content: users
43
68
  }
44
69
  ]
45
70
  }, timeoutMs);
46
71
  const entries = this.parseIdentitySyncResponse(response, normalizedTargets);
47
72
  const { signalStore } = this;
48
73
  if (signalStore && entries.length > 0) {
49
- await signalStore.setRemoteIdentities(entries.map((entry) => ({
50
- address: (0, jid_1.parseSignalAddressFromJid)(entry.jid),
51
- identityKey: (0, keys_1.toSerializedPubKey)(entry.identity)
52
- })));
74
+ const identities = new Array(entries.length);
75
+ for (let index = 0; index < entries.length; index += 1) {
76
+ const entry = entries[index];
77
+ identities[index] = {
78
+ address: (0, jid_1.parseSignalAddressFromJid)(entry.jid),
79
+ identityKey: (0, keys_1.toSerializedPubKey)(entry.identity)
80
+ };
81
+ }
82
+ await signalStore.setRemoteIdentities(identities);
53
83
  }
54
84
  this.logger.debug('signal identity sync success', {
55
85
  requested: normalizedTargets.length,
@@ -58,31 +88,22 @@ class SignalIdentitySyncApi {
58
88
  return entries;
59
89
  }
60
90
  parseIdentitySyncResponse(node, requestedJids) {
61
- if (node.tag !== constants_1.WA_NODE_TAGS.IQ) {
62
- throw new Error(`invalid identity sync response tag: ${node.tag}`);
63
- }
64
- if (node.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
65
- const errorNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.ERROR);
66
- if (!errorNode) {
67
- throw new Error(`identity sync iq error for ${node.attrs.id ?? 'unknown id'}`);
68
- }
69
- const code = errorNode.attrs.code ?? 'unknown';
70
- const text = errorNode.attrs.text ?? errorNode.attrs.type ?? 'unknown';
71
- throw new Error(`identity sync iq error (${code} ${text})`);
72
- }
73
- if (node.attrs.type !== constants_1.WA_IQ_TYPES.RESULT) {
74
- throw new Error(`invalid identity sync response type: ${node.attrs.type ?? 'unknown'}`);
75
- }
91
+ (0, query_1.assertIqResult)(node, 'identity sync');
76
92
  const listNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.LIST);
77
93
  if (!listNode) {
78
94
  throw new Error('identity sync response missing list node');
79
95
  }
80
96
  const requested = new Set(requestedJids);
81
97
  const userNodes = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
82
- return userNodes.flatMap((userNode) => {
83
- const jid = userNode.attrs.jid ? (0, jid_1.normalizeDeviceJid)(userNode.attrs.jid) : '';
98
+ const parsed = new Array(userNodes.length);
99
+ let parsedCount = 0;
100
+ for (let index = 0; index < userNodes.length; index += 1) {
101
+ const userNode = userNodes[index];
102
+ const jid = userNode.attrs.jid
103
+ ? (0, jid_1.canonicalizeSignalJid)(userNode.attrs.jid, this.hostDomain)
104
+ : '';
84
105
  if (!jid || !requested.has(jid)) {
85
- return [];
106
+ continue;
86
107
  }
87
108
  const errorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
88
109
  if (errorNode) {
@@ -91,7 +112,7 @@ class SignalIdentitySyncApi {
91
112
  code: errorNode.attrs.code,
92
113
  text: errorNode.attrs.text
93
114
  });
94
- return [];
115
+ continue;
95
116
  }
96
117
  const identityNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.IDENTITY);
97
118
  if (!identityNode) {
@@ -102,14 +123,23 @@ class SignalIdentitySyncApi {
102
123
  const parsedType = typeNode
103
124
  ? (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(typeNode.content, 'identity sync type', constants_2.SIGNAL_KEY_BUNDLE_TYPE_LENGTH), 'identity sync type')
104
125
  : undefined;
105
- return [
106
- {
126
+ if (parsedType === undefined) {
127
+ parsed[parsedCount] = {
107
128
  jid,
108
- identity,
109
- ...(parsedType !== undefined ? { type: parsedType } : {})
110
- }
111
- ];
112
- });
129
+ identity
130
+ };
131
+ parsedCount += 1;
132
+ continue;
133
+ }
134
+ parsed[parsedCount] = {
135
+ jid,
136
+ identity,
137
+ type: parsedType
138
+ };
139
+ parsedCount += 1;
140
+ }
141
+ parsed.length = parsedCount;
142
+ return parsed;
113
143
  }
114
144
  }
115
145
  exports.SignalIdentitySyncApi = SignalIdentitySyncApi;
@@ -6,17 +6,11 @@ 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");
11
- function parseDeviceId(value, field) {
12
- if (!value) {
13
- throw new Error(`${field} is missing`);
14
- }
15
- const parsed = Number.parseInt(value, 10);
16
- if (!Number.isSafeInteger(parsed) || parsed < 0) {
17
- throw new Error(`${field} is invalid`);
18
- }
19
- return parsed;
12
+ function isMissingPreKeysUserResultPreferred(result) {
13
+ return 'devices' in result;
20
14
  }
21
15
  class SignalMissingPreKeysSyncApi {
22
16
  constructor(options) {
@@ -41,105 +35,130 @@ class SignalMissingPreKeysSyncApi {
41
35
  return parsed;
42
36
  }
43
37
  parseFetchMissingPreKeysResponse(node, requestedTargets) {
44
- if (node.tag !== constants_1.WA_NODE_TAGS.IQ) {
45
- throw new Error(`invalid missing prekeys response tag: ${node.tag}`);
46
- }
47
- if (node.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
48
- const error = (0, query_1.parseIqError)(node);
49
- throw new Error(`missing prekeys iq failed (${error.code}: ${error.text})`);
50
- }
51
- if (node.attrs.type !== constants_1.WA_IQ_TYPES.RESULT) {
52
- throw new Error(`invalid missing prekeys response type: ${node.attrs.type ?? 'unknown'}`);
53
- }
38
+ (0, query_1.assertIqResult)(node, 'missing prekeys');
54
39
  const listNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.LIST);
55
40
  if (!listNode) {
56
41
  throw new Error('missing prekeys response missing list node');
57
42
  }
58
43
  const users = (0, helpers_1.getNodeChildrenByTag)(listNode, constants_1.WA_NODE_TAGS.USER);
59
44
  const parsedByJid = new Map();
45
+ const parsedByCanonicalJid = new Map();
60
46
  for (let index = 0; index < users.length; index += 1) {
61
47
  const userNode = users[index];
62
48
  const userJid = userNode.attrs.jid;
63
49
  if (!userJid) {
64
50
  continue;
65
51
  }
52
+ const canonicalUserJid = (0, jid_1.toUserJid)(userJid, {
53
+ canonicalizeSignalServer: true
54
+ });
66
55
  const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
67
56
  if (userErrorNode) {
68
57
  const parsedCode = Number.parseInt(userErrorNode.attrs.code ?? '', 10);
69
- parsedByJid.set(userJid, {
58
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
70
59
  userJid,
71
60
  errorCode: Number.isSafeInteger(parsedCode) ? parsedCode : undefined,
72
61
  errorText: userErrorNode.attrs.text ?? userErrorNode.attrs.type ?? 'unknown'
73
- });
62
+ }, isMissingPreKeysUserResultPreferred);
74
63
  continue;
75
64
  }
76
- parsedByJid.set(userJid, {
65
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, userJid, canonicalUserJid, {
77
66
  userJid,
78
- devices: this.parseUserDevices(userNode, userJid)
79
- });
67
+ devices: this.parseUserDevices(userNode, canonicalUserJid)
68
+ }, isMissingPreKeysUserResultPreferred);
80
69
  }
81
- return requestedTargets.map((target) => {
82
- return (parsedByJid.get(target.userJid) ?? {
70
+ const results = new Array(requestedTargets.length);
71
+ for (let index = 0; index < requestedTargets.length; index += 1) {
72
+ const target = requestedTargets[index];
73
+ results[index] = parsedByJid.get(target.userJid) ??
74
+ parsedByCanonicalJid.get((0, jid_1.toUserJid)(target.userJid, {
75
+ canonicalizeSignalServer: true
76
+ })) ?? {
83
77
  userJid: target.userJid,
84
78
  errorText: 'missing user in key_fetch response'
85
- });
86
- });
79
+ };
80
+ }
81
+ return results;
87
82
  }
88
83
  parseUserDevices(node, userJid) {
89
84
  const { user, server } = (0, jid_1.splitJid)(userJid);
90
85
  const devices = (0, helpers_1.getNodeChildrenByTag)(node, constants_1.WA_NODE_TAGS.DEVICE);
91
- return devices.map((deviceNode, index) => {
92
- const deviceId = parseDeviceId(deviceNode.attrs.id, `missing prekeys user[${userJid}] device[${index}].id`);
93
- const registrationNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.REGISTRATION);
94
- const identityNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.IDENTITY);
95
- const signedKeyNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.SKEY);
86
+ const bundles = new Array(devices.length);
87
+ for (let index = 0; index < devices.length; index += 1) {
88
+ const deviceNode = devices[index];
89
+ const deviceIdValue = deviceNode.attrs.id;
90
+ if (!deviceIdValue) {
91
+ throw new Error(`missing prekeys device[${index}].id is missing`);
92
+ }
93
+ const deviceId = Number.parseInt(deviceIdValue, 10);
94
+ if (!Number.isSafeInteger(deviceId) || deviceId < 0) {
95
+ throw new Error(`missing prekeys device[${index}].id is invalid`);
96
+ }
97
+ const [registrationNode, identityNode, signedKeyNode, oneTimeNode, deviceIdentityNode] = (0, helpers_1.findNodeChildrenByTags)(deviceNode, [
98
+ constants_1.WA_NODE_TAGS.REGISTRATION,
99
+ constants_1.WA_NODE_TAGS.IDENTITY,
100
+ constants_1.WA_NODE_TAGS.SKEY,
101
+ constants_1.WA_NODE_TAGS.KEY,
102
+ constants_1.WA_NODE_TAGS.DEVICE_IDENTITY
103
+ ]);
96
104
  if (!registrationNode || !identityNode || !signedKeyNode) {
97
105
  throw new Error(`missing prekeys device payload is incomplete for ${userJid}`);
98
106
  }
99
- const signedKeyIdNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.ID);
100
- const signedKeyValueNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.VALUE);
101
- const signedKeySignatureNode = (0, helpers_1.findNodeChild)(signedKeyNode, constants_1.WA_NODE_TAGS.SIGNATURE);
107
+ const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = (0, helpers_1.findNodeChildrenByTags)(signedKeyNode, [
108
+ constants_1.WA_NODE_TAGS.ID,
109
+ constants_1.WA_NODE_TAGS.VALUE,
110
+ constants_1.WA_NODE_TAGS.SIGNATURE
111
+ ]);
102
112
  if (!signedKeyIdNode || !signedKeyValueNode || !signedKeySignatureNode) {
103
113
  throw new Error(`missing prekeys signed pre-key is incomplete for ${userJid}`);
104
114
  }
105
- const oneTimeNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.KEY);
106
- const oneTimeIdNode = oneTimeNode
107
- ? (0, helpers_1.findNodeChild)(oneTimeNode, constants_1.WA_NODE_TAGS.ID)
108
- : undefined;
109
- const oneTimeValueNode = oneTimeNode
110
- ? (0, helpers_1.findNodeChild)(oneTimeNode, constants_1.WA_NODE_TAGS.VALUE)
111
- : undefined;
115
+ let oneTimeIdNode;
116
+ let oneTimeValueNode;
117
+ if (oneTimeNode) {
118
+ const oneTimeNodes = (0, helpers_1.findNodeChildrenByTags)(oneTimeNode, [
119
+ constants_1.WA_NODE_TAGS.ID,
120
+ constants_1.WA_NODE_TAGS.VALUE
121
+ ]);
122
+ oneTimeIdNode = oneTimeNodes[0];
123
+ oneTimeValueNode = oneTimeNodes[1];
124
+ }
112
125
  if (oneTimeNode && (!oneTimeIdNode || !oneTimeValueNode)) {
113
126
  throw new Error(`missing prekeys one-time key is incomplete for ${userJid}`);
114
127
  }
115
- const deviceIdentityNode = (0, helpers_1.findNodeChild)(deviceNode, constants_1.WA_NODE_TAGS.DEVICE_IDENTITY);
116
- const bundle = {
128
+ const baseBundle = {
117
129
  regId: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(registrationNode.content, 'missing prekeys device registration', constants_2.SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration'),
118
130
  identity: (0, codec_1.decodeExactLength)(identityNode.content, 'missing prekeys device identity', constants_2.SIGNAL_KEY_DATA_LENGTH),
119
131
  signedKey: {
120
132
  id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(signedKeyIdNode.content, 'missing prekeys device skey.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'missing prekeys device skey.id'),
121
133
  publicKey: (0, codec_1.decodeExactLength)(signedKeyValueNode.content, 'missing prekeys device skey.value', constants_2.SIGNAL_KEY_DATA_LENGTH),
122
134
  signature: (0, codec_1.decodeExactLength)(signedKeySignatureNode.content, 'missing prekeys device skey.signature', constants_2.SIGNAL_SIGNATURE_LENGTH)
123
- },
124
- ...(oneTimeIdNode && oneTimeValueNode
125
- ? {
126
- oneTimeKey: {
127
- id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(oneTimeIdNode.content, 'missing prekeys device key.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'missing prekeys device key.id'),
128
- publicKey: (0, codec_1.decodeExactLength)(oneTimeValueNode.content, 'missing prekeys device key.value', constants_2.SIGNAL_KEY_DATA_LENGTH)
129
- }
130
- }
131
- : {})
135
+ }
132
136
  };
133
- return {
134
- deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
135
- bundle,
136
- ...(deviceIdentityNode
137
- ? {
138
- deviceIdentity: (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'missing prekeys device device-identity')
137
+ const bundle = oneTimeIdNode && oneTimeValueNode
138
+ ? {
139
+ ...baseBundle,
140
+ oneTimeKey: {
141
+ id: (0, codec_1.parseUint)((0, codec_1.decodeExactLength)(oneTimeIdNode.content, 'missing prekeys device key.id', constants_2.SIGNAL_KEY_ID_LENGTH), 'missing prekeys device key.id'),
142
+ publicKey: (0, codec_1.decodeExactLength)(oneTimeValueNode.content, 'missing prekeys device key.value', constants_2.SIGNAL_KEY_DATA_LENGTH)
139
143
  }
140
- : {})
141
- };
142
- });
144
+ }
145
+ : baseBundle;
146
+ let deviceIdentity;
147
+ if (deviceIdentityNode) {
148
+ deviceIdentity = (0, helpers_1.decodeNodeContentBase64OrBytes)(deviceIdentityNode.content, 'missing prekeys device device-identity');
149
+ }
150
+ bundles[index] = deviceIdentity
151
+ ? {
152
+ deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
153
+ bundle,
154
+ deviceIdentity
155
+ }
156
+ : {
157
+ deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
158
+ bundle
159
+ };
160
+ }
161
+ return bundles;
143
162
  }
144
163
  }
145
164
  exports.SignalMissingPreKeysSyncApi = SignalMissingPreKeysSyncApi;
@@ -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,9 +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");
10
+ const query_1 = require("../../transport/node/query");
11
+ function isKeyBundleResultPreferred(result) {
12
+ return 'bundle' in result;
13
+ }
8
14
  class SignalSessionSyncApi {
9
15
  constructor(options) {
10
16
  this.logger = options.logger;
@@ -43,7 +49,22 @@ class SignalSessionSyncApi {
43
49
  reasonIdentity: (previous?.reasonIdentity ?? false) || target.reasonIdentity === true
44
50
  });
45
51
  }
46
- const mergedTargets = [...targetByJid.values()];
52
+ const mergedTargets = new Array(targetByJid.size);
53
+ let mergedTargetsCount = 0;
54
+ for (const target of targetByJid.values()) {
55
+ mergedTargets[mergedTargetsCount] = target;
56
+ mergedTargetsCount += 1;
57
+ }
58
+ const userNodes = new Array(mergedTargets.length);
59
+ for (let index = 0; index < mergedTargets.length; index += 1) {
60
+ const target = mergedTargets[index];
61
+ userNodes[index] = {
62
+ tag: constants_1.WA_NODE_TAGS.USER,
63
+ attrs: target.reasonIdentity === true
64
+ ? { jid: target.jid, reason: 'identity' }
65
+ : { jid: target.jid }
66
+ };
67
+ }
47
68
  this.logger.debug('signal fetch key bundles request', {
48
69
  targets: mergedTargets.length,
49
70
  timeoutMs
@@ -59,34 +80,14 @@ class SignalSessionSyncApi {
59
80
  {
60
81
  tag: constants_1.WA_NODE_TAGS.KEY,
61
82
  attrs: {},
62
- content: mergedTargets.map((target) => ({
63
- tag: constants_1.WA_NODE_TAGS.USER,
64
- attrs: {
65
- jid: target.jid,
66
- ...(target.reasonIdentity === true ? { reason: 'identity' } : {})
67
- }
68
- }))
83
+ content: userNodes
69
84
  }
70
85
  ]
71
86
  }, timeoutMs);
72
87
  return this.parseFetchKeyBundleResponse(responseNode, mergedTargets);
73
88
  }
74
89
  parseFetchKeyBundleResponse(node, requestedTargets) {
75
- if (node.tag !== constants_1.WA_NODE_TAGS.IQ) {
76
- throw new Error(`invalid key bundle response tag: ${node.tag}`);
77
- }
78
- if (node.attrs.type === constants_1.WA_IQ_TYPES.ERROR) {
79
- const errorNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.ERROR);
80
- if (!errorNode) {
81
- throw new Error(`key bundle iq error for ${node.attrs.id ?? 'unknown id'}`);
82
- }
83
- const code = errorNode.attrs.code ?? 'unknown';
84
- const text = errorNode.attrs.text ?? errorNode.attrs.type ?? 'unknown';
85
- throw new Error(`key bundle iq error (${code} ${text})`);
86
- }
87
- if (node.attrs.type !== constants_1.WA_IQ_TYPES.RESULT) {
88
- throw new Error(`invalid key bundle response type: ${node.attrs.type ?? 'unknown'}`);
89
- }
90
+ (0, query_1.assertIqResult)(node, 'key bundle');
90
91
  const listNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.LIST);
91
92
  if (!listNode) {
92
93
  throw new Error('key bundle response missing list node');
@@ -96,6 +97,7 @@ class SignalSessionSyncApi {
96
97
  throw new Error('key bundle response list is empty');
97
98
  }
98
99
  const parsedByJid = new Map();
100
+ const parsedByCanonicalJid = new Map();
99
101
  for (let index = 0; index < userNodes.length; index += 1) {
100
102
  const userNode = userNodes[index];
101
103
  const jid = userNode.attrs.jid;
@@ -104,30 +106,30 @@ class SignalSessionSyncApi {
104
106
  }
105
107
  const userErrorNode = (0, helpers_1.findNodeChild)(userNode, constants_1.WA_NODE_TAGS.ERROR);
106
108
  if (userErrorNode) {
107
- parsedByJid.set(jid, {
109
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
108
110
  jid,
109
111
  errorCode: userErrorNode.attrs.code,
110
112
  errorText: userErrorNode.attrs.text ?? 'unknown'
111
- });
113
+ }, isKeyBundleResultPreferred);
112
114
  continue;
113
115
  }
114
116
  const parsed = this.parseUserKeyBundle(userNode);
115
- parsedByJid.set(jid, {
117
+ (0, result_map_1.registerParsedResultByRawAndCanonicalKey)(parsedByJid, parsedByCanonicalJid, jid, (0, jid_1.canonicalizeSignalJid)(jid, this.hostDomain), {
116
118
  jid,
117
119
  bundle: parsed.bundle,
118
120
  ...(parsed.deviceIdentity ? { deviceIdentity: parsed.deviceIdentity } : {})
119
- });
121
+ }, isKeyBundleResultPreferred);
120
122
  }
121
- return requestedTargets.map((target) => {
122
- const parsed = parsedByJid.get(target.jid);
123
- if (parsed) {
124
- return parsed;
125
- }
126
- return {
123
+ const output = new Array(requestedTargets.length);
124
+ for (let index = 0; index < requestedTargets.length; index += 1) {
125
+ const target = requestedTargets[index];
126
+ output[index] = parsedByJid.get(target.jid) ??
127
+ parsedByCanonicalJid.get((0, jid_1.canonicalizeSignalJid)(target.jid, this.hostDomain)) ?? {
127
128
  jid: target.jid,
128
129
  errorText: 'missing key bundle user in response'
129
130
  };
130
- });
131
+ }
132
+ return output;
131
133
  }
132
134
  parseUserKeyBundle(node) {
133
135
  const registrationNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_NODE_TAGS.REGISTRATION);
@@ -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;
@@ -25,17 +25,21 @@ async function verifySignalSignature(publicKey, message, signature) {
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
- if (privateKey.length !== 32) {
37
- throw new Error(`invalid curve25519 private key length ${privateKey.length}`);
38
- }
42
+ (0, bytes_1.assertByteLength)(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
39
43
  const clampedPrivateKey = (0, X25519_1.clampCurvePrivateKeyInPlace)(privateKey);
40
44
  const privateScalar = (0, le_1.bytesToBigIntLE)(clampedPrivateKey);
41
45
  const encodedPublic = (0, edwards_1.encodeExtendedPoint)((0, edwards_1.scalarMultBase)(privateScalar));