zapo-js 0.3.0 → 1.0.1

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 (781) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -178
  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 +20 -8
  12. package/dist/auth/pairing/WaPairingFlow.js +35 -26
  13. package/dist/auth/pairing/pairing-code-crypto.js +17 -19
  14. package/dist/client/WaClient.js +343 -474
  15. package/dist/client/WaClientFactory.js +281 -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 +685 -207
  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 +257 -126
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +8 -9
  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 +163 -6
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +93 -44
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +4 -18
  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 +282 -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 +8 -9
  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 +158 -8
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +92 -43
  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 +69 -20
  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 +8 -1
  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/locks/pre-key.lock.js +4 -1
  245. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  246. package/dist/esm/store/memory/auth.store.js +24 -0
  247. package/dist/esm/store/memory/contact.store.js +79 -0
  248. package/dist/esm/store/memory/device-list.store.js +103 -0
  249. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  250. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  251. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  252. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  254. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  255. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  256. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  258. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  259. package/dist/esm/store/noop.store.js +6 -4
  260. package/dist/esm/transport/WaComms.js +14 -5
  261. package/dist/esm/transport/WaWebSocket.js +32 -8
  262. package/dist/esm/transport/binary/constants.js +10 -4
  263. package/dist/esm/transport/binary/decoder.js +21 -15
  264. package/dist/esm/transport/binary/encoder.js +96 -21
  265. package/dist/esm/transport/binary/tokens.js +12 -12
  266. package/dist/esm/transport/index.js +1 -0
  267. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  268. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  269. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  270. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  271. package/dist/esm/transport/node/builders/abprops.js +2 -2
  272. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  273. package/dist/esm/transport/node/builders/bot.js +38 -0
  274. package/dist/esm/transport/node/builders/business.js +30 -30
  275. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  276. package/dist/esm/transport/node/builders/community.js +53 -0
  277. package/dist/esm/transport/node/builders/device.js +2 -2
  278. package/dist/esm/transport/node/builders/email.js +6 -5
  279. package/dist/esm/transport/node/builders/global.js +1 -1
  280. package/dist/esm/transport/node/builders/group.js +114 -4
  281. package/dist/esm/transport/node/builders/media.js +2 -2
  282. package/dist/esm/transport/node/builders/message.js +83 -49
  283. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  284. package/dist/esm/transport/node/builders/passive.js +7 -0
  285. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  286. package/dist/esm/transport/node/builders/presence.js +27 -1
  287. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  288. package/dist/esm/transport/node/builders/privacy.js +6 -6
  289. package/dist/esm/transport/node/builders/profile.js +28 -8
  290. package/dist/esm/transport/node/builders/tos.js +58 -0
  291. package/dist/esm/transport/node/builders/usync.js +51 -2
  292. package/dist/esm/transport/node/helpers.js +3 -1
  293. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  294. package/dist/esm/transport/node/mex/client.js +22 -0
  295. package/dist/esm/transport/node/query.js +17 -0
  296. package/dist/esm/transport/node/usync.js +12 -0
  297. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  298. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  300. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  301. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  302. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  303. package/dist/esm/transport/noise/constants.js +0 -1
  304. package/dist/esm/transport/proxy.js +5 -0
  305. package/dist/esm/transport/stream/parse.js +3 -7
  306. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  307. package/dist/esm/util/async.js +4 -0
  308. package/dist/esm/util/bytes.js +37 -2
  309. package/dist/esm/util/clock.js +15 -0
  310. package/dist/esm/util/coercion.js +45 -3
  311. package/dist/esm/util/collections.js +11 -0
  312. package/dist/esm/util/index.js +2 -2
  313. package/dist/esm/util/primitives.js +19 -0
  314. package/dist/esm/util/runtime.js +5 -0
  315. package/dist/esm/version-spec.js +1 -0
  316. package/dist/index.js +35 -5
  317. package/dist/infra/log/ConsoleLogger.js +30 -6
  318. package/dist/infra/log/PinoLogger.js +64 -0
  319. package/dist/infra/log/types.js +4 -2
  320. package/dist/infra/perf/BackgroundQueue.js +55 -13
  321. package/dist/media/constants.js +34 -3
  322. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  323. package/dist/media/index.js +9 -4
  324. package/dist/media/sticker/sticker-pack.js +136 -0
  325. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  326. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  327. package/dist/message/WaMessageClient.js +46 -15
  328. package/dist/message/addons/link-preview/builder.js +39 -0
  329. package/dist/message/addons/link-preview/detect.js +58 -0
  330. package/dist/message/addons/link-preview/fetcher.js +394 -0
  331. package/dist/message/addons/link-preview/types.js +2 -0
  332. package/dist/message/context-info.js +129 -0
  333. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  334. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  335. package/dist/message/crypto/phash.js +136 -0
  336. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  337. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  338. package/dist/message/{content.js → encode/content.js} +192 -7
  339. package/dist/message/encode/media-payload.js +45 -0
  340. package/dist/message/{padding.js → encode/padding.js} +9 -3
  341. package/dist/message/index.js +2 -2
  342. package/dist/message/kinds/bot.js +120 -0
  343. package/dist/message/kinds/newsletter.js +248 -0
  344. package/dist/message/kinds/sticker-pack.js +34 -0
  345. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  346. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  347. package/dist/message/primitives/peer-data-operation.js +96 -0
  348. package/dist/mex.js +6 -0
  349. package/dist/proto.js +1 -1
  350. package/dist/protocol/abprops.js +10 -0
  351. package/dist/protocol/appstate.js +7 -31
  352. package/dist/protocol/auth.js +3 -2
  353. package/dist/protocol/bot.js +81 -0
  354. package/dist/protocol/browser.js +8 -0
  355. package/dist/protocol/business.js +22 -0
  356. package/dist/protocol/call.js +51 -0
  357. package/dist/protocol/constants.js +39 -3
  358. package/dist/protocol/defaults.js +3 -0
  359. package/dist/protocol/index.js +12 -3
  360. package/dist/protocol/jid.js +107 -5
  361. package/dist/protocol/media.js +25 -12
  362. package/dist/protocol/message.js +4 -1
  363. package/dist/protocol/newsletter.js +64 -0
  364. package/dist/protocol/nodes.js +22 -2
  365. package/dist/protocol/notification.js +19 -3
  366. package/dist/protocol/presence.js +16 -0
  367. package/dist/protocol/status.js +9 -0
  368. package/dist/retry/codec.js +5 -0
  369. package/dist/retry/parse.js +16 -34
  370. package/dist/retry/reason.js +5 -0
  371. package/dist/retry/replay.js +130 -36
  372. package/dist/retry/tracker.js +3 -7
  373. package/dist/signal/api/SignalDeviceSyncApi.js +67 -18
  374. package/dist/signal/api/SignalDigestSyncApi.js +7 -2
  375. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  376. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  377. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  378. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  379. package/dist/signal/api/codec.js +52 -0
  380. package/dist/signal/api/prekeys.js +4 -0
  381. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +6 -8
  382. package/dist/signal/constants.js +4 -1
  383. package/dist/signal/encoding.js +5 -303
  384. package/dist/signal/group/SenderKeyChain.js +18 -33
  385. package/dist/signal/group/SenderKeyCodec.js +2 -2
  386. package/dist/signal/group/SenderKeyManager.js +26 -9
  387. package/dist/signal/group/encoding.js +101 -0
  388. package/dist/signal/index.js +13 -10
  389. package/dist/signal/registration/encoding.js +39 -0
  390. package/dist/signal/registration/keygen.js +11 -1
  391. package/dist/signal/registration/utils.js +8 -1
  392. package/dist/signal/session/SignalProtocol.js +113 -11
  393. package/dist/signal/session/SignalRatchet.js +26 -56
  394. package/dist/signal/session/SignalSerializer.js +2 -2
  395. package/dist/signal/session/SignalSession.js +7 -15
  396. package/dist/signal/session/encoding.js +183 -0
  397. package/dist/signal/session/resolver.js +139 -30
  398. package/dist/store/cache/identity.cache.js +78 -0
  399. package/dist/store/cache/privacy-token.cache.js +60 -0
  400. package/dist/store/cache/sender-key.cache.js +104 -0
  401. package/dist/store/cache/session.cache.js +95 -0
  402. package/dist/store/contracts/group-metadata.store.js +2 -0
  403. package/dist/store/createStore.js +90 -36
  404. package/dist/store/index.js +18 -16
  405. package/dist/store/locks/contact.lock.js +1 -0
  406. package/dist/store/locks/device-list.lock.js +1 -0
  407. package/dist/store/locks/group-metadata.lock.js +23 -0
  408. package/dist/store/locks/pre-key.lock.js +4 -1
  409. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  410. package/dist/store/memory/auth.store.js +28 -0
  411. package/dist/store/memory/contact.store.js +83 -0
  412. package/dist/store/memory/device-list.store.js +107 -0
  413. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  414. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  415. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  416. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  417. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  418. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  419. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  420. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  421. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  422. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  423. package/dist/store/noop.store.js +7 -5
  424. package/dist/transport/WaComms.js +14 -5
  425. package/dist/transport/WaWebSocket.js +32 -8
  426. package/dist/transport/binary/constants.js +11 -5
  427. package/dist/transport/binary/decoder.js +24 -18
  428. package/dist/transport/binary/encoder.js +109 -34
  429. package/dist/transport/binary/tokens.js +12 -12
  430. package/dist/transport/index.js +3 -1
  431. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  432. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  433. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  434. package/dist/transport/node/WaNodeTransport.js +13 -0
  435. package/dist/transport/node/builders/abprops.js +1 -1
  436. package/dist/transport/node/builders/account-sync.js +7 -16
  437. package/dist/transport/node/builders/bot.js +43 -0
  438. package/dist/transport/node/builders/business.js +31 -31
  439. package/dist/transport/node/builders/chatstate.js +31 -0
  440. package/dist/transport/node/builders/community.js +59 -0
  441. package/dist/transport/node/builders/device.js +1 -1
  442. package/dist/transport/node/builders/email.js +6 -5
  443. package/dist/transport/node/builders/global.js +2 -2
  444. package/dist/transport/node/builders/group.js +121 -3
  445. package/dist/transport/node/builders/media.js +1 -1
  446. package/dist/transport/node/builders/message.js +84 -49
  447. package/dist/transport/node/builders/newsletter.js +183 -0
  448. package/dist/transport/node/builders/passive.js +10 -0
  449. package/dist/transport/node/builders/prekeys.js +3 -3
  450. package/dist/transport/node/builders/presence.js +28 -1
  451. package/dist/transport/node/builders/privacy-token.js +1 -1
  452. package/dist/transport/node/builders/privacy.js +5 -5
  453. package/dist/transport/node/builders/profile.js +30 -7
  454. package/dist/transport/node/builders/tos.js +63 -0
  455. package/dist/transport/node/builders/usync.js +52 -1
  456. package/dist/transport/node/helpers.js +3 -2
  457. package/dist/transport/node/mex/argo-decoder.js +2 -2
  458. package/dist/transport/node/mex/client.js +23 -0
  459. package/dist/transport/node/query.js +17 -0
  460. package/dist/transport/node/usync.js +13 -0
  461. package/dist/transport/noise/WaClientPayload.js +9 -9
  462. package/dist/transport/noise/WaMobileClientPayload.js +6 -1
  463. package/dist/transport/noise/WaNoiseCert.js +7 -2
  464. package/dist/transport/noise/WaNoiseHandshake.js +26 -24
  465. package/dist/transport/noise/WaNoiseSession.js +41 -61
  466. package/dist/transport/noise/WaNoiseSocket.js +19 -13
  467. package/dist/transport/noise/constants.js +1 -2
  468. package/dist/transport/proxy.js +5 -0
  469. package/dist/transport/stream/parse.js +3 -7
  470. package/dist/transport/wa-web-version-fetcher.js +94 -0
  471. package/dist/types/appstate/constants.d.ts +1 -1
  472. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  473. package/dist/types/appstate/index.d.ts +5 -5
  474. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  475. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  476. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  477. package/dist/types/appstate/types.d.ts +1 -1
  478. package/dist/types/appstate/utils.d.ts +18 -2
  479. package/dist/types/appstate-spec.d.ts +24 -0
  480. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  481. package/dist/types/auth/credentials-flow.d.ts +4 -3
  482. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  483. package/dist/types/auth/types.d.ts +49 -2
  484. package/dist/types/client/WaClient.d.ts +178 -71
  485. package/dist/types/client/WaClientFactory.d.ts +30 -5
  486. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  487. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  488. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  489. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  490. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  491. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  492. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  493. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  494. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  495. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  496. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  497. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +55 -32
  498. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  499. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  500. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  501. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  502. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  503. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  504. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  505. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  506. package/dist/types/client/events/abprops.d.ts +2 -1
  507. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  508. package/dist/types/client/events/business.d.ts +10 -0
  509. package/dist/types/client/events/call.d.ts +31 -0
  510. package/dist/types/client/events/chatstate.d.ts +9 -0
  511. package/dist/types/client/events/devices.d.ts +5 -4
  512. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  513. package/dist/types/client/events/group.d.ts +2 -1
  514. package/dist/types/client/events/identity.d.ts +2 -1
  515. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  516. package/dist/types/client/events/mex-notification.d.ts +6 -0
  517. package/dist/types/client/events/picture.d.ts +8 -0
  518. package/dist/types/client/events/presence.d.ts +28 -0
  519. package/dist/types/client/events/receipt.d.ts +14 -0
  520. package/dist/types/client/events/registration.d.ts +4 -3
  521. package/dist/types/client/index.d.ts +1 -1
  522. package/dist/types/client/media.d.ts +35 -1
  523. package/dist/types/client/messaging/fanout.d.ts +2 -2
  524. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  525. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  526. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  527. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  528. package/dist/types/client/messaging/messages.d.ts +28 -0
  529. package/dist/types/client/newsletter/admin.d.ts +71 -0
  530. package/dist/types/client/newsletter/content.d.ts +42 -0
  531. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  532. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  533. package/dist/types/client/newsletter/mex.d.ts +14 -0
  534. package/dist/types/client/newsletter/parse.d.ts +19 -0
  535. package/dist/types/client/newsletter/types.d.ts +190 -0
  536. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  537. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  538. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  539. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  540. package/dist/types/client/types.d.ts +844 -72
  541. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  542. package/dist/types/crypto/core/index.d.ts +2 -2
  543. package/dist/types/crypto/core/keys.d.ts +0 -4
  544. package/dist/types/crypto/core/nonce.d.ts +4 -5
  545. package/dist/types/crypto/core/primitives.d.ts +31 -20
  546. package/dist/types/crypto/core/random.d.ts +6 -0
  547. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  548. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  549. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  550. package/dist/types/crypto/curves/constants.d.ts +4 -3
  551. package/dist/types/crypto/curves/types.d.ts +0 -5
  552. package/dist/types/crypto/math/constants.d.ts +0 -1
  553. package/dist/types/crypto/math/mod.d.ts +0 -1
  554. package/dist/types/index.d.ts +34 -8
  555. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  556. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  557. package/dist/types/infra/log/types.d.ts +6 -0
  558. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  559. package/dist/types/media/constants.d.ts +7 -2
  560. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  561. package/dist/types/media/index.d.ts +7 -5
  562. package/dist/types/media/processor.d.ts +27 -5
  563. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  564. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  565. package/dist/types/media/transfer/conn.d.ts +7 -0
  566. package/dist/types/media/types.d.ts +1 -2
  567. package/dist/types/message/WaMessageClient.d.ts +14 -0
  568. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  569. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  570. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  571. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  572. package/dist/types/message/context-info.d.ts +66 -0
  573. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  574. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  575. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  576. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  577. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  578. package/dist/types/message/encode/content.d.ts +43 -0
  579. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  580. package/dist/types/message/encode/media-payload.d.ts +12 -0
  581. package/dist/types/message/index.d.ts +2 -2
  582. package/dist/types/message/kinds/bot.d.ts +31 -0
  583. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  584. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  585. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  586. package/dist/types/message/primitives/incoming.d.ts +21 -0
  587. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  588. package/dist/types/message/types.d.ts +209 -11
  589. package/dist/types/mex.d.ts +2 -0
  590. package/dist/types/proto.d.ts +2 -2
  591. package/dist/types/protocol/abprops.d.ts +9 -0
  592. package/dist/types/protocol/appstate.d.ts +4 -49
  593. package/dist/types/protocol/auth.d.ts +2 -2
  594. package/dist/types/protocol/bot.d.ts +45 -0
  595. package/dist/types/protocol/browser.d.ts +8 -0
  596. package/dist/types/protocol/business.d.ts +21 -0
  597. package/dist/types/protocol/call.d.ts +44 -0
  598. package/dist/types/protocol/constants.d.ts +16 -3
  599. package/dist/types/protocol/defaults.d.ts +3 -0
  600. package/dist/types/protocol/group.d.ts +1 -1
  601. package/dist/types/protocol/index.d.ts +2 -1
  602. package/dist/types/protocol/jid.d.ts +78 -0
  603. package/dist/types/protocol/media.d.ts +21 -13
  604. package/dist/types/protocol/message.d.ts +4 -0
  605. package/dist/types/protocol/newsletter.d.ts +65 -0
  606. package/dist/types/protocol/nodes.d.ts +20 -0
  607. package/dist/types/protocol/notification.d.ts +16 -0
  608. package/dist/types/protocol/presence.d.ts +16 -0
  609. package/dist/types/protocol/status.d.ts +7 -0
  610. package/dist/types/retry/codec.d.ts +5 -0
  611. package/dist/types/retry/index.d.ts +1 -1
  612. package/dist/types/retry/parse.d.ts +9 -0
  613. package/dist/types/retry/reason.d.ts +5 -0
  614. package/dist/types/retry/replay.d.ts +19 -5
  615. package/dist/types/retry/tracker.d.ts +10 -3
  616. package/dist/types/retry/types.d.ts +3 -8
  617. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  618. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  619. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  620. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  621. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  622. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  623. package/dist/types/signal/api/codec.d.ts +20 -0
  624. package/dist/types/signal/api/constants.d.ts +1 -1
  625. package/dist/types/signal/api/prekeys.d.ts +4 -0
  626. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  627. package/dist/types/signal/attestation/constants.d.ts +4 -0
  628. package/dist/types/signal/constants.d.ts +7 -4
  629. package/dist/types/signal/encoding.d.ts +6 -68
  630. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  631. package/dist/types/signal/group/SenderKeyManager.d.ts +18 -1
  632. package/dist/types/signal/group/encoding.d.ts +25 -0
  633. package/dist/types/signal/index.d.ts +4 -1
  634. package/dist/types/signal/registration/encoding.d.ts +30 -0
  635. package/dist/types/signal/registration/keygen.d.ts +10 -0
  636. package/dist/types/signal/registration/utils.d.ts +5 -0
  637. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  638. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  639. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  640. package/dist/types/signal/session/encoding.d.ts +28 -0
  641. package/dist/types/signal/session/resolver.d.ts +14 -0
  642. package/dist/types/signal/types.d.ts +1 -1
  643. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  644. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  645. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  646. package/dist/types/store/cache/session.cache.d.ts +23 -0
  647. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  648. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  649. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  650. package/dist/types/store/contracts/message.store.d.ts +0 -2
  651. package/dist/types/store/createStore.d.ts +54 -2
  652. package/dist/types/store/index.d.ts +17 -16
  653. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  654. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  655. package/dist/types/store/memory/auth.store.d.ts +18 -0
  656. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  657. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  658. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  659. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  661. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  662. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  663. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  664. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  665. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  666. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  667. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  668. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  669. package/dist/types/store/noop.store.d.ts +2 -2
  670. package/dist/types/store/types.d.ts +250 -6
  671. package/dist/types/transport/WaComms.d.ts +5 -0
  672. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  673. package/dist/types/transport/binary/constants.d.ts +8 -2
  674. package/dist/types/transport/binary/decoder.d.ts +5 -0
  675. package/dist/types/transport/binary/encoder.d.ts +5 -0
  676. package/dist/types/transport/binary/tokens.d.ts +6 -6
  677. package/dist/types/transport/index.d.ts +3 -1
  678. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  679. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  680. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  681. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  682. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  683. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  684. package/dist/types/transport/node/builders/business.d.ts +21 -4
  685. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  686. package/dist/types/transport/node/builders/community.d.ts +17 -0
  687. package/dist/types/transport/node/builders/group.d.ts +44 -2
  688. package/dist/types/transport/node/builders/message.d.ts +11 -6
  689. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  690. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  691. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  692. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  693. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  694. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  695. package/dist/types/transport/node/helpers.d.ts +1 -2
  696. package/dist/types/transport/node/mex/client.d.ts +12 -1
  697. package/dist/types/transport/node/query.d.ts +19 -1
  698. package/dist/types/transport/node/usync.d.ts +3 -0
  699. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +6 -1
  700. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  701. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  702. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  703. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  704. package/dist/types/transport/noise/constants.d.ts +4 -5
  705. package/dist/types/transport/noise/types.d.ts +1 -1
  706. package/dist/types/transport/proxy.d.ts +5 -0
  707. package/dist/types/transport/types.d.ts +14 -7
  708. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  709. package/dist/types/util/async.d.ts +4 -0
  710. package/dist/types/util/bytes.d.ts +36 -1
  711. package/dist/types/util/clock.d.ts +6 -0
  712. package/dist/types/util/coercion.d.ts +25 -0
  713. package/dist/types/util/collections.d.ts +8 -0
  714. package/dist/types/util/index.d.ts +2 -2
  715. package/dist/types/util/primitives.d.ts +11 -0
  716. package/dist/types/util/runtime.d.ts +5 -0
  717. package/dist/types/version-spec.d.ts +1 -0
  718. package/dist/util/async.js +4 -0
  719. package/dist/util/bytes.js +37 -2
  720. package/dist/util/clock.js +18 -0
  721. package/dist/util/coercion.js +48 -3
  722. package/dist/util/collections.js +12 -0
  723. package/dist/util/index.js +7 -1
  724. package/dist/util/primitives.js +20 -0
  725. package/dist/util/runtime.js +5 -0
  726. package/dist/version-spec.js +5 -0
  727. package/package.json +32 -8
  728. package/spec/appstate/index.d.ts +188 -0
  729. package/spec/appstate/index.js +850 -0
  730. package/spec/mex/index.d.ts +4172 -0
  731. package/spec/mex/index.js +261 -0
  732. package/spec/proto/index.d.ts +16305 -0
  733. package/spec/proto/index.js +1 -0
  734. package/spec/version/index.d.ts +4 -0
  735. package/spec/version/index.js +9 -0
  736. package/spec/version/version.json +3 -0
  737. package/dist/client/events/chat.js +0 -227
  738. package/dist/client/incoming.js +0 -306
  739. package/dist/client/mailbox.js +0 -66
  740. package/dist/client/messages.js +0 -305
  741. package/dist/esm/client/events/chat.js +0 -224
  742. package/dist/esm/client/incoming.js +0 -296
  743. package/dist/esm/client/mailbox.js +0 -63
  744. package/dist/esm/client/messages.js +0 -301
  745. package/dist/esm/media/WaMediaCrypto.js +0 -499
  746. package/dist/esm/message/phash.js +0 -47
  747. package/dist/esm/store/locks/participants.lock.js +0 -20
  748. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  749. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  750. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  751. package/dist/media/WaMediaCrypto.js +0 -503
  752. package/dist/message/phash.js +0 -50
  753. package/dist/store/locks/participants.lock.js +0 -23
  754. package/dist/store/providers/memory/contact.store.js +0 -32
  755. package/dist/store/providers/memory/device-list.store.js +0 -71
  756. package/dist/transport/node/mex/persist-ids.js +0 -13
  757. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  758. package/dist/types/client/events/chat.d.ts +0 -3
  759. package/dist/types/client/history-sync.d.ts +0 -20
  760. package/dist/types/client/messages.d.ts +0 -18
  761. package/dist/types/client/messaging/participants.d.ts +0 -13
  762. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  763. package/dist/types/media/conn.d.ts +0 -3
  764. package/dist/types/message/content.d.ts +0 -14
  765. package/dist/types/message/incoming.d.ts +0 -18
  766. package/dist/types/signal/crypto/constants.d.ts +0 -4
  767. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  768. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  769. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  770. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  771. package/proto/index.d.ts +0 -10903
  772. package/proto/index.js +0 -1
  773. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  774. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  775. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  776. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  777. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  778. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  779. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  780. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  781. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SenderKeyManager = void 0;
