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,63 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ import { StoreLock } from '../../infra/perf/StoreLock.js';
3
+ const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
4
+ const WA_SIGNAL_SIGNED_PREKEY_KEY = 'signal:signedPreKey';
5
+ const WA_SIGNAL_PREKEYS_KEY = 'signal:prekeys';
6
+ const WA_SIGNAL_SERVER_HAS_PREKEYS_KEY = 'signal:serverHasPreKeys';
7
+ const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
8
+ export function withSignalLock(store) {
9
+ const lock = new StoreLock();
10
+ const gate = new SharedExclusiveGate();
11
+ const destroyStore = store;
12
+ let cachedRegInfo;
13
+ return {
14
+ getRegistrationInfo: () => gate.runShared(async () => {
15
+ if (cachedRegInfo !== undefined) {
16
+ return cachedRegInfo;
17
+ }
18
+ const info = await store.getRegistrationInfo();
19
+ cachedRegInfo = info;
20
+ return info;
21
+ }),
22
+ setRegistrationInfo: (info) => gate.runShared(() => lock.run(WA_SIGNAL_REGISTRATION_KEY, async () => {
23
+ await store.setRegistrationInfo(info);
24
+ cachedRegInfo = info;
25
+ })),
26
+ getSignedPreKey: () => gate.runShared(() => store.getSignedPreKey()),
27
+ setSignedPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKey(record))),
28
+ getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
29
+ setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
30
+ getSignedPreKeyRotationTs: () => gate.runShared(() => store.getSignedPreKeyRotationTs()),
31
+ putPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.putPreKey(record))),
32
+ getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenPreKeys(count, generator))),
33
+ getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
34
+ getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
35
+ consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.consumePreKeyById(keyId))),
36
+ getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenSinglePreKey(generator))),
37
+ markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.markKeyAsUploaded(keyId))),
38
+ setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SERVER_HAS_PREKEYS_KEY, () => store.setServerHasPreKeys(value))),
39
+ getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
40
+ getSignalMeta: () => gate.runShared(() => store.getSignalMeta()),
41
+ hasSession: (address) => gate.runShared(() => store.hasSession(address)),
42
+ hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
43
+ getSession: (address) => gate.runShared(() => store.getSession(address)),
44
+ getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
45
+ // Session and identity read-modify-write semantics are serialized in SignalProtocol per address.
46
+ setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
47
+ setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
48
+ deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
49
+ getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
50
+ getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
51
+ setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
52
+ setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
53
+ clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
54
+ await store.clear();
55
+ cachedRegInfo = undefined;
56
+ })),
57
+ destroy: async () => {
58
+ await gate.close();
59
+ await lock.shutdown();
60
+ await destroyStore.destroy?.();
61
+ }
62
+ };
63
+ }
@@ -0,0 +1,21 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ import { StoreLock } from '../../infra/perf/StoreLock.js';
3
+ const WA_THREAD_CLEAR_KEY = 'thread:clear';
4
+ export function withThreadLock(store) {
5
+ const lock = new StoreLock();
6
+ const gate = new SharedExclusiveGate();
7
+ const destroyStore = store;
8
+ return {
9
+ upsert: (record) => gate.runShared(() => lock.run(`thread:${record.jid}`, () => store.upsert(record))),
10
+ upsertBatch: (records) => gate.runShared(() => lock.runMany(records.map((record) => `thread:${record.jid}`), () => store.upsertBatch(records))),
11
+ getByJid: (jid) => gate.runShared(() => store.getByJid(jid)),
12
+ list: (limit) => gate.runShared(() => store.list(limit)),
13
+ deleteByJid: (jid) => gate.runShared(() => lock.run(`thread:${jid}`, () => store.deleteByJid(jid))),
14
+ clear: () => gate.runExclusive(() => lock.run(WA_THREAD_CLEAR_KEY, () => store.clear())),
15
+ destroy: async () => {
16
+ await gate.close();
17
+ await lock.shutdown();
18
+ await destroyStore.destroy?.();
19
+ }
20
+ };
21
+ }
@@ -32,7 +32,7 @@ export const NOOP_PARTICIPANTS_STORE = Object.freeze({
32
32
  });
