zapo-js 0.2.0 → 0.3.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 (351) hide show
  1. package/README.md +7 -3
  2. package/dist/appstate/WaAppStateCrypto.js +49 -41
  3. package/dist/appstate/WaAppStateSyncClient.js +79 -42
  4. package/dist/appstate/index.js +2 -2
  5. package/dist/auth/WaAuthClient.js +20 -11
  6. package/dist/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  7. package/dist/auth/pairing/WaPairingFlow.js +26 -29
  8. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +29 -13
  9. package/dist/client/WaClient.js +115 -75
  10. package/dist/client/WaClientFactory.js +113 -30
  11. package/dist/client/connection/WaConnectionManager.js +4 -1
  12. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  13. package/dist/client/coordinators/WaBusinessCoordinator.js +3 -12
  14. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  15. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +33 -8
  16. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +55 -25
  17. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  18. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  19. package/dist/client/coordinators/WaProfileCoordinator.js +3 -1
  20. package/dist/client/coordinators/WaRetryCoordinator.js +11 -9
  21. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +22 -4
  22. package/dist/client/dirty.js +1 -1
  23. package/dist/client/events/abprops.js +43 -0
  24. package/dist/client/events/privacy-token.js +1 -2
  25. package/dist/client/events/registration.js +42 -0
  26. package/dist/client/incoming.js +37 -0
  27. package/dist/client/mailbox.js +17 -1
  28. package/dist/client/media.js +243 -0
  29. package/dist/client/messages.js +163 -86
  30. package/dist/crypto/core/index.js +4 -1
  31. package/dist/crypto/core/random.js +3 -9
  32. package/dist/crypto/core/xeddsa.js +57 -0
  33. package/dist/crypto/curves/X25519.js +18 -0
  34. package/dist/crypto/curves/constants.js +2 -1
  35. package/dist/esm/appstate/WaAppStateCrypto.js +39 -31
  36. package/dist/esm/appstate/WaAppStateSyncClient.js +68 -31
  37. package/dist/esm/appstate/index.js +1 -1
  38. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  39. package/dist/esm/auth/WaAuthClient.js +17 -8
  40. package/dist/esm/auth/{flow/WaAuthCredentialsFlow.js → credentials-flow.js} +83 -18
  41. package/dist/esm/auth/pairing/WaPairingFlow.js +25 -28
  42. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +20 -6
  43. package/dist/esm/client/WaClient.js +116 -76
  44. package/dist/esm/client/WaClientFactory.js +114 -31
  45. package/dist/esm/client/connection/WaConnectionManager.js +4 -1
  46. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  47. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +4 -13
  48. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  49. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +35 -10
  50. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +47 -17
  51. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  52. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +38 -20
  53. package/dist/esm/client/coordinators/WaProfileCoordinator.js +3 -1
  54. package/dist/esm/client/coordinators/WaRetryCoordinator.js +11 -9
  55. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +24 -6
  56. package/dist/esm/client/dirty.js +1 -1
  57. package/dist/esm/client/events/abprops.js +40 -0
  58. package/dist/esm/client/events/privacy-token.js +1 -2
  59. package/dist/esm/client/events/registration.js +39 -0
  60. package/dist/esm/client/incoming.js +36 -0
  61. package/dist/esm/client/mailbox.js +17 -1
  62. package/dist/esm/client/media.js +234 -0
  63. package/dist/esm/client/messages.js +162 -85
  64. package/dist/esm/crypto/core/index.js +1 -0
  65. package/dist/esm/crypto/core/random.js +2 -7
  66. package/dist/esm/crypto/core/xeddsa.js +53 -0
  67. package/dist/esm/crypto/curves/X25519.js +20 -2
  68. package/dist/esm/crypto/curves/constants.js +1 -0
  69. package/dist/esm/infra/perf/StoreLock.js +7 -4
  70. package/dist/esm/media/WaMediaCrypto.js +257 -62
  71. package/dist/esm/media/WaMediaTransferClient.js +47 -190
  72. package/dist/esm/media/constants.js +2 -0
  73. package/dist/esm/media/processor.js +1 -0
  74. package/dist/esm/message/addon-crypto.js +130 -3
  75. package/dist/esm/message/content.js +12 -6
  76. package/dist/esm/message/icdc.js +8 -8
  77. package/dist/esm/message/incoming.js +14 -12
  78. package/dist/esm/message/phash.js +32 -12
  79. package/dist/esm/message/reporting-token.js +3 -3
  80. package/dist/esm/message/use-case-secret.js +1 -1
  81. package/dist/esm/protocol/abprops.js +159 -0
  82. package/dist/esm/protocol/browser.js +14 -0
  83. package/dist/esm/protocol/constants.js +3 -1
  84. package/dist/esm/protocol/email.js +30 -0
  85. package/dist/esm/protocol/jid.js +44 -10
  86. package/dist/esm/protocol/nodes.js +6 -2
  87. package/dist/esm/protocol/notification.js +7 -1
  88. package/dist/esm/retry/reason.js +1 -1
  89. package/dist/esm/signal/api/SignalDeviceSyncApi.js +5 -2
  90. package/dist/esm/signal/api/SignalDigestSyncApi.js +8 -6
  91. package/dist/esm/signal/api/SignalIdentitySyncApi.js +4 -4
  92. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +1 -1
  93. package/dist/esm/signal/api/SignalSessionSyncApi.js +1 -1
  94. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -51
  95. package/dist/esm/signal/crypto/constants.js +0 -4
  96. package/dist/esm/signal/encoding.js +11 -54
  97. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  98. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  99. package/dist/esm/signal/group/SenderKeyManager.js +13 -10
  100. package/dist/esm/signal/registration/keygen.js +2 -3
  101. package/dist/esm/signal/registration/utils.js +2 -2
  102. package/dist/esm/signal/session/SignalProtocol.js +18 -17
  103. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  104. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  105. package/dist/esm/signal/session/SignalSession.js +11 -9
  106. package/dist/esm/signal/session/resolver.js +6 -6
  107. package/dist/esm/store/contracts/identity.store.js +1 -0
  108. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  109. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  110. package/dist/esm/store/contracts/session.store.js +1 -0
  111. package/dist/esm/store/createStore.js +48 -12
  112. package/dist/esm/store/index.js +4 -0
  113. package/dist/esm/store/locks/identity.lock.js +16 -0
  114. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  115. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  116. package/dist/esm/store/locks/session.lock.js +19 -0
  117. package/dist/esm/store/locks/signal.lock.js +0 -24
  118. package/dist/esm/store/noop.store.js +20 -0
  119. package/dist/esm/store/providers/memory/device-list.store.js +3 -0
  120. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  121. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  122. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  123. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  124. package/dist/esm/store/providers/memory/retry.store.js +25 -11
  125. package/dist/esm/store/providers/memory/session.store.js +45 -0
  126. package/dist/esm/store/providers/memory/signal.store.js +1 -164
  127. package/dist/esm/transport/WaComms.js +4 -3
  128. package/dist/esm/transport/WaWebSocket.js +9 -1
  129. package/dist/esm/transport/index.js +6 -0
  130. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  131. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  132. package/dist/esm/transport/node/WaNodeOrchestrator.js +17 -8
  133. package/dist/esm/transport/node/builders/abprops.js +20 -0
  134. package/dist/esm/transport/node/builders/device.js +11 -0
  135. package/dist/esm/transport/node/builders/email.js +65 -0
  136. package/dist/esm/transport/node/builders/offline.js +14 -0
  137. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  138. package/dist/esm/transport/node/builders/presence.js +13 -0
  139. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  140. package/dist/esm/transport/node/builders/retry.js +1 -1
  141. package/dist/esm/transport/node/helpers.js +24 -0
  142. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  143. package/dist/esm/transport/node/mex/client.js +83 -0
  144. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  145. package/dist/esm/transport/noise/WaClientPayload.js +15 -10
  146. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  147. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  148. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  149. package/dist/esm/transport/noise/WaNoiseSession.js +12 -11
  150. package/dist/infra/perf/StoreLock.js +7 -4
  151. package/dist/media/WaMediaCrypto.js +253 -58
  152. package/dist/media/WaMediaTransferClient.js +50 -223
  153. package/dist/media/constants.js +3 -1
  154. package/dist/media/processor.js +2 -0
  155. package/dist/message/addon-crypto.js +131 -0
  156. package/dist/message/content.js +13 -5
  157. package/dist/message/icdc.js +8 -8
  158. package/dist/message/incoming.js +14 -12
  159. package/dist/message/phash.js +32 -12
  160. package/dist/message/reporting-token.js +2 -2
  161. package/dist/message/use-case-secret.js +1 -1
  162. package/dist/protocol/abprops.js +163 -0
  163. package/dist/protocol/browser.js +15 -0
  164. package/dist/protocol/constants.js +14 -2
  165. package/dist/protocol/email.js +33 -0
  166. package/dist/protocol/jid.js +45 -10
  167. package/dist/protocol/nodes.js +6 -2
  168. package/dist/protocol/notification.js +8 -2
  169. package/dist/retry/reason.js +1 -1
  170. package/dist/signal/api/SignalDeviceSyncApi.js +5 -2
  171. package/dist/signal/api/SignalDigestSyncApi.js +8 -6
  172. package/dist/signal/api/SignalIdentitySyncApi.js +4 -4
  173. package/dist/signal/crypto/WaAdvSignature.js +2 -50
  174. package/dist/signal/crypto/constants.js +1 -5
  175. package/dist/signal/encoding.js +11 -49
  176. package/dist/signal/group/SenderKeyChain.js +2 -2
  177. package/dist/signal/group/SenderKeyCodec.js +4 -5
  178. package/dist/signal/group/SenderKeyManager.js +12 -9
  179. package/dist/signal/registration/keygen.js +1 -2
  180. package/dist/signal/registration/utils.js +2 -2
  181. package/dist/signal/session/SignalProtocol.js +18 -17
  182. package/dist/signal/session/SignalRatchet.js +19 -8
  183. package/dist/signal/session/SignalSerializer.js +5 -6
  184. package/dist/signal/session/SignalSession.js +11 -9
  185. package/dist/signal/session/resolver.js +6 -6
  186. package/dist/store/contracts/identity.store.js +2 -0
  187. package/dist/store/contracts/message-secret.store.js +2 -0
  188. package/dist/store/contracts/pre-key.store.js +2 -0
  189. package/dist/store/contracts/session.store.js +2 -0
  190. package/dist/store/createStore.js +47 -11
  191. package/dist/store/index.js +9 -1
  192. package/dist/store/locks/identity.lock.js +19 -0
  193. package/dist/store/locks/message-secret.lock.js +20 -0
  194. package/dist/store/locks/pre-key.lock.js +30 -0
  195. package/dist/store/locks/session.lock.js +22 -0
  196. package/dist/store/locks/signal.lock.js +0 -24
  197. package/dist/store/noop.store.js +21 -1
  198. package/dist/store/providers/memory/device-list.store.js +3 -0
  199. package/dist/store/providers/memory/identity.store.js +35 -0
  200. package/dist/store/providers/memory/message-secret.store.js +85 -0
  201. package/dist/store/providers/memory/participants.store.js +3 -0
  202. package/dist/store/providers/memory/pre-key.store.js +101 -0
  203. package/dist/store/providers/memory/retry.store.js +24 -10
  204. package/dist/store/providers/memory/session.store.js +49 -0
  205. package/dist/store/providers/memory/signal.store.js +1 -164
  206. package/dist/transport/WaComms.js +4 -3
  207. package/dist/transport/WaWebSocket.js +9 -1
  208. package/dist/transport/index.js +17 -1
  209. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  210. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  211. package/dist/transport/node/WaNodeOrchestrator.js +16 -7
  212. package/dist/transport/node/builders/abprops.js +23 -0
  213. package/dist/transport/node/builders/device.js +14 -0
  214. package/dist/transport/node/builders/email.js +72 -0
  215. package/dist/transport/node/builders/offline.js +17 -0
  216. package/dist/transport/node/builders/prekeys.js +36 -39
  217. package/dist/transport/node/builders/presence.js +16 -0
  218. package/dist/transport/node/builders/privacy-token.js +18 -22
  219. package/dist/transport/node/builders/retry.js +1 -1
  220. package/dist/transport/node/helpers.js +26 -0
  221. package/dist/transport/node/mex/argo-decoder.js +189 -0
  222. package/dist/transport/node/mex/client.js +86 -0
  223. package/dist/transport/node/mex/persist-ids.js +13 -0
  224. package/dist/transport/noise/WaClientPayload.js +14 -9
  225. package/dist/transport/noise/WaFrameCodec.js +1 -1
  226. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  227. package/dist/transport/noise/WaNoiseCert.js +8 -26
  228. package/dist/transport/noise/WaNoiseSession.js +11 -10
  229. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  230. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  231. package/dist/types/appstate/index.d.ts +1 -1
  232. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  233. package/dist/types/appstate/types.d.ts +1 -1
  234. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  235. package/dist/types/auth/credentials-flow.d.ts +20 -0
  236. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  237. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  238. package/dist/types/auth/types.d.ts +40 -0
  239. package/dist/types/client/WaClient.d.ts +19 -8
  240. package/dist/types/client/WaClientFactory.d.ts +10 -4
  241. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  242. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +1 -1
  243. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  244. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +6 -1
  245. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +15 -2
  246. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  247. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +13 -2
  248. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +1 -1
  249. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +4 -2
  250. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  251. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +11 -1
  252. package/dist/types/client/dirty.d.ts +3 -1
  253. package/dist/types/client/events/abprops.d.ts +14 -0
  254. package/dist/types/client/events/registration.d.ts +17 -0
  255. package/dist/types/client/incoming.d.ts +6 -1
  256. package/dist/types/client/mailbox.d.ts +2 -0
  257. package/dist/types/client/media.d.ts +31 -0
  258. package/dist/types/client/messages.d.ts +2 -0
  259. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +1 -1
  260. package/dist/types/client/types.d.ts +100 -1
  261. package/dist/types/crypto/core/index.d.ts +1 -0
  262. package/dist/types/crypto/core/primitives.d.ts +1 -1
  263. package/dist/types/crypto/core/random.d.ts +1 -1
  264. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  265. package/dist/types/crypto/curves/constants.d.ts +1 -0
  266. package/dist/types/crypto/index.d.ts +1 -0
  267. package/dist/types/index.d.ts +2 -1
  268. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  269. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  270. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  271. package/dist/types/media/WaMediaCrypto.d.ts +15 -6
  272. package/dist/types/media/WaMediaTransferClient.d.ts +3 -11
  273. package/dist/types/media/constants.d.ts +2 -0
  274. package/dist/types/media/index.d.ts +1 -0
  275. package/dist/types/media/processor.d.ts +28 -0
  276. package/dist/types/media/types.d.ts +9 -3
  277. package/dist/types/message/addon-crypto.d.ts +34 -3
  278. package/dist/types/message/content.d.ts +3 -1
  279. package/dist/types/message/icdc.d.ts +4 -4
  280. package/dist/types/message/types.d.ts +16 -24
  281. package/dist/types/protocol/abprops.d.ts +142 -0
  282. package/dist/types/protocol/browser.d.ts +1 -0
  283. package/dist/types/protocol/constants.d.ts +5 -1
  284. package/dist/types/protocol/email.d.ts +32 -0
  285. package/dist/types/protocol/jid.d.ts +1 -0
  286. package/dist/types/protocol/nodes.d.ts +4 -0
  287. package/dist/types/protocol/notification.d.ts +6 -0
  288. package/dist/types/protocol/stream.d.ts +1 -0
  289. package/dist/types/retry/reason.d.ts +1 -1
  290. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +3 -0
  291. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +3 -3
  292. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  293. package/dist/types/signal/crypto/constants.d.ts +0 -1
  294. package/dist/types/signal/encoding.d.ts +7 -1
  295. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  296. package/dist/types/signal/group/SenderKeyManager.d.ts +7 -2
  297. package/dist/types/signal/registration/utils.d.ts +2 -1
  298. package/dist/types/signal/session/SignalProtocol.d.ts +11 -2
  299. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  300. package/dist/types/signal/session/resolver.d.ts +4 -2
  301. package/dist/types/signal/types.d.ts +16 -4
  302. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  303. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  304. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  305. package/dist/types/store/contracts/session.store.d.ts +14 -0
  306. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  307. package/dist/types/store/index.d.ts +9 -1
  308. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  309. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  310. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  311. package/dist/types/store/locks/session.lock.d.ts +3 -0
  312. package/dist/types/store/noop.store.d.ts +4 -0
  313. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  314. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  315. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  316. package/dist/types/store/providers/memory/retry.store.d.ts +7 -1
  317. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  318. package/dist/types/store/providers/memory/signal.store.d.ts +3 -45
  319. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  320. package/dist/types/store/types.d.ts +21 -1
  321. package/dist/types/transport/WaWebSocket.d.ts +1 -0
  322. package/dist/types/transport/index.d.ts +8 -1
  323. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  324. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  325. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +6 -2
  326. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  327. package/dist/types/transport/node/builders/device.d.ts +2 -0
  328. package/dist/types/transport/node/builders/email.d.ts +11 -0
  329. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  330. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  331. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  332. package/dist/types/transport/node/helpers.d.ts +3 -0
  333. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  334. package/dist/types/transport/node/mex/client.d.ts +18 -0
  335. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  336. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  337. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  338. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  339. package/dist/types/transport/types.d.ts +8 -0
  340. package/package.json +6 -4
  341. package/dist/auth/pairing/constants.js +0 -5
  342. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  343. package/dist/esm/auth/pairing/constants.js +0 -2
  344. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  345. package/dist/esm/transport/node/builders/index.js +0 -11
  346. package/dist/transport/node/builders/index.js +0 -51
  347. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  348. package/dist/types/auth/pairing/constants.d.ts +0 -2
  349. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  350. package/dist/types/transport/node/builders/index.d.ts +0 -11
  351. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -2,29 +2,38 @@ import { withAppStateLock } from './locks/appstate.lock.js';