4
- const _crypto_1 = require("../../crypto/index.js");
4
+ const _crypto_1 = require("../../crypto");
5
5
  const StoreLock_1 = require("../../infra/perf/StoreLock");
6
- const _proto_1 = require("../../proto.js");
6
+ const _proto_1 = require("../../proto");
7
7
  const jid_1 = require("../../protocol/jid");
8
8
  const constants_1 = require("../api/constants");
9
9
  const constants_2 = require("../constants");
@@ -19,14 +19,19 @@ function extractAesCbcParams(seed) {
19
19
  keyBytes: seed.subarray(16, 48)
20
20
  };
21
21
  }
22
- async function aesCbcEncryptFromSeed(seed, plaintext) {
22
+ function aesCbcEncryptFromSeed(seed, plaintext) {
23
23
  const { keyBytes, iv } = extractAesCbcParams(seed);
24
- return (0, _crypto_1.aesCbcEncrypt)(await (0, _crypto_1.importAesCbcKey)(keyBytes), iv, plaintext);
24
+ return (0, _crypto_1.aesCbcEncrypt)(keyBytes, iv, plaintext);
25
25
  }
26
- async function aesCbcDecryptFromSeed(seed, ciphertext) {
26
+ function aesCbcDecryptFromSeed(seed, ciphertext) {
27
27
  const { keyBytes, iv } = extractAesCbcParams(seed);
28
- return (0, _crypto_1.aesCbcDecrypt)(await (0, _crypto_1.importAesCbcKey)(keyBytes), iv, ciphertext);
28
+ return (0, _crypto_1.aesCbcDecrypt)(keyBytes, iv, ciphertext);
29
29
  }
30
+ /**
31
+ * Implements the sender-key group encryption side of Signal: creates and
32
+ * rotates sender keys, encrypts/decrypts group messages, and tracks which
33
+ * participants have already received the distribution message.
34
+ */
30
35
  class SenderKeyManager {
31
36
  constructor(store, options) {
32
37
  this.senderLock = new StoreLock_1.StoreLock();
@@ -34,13 +39,17 @@ class SenderKeyManager {
34
39
  this.getFutureMessagesMax = options?.getFutureMessagesMax;
35
40
  this.skipSignatureVerification = options?.skipSignatureVerification === true;
36
41
  }
42
+ /**
43
+ * Produces the distribution message and ciphertext for `plaintext` sent by
44
+ * `sender` into `groupId`. Initializes a sender key when none exists yet.
45
+ */
37
46
  async prepareGroupEncryption(groupId, sender, plaintext) {
38
47
  return this.runWithSenderLock(groupId, sender, async () => {
39
48
  const senderKey = await this.ensureSenderKeyInternal(groupId, sender);
40
49
  if (!senderKey.signingPrivateKey) {
41
50
  throw new Error('sender private signing key is missing');
42
51
  }
43
- const derived = await (0, SenderKeyChain_1.deriveSenderKeyMsgKey)(senderKey.iteration, senderKey.chainKey);
52
+ const derived = (0, SenderKeyChain_1.deriveSenderKeyMsgKey)(senderKey.iteration, senderKey.chainKey);
44
53
  await this.store.upsertSenderKey({
45
54
  ...senderKey,
46
55
  chainKey: derived.nextChainKey,
@@ -56,7 +65,7 @@ class SenderKeyManager {
56
65
  groupId,
57
66
  axolotlSenderKeyDistributionMessage: (0, _crypto_1.prependVersion)(distributionProto, constants_2.SIGNAL_GROUP_VERSION)
58
67
  };
59
- const messagePayload = await aesCbcEncryptFromSeed(derived.messageKey.seed, plaintext);
68
+ const messagePayload = aesCbcEncryptFromSeed(derived.messageKey.seed, plaintext);
60
69
  const senderKeyMessage = _proto_1.proto.SenderKeyMessage.encode({
61
70
  id: senderKey.keyId,
62
71
  iteration: derived.messageKey.iteration,
@@ -87,6 +96,7 @@ class SenderKeyManager {
87
96
  };
88
97
  });
89
98
  }
99
+ /** Filters a participant list down to those who have not yet received the current sender key distribution. */
90
100
  async filterParticipantsNeedingDistribution(groupId, senderKeyId, participants) {
91
101
  if (participants.length === 0) {
92
102
  return [];
@@ -104,6 +114,7 @@ class SenderKeyManager {
104
114
  pendingParticipants.length = pendingCount;
105
115
  return pendingParticipants;
106
116
  }
117
+ /** Records that the sender key was successfully delivered to the given participants. */
107
118
  async markSenderKeyDistributed(groupId, senderKeyId, participants) {
108
119
  if (participants.length === 0) {
109
120
  return;
@@ -120,6 +131,11 @@ class SenderKeyManager {
120
131
  }
121
132
  await this.store.upsertSenderKeyDistributions(distributions);
122
133
  }
134
+ /**
135
+ * Verifies (per `skipSignatureVerification`) and stores an incoming sender
136
+ * key distribution so subsequent group ciphertexts from `sender` can be
137
+ * decrypted.
138
+ */
123
139
  async processSenderKeyDistributionPayload(groupId, sender, payload) {
124
140
  return this.runWithSenderLock(groupId, sender, async () => {
125
141
  if (groupId.length === 0) {
@@ -147,6 +163,7 @@ class SenderKeyManager {
147
163
  return record;
148
164
  });
149
165
  }
166
+ /** Decrypts an incoming sender-key group ciphertext into plaintext. */
150
167
  async decryptGroupMessage(payload) {
151
168
  return this.runWithSenderLock(payload.groupId, payload.sender, async () => {
152
169
  const parsed = (0, SenderKeyCodec_1.parseSenderKeyMessage)(payload.ciphertext);
@@ -177,7 +194,7 @@ class SenderKeyManager {
177
194
  }
178
195
  const selected = await (0, SenderKeyChain_1.selectMessageKey)(senderKey, parsed.iteration, this.getFutureMessagesMax?.());
179
196
  // Keep decrypt + persist ordered: failed decrypt must not advance sender-key state.
180
- const plaintext = await aesCbcDecryptFromSeed(selected.messageKey.seed, parsed.ciphertext);
197
+ const plaintext = aesCbcDecryptFromSeed(selected.messageKey.seed, parsed.ciphertext);
181
198
  await this.store.upsertSenderKey(selected.updatedRecord);
182
199
  return plaintext;
183
200
  });
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeSenderKeyRecord = encodeSenderKeyRecord;
4
+ exports.decodeSenderKeyRecord = decodeSenderKeyRecord;
5
+ exports.decodeSenderKeyDistributionRow = decodeSenderKeyDistributionRow;
6
+ const _proto_1 = require("../../proto");
7
+ const coercion_1 = require("../../util/coercion");
8
+ /** Serializes a {@link SenderKeyRecord} into the Signal `SenderKeyRecordStructure` protobuf. */
9
+ function encodeSenderKeyRecord(record) {
10
+ return _proto_1.proto.SenderKeyRecordStructure.encode({
11
+ senderKeyStates: [
12
+ {
13
+ senderKeyId: record.keyId,
14
+ senderChainKey: {
15
+ iteration: record.iteration,
16
+ seed: record.chainKey
17
+ },
18
+ senderSigningKey: {
19
+ public: record.signingPublicKey,
20
+ private: record.signingPrivateKey
21
+ },
22
+ senderMessageKeys: (() => {
23
+ const src = record.unusedMessageKeys ?? [];
24
+ const arr = new Array(src.length);
25
+ for (let i = 0; i < src.length; i += 1) {
26
+ const messageKey = src[i];
27
+ arr[i] = {
28
+ iteration: messageKey.iteration,
29
+ seed: messageKey.seed
30
+ };
31
+ }
32
+ return arr;
33
+ })()
34
+ }
35
+ ]
36
+ }).finish();
37
+ }
38
+ function decodeSenderKeyState(state, field) {
39
+ if (!state.senderChainKey) {
40
+ throw new Error(`missing ${field}.senderChainKey`);
41
+ }
42
+ if (!state.senderSigningKey) {
43
+ throw new Error(`missing ${field}.senderSigningKey`);
44
+ }
45
+ return {
46
+ keyId: (0, coercion_1.asNumber)(state.senderKeyId, `${field}.senderKeyId`),
47
+ iteration: (0, coercion_1.asNumber)(state.senderChainKey.iteration, `${field}.senderChainKey.iteration`),
48
+ chainKey: (0, coercion_1.asBytes)(state.senderChainKey.seed, `${field}.senderChainKey.seed`),
49
+ signingPublicKey: (0, coercion_1.asBytes)(state.senderSigningKey.public, `${field}.senderSigningKey.public`),
50
+ signingPrivateKey: state.senderSigningKey.private !== null && state.senderSigningKey.private !== undefined
51
+ ? (0, coercion_1.asBytes)(state.senderSigningKey.private, `${field}.senderSigningKey.private`)
52
+ : undefined,
53
+ unusedMessageKeys: (() => {
54
+ const src = state.senderMessageKeys ?? [];
55
+ const arr = new Array(src.length);
56
+ for (let i = 0; i < src.length; i += 1) {
57
+ const messageKey = src[i];
58
+ arr[i] = {
59
+ iteration: (0, coercion_1.asNumber)(messageKey.iteration, `${field}.senderMessageKeys[${i}].iteration`),
60
+ seed: (0, coercion_1.asBytes)(messageKey.seed, `${field}.senderMessageKeys[${i}].seed`)
61
+ };
62
+ }
63
+ return arr;
64
+ })()
65
+ };
66
+ }
67
+ /**
68
+ * Decodes a stored sender-key blob into a {@link SenderKeyRecord}.
69
+ * `groupId`/`sender` are re-attached from the row key (not in the protobuf).
70
+ */
71
+ function decodeSenderKeyRecord(raw, groupId, sender) {
72
+ const decoded = _proto_1.proto.SenderKeyRecordStructure.decode((0, coercion_1.asBytes)(raw, 'sender_keys.record'));
73
+ const state = decoded.senderKeyStates?.[0];
74
+ if (!state) {
75
+ throw new Error('missing sender_keys.record.senderKeyStates[0]');
76
+ }
77
+ const parsed = decodeSenderKeyState(state, 'sender_keys.record.senderKeyStates[0]');
78
+ return {
79
+ groupId,
80
+ sender,
81
+ keyId: parsed.keyId,
82
+ iteration: parsed.iteration,
83
+ chainKey: parsed.chainKey,
84
+ signingPublicKey: parsed.signingPublicKey,
85
+ signingPrivateKey: parsed.signingPrivateKey,
86
+ unusedMessageKeys: parsed.unusedMessageKeys
87
+ };
88
+ }
89
+ /** Decodes a sender-key-distribution SQL row into a {@link SenderKeyDistributionRecord}. */
90
+ function decodeSenderKeyDistributionRow(row) {
91
+ return {
92
+ groupId: (0, coercion_1.asString)(row.group_id, 'sender_key_distribution.group_id'),
93
+ sender: {
94
+ user: (0, coercion_1.asString)(row.sender_user, 'sender_key_distribution.sender_user'),
95
+ server: (0, coercion_1.asString)(row.sender_server, 'sender_key_distribution.sender_server'),
96
+ device: (0, coercion_1.asNumber)(row.sender_device, 'sender_key_distribution.sender_device')
97
+ },
98
+ keyId: (0, coercion_1.asNumber)(row.key_id, 'sender_key_distribution.key_id'),
99
+ timestampMs: (0, coercion_1.asNumber)(row.timestamp_ms, 'sender_key_distribution.timestamp_ms')
100
+ };
101
+ }
@@ -1,18 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSignalSessionResolver = exports.SignalProtocol = exports.createAndStoreInitialKeys = exports.SenderKeyManager = exports.SignalSessionSyncApi = exports.SignalRotateKeyApi = exports.SignalMissingPreKeysSyncApi = exports.SignalIdentitySyncApi = exports.SignalDeviceSyncApi = exports.SignalDigestSyncApi = exports.parsePreKeyUploadFailure = exports.buildPreKeyUploadIq = exports.generateSignedPreKey = exports.generateRegistrationInfo = exports.generateRegistrationId = exports.generatePreKeyPair = exports.toSignalAddressParts = exports.encodeSignalSessionRecord = exports.encodeSenderKeyRecord = exports.decodeStoreCount = exports.decodeSenderKeyRecord = exports.decodeSenderKeyDistributionRow = exports.decodeSignalSignedPreKeyRow = exports.decodeSignalSessionRecord = exports.decodeSignalRemoteIdentity = exports.decodeSignalRegistrationRow = exports.decodeSignalPreKeyRow = void 0;
3
+ exports.createSignalSessionResolver = exports.SignalProtocol = exports.createAndStoreInitialKeys = exports.SenderKeyManager = exports.SignalSessionSyncApi = exports.SignalRotateKeyApi = exports.SignalMissingPreKeysSyncApi = exports.SignalIdentitySyncApi = exports.SignalDeviceSyncApi = exports.SignalDigestSyncApi = exports.parsePreKeyUploadFailure = exports.buildPreKeyUploadIq = exports.generateSignedPreKey = exports.generateRegistrationInfo = exports.generateRegistrationId = exports.generatePreKeyPair = exports.encodeSenderKeyRecord = exports.decodeSenderKeyRecord = exports.decodeSenderKeyDistributionRow = exports.decodeSignalSignedPreKeyRow = exports.decodeSignalRegistrationRow = exports.decodeSignalPreKeyRow = exports.encodeSignalSessionRecord = exports.decodeSignalSessionRecord = exports.decodeSignalRemoteIdentity = exports.toSignalAddressParts = exports.decodeStoreCount = void 0;
4
4
  var encoding_1 = require("./encoding");
5
- Object.defineProperty(exports, "decodeSignalPreKeyRow", { enumerable: true, get: function () { return encoding_1.decodeSignalPreKeyRow; } });
6
- Object.defineProperty(exports, "decodeSignalRegistrationRow", { enumerable: true, get: function () { return encoding_1.decodeSignalRegistrationRow; } });
7
- Object.defineProperty(exports, "decodeSignalRemoteIdentity", { enumerable: true, get: function () { return encoding_1.decodeSignalRemoteIdentity; } });
8
- Object.defineProperty(exports, "decodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_1.decodeSignalSessionRecord; } });
9
- Object.defineProperty(exports, "decodeSignalSignedPreKeyRow", { enumerable: true, get: function () { return encoding_1.decodeSignalSignedPreKeyRow; } });
10
- Object.defineProperty(exports, "decodeSenderKeyDistributionRow", { enumerable: true, get: function () { return encoding_1.decodeSenderKeyDistributionRow; } });
11
- Object.defineProperty(exports, "decodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_1.decodeSenderKeyRecord; } });
12
5
  Object.defineProperty(exports, "decodeStoreCount", { enumerable: true, get: function () { return encoding_1.decodeStoreCount; } });
13
- Object.defineProperty(exports, "encodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_1.encodeSenderKeyRecord; } });
14
- Object.defineProperty(exports, "encodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_1.encodeSignalSessionRecord; } });
15
6
  Object.defineProperty(exports, "toSignalAddressParts", { enumerable: true, get: function () { return encoding_1.toSignalAddressParts; } });
7
+ var encoding_2 = require("./session/encoding");
8
+ Object.defineProperty(exports, "decodeSignalRemoteIdentity", { enumerable: true, get: function () { return encoding_2.decodeSignalRemoteIdentity; } });
9
+ Object.defineProperty(exports, "decodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_2.decodeSignalSessionRecord; } });
10
+ Object.defineProperty(exports, "encodeSignalSessionRecord", { enumerable: true, get: function () { return encoding_2.encodeSignalSessionRecord; } });
11
+ var encoding_3 = require("./registration/encoding");
12
+ Object.defineProperty(exports, "decodeSignalPreKeyRow", { enumerable: true, get: function () { return encoding_3.decodeSignalPreKeyRow; } });
13
+ Object.defineProperty(exports, "decodeSignalRegistrationRow", { enumerable: true, get: function () { return encoding_3.decodeSignalRegistrationRow; } });
14
+ Object.defineProperty(exports, "decodeSignalSignedPreKeyRow", { enumerable: true, get: function () { return encoding_3.decodeSignalSignedPreKeyRow; } });
15
+ var encoding_4 = require("./group/encoding");
16
+ Object.defineProperty(exports, "decodeSenderKeyDistributionRow", { enumerable: true, get: function () { return encoding_4.decodeSenderKeyDistributionRow; } });
17
+ Object.defineProperty(exports, "decodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_4.decodeSenderKeyRecord; } });
18
+ Object.defineProperty(exports, "encodeSenderKeyRecord", { enumerable: true, get: function () { return encoding_4.encodeSenderKeyRecord; } });
16
19
  var keygen_1 = require("./registration/keygen");
17
20
  Object.defineProperty(exports, "generatePreKeyPair", { enumerable: true, get: function () { return keygen_1.generatePreKeyPair; } });
18
21
  Object.defineProperty(exports, "generateRegistrationId", { enumerable: true, get: function () { return keygen_1.generateRegistrationId; } });
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decodeSignalRegistrationRow = decodeSignalRegistrationRow;
4
+ exports.decodeSignalPreKeyRow = decodeSignalPreKeyRow;
5
+ exports.decodeSignalSignedPreKeyRow = decodeSignalSignedPreKeyRow;
6
+ const coercion_1 = require("../../util/coercion");
7
+ /** Decodes a stored signal-registration SQL row into a {@link RegistrationInfo}. */
8
+ function decodeSignalRegistrationRow(row) {
9
+ return {
10
+ registrationId: (0, coercion_1.asNumber)(row.registration_id, 'signal_registration.registration_id'),
11
+ identityKeyPair: {
12
+ pubKey: (0, coercion_1.asBytes)(row.identity_pub_key, 'signal_registration.identity_pub_key'),
13
+ privKey: (0, coercion_1.asBytes)(row.identity_priv_key, 'signal_registration.identity_priv_key')
14
+ }
15
+ };
16
+ }
17
+ /** Decodes a one-time prekey SQL row into a {@link PreKeyRecord}. */
18
+ function decodeSignalPreKeyRow(row) {
19
+ return {
20
+ keyId: (0, coercion_1.asNumber)(row.key_id, 'signal_prekey.key_id'),
21
+ keyPair: {
22
+ pubKey: (0, coercion_1.asBytes)(row.pub_key, 'signal_prekey.pub_key'),
23
+ privKey: (0, coercion_1.asBytes)(row.priv_key, 'signal_prekey.priv_key')
24
+ },
25
+ uploaded: (0, coercion_1.toBoolOrUndef)(row.uploaded)
26
+ };
27
+ }
28
+ /** Decodes a signed-prekey SQL row into a {@link SignedPreKeyRecord}. */
29
+ function decodeSignalSignedPreKeyRow(row) {
30
+ return {
31
+ keyId: (0, coercion_1.asNumber)(row.key_id, 'signal_signed_prekey.key_id'),
32
+ keyPair: {
33
+ pubKey: (0, coercion_1.asBytes)(row.pub_key, 'signal_signed_prekey.pub_key'),
34
+ privKey: (0, coercion_1.asBytes)(row.priv_key, 'signal_signed_prekey.priv_key')
35
+ },
36
+ signature: (0, coercion_1.asBytes)(row.signature, 'signal_signed_prekey.signature'),
37
+ uploaded: (0, coercion_1.toBoolOrUndef)(row.uploaded)
38
+ };
39
+ }
@@ -4,9 +4,13 @@ exports.generateRegistrationInfo = generateRegistrationInfo;
4
4
  exports.generatePreKeyPair = generatePreKeyPair;
5
5
  exports.generateSignedPreKey = generateSignedPreKey;
6
6
  exports.generateRegistrationId = generateRegistrationId;
7
- const _crypto_1 = require("../../crypto/index.js");
7
+ const _crypto_1 = require("../../crypto");
8
8
  const keys_1 = require("../../crypto/core/keys");
9
9
  const X25519_1 = require("../../crypto/curves/X25519");
10
+ /**
11
+ * Generates the per-device Signal registration info – a random registration id
12
+ * plus a fresh identity X25519 key pair.
13
+ */
10
14
  async function generateRegistrationInfo() {
11
15
  const [registrationId, identityKeyPair] = await Promise.all([
12
16
  generateRegistrationId(),
@@ -17,6 +21,7 @@ async function generateRegistrationInfo() {
17
21
  identityKeyPair
18
22
  };
19
23
  }
24
+ /** Generates a fresh one-time prekey record with the given `keyId`. */
20
25
  async function generatePreKeyPair(keyId) {
21
26
  return {
22
27
  keyId,
@@ -24,6 +29,10 @@ async function generatePreKeyPair(keyId) {
24
29
  uploaded: false
25
30
  };
26
31
  }
32
+ /**
33
+ * Generates a signed prekey: a fresh X25519 keypair plus an XEdDSA signature
34
+ * over its serialized public key, signed by `signingPrivateKey` (identity key).
35
+ */
27
36
  async function generateSignedPreKey(keyId, signingPrivateKey) {
28
37
  const keyPair = await X25519_1.X25519.generateKeyPair();
29
38
  const serializedPubKey = (0, keys_1.toSerializedPubKey)(keyPair.pubKey);
@@ -35,6 +44,7 @@ async function generateSignedPreKey(keyId, signingPrivateKey) {
35
44
  uploaded: false
36
45
  };
37
46
  }
47
+ /** Generates a Signal registration id in the valid `[1, 16380]` range. */
38
48
  async function generateRegistrationId() {
39
49
  return await (0, _crypto_1.randomIntAsync)(1, 16381);
40
50
  }
@@ -2,6 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createAndStoreInitialKeys = createAndStoreInitialKeys;
4
4
  const keygen_1 = require("../registration/keygen");
5
+ /**
6
+ * Bootstraps a fresh Signal identity: generates registration info, the first
7
+ * signed prekey, and the first one-time prekey, then persists them in order
8
+ * so a partial commit can never split bootstrap state.
9
+ */
5
10
  async function createAndStoreInitialKeys(store, preKeyStore) {
6
11
  const [registrationInfo, firstPreKey] = await Promise.all([
7
12
  (0, keygen_1.generateRegistrationInfo)(),
@@ -11,7 +16,9 @@ async function createAndStoreInitialKeys(store, preKeyStore) {
11
16
  // Keep writes ordered so partial commit failures don't leave split registration bootstrap state.
12
17
  await store.setRegistrationInfo(registrationInfo);
13
18
  await store.setSignedPreKey(signedPreKey);
14
- await preKeyStore.getOrGenSinglePreKey(async () => firstPreKey);
19
+ // putPreKey (idempotent), not getOrGenSinglePreKey: a fixed-keyId generator
20
+ // collides with a stale keyId 1 and would spin forever inside getOrGen*.
21
+ await preKeyStore.putPreKey(firstPreKey);
15
22
  return {
16
23
  registrationInfo,
17
24
  signedPreKey,
@@ -1,30 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SignalProtocol = void 0;
4
- const _crypto_1 = require("../../crypto/index.js");
4
+ const _crypto_1 = require("../../crypto");
5
5
  const ConsoleLogger_1 = require("../../infra/log/ConsoleLogger");
6
6
  const StoreLock_1 = require("../../infra/perf/StoreLock");
7
+ const jid_1 = require("../../protocol/jid");
7
8
  const constants_1 = require("../constants");
8
- const encoding_1 = require("../encoding");
9
+ const encoding_1 = require("../session/encoding");
9
10
  const SignalRatchet_1 = require("../session/SignalRatchet");
10
11
  const SignalSerializer_1 = require("../session/SignalSerializer");
11
12
  const SignalSession_1 = require("../session/SignalSession");
12
13
  const bytes_1 = require("../../util/bytes");
13
- function signalAddressMapKey(address) {
14
- return `${address.user}\u0001${address.server ?? ''}\u0001${address.device}`;
15
- }
16
14
  function signalAddressLockKey(address) {
17
- return `signal:${signalAddressMapKey(address)}`;
15
+ return `signal:${(0, jid_1.signalAddressKey)(address)}`;
18
16
  }
17
+ /**
18
+ * High-level Signal protocol session orchestrator: establishes outgoing
19
+ * sessions from prekey bundles, encrypts/decrypts ratchet messages, and owns
20
+ * the per-address session mutation lock.
21
+ */
19
22
  class SignalProtocol {
20
23
  constructor(stores, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
21
24
  this.stores = stores;
22
25
  this.logger = logger;
23
26
  this.sessionMutationLock = new StoreLock_1.StoreLock();
24
27
  }
28
+ /**
29
+ * Builds an outgoing Signal session against a remote prekey bundle. Set
30
+ * `options.reuseExisting` to skip the handshake when a session already
31
+ * exists for the same remote identity. Set `options.knownAbsent` only
32
+ * when the caller already proved (within the same logical step) that no
33
+ * session exists; it skips the in-lock recheck and forces a new handshake.
34
+ */
25
35
  async establishOutgoingSession(address, remoteBundle, options = {}) {
26
36
  return this.runWithAddressLock(address, async () => {
27
- if (options.reuseExisting) {
37
+ if (options.reuseExisting && !options.knownAbsent) {
28
38
  const existing = await this.stores.session.getSession(address);
29
39
  if (existing) {
30
40
  const remoteIdentity = (0, _crypto_1.toSerializedPubKey)(remoteBundle.identity);
@@ -45,12 +55,100 @@ class SignalProtocol {
45
55
  return session;
46
56
  });
47
57
  }
58
+ /**
59
+ * Compute an outgoing session under the per-address lock without
60
+ * persisting. Caller batches results and persists via
61
+ * {@link persistOutgoingSessionsBatch} to collapse N `setRemoteIdentity`
62
+ * + `setSession` round-trips into one bulk write per store.
63
+ */
64
+ async prepareOutgoingSession(address, remoteBundle, options = {}) {
65
+ return this.runWithAddressLock(address, async () => {
66
+ if (options.reuseExisting && !options.knownAbsent) {
67
+ const existing = await this.stores.session.getSession(address);
68
+ if (existing) {
69
+ const remoteIdentity = (0, _crypto_1.toSerializedPubKey)(remoteBundle.identity);
70
+ if (!(0, bytes_1.uint8Equal)(existing.remote.pubKey, remoteIdentity)) {
71
+ throw new Error('identity mismatch');
72
+ }
73
+ return {
74
+ session: existing,
75
+ remoteIdentity: existing.remote.pubKey,
76
+ reusedExisting: true
77
+ };
78
+ }
79
+ }
80
+ const [local, localOneTimeBase] = await Promise.all([
81
+ (0, SignalSession_1.requireLocalIdentity)(this.stores.signal),
82
+ (0, SignalSession_1.generateSerializedKeyPair)()
83
+ ]);
84
+ const session = await (0, SignalSession_1.initiateSessionOutgoing)(local, remoteBundle, localOneTimeBase);
85
+ return {
86
+ session,
87
+ remoteIdentity: session.remote.pubKey,
88
+ reusedExisting: false
89
+ };
90
+ });
91
+ }
92
+ /**
93
+ * Persist prepared outgoing sessions while holding every per-address
94
+ * lock (same discipline as {@link encryptMessagesBatch}). Re-reads
95
+ * sessions inside the lock; defers to a concurrent writer's session
96
+ * when identities agree to avoid clobbering a fresher ratchet advance,
97
+ * and reports identity conflicts via `skipped`.
98
+ */
99
+ async persistOutgoingSessionsBatch(entries) {
100
+ if (entries.length === 0)
101
+ return { resolved: [], skipped: [] };
102
+ const lockKeys = new Array(entries.length);
103
+ for (let i = 0; i < entries.length; i += 1) {
104
+ lockKeys[i] = signalAddressLockKey(entries[i].address);
105
+ }
106
+ return this.sessionMutationLock.runMany(lockKeys, async () => {
107
+ const addresses = entries.map((e) => e.address);
108
+ const existingSessions = await this.stores.session.getSessionsBatch(addresses);
109
+ const identityUpdates = [];
110
+ const sessionUpdates = [];
111
+ const resolved = [];
112
+ const skipped = [];
113
+ for (let i = 0; i < entries.length; i += 1) {
114
+ const entry = entries[i];
115
+ const existing = existingSessions[i];
116
+ if (existing) {
117
+ if ((0, bytes_1.uint8Equal)(existing.remote.pubKey, entry.remoteIdentity)) {
118
+ resolved.push({ address: entry.address, session: existing });
119
+ continue;
120
+ }
121
+ skipped.push({ address: entry.address, reason: 'identity-mismatch' });
122
+ continue;
123
+ }
124
+ identityUpdates.push({
125
+ address: entry.address,
126
+ identityKey: entry.remoteIdentity
127
+ });
128
+ sessionUpdates.push({ address: entry.address, session: entry.session });
129
+ resolved.push({ address: entry.address, session: entry.session });
130
+ }
131
+ if (identityUpdates.length > 0) {
132
+ await this.stores.identity.setRemoteIdentities(identityUpdates);
133
+ }
134
+ if (sessionUpdates.length > 0) {
135
+ await this.stores.session.setSessionsBatch(sessionUpdates);
136
+ }
137
+ return { resolved, skipped };
138
+ });
139
+ }
140
+ /**
141
+ * Encrypts `plaintext` for `address`. Returns `pkmsg` when this is the
142
+ * first message of the session, `msg` otherwise. `expectedIdentity`
143
+ * enforces identity continuity.
144
+ */
48
145
  async encryptMessage(address, plaintext, expectedIdentity) {
49
146
  const [encrypted] = await this.encryptMessagesBatch([
50
147
  { address, plaintext, expectedIdentity }
51
148
  ]);
52
149
  return encrypted;
53
150
  }
151
+ /** Batch variant of {@link encryptMessage} that shares per-address locks. */
54
152
  async encryptMessagesBatch(requests, prefetchedSessions) {
55
153
  if (requests.length === 0) {
56
154
  return [];
@@ -64,7 +162,7 @@ class SignalProtocol {
64
162
  if (prefetchedSessions && prefetchedSessions.length > 0) {
65
163
  for (let index = 0; index < prefetchedSessions.length; index += 1) {
66
164
  const entry = prefetchedSessions[index];
67
- prefetchedByAddress.set(signalAddressMapKey(entry.address), entry.session);
165
+ prefetchedByAddress.set((0, jid_1.signalAddressKey)(entry.address), entry.session);
68
166
  }
69
167
  }
70
168
  const uniqueAddressKeys = new Array(requests.length);
@@ -72,7 +170,7 @@ class SignalProtocol {
72
170
  let uniqueAddressCount = 0;
73
171
  for (let index = 0; index < requests.length; index += 1) {
74
172
  const address = requests[index].address;
75
- const addressKey = signalAddressMapKey(address);
173
+ const addressKey = (0, jid_1.signalAddressKey)(address);
76
174
  let isDuplicate = false;
77
175
  for (let dedupIndex = 0; dedupIndex < uniqueAddressCount; dedupIndex += 1) {
78
176
  if (uniqueAddressKeys[dedupIndex] === addressKey) {
@@ -109,7 +207,7 @@ class SignalProtocol {
109
207
  for (let index = 0; index < requests.length; index += 1) {
110
208
  const request = requests[index];
111
209
  const address = request.address;
112
- const addressKey = signalAddressMapKey(address);
210
+ const addressKey = (0, jid_1.signalAddressKey)(address);
113
211
  const session = latestSessionByAddress.get(addressKey);
114
212
  if (!session) {
115
213
  throw new Error('signal session not found');
@@ -155,6 +253,10 @@ class SignalProtocol {
155
253
  return results;
156
254
  });
157
255
  }
256
+ /**
257
+ * Decrypts a Signal message (`msg` or `pkmsg`) from `address`. For
258
+ * `pkmsg`, instantiates the session from the embedded bundle when needed.
259
+ */
158
260
  async decryptMessage(address, envelope) {
159
261
  return this.runWithAddressLock(address, async () => {
160
262
  const currentSession = await this.stores.session.getSession(address);
@@ -214,7 +316,7 @@ class SignalProtocol {
214
316
  ? {
215
317
  ...incoming,
216
318
  prevSessions: [
217
- (0, encoding_1.encodeSignalSessionSnapshot)((0, SignalSession_1.detachSession)(currentSession)),
319
+ (0, encoding_1.encodeSignalSessionSnapshot)(currentSession),
218
320
  ...currentSession.prevSessions.slice(0, constants_1.MAX_PREV_SESSIONS - 1)
219
321
  ]
220
322
  }