zapo-js 0.2.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 (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  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 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  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 +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -8,11 +8,10 @@ export interface DecryptOutcome {
8
8
  readonly usedPreKey: number | null;
9
9
  } | null;
10
10
  }
11
- export declare function splitMsgKey(index: number, bytes: Uint8Array): SignalMessageKey;
12
- export declare function deriveMsgKey(index: number, chainKey: Uint8Array): Promise<{
11
+ export declare function deriveMsgKey(index: number, chainKey: Uint8Array): {
13
12
  readonly nextChainKey: Uint8Array;
14
13
  readonly messageKey: SignalMessageKey;
15
- }>;
14
+ };
16
15
  export declare function selectMessageKey(chain: SignalRecvChain, targetCounter: number): Promise<{
17
16
  readonly messageKey: SignalMessageKey;
18
17
  readonly updatedChain: SignalRecvChain;
@@ -1,6 +1,7 @@
1
1
  import type { ParsedPreKeySignalMessage, ParsedSignalMessage, PreKeyRecord, SignedPreKeyRecord } from '../types';
2
+ import type { WaPreKeyStore } from '../../store/contracts/pre-key.store';
2
3
  import type { WaSignalStore } from '../../store/contracts/signal.store';
3
4
  export declare function deserializeMsg(versionContentMac: Uint8Array): ParsedSignalMessage;
4
5
  export declare function deserializePkMsg(versionContent: Uint8Array): ParsedPreKeySignalMessage;
5
6
  export declare function requireSignedPreKey(store: WaSignalStore, id: number): Promise<SignedPreKeyRecord>;
6
- export declare function requirePreKey(store: WaSignalStore, id: number): Promise<PreKeyRecord>;
7
+ export declare function requirePreKey(store: WaPreKeyStore, id: number): Promise<PreKeyRecord>;
@@ -10,7 +10,6 @@ interface IncomingRatchetKeys {
10
10
  readonly ratchet: SignalSerializedKeyPair;
11
11
  }
12
12
  export declare function snapshotToRecord(snapshot: SignalSessionSnapshot): SignalSessionRecord;
13
- export declare function detachSession(session: SignalSessionRecord): SignalSessionSnapshot;
14
13
  export declare function findMatchingSession(session: SignalSessionRecord | null, sessionBaseKey: Uint8Array): SignalSessionRecord | null;
15
14
  export declare function requireLocalIdentity(store: WaSignalStore): Promise<LocalIdentityContext>;
16
15
  export declare function initiateSessionOutgoing(local: LocalIdentityContext, remoteBundle: {
@@ -0,0 +1,28 @@
1
+ import { type Proto } from '../..';
2
+ import type { SignalMessageKey, SignalRecvChain, SignalSessionRecord, SignalSessionSnapshot } from '../types';
3
+ export interface SignalSessionRow extends Record<string, unknown> {
4
+ readonly user: unknown;
5
+ readonly server: unknown;
6
+ readonly device: unknown;
7
+ readonly record: unknown;
8
+ }
9
+ export interface SignalIdentityRow extends Record<string, unknown> {
10
+ readonly identity_key: unknown;
11
+ }
12
+ export declare function encodeSignalSessionSnapshot(session: SignalSessionSnapshot): Proto.ISessionStructure;
13
+ export declare function encodeSignalRecvChain(chain: SignalRecvChain): Proto.SessionStructure.IChain;
14
+ export declare function decodeSignalMessageKey(messageKey: Proto.SessionStructure.Chain.IMessageKey, field: string): SignalMessageKey;
15
+ export declare function decodeSignalRecvChain(chain: Proto.SessionStructure.IChain, field: string): SignalRecvChain;
16
+ export declare function decodeSignalSessionSnapshot(session: Proto.ISessionStructure, field: string): SignalSessionSnapshot;
17
+ /**
18
+ * Serializes a {@link SignalSessionRecord} (current + previous sessions) into
19
+ * the Signal `RecordStructure` protobuf encoding used by the session stores.
20
+ */
21
+ export declare function encodeSignalSessionRecord(record: SignalSessionRecord): Uint8Array;
22
+ /**
23
+ * Decodes a Signal `RecordStructure` payload (as stored on disk) back into a
24
+ * {@link SignalSessionRecord}. Throws when the current session is missing.
25
+ */
26
+ export declare function decodeSignalSessionRecord(raw: unknown): SignalSessionRecord;
27
+ /** Reads a stored remote identity blob into a Uint8Array (validates byte-shape). */
28
+ export declare function decodeSignalRemoteIdentity(raw: unknown): Uint8Array;
@@ -3,19 +3,35 @@ import type { SignalIdentitySyncApi } from '../api/SignalIdentitySyncApi';
3
3
  import type { SignalSessionSyncApi } from '../api/SignalSessionSyncApi';
4
4
  import type { SignalProtocol } from '../session/SignalProtocol';
5
5
  import type { SignalAddress, SignalSessionRecord } from '../types';
6
- import type { WaSignalStore } from '../../store/contracts/signal.store';
6
+ import type { WaIdentityStore } from '../../store/contracts/identity.store';
7
+ import type { WaSessionStore } from '../../store/contracts/session.store';
7
8
  export interface SignalResolvedSessionTarget {
8
9
  readonly jid: string;
9
10
  readonly address: SignalAddress;
10
11
  readonly session: SignalSessionRecord;
11
12
  }
13
+ /**
14
+ * Resolves Signal sessions for one or more JIDs, fetching missing prekey
15
+ * bundles, enforcing identity continuity, and deduplicating concurrent
16
+ * fetches for the same address.
17
+ */
12
18
  export type SignalSessionResolver = {
19
+ /**
20
+ * Ensures a session exists for `address` (fetching the prekey bundle if
21
+ * needed). `reasonIdentity` triggers a remote identity refresh first.
22
+ */
13
23
  ensureSession(address: SignalAddress, jid: string, expectedIdentity?: Uint8Array, reasonIdentity?: boolean): Promise<void>;
24
+ /**
25
+ * Batched session resolver – issues a single key-bundle fetch for all
26
+ * missing JIDs. Returns the resolved targets that now have a session.
27
+ */
14
28
  ensureSessionsBatch(targetJids: readonly string[], expectedIdentityByJid?: ReadonlyMap<string, Uint8Array>): Promise<readonly SignalResolvedSessionTarget[]>;
15
29
  };
30
+ /** Builds a {@link SignalSessionResolver} backed by the given Signal APIs and stores. */
16
31
  export declare function createSignalSessionResolver(options: {
17
32
  readonly signalProtocol: SignalProtocol;
18
- readonly signalStore: WaSignalStore;
33
+ readonly sessionStore: WaSessionStore;
34
+ readonly identityStore: WaIdentityStore;
19
35
  readonly signalIdentitySync: SignalIdentitySyncApi;
20
36
  readonly signalSessionSync: SignalSessionSyncApi;
21
37
  readonly logger: Logger;
@@ -1,4 +1,5 @@
1
1
  import type { SignalKeyPair } from '../crypto/curves/types';
2
+ import type { Proto } from '..';
2
3
  export interface RegistrationInfo {
3
4
  readonly registrationId: number;
4
5
  readonly identityKeyPair: SignalKeyPair;
@@ -37,8 +38,14 @@ export interface SignalRecvChain {
37
38
  readonly ratchetPubKey: Uint8Array;
38
39
  readonly nextMsgIndex: number;
39
40
  readonly chainKey: Uint8Array;
40
- readonly unusedMsgKeys: readonly SignalMessageKey[];
41
- }
41
+ readonly unusedMsgKeys: readonly Proto.SessionStructure.Chain.IMessageKey[];
42
+ }
43
+ /**
44
+ * Raw protobuf recv chain kept as-is to avoid eager decode.
45
+ * Use {@link decodeSignalRecvChain} only for the chain that
46
+ * actually needs to be read/modified.
47
+ */
48
+ export type RawSignalRecvChain = Proto.SessionStructure.IChain;
42
49
  export interface SignalSendChain {
43
50
  readonly ratchetKey: SignalSerializedKeyPair;
44
51
  readonly nextMsgIndex: number;
@@ -54,14 +61,19 @@ export interface SignalSessionSnapshot {
54
61
  readonly remote: SignalPeer;
55
62
  readonly rootKey: Uint8Array;
56
63
  readonly sendChain: SignalSendChain;
57
- readonly recvChains: readonly SignalRecvChain[];
64
+ readonly recvChains: readonly RawSignalRecvChain[];
58
65
  readonly initialExchangeInfo: SignalInitialExchangeInfo | null;
59
66
  readonly prevSendChainHighestIndex: number;
60
67
  readonly aliceBaseKey: Uint8Array | null;
61
68
  }
62
69
  export interface SignalSessionRecord extends SignalSessionSnapshot {
63
- readonly prevSessions: readonly SignalSessionSnapshot[];
70
+ readonly prevSessions: readonly RawSignalSessionSnapshot[];
64
71
  }
72
+ /**
73
+ * Raw protobuf session snapshot kept as-is to avoid eager decode.
74
+ * Only decoded on demand in rare fallback paths (session mismatch).
75
+ */
76
+ export type RawSignalSessionSnapshot = Proto.ISessionStructure;
65
77
  export interface SignalPreKeyBundle {
66
78
  readonly regId: number;
67
79
  readonly identity: Uint8Array;
@@ -0,0 +1,15 @@
1
+ import type { WaIdentityStore } from '../contracts/identity.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ /**
4
+ * Read-through / write-through in-process cache for a persistent remote
5
+ * identity backend. Reuses {@link WaIdentityMemoryStore} as the bounded-LRU
6
+ * L1. Remote identities are read alongside sessions on the send path (the
7
+ * identity-mismatch guard), so caching them complements
8
+ * {@link withSessionCache}.
9
+ *
10
+ * The identity store has no per-key delete: identities are overwritten on
11
+ * re-establishment, so a peer's key change propagates through the
12
+ * write-through `setRemoteIdentity`. See {@link withSessionCache} for the
13
+ * shared coherence model and the single-writer-per-session assumption.
14
+ */
15
+ export declare function withIdentityCache(backend: WaIdentityStore, maxEntries?: number): WithDestroyLifecycle<WaIdentityStore>;
@@ -0,0 +1,15 @@
1
+ import type { WaPrivacyTokenStore } from '../contracts/privacy-token.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ /**
4
+ * Read-through cache for a persistent privacy-token backend. Reuses
5
+ * {@link WaPrivacyTokenMemoryStore} as the bounded-LRU L1.
6
+ *
7
+ * Unlike the signal caches this is **invalidate-on-write, not
8
+ * write-through**: `upsert` merges partial fields into the existing row on
9
+ * the backend, so caching the partial incoming record would diverge from the
10
+ * backend's merged result. Instead each upsert drops the L1 entry and the
11
+ * next read re-populates from the merged backend truth. See
12
+ * {@link withSessionCache} for the shared coherence model and the
13
+ * single-writer-per-session assumption.
14
+ */
15
+ export declare function withPrivacyTokenCache(backend: WaPrivacyTokenStore, maxEntries?: number): WithDestroyLifecycle<WaPrivacyTokenStore>;
@@ -0,0 +1,18 @@
1
+ import type { WaSenderKeyStore } from '../contracts/sender-key.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ /**
4
+ * Read-through / write-through in-process cache for a persistent sender-key
5
+ * backend. Reuses {@link SenderKeyMemoryStore} as the bounded-LRU L1 so the
6
+ * per-(group, sender) lookups repeated across a group fan-out skip the
7
+ * backend round-trip.
8
+ *
9
+ * Only the point reads are cached. `getGroupSenderKeyList` returns the
10
+ * *complete* set for a group, which a partial point cache would under-report,
11
+ * so it goes straight to the backend. Upserts replace the whole record (no
12
+ * merge), so they are write-through; the sweep deletes
13
+ * (`deleteDeviceSenderKey`/`markForgetSenderKey`) run on the backend for the
14
+ * authoritative count and then invalidate the matching L1 entries via the
15
+ * memory store's own sweep. See {@link withSessionCache} for the shared
16
+ * coherence model and the single-writer-per-session assumption.
17
+ */
18
+ export declare function withSenderKeyCache(backend: WaSenderKeyStore, maxEntries?: number): WithDestroyLifecycle<WaSenderKeyStore>;
@@ -0,0 +1,23 @@
1
+ import type { WaSessionStore } from '../contracts/session.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ /**
4
+ * Read-through / write-through in-process cache for a persistent session
5
+ * backend. Reuses {@link WaSessionMemoryStore} as the bounded-LRU L1 so that
6
+ * repeated reads of the same peer on the send/recv path skip the backend
7
+ * round-trip.
8
+ *
9
+ * Coherence model (single process):
10
+ * - every mutation (set/delete/clear) writes the backend then the L1 in
11
+ * lock-step and bumps a generation counter;
12
+ * - a read only populates the L1 when no mutation interleaved its backend
13
+ * fetch (generation unchanged) and the slot is still empty, so an in-flight
14
+ * read can never resurrect a concurrently deleted entry nor overwrite a
15
+ * fresher concurrent write;
16
+ * - there is no negative caching: a miss always re-hits the backend.
17
+ *
18
+ * This cache assumes a single writer per `sessionId` (the library's
19
+ * connection model). Do not share one backend across processes for the same
20
+ * session with the cache enabled - there is no cross-process invalidation
21
+ * channel, so another process's writes would leave this L1 stale.
22
+ */
23
+ export declare function withSessionCache(backend: WaSessionStore, maxEntries?: number): WithDestroyLifecycle<WaSessionStore>;
@@ -9,7 +9,21 @@ export interface WaStoredContactRecord {
9
9
  export interface WaContactStore {
10
10
  upsert(record: WaStoredContactRecord): Promise<void>;
11
11
  upsertBatch(records: readonly WaStoredContactRecord[]): Promise<void>;
12
+ /**
13
+ * Lookup by jid. Contacts are persisted in LID-canonical form when both
14
+ * LID and PN are known (one row, `jid=<lid>` + `phoneNumber=<pn>`), so
15
+ * passing the PN form falls through to {@link getByPhoneNumber} when no
16
+ * row matches the PN jid directly. Callers do not need to know which
17
+ * form was used to write the row.
18
+ */
12
19
  getByJid(jid: string): Promise<WaStoredContactRecord | null>;
20
+ /**
21
+ * Lookup the contact whose `phoneNumber` field equals `pn`. Returns the
22
+ * LID-canonical row when the cross-reference is known, `null` otherwise.
23
+ * Used by {@link getByJid} for the PN-fallback path and exposed publicly
24
+ * for callers that already know the PN form.
25
+ */
26
+ getByPhoneNumber(pn: string): Promise<WaStoredContactRecord | null>;
13
27
  deleteByJid(jid: string): Promise<number>;
14
28
  clear(): Promise<void>;
15
29
  }
@@ -1,5 +1,12 @@
1
1
  export interface WaDeviceListSnapshot {
2
2
  readonly userJid: string;
3
+ /**
4
+ * The equivalent user-base JID in the other addressing form (PN if `userJid`
5
+ * is LID and vice versa). Populated by the lid usync resolver at send time.
6
+ * Used by retry-receipt eligibility to match the same user across
7
+ * `@s.whatsapp.net` and `@lid` forms.
8
+ */
9
+ readonly altUserJid?: string;
3
10
  readonly deviceJids: readonly string[];
4
11
  readonly updatedAtMs: number;
5
12
  }
@@ -7,6 +14,12 @@ export interface WaDeviceListStore {
7
14
  destroy?(): Promise<void>;
8
15
  upsertUserDevicesBatch(snapshots: readonly WaDeviceListSnapshot[]): Promise<void>;
9
16
  getUserDevicesBatch(userJids: readonly string[], nowMs?: number): Promise<readonly (WaDeviceListSnapshot | null)[]>;
17
+ /**
18
+ * Resolves a snapshot by either `userJid` (primary) or `altUserJid`
19
+ * (alternate addressing). Returns the snapshot whose user matches `jid` in
20
+ * either form, or `null` when unknown / expired.
21
+ */
22
+ findByAnyUserJid(jid: string, nowMs?: number): Promise<WaDeviceListSnapshot | null>;
10
23
  deleteUserDevices(userJid: string): Promise<number>;
11
24
  cleanupExpired(nowMs: number): Promise<number>;
12
25
  clear(): Promise<void>;
@@ -0,0 +1,14 @@
1
+ export interface WaGroupMetadataSnapshot {
2
+ readonly groupJid: string;
3
+ readonly participants: readonly string[];
4
+ readonly ephemeral?: number;
5
+ readonly updatedAtMs: number;
6
+ }
7
+ export interface WaGroupMetadataStore {
8
+ destroy?(): Promise<void>;
9
+ upsertGroupMetadata(snapshot: WaGroupMetadataSnapshot): Promise<void>;
10
+ getGroupMetadata(groupJid: string, nowMs?: number): Promise<WaGroupMetadataSnapshot | null>;
11
+ deleteGroupMetadata(groupJid: string): Promise<number>;
12
+ cleanupExpired(nowMs: number): Promise<number>;
13
+ clear(): Promise<void>;
14
+ }
@@ -0,0 +1,11 @@
1
+ import type { SignalAddress } from '../../signal/types';
2
+ export interface WaIdentityStore {
3
+ getRemoteIdentity(address: SignalAddress): Promise<Uint8Array | null>;
4
+ getRemoteIdentities(addresses: readonly SignalAddress[]): Promise<readonly (Uint8Array | null)[]>;
5
+ setRemoteIdentity(address: SignalAddress, identityKey: Uint8Array): Promise<void>;
6
+ setRemoteIdentities(entries: readonly {
7
+ readonly address: SignalAddress;
8
+ readonly identityKey: Uint8Array;
9
+ }[]): Promise<void>;
10
+ clear(): Promise<void>;
11
+ }
@@ -0,0 +1,16 @@
1
+ export interface WaMessageSecretEntry {
2
+ readonly secret: Uint8Array;
3
+ readonly senderJid: string;
4
+ }
5
+ export interface WaMessageSecretStore {
6
+ get(messageId: string, nowMs?: number): Promise<WaMessageSecretEntry | null>;
7
+ getBatch(messageIds: readonly string[], nowMs?: number): Promise<readonly (WaMessageSecretEntry | null)[]>;
8
+ set(messageId: string, entry: WaMessageSecretEntry): Promise<void>;
9
+ setBatch(entries: readonly {
10
+ readonly messageId: string;
11
+ readonly entry: WaMessageSecretEntry;
12
+ }[]): Promise<void>;
13
+ cleanupExpired(nowMs: number): Promise<number>;
14
+ clear(): Promise<void>;
15
+ destroy?(): Promise<void>;
16
+ }
@@ -5,8 +5,6 @@ export interface WaStoredMessageRecord {
5
5
  readonly participantJid?: string;
6
6
  readonly fromMe: boolean;
7
7
  readonly timestampMs?: number;
8
- readonly encType?: string;
9
- readonly plaintext?: Uint8Array;
10
8
  readonly messageBytes?: Uint8Array;
11
9
  }
12
10
  export interface WaMessageStore {
@@ -0,0 +1,13 @@
1
+ import type { PreKeyRecord } from '../../signal/types';
2
+ export interface WaPreKeyStore {
3
+ putPreKey(record: PreKeyRecord): Promise<void>;
4
+ getOrGenPreKeys(count: number, generator: (keyId: number) => PreKeyRecord | Promise<PreKeyRecord>): Promise<readonly PreKeyRecord[]>;
5
+ getPreKeyById(keyId: number): Promise<PreKeyRecord | null>;
6
+ getPreKeysById(keyIds: readonly number[]): Promise<readonly (PreKeyRecord | null)[]>;
7
+ consumePreKeyById(keyId: number): Promise<PreKeyRecord | null>;
8
+ getOrGenSinglePreKey(generator: (keyId: number) => PreKeyRecord | Promise<PreKeyRecord>): Promise<PreKeyRecord>;
9
+ markKeyAsUploaded(keyId: number): Promise<void>;
10
+ setServerHasPreKeys(value: boolean): Promise<void>;
11
+ getServerHasPreKeys(): Promise<boolean>;
12
+ clear(): Promise<void>;
13
+ }
@@ -0,0 +1,14 @@
1
+ import type { SignalAddress, SignalSessionRecord } from '../../signal/types';
2
+ export interface WaSessionStore {
3
+ hasSession(address: SignalAddress): Promise<boolean>;
4
+ hasSessions(addresses: readonly SignalAddress[]): Promise<readonly boolean[]>;
5
+ getSession(address: SignalAddress): Promise<SignalSessionRecord | null>;
6
+ getSessionsBatch(addresses: readonly SignalAddress[]): Promise<readonly (SignalSessionRecord | null)[]>;
7
+ setSession(address: SignalAddress, session: SignalSessionRecord): Promise<void>;
8
+ setSessionsBatch(entries: readonly {
9
+ readonly address: SignalAddress;
10
+ readonly session: SignalSessionRecord;
11
+ }[]): Promise<void>;
12
+ deleteSession(address: SignalAddress): Promise<void>;
13
+ clear(): Promise<void>;
14
+ }
@@ -1,10 +1,4 @@
1
- import type { PreKeyRecord, RegistrationInfo, SignalAddress, SignalSessionRecord, SignedPreKeyRecord } from '../../signal/types';
2
- export interface WaSignalMetaSnapshot {
3
- readonly serverHasPreKeys: boolean;
4
- readonly signedPreKeyRotationTs: number | null;
5
- readonly registrationInfo: RegistrationInfo | null;
6
- readonly signedPreKey: SignedPreKeyRecord | null;
7
- }
1
+ import type { RegistrationInfo, SignedPreKeyRecord } from '../../signal/types';
8
2
  export interface WaSignalStore {
9
3
  getRegistrationInfo(): Promise<RegistrationInfo | null>;
10
4
  setRegistrationInfo(info: RegistrationInfo): Promise<void>;
@@ -13,32 +7,5 @@ export interface WaSignalStore {
13
7
  getSignedPreKeyById(keyId: number): Promise<SignedPreKeyRecord | null>;
14
8
  setSignedPreKeyRotationTs(value: number | null): Promise<void>;
15
9
  getSignedPreKeyRotationTs(): Promise<number | null>;
16
- putPreKey(record: PreKeyRecord): Promise<void>;
17
- getOrGenPreKeys(count: number, generator: (keyId: number) => PreKeyRecord | Promise<PreKeyRecord>): Promise<readonly PreKeyRecord[]>;
18
- getPreKeyById(keyId: number): Promise<PreKeyRecord | null>;
19
- getPreKeysById(keyIds: readonly number[]): Promise<readonly (PreKeyRecord | null)[]>;
20
- consumePreKeyById(keyId: number): Promise<PreKeyRecord | null>;
21
- getOrGenSinglePreKey(generator: (keyId: number) => PreKeyRecord | Promise<PreKeyRecord>): Promise<PreKeyRecord>;
22
- markKeyAsUploaded(keyId: number): Promise<void>;
23
- setServerHasPreKeys(value: boolean): Promise<void>;
24
- getServerHasPreKeys(): Promise<boolean>;
25
- getSignalMeta(): Promise<WaSignalMetaSnapshot>;
26
- hasSession(address: SignalAddress): Promise<boolean>;
27
- hasSessions(addresses: readonly SignalAddress[]): Promise<readonly boolean[]>;
28
- getSession(address: SignalAddress): Promise<SignalSessionRecord | null>;
29
- getSessionsBatch(addresses: readonly SignalAddress[]): Promise<readonly (SignalSessionRecord | null)[]>;
30
- setSession(address: SignalAddress, session: SignalSessionRecord): Promise<void>;
31
- setSessionsBatch(entries: readonly {
32
- readonly address: SignalAddress;
33
- readonly session: SignalSessionRecord;
34
- }[]): Promise<void>;
35
- deleteSession(address: SignalAddress): Promise<void>;
36
- getRemoteIdentity(address: SignalAddress): Promise<Uint8Array | null>;
37
- getRemoteIdentities(addresses: readonly SignalAddress[]): Promise<readonly (Uint8Array | null)[]>;
38
- setRemoteIdentity(address: SignalAddress, identityKey: Uint8Array): Promise<void>;
39
- setRemoteIdentities(entries: readonly {
40
- readonly address: SignalAddress;
41
- readonly identityKey: Uint8Array;
42
- }[]): Promise<void>;
43
10
  clear(): Promise<void>;
44
11
  }
@@ -1,2 +1,54 @@
1
- import type { WaCreateStoreOptions, WaStore } from './types';
2
- export declare function createStore<B extends string>(options: WaCreateStoreOptions<B>): WaStore;
1
+ import type { WaCreateStoreOptions, WaCreateStoreOptionsStrict, WaStore } from './types';
2
+ /**
3
+ * Builds a {@link WaStore} from the configured providers/backends. Each call
4
+ * to `store.session(sessionId)` returns a cached, lock-wrapped per-domain
5
+ * store bundle for that session. Cache domains default to bounded memory
6
+ * with the TTLs in `options.memory.cacheTtlMs`.
7
+ *
8
+ * **Defaults policy:**
9
+ * - With `backends` empty (or absent), every domain falls back to memory
10
+ * (mailbox domains to `'none'`). The session lives only in memory and the
11
+ * device re-pairs on every restart.
12
+ * - With `backends` set, **every persistence domain must be assigned
13
+ * explicitly** in `providers` (auth/signal/preKey/session/identity/
14
+ * senderKey/appState/privacyToken/messages/threads/contacts). The factory
15
+ * throws listing the missing keys. Pass `'memory'` to keep the in-tree
16
+ * memory provider for that domain, `'none'` to skip it, or the backend
17
+ * name to persist. Cache domains (retry/groupMetadata/deviceList/
18
+ * messageSecret) stay opt-in and default to memory - they are small,
19
+ * hot, and cheap to rebuild.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * // Persistent setup with @zapo-js/store-sqlite (recommended for production)
24
+ * import { createSqliteStore } from '@zapo-js/store-sqlite'
25
+ * import { createStore } from '..'
26
+ *
27
+ * const store = createStore({
28
+ * backends: { sqlite: createSqliteStore({ path: '.auth/state.sqlite' }) },
29
+ * providers: {
30
+ * auth: 'sqlite',
31
+ * signal: 'sqlite',
32
+ * preKey: 'sqlite',
33
+ * session: 'sqlite',
34
+ * identity: 'sqlite',
35
+ * senderKey: 'sqlite',
36
+ * appState: 'sqlite',
37
+ * privacyToken: 'sqlite',
38
+ * messages: 'sqlite', // 'none' to skip the message archive
39
+ * threads: 'sqlite', // 'none' to skip
40
+ * contacts: 'sqlite' // 'none' to skip
41
+ * }
42
+ * // cacheProviders omitted - retry/groupMetadata/deviceList/
43
+ * // messageSecret default to memory
44
+ * })
45
+ *
46
+ * // Memory-only (tests / ephemeral sessions - credentials lost on restart)
47
+ * const memStore = createStore({})
48
+ * ```
49
+ */
50
+ export declare function createStore(options?: Omit<WaCreateStoreOptions<never>, 'backends' | 'providers'> & {
51
+ readonly backends?: undefined;
52
+ readonly providers?: undefined;
53
+ }): WaStore;
54
+ export declare function createStore<B extends string>(options: WaCreateStoreOptionsStrict<B>): WaStore;
@@ -1,23 +1,32 @@
1
- export type { WaCreateStoreOptions, WaStore, WaStoreBackend, WaCacheDomain, WaStoreDomain, WaStoreMemoryLimitSelection, WaStoreSession } from './types';
1
+ export type { WaCreateStoreOptions, WaCreateStoreOptionsStrict, WaStore, WaStoreBackend, WaCacheDomain, WaStoreDomain, WaStoreMemoryLimitSelection, WaStoreSession } from './types';
2
2
  export { createStore } from './createStore';
3
3
  export type { WaAuthStore } from './contracts/auth.store';
4
4
  export type { WaContactStore, WaStoredContactRecord } from './contracts/contact.store';
5
5
  export type { WaDeviceListSnapshot, WaDeviceListStore } from './contracts/device-list.store';
6
+ export type { WaMessageSecretEntry, WaMessageSecretStore } from './contracts/message-secret.store';
6
7
  export type { WaMessageStore, WaStoredMessageRecord } from './contracts/message.store';
7
- export type { WaParticipantsSnapshot, WaParticipantsStore } from './contracts/participants.store';
8
+ export type { WaGroupMetadataSnapshot, WaGroupMetadataStore } from './contracts/group-metadata.store';
8
9
  export type { WaAppStateCollectionStateUpdate, WaAppStateCollectionStoreState, WaAppStateStore } from './contracts/appstate.store';
10
+ export type { WaIdentityStore } from './contracts/identity.store';
11
+ export type { WaPreKeyStore } from './contracts/pre-key.store';
9
12
  export type { WaSenderKeyStore } from './contracts/sender-key.store';
10
- export type { WaSignalMetaSnapshot, WaSignalStore } from './contracts/signal.store';
13
+ export type { WaSessionStore } from './contracts/session.store';
14
+ export type { WaSignalStore } from './contracts/signal.store';
11
15
  export type { WaRetryStore } from './contracts/retry.store';
12
16
  export type { WaStoredThreadRecord, WaThreadStore } from './contracts/thread.store';
13
17
  export type { WaPrivacyTokenStore, WaStoredPrivacyTokenRecord } from './contracts/privacy-token.store';
14
- export { WaAppStateMemoryStore } from './providers/memory/appstate.store';
15
- export { WaSignalMemoryStore } from './providers/memory/signal.store';
16
- export { SenderKeyMemoryStore } from './providers/memory/sender-key.store';
17
- export { WaRetryMemoryStore } from './providers/memory/retry.store';
18
- export { WaParticipantsMemoryStore } from './providers/memory/participants.store';
19
- export { WaDeviceListMemoryStore } from './providers/memory/device-list.store';
20
- export { WaContactMemoryStore } from './providers/memory/contact.store';
21
- export { WaMessageMemoryStore } from './providers/memory/message.store';
22
- export { WaThreadMemoryStore } from './providers/memory/thread.store';
23
- export { WaPrivacyTokenMemoryStore } from './providers/memory/privacy-token.store';
18
+ export { WaAppStateMemoryStore } from './memory/appstate.store';
19
+ export { WaAuthMemoryStore } from './memory/auth.store';
20
+ export { WaSignalMemoryStore } from './memory/signal.store';
21
+ export { WaPreKeyMemoryStore } from './memory/pre-key.store';
22
+ export { WaSessionMemoryStore } from './memory/session.store';
23
+ export { WaIdentityMemoryStore } from './memory/identity.store';
24
+ export { SenderKeyMemoryStore } from './memory/sender-key.store';
25
+ export { WaRetryMemoryStore } from './memory/retry.store';
26
+ export { WaGroupMetadataMemoryStore } from './memory/group-metadata.store';
27
+ export { WaDeviceListMemoryStore } from './memory/device-list.store';
28
+ export { WaContactMemoryStore } from './memory/contact.store';
29
+ export { WaMessageSecretMemoryStore } from './memory/message-secret.store';
30
+ export { WaMessageMemoryStore } from './memory/message.store';
31
+ export { WaThreadMemoryStore } from './memory/thread.store';
32
+ export { WaPrivacyTokenMemoryStore } from './memory/privacy-token.store';
@@ -0,0 +1,2 @@
1
+ import type { WaGroupMetadataStore } from '../contracts/group-metadata.store';
2
+ export declare function withGroupMetadataLock(store: WaGroupMetadataStore): WaGroupMetadataStore;
@@ -0,0 +1,3 @@
1
+ import type { WaIdentityStore } from '../contracts/identity.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ export declare function withIdentityLock(store: WaIdentityStore): WithDestroyLifecycle<WaIdentityStore>;
@@ -0,0 +1,3 @@
1
+ import type { WaMessageSecretStore } from '../contracts/message-secret.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ export declare function withMessageSecretLock(store: WaMessageSecretStore): WithDestroyLifecycle<WaMessageSecretStore>;
@@ -0,0 +1,3 @@
1
+ import type { WaPreKeyStore } from '../contracts/pre-key.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ export declare function withPreKeyLock(store: WaPreKeyStore): WithDestroyLifecycle<WaPreKeyStore>;
@@ -0,0 +1,3 @@
1
+ import type { WaSessionStore } from '../contracts/session.store';
2
+ import type { WithDestroyLifecycle } from '../types';
3
+ export declare function withSessionLock(store: WaSessionStore): WithDestroyLifecycle<WaSessionStore>;
@@ -1,5 +1,5 @@
1
- import type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey } from '../../../appstate/types';
2
- import type { WaAppStateCollectionStateUpdate, WaAppStateCollectionStoreState, WaAppStateStore } from '../../contracts/appstate.store';
1
+ import type { AppStateCollectionName, WaAppStateStoreData, WaAppStateSyncKey } from '../../appstate/types';
2
+ import type { WaAppStateCollectionStateUpdate, WaAppStateCollectionStoreState, WaAppStateStore } from '../contracts/appstate.store';
3
3
  export interface WaAppStateMemoryStoreOptions {
4
4
  readonly maxSyncKeys?: number;
5
5
  readonly maxCollectionEntries?: number;
@@ -0,0 +1,18 @@
1
+ import type { WaAuthCredentials } from '../../auth/types';
2
+ import type { WaAuthStore } from '../contracts/auth.store';
3
+ /**
4
+ * In-memory {@link WaAuthStore} implementation. Holds a single
5
+ * {@link WaAuthCredentials} per instance in a field – nothing is persisted.
6
+ *
7
+ * @sensitive Holds private key material from {@link WaAuthCredentials} in
8
+ * RAM. Never log instances, never `JSON.stringify`. Pairing credentials are
9
+ * lost when the process exits, so the next connect will re-pair from scratch
10
+ * (QR/link-code). Prefer a persistent backend (e.g. `@zapo-js/store-sqlite`)
11
+ * for production.
12
+ */
13
+ export declare class WaAuthMemoryStore implements WaAuthStore {
14
+ private credentials;
15
+ load(): Promise<WaAuthCredentials | null>;
16
+ save(credentials: WaAuthCredentials): Promise<void>;
17
+ clear(): Promise<void>;
18
+ }
@@ -1,14 +1,19 @@
1
- import type { WaContactStore as Contract, WaStoredContactRecord } from '../../contracts/contact.store';
1
+ import type { WaContactStore as Contract, WaStoredContactRecord } from '../contracts/contact.store';
2
2
  export interface WaContactMemoryStoreOptions {
3
3
  readonly maxContacts?: number;
4
4
  }
5
5
  export declare class WaContactMemoryStore implements Contract {
6
6
  private readonly contacts;
7
+ /** Secondary index: phone_number -> primary jid (typically the LID form). */
8
+ private readonly phoneIndex;
7
9
  private readonly maxContacts;
8
10
  constructor(options?: WaContactMemoryStoreOptions);
11
+ private writeRecord;
9
12
  upsert(record: WaStoredContactRecord): Promise<void>;
10
13
  upsertBatch(records: readonly WaStoredContactRecord[]): Promise<void>;
11
14
  getByJid(jid: string): Promise<WaStoredContactRecord | null>;
15
+ getByPhoneNumber(pn: string): Promise<WaStoredContactRecord | null>;
16
+ private getByPhoneNumberSync;
12
17
  deleteByJid(jid: string): Promise<number>;
13
18
  clear(): Promise<void>;
14
19
  }
@@ -1,17 +1,30 @@
1
- import type { WaDeviceListSnapshot, WaDeviceListStore } from '../../contracts/device-list.store';
1
+ import type { Logger } from '../../infra/log/types';
2
+ import type { WaDeviceListSnapshot, WaDeviceListStore } from '../contracts/device-list.store';
2
3
  export interface WaDeviceListMemoryStoreOptions {
3
4
  readonly maxUsers?: number;
5
+ /**
6
+ * Logger for capacity-saturation warnings. Emits a single `warn` the
7
+ * first time the bounded map evicts an entry; subsequent evictions are
8
+ * silent to avoid spam.
9
+ */
10
+ readonly logger?: Logger;
4
11
  }
5
12
  export declare class WaDeviceListMemoryStore implements WaDeviceListStore {
6
13
  private readonly records;
14
+ private readonly altIndex;
7
15
  private readonly ttlMs;
8
16
  private readonly maxUsers;
9
- private readonly cleanupTimer;
17
+ private readonly cleanup;
18
+ private readonly logger;
19
+ private capacityWarned;
10
20
  constructor(ttlMs?: number, options?: WaDeviceListMemoryStoreOptions);
21
+ private warnCapacity;
11
22
  upsertUserDevicesBatch(snapshots: readonly WaDeviceListSnapshot[]): Promise<void>;
12
23
  getUserDevicesBatch(userJids: readonly string[], nowMs?: number): Promise<readonly (WaDeviceListSnapshot | null)[]>;
24
+ findByAnyUserJid(jid: string, nowMs?: number): Promise<WaDeviceListSnapshot | null>;
13
25
  deleteUserDevices(userJid: string): Promise<number>;
14
26
  cleanupExpired(nowMs: number): Promise<number>;
15
27
  clear(): Promise<void>;
16
28
  destroy(): Promise<void>;
29
+ private readLive;
17
30
  }