2
2
  import { withAuthLock } from './locks/auth.lock.js';
3
3
  import { withContactLock } from './locks/contact.lock.js';
4
4
  import { withDeviceListLock } from './locks/device-list.lock.js';
5
+ import { withIdentityLock } from './locks/identity.lock.js';
6
+ import { withMessageSecretLock } from './locks/message-secret.lock.js';
5
7
  import { withMessageLock } from './locks/message.lock.js';
6
8
  import { withParticipantsLock } from './locks/participants.lock.js';
9
+ import { withPreKeyLock } from './locks/pre-key.lock.js';
7
10
  import { withPrivacyTokenLock } from './locks/privacy-token.lock.js';
8
11
  import { withRetryLock } from './locks/retry.lock.js';
9
12
  import { withSenderKeyLock } from './locks/sender-key.lock.js';
13
+ import { withSessionLock } from './locks/session.lock.js';
10
14
  import { withSignalLock } from './locks/signal.lock.js';
11
15
  import { withThreadLock } from './locks/thread.lock.js';
12
- import { NOOP_CONTACT_STORE, NOOP_DEVICE_LIST_STORE, NOOP_MESSAGE_STORE, NOOP_PARTICIPANTS_STORE, NOOP_THREAD_STORE } from './noop.store.js';
16
+ import { NOOP_CONTACT_STORE, NOOP_DEVICE_LIST_STORE, NOOP_MESSAGE_SECRET_STORE, NOOP_MESSAGE_STORE, NOOP_PARTICIPANTS_STORE, NOOP_RETRY_STORE, NOOP_THREAD_STORE } from './noop.store.js';
13
17
  import { WaAppStateMemoryStore } from './providers/memory/appstate.store.js';
