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
@@ -0,0 +1,43 @@
1
+ import { setBoundedMapEntry } from '../../../util/collections.js';
2
+ const DEFAULT_MAX_ENTRIES = 10000;
3
+ export class WaPrivacyTokenMemoryStore {
4
+ constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
5
+ this.records = new Map();
6
+ this.maxEntries = maxEntries;
7
+ }
8
+ async upsert(record) {
9
+ const existing = this.records.get(record.jid);
10
+ const merged = existing ? this.mergeRecord(existing, record) : record;
11
+ setBoundedMapEntry(this.records, record.jid, merged, this.maxEntries);
12
+ }
13
+ async upsertBatch(records) {
14
+ for (let i = 0; i < records.length; i += 1) {
15
+ const record = records[i];
16
+ const existing = this.records.get(record.jid);
17
+ const merged = existing ? this.mergeRecord(existing, record) : record;
18
+ setBoundedMapEntry(this.records, record.jid, merged, this.maxEntries);
19
+ }
20
+ }
21
+ async getByJid(jid) {
22
+ return this.records.get(jid) ?? null;
23
+ }
24
+ async deleteByJid(jid) {
25
+ return this.records.delete(jid) ? 1 : 0;
26
+ }
27
+ async clear() {
28
+ this.records.clear();
29
+ }
30
+ async destroy() {
31
+ this.records.clear();
32
+ }
33
+ mergeRecord(existing, incoming) {
34
+ return {
35
+ jid: incoming.jid,
36
+ tcToken: incoming.tcToken ?? existing.tcToken,
37
+ tcTokenTimestamp: incoming.tcTokenTimestamp ?? existing.tcTokenTimestamp,
38
+ tcTokenSenderTimestamp: incoming.tcTokenSenderTimestamp ?? existing.tcTokenSenderTimestamp,
39
+ nctSalt: incoming.nctSalt ?? existing.nctSalt,
40
+ updatedAtMs: incoming.updatedAtMs
41
+ };
42
+ }
43
+ }
@@ -1,8 +1,9 @@
1
1
  import { resolveCleanupIntervalMs } from '../../../util/collections.js';
