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
@@ -7,7 +7,7 @@ const jid_1 = require("../../protocol/jid");
7
7
  const bytes_1 = require("../../util/bytes");
8
8
  const primitives_1 = require("../../util/primitives");
9
9
  function createSignalSessionResolver(options) {
10
- const { signalProtocol, signalStore, signalIdentitySync, signalSessionSync, logger } = options;
10
+ const { signalProtocol, sessionStore, identityStore, signalIdentitySync, signalSessionSync, logger } = options;
11
11
  const dedup = new PromiseDedup_1.PromiseDedup();
12
12
  const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
13
13
  const expectedSerializedIdentity = expectedIdentity
@@ -16,9 +16,9 @@ function createSignalSessionResolver(options) {
16
16
  if (reasonIdentity) {
17
17
  await signalIdentitySync.syncIdentityKeys([jid]);
18
18
  }
19
- if (await signalStore.hasSession(address)) {
19
+ if (await sessionStore.hasSession(address)) {
20
20
  if (expectedSerializedIdentity) {
21
- const storedIdentity = await signalStore.getRemoteIdentity(address);
21
+ const storedIdentity = await identityStore.getRemoteIdentity(address);
22
22
  if (!storedIdentity || !(0, bytes_1.uint8Equal)(storedIdentity, expectedSerializedIdentity)) {
23
23
  throw new Error('identity mismatch');
24
24
  }
@@ -41,7 +41,7 @@ function createSignalSessionResolver(options) {
41
41
  }
42
42
  const remoteIdentity = (0, keys_1.toSerializedPubKey)(fetched.bundle.identity);
43
43
  if (reasonIdentity) {
44
- const storedIdentity = await signalStore.getRemoteIdentity(address);
44
+ const storedIdentity = await identityStore.getRemoteIdentity(address);
45
45
  if (storedIdentity && !(0, bytes_1.uint8Equal)(remoteIdentity, storedIdentity)) {
46
46
  throw new Error('identity mismatch');
47
47
  }
@@ -99,7 +99,7 @@ function createSignalSessionResolver(options) {
99
99
  }
100
100
  }
101
101
  }
102
- const resolvedByIndex = (await signalStore.getSessionsBatch(normalizedTargetAddresses));
102
+ const resolvedByIndex = (await sessionStore.getSessionsBatch(normalizedTargetAddresses));
103
103
  const collectResolvedTargets = () => {
104
104
  const resolvedTargets = new Array(normalizedTargetJids.length);
105
105
  let resolvedTargetCount = 0;
@@ -202,7 +202,7 @@ function createSignalSessionResolver(options) {
202
202
  for (let i = 0; i < fallbackIndices.length; i++) {
203
203
  fallbackAddresses[i] = normalizedTargetAddresses[fallbackIndices[i]];
204
204
  }
205
- const fallbackSessions = await signalStore.getSessionsBatch(fallbackAddresses);
205
+ const fallbackSessions = await sessionStore.getSessionsBatch(fallbackAddresses);
206
206
  for (let i = 0; i < fallbackIndices.length; i++) {
207
207
  const session = fallbackSessions[i];
208
208
  if (session) {
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -5,29 +5,38 @@ const appstate_lock_1 = require("./locks/appstate.lock");
5
5
  const auth_lock_1 = require("./locks/auth.lock");
6
6
  const contact_lock_1 = require("./locks/contact.lock");
7
7
  const device_list_lock_1 = require("./locks/device-list.lock");
8
+ const identity_lock_1 = require("./locks/identity.lock");
9
+ const message_secret_lock_1 = require("./locks/message-secret.lock");
8
10
  const message_lock_1 = require("./locks/message.lock");
9
11
  const participants_lock_1 = require("./locks/participants.lock");
12
+ const pre_key_lock_1 = require("./locks/pre-key.lock");
10
13
  const privacy_token_lock_1 = require("./locks/privacy-token.lock");
11
14
  const retry_lock_1 = require("./locks/retry.lock");
12
15
  const sender_key_lock_1 = require("./locks/sender-key.lock");
16
+ const session_lock_1 = require("./locks/session.lock");
13
17
  const signal_lock_1 = require("./locks/signal.lock");
14
18
  const thread_lock_1 = require("./locks/thread.lock");
15
19
  const noop_store_1 = require("./noop.store");
16
20
  const appstate_store_1 = require("./providers/memory/appstate.store");
17
21
  const contact_store_1 = require("./providers/memory/contact.store");
18
22
  const device_list_store_1 = require("./providers/memory/device-list.store");
23
+ const identity_store_1 = require("./providers/memory/identity.store");
24
+ const message_secret_store_1 = require("./providers/memory/message-secret.store");
19
25
  const message_store_1 = require("./providers/memory/message.store");
20
26
  const participants_store_1 = require("./providers/memory/participants.store");
27
+ const pre_key_store_1 = require("./providers/memory/pre-key.store");
21
28
  const privacy_token_store_1 = require("./providers/memory/privacy-token.store");
22
29
  const retry_store_1 = require("./providers/memory/retry.store");
23
30
  const sender_key_store_1 = require("./providers/memory/sender-key.store");
31
+ const session_store_1 = require("./providers/memory/session.store");
24
32
  const signal_store_1 = require("./providers/memory/signal.store");
25
33
  const thread_store_1 = require("./providers/memory/thread.store");
26
34
  const coercion_1 = require("../util/coercion");
27
35
  const DEFAULT_CACHE_TTLS_MS = Object.freeze({
28
36
  retryMs: 60 * 1000,
29
37
  participantsMs: 5 * 60 * 1000,
30
- deviceListMs: 5 * 60 * 1000
38
+ deviceListMs: 5 * 60 * 1000,
39
+ messageSecretMs: 30 * 60 * 1000
31
40
  });
32
41
  function hasDestroy(value) {
33
42
  return (!!value &&
@@ -61,7 +70,8 @@ function createStore(options) {
61
70
  const cacheTtlsMs = Object.freeze({
62
71
  retry: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.retryMs, DEFAULT_CACHE_TTLS_MS.retryMs, 'memory.cacheTtlMs.retryMs'),
63
72
  participants: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.participantsMs, DEFAULT_CACHE_TTLS_MS.participantsMs, 'memory.cacheTtlMs.participantsMs'),
64
- deviceList: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs')
73
+ deviceList: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.deviceListMs, DEFAULT_CACHE_TTLS_MS.deviceListMs, 'memory.cacheTtlMs.deviceListMs'),
74
+ messageSecret: (0, coercion_1.resolvePositive)(options.memory?.cacheTtlMs?.messageSecretMs, DEFAULT_CACHE_TTLS_MS.messageSecretMs, 'memory.cacheTtlMs.messageSecretMs')
65
75
  });
66
76
  const sessions = new Map();
67
77
  let storeDestroyed = false;
@@ -81,9 +91,10 @@ function createStore(options) {
81
91
  const rawAuth = resolveStore(id, backends, providers.auth, 'auth', 'stores', () => {
82
92
  throw new Error('providers.auth is required — register a backend or set providers.auth');
83
93
  });
84
- const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new signal_store_1.WaSignalMemoryStore({
85
- maxPreKeys: ml.signalPreKeys,
86
- maxSessions: ml.signalSessions,
94
+ const rawSignal = resolveStore(id, backends, providers.signal ?? 'memory', 'signal', 'stores', () => new signal_store_1.WaSignalMemoryStore());
95
+ const rawPreKey = resolveStore(id, backends, providers.preKey ?? 'memory', 'preKey', 'stores', () => new pre_key_store_1.WaPreKeyMemoryStore({ maxPreKeys: ml.signalPreKeys }));
96
+ const rawSession = resolveStore(id, backends, providers.session ?? 'memory', 'session', 'stores', () => new session_store_1.WaSessionMemoryStore({ maxSessions: ml.signalSessions }));
97
+ const rawIdentity = resolveStore(id, backends, providers.identity ?? 'memory', 'identity', 'stores', () => new identity_store_1.WaIdentityMemoryStore({
87
98
  maxRemoteIdentities: ml.signalRemoteIdentities
88
99
  }));
89
100
  const rawSenderKey = resolveStore(id, backends, providers.senderKey ?? 'memory', 'senderKey', 'stores', () => new sender_key_store_1.SenderKeyMemoryStore({
@@ -104,7 +115,12 @@ function createStore(options) {
104
115
  ? new contact_store_1.WaContactMemoryStore({ maxContacts: ml.contacts })
105
116
  : noop_store_1.NOOP_CONTACT_STORE);
106
117
  const rawPrivacyToken = resolveStore(id, backends, providers.privacyToken ?? 'memory', 'privacyToken', 'stores', () => new privacy_token_store_1.WaPrivacyTokenMemoryStore(ml.privacyTokens));
107
- const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => new retry_store_1.WaRetryMemoryStore(cacheTtlsMs.retry));
118
+ const rawRetry = resolveStore(id, backends, cacheProviders.retry ?? 'memory', 'retry', 'caches', () => cacheProviders.retry === 'memory' || !cacheProviders.retry
119
+ ? new retry_store_1.WaRetryMemoryStore(cacheTtlsMs.retry, {
120
+ maxOutboundMessages: ml.retryOutboundMessages,
121
+ maxInboundCounters: ml.retryInboundCounters
122
+ })
123
+ : noop_store_1.NOOP_RETRY_STORE);
108
124
  const rawParticipants = resolveStore(id, backends, cacheProviders.participants ?? 'memory', 'participants', 'caches', () => cacheProviders.participants === 'memory'
109
125
  ? new participants_store_1.WaParticipantsMemoryStore(cacheTtlsMs.participants, {
110
126
  maxGroups: ml.participantsGroups
@@ -115,14 +131,23 @@ function createStore(options) {
115
131
  maxUsers: ml.deviceListUsers
116
132
  })
117
133
  : noop_store_1.NOOP_DEVICE_LIST_STORE);
134
+ const rawMessageSecret = resolveStore(id, backends, cacheProviders.messageSecret ?? 'none', 'messageSecret', 'caches', () => cacheProviders.messageSecret === 'memory'
135
+ ? new message_secret_store_1.WaMessageSecretMemoryStore(cacheTtlsMs.messageSecret, {
136
+ maxSecrets: ml.messageSecrets
137
+ })
138
+ : noop_store_1.NOOP_MESSAGE_SECRET_STORE);
118
139
  const authStore = (0, auth_lock_1.withAuthLock)(rawAuth);
119
140
  const signalStore = (0, signal_lock_1.withSignalLock)(rawSignal);
141
+ const preKeyStore = (0, pre_key_lock_1.withPreKeyLock)(rawPreKey);
142
+ const sessionStore = (0, session_lock_1.withSessionLock)(rawSession);
143
+ const identityStore = (0, identity_lock_1.withIdentityLock)(rawIdentity);
120
144
  const senderKeyStore = (0, sender_key_lock_1.withSenderKeyLock)(rawSenderKey);
121
145
  const appStateStore = (0, appstate_lock_1.withAppStateLock)(rawAppState);
122
146
  const retryStore = (0, retry_lock_1.withRetryLock)(rawRetry);
123
147
  const participantsStore = (0, participants_lock_1.withParticipantsLock)(rawParticipants);
124
148
  const deviceListStore = (0, device_list_lock_1.withDeviceListLock)(rawDeviceList);
125
149
  const messageStore = (0, message_lock_1.withMessageLock)(rawMessages);
150
+ const messageSecretStore = (0, message_secret_lock_1.withMessageSecretLock)(rawMessageSecret);
126
151
  const threadStore = (0, thread_lock_1.withThreadLock)(rawThreads);
127
152
  const contactStore = (0, contact_lock_1.withContactLock)(rawContacts);
128
153
  const privacyTokenStore = (0, privacy_token_lock_1.withPrivacyTokenLock)(rawPrivacyToken);
@@ -135,12 +160,14 @@ function createStore(options) {
135
160
  await Promise.all([
136
161
  retryStore.clear(),
137
162
  participantsStore.clear(),
138
- deviceListStore.clear()
163
+ deviceListStore.clear(),
164
+ messageSecretStore.clear()
139
165
  ]);
140
166
  await Promise.all([
141
167
  destroyIfSupported(retryStore),
142
168
  destroyIfSupported(participantsStore),
143
- destroyIfSupported(deviceListStore)
169
+ destroyIfSupported(deviceListStore),
170
+ destroyIfSupported(messageSecretStore)
144
171
  ]);
145
172
  };
146
173
  const destroy = async () => {
@@ -151,6 +178,9 @@ function createStore(options) {
151
178
  await Promise.all([
152
179
  destroyIfSupported(authStore),
153
180
  destroyIfSupported(signalStore),
181
+ destroyIfSupported(preKeyStore),
182
+ destroyIfSupported(sessionStore),
183
+ destroyIfSupported(identityStore),
154
184
  destroyIfSupported(senderKeyStore),
155
185
  destroyIfSupported(appStateStore),
156
186
  destroyIfSupported(messageStore),
@@ -159,23 +189,27 @@ function createStore(options) {
159
189
  destroyIfSupported(privacyTokenStore)
160
190
  ]);
161
191
  };
162
- const session = {
192
+ const storeSession = {
163
193
  auth: authStore,
164
194
  signal: signalStore,
195
+ preKey: preKeyStore,
196
+ session: sessionStore,
197
+ identity: identityStore,
165
198
  senderKey: senderKeyStore,
166
199
  appState: appStateStore,
167
200
  retry: retryStore,
168
201
  participants: participantsStore,
169
202
  deviceList: deviceListStore,
170
203
  messages: messageStore,
204
+ messageSecret: messageSecretStore,
171
205
  threads: threadStore,
172
206
  contacts: contactStore,
173
207
  privacyToken: privacyTokenStore,
174
208
  destroyCaches,
175
209
  destroy
176
210
  };
177
- sessions.set(id, session);
178
- return session;
211
+ sessions.set(id, storeSession);
212
+ return storeSession;
179
213
  },
180
214
  async destroyCaches() {
181
215
  const list = Array.from(sessions.values());
@@ -188,6 +222,8 @@ function createStore(options) {
188
222
  const list = Array.from(sessions.values());
189
223
  sessions.clear();
190
224
  await Promise.all(list.map((s) => s.destroy()));
225
+ const uniqueBackends = new Set(Object.values(backends));
226
+ await Promise.all(Array.from(uniqueBackends, (backend) => destroyIfSupported(backend)));
191
227
  }
192
228
  };
193
229
  }
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WaPrivacyTokenMemoryStore = exports.WaThreadMemoryStore = exports.WaMessageMemoryStore = exports.WaContactMemoryStore = exports.WaDeviceListMemoryStore = exports.WaParticipantsMemoryStore = exports.WaRetryMemoryStore = exports.SenderKeyMemoryStore = exports.WaSignalMemoryStore = exports.WaAppStateMemoryStore = exports.createStore = void 0;
3
+ exports.WaPrivacyTokenMemoryStore = exports.WaThreadMemoryStore = exports.WaMessageMemoryStore = exports.WaMessageSecretMemoryStore = exports.WaContactMemoryStore = exports.WaDeviceListMemoryStore = exports.WaParticipantsMemoryStore = exports.WaRetryMemoryStore = exports.SenderKeyMemoryStore = exports.WaIdentityMemoryStore = exports.WaSessionMemoryStore = exports.WaPreKeyMemoryStore = exports.WaSignalMemoryStore = exports.WaAppStateMemoryStore = exports.createStore = void 0;
4
4
  var createStore_1 = require("./createStore");
5
5
  Object.defineProperty(exports, "createStore", { enumerable: true, get: function () { return createStore_1.createStore; } });
6
6
  var appstate_store_1 = require("./providers/memory/appstate.store");
7
7
  Object.defineProperty(exports, "WaAppStateMemoryStore", { enumerable: true, get: function () { return appstate_store_1.WaAppStateMemoryStore; } });
8
8
  var signal_store_1 = require("./providers/memory/signal.store");
9
9
  Object.defineProperty(exports, "WaSignalMemoryStore", { enumerable: true, get: function () { return signal_store_1.WaSignalMemoryStore; } });
10
+ var pre_key_store_1 = require("./providers/memory/pre-key.store");
11
+ Object.defineProperty(exports, "WaPreKeyMemoryStore", { enumerable: true, get: function () { return pre_key_store_1.WaPreKeyMemoryStore; } });
12
+ var session_store_1 = require("./providers/memory/session.store");
13
+ Object.defineProperty(exports, "WaSessionMemoryStore", { enumerable: true, get: function () { return session_store_1.WaSessionMemoryStore; } });
14
+ var identity_store_1 = require("./providers/memory/identity.store");
15
+ Object.defineProperty(exports, "WaIdentityMemoryStore", { enumerable: true, get: function () { return identity_store_1.WaIdentityMemoryStore; } });
10
16
  var sender_key_store_1 = require("./providers/memory/sender-key.store");
11
17
  Object.defineProperty(exports, "SenderKeyMemoryStore", { enumerable: true, get: function () { return sender_key_store_1.SenderKeyMemoryStore; } });
12
18
  var retry_store_1 = require("./providers/memory/retry.store");
@@ -17,6 +23,8 @@ var device_list_store_1 = require("./providers/memory/device-list.store");
17
23
  Object.defineProperty(exports, "WaDeviceListMemoryStore", { enumerable: true, get: function () { return device_list_store_1.WaDeviceListMemoryStore; } });
18
24
  var contact_store_1 = require("./providers/memory/contact.store");
19
25
  Object.defineProperty(exports, "WaContactMemoryStore", { enumerable: true, get: function () { return contact_store_1.WaContactMemoryStore; } });
26
+ var message_secret_store_1 = require("./providers/memory/message-secret.store");
27
+ Object.defineProperty(exports, "WaMessageSecretMemoryStore", { enumerable: true, get: function () { return message_secret_store_1.WaMessageSecretMemoryStore; } });
20
28
  var message_store_1 = require("./providers/memory/message.store");
21
29
  Object.defineProperty(exports, "WaMessageMemoryStore", { enumerable: true, get: function () { return message_store_1.WaMessageMemoryStore; } });
22
30
  var thread_store_1 = require("./providers/memory/thread.store");
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withIdentityLock = withIdentityLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ function withIdentityLock(store) {
6
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
7
+ const destroyStore = store;
8
+ return {
9
+ getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
10
+ getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
11
+ setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
12
+ setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
13
+ clear: () => gate.runExclusive(() => store.clear()),
14
+ destroy: async () => {
15
+ await gate.close();
16
+ await destroyStore.destroy?.();
17
+ }
18
+ };
19
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withMessageSecretLock = withMessageSecretLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ function withMessageSecretLock(store) {
6
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
7
+ const destroyStore = store;
8
+ return {
9
+ get: (messageId, nowMs) => gate.runShared(() => store.get(messageId, nowMs)),
10
+ getBatch: (messageIds, nowMs) => gate.runShared(() => store.getBatch(messageIds, nowMs)),
11
+ set: (messageId, entry) => gate.runShared(() => store.set(messageId, entry)),
12
+ setBatch: (entries) => gate.runShared(() => store.setBatch(entries)),
13
+ cleanupExpired: (nowMs) => gate.runExclusive(() => store.cleanupExpired(nowMs)),
14
+ clear: () => gate.runExclusive(() => store.clear()),
15
+ destroy: async () => {
16
+ await gate.close();
17
+ await destroyStore.destroy?.();
18
+ }
19
+ };
20
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withPreKeyLock = withPreKeyLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ const StoreLock_1 = require("../../infra/perf/StoreLock");
6
+ const WA_PREKEY_KEY = 'prekey:prekeys';
7
+ const WA_PREKEY_SERVER_KEY = 'prekey:serverHasPreKeys';
8
+ const WA_PREKEY_CLEAR_KEY = 'prekey:clear';
9
+ function withPreKeyLock(store) {
10
+ const lock = new StoreLock_1.StoreLock();
11
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
12
+ const destroyStore = store;
13
+ return {
14
+ putPreKey: (record) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.putPreKey(record))),
15
+ getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenPreKeys(count, generator))),
16
+ getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
17
+ getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
18
+ consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.consumePreKeyById(keyId))),
19
+ getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.getOrGenSinglePreKey(generator))),
20
+ markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_PREKEY_KEY, () => store.markKeyAsUploaded(keyId))),
21
+ setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_PREKEY_SERVER_KEY, () => store.setServerHasPreKeys(value))),
22
+ getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
23
+ clear: () => gate.runExclusive(() => lock.run(WA_PREKEY_CLEAR_KEY, () => store.clear())),
24
+ destroy: async () => {
25
+ await gate.close();
26
+ await lock.shutdown();
27
+ await destroyStore.destroy?.();
28
+ }
29
+ };
30
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withSessionLock = withSessionLock;
4
+ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
+ function withSessionLock(store) {
6
+ const gate = new SharedExclusiveGate_1.SharedExclusiveGate();
7
+ const destroyStore = store;
8
+ return {
9
+ hasSession: (address) => gate.runShared(() => store.hasSession(address)),
10
+ hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
11
+ getSession: (address) => gate.runShared(() => store.getSession(address)),
12
+ getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
13
+ setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
14
+ setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
15
+ deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
16
+ clear: () => gate.runExclusive(() => store.clear()),
17
+ destroy: async () => {
18
+ await gate.close();
19
+ await destroyStore.destroy?.();
20
+ }
21
+ };
22
+ }
@@ -5,8 +5,6 @@ const SharedExclusiveGate_1 = require("../../infra/perf/SharedExclusiveGate");
5
5
  const StoreLock_1 = require("../../infra/perf/StoreLock");
6
6
  const WA_SIGNAL_REGISTRATION_KEY = 'signal:registration';
7
7
  const WA_SIGNAL_SIGNED_PREKEY_KEY = 'signal:signedPreKey';
8
- const WA_SIGNAL_PREKEYS_KEY = 'signal:prekeys';
9
- const WA_SIGNAL_SERVER_HAS_PREKEYS_KEY = 'signal:serverHasPreKeys';
10
8
  const WA_SIGNAL_CLEAR_KEY = 'signal:clear';
11
9
  function withSignalLock(store) {
12
10
  const lock = new StoreLock_1.StoreLock();
@@ -31,28 +29,6 @@ function withSignalLock(store) {
31
29
  getSignedPreKeyById: (keyId) => gate.runShared(() => store.getSignedPreKeyById(keyId)),
32
30
  setSignedPreKeyRotationTs: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SIGNED_PREKEY_KEY, () => store.setSignedPreKeyRotationTs(value))),
33
31
  getSignedPreKeyRotationTs: () => gate.runShared(() => store.getSignedPreKeyRotationTs()),
34
- putPreKey: (record) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.putPreKey(record))),
35
- getOrGenPreKeys: (count, generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenPreKeys(count, generator))),
36
- getPreKeyById: (keyId) => gate.runShared(() => store.getPreKeyById(keyId)),
37
- getPreKeysById: (keyIds) => gate.runShared(() => store.getPreKeysById(keyIds)),
38
- consumePreKeyById: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.consumePreKeyById(keyId))),
39
- getOrGenSinglePreKey: (generator) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.getOrGenSinglePreKey(generator))),
40
- markKeyAsUploaded: (keyId) => gate.runShared(() => lock.run(WA_SIGNAL_PREKEYS_KEY, () => store.markKeyAsUploaded(keyId))),
41
- setServerHasPreKeys: (value) => gate.runShared(() => lock.run(WA_SIGNAL_SERVER_HAS_PREKEYS_KEY, () => store.setServerHasPreKeys(value))),
42
- getServerHasPreKeys: () => gate.runShared(() => store.getServerHasPreKeys()),
43
- getSignalMeta: () => gate.runShared(() => store.getSignalMeta()),
44
- hasSession: (address) => gate.runShared(() => store.hasSession(address)),
45
- hasSessions: (addresses) => gate.runShared(() => store.hasSessions(addresses)),
46
- getSession: (address) => gate.runShared(() => store.getSession(address)),
47
- getSessionsBatch: (addresses) => gate.runShared(() => store.getSessionsBatch(addresses)),
48
- // Session and identity read-modify-write semantics are serialized in SignalProtocol per address.
49
- setSession: (address, session) => gate.runShared(() => store.setSession(address, session)),
50
- setSessionsBatch: (entries) => gate.runShared(() => store.setSessionsBatch(entries)),
51
- deleteSession: (address) => gate.runShared(() => store.deleteSession(address)),
52
- getRemoteIdentity: (address) => gate.runShared(() => store.getRemoteIdentity(address)),
53
- getRemoteIdentities: (addresses) => gate.runShared(() => store.getRemoteIdentities(addresses)),
54
- setRemoteIdentity: (address, identityKey) => gate.runShared(() => store.setRemoteIdentity(address, identityKey)),
55
- setRemoteIdentities: (entries) => gate.runShared(() => store.setRemoteIdentities(entries)),
56
32
  clear: () => gate.runExclusive(() => lock.run(WA_SIGNAL_CLEAR_KEY, async () => {
57
33
  await store.clear();
58
34
  cachedRegInfo = undefined;
@@ -1,7 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NOOP_DEVICE_LIST_STORE = exports.NOOP_PARTICIPANTS_STORE = exports.NOOP_CONTACT_STORE = exports.NOOP_THREAD_STORE = exports.NOOP_MESSAGE_STORE = void 0;
3
+ exports.NOOP_DEVICE_LIST_STORE = exports.NOOP_PARTICIPANTS_STORE = exports.NOOP_RETRY_STORE = exports.NOOP_CONTACT_STORE = exports.NOOP_THREAD_STORE = exports.NOOP_MESSAGE_STORE = exports.NOOP_MESSAGE_SECRET_STORE = void 0;
4
4
  const EMPTY_STORE_LIST = Object.freeze([]);
5
+ exports.NOOP_MESSAGE_SECRET_STORE = Object.freeze({
6
+ get: async (_messageId) => null,
7
+ getBatch: async (messageIds) => new Array(messageIds.length).fill(null),
8
+ set: async (_messageId, _entry) => { },
9
+ setBatch: async (_entries) => { },
10
+ cleanupExpired: async (_nowMs) => 0,
11
+ clear: async () => { }
12
+ });
5
13
  exports.NOOP_MESSAGE_STORE = Object.freeze({
6
14
  upsert: async (_record) => { },
7
15
  upsertBatch: async (_records) => { },
@@ -25,6 +33,18 @@ exports.NOOP_CONTACT_STORE = Object.freeze({
25
33
  deleteByJid: async (_jid) => 0,
26
34
  clear: async () => { }
27
35
  });
36
+ exports.NOOP_RETRY_STORE = Object.freeze({
37
+ getOutboundRequesterStatus: async () => null,
38
+ upsertOutboundMessage: async (_record) => { },
39
+ deleteOutboundMessage: async (_messageId) => 0,
40
+ getOutboundMessage: async (_messageId) => null,
41
+ updateOutboundMessageState: async () => { },
42
+ markOutboundRequesterDelivered: async () => { },
43
+ incrementInboundCounter: async () => 0,
44
+ cleanupExpired: async (_nowMs) => 0,
45
+ clear: async () => { },
46
+ destroy: async () => { }
47
+ });
28
48
  exports.NOOP_PARTICIPANTS_STORE = Object.freeze({
29
49
  upsertGroupParticipants: async (_snapshot) => { },
30
50
  getGroupParticipants: async (_groupJid, _nowMs) => null,
@@ -9,6 +9,9 @@ const DEFAULTS = Object.freeze({
9
9
  });
10
10
  class WaDeviceListMemoryStore {
11
11
  constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
12
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
13
+ throw new Error('device-list ttlMs must be a positive finite number');
14
+ }
12
15
  this.records = new Map();
13
16
  this.ttlMs = ttlMs;
14
17
  this.maxUsers = (0, coercion_1.resolvePositive)(options.maxUsers, DEFAULTS.maxUsers, 'WaDeviceListMemoryStoreOptions.maxUsers');
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaIdentityMemoryStore = void 0;
4
+ const jid_1 = require("../../../protocol/jid");
5
+ const coercion_1 = require("../../../util/coercion");
6
+ const collections_1 = require("../../../util/collections");
7
+ const DEFAULT_MAX_REMOTE_IDENTITIES = 8192;
8
+ class WaIdentityMemoryStore {
9
+ constructor(options = {}) {
10
+ this.remoteIdentities = new Map();
11
+ this.maxRemoteIdentities = (0, coercion_1.resolvePositive)(options.maxRemoteIdentities, DEFAULT_MAX_REMOTE_IDENTITIES, 'WaIdentityMemoryStoreOptions.maxRemoteIdentities');
12
+ }
13
+ async getRemoteIdentity(address) {
14
+ return this.remoteIdentities.get((0, jid_1.signalAddressKey)(address)) ?? null;
15
+ }
16
+ async getRemoteIdentities(addresses) {
17
+ const result = new Array(addresses.length);
18
+ for (let i = 0; i < addresses.length; i += 1) {
19
+ result[i] = this.remoteIdentities.get((0, jid_1.signalAddressKey)(addresses[i])) ?? null;
20
+ }
21
+ return result;
22
+ }
23
+ async setRemoteIdentity(address, identityKey) {
24
+ (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(address), identityKey, this.maxRemoteIdentities);
25
+ }
26
+ async setRemoteIdentities(entries) {
27
+ for (const entry of entries) {
28
+ (0, collections_1.setBoundedMapEntry)(this.remoteIdentities, (0, jid_1.signalAddressKey)(entry.address), entry.identityKey, this.maxRemoteIdentities);
29
+ }
30
+ }
31
+ async clear() {
32
+ this.remoteIdentities.clear();
33
+ }
34
+ }
35
+ exports.WaIdentityMemoryStore = WaIdentityMemoryStore;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaMessageSecretMemoryStore = void 0;
4
+ const coercion_1 = require("../../../util/coercion");
5
+ const collections_1 = require("../../../util/collections");
6
+ const DEFAULTS = Object.freeze({
7
+ ttlMs: 30 * 60 * 1000,
8
+ maxSecrets: 10000
9
+ });
10
+ class WaMessageSecretMemoryStore {
11
+ constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
12
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
13
+ throw new Error('message-secret ttlMs must be a positive finite number');
14
+ }
15
+ this.secrets = new Map();
16
+ this.ttlMs = ttlMs;
17
+ this.maxSecrets = (0, coercion_1.resolvePositive)(options.maxSecrets, DEFAULTS.maxSecrets, 'WaMessageSecretMemoryStoreOptions.maxSecrets');
18
+ this.cleanupTimer = setInterval(() => {
19
+ void this.cleanupExpired(Date.now());
20
+ }, (0, collections_1.resolveCleanupIntervalMs)(ttlMs));
21
+ this.cleanupTimer.unref();
22
+ }
23
+ async get(messageId, nowMs = Date.now()) {
24
+ const cached = this.secrets.get(messageId);
25
+ if (!cached)
26
+ return null;
27
+ if (cached.expiresAtMs <= nowMs) {
28
+ this.secrets.delete(messageId);
29
+ return null;
30
+ }
31
+ return { secret: cached.secret, senderJid: cached.senderJid };
32
+ }
33
+ async getBatch(messageIds, nowMs = Date.now()) {
34
+ const result = new Array(messageIds.length);
35
+ for (let i = 0; i < messageIds.length; i += 1) {
36
+ const cached = this.secrets.get(messageIds[i]);
37
+ if (!cached) {
38
+ result[i] = null;
39
+ continue;
40
+ }
41
+ if (cached.expiresAtMs <= nowMs) {
42
+ this.secrets.delete(messageIds[i]);
43
+ result[i] = null;
44
+ continue;
45
+ }
46
+ result[i] = { secret: cached.secret, senderJid: cached.senderJid };
47
+ }
48
+ return result;
49
+ }
50
+ async set(messageId, entry) {
51
+ (0, collections_1.setBoundedMapEntry)(this.secrets, messageId, {
52
+ secret: entry.secret,
53
+ senderJid: entry.senderJid,
54
+ expiresAtMs: Date.now() + this.ttlMs
55
+ }, this.maxSecrets);
56
+ }
57
+ async setBatch(entries) {
58
+ const nowMs = Date.now();
59
+ for (let i = 0; i < entries.length; i += 1) {
60
+ (0, collections_1.setBoundedMapEntry)(this.secrets, entries[i].messageId, {
61
+ secret: entries[i].entry.secret,
62
+ senderJid: entries[i].entry.senderJid,
63
+ expiresAtMs: nowMs + this.ttlMs
64
+ }, this.maxSecrets);
65
+ }
66
+ }
67
+ async cleanupExpired(nowMs) {
68
+ let removed = 0;
69
+ for (const [messageId, entry] of this.secrets) {
70
+ if (entry.expiresAtMs > nowMs)
71
+ continue;
72
+ this.secrets.delete(messageId);
73
+ removed += 1;
74
+ }
75
+ return removed;
76
+ }
77
+ async clear() {
78
+ this.secrets.clear();
79
+ }
80
+ async destroy() {
81
+ clearInterval(this.cleanupTimer);
82
+ this.secrets.clear();
83
+ }
84
+ }
85
+ exports.WaMessageSecretMemoryStore = WaMessageSecretMemoryStore;
@@ -9,6 +9,9 @@ const DEFAULTS = Object.freeze({
9
9
  });
10
10
  class WaParticipantsMemoryStore {
11
11
  constructor(ttlMs = DEFAULTS.ttlMs, options = {}) {
12
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
13
+ throw new Error('participants ttlMs must be a positive finite number');
14
+ }
12
15
  this.records = new Map();
13
16
  this.ttlMs = ttlMs;
14
17
  this.maxGroups = (0, coercion_1.resolvePositive)(options.maxGroups, DEFAULTS.maxGroups, 'WaParticipantsMemoryStoreOptions.maxGroups');