14
18
  import { WaContactMemoryStore } from './providers/memory/contact.store.js';
15
19
  import { WaDeviceListMemoryStore } from './providers/memory/device-list.store.js';
20
+ import { WaIdentityMemoryStore } from './providers/memory/identity.store.js';
21
+ import { WaMessageSecretMemoryStore } from './providers/memory/message-secret.store.js';
16
22
  import { WaMessageMemoryStore } from './providers/memory/message.store.js';
17
23
  import { WaParticipantsMemoryStore } from './providers/memory/participants.store.js';
24
+ import { WaPreKeyMemoryStore } from './providers/memory/pre-key.store.js';
18
25
  import { WaPrivacyTokenMemoryStore } from './providers/memory/privacy-token.store.js';
19
26
  import { WaRetryMemoryStore } from './providers/memory/retry.store.js';
20
27
  import { SenderKeyMemoryStore } from './providers/memory/sender-key.store.js';
28
+ import { WaSessionMemoryStore } from './providers/memory/session.store.js';
21
29
  import { WaSignalMemoryStore } from './providers/memory/signal.store.js';
22
30
  import { WaThreadMemoryStore } from './providers/memory/thread.store.js';
23
31
  import { resolvePositive } from '../util/coercion.js';
24
32
  const DEFAULT_CACHE_TTLS_MS = Object.freeze({
25
33
  retryMs: 60 * 1000,
26
34
  participantsMs: 5 * 60 * 1000,
27
- deviceListMs: 5 * 60 * 1000
35
+ deviceListMs: 5 * 60 * 1000,
36
+ messageSecretMs: 30 * 60 * 1000
28
37
  });
