zapo-js 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withRetryLock = withRetryLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
6
+ const WA_RETRY_CLEANUP_KEY = 'retry:cleanup';
7
+ const WA_RETRY_CLEAR_KEY = 'retry:clear';
8
+ function withRetryLock(store) {
9
+ const lock = new StoreLock_1.StoreLock();
10
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
11
+ return {
12
+ getTtlMs: store.getTtlMs?.bind(store),
13
+ supportsRawReplayPayload: store.supportsRawReplayPayload?.bind(store),
14
+ destroy: async () => {
15
+ await gate.close();
16
+ await lock.shutdown();
17
+ await store.destroy?.();
18
+ },
19
+ getOutboundRequesterStatus: (messageId, requesterDeviceJid) => gate.runShared(() => store.getOutboundRequesterStatus(messageId, requesterDeviceJid)),
20
+ upsertOutboundMessage: (record) => gate.runShared(() => lock.run(`retry:outbound:${record.messageId}`, () => store.upsertOutboundMessage(record))),
21
+ deleteOutboundMessage: (messageId) => gate.runShared(() => lock.run(`retry:outbound:${messageId}`, () => store.deleteOutboundMessage(messageId))),
22
+ getOutboundMessage: (messageId) => gate.runShared(() => store.getOutboundMessage(messageId)),
23
+ updateOutboundMessageState: (messageId, state, updatedAtMs, expiresAtMs) => gate.runShared(() => lock.run(`retry:outbound:${messageId}`, () => store.updateOutboundMessageState(messageId, state, updatedAtMs, expiresAtMs))),
24
+ markOutboundRequesterDelivered: (messageId, requesterDeviceJid, updatedAtMs, expiresAtMs) => gate.runShared(() => lock.runMany([
25
+ `retry:outbound:${messageId}`,
26
+ `retry:outbound:${messageId}:${requesterDeviceJid}`
27
+ ], () => store.markOutboundRequesterDelivered(messageId, requesterDeviceJid, updatedAtMs, expiresAtMs))),
28
+ incrementInboundCounter: (messageId, requesterJid, updatedAtMs, expiresAtMs) => gate.runShared(() => lock.run(`retry:inbound:${messageId}:${requesterJid}`, () => store.incrementInboundCounter(messageId, requesterJid, updatedAtMs, expiresAtMs))),
29
+ cleanupExpired: (nowMs) => gate.runExclusive(() => lock.run(WA_RETRY_CLEANUP_KEY, () => store.cleanupExpired(nowMs))),
30
+ clear: () => gate.runExclusive(() => lock.run(WA_RETRY_CLEAR_KEY, () => store.clear()))
31
+ };
32
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withSenderKeyLock = withSenderKeyLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
6
+ const jid_1 = require("../../protocol/jid");
7
+ const WA_SENDER_KEY_CLEAR_KEY = 'senderKey:clear';
8
+ function senderKeyLockKey(groupId, sender) {
9
+ return `senderKey:${groupId}:${(0, jid_1.signalAddressKey)(sender)}`;
10
+ }
11
+ function senderDistributionLockKey(groupId, sender) {
12
+ return `senderKeyDistribution:${groupId}:${(0, jid_1.signalAddressKey)(sender)}`;
13
+ }
14
+ function senderAnyLockKey(sender) {
15
+ return `senderKey:any:${(0, jid_1.signalAddressKey)(sender)}`;
16
+ }
17
+ function withSenderKeyLock(store) {
18
+ const lock = new StoreLock_1.StoreLock();
19
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
20
+ const destroyStore = store;
21
+ return {
22
+ upsertSenderKey: (record) => gate.runShared(() => lock.runMany([
23
+ senderAnyLockKey(record.sender),
24
+ senderKeyLockKey(record.groupId, record.sender)
25
+ ], () => store.upsertSenderKey(record))),
26
+ upsertSenderKeyDistribution: (record) => gate.runShared(() => lock.runMany([
27
+ senderAnyLockKey(record.sender),
28
+ senderDistributionLockKey(record.groupId, record.sender)
29
+ ], () => store.upsertSenderKeyDistribution(record))),
30
+ upsertSenderKeyDistributions: (records) => gate.runShared(() => lock.runMany(records.flatMap((record) => [
31
+ senderAnyLockKey(record.sender),
32
+ senderDistributionLockKey(record.groupId, record.sender)
33
+ ]), () => store.upsertSenderKeyDistributions(records))),
34
+ getGroupSenderKeyList: (groupId) => gate.runShared(() => store.getGroupSenderKeyList(groupId)),
35
+ getDeviceSenderKey: (groupId, sender) => gate.runShared(() => store.getDeviceSenderKey(groupId, sender)),
36
+ getDeviceSenderKeyDistributions: (groupId, senders) => gate.runShared(() => store.getDeviceSenderKeyDistributions(groupId, senders)),
37
+ deleteDeviceSenderKey: (target, groupId) => gate.runShared(() => lock.runMany(groupId
38
+ ? [
39
+ senderAnyLockKey(target),
40
+ senderKeyLockKey(groupId, target),
41
+ senderDistributionLockKey(groupId, target)
42
+ ]
43
+ : [senderAnyLockKey(target)], () => store.deleteDeviceSenderKey(target, groupId))),
44
+ markForgetSenderKey: (groupId, participants) => gate.runShared(() => lock.runMany(participants.flatMap((participant) => [
45
+ senderAnyLockKey(participant),
46
+ senderKeyLockKey(groupId, participant)
47
+ ]), () => store.markForgetSenderKey(groupId, participants))),
48
+ clear: () => gate.runExclusive(() => lock.run(WA_SENDER_KEY_CLEAR_KEY, () => store.clear())),
49
+ destroy: async () => {
50
+ await gate.close();
51
+ await lock.shutdown();
52
+ await destroyStore.destroy?.();
53
+ }
54
+ };
55
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withSignalLock = withSignalLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
6
+ const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
7
+ const WA_SIGNAL_SIGNED_PREKEY_KEY = 'signal:signedPreKey';
8
+ const WA_SIGNAL_PREKEYS_KEY = 'signal:prekeys';
9
+ const WA_SIGNAL_SERVER_HAS_PREKEYS_KEY = 'signal:serverHasPreKeys';
10
+ const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
11
+ function withSignalLock(store) {
12
+ const lock = new StoreLock_1.StoreLock();
13
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
14
+ const destroyStore = store;
15
+ let cachedRegInfo;
16
+ return {
17
+ getRegistrationInfo: () => gate.runShared(async () => {
18
+ if (cachedRegInfo !== undefined) {
19
+ return cachedRegInfo;
20
+ }
21
+ const info = await store.getRegistrationInfo();
22
+ cachedRegInfo = info;
23
+ return info;
24
+ }),
25
+ setRegistrationInfo: (info) => gate.runShared(() => lock.run(WA_SIGNAL_REGISTRATION_KEY, async () => {
26
+ await store.setRegistrationInfo(info);
27
+ cachedRegInfo = info;
28
+ })),
29
+ getSignedPreKey: () => gate.runShared(() => store.getSignedPreKey()),
30
+ setSignedPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKey(record))),
31
+ getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
32
+ setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
33
+ getSignedPreKeyRotationTs: () => gate.runShared(() => store.getSignedPreKeyRotationTs()),
34
+ putPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.putPreKey(record))),
35
+ getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenPreKeys(count, generator))),
36
+ getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
37
+ getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
38
+ consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.consumePreKeyById(keyId))),
39
+ getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenSinglePreKey(generator))),
40
+ markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.markKeyAsUploaded(keyId))),
41
+ setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SERVER_HAS_PREKEYS_KEY, () => store.setServerHasPreKeys(value))),
42
+ getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
43
+ getSignalMeta: () => gate.runShared(() => store.getSignalMeta()),
44
+ hasSession: (address) => gate.runShared(() => store.hasSession(address)),
45
+ hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
46
+ getSession: (address) => gate.runShared(() => store.getSession(address)),
47
+ getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
48
+ // Session and identity read-modify-write semantics are serialized in SignalProtocol per address.
49
+ setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
50
+ setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
51
+ deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
52
+ getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
53
+ getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
54
+ setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
55
+ setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
56
+ clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
57
+ await store.clear();
58
+ cachedRegInfo = undefined;
59
+ })),
60
+ destroy: async () => {
61
+ await gate.close();
62
+ await lock.shutdown();
63
+ await destroyStore.destroy?.();
64
+ }
65
+ };
66
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withThreadLock = withThreadLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
6
+ const WA_THREAD_CLEAR_KEY = 'thread:clear';
7
+ function withThreadLock(store) {
8
+ const lock = new StoreLock_1.StoreLock();
9
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
10
+ const destroyStore = store;
11
+ return {
12
+ upsert: (record) => gate.runShared(() => lock.run(`thread:${record.jid}`, () => store.upsert(record))),
13
+ upsertBatch: (records) => gate.runShared(() => lock.runMany(records.map((record) => `thread:${record.jid}`), () => store.upsertBatch(records))),
14
+ getByJid: (jid) => gate.runShared(() => store.getByJid(jid)),
15
+ list: (limit) => gate.runShared(() => store.list(limit)),
16
+ deleteByJid: (jid) => gate.runShared(() => lock.run(`thread:${jid}`, () => store.deleteByJid(jid))),
17
+ clear: () => gate.runExclusive(() => lock.run(WA_THREAD_CLEAR_KEY, () => store.clear())),
18
+ destroy: async () => {
19
+ await gate.close();
20
+ await lock.shutdown();
21
+ await destroyStore.destroy?.();
22
+ }
23
+ };
24
+ }
@@ -35,7 +35,7 @@ exports.NOOP_PARTICIPANTS_STORE = Object.freeze({
35
35
  });
36
36
  exports.NOOP_DEVICE_LIST_STORE = Object.freeze({
37
37
  upsertUserDevicesBatch: async (_snapshots) => { },
38
- getUserDevicesBatch: async (userJids, _nowMs) => userJids.map(() => null),
38
+ getUserDevicesBatch: async (userJids, _nowMs) => new Array(userJids.length).fill(null),
39
39
  deleteUserDevices: async (_userJid) => 0,
40
40
  cleanupExpired: async (_nowMs) => 0,
41
41
  clear: async () => { },
@@ -10,13 +10,6 @@ const DEFAULT_APPSTATE_MEMORY_STORE_LIMITS = Object.freeze({
10
10
  syncKeys: 4096,
11
11
  collectionEntries: 50000
12
12
  });
13
- function toBoundedMap(entries, maxEntries) {
14
- const map = new Map();
15
- for (const [key, value] of entries) {
16
- (0, collections_1.setBoundedMapEntry)(map, key, value, maxEntries);
17
- }
18
- return map;
19
- }
20
13
  class WaAppStateMemoryStore {
21
14
  constructor(initial, options = {}) {
22
15
  this.keys = new Map();
@@ -31,11 +24,15 @@ class WaAppStateMemoryStore {
31
24
  if (!collection) {
32
25
  continue;
33
26
  }
27
+ const indexValueMap = new Map();
28
+ for (const [key, value] of Object.entries(collection.indexValueMap)) {
29
+ (0, collections_1.setBoundedMapEntry)(indexValueMap, key, value, this.maxCollectionEntries);
30
+ }
34
31
  this.collections.set(collectionName, {
35
32
  initialized: true,
36
33
  version: collection.version,
37
34
  hash: collection.hash,
38
- indexValueMap: toBoundedMap(Object.entries(collection.indexValueMap), this.maxCollectionEntries)
35
+ indexValueMap
39
36
  });
40
37
  }
41
38
  }
@@ -68,14 +65,22 @@ class WaAppStateMemoryStore {
68
65
  }
69
66
  return inserted;
70
67
  }
71
- async getSyncKey(keyId) {
72
- return this.keys.get((0, bytes_1.bytesToHex)(keyId)) ?? null;
68
+ async getSyncKeysBatch(keyIds) {
69
+ const keys = new Array(keyIds.length);
70
+ for (let index = 0; index < keyIds.length; index += 1) {
71
+ keys[index] = this.keys.get((0, bytes_1.bytesToHex)(keyIds[index])) ?? null;
72
+ }
73
+ return keys;
73
74
  }
74
75
  async getSyncKeyData(keyId) {
75
76
  return this.keys.get((0, bytes_1.bytesToHex)(keyId))?.keyData ?? null;
76
77
  }
77
78
  async getSyncKeyDataBatch(keyIds) {
78
- return keyIds.map((keyId) => this.keys.get((0, bytes_1.bytesToHex)(keyId))?.keyData ?? null);
79
+ const keys = new Array(keyIds.length);
80
+ for (let index = 0; index < keyIds.length; index += 1) {
81
+ keys[index] = this.keys.get((0, bytes_1.bytesToHex)(keyIds[index]))?.keyData ?? null;
82
+ }
83
+ return keys;
79
84
  }
80
85
  async getActiveSyncKey() {
81
86
  return (0, utils_1.pickActiveSyncKey)(this.keys.values());
@@ -96,28 +101,21 @@ class WaAppStateMemoryStore {
96
101
  async getCollectionStates(collections) {
97
102
  const result = new Array(collections.length);
98
103
  for (let index = 0; index < collections.length; index += 1) {
99
- const collection = collections[index];
100
- let state = this.collections.get(collection);
101
- if (!state) {
102
- state = {
103
- initialized: false,
104
- version: 0,
105
- hash: constants_1.APP_STATE_EMPTY_LT_HASH,
106
- indexValueMap: new Map()
107
- };
108
- this.collections.set(collection, state);
109
- }
110
- result[index] = state;
104
+ result[index] = await this.getCollectionState(collections[index]);
111
105
  }
112
106
  return result;
113
107
  }
114
108
  async setCollectionStates(updates) {
115
109
  for (const update of updates) {
110
+ const indexValueMap = new Map();
111
+ for (const [key, value] of update.indexValueMap.entries()) {
112
+ (0, collections_1.setBoundedMapEntry)(indexValueMap, key, value, this.maxCollectionEntries);
113
+ }
116
114
  this.collections.set(update.collection, {
117
115
  initialized: true,
118
116
  version: update.version,
119
117
  hash: update.hash,
120
- indexValueMap: toBoundedMap(update.indexValueMap.entries(), this.maxCollectionEntries)
118
+ indexValueMap
121
119
  });
122
120
  }
123
121
  }
@@ -27,17 +27,22 @@ class WaDeviceListMemoryStore {
27
27
  }
28
28
  }
29
29
  async getUserDevicesBatch(userJids, nowMs = Date.now()) {
30
- return userJids.map((userJid) => {
30
+ const snapshots = new Array(userJids.length);
31
+ for (let index = 0; index < userJids.length; index += 1) {
32
+ const userJid = userJids[index];
31
33
  const record = this.records.get(userJid);
32
34
  if (!record) {
33
- return null;
35
+ snapshots[index] = null;
36
+ continue;
34
37
  }
35
38
  if (record.expiresAtMs <= nowMs) {
36
39
  this.records.delete(userJid);
37
- return null;
40
+ snapshots[index] = null;
41
+ continue;
38
42
  }
39
- return record;
40
- });
43
+ snapshots[index] = record;
44
+ }
45
+ return snapshots;
41
46
  }
42
47
  async deleteUserDevices(userJid) {
43
48
  return this.records.delete(userJid) ? 1 : 0;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaPrivacyTokenMemoryStore = void 0;
4
+ const collections_1 = require("../../../util/collections");
5
+ const DEFAULT_MAX_ENTRIES = 10000;
6
+ class WaPrivacyTokenMemoryStore {
7
+ constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
8
+ this.records = new Map();
9
+ this.maxEntries = maxEntries;
10
+ }
11
+ async upsert(record) {
12
+ const existing = this.records.get(record.jid);
13
+ const merged = existing ? this.mergeRecord(existing, record) : record;
14
+ (0, collections_1.setBoundedMapEntry)(this.records, record.jid, merged, this.maxEntries);
15
+ }
16
+ async upsertBatch(records) {
17
+ for (let i = 0; i < records.length; i += 1) {
18
+ const record = records[i];
19
+ const existing = this.records.get(record.jid);
20
+ const merged = existing ? this.mergeRecord(existing, record) : record;
21
+ (0, collections_1.setBoundedMapEntry)(this.records, record.jid, merged, this.maxEntries);
22
+ }
23
+ }
24
+ async getByJid(jid) {
25
+ return this.records.get(jid) ?? null;
26
+ }
27
+ async deleteByJid(jid) {
28
+ return this.records.delete(jid) ? 1 : 0;
29
+ }
30
+ async clear() {
31
+ this.records.clear();
32
+ }
33
+ async destroy() {
34
+ this.records.clear();
35
+ }
36
+ mergeRecord(existing, incoming) {
37
+ return {
38
+ jid: incoming.jid,
39
+ tcToken: incoming.tcToken ?? existing.tcToken,
40
+ tcTokenTimestamp: incoming.tcTokenTimestamp ?? existing.tcTokenTimestamp,
41
+ tcTokenSenderTimestamp: incoming.tcTokenSenderTimestamp ?? existing.tcTokenSenderTimestamp,
42
+ nctSalt: incoming.nctSalt ?? existing.nctSalt,
43
+ updatedAtMs: incoming.updatedAtMs
44
+ };
45
+ }
46
+ }
47
+ exports.WaPrivacyTokenMemoryStore = WaPrivacyTokenMemoryStore;
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WaRetryMemoryStore = void 0;
4
4
  const collections_1 = require("../../../util/collections");
5
- const DEFAULT_RETRY_TTL_MS = 7 * 24 * 60 * 60 * 1000;
5
+ const DEFAULT_RETRY_TTL_MS = 60 * 1000;
6
6
  class WaRetryMemoryStore {
7
7
  constructor(ttlMs = DEFAULT_RETRY_TTL_MS) {
8
8
  this.outboundMessages = new Map();
9
+ this.eligibleSets = new Map();
9
10
  this.inboundCounters = new Map();
10
11
  this.ttlMs = ttlMs;
11
12
  this.cleanupTimer = setInterval(() => {
@@ -16,8 +17,66 @@ class WaRetryMemoryStore {
16
17
  getTtlMs() {
17
18
  return this.ttlMs;
18
19
  }
20
+ supportsRawReplayPayload() {
21
+ return true;
22
+ }
23
+ async getOutboundRequesterStatus(messageId, requesterDeviceJid) {
24
+ const current = this.outboundMessages.get(messageId);
25
+ if (!current) {
26
+ return null;
27
+ }
28
+ const eligible = current.eligibleRequesterDeviceJids;
29
+ if (!eligible || eligible.length === 0) {
30
+ return null;
31
+ }
32
+ const eligibleSet = this.eligibleSets.get(current.messageId);
33
+ let isEligible = false;
34
+ if (eligibleSet) {
35
+ isEligible = eligibleSet.has(requesterDeviceJid);
36
+ }
37
+ else {
38
+ for (let index = 0; index < eligible.length; index += 1) {
39
+ if (eligible[index] === requesterDeviceJid) {
40
+ isEligible = true;
41
+ break;
42
+ }
43
+ }
44
+ }
45
+ if (!isEligible) {
46
+ return { eligible: false, delivered: false };
47
+ }
48
+ const delivered = current.deliveredRequesterDeviceJids;
49
+ if (!delivered || delivered.length === 0) {
50
+ return { eligible: true, delivered: false };
51
+ }
52
+ for (let index = 0; index < delivered.length; index += 1) {
53
+ if (delivered[index] === requesterDeviceJid) {
54
+ return { eligible: true, delivered: true };
55
+ }
56
+ }
57
+ return { eligible: true, delivered: false };
58
+ }
19
59
  async upsertOutboundMessage(record) {
20
- this.outboundMessages.set(record.messageId, record);
60
+ this.outboundMessages.set(record.messageId, {
61
+ ...record,
62
+ eligibleRequesterDeviceJids: record.eligibleRequesterDeviceJids
63
+ ? [...record.eligibleRequesterDeviceJids]
64
+ : undefined,
65
+ deliveredRequesterDeviceJids: record.deliveredRequesterDeviceJids
66
+ ? [...record.deliveredRequesterDeviceJids]
67
+ : undefined
68
+ });
69
+ if (record.eligibleRequesterDeviceJids && record.eligibleRequesterDeviceJids.length > 0) {
70
+ this.eligibleSets.set(record.messageId, new Set(record.eligibleRequesterDeviceJids));
71
+ }
72
+ else {
73
+ this.eligibleSets.delete(record.messageId);
74
+ }
75
+ }
76
+ async deleteOutboundMessage(messageId) {
77
+ const existed = this.outboundMessages.delete(messageId);
78
+ this.eligibleSets.delete(messageId);
79
+ return existed ? 1 : 0;
21
80
  }
22
81
  async getOutboundMessage(messageId) {
23
82
  return this.outboundMessages.get(messageId) ?? null;
@@ -34,6 +93,20 @@ class WaRetryMemoryStore {
34
93
  expiresAtMs
35
94
  });
36
95
  }
96
+ async markOutboundRequesterDelivered(messageId, requesterDeviceJid, updatedAtMs, expiresAtMs) {
97
+ const current = this.outboundMessages.get(messageId);
98
+ if (!current) {
99
+ return;
100
+ }
101
+ const delivered = new Set(current.deliveredRequesterDeviceJids ?? []);
102
+ delivered.add(requesterDeviceJid);
103
+ this.outboundMessages.set(messageId, {
104
+ ...current,
105
+ deliveredRequesterDeviceJids: Array.from(delivered),
106
+ updatedAtMs,
107
+ expiresAtMs
108
+ });
109
+ }
37
110
  async incrementInboundCounter(messageId, requesterJid, _updatedAtMs, expiresAtMs) {
38
111
  const key = this.counterKey(messageId, requesterJid);
39
112
  const current = this.inboundCounters.get(key);
@@ -50,6 +123,7 @@ class WaRetryMemoryStore {
50
123
  if (record.expiresAtMs > nowMs)
51
124
  continue;
52
125
  this.outboundMessages.delete(messageId);
126
+ this.eligibleSets.delete(messageId);
53
127
  removed += 1;
54
128
  }
55
129
  for (const [key, record] of this.inboundCounters) {
@@ -62,6 +136,7 @@ class WaRetryMemoryStore {
62
136
  }
63
137
  async clear() {
64
138
  this.outboundMessages.clear();
139
+ this.eligibleSets.clear();
65
140
  this.inboundCounters.clear();
66
141
  }
67
142
  async destroy() {
@@ -49,7 +49,12 @@ class SenderKeyMemoryStore {
49
49
  return record ?? null;
50
50
  }
51
51
  async getDeviceSenderKeyDistributions(groupId, senders) {
52
- return senders.map((sender) => this.senderDistributions.get(this.makeKey(groupId, sender)) ?? null);
52
+ const records = new Array(senders.length);
53
+ for (let index = 0; index < senders.length; index += 1) {
54
+ records[index] =
55
+ this.senderDistributions.get(this.makeKey(groupId, senders[index])) ?? null;
56
+ }
57
+ return records;
53
58
  }
54
59
  async deleteDeviceSenderKey(target, groupId) {
55
60
  let deleted = 0;
@@ -61,12 +61,15 @@ class WaSignalMemoryStore {
61
61
  throw new Error(`invalid prekey count: ${count}`);
62
62
  }
63
63
  const available = [];
64
- const sortedIds = [...this.preKeys.keys()].sort((left, right) => left - right);
65
- for (let index = 0; index < sortedIds.length; index += 1) {
66
- const keyId = sortedIds[index];
67
- if (this.uploadedPreKeys.has(keyId)) {
68
- continue;
64
+ const availableKeyIds = [];
65
+ for (const keyId of this.preKeys.keys()) {
66
+ if (!this.uploadedPreKeys.has(keyId)) {
67
+ availableKeyIds.push(keyId);
69
68
  }
69
+ }
70
+ availableKeyIds.sort((left, right) => left - right);
71
+ for (let index = 0; index < availableKeyIds.length; index += 1) {
72
+ const keyId = availableKeyIds[index];
70
73
  const record = this.preKeys.get(keyId);
71
74
  if (!record) {
72
75
  continue;
@@ -89,7 +92,11 @@ class WaSignalMemoryStore {
89
92
  return this.preKeys.get(keyId) ?? null;
90
93
  }
91
94
  async getPreKeysById(keyIds) {
92
- return keyIds.map((keyId) => this.preKeys.get(keyId) ?? null);
95
+ const result = new Array(keyIds.length);
96
+ for (let i = 0; i < keyIds.length; i += 1) {
97
+ result[i] = this.preKeys.get(keyIds[i]) ?? null;
98
+ }
99
+ return result;
93
100
  }
94
101
  async consumePreKeyById(keyId) {
95
102
  const record = this.preKeys.get(keyId) ?? null;
@@ -120,17 +127,33 @@ class WaSignalMemoryStore {
120
127
  async getServerHasPreKeys() {
121
128
  return this.serverHasPreKeys;
122
129
  }
130
+ async getSignalMeta() {
131
+ return {
132
+ serverHasPreKeys: this.serverHasPreKeys,
133
+ signedPreKeyRotationTs: this.signedPreKeyRotationTs,
134
+ registrationInfo: this.registrationInfo,
135
+ signedPreKey: this.signedPreKey
136
+ };
137
+ }
123
138
  async hasSession(address) {
124
139
  return this.signalSessions.has((0, jid_1.signalAddressKey)(address));
125
140
  }
126
141
  async hasSessions(addresses) {
127
- return addresses.map((address) => this.signalSessions.has((0, jid_1.signalAddressKey)(address)));
142
+ const result = new Array(addresses.length);
143
+ for (let i = 0; i < addresses.length; i += 1) {
144
+ result[i] = this.signalSessions.has((0, jid_1.signalAddressKey)(addresses[i]));
145
+ }
146
+ return result;
128
147
  }
129
148
  async getSession(address) {
130
149
  return this.signalSessions.get((0, jid_1.signalAddressKey)(address)) ?? null;
131
150
  }
132
151
  async getSessionsBatch(addresses) {
133
- return addresses.map((address) => this.signalSessions.get((0, jid_1.signalAddressKey)(address)) ?? null);
152
+ const result = new Array(addresses.length);
153
+ for (let i = 0; i < addresses.length; i += 1) {
154
+ result[i] = this.signalSessions.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
155
+ }
156
+ return result;
134
157
  }
135
158
  async setSession(address, session) {
136
159
  (0, collections_1.setBoundedMapEntry)(this.signalSessions, (0, jid_1.signalAddressKey)(address), session, this.maxSessions);
@@ -148,7 +171,11 @@ class WaSignalMemoryStore {
148
171
  return this.remoteIdentities.get((0, jid_1.signalAddressKey)(address)) ?? null;
149
172
  }
150
173
  async getRemoteIdentities(addresses) {
151
- return addresses.map((address) => this.remoteIdentities.get((0, jid_1.signalAddressKey)(address)) ?? null);
174
+ const result = new Array(addresses.length);
175
+ for (let i = 0; i < addresses.length; i += 1) {
176
+ result[i] = this.remoteIdentities.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
177
+ }
178
+ return result;
152
179
  }
153
180
  async setRemoteIdentity(address, identityKey) {
154
181
  (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(address), identityKey, this.maxRemoteIdentities);
@@ -170,17 +197,7 @@ class WaSignalMemoryStore {
170
197
  this.nextPreKeyId = 1;
171
198
  }
172
199
  addUploadedPreKey(keyId) {
173
- if (this.uploadedPreKeys.has(keyId)) {
174
- this.uploadedPreKeys.delete(keyId);
175
- }
176
200
  this.uploadedPreKeys.add(keyId);
177
- while (this.uploadedPreKeys.size > this.maxPreKeys) {
178
- const oldest = this.uploadedPreKeys.values().next().value;
179
- if (oldest === undefined) {
180
- break;
181
- }
182
- this.uploadedPreKeys.delete(oldest);
183
- }
184
201
  }
185
202
  }
186
203
  exports.WaSignalMemoryStore = WaSignalMemoryStore;
@@ -402,7 +402,9 @@ class WaComms {
402
402
  this.schedulePendingFramesOverflowClose();
403
403
  return false;
404
404
  }
405
- this.pendingFrames.push(...frames);
405
+ for (let i = 0; i < frames.length; i += 1) {
406
+ this.pendingFrames.push(frames[i]);
407
+ }
406
408
  this.pendingFramesByteLength = nextBytes;
407
409
  return true;
408
410
  }
@@ -129,12 +129,6 @@ class WaWebSocket {
129
129
  return (this.socket?.readyState === constants_1.WA_READY_STATES.CONNECTING ||
130
130
  this.connectingSockets.size > 0);
131
131
  }
132
- getReadyState() {
133
- if (this.connectingSockets.size > 0) {
134
- return constants_1.WA_READY_STATES.CONNECTING;
135
- }
136
- return this.socket?.readyState ?? constants_1.WA_READY_STATES.CLOSED;
137
- }
138
132
  async open() {
139
133
  if (this.isOpen()) {
140
134
  this.logger.trace('socket open skipped: already open');
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WAP_DECODE_CONSTANTS = exports.WAP_ENCODE_CONSTANTS = exports.DICTIONARY_TOKEN_MAPS = exports.SINGLE_BYTE_TOKEN_MAP = exports.HEX_ALPHABET = exports.NIBBLE_ALPHABET = exports.NIBBLE_8 = exports.BINARY_32 = exports.BINARY_20 = exports.BINARY_8 = exports.HEX_8 = exports.JID_PAIR = exports.LIST_16 = exports.LIST_8 = exports.JID_U = exports.JID_FB = exports.JID_INTEROP = exports.DICTIONARY_3 = exports.DICTIONARY_0 = exports.STREAM_END = exports.LIST_EMPTY = void 0;
3
+ exports.DICTIONARY_TOKEN_MAPS = exports.SINGLE_BYTE_TOKEN_MAP = exports.HEX_ALPHABET = exports.NIBBLE_ALPHABET = exports.NIBBLE_8 = exports.BINARY_32 = exports.BINARY_20 = exports.BINARY_8 = exports.HEX_8 = exports.JID_PAIR = exports.LIST_16 = exports.LIST_8 = exports.JID_U = exports.JID_FB = exports.JID_INTEROP = exports.DICTIONARY_3 = exports.DICTIONARY_0 = exports.STREAM_END = exports.LIST_EMPTY = void 0;
4
4
  const tokens_1 = require("../binary/tokens");
5
5
  exports.LIST_EMPTY = 0;
6
6
  exports.STREAM_END = 2;
@@ -67,33 +67,3 @@ exports.DICTIONARY_TOKEN_MAPS = tokens_1.DICTIONARIES.map((dictionary) => {
67
67
  }
68
68
  return map;
69
69
  });
70
- exports.WAP_ENCODE_CONSTANTS = Object.freeze({
71
- LIST_EMPTY: exports.LIST_EMPTY,
72
- LIST_8: exports.LIST_8,
73
- LIST_16: exports.LIST_16,
74
- JID_PAIR: exports.JID_PAIR,
75
- HEX_8: exports.HEX_8,
76
- BINARY_8: exports.BINARY_8,
77
- BINARY_20: exports.BINARY_20,
78
- BINARY_32: exports.BINARY_32,
79
- NIBBLE_8: exports.NIBBLE_8,
80
- DICTIONARY_0: exports.DICTIONARY_0,
81
- DICTIONARY_3: exports.DICTIONARY_3
82
- });
83
- exports.WAP_DECODE_CONSTANTS = Object.freeze({
84
- LIST_EMPTY: exports.LIST_EMPTY,
85
- LIST_8: exports.LIST_8,
86
- LIST_16: exports.LIST_16,
87
- JID_PAIR: exports.JID_PAIR,
88
- JID_FB: exports.JID_FB,
89
- JID_INTEROP: exports.JID_INTEROP,
90
- JID_U: exports.JID_U,
91
- HEX_8: exports.HEX_8,
92
- BINARY_8: exports.BINARY_8,
93
- BINARY_20: exports.BINARY_20,
94
- BINARY_32: exports.BINARY_32,
95
- NIBBLE_8: exports.NIBBLE_8,
96
- DICTIONARY_0: exports.DICTIONARY_0,
97
- DICTIONARY_3: exports.DICTIONARY_3,
98
- STREAM_END: exports.STREAM_END
99
- });