33
33
  export const NOOP_DEVICE_LIST_STORE = Object.freeze({
34
34
  upsertUserDevicesBatch: async (_snapshots) => { },
35
- getUserDevicesBatch: async (userJids, _nowMs) => userJids.map(() => null),
35
+ getUserDevicesBatch: async (userJids, _nowMs) => new Array(userJids.length).fill(null),
36
36
  deleteUserDevices: async (_userJid) => 0,
37
37
  cleanupExpired: async (_nowMs) => 0,
38
38
  clear: async () => { },
@@ -7,13 +7,6 @@ const DEFAULT_APPSTATE_MEMORY_STORE_LIMITS = Object.freeze({
7
7
  syncKeys: 4096,
8
8
  collectionEntries: 50000
9
9
  });
10
- function toBoundedMap(entries, maxEntries) {
11
- const map = new Map();
12
- for (const [key, value] of entries) {
13
- setBoundedMapEntry(map, key, value, maxEntries);
14
- }
15
- return map;
16
- }
17
10
  export class WaAppStateMemoryStore {
18
11
  constructor(initial, options = {}) {
19
12
  this.keys = new Map();
@@ -28,11 +21,15 @@ export class WaAppStateMemoryStore {
28
21
  if (!collection) {
29
22
  continue;
30
23
  }
24
+ const indexValueMap = new Map();
25
+ for (const [key, value] of Object.entries(collection.indexValueMap)) {
26
+ setBoundedMapEntry(indexValueMap, key, value, this.maxCollectionEntries);
27
+ }
31
28
  this.collections.set(collectionName, {
32
29
  initialized: true,
33
30
  version: collection.version,
34
31
  hash: collection.hash,
35
- indexValueMap: toBoundedMap(Object.entries(collection.indexValueMap), this.maxCollectionEntries)
32
+ indexValueMap
36
33
  });
37
34
  }
38
35
  }
@@ -65,14 +62,22 @@ export class WaAppStateMemoryStore {
65
62
  }
66
63
  return inserted;
67
64
  }
68
- async getSyncKey(keyId) {
69
- return this.keys.get(bytesToHex(keyId)) ?? null;
65
+ async getSyncKeysBatch(keyIds) {
66
+ const keys = new Array(keyIds.length);
67
+ for (let index = 0; index < keyIds.length; index += 1) {
68
+ keys[index] = this.keys.get(bytesToHex(keyIds[index])) ?? null;
69
+ }
70
+ return keys;
70
71
  }
71
72
  async getSyncKeyData(keyId) {
72
73
  return this.keys.get(bytesToHex(keyId))?.keyData ?? null;
73
74
  }
74
75
  async getSyncKeyDataBatch(keyIds) {
75
- return keyIds.map((keyId) => this.keys.get(bytesToHex(keyId))?.keyData ?? null);
76
+ const keys = new Array(keyIds.length);
77
+ for (let index = 0; index < keyIds.length; index += 1) {
78
+ keys[index] = this.keys.get(bytesToHex(keyIds[index]))?.keyData ?? null;
79
+ }
80
+ return keys;
76
81
  }
77
82
  async getActiveSyncKey() {
78
83
  return pickActiveSyncKey(this.keys.values());
@@ -93,28 +98,21 @@ export class WaAppStateMemoryStore {
93
98
  async getCollectionStates(collections) {
94
99
  const result = new Array(collections.length);
95
100
  for (let index = 0; index < collections.length; index += 1) {
96
- const collection = collections[index];
97
- let state = this.collections.get(collection);
98
- if (!state) {
99
- state = {
100
- initialized: false,
101
- version: 0,
102
- hash: APP_STATE_EMPTY_LT_HASH,
103
- indexValueMap: new Map()
104
- };
105
- this.collections.set(collection, state);
106
- }
107
- result[index] = state;
101
+ result[index] = await this.getCollectionState(collections[index]);
108
102
  }
109
103
  return result;
110
104
  }
111
105
  async setCollectionStates(updates) {
112
106
  for (const update of updates) {
107
+ const indexValueMap = new Map();
108
+ for (const [key, value] of update.indexValueMap.entries()) {
109
+ setBoundedMapEntry(indexValueMap, key, value, this.maxCollectionEntries);
110
+ }
113
111
  this.collections.set(update.collection, {
114
112
  initialized: true,
115
113
  version: update.version,
116
114
  hash: update.hash,
117
- indexValueMap: toBoundedMap(update.indexValueMap.entries(), this.maxCollectionEntries)
115
+ indexValueMap
118
116
  });
119
117
  }
120
118
  }
@@ -24,17 +24,22 @@ export class WaDeviceListMemoryStore {
24
24
  }
25
25
  }
26
26
  async getUserDevicesBatch(userJids, nowMs = Date.now()) {
27
- return userJids.map((userJid) => {
27
+ const snapshots = new Array(userJids.length);
28
+ for (let index = 0; index < userJids.length; index += 1) {
29
+ const userJid = userJids[index];
28
30
  const record = this.records.get(userJid);
29
31
  if (!record) {
30
- return null;
32
+ snapshots[index] = null;
33
+ continue;
31
34
  }
32
35
  if (record.expiresAtMs <= nowMs) {
33
36
  this.records.delete(userJid);
34
- return null;
37
+ snapshots[index] = null;
38
+ continue;
35
39
  }
36
- return record;
37
- });
40
+ snapshots[index] = record;
41
+ }
42
+ return snapshots;
38
43
  }
39
44
  async deleteUserDevices(userJid) {
40
45
  return this.records.delete(userJid) ? 1 : 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() {
@@ -46,7 +46,12 @@ export class SenderKeyMemoryStore {
46
46
  return record ?? null;
47
47
  }
48
48
  async getDeviceSenderKeyDistributions(groupId, senders) {
49
- 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;
50
55
  }
51
56
  async deleteDeviceSenderKey(target, groupId) {
52
57
  let deleted = 0;
@@ -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,17 +124,33 @@ 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
  }
129
148
  async getSessionsBatch(addresses) {
130
- return addresses.map((address) => this.signalSessions.get(signalAddressKey(address)) ?? null);
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;
131
154
  }
132
155
  async setSession(address, session) {
133
156
  setBoundedMapEntry(this.signalSessions, signalAddressKey(address), session, this.maxSessions);
@@ -145,7 +168,11 @@ export class WaSignalMemoryStore {
145
168
  return this.remoteIdentities.get(signalAddressKey(address)) ?? null;
146
169
  }
147
170
  async getRemoteIdentities(addresses) {
148
- return addresses.map((address) => this.remoteIdentities.get(signalAddressKey(address)) ?? null);
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;
149
176
  }
150
177
  async setRemoteIdentity(address, identityKey) {
151
178
  setBoundedMapEntry(this.remoteIdentities, signalAddressKey(address), identityKey, this.maxRemoteIdentities);
@@ -167,16 +194,6 @@ export class WaSignalMemoryStore {
167
194
  this.nextPreKeyId = 1;
168
195
  }
169
196
  addUploadedPreKey(keyId) {
170
- if (this.uploadedPreKeys.has(keyId)) {
171
- this.uploadedPreKeys.delete(keyId);
172
- }
173
197
  this.uploadedPreKeys.add(keyId);
174
- while (this.uploadedPreKeys.size > this.maxPreKeys) {
175
- const oldest = this.uploadedPreKeys.values().next().value;
176
- if (oldest === undefined) {
177
- break;
178
- }
179
- this.uploadedPreKeys.delete(oldest);
180
- }
181
198
  }
182
199
  }
@@ -399,7 +399,9 @@ export class WaComms {
399
399
  this.schedulePendingFramesOverflowClose();
400
400
  return false;
401
401
  }
402
- this.pendingFrames.push(...frames);
402
+ for (let i = 0; i < frames.length; i += 1) {
403
+ this.pendingFrames.push(frames[i]);
404
+ }
403
405
  this.pendingFramesByteLength = nextBytes;
404
406
  return true;
405
407
  }
@@ -93,12 +93,6 @@ export class WaWebSocket {
93
93
  return (this.socket?.readyState === WA_READY_STATES.CONNECTING ||
94
94
  this.connectingSockets.size > 0);
95
95
  }
96
- getReadyState() {
97
- if (this.connectingSockets.size > 0) {
98
- return WA_READY_STATES.CONNECTING;
99
- }
100
- return this.socket?.readyState ?? WA_READY_STATES.CLOSED;
101
- }
102
96
  async open() {
103
97
  if (this.isOpen()) {
104
98
  this.logger.trace('socket open skipped: already open');
@@ -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
- });
@@ -59,22 +59,22 @@ function parsePacked(reader, alphabet) {
59
59
  const odd = (lengthByte & 0x80) !== 0;
60
60
  const byteCount = lengthByte & 0x7f;
61
61
  const outLength = byteCount * 2 - (odd ? 1 : 0);
62
- const chars = new Array(outLength);
62
+ const buf = new Uint8Array(outLength);
63
63
  let outIndex = 0;
64
64
  for (let i = 0; i < byteCount; i += 1) {
65
65
  const packed = reader.readUint8();
66
66
  const high = (packed >>> 4) & 0x0f;
67
67
  const low = packed & 0x0f;
68
68
  if (outIndex < outLength) {
69
- chars[outIndex] = alphabet[high];
69
+ buf[outIndex] = alphabet[high].charCodeAt(0);
70
70
  outIndex += 1;
71
71
  }
72
72
  if (outIndex < outLength) {
73
- chars[outIndex] = alphabet[low];
73
+ buf[outIndex] = alphabet[low].charCodeAt(0);
74
74
  outIndex += 1;
75
75
  }
76
76
  }
77
- return chars.join('');
77
+ return TEXT_DECODER.decode(buf);
78
78
  }
79
79
  function readBinary(reader, token) {
80
80
  if (token === BINARY_8) {
@@ -167,20 +167,14 @@ function writeListSize(size, writer) {
167
167
  writer.writeUint16(size);
168
168
  }
169
169
  function writeNodeInternal(node, writer) {
170
- let attrsLen = 0;
171
- for (const key in node.attrs) {
172
- if (Object.prototype.hasOwnProperty.call(node.attrs, key)) {
173
- attrsLen += 1;
174
- }
175
- }
170
+ const keys = Object.keys(node.attrs);
171
+ const attrsLen = keys.length;
176
172
  const hasContent = node.content !== null && node.content !== undefined;
177
173
  const listSize = 1 + attrsLen * 2 + (hasContent ? 1 : 0);
178
174
  writeListSize(listSize, writer);
179
175
  writeString(node.tag, writer);
180
- for (const key in node.attrs) {
181
- if (!Object.prototype.hasOwnProperty.call(node.attrs, key)) {
182
- continue;
183
- }
176
+ for (let i = 0; i < keys.length; i += 1) {
177
+ const key = keys[i];
184
178
  writeString(key, writer);
185
179
  writeString(node.attrs[key], writer);
186
180
  }
@@ -210,9 +204,8 @@ export function encodeBinaryNode(node) {
210
204
  return writer.toUint8Array();
211
205
  }
212
206
  export function encodeBinaryNodeStanza(node) {
213
- const encoded = encodeBinaryNode(node);
214
- const out = new Uint8Array(1 + encoded.length);
215
- out[0] = 0;
216
- out.set(encoded, 1);
217
- return out;
207
+ const writer = new ByteWriter();
208
+ writer.writeUint8(0x00);
209
+ writeNodeInternal(node, writer);
210
+ return writer.toUint8Array();
218
211
  }
@@ -1,4 +1,3 @@
1
1
  export * from '../binary/tokens.js';
2
2
  export * from '../binary/encoder.js';
3
3
  export * from '../binary/decoder.js';
4
- export { WAP_DECODE_CONSTANTS as WapDecodeConstants, WAP_ENCODE_CONSTANTS as WapEncodeConstants } from '../binary/constants.js';