29
38
  function hasDestroy(value) {
30
39
  return (!!value &&
@@ -58,7 +67,8 @@ export function createStore(options) {
58
67
  const cacheTtlsMs = Object.freeze({
59
68
  retry: resolvePositive(options.memory?.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'memory.cacheTtlMs.retryMs'),
60
69
  participants: resolvePositive(options.memory?.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'memory.cacheTtlMs.participantsMs'),
61
- deviceList: resolvePositive(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs')
70
+ deviceList: resolvePositive(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs'),
71
+ messageSecret: resolvePositive(options.memory?.cacheTtlMs?.messageSecretMs, DEFAULT_CACHE_TTLS_MS.messageSecretMs, 'memory.cacheTtlMs.messageSecretMs')
62
72
  });
63
73
  const sessions = new Map();
64
74
  let storeDestroyed = false;
@@ -78,9 +88,10 @@ export function createStore(options) {
78
88
  const rawAuth = resolveStore(id, backends, providers.auth, 'auth', 'stores', () => {
79
89
  throw new Error('providers.auth is required — register a backend or set providers.auth');
80
90
  });
81
- const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new WaSignalMemoryStore({
82
- maxPreKeys: ml.signalPreKeys,
83
- maxSessions: ml.signalSessions,
91
+ const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new WaSignalMemoryStore());
92
+ const rawPreKey = resolveStore(id, backends, providers.preKey ?? 'memory', 'preKey', 'stores', () => new WaPreKeyMemoryStore({ maxPreKeys: ml.signalPreKeys }));
93
+ const rawSession = resolveStore(id, backends, providers.session ?? 'memory', 'session', 'stores', () => new WaSessionMemoryStore({ maxSessions: ml.signalSessions }));
94
+ const rawIdentity = resolveStore(id, backends, providers.identity ?? 'memory', 'identity', 'stores', () => new WaIdentityMemoryStore({
84
95
  maxRemoteIdentities: ml.signalRemoteIdentities
85
96
  }));
86
97
  const rawSenderKey = resolveStore(id, backends, providers.senderKey ?? 'memory', 'senderKey', 'stores', () => new SenderKeyMemoryStore({
@@ -101,7 +112,12 @@ export function createStore(options) {
101
112
  ? new WaContactMemoryStore({ maxContacts: ml.contacts })
102
113
  : NOOP_CONTACT_STORE);
103
114
  const rawPrivacyToken = resolveStore(id, backends, providers.privacyToken ?? 'memory', 'privacyToken', 'stores', () => new WaPrivacyTokenMemoryStore(ml.privacyTokens));
104
- const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => new WaRetryMemoryStore(cacheTtlsMs.retry));
115
+ const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => cacheProviders.retry === 'memory' || !cacheProviders.retry
116
+ ? new WaRetryMemoryStore(cacheTtlsMs.retry, {
117
+ maxOutboundMessages: ml.retryOutboundMessages,
118
+ maxInboundCounters: ml.retryInboundCounters
119
+ })
120
+ : NOOP_RETRY_STORE);
105
121
  const rawParticipants = resolveStore(id, backends, cacheProviders.participants ?? 'memory', 'participants', 'caches', () => cacheProviders.participants === 'memory'
106
122
  ? new WaParticipantsMemoryStore(cacheTtlsMs.participants, {
107
123
  maxGroups: ml.participantsGroups
@@ -112,14 +128,23 @@ export function createStore(options) {
112
128
  maxUsers: ml.deviceListUsers
113
129
  })
114
130
  : NOOP_DEVICE_LIST_STORE);
131
+ const rawMessageSecret = resolveStore(id, backends, cacheProviders.messageSecret ?? 'none', 'messageSecret', 'caches', () => cacheProviders.messageSecret === 'memory'
132
+ ? new WaMessageSecretMemoryStore(cacheTtlsMs.messageSecret, {
133
+ maxSecrets: ml.messageSecrets
134
+ })
135
+ : NOOP_MESSAGE_SECRET_STORE);
115
136
  const authStore = withAuthLock(rawAuth);
116
137
  const signalStore = withSignalLock(rawSignal);
138
+ const preKeyStore = withPreKeyLock(rawPreKey);
139
+ const sessionStore = withSessionLock(rawSession);
140
+ const identityStore = withIdentityLock(rawIdentity);
117
141
  const senderKeyStore = withSenderKeyLock(rawSenderKey);
118
142
  const appStateStore = withAppStateLock(rawAppState);
119
143
  const retryStore = withRetryLock(rawRetry);
120
144
  const participantsStore = withParticipantsLock(rawParticipants);
121
145
  const deviceListStore = withDeviceListLock(rawDeviceList);
122
146
  const messageStore = withMessageLock(rawMessages);
147
+ const messageSecretStore = withMessageSecretLock(rawMessageSecret);
123
148
  const threadStore = withThreadLock(rawThreads);
124
149
  const contactStore = withContactLock(rawContacts);
125
150
  const privacyTokenStore = withPrivacyTokenLock(rawPrivacyToken);
@@ -132,12 +157,14 @@ export function createStore(options) {
132
157
  await Promise.all([
133
158
  retryStore.clear(),
134
159
  participantsStore.clear(),
135
- deviceListStore.clear()
160
+ deviceListStore.clear(),
161
+ messageSecretStore.clear()
136
162
  ]);
137
163
  await Promise.all([
138
164
  destroyIfSupported(retryStore),
139
165
  destroyIfSupported(participantsStore),
140
- destroyIfSupported(deviceListStore)
166
+ destroyIfSupported(deviceListStore),
167
+ destroyIfSupported(messageSecretStore)
141
168
  ]);
142
169
  };
143
170
  const destroy = async () => {
@@ -148,6 +175,9 @@ export function createStore(options) {
148
175
  await Promise.all([
149
176
  destroyIfSupported(authStore),
150
177
  destroyIfSupported(signalStore),
178
+ destroyIfSupported(preKeyStore),
179
+ destroyIfSupported(sessionStore),
180
+ destroyIfSupported(identityStore),
151
181
  destroyIfSupported(senderKeyStore),
152
182
  destroyIfSupported(appStateStore),
153
183
  destroyIfSupported(messageStore),
@@ -156,23 +186,27 @@ export function createStore(options) {
156
186
  destroyIfSupported(privacyTokenStore)
157
187
  ]);
158
188
  };
159
- const session = {
189
+ const storeSession = {
160
190
  auth: authStore,
161
191
  signal: signalStore,
192
+ preKey: preKeyStore,
193
+ session: sessionStore,
194
+ identity: identityStore,
162
195
  senderKey: senderKeyStore,
163
196
  appState: appStateStore,
164
197
  retry: retryStore,
165
198
  participants: participantsStore,
166
199
  deviceList: deviceListStore,
167
200
  messages: messageStore,
201
+ messageSecret: messageSecretStore,
168
202
  threads: threadStore,
169
203
  contacts: contactStore,
170
204
  privacyToken: privacyTokenStore,
171
205
  destroyCaches,
172
206
  destroy
173
207
  };
174
- sessions.set(id, session);
175
- return session;
208
+ sessions.set(id, storeSession);
209
+ return storeSession;
176
210
  },
177
211
  async destroyCaches() {
178
212
  const list = Array.from(sessions.values());
@@ -185,6 +219,8 @@ export function createStore(options) {
185
219
  const list = Array.from(sessions.values());
186
220
  sessions.clear();
187
221
  await Promise.all(list.map((s) => s.destroy()));
222
+ const uniqueBackends = new Set(Object.values(backends));
223
+ await Promise.all(Array.from(uniqueBackends, (backend) => destroyIfSupported(backend)));
188
224
  }
189
225
  };
190
226
  }
@@ -1,11 +1,15 @@
1
1
  export { createStore } from './createStore.js';
2
2
  export { WaAppStateMemoryStore } from './providers/memory/appstate.store.js';
3
3
  export { WaSignalMemoryStore } from './providers/memory/signal.store.js';
4
+ export { WaPreKeyMemoryStore } from './providers/memory/pre-key.store.js';
5
+ export { WaSessionMemoryStore } from './providers/memory/session.store.js';
6
+ export { WaIdentityMemoryStore } from './providers/memory/identity.store.js';
4
7
  export { SenderKeyMemoryStore } from './providers/memory/sender-key.store.js';
5
8
  export { WaRetryMemoryStore } from './providers/memory/retry.store.js';
6
9
  export { WaParticipantsMemoryStore } from './providers/memory/participants.store.js';
7
10
  export { WaDeviceListMemoryStore } from './providers/memory/device-list.store.js';
8
11
  export { WaContactMemoryStore } from './providers/memory/contact.store.js';
12
+ export { WaMessageSecretMemoryStore } from './providers/memory/message-secret.store.js';
9
13
  export { WaMessageMemoryStore } from './providers/memory/message.store.js';
10
14
  export { WaThreadMemoryStore } from './providers/memory/thread.store.js';
11
15
  export { WaPrivacyTokenMemoryStore } from './providers/memory/privacy-token.store.js';
@@ -0,0 +1,16 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ export function withIdentityLock(store) {
3
+ const gate = new SharedExclusiveGate();
4
+ const destroyStore = store;
5
+ return {
6
+ getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
7
+ getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
8
+ setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
9
+ setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
10
+ clear: () => gate.runExclusive(() => store.clear()),
11
+ destroy: async () => {
12
+ await gate.close();
13
+ await destroyStore.destroy?.();
14
+ }
15
+ };
16
+ }
@@ -0,0 +1,17 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ export function withMessageSecretLock(store) {
3
+ const gate = new SharedExclusiveGate();
4
+ const destroyStore = store;
5
+ return {
6
+ get: (messageId, nowMs) => gate.runShared(() => store.get(messageId, nowMs)),
7
+ getBatch: (messageIds, nowMs) => gate.runShared(() => store.getBatch(messageIds, nowMs)),
8
+ set: (messageId, entry) => gate.runShared(() => store.set(messageId, entry)),
9
+ setBatch: (entries) => gate.runShared(() => store.setBatch(entries)),
10
+ cleanupExpired: (nowMs) => gate.runExclusive(() => store.cleanupExpired(nowMs)),
11
+ clear: () => gate.runExclusive(() => store.clear()),
12
+ destroy: async () => {
13
+ await gate.close();
14
+ await destroyStore.destroy?.();
15
+ }
16
+ };
17
+ }
@@ -0,0 +1,27 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ import { StoreLock } from '../../infra/perf/StoreLock.js';
3
+ const WA_PREKEY_KEY = 'prekey:prekeys';
4
+ const WA_PREKEY_SERVER_KEY = 'prekey:serverHasPreKeys';
5
+ const WA_PREKEY_CLEAR_KEY = 'prekey:clear';
6
+ export function withPreKeyLock(store) {
7
+ const lock = new StoreLock();
8
+ const gate = new SharedExclusiveGate();
9
+ const destroyStore = store;
10
+ return {
11
+ putPreKey: (record) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.putPreKey(record))),
12
+ getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenPreKeys(count, generator))),
13
+ getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
14
+ getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
15
+ consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.consumePreKeyById(keyId))),
16
+ getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenSinglePreKey(generator))),
17
+ markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.markKeyAsUploaded(keyId))),
18
+ setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_PREKEY_SERVER_KEY, () => store.setServerHasPreKeys(value))),
19
+ getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
20
+ clear: () => gate.runExclusive(() => lock.run(WA_PREKEY_CLEAR_KEY, () => store.clear())),
21
+ destroy: async () => {
22
+ await gate.close();
23
+ await lock.shutdown();
24
+ await destroyStore.destroy?.();
25
+ }
26
+ };
27
+ }
@@ -0,0 +1,19 @@
1
+ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
+ export function withSessionLock(store) {
3
+ const gate = new SharedExclusiveGate();
4
+ const destroyStore = store;
5
+ return {
6
+ hasSession: (address) => gate.runShared(() => store.hasSession(address)),
7
+ hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
8
+ getSession: (address) => gate.runShared(() => store.getSession(address)),
9
+ getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
10
+ setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
11
+ setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
12
+ deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
13
+ clear: () => gate.runExclusive(() => store.clear()),
14
+ destroy: async () => {
15
+ await gate.close();
16
+ await destroyStore.destroy?.();
17
+ }
18
+ };
19
+ }
@@ -2,8 +2,6 @@ import { SharedExclusiveGate } from '../../infra/perf/SharedExclusiveGate.js';
2
2
  import { StoreLock } from '../../infra/perf/StoreLock.js';
