zapo-js 0.3.0 → 1.0.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 (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -3,20 +3,27 @@ import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
3
3
  import { normalizeDeviceJid, parseSignalAddressFromJid, signalAddressKey } from '../../protocol/jid.js';
4
4
  import { bytesToHex, uint8Equal } from '../../util/bytes.js';
5
5
  import { toError } from '../../util/primitives.js';
6
+ /** Builds a {@link SignalSessionResolver} backed by the given Signal APIs and stores. */
6
7
  export function createSignalSessionResolver(options) {
7
8
  const { signalProtocol, sessionStore, identityStore, signalIdentitySync, signalSessionSync, logger } = options;
8
9
  const dedup = new PromiseDedup();
9
- const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
10
+ const ensureSessionInternal = async (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle, knownAbsent = false) => {
11
+ const jidLogger = logger.child({ jid });
10
12
  const expectedSerializedIdentity = expectedIdentity
11
13
  ? toSerializedPubKey(expectedIdentity)
12
14
  : null;
13
15
  if (reasonIdentity) {
14
16
  await signalIdentitySync.syncIdentityKeys([jid]);
15
17
  }
16
- if (await sessionStore.hasSession(address)) {
18
+ if (!knownAbsent && (await sessionStore.hasSession(address))) {
17
19
  if (expectedSerializedIdentity) {
18
20
  const storedIdentity = await identityStore.getRemoteIdentity(address);
19
21
  if (!storedIdentity || !uint8Equal(storedIdentity, expectedSerializedIdentity)) {
22
+ jidLogger.warn('signal identity mismatch on stored identity', {
23
+ source: 'stored_vs_expected',
24
+ expected: bytesToHex(expectedSerializedIdentity),
25
+ stored: storedIdentity ? bytesToHex(storedIdentity) : null
26
+ });
20
27
  throw new Error('identity mismatch');
21
28
  }
22
29
  }
@@ -30,7 +37,7 @@ export function createSignalSessionResolver(options) {
30
37
  };
31
38
  }
32
39
  else {
33
- logger.info('signal session missing, fetching remote key bundle', { jid });
40
+ jidLogger.debug('signal session missing, fetching remote key bundle');
34
41
  fetched = await signalSessionSync.fetchKeyBundle({
35
42
  jid,
36
43
  reasonIdentity
@@ -40,26 +47,40 @@ export function createSignalSessionResolver(options) {
40
47
  if (reasonIdentity) {
41
48
  const storedIdentity = await identityStore.getRemoteIdentity(address);
42
49
  if (storedIdentity && !uint8Equal(remoteIdentity, storedIdentity)) {
50
+ jidLogger.warn('signal identity mismatch on fetched bundle vs stored', {
51
+ source: 'remote_vs_stored',
52
+ remote: bytesToHex(remoteIdentity),
53
+ stored: bytesToHex(storedIdentity)
54
+ });
43
55
  throw new Error('identity mismatch');
44
56
  }
45
57
  }
46
58
  if (expectedSerializedIdentity && !uint8Equal(remoteIdentity, expectedSerializedIdentity)) {
59
+ jidLogger.warn('signal identity mismatch on fetched bundle vs expected', {
60
+ source: 'remote_vs_expected',
61
+ remote: bytesToHex(remoteIdentity),
62
+ expected: bytesToHex(expectedSerializedIdentity)
63
+ });
47
64
  throw new Error('identity mismatch');
48
65
  }
49
66
  const session = await signalProtocol.establishOutgoingSession(address, fetched.bundle, {
50
- reuseExisting: true
67
+ reuseExisting: true,
68
+ knownAbsent
51
69
  });
52
- logger.info('signal session synchronized', {
53
- jid,
70
+ jidLogger.debug('signal session synchronized', {
54
71
  regId: fetched.bundle.regId,
55
72
  hasOneTimeKey: fetched.bundle.oneTimeKey !== undefined
56
73
  });
57
74
  return session;
58
75
  };
59
- const ensureSessionWithDedup = (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle) => {
76
+ const ensureSessionWithDedup = (address, jid, expectedIdentity, reasonIdentity = false, prefetchedBundle, knownAbsent = false) => {
60
77
  const expectedIdentityKey = expectedIdentity ? bytesToHex(expectedIdentity) : 'none';
61
- const dedupKey = `signalSession:${signalAddressKey(address)}:${reasonIdentity ? '1' : '0'}:${expectedIdentityKey}`;
62
- return dedup.run(dedupKey, () => ensureSessionInternal(address, jid, expectedIdentity, reasonIdentity, prefetchedBundle));
78
+ // knownAbsent is part of the dedup key: single-caller (false) and
79
+ // batch (true) must NOT share a Promise, or the unsafe variant
80
+ // could leak to the safe caller. Per-address lock + the recheck
81
+ // inside persistOutgoingSessionsBatch resolves any race.
82
+ const dedupKey = `signalSession:${signalAddressKey(address)}:${reasonIdentity ? '1' : '0'}:${expectedIdentityKey}:${knownAbsent ? '1' : '0'}`;
83
+ return dedup.run(dedupKey, () => ensureSessionInternal(address, jid, expectedIdentity, reasonIdentity, prefetchedBundle, knownAbsent));
63
84
  };
64
85
  const ensureSession = (address, jid, expectedIdentity, reasonIdentity = false) => ensureSessionWithDedup(address, jid, expectedIdentity, reasonIdentity).then(() => { });
65
86
  const ensureSessionsBatch = async (targetJids, expectedIdentityByJid) => {
@@ -120,7 +141,14 @@ export function createSignalSessionResolver(options) {
120
141
  const session = resolvedByIndex[index];
121
142
  const expectedIdentity = normalizedExpectedIdentityByJid?.get(normalizedTargetJids[index]);
122
143
  if (session && expectedIdentity) {
123
- if (!uint8Equal(session.remote.pubKey, toSerializedPubKey(expectedIdentity))) {
144
+ const expectedSerialized = toSerializedPubKey(expectedIdentity);
145
+ if (!uint8Equal(session.remote.pubKey, expectedSerialized)) {
146
+ logger.warn('signal identity mismatch on existing session vs expected', {
147
+ jid: normalizedTargetJids[index],
148
+ source: 'session_vs_expected',
149
+ session: bytesToHex(session.remote.pubKey),
150
+ expected: bytesToHex(expectedSerialized)
151
+ });
124
152
  throw new Error('identity mismatch');
125
153
  }
126
154
  }
@@ -146,51 +174,132 @@ export function createSignalSessionResolver(options) {
146
174
  });
147
175
  return collectResolvedTargets();
148
176
  }
149
- const ensuredTargetIndices = new Array(missingIndices.length);
150
- const ensurePromises = new Array(missingIndices.length);
151
- let ensureCount = 0;
177
+ // Prepare under per-address locks (no persist). Bulk persist below
178
+ // holds every per-address lock at once via persistOutgoingSessionsBatch.
179
+ const prepareTargetIndices = new Array(missingIndices.length);
180
+ const preparePromises = new Array(missingIndices.length);
181
+ let prepareCount = 0;
182
+ const missingBundleTargets = [];
152
183
  for (let index = 0; index < missingIndices.length; index += 1) {
153
184
  const targetIndex = missingIndices[index];
154
185
  const targetJid = normalizedTargetJids[targetIndex];
155
186
  const batchResult = batchResults[index];
156
187
  if (!batchResult?.bundle) {
157
- logger.warn('signal batch key fetch returned target without bundle', {
188
+ missingBundleTargets.push({
158
189
  jid: targetJid,
159
- message: batchResult?.errorText ?? 'missing key bundle user in response'
190
+ reason: batchResult?.errorText ?? 'missing key bundle user in response'
160
191
  });
161
192
  continue;
162
193
  }
163
194
  const expectedIdentity = normalizedExpectedIdentityByJid?.get(targetJid);
164
- ensuredTargetIndices[ensureCount] = targetIndex;
165
- ensurePromises[ensureCount] = ensureSessionWithDedup(normalizedTargetAddresses[targetIndex], targetJid, expectedIdentity, false, batchResult.bundle);
166
- ensureCount += 1;
195
+ const expectedSerializedIdentity = expectedIdentity
196
+ ? toSerializedPubKey(expectedIdentity)
197
+ : null;
198
+ const bundleIdentity = toSerializedPubKey(batchResult.bundle.identity);
199
+ if (expectedSerializedIdentity &&
200
+ !uint8Equal(bundleIdentity, expectedSerializedIdentity)) {
201
+ logger.warn('signal identity mismatch on fetched batch bundle vs expected', {
202
+ jid: targetJid,
203
+ source: 'bundle_vs_expected',
204
+ bundle: bytesToHex(bundleIdentity),
205
+ expected: bytesToHex(expectedSerializedIdentity)
206
+ });
207
+ throw new Error('identity mismatch');
208
+ }
209
+ const targetAddress = normalizedTargetAddresses[targetIndex];
210
+ const bundle = batchResult.bundle;
211
+ prepareTargetIndices[prepareCount] = targetIndex;
212
+ preparePromises[prepareCount] = signalProtocol
213
+ .prepareOutgoingSession(targetAddress, bundle, {
214
+ reuseExisting: true,
215
+ knownAbsent: true
216
+ })
217
+ .then((prep) => ({
218
+ session: prep.session,
219
+ remoteIdentity: prep.remoteIdentity
220
+ }));
221
+ prepareCount += 1;
222
+ }
223
+ if (missingBundleTargets.length > 0) {
224
+ logger.warn('signal batch key fetch returned targets without bundle', {
225
+ droppedCount: missingBundleTargets.length,
226
+ totalRequested: missingIndices.length,
227
+ sample: missingBundleTargets.slice(0, 3)
228
+ });
167
229
  }
168
- if (ensureCount === 0) {
230
+ if (prepareCount === 0) {
169
231
  return collectResolvedTargets();
170
232
  }
171
- ensuredTargetIndices.length = ensureCount;
172
- ensurePromises.length = ensureCount;
173
- const ensureResults = await Promise.allSettled(ensurePromises);
233
+ prepareTargetIndices.length = prepareCount;
234
+ preparePromises.length = prepareCount;
235
+ const prepareResults = await Promise.allSettled(preparePromises);
236
+ const batchEntries = [];
237
+ const entryToTargetIndex = [];
174
238
  const fallbackIndices = [];
175
- for (let index = 0; index < ensuredTargetIndices.length; index += 1) {
176
- const targetIndex = ensuredTargetIndices[index];
177
- const ensureResult = ensureResults[index];
178
- if (ensureResult.status === 'rejected') {
179
- const normalized = toError(ensureResult.reason);
239
+ for (let i = 0; i < prepareTargetIndices.length; i += 1) {
240
+ const targetIndex = prepareTargetIndices[i];
241
+ const result = prepareResults[i];
242
+ if (result.status === 'rejected') {
243
+ const normalized = toError(result.reason);
180
244
  if (normalized.message === 'identity mismatch') {
181
245
  throw normalized;
182
246
  }
183
- logger.warn('signal session ensure failed during batch resolution', {
247
+ logger.warn('signal session prepare failed during batch resolution', {
184
248
  jid: normalizedTargetJids[targetIndex],
185
249
  message: normalized.message
186
250
  });
187
251
  continue;
188
252
  }
189
- const session = ensureResult.value;
253
+ batchEntries.push({
254
+ address: normalizedTargetAddresses[targetIndex],
255
+ session: result.value.session,
256
+ remoteIdentity: result.value.remoteIdentity
257
+ });
258
+ entryToTargetIndex.push(targetIndex);
259
+ }
260
+ if (batchEntries.length === 0) {
261
+ return collectResolvedTargets();
262
+ }
263
+ let persistResult;
264
+ try {
265
+ persistResult = await signalProtocol.persistOutgoingSessionsBatch(batchEntries);
266
+ }
267
+ catch (error) {
268
+ const normalized = toError(error);
269
+ logger.warn('signal batched session persist failed', {
270
+ requested: batchEntries.length,
271
+ message: normalized.message
272
+ });
273
+ for (let i = 0; i < entryToTargetIndex.length; i += 1) {
274
+ fallbackIndices.push(entryToTargetIndex[i]);
275
+ }
276
+ persistResult = { resolved: [], skipped: [] };
277
+ }
278
+ const sessionByAddressKey = new Map();
279
+ for (const r of persistResult.resolved) {
280
+ sessionByAddressKey.set(signalAddressKey(r.address), r.session);
281
+ }
282
+ const skippedByAddressKey = new Set();
283
+ for (const s of persistResult.skipped) {
284
+ skippedByAddressKey.add(signalAddressKey(s.address));
285
+ logger.warn('signal session persist skipped due to identity conflict', {
286
+ user: s.address.user,
287
+ server: s.address.server,
288
+ device: s.address.device
289
+ });
290
+ }
291
+ for (let i = 0; i < entryToTargetIndex.length; i += 1) {
292
+ const targetIndex = entryToTargetIndex[i];
293
+ const addrKey = signalAddressKey(normalizedTargetAddresses[targetIndex]);
294
+ const session = sessionByAddressKey.get(addrKey);
190
295
  if (session) {
191
296
  resolvedByIndex[targetIndex] = session;
297
+ continue;
298
+ }
299
+ if (skippedByAddressKey.has(addrKey)) {
300
+ continue;
192
301
  }
193
- else {
302
+ if (!fallbackIndices.includes(targetIndex)) {
194
303
  fallbackIndices.push(targetIndex);
195
304
  }
196
305
  }
@@ -0,0 +1,75 @@
1
+ import { WaIdentityMemoryStore } from '../memory/identity.store.js';
2
+ /**
3
+ * Read-through / write-through in-process cache for a persistent remote
4
+ * identity backend. Reuses {@link WaIdentityMemoryStore} as the bounded-LRU
5
+ * L1. Remote identities are read alongside sessions on the send path (the
6
+ * identity-mismatch guard), so caching them complements
7
+ * {@link withSessionCache}.
8
+ *
9
+ * The identity store has no per-key delete: identities are overwritten on
10
+ * re-establishment, so a peer's key change propagates through the
11
+ * write-through `setRemoteIdentity`. See {@link withSessionCache} for the
12
+ * shared coherence model and the single-writer-per-session assumption.
13
+ */
14
+ export function withIdentityCache(backend, maxEntries) {
15
+ const l1 = new WaIdentityMemoryStore({ maxRemoteIdentities: maxEntries });
16
+ let generation = 0;
17
+ return {
18
+ getRemoteIdentity: async (address) => {
19
+ const cached = await l1.getRemoteIdentity(address);
20
+ if (cached !== null)
21
+ return cached;
22
+ const gen = generation;
23
+ const fetched = await backend.getRemoteIdentity(address);
24
+ if (fetched !== null &&
25
+ gen === generation &&
26
+ (await l1.getRemoteIdentity(address)) === null) {
27
+ await l1.setRemoteIdentity(address, fetched);
28
+ }
29
+ return fetched;
30
+ },
31
+ getRemoteIdentities: async (addresses) => {
32
+ const cached = await l1.getRemoteIdentities(addresses);
33
+ const missing = [];
34
+ for (let i = 0; i < addresses.length; i += 1) {
35
+ if (cached[i] === null)
36
+ missing.push(i);
37
+ }
38
+ if (missing.length === 0)
39
+ return cached;
40
+ const gen = generation;
41
+ const fetched = await backend.getRemoteIdentities(missing.map((i) => addresses[i]));
42
+ const coherent = gen === generation;
43
+ const result = cached.slice();
44
+ for (let j = 0; j < missing.length; j += 1) {
45
+ const key = fetched[j];
46
+ result[missing[j]] = key;
47
+ if (key !== null &&
48
+ coherent &&
49
+ (await l1.getRemoteIdentity(addresses[missing[j]])) === null) {
50
+ await l1.setRemoteIdentity(addresses[missing[j]], key);
51
+ }
52
+ }
53
+ return result;
54
+ },
55
+ setRemoteIdentity: async (address, identityKey) => {
56
+ generation += 1;
57
+ await backend.setRemoteIdentity(address, identityKey);
58
+ await l1.setRemoteIdentity(address, identityKey);
59
+ },
60
+ setRemoteIdentities: async (entries) => {
61
+ generation += 1;
62
+ await backend.setRemoteIdentities(entries);
63
+ await l1.setRemoteIdentities(entries);
64
+ },
65
+ clear: async () => {
66
+ generation += 1;
67
+ await backend.clear();
68
+ await l1.clear();
69
+ },
70
+ destroy: async () => {
71
+ await l1.clear();
72
+ await backend.destroy?.();
73
+ }
74
+ };
75
+ }
@@ -0,0 +1,57 @@
1
+ import { WaPrivacyTokenMemoryStore } from '../memory/privacy-token.store.js';
2
+ /**
3
+ * Read-through cache for a persistent privacy-token backend. Reuses
4
+ * {@link WaPrivacyTokenMemoryStore} as the bounded-LRU L1.
5
+ *
6
+ * Unlike the signal caches this is **invalidate-on-write, not
7
+ * write-through**: `upsert` merges partial fields into the existing row on
8
+ * the backend, so caching the partial incoming record would diverge from the
9
+ * backend's merged result. Instead each upsert drops the L1 entry and the
10
+ * next read re-populates from the merged backend truth. See
11
+ * {@link withSessionCache} for the shared coherence model and the
12
+ * single-writer-per-session assumption.
13
+ */
14
+ export function withPrivacyTokenCache(backend, maxEntries) {
15
+ const l1 = new WaPrivacyTokenMemoryStore(maxEntries);
16
+ let generation = 0;
17
+ return {
18
+ upsert: async (record) => {
19
+ generation += 1;
20
+ await backend.upsert(record);
21
+ await l1.deleteByJid(record.jid);
22
+ },
23
+ upsertBatch: async (records) => {
24
+ generation += 1;
25
+ await backend.upsertBatch(records);
26
+ for (let i = 0; i < records.length; i += 1) {
27
+ await l1.deleteByJid(records[i].jid);
28
+ }
29
+ },
30
+ getByJid: async (jid) => {
31
+ const cached = await l1.getByJid(jid);
32
+ if (cached !== null)
33
+ return cached;
34
+ const gen = generation;
35
+ const fetched = await backend.getByJid(jid);
36
+ if (fetched !== null && gen === generation && (await l1.getByJid(jid)) === null) {
37
+ await l1.upsert(fetched);
38
+ }
39
+ return fetched;
40
+ },
41
+ deleteByJid: async (jid) => {
42
+ generation += 1;
43
+ const deleted = await backend.deleteByJid(jid);
44
+ await l1.deleteByJid(jid);
45
+ return deleted;
46
+ },
47
+ clear: async () => {
48
+ generation += 1;
49
+ await backend.clear();
50
+ await l1.clear();
51
+ },
52
+ destroy: async () => {
53
+ await l1.clear();
54
+ await backend.destroy?.();
55
+ }
56
+ };
57
+ }
@@ -0,0 +1,101 @@
1
+ import { SenderKeyMemoryStore } from '../memory/sender-key.store.js';
2
+ /**
3
+ * Read-through / write-through in-process cache for a persistent sender-key
4
+ * backend. Reuses {@link SenderKeyMemoryStore} as the bounded-LRU L1 so the
5
+ * per-(group, sender) lookups repeated across a group fan-out skip the
6
+ * backend round-trip.
7
+ *
8
+ * Only the point reads are cached. `getGroupSenderKeyList` returns the
9
+ * *complete* set for a group, which a partial point cache would under-report,
10
+ * so it goes straight to the backend. Upserts replace the whole record (no
11
+ * merge), so they are write-through; the sweep deletes
12
+ * (`deleteDeviceSenderKey`/`markForgetSenderKey`) run on the backend for the
13
+ * authoritative count and then invalidate the matching L1 entries via the
14
+ * memory store's own sweep. See {@link withSessionCache} for the shared
15
+ * coherence model and the single-writer-per-session assumption.
16
+ */
17
+ export function withSenderKeyCache(backend, maxEntries) {
18
+ const l1 = new SenderKeyMemoryStore({
19
+ maxSenderKeys: maxEntries,
20
+ maxSenderDistributions: maxEntries
21
+ });
22
+ let generation = 0;
23
+ return {
24
+ upsertSenderKey: async (record) => {
25
+ generation += 1;
26
+ await backend.upsertSenderKey(record);
27
+ await l1.upsertSenderKey(record);
28
+ },
29
+ upsertSenderKeyDistribution: async (record) => {
30
+ generation += 1;
31
+ await backend.upsertSenderKeyDistribution(record);
32
+ await l1.upsertSenderKeyDistribution(record);
33
+ },
34
+ upsertSenderKeyDistributions: async (records) => {
35
+ generation += 1;
36
+ await backend.upsertSenderKeyDistributions(records);
37
+ await l1.upsertSenderKeyDistributions(records);
38
+ },
39
+ getGroupSenderKeyList: (groupId) => backend.getGroupSenderKeyList(groupId),
40
+ getDeviceSenderKey: async (groupId, sender) => {
41
+ const cached = await l1.getDeviceSenderKey(groupId, sender);
42
+ if (cached !== null)
43
+ return cached;
44
+ const gen = generation;
45
+ const fetched = await backend.getDeviceSenderKey(groupId, sender);
46
+ if (fetched !== null &&
47
+ gen === generation &&
48
+ (await l1.getDeviceSenderKey(groupId, sender)) === null) {
49
+ await l1.upsertSenderKey(fetched);
50
+ }
51
+ return fetched;
52
+ },
53
+ getDeviceSenderKeyDistributions: async (groupId, senders) => {
54
+ const cached = await l1.getDeviceSenderKeyDistributions(groupId, senders);
55
+ const missing = [];
56
+ for (let i = 0; i < senders.length; i += 1) {
57
+ if (cached[i] === null)
58
+ missing.push(i);
59
+ }
60
+ if (missing.length === 0)
61
+ return cached;
62
+ const gen = generation;
63
+ const fetched = await backend.getDeviceSenderKeyDistributions(groupId, missing.map((i) => senders[i]));
64
+ const coherent = gen === generation;
65
+ const result = cached.slice();
66
+ for (let j = 0; j < missing.length; j += 1) {
67
+ const record = fetched[j];
68
+ result[missing[j]] = record;
69
+ if (record !== null && coherent) {
70
+ const [current] = await l1.getDeviceSenderKeyDistributions(groupId, [
71
+ senders[missing[j]]
72
+ ]);
73
+ if (current === null)
74
+ await l1.upsertSenderKeyDistribution(record);
75
+ }
76
+ }
77
+ return result;
78
+ },
79
+ deleteDeviceSenderKey: async (target, groupId) => {
80
+ generation += 1;
81
+ const deleted = await backend.deleteDeviceSenderKey(target, groupId);
82
+ await l1.deleteDeviceSenderKey(target, groupId);
83
+ return deleted;
84
+ },
85
+ markForgetSenderKey: async (groupId, participants) => {
86
+ generation += 1;
87
+ const deleted = await backend.markForgetSenderKey(groupId, participants);
88
+ await l1.markForgetSenderKey(groupId, participants);
89
+ return deleted;
90
+ },
91
+ clear: async () => {
92
+ generation += 1;
93
+ await backend.clear();
94
+ await l1.clear();
95
+ },
96
+ destroy: async () => {
97
+ await l1.clear();
98
+ await backend.destroy?.();
99
+ }
100
+ };
101
+ }
@@ -0,0 +1,92 @@
1
+ import { WaSessionMemoryStore } from '../memory/session.store.js';
2
+ /**
3
+ * Read-through / write-through in-process cache for a persistent session
4
+ * backend. Reuses {@link WaSessionMemoryStore} as the bounded-LRU L1 so that
5
+ * repeated reads of the same peer on the send/recv path skip the backend
6
+ * round-trip.
7
+ *
8
+ * Coherence model (single process):
9
+ * - every mutation (set/delete/clear) writes the backend then the L1 in
10
+ * lock-step and bumps a generation counter;
11
+ * - a read only populates the L1 when no mutation interleaved its backend
12
+ * fetch (generation unchanged) and the slot is still empty, so an in-flight
13
+ * read can never resurrect a concurrently deleted entry nor overwrite a
14
+ * fresher concurrent write;
15
+ * - there is no negative caching: a miss always re-hits the backend.
16
+ *
17
+ * This cache assumes a single writer per `sessionId` (the library's
18
+ * connection model). Do not share one backend across processes for the same
19
+ * session with the cache enabled - there is no cross-process invalidation
20
+ * channel, so another process's writes would leave this L1 stale.
21
+ */
22
+ export function withSessionCache(backend, maxEntries) {
23
+ const l1 = new WaSessionMemoryStore({ maxSessions: maxEntries });
24
+ let generation = 0;
25
+ return {
26
+ hasSession: async (address) => {
27
+ if (await l1.hasSession(address))
28
+ return true;
29
+ return backend.hasSession(address);
30
+ },
31
+ hasSessions: (addresses) => backend.hasSessions(addresses),
32
+ getSession: async (address) => {
33
+ const cached = await l1.getSession(address);
34
+ if (cached !== null)
35
+ return cached;
36
+ const gen = generation;
37
+ const fetched = await backend.getSession(address);
38
+ if (fetched !== null && gen === generation && (await l1.getSession(address)) === null) {
39
+ await l1.setSession(address, fetched);
40
+ }
41
+ return fetched;
42
+ },
43
+ getSessionsBatch: async (addresses) => {
44
+ const cached = await l1.getSessionsBatch(addresses);
45
+ const missing = [];
46
+ for (let i = 0; i < addresses.length; i += 1) {
47
+ if (cached[i] === null)
48
+ missing.push(i);
49
+ }
50
+ if (missing.length === 0)
51
+ return cached;
52
+ const gen = generation;
53
+ const fetched = await backend.getSessionsBatch(missing.map((i) => addresses[i]));
54
+ const coherent = gen === generation;
55
+ const result = cached.slice();
56
+ for (let j = 0; j < missing.length; j += 1) {
57
+ const record = fetched[j];
58
+ result[missing[j]] = record;
59
+ if (record !== null &&
60
+ coherent &&
61
+ (await l1.getSession(addresses[missing[j]])) === null) {
62
+ await l1.setSession(addresses[missing[j]], record);
63
+ }
64
+ }
65
+ return result;
66
+ },
67
+ setSession: async (address, session) => {
68
+ generation += 1;
69
+ await backend.setSession(address, session);
70
+ await l1.setSession(address, session);
71
+ },
72
+ setSessionsBatch: async (entries) => {
73
+ generation += 1;
74
+ await backend.setSessionsBatch(entries);
75
+ await l1.setSessionsBatch(entries);
76
+ },
77
+ deleteSession: async (address) => {
78
+ generation += 1;
79
+ await backend.deleteSession(address);
80
+ await l1.deleteSession(address);
81
+ },
82
+ clear: async () => {
83
+ generation += 1;
84
+ await backend.clear();
85
+ await l1.clear();
86
+ },
87
+ destroy: async () => {
88
+ await l1.clear();
89
+ await backend.destroy?.();
90
+ }
91
+ };
92
+ }
@@ -0,0 +1 @@
1
+ export {};