2
- const DEFAULT_RETRY_TTL_MS = 7 * 24 * 60 * 60 * 1000;
2
+ const DEFAULT_RETRY_TTL_MS = 60 * 1000;
3
3
  export class WaRetryMemoryStore {
4
4
  constructor(ttlMs = DEFAULT_RETRY_TTL_MS) {
5
5
  this.outboundMessages = new Map();
6
+ this.eligibleSets = new Map();
6
7
  this.inboundCounters = new Map();
7
8
  this.ttlMs = ttlMs;
8
9
  this.cleanupTimer = setInterval(() => {
@@ -13,8 +14,66 @@ export class WaRetryMemoryStore {
13
14
  getTtlMs() {
14
15
  return this.ttlMs;
15
16
  }
17
+ supportsRawReplayPayload() {
18
+ return true;
19
+ }
20
+ async getOutboundRequesterStatus(messageId, requesterDeviceJid) {
21
+ const current = this.outboundMessages.get(messageId);
22
+ if (!current) {
23
+ return null;
24
+ }
25
+ const eligible = current.eligibleRequesterDeviceJids;
26
+ if (!eligible || eligible.length === 0) {
27
+ return null;
28
+ }
29
+ const eligibleSet = this.eligibleSets.get(current.messageId);
30
+ let isEligible = false;
31
+ if (eligibleSet) {
32
+ isEligible = eligibleSet.has(requesterDeviceJid);
33
+ }
34
+ else {
35
+ for (let index = 0; index < eligible.length; index += 1) {
36
+ if (eligible[index] === requesterDeviceJid) {
37
+ isEligible = true;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ if (!isEligible) {
43
+ return { eligible: false, delivered: false };
44
+ }
45
+ const delivered = current.deliveredRequesterDeviceJids;
46
+ if (!delivered || delivered.length === 0) {
47
+ return { eligible: true, delivered: false };
48
+ }
49
+ for (let index = 0; index < delivered.length; index += 1) {
50
+ if (delivered[index] === requesterDeviceJid) {
51
+ return { eligible: true, delivered: true };
52
+ }
53
+ }
54
+ return { eligible: true, delivered: false };
55
+ }
16
56
  async upsertOutboundMessage(record) {
17
- this.outboundMessages.set(record.messageId, record);
57
+ this.outboundMessages.set(record.messageId, {
58
+ ...record,
59
+ eligibleRequesterDeviceJids: record.eligibleRequesterDeviceJids
60
+ ? [...record.eligibleRequesterDeviceJids]
61
+ : undefined,
62
+ deliveredRequesterDeviceJids: record.deliveredRequesterDeviceJids
63
+ ? [...record.deliveredRequesterDeviceJids]
64
+ : undefined
65
+ });
66
+ if (record.eligibleRequesterDeviceJids && record.eligibleRequesterDeviceJids.length > 0) {
67
+ this.eligibleSets.set(record.messageId, new Set(record.eligibleRequesterDeviceJids));
68
+ }
69
+ else {
70
+ this.eligibleSets.delete(record.messageId);
71
+ }
72
+ }
73
+ async deleteOutboundMessage(messageId) {
74
+ const existed = this.outboundMessages.delete(messageId);
75
+ this.eligibleSets.delete(messageId);
76
+ return existed ? 1 : 0;
18
77
  }
19
78
  async getOutboundMessage(messageId) {
20
79
  return this.outboundMessages.get(messageId) ?? null;
@@ -31,6 +90,20 @@ export class WaRetryMemoryStore {
31
90
  expiresAtMs
32
91
  });
33
92
  }
93
+ async markOutboundRequesterDelivered(messageId, requesterDeviceJid, updatedAtMs, expiresAtMs) {
94
+ const current = this.outboundMessages.get(messageId);
95
+ if (!current) {
96
+ return;
97
+ }
98
+ const delivered = new Set(current.deliveredRequesterDeviceJids ?? []);
99
+ delivered.add(requesterDeviceJid);
100
+ this.outboundMessages.set(messageId, {
101
+ ...current,
102
+ deliveredRequesterDeviceJids: Array.from(delivered),
103
+ updatedAtMs,
104
+ expiresAtMs
105
+ });
106
+ }
34
107
  async incrementInboundCounter(messageId, requesterJid, _updatedAtMs, expiresAtMs) {
35
108
  const key = this.counterKey(messageId, requesterJid);
36
109
  const current = this.inboundCounters.get(key);
@@ -47,6 +120,7 @@ export class WaRetryMemoryStore {
47
120
  if (record.expiresAtMs > nowMs)
48
121
  continue;
49
122
  this.outboundMessages.delete(messageId);
123
+ this.eligibleSets.delete(messageId);
50
124
  removed += 1;
51
125
  }
52
126
  for (const [key, record] of this.inboundCounters) {
@@ -59,6 +133,7 @@ export class WaRetryMemoryStore {
59
133
  }
60
134
  async clear() {
61
135
  this.outboundMessages.clear();
136
+ this.eligibleSets.clear();
62
137
  this.inboundCounters.clear();
63
138
  }
64
139
  async destroy() {
@@ -1,6 +1,6 @@
1
+ import { signalAddressKey } from '../../../protocol/jid.js';
1
2
  import { resolvePositive } from '../../../util/coercion.js';
2
3
  import { setBoundedMapEntry } from '../../../util/collections.js';
3
- import { signalAddressKey } from '../../../util/signal-address.js';
4
4
  const DEFAULT_SENDER_KEY_STORE_LIMITS = Object.freeze({
5
5
  senderKeys: 8192,
6
6
  senderDistributions: 8192
@@ -45,12 +45,13 @@ export class SenderKeyMemoryStore {
45
45
  const record = this.senderKeys.get(this.makeKey(groupId, sender));
46
46
  return record ?? null;
47
47
  }
48
- async getDeviceSenderKeyDistribution(groupId, sender) {
49
- const record = this.senderDistributions.get(this.makeKey(groupId, sender));
50
- return record ?? null;
51
- }
52
48
  async getDeviceSenderKeyDistributions(groupId, senders) {
53
- return senders.map((sender) => this.senderDistributions.get(this.makeKey(groupId, sender)) ?? null);
49
+ const records = new Array(senders.length);
50
+ for (let index = 0; index < senders.length; index += 1) {
51
+ records[index] =
52
+ this.senderDistributions.get(this.makeKey(groupId, senders[index])) ?? null;
53
+ }
54
+ return records;
54
55
  }
55
56
  async deleteDeviceSenderKey(target, groupId) {
56
57
  let deleted = 0;
@@ -60,8 +61,10 @@ export class SenderKeyMemoryStore {
60
61
  }
61
62
  async markForgetSenderKey(groupId, participants) {
62
63
  let deleted = 0;
63
- for (const participant of participants) {
64
- deleted += await this.deleteDeviceSenderKey(participant, groupId);
64
+ for (let index = 0; index < participants.length; index += 1) {
65
+ const participant = participants[index];
66
+ deleted += this.deleteMatching(this.senderKeys, participant, groupId);
67
+ deleted += this.deleteMatching(this.senderDistributions, participant, groupId);
65
68
  }
66
69
  return deleted;
67
70
  }
@@ -1,6 +1,6 @@
1
+ import { signalAddressKey } from '../../../protocol/jid.js';
1
2
  import { resolvePositive } from '../../../util/coercion.js';
2
3
  import { setBoundedMapEntry } from '../../../util/collections.js';
3
- import { signalAddressKey } from '../../../util/signal-address.js';
4
4
  const DEFAULT_SIGNAL_STORE_LIMITS = Object.freeze({
5
5
  preKeys: 4096,
6
6
  sessions: 8192,
@@ -58,12 +58,15 @@ export class WaSignalMemoryStore {
58
58
  throw new Error(`invalid prekey count: ${count}`);
59
59
  }
60
60
  const available = [];
61
- const sortedIds = [...this.preKeys.keys()].sort((left, right) => left - right);
62
- for (let index = 0; index < sortedIds.length; index += 1) {
63
- const keyId = sortedIds[index];
64
- if (this.uploadedPreKeys.has(keyId)) {
65
- continue;
61
+ const availableKeyIds = [];
62
+ for (const keyId of this.preKeys.keys()) {
63
+ if (!this.uploadedPreKeys.has(keyId)) {
64
+ availableKeyIds.push(keyId);
66
65
  }
66
+ }
67
+ availableKeyIds.sort((left, right) => left - right);
68
+ for (let index = 0; index < availableKeyIds.length; index += 1) {
69
+ const keyId = availableKeyIds[index];
67
70
  const record = this.preKeys.get(keyId);
68
71
  if (!record) {
69
72
  continue;
@@ -86,7 +89,11 @@ export class WaSignalMemoryStore {
86
89
  return this.preKeys.get(keyId) ?? null;
87
90
  }
88
91
  async getPreKeysById(keyIds) {
89
- return keyIds.map((keyId) => this.preKeys.get(keyId) ?? null);
92
+ const result = new Array(keyIds.length);
93
+ for (let i = 0; i < keyIds.length; i += 1) {
94
+ result[i] = this.preKeys.get(keyIds[i]) ?? null;
95
+ }
96
+ return result;
90
97
  }
91
98
  async consumePreKeyById(keyId) {
92
99
  const record = this.preKeys.get(keyId) ?? null;
@@ -117,24 +124,56 @@ export class WaSignalMemoryStore {
117
124
  async getServerHasPreKeys() {
118
125
  return this.serverHasPreKeys;
119
126
  }
127
+ async getSignalMeta() {
128
+ return {
129
+ serverHasPreKeys: this.serverHasPreKeys,
130
+ signedPreKeyRotationTs: this.signedPreKeyRotationTs,
131
+ registrationInfo: this.registrationInfo,
132
+ signedPreKey: this.signedPreKey
133
+ };
134
+ }
120
135
  async hasSession(address) {
121
136
  return this.signalSessions.has(signalAddressKey(address));
122
137
  }
123
138
  async hasSessions(addresses) {
124
- return addresses.map((address) => this.signalSessions.has(signalAddressKey(address)));
139
+ const result = new Array(addresses.length);
140
+ for (let i = 0; i < addresses.length; i += 1) {
141
+ result[i] = this.signalSessions.has(signalAddressKey(addresses[i]));
142
+ }
143
+ return result;
125
144
  }
126
145
  async getSession(address) {
127
146
  return this.signalSessions.get(signalAddressKey(address)) ?? null;
128
147
  }
148
+ async getSessionsBatch(addresses) {
149
+ const result = new Array(addresses.length);
150
+ for (let i = 0; i < addresses.length; i += 1) {
151
+ result[i] = this.signalSessions.get(signalAddressKey(addresses[i])) ?? null;
152
+ }
153
+ return result;
154
+ }
129
155
  async setSession(address, session) {
130
156
  setBoundedMapEntry(this.signalSessions, signalAddressKey(address), session, this.maxSessions);
131
157
  }
158
+ async setSessionsBatch(entries) {
159
+ for (let index = 0; index < entries.length; index += 1) {
160
+ const entry = entries[index];
161
+ setBoundedMapEntry(this.signalSessions, signalAddressKey(entry.address), entry.session, this.maxSessions);
162
+ }
163
+ }
132
164
  async deleteSession(address) {
133
165
  this.signalSessions.delete(signalAddressKey(address));
134
166
  }
135
167
  async getRemoteIdentity(address) {
136
168
  return this.remoteIdentities.get(signalAddressKey(address)) ?? null;
137
169
  }
170
+ async getRemoteIdentities(addresses) {
171
+ const result = new Array(addresses.length);
172
+ for (let i = 0; i < addresses.length; i += 1) {
173
+ result[i] = this.remoteIdentities.get(signalAddressKey(addresses[i])) ?? null;
174
+ }
175
+ return result;
176
+ }
138
177
  async setRemoteIdentity(address, identityKey) {
139
178
  setBoundedMapEntry(this.remoteIdentities, signalAddressKey(address), identityKey, this.maxRemoteIdentities);
140
179
  }
@@ -155,16 +194,6 @@ export class WaSignalMemoryStore {
155
194
  this.nextPreKeyId = 1;
156
195
  }
157
196
  addUploadedPreKey(keyId) {
158
- if (this.uploadedPreKeys.has(keyId)) {
159
- this.uploadedPreKeys.delete(keyId);
160
- }
161
197
  this.uploadedPreKeys.add(keyId);
162
- while (this.uploadedPreKeys.size > this.maxPreKeys) {
163
- const oldest = this.uploadedPreKeys.values().next().value;
164
- if (oldest === undefined) {
165
- break;
166
- }
167
- this.uploadedPreKeys.delete(oldest);
168
- }
169
198
  }
170
199
  }
@@ -11,6 +11,11 @@ export class WaThreadMemoryStore {
11
11
  async upsert(record) {
12
12
  setBoundedMapEntry(this.threads, record.jid, record, this.maxThreads);
13
13
  }
14
+ async upsertBatch(records) {
15
+ for (const record of records) {
16
+ setBoundedMapEntry(this.threads, record.jid, record, this.maxThreads);
17
+ }
18
+ }
14
19
  async getByJid(jid) {
15
20
  return this.threads.get(jid) ?? null;
16
21
  }
@@ -3,7 +3,7 @@ import { BoundedTaskQueue, BoundedTaskQueueFullError } from '../infra/perf/Bound
3
3
  import { WA_DEFAULTS } from '../protocol/constants.js';
4
4
  import { WaNoiseSession } from './noise/WaNoiseSession.js';
5
5
  import { WaWebSocket } from './WaWebSocket.js';
6
- import { bytesToBase64UrlSafe } from '../util/base64.js';
6
+ import { bytesToBase64UrlSafe } from '../util/bytes.js';
7
7
  import { EMPTY_BYTES } from '../util/bytes.js';
8
8
  import { toError } from '../util/primitives.js';
9
9
  const WA_FRAME_HANDLER_QUEUE_MAX_SIZE = 4096;
@@ -27,6 +27,8 @@ export class WaComms {
27
27
  url: this.config.url,
28
28
  urls: this.config.urls,
29
29
  protocols: this.config.protocols,
30
+ dispatcher: this.config.dispatcher,
31
+ agent: this.config.agent,
30
32
  timeoutIntervalMs: this.config.timeoutIntervalMs
31
33
  }, logger);
32
34
  this.socket.setHandlers({
@@ -144,9 +146,7 @@ export class WaComms {
144
146
  startHandlingRequests() {
145
147
  this.handlingRequests = true;
146
148
  this.logger.debug('comms request handling enabled');
147
- this.frameProcessingQueue = this.frameProcessingQueue
148
- .catch(() => undefined)
149
- .then(async () => this.flushPendingFrames());
149
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.flushPendingFrames(), () => this.flushPendingFrames());
150
150
  }
151
151
  async stopComms() {
152
152
  this.logger.info('comms stop requested');
@@ -272,9 +272,7 @@ export class WaComms {
272
272
  });
273
273
  }
274
274
  onSocketMessage(payload) {
275
- this.frameProcessingQueue = this.frameProcessingQueue
276
- .catch(() => undefined)
277
- .then(async () => this.processSocketPayload(payload));
275
+ this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.processSocketPayload(payload), () => this.processSocketPayload(payload));
278
276
  }
279
277
  async processSocketPayload(payload) {
280
278
  if (!this.noiseSession) {
@@ -401,7 +399,9 @@ export class WaComms {
401
399
  this.schedulePendingFramesOverflowClose();
402
400
  return false;
403
401
  }
404
- this.pendingFrames.push(...frames);
402
+ for (let i = 0; i < frames.length; i += 1) {
403
+ this.pendingFrames.push(frames[i]);
404
+ }
405
405
  this.pendingFramesByteLength = nextBytes;
406
406
  return true;
407
407
  }
@@ -423,20 +423,19 @@ export class WaComms {
423
423
  }
424
424
  scheduleDecodedFrame(frame) {
425
425
  void this.frameHandlerQueue
426
- .enqueue(async () => this.onDecodedFrame(frame))
426
+ .enqueue(() => this.onDecodedFrame(frame))
427
427
  .catch((error) => {
428
- const normalized = toError(error);
429
- this.logger.error('failed to enqueue decoded frame handler', {
430
- message: normalized.message
431
- });
432
- if (!(error instanceof BoundedTaskQueueFullError)) {
428
+ if (error instanceof BoundedTaskQueueFullError) {
429
+ this.logger.warn('frame handler queue is full, resuming socket to preserve bounds', {
430
+ pending: this.frameHandlerQueue.pending(),
431
+ inFlight: this.frameHandlerQueue.inFlight()
432
+ });
433
+ void this.closeSocketAndResume();
433
434
  return;
434
435
  }
435
- this.logger.warn('frame handler queue is full, processing frame inline', {
436
- pending: this.frameHandlerQueue.pending(),
437
- inFlight: this.frameHandlerQueue.inFlight()
436
+ this.logger.error('failed to enqueue decoded frame handler', {
437
+ message: toError(error).message
438
438
  });
439
- void this.onDecodedFrame(frame);
440
439
  });
441
440
  }
442
441
  scheduleReconnect() {
@@ -460,12 +459,16 @@ export class WaComms {
460
459
  this.reconnectTimer = null;
461
460
  }
462
461
  removeWaiter(reject) {
463
- const index = this.waiters.findIndex((entry) => entry.reject === reject);
464
- if (index === -1) {
462
+ for (let index = 0; index < this.waiters.length; index += 1) {
463
+ const waiter = this.waiters[index];
464
+ if (waiter.reject !== reject) {
465
+ continue;
466
+ }
467
+ clearTimeout(waiter.timer);
468
+ this.waiters[index] = this.waiters[this.waiters.length - 1];
469
+ this.waiters.pop();
465
470
  return;
466
471
  }
467
- const [waiter] = this.waiters.splice(index, 1);
468
- clearTimeout(waiter.timer);
469
472
  }
470
473
  withStickyRoutingCookie(headers) {
471
474
  const out = headers ? { ...headers } : {};
@@ -518,10 +521,11 @@ export class WaComms {
518
521
  }
519
522
  }
520
523
  drainWaiters(drain) {
521
- const waiters = this.waiters.splice(0, this.waiters.length);
522
- for (const waiter of waiters) {
524
+ for (let index = this.waiters.length - 1; index >= 0; index -= 1) {
525
+ const waiter = this.waiters[index];
523
526
  clearTimeout(waiter.timer);
524
527
  drain(waiter);
525
528
  }
529
+ this.waiters.length = 0;
526
530
  }
527
531
  }
@@ -2,6 +2,45 @@ import { ConsoleLogger } from '../infra/log/ConsoleLogger.js';
2
2
  import { WA_DEFAULTS, WA_READY_STATES } from '../protocol/constants.js';
3
3
  import { TEXT_ENCODER, toBytesView } from '../util/bytes.js';
4
4
  import { toError } from '../util/primitives.js';
5
+ const WS_OPTIONAL_MODULE = 'ws';
6
+ function asOptionalNodeWsConstructor(loaded) {
7
+ if (loaded && typeof loaded === 'object') {
8
+ const direct = loaded.WebSocket;
9
+ if (typeof direct === 'function') {
10
+ return direct;
11
+ }
12
+ const fallback = loaded.default;
13
+ if (typeof fallback === 'function') {
14
+ return fallback;
15
+ }
16
+ }
17
+ if (typeof loaded === 'function') {
18
+ return loaded;
19
+ }
20
+ return null;
21
+ }
22
+ async function loadOptionalNodeWsConstructor() {
23
+ try {
24
+ const loaded = await import(WS_OPTIONAL_MODULE);
25
+ const constructor = asOptionalNodeWsConstructor(loaded);
26
+ if (constructor) {
27
+ return constructor;
28
+ }
29
+ throw new Error('invalid ws module export');
30
+ }
31
+ catch (error) {
32
+ const normalized = toError(error);
33
+ const code = normalized.code;
34
+ const message = normalized.message ?? '';
35
+ const isModuleNotFound = (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') &&
36
+ (message.includes(`'${WS_OPTIONAL_MODULE}'`) ||
37
+ message.includes(`"${WS_OPTIONAL_MODULE}"`));
38
+ if (isModuleNotFound) {
39
+ throw new Error('optional dependency "ws" is not installed. Install with: npm i ws');
40
+ }
41
+ throw normalized;
42
+ }
43
+ }
5
44
  function resolveWebSocketConstructor() {
6
45
  const ctor = globalThis
7
46
  .WebSocket;
@@ -13,12 +52,13 @@ function resolveWebSocketConstructor() {
13
52
  function resolveSocketUrls(config) {
14
53
  const preferredUrls = config.urls;
15
54
  if (preferredUrls && preferredUrls.length > 0) {
16
- return Object.freeze(Array.from(new Set(preferredUrls)));
55
+ const unique = [];
56
+ for (const url of preferredUrls)
57
+ if (unique.indexOf(url) === -1)
58
+ unique.push(url);
59
+ return Object.freeze(unique);
17
60
  }
18
- if (config.url) {
19
- return Object.freeze([config.url]);
20
- }
21
- return WA_DEFAULTS.CHAT_SOCKET_URLS;
61
+ return config.url ? Object.freeze([config.url]) : WA_DEFAULTS.CHAT_SOCKET_URLS;
22
62
  }
23
63
  function resolveSocketRuntime() {
24
64
  const maybeNodeProcess = globalThis.process;
@@ -41,6 +81,7 @@ export class WaWebSocket {
41
81
  this.handlers = {};
42
82
  this.socket = null;
43
83
  this.closeWaiter = null;
84
+ this.nodeWsCtorPromise = null;
44
85
  }
45
86
  setHandlers(handlers) {
46
87
  this.handlers = handlers;
@@ -52,12 +93,6 @@ export class WaWebSocket {
52
93
  return (this.socket?.readyState === WA_READY_STATES.CONNECTING ||
53
94
  this.connectingSockets.size > 0);
54
95
  }
55
- getReadyState() {
56
- if (this.connectingSockets.size > 0) {
57
- return WA_READY_STATES.CONNECTING;
58
- }
59
- return this.socket?.readyState ?? WA_READY_STATES.CLOSED;
60
- }
61
96
  async open() {
62
97
  if (this.isOpen()) {
63
98
  this.logger.trace('socket open skipped: already open');
@@ -144,7 +179,7 @@ export class WaWebSocket {
144
179
  socket.send(data);
145
180
  }
146
181
  async openSingle(url) {
147
- const pending = this.createPendingSocket(url);
182
+ const pending = await this.createPendingSocket(url);
148
183
  return new Promise((resolve, reject) => {
149
184
  this.bindPendingSocket(pending, {
150
185
  onOpen: () => {
@@ -166,7 +201,20 @@ export class WaWebSocket {
166
201
  });
167
202
  }
168
203
  async openConcurrently(urls) {
169
- const pendingSockets = urls.map((url) => this.createPendingSocket(url));
204
+ const setupResults = await Promise.allSettled(urls.map((url) => this.createPendingSocket(url)));
205
+ const pendingSockets = [];
206
+ let setupError = null;
207
+ for (const result of setupResults) {
208
+ if (result.status === 'fulfilled') {
209
+ pendingSockets.push(result.value);
210
+ continue;
211
+ }
212
+ setupError = setupError ?? toError(result.reason);
213
+ }
214
+ if (setupError) {
215
+ this.releasePendingSocketsAfterSetupFailure(pendingSockets);
216
+ throw setupError;
217
+ }
170
218
  return new Promise((resolve, reject) => {
171
219
  let done = false;
172
220
  let failedCount = 0;
@@ -210,6 +258,14 @@ export class WaWebSocket {
210
258
  }
211
259
  });
212
260
  }
261
+ releasePendingSocketsAfterSetupFailure(entries) {
262
+ for (const entry of entries) {
263
+ if (!this.settlePendingSocket(entry)) {
264
+ continue;
265
+ }
266
+ this.closeSocketSafe(entry.socket, 1000, 'connect_setup_failed');
267
+ }
268
+ }
213
269
  bindRuntimeHandlers(socket) {
214
270
  socket.onmessage = (event) => {
215
271
  void this.handleMessage(event.data);
@@ -257,8 +313,8 @@ export class WaWebSocket {
257
313
  }
258
314
  return null;
259
315
  }
260
- createPendingSocket(url) {
261
- const socket = this.createRawSocket(url);
316
+ async createPendingSocket(url) {
317
+ const socket = await this.createRawSocket(url);
262
318
  socket.binaryType = 'arraybuffer';
263
319
  this.connectingSockets.add(socket);
264
320
  return {
@@ -351,11 +407,52 @@ export class WaWebSocket {
351
407
  // no-op
352
408
  }
353
409
  }
354
- createRawSocket(url) {
410
+ async createRawSocket(url) {
355
411
  const headers = this.config.headers;
356
- if (this.socketRuntime === 'node' && headers && Object.keys(headers).length > 0) {
357
- return new this.webSocketCtor(url, this.config.protocols, { headers });
412
+ const dispatcher = this.config.dispatcher;
413
+ const agent = this.config.agent;
414
+ let hasHeaders = false;
415
+ if (headers) {
416
+ for (const key in headers) {
417
+ if (Object.prototype.hasOwnProperty.call(headers, key)) {
418
+ hasHeaders = true;
419
+ break;
420
+ }
421
+ }
422
+ }
423
+ if (this.socketRuntime === 'node' && agent) {
424
+ const nodeWsCtor = await this.resolveNodeWsConstructor();
425
+ return new nodeWsCtor(url, this.config.protocols, {
426
+ headers,
427
+ agent
428
+ });
429
+ }
430
+ if (this.socketRuntime === 'node' && (hasHeaders || dispatcher || agent)) {
431
+ const globalWebSocketCtor = globalThis.WebSocket;
432
+ if (globalWebSocketCtor && this.webSocketCtor === globalWebSocketCtor) {
433
+ const init = {
434
+ protocols: this.config.protocols,
435
+ headers,
436
+ dispatcher,
437
+ agent
438
+ };
439
+ return new this.webSocketCtor(url, init);
440
+ }
441
+ return new this.webSocketCtor(url, this.config.protocols, {
442
+ headers,
443
+ dispatcher,
444
+ agent
445
+ });
358
446
  }
359
447
  return new this.webSocketCtor(url, this.config.protocols);
360
448
  }
449
+ async resolveNodeWsConstructor() {
450
+ if (!this.nodeWsCtorPromise) {
451
+ this.nodeWsCtorPromise = loadOptionalNodeWsConstructor().catch((error) => {
452
+ this.nodeWsCtorPromise = null;
453
+ throw error;
454
+ });
455
+ }
456
+ return this.nodeWsCtorPromise;
457
+ }
361
458
  }
@@ -64,33 +64,3 @@ export const DICTIONARY_TOKEN_MAPS = DICTIONARIES.map((dictionary) => {
64
64
  }
65
65
  return map;
66
66
  });
67
- export const WAP_ENCODE_CONSTANTS = Object.freeze({
68
- LIST_EMPTY,
69
- LIST_8,
70
- LIST_16,
71
- JID_PAIR,
72
- HEX_8,
73
- BINARY_8,
74
- BINARY_20,
75
- BINARY_32,
76
- NIBBLE_8,
77
- DICTIONARY_0,
78
- DICTIONARY_3
79
- });
80
- export const WAP_DECODE_CONSTANTS = Object.freeze({
81
- LIST_EMPTY,
82
- LIST_8,
83
- LIST_16,
84
- JID_PAIR,
85
- JID_FB,
86
- JID_INTEROP,
87
- JID_U,
88
- HEX_8,
89
- BINARY_8,
90
- BINARY_20,
91
- BINARY_32,
92
- NIBBLE_8,
93
- DICTIONARY_0,
94
- DICTIONARY_3,
95
- STREAM_END
96
- });