3
3
  const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
4
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
5
  const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
8
6
  export function withSignalLock(store) {
9
7
  const lock = new StoreLock();
@@ -28,28 +26,6 @@ export function withSignalLock(store) {
28
26
  getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
29
27
  setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
30
28
  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
29
  clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
54
30
  await store.clear();
55
31
  cachedRegInfo = undefined;
@@ -1,4 +1,12 @@
1
1
  const EMPTY_STORE_LIST = Object.freeze([]);
2
+ export const NOOP_MESSAGE_SECRET_STORE = Object.freeze({
3
+ get: async (_messageId) => null,
4
+ getBatch: async (messageIds) => new Array(messageIds.length).fill(null),
5
+ set: async (_messageId, _entry) => { },
6
+ setBatch: async (_entries) => { },
7
+ cleanupExpired: async (_nowMs) => 0,
8
+ clear: async () => { }
9
+ });
2
10
  export const NOOP_MESSAGE_STORE = Object.freeze({
3
11
  upsert: async (_record) => { },
4
12
  upsertBatch: async (_records) => { },
@@ -22,6 +30,18 @@ export const NOOP_CONTACT_STORE = Object.freeze({
22
30
  deleteByJid: async (_jid) => 0,
23
31
  clear: async () => { }
24
32
  });
33
+ export const NOOP_RETRY_STORE = Object.freeze({
34
+ getOutboundRequesterStatus: async () => null,
35
+ upsertOutboundMessage: async (_record) => { },
36
+ deleteOutboundMessage: async (_messageId) => 0,
37
+ getOutboundMessage: async (_messageId) => null,
38
+ updateOutboundMessageState: async () => { },
39
+ markOutboundRequesterDelivered: async () => { },
40
+ incrementInboundCounter: async () => 0,
41
+ cleanupExpired: async (_nowMs) => 0,
42
+ clear: async () => { },
43
+ destroy: async () => { }
44
+ });
25
45
  export const NOOP_PARTICIPANTS_STORE = Object.freeze({
26
46
  upsertGroupParticipants: async (_snapshot) => { },
27
47
  getGroupParticipants: async (_groupJid, _nowMs) => null,
@@ -6,6 +6,9 @@ const DEFAULTS = Object.freeze({
6
6
  });
7
7
  export class WaDeviceListMemoryStore {
8
8
  constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
9
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
10
+ throw new Error('device-list ttlMs must be a positive finite number');
11
+ }
9
12
  this.records = new Map();
10
13
  this.ttlMs = ttlMs;
11
14
  this.maxUsers = resolvePositive(options.maxUsers, DEFAULTS.maxUsers, 'WaDeviceListMemoryStoreOptions.maxUsers');
@@ -0,0 +1,31 @@
1
+ import { signalAddressKey } from '../../../protocol/jid.js';
2
+ import { resolvePositive } from '../../../util/coercion.js';
3
+ import { setBoundedMapEntry } from '../../../util/collections.js';
4
+ const DEFAULT_MAX_REMOTE_IDENTITIES = 8192;
5
+ export class WaIdentityMemoryStore {
6
+ constructor(options = {}) {
7
+ this.remoteIdentities = new Map();
8
+ this.maxRemoteIdentities = resolvePositive(options.maxRemoteIdentities, DEFAULT_MAX_REMOTE_IDENTITIES, 'WaIdentityMemoryStoreOptions.maxRemoteIdentities');
9
+ }
10
+ async getRemoteIdentity(address) {
11
+ return this.remoteIdentities.get(signalAddressKey(address)) ?? null;
12
+ }
13
+ async getRemoteIdentities(addresses) {
14
+ const result = new Array(addresses.length);
15
+ for (let i = 0; i < addresses.length; i += 1) {
16
+ result[i] = this.remoteIdentities.get(signalAddressKey(addresses[i])) ?? null;
17
+ }
18
+ return result;
19
+ }
20
+ async setRemoteIdentity(address, identityKey) {
21
+ setBoundedMapEntry(this.remoteIdentities, signalAddressKey(address), identityKey, this.maxRemoteIdentities);
22
+ }
23
+ async setRemoteIdentities(entries) {
24
+ for (const entry of entries) {
25
+ setBoundedMapEntry(this.remoteIdentities, signalAddressKey(entry.address), entry.identityKey, this.maxRemoteIdentities);
26
+ }
27
+ }
28
+ async clear() {
29
+ this.remoteIdentities.clear();
30
+ }
31
+ }
@@ -0,0 +1,81 @@
1
+ import { resolvePositive } from '../../../util/coercion.js';
2
+ import { resolveCleanupIntervalMs, setBoundedMapEntry } from '../../../util/collections.js';
3
+ const DEFAULTS = Object.freeze({
4
+ ttlMs: 30 * 60 * 1000,
5
+ maxSecrets: 10000
6
+ });
7
+ export class WaMessageSecretMemoryStore {
8
+ constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
9
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
10
+ throw new Error('message-secret ttlMs must be a positive finite number');
11
+ }
12
+ this.secrets = new Map();
13
+ this.ttlMs = ttlMs;
14
+ this.maxSecrets = resolvePositive(options.maxSecrets, DEFAULTS.maxSecrets, 'WaMessageSecretMemoryStoreOptions.maxSecrets');
15
+ this.cleanupTimer = setInterval(() => {
16
+ void this.cleanupExpired(Date.now());
17
+ }, resolveCleanupIntervalMs(ttlMs));
18
+ this.cleanupTimer.unref();
19
+ }
20
+ async get(messageId, nowMs = Date.now()) {
21
+ const cached = this.secrets.get(messageId);
22
+ if (!cached)
23
+ return null;
24
+ if (cached.expiresAtMs <= nowMs) {
25
+ this.secrets.delete(messageId);
26
+ return null;
27
+ }
28
+ return { secret: cached.secret, senderJid: cached.senderJid };
29
+ }
30
+ async getBatch(messageIds, nowMs = Date.now()) {
31
+ const result = new Array(messageIds.length);
32
+ for (let i = 0; i < messageIds.length; i += 1) {
33
+ const cached = this.secrets.get(messageIds[i]);
34
+ if (!cached) {
35
+ result[i] = null;
36
+ continue;
37
+ }
38
+ if (cached.expiresAtMs <= nowMs) {
39
+ this.secrets.delete(messageIds[i]);
40
+ result[i] = null;
41
+ continue;
42
+ }
43
+ result[i] = { secret: cached.secret, senderJid: cached.senderJid };
44
+ }
45
+ return result;
46
+ }
47
+ async set(messageId, entry) {
48
+ setBoundedMapEntry(this.secrets, messageId, {
49
+ secret: entry.secret,
50
+ senderJid: entry.senderJid,
51
+ expiresAtMs: Date.now() + this.ttlMs
52
+ }, this.maxSecrets);
53
+ }
54
+ async setBatch(entries) {
55
+ const nowMs = Date.now();
56
+ for (let i = 0; i < entries.length; i += 1) {
57
+ setBoundedMapEntry(this.secrets, entries[i].messageId, {
58
+ secret: entries[i].entry.secret,
59
+ senderJid: entries[i].entry.senderJid,
60
+ expiresAtMs: nowMs + this.ttlMs
61
+ }, this.maxSecrets);
62
+ }
63
+ }
64
+ async cleanupExpired(nowMs) {
65
+ let removed = 0;
66
+ for (const [messageId, entry] of this.secrets) {
67
+ if (entry.expiresAtMs > nowMs)
68
+ continue;
69
+ this.secrets.delete(messageId);
70
+ removed += 1;
71
+ }
72
+ return removed;
73
+ }
74
+ async clear() {
75
+ this.secrets.clear();
76
+ }
77
+ async destroy() {
78
+ clearInterval(this.cleanupTimer);
79
+ this.secrets.clear();
80
+ }
81
+ }
@@ -6,6 +6,9 @@ const DEFAULTS = Object.freeze({
6
6
  });
7
7
  export class WaParticipantsMemoryStore {
8
8
  constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
9
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
10
+ throw new Error('participants ttlMs must be a positive finite number');
11
+ }
9
12
  this.records = new Map();
10
13
  this.ttlMs = ttlMs;
11
14
  this.maxGroups = resolvePositive(options.maxGroups, DEFAULTS.maxGroups, 'WaParticipantsMemoryStoreOptions.maxGroups');
@@ -0,0 +1,97 @@
1
+ import { resolvePositive } from '../../../util/coercion.js';
2
+ import { setBoundedMapEntry } from '../../../util/collections.js';
3
+ const DEFAULT_MAX_PRE_KEYS = 4096;
4
+ export class WaPreKeyMemoryStore {
5
+ constructor(options = {}) {
6
+ this.preKeys = new Map();
7
+ this.uploadedPreKeys = new Set();
8
+ this.serverHasPreKeys = false;
9
+ this.nextPreKeyId = 1;
10
+ this.maxPreKeys = resolvePositive(options.maxPreKeys, DEFAULT_MAX_PRE_KEYS, 'WaPreKeyMemoryStoreOptions.maxPreKeys');
11
+ }
12
+ async putPreKey(record) {
13
+ setBoundedMapEntry(this.preKeys, record.keyId, record, this.maxPreKeys, (keyId) => {
14
+ this.uploadedPreKeys.delete(keyId);
15
+ });
16
+ if (record.keyId >= this.nextPreKeyId) {
17
+ this.nextPreKeyId = record.keyId + 1;
18
+ }
19
+ }
20
+ async getOrGenPreKeys(count, generator) {
21
+ if (!Number.isSafeInteger(count) || count <= 0) {
22
+ throw new Error(`invalid prekey count: ${count}`);
23
+ }
24
+ const available = [];
25
+ const availableKeyIds = [];
26
+ for (const keyId of this.preKeys.keys()) {
27
+ if (!this.uploadedPreKeys.has(keyId)) {
28
+ availableKeyIds.push(keyId);
29
+ }
30
+ }
31
+ availableKeyIds.sort((left, right) => left - right);
32
+ for (let index = 0; index < availableKeyIds.length; index += 1) {
33
+ const keyId = availableKeyIds[index];
34
+ const record = this.preKeys.get(keyId);
35
+ if (!record) {
36
+ continue;
37
+ }
38
+ available.push(record);
39
+ if (available.length >= count) {
40
+ return available;
41
+ }
42
+ }
43
+ while (available.length < count) {
44
+ const record = await generator(this.nextPreKeyId++);
45
+ setBoundedMapEntry(this.preKeys, record.keyId, record, this.maxPreKeys, (keyId) => {
46
+ this.uploadedPreKeys.delete(keyId);
47
+ });
48
+ available.push(record);
49
+ }
50
+ return available;
51
+ }
52
+ async getPreKeyById(keyId) {
53
+ return this.preKeys.get(keyId) ?? null;
54
+ }
55
+ async getPreKeysById(keyIds) {
56
+ const result = new Array(keyIds.length);
57
+ for (let i = 0; i < keyIds.length; i += 1) {
58
+ result[i] = this.preKeys.get(keyIds[i]) ?? null;
59
+ }
60
+ return result;
61
+ }
62
+ async consumePreKeyById(keyId) {
63
+ const record = this.preKeys.get(keyId) ?? null;
64
+ if (!record) {
65
+ return null;
66
+ }
67
+ this.preKeys.delete(keyId);
68
+ this.uploadedPreKeys.delete(keyId);
69
+ return record;
70
+ }
71
+ async getOrGenSinglePreKey(generator) {
72
+ const preKeys = await this.getOrGenPreKeys(1, generator);
73
+ return preKeys[0];
74
+ }
75
+ async markKeyAsUploaded(keyId) {
76
+ if (keyId < 0 || keyId >= this.nextPreKeyId) {
77
+ throw new Error(`prekey ${keyId} is out of boundary`);
78
+ }
79
+ for (const candidate of this.preKeys.keys()) {
80
+ if (candidate <= keyId) {
81
+ this.uploadedPreKeys.add(candidate);
82
+ }
83
+ }
84
+ }
85
+ async setServerHasPreKeys(value) {
86
+ this.serverHasPreKeys = value;
87
+ }
88
+ async getServerHasPreKeys() {
89
+ return this.serverHasPreKeys;
90
+ }
91
+ async clear() {
92
+ this.preKeys.clear();
93
+ this.uploadedPreKeys.clear();
94
+ this.serverHasPreKeys = false;
95
+ this.nextPreKeyId = 1;
96
+ }
97
+ }