zapo-js 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,4 +1,9 @@
1
1
  import { generatePreKeyPair, generateRegistrationInfo, generateSignedPreKey } from '../registration/keygen.js';
2
+ /**
3
+ * Bootstraps a fresh Signal identity: generates registration info, the first
4
+ * signed prekey, and the first one-time prekey, then persists them in order
5
+ * so a partial commit can never split bootstrap state.
6
+ */
2
7
  export async function createAndStoreInitialKeys(store, preKeyStore) {
3
8
  const [registrationInfo, firstPreKey] = await Promise.all([
4
9
  generateRegistrationInfo(),
@@ -8,6 +13,7 @@ export async function createAndStoreInitialKeys(store, preKeyStore) {
8
13
  // Keep writes ordered so partial commit failures don't leave split registration bootstrap state.
9
14
  await store.setRegistrationInfo(registrationInfo);
10
15
  await store.setSignedPreKey(signedPreKey);
16
+ // eslint-disable-next-line @typescript-eslint/require-await
11
17
  await preKeyStore.getOrGenSinglePreKey(async () => firstPreKey);
12
18
  return {
13
19
  registrationInfo,
@@ -1,27 +1,37 @@
1
1
  import { toSerializedPubKey } from '../../crypto/index.js';
2
2
  import { ConsoleLogger } from '../../infra/log/ConsoleLogger.js';
3
3
  import { StoreLock } from '../../infra/perf/StoreLock.js';
4
+ import { signalAddressKey } from '../../protocol/jid.js';
4
5
  import { MAX_PREV_SESSIONS } from '../constants.js';
5
- import { encodeSignalSessionSnapshot } from '../encoding.js';
6
+ import { encodeSignalSessionSnapshot } from '../session/encoding.js';
6
7
  import { decryptMsg, decryptMsgFromSession, encryptMsg } from '../session/SignalRatchet.js';
7
8
  import { deserializeMsg, deserializePkMsg, requirePreKey, requireSignedPreKey } from '../session/SignalSerializer.js';
8
- import { detachSession, findMatchingSession, generateSerializedKeyPair, initiateSessionIncoming, initiateSessionOutgoing, requireLocalIdentity, toSerializedKeyPair } from '../session/SignalSession.js';
9
+ import { findMatchingSession, generateSerializedKeyPair, initiateSessionIncoming, initiateSessionOutgoing, requireLocalIdentity, toSerializedKeyPair } from '../session/SignalSession.js';
9
10
  import { uint8Equal } from '../../util/bytes.js';
10
- function signalAddressMapKey(address) {
11
- return `${address.user}\u0001${address.server ?? ''}\u0001${address.device}`;
12
- }
13
11
  function signalAddressLockKey(address) {
14
- return `signal:${signalAddressMapKey(address)}`;
12
+ return `signal:${signalAddressKey(address)}`;
15
13
  }
14
+ /**
15
+ * High-level Signal protocol session orchestrator: establishes outgoing
16
+ * sessions from prekey bundles, encrypts/decrypts ratchet messages, and owns
17
+ * the per-address session mutation lock.
18
+ */
16
19
  export class SignalProtocol {
17
20
  constructor(stores, logger = new ConsoleLogger('info')) {
18
21
  this.stores = stores;
19
22
  this.logger = logger;
20
23
  this.sessionMutationLock = new StoreLock();
21
24
  }
25
+ /**
26
+ * Builds an outgoing Signal session against a remote prekey bundle. Set
27
+ * `options.reuseExisting` to skip the handshake when a session already
28
+ * exists for the same remote identity. Set `options.knownAbsent` only
29
+ * when the caller already proved (within the same logical step) that no
30
+ * session exists; it skips the in-lock recheck and forces a new handshake.
31
+ */
22
32
  async establishOutgoingSession(address, remoteBundle, options = {}) {
23
33
  return this.runWithAddressLock(address, async () => {
24
- if (options.reuseExisting) {
34
+ if (options.reuseExisting && !options.knownAbsent) {
25
35
  const existing = await this.stores.session.getSession(address);
26
36
  if (existing) {
27
37
  const remoteIdentity = toSerializedPubKey(remoteBundle.identity);
@@ -42,12 +52,100 @@ export class SignalProtocol {
42
52
  return session;
43
53
  });
44
54
  }
55
+ /**
56
+ * Compute an outgoing session under the per-address lock without
57
+ * persisting. Caller batches results and persists via
58
+ * {@link persistOutgoingSessionsBatch} to collapse N `setRemoteIdentity`
59
+ * + `setSession` round-trips into one bulk write per store.
60
+ */
61
+ async prepareOutgoingSession(address, remoteBundle, options = {}) {
62
+ return this.runWithAddressLock(address, async () => {
63
+ if (options.reuseExisting && !options.knownAbsent) {
64
+ const existing = await this.stores.session.getSession(address);
65
+ if (existing) {
66
+ const remoteIdentity = toSerializedPubKey(remoteBundle.identity);
67
+ if (!uint8Equal(existing.remote.pubKey, remoteIdentity)) {
68
+ throw new Error('identity mismatch');
69
+ }
70
+ return {
71
+ session: existing,
72
+ remoteIdentity: existing.remote.pubKey,
73
+ reusedExisting: true
74
+ };
75
+ }
76
+ }
77
+ const [local, localOneTimeBase] = await Promise.all([
78
+ requireLocalIdentity(this.stores.signal),
79
+ generateSerializedKeyPair()
80
+ ]);
81
+ const session = await initiateSessionOutgoing(local, remoteBundle, localOneTimeBase);
82
+ return {
83
+ session,
84
+ remoteIdentity: session.remote.pubKey,
85
+ reusedExisting: false
86
+ };
87
+ });
88
+ }
89
+ /**
90
+ * Persist prepared outgoing sessions while holding every per-address
91
+ * lock (same discipline as {@link encryptMessagesBatch}). Re-reads
92
+ * sessions inside the lock; defers to a concurrent writer's session
93
+ * when identities agree to avoid clobbering a fresher ratchet advance,
94
+ * and reports identity conflicts via `skipped`.
95
+ */
96
+ async persistOutgoingSessionsBatch(entries) {
97
+ if (entries.length === 0)
98
+ return { resolved: [], skipped: [] };
99
+ const lockKeys = new Array(entries.length);
100
+ for (let i = 0; i < entries.length; i += 1) {
101
+ lockKeys[i] = signalAddressLockKey(entries[i].address);
102
+ }
103
+ return this.sessionMutationLock.runMany(lockKeys, async () => {
104
+ const addresses = entries.map((e) => e.address);
105
+ const existingSessions = await this.stores.session.getSessionsBatch(addresses);
106
+ const identityUpdates = [];
107
+ const sessionUpdates = [];
108
+ const resolved = [];
109
+ const skipped = [];
110
+ for (let i = 0; i < entries.length; i += 1) {
111
+ const entry = entries[i];
112
+ const existing = existingSessions[i];
113
+ if (existing) {
114
+ if (uint8Equal(existing.remote.pubKey, entry.remoteIdentity)) {
115
+ resolved.push({ address: entry.address, session: existing });
116
+ continue;
117
+ }
118
+ skipped.push({ address: entry.address, reason: 'identity-mismatch' });
119
+ continue;
120
+ }
121
+ identityUpdates.push({
122
+ address: entry.address,
123
+ identityKey: entry.remoteIdentity
124
+ });
125
+ sessionUpdates.push({ address: entry.address, session: entry.session });
126
+ resolved.push({ address: entry.address, session: entry.session });
127
+ }
128
+ if (identityUpdates.length > 0) {
129
+ await this.stores.identity.setRemoteIdentities(identityUpdates);
130
+ }
131
+ if (sessionUpdates.length > 0) {
132
+ await this.stores.session.setSessionsBatch(sessionUpdates);
133
+ }
134
+ return { resolved, skipped };
135
+ });
136
+ }
137
+ /**
138
+ * Encrypts `plaintext` for `address`. Returns `pkmsg` when this is the
139
+ * first message of the session, `msg` otherwise. `expectedIdentity`
140
+ * enforces identity continuity.
141
+ */
45
142
  async encryptMessage(address, plaintext, expectedIdentity) {
46
143
  const [encrypted] = await this.encryptMessagesBatch([
47
144
  { address, plaintext, expectedIdentity }
48
145
  ]);
49
146
  return encrypted;
50
147
  }
148
+ /** Batch variant of {@link encryptMessage} that shares per-address locks. */
51
149
  async encryptMessagesBatch(requests, prefetchedSessions) {
52
150
  if (requests.length === 0) {
53
151
  return [];
@@ -61,7 +159,7 @@ export class SignalProtocol {
61
159
  if (prefetchedSessions && prefetchedSessions.length > 0) {
62
160
  for (let index = 0; index < prefetchedSessions.length; index += 1) {
63
161
  const entry = prefetchedSessions[index];
64
- prefetchedByAddress.set(signalAddressMapKey(entry.address), entry.session);
162
+ prefetchedByAddress.set(signalAddressKey(entry.address), entry.session);
65
163
  }
66
164
  }
67
165
  const uniqueAddressKeys = new Array(requests.length);
@@ -69,7 +167,7 @@ export class SignalProtocol {
69
167
  let uniqueAddressCount = 0;
70
168
  for (let index = 0; index < requests.length; index += 1) {
71
169
  const address = requests[index].address;
72
- const addressKey = signalAddressMapKey(address);
170
+ const addressKey = signalAddressKey(address);
73
171
  let isDuplicate = false;
74
172
  for (let dedupIndex = 0; dedupIndex < uniqueAddressCount; dedupIndex += 1) {
75
173
  if (uniqueAddressKeys[dedupIndex] === addressKey) {
@@ -106,7 +204,7 @@ export class SignalProtocol {
106
204
  for (let index = 0; index < requests.length; index += 1) {
107
205
  const request = requests[index];
108
206
  const address = request.address;
109
- const addressKey = signalAddressMapKey(address);
207
+ const addressKey = signalAddressKey(address);
110
208
  const session = latestSessionByAddress.get(addressKey);
111
209
  if (!session) {
112
210
  throw new Error('signal session not found');
@@ -152,6 +250,10 @@ export class SignalProtocol {
152
250
  return results;
153
251
  });
154
252
  }
253
+ /**
254
+ * Decrypts a Signal message (`msg` or `pkmsg`) from `address`. For
255
+ * `pkmsg`, instantiates the session from the embedded bundle when needed.
256
+ */
155
257
  async decryptMessage(address, envelope) {
156
258
  return this.runWithAddressLock(address, async () => {
157
259
  const currentSession = await this.stores.session.getSession(address);
@@ -211,7 +313,7 @@ export class SignalProtocol {
211
313
  ? {
212
314
  ...incoming,
213
315
  prevSessions: [
214
- encodeSignalSessionSnapshot(detachSession(currentSession)),
316
+ encodeSignalSessionSnapshot(currentSession),
215
317
  ...currentSession.prevSessions.slice(0, MAX_PREV_SESSIONS - 1)
216
318
  ]
217
319
  }
@@ -1,12 +1,12 @@
1
- import { aesCbcDecrypt, aesCbcEncrypt, hkdf, hmacSign, importAesCbcKey, importHmacKey, prependVersion, toSerializedPubKey } from '../../crypto/index.js';
1
+ import { aesCbcDecrypt, aesCbcEncrypt, hkdf, hmacSha256Sign, prependVersion, toSerializedPubKey } from '../../crypto/index.js';
2
2
  import { proto } from '../../proto.js';
3
- import { CHAIN_KEY_LABEL, FUTURE_MESSAGES_MAX, MAX_UNUSED_KEYS, MESSAGE_KEY_LABEL, SIGNAL_MAC_SIZE, SIGNAL_VERSION } from '../constants.js';
4
- import { decodeSignalMessageKey, decodeSignalRecvChain, decodeSignalSessionSnapshot, encodeSignalRecvChain, encodeSignalSessionSnapshot } from '../encoding.js';
5
- import { calculateRatchet, detachSession, generateSerializedKeyPair, snapshotToRecord } from '../session/SignalSession.js';
6
- import { concatBytes, removeAt, uint8Equal } from '../../util/bytes.js';
3
+ import { CHAIN_KEY_LABEL, FUTURE_MESSAGES_MAX, MAX_UNUSED_KEYS, MESSAGE_KEY_LABEL, SIGNAL_MAC_SIZE, SIGNAL_VERSION, WHISPER_MESSAGE_KEYS_INFO } from '../constants.js';
4
+ import { decodeSignalMessageKey, decodeSignalRecvChain, decodeSignalSessionSnapshot, encodeSignalRecvChain, encodeSignalSessionSnapshot } from '../session/encoding.js';
5
+ import { calculateRatchet, generateSerializedKeyPair, snapshotToRecord } from '../session/SignalSession.js';
6
+ import { concatBytes, removeAt, uint8Equal, uint8TimingSafeEqual } from '../../util/bytes.js';
7
7
  import { toError } from '../../util/primitives.js';
8
8
  const MAX_TRACKED_RECV_CHAINS = 4;
9
- export function splitMsgKey(index, bytes) {
9
+ function splitMsgKey(index, bytes) {
10
10
  if (bytes.length < 80) {
11
11
  throw new Error('invalid message key length');
12
12
  }
@@ -17,14 +17,10 @@ export function splitMsgKey(index, bytes) {
17
17
  iv: bytes.subarray(64, 80)
18
18
  };
19
19
  }
20
- export async function deriveMsgKey(index, chainKey) {
21
- const state = await createDerivedChainState(chainKey);
22
- const derived = await deriveMsgKeyFromState(index, state);
23
- return {
24
- nextChainKey: derived.nextState.chainKey,
25
- messageKey: derived.messageKey
26
- };
20
+ export function deriveMsgKey(index, chainKey) {
21
+ return deriveMsgKeyFromChainKey(index, chainKey);
27
22
  }
23
+ // eslint-disable-next-line @typescript-eslint/require-await
28
24
  export async function selectMessageKey(chain, targetCounter) {
29
25
  const delta = targetCounter - chain.nextMsgIndex;
30
26
  if (delta > FUTURE_MESSAGES_MAX) {
@@ -48,17 +44,17 @@ export async function selectMessageKey(chain, targetCounter) {
48
44
  }
49
45
  };
50
46
  }
51
- let chainState = await createDerivedChainState(chain.chainKey);
52
- const first = await deriveMsgKeyFromState(chain.nextMsgIndex, chainState);
47
+ let chainKey = chain.chainKey;
48
+ const first = deriveMsgKeyFromChainKey(chain.nextMsgIndex, chainKey);
53
49
  let currentMessageKey = first.messageKey;
54
- chainState = first.nextState;
50
+ chainKey = first.nextChainKey;
55
51
  if (delta === 0) {
56
52
  return {
57
53
  messageKey: currentMessageKey,
58
54
  updatedChain: {
59
55
  ratchetPubKey: chain.ratchetPubKey,
60
56
  nextMsgIndex: targetCounter + 1,
61
- chainKey: chainState.chainKey,
57
+ chainKey,
62
58
  unusedMsgKeys: unused
63
59
  }
64
60
  };
@@ -81,53 +77,34 @@ export async function selectMessageKey(chain, targetCounter) {
81
77
  iv: currentMessageKey.iv
82
78
  });
83
79
  }
84
- const derived = await deriveMsgKeyFromState(counter, chainState);
80
+ const derived = deriveMsgKeyFromChainKey(counter, chainKey);
85
81
  currentMessageKey = derived.messageKey;
86
- chainState = derived.nextState;
82
+ chainKey = derived.nextChainKey;
87
83
  }
88
84
  return {
89
85
  messageKey: currentMessageKey,
90
86
  updatedChain: {
91
87
  ratchetPubKey: chain.ratchetPubKey,
92
88
  nextMsgIndex: targetCounter + 1,
93
- chainKey: chainState.chainKey,
89
+ chainKey,
94
90
  unusedMsgKeys: nextUnused
95
91
  }
96
92
  };
97
93
  }
98
- async function createDerivedChainState(chainKey) {
99
- return {
100
- chainKey,
101
- hmacKey: await importHmacKey(chainKey)
102
- };
103
- }
104
- async function deriveMsgKeyFromState(index, state) {
105
- const nextChainRawPromise = hmacSign(state.hmacKey, CHAIN_KEY_LABEL);
106
- const messageInputKeyPromise = hmacSign(state.hmacKey, MESSAGE_KEY_LABEL);
107
- const [nextChainRaw, messageInputKey] = await Promise.all([
108
- nextChainRawPromise,
109
- messageInputKeyPromise
110
- ]);
94
+ function deriveMsgKeyFromChainKey(index, chainKey) {
95
+ const nextChainRaw = hmacSha256Sign(chainKey, CHAIN_KEY_LABEL);
96
+ const messageInputKey = hmacSha256Sign(chainKey, MESSAGE_KEY_LABEL);
111
97
  const nextChainKey = nextChainRaw.subarray(0, 32);
112
- const [nextHmacKey, expanded] = await Promise.all([
113
- importHmacKey(nextChainKey),
114
- hkdf(messageInputKey, null, 'WhisperMessageKeys', 80)
115
- ]);
98
+ const expanded = hkdf(messageInputKey, null, WHISPER_MESSAGE_KEYS_INFO, 80);
116
99
  return {
117
- nextState: {
118
- chainKey: nextChainKey,
119
- hmacKey: nextHmacKey
120
- },
100
+ nextChainKey,
121
101
  messageKey: splitMsgKey(index, expanded)
122
102
  };
123
103
  }
104
+ // eslint-disable-next-line @typescript-eslint/require-await
124
105
  export async function encryptMsg(session, plaintext) {
125
- const { nextChainKey, messageKey } = await deriveMsgKey(session.sendChain.nextMsgIndex, session.sendChain.chainKey);
126
- const [cipherKey, macKey] = await Promise.all([
127
- importAesCbcKey(messageKey.cipherKey),
128
- importHmacKey(messageKey.macKey)
129
- ]);
130
- const ciphertext = await aesCbcEncrypt(cipherKey, messageKey.iv, plaintext);
106
+ const { nextChainKey, messageKey } = deriveMsgKey(session.sendChain.nextMsgIndex, session.sendChain.chainKey);
107
+ const ciphertext = aesCbcEncrypt(messageKey.cipherKey, messageKey.iv, plaintext);
131
108
  const signalPayload = proto.SignalMessage.encode({
132
109
  ratchetKey: session.sendChain.ratchetKey.pubKey,
133
110
  counter: messageKey.index,
@@ -135,12 +112,11 @@ export async function encryptMsg(session, plaintext) {
135
112
  ciphertext
136
113
  }).finish();
137
114
  const versionedSignalPayload = prependVersion(signalPayload, SIGNAL_VERSION);
138
- const macInput = concatBytes([
115
+ const mac = hmacSha256Sign(messageKey.macKey, [
139
116
  session.local.pubKey,
140
117
  session.remote.pubKey,
141
118
  versionedSignalPayload
142
119
  ]);
143
- const mac = await hmacSign(macKey, macInput);
144
120
  const signalMessage = concatBytes([versionedSignalPayload, mac.subarray(0, SIGNAL_MAC_SIZE)]);
145
121
  let type = 'msg';
146
122
  let output = signalMessage;
@@ -187,7 +163,7 @@ export async function decryptMsg(session, parsed, onPrevSessionDecryptError) {
187
163
  const updatedSession = {
188
164
  ...updatedPrev,
189
165
  prevSessions: [
190
- encodeSignalSessionSnapshot(detachSession(session)),
166
+ encodeSignalSessionSnapshot(session),
191
167
  ...session.prevSessions.slice(0, i),
192
168
  ...session.prevSessions.slice(i + 1)
193
169
  ]
@@ -260,21 +236,16 @@ export async function decryptMsgFromSession(session, message) {
260
236
  recvChains: nextRecvChains
261
237
  };
262
238
  }
263
- const [cipherKey, macKey] = await Promise.all([
264
- importAesCbcKey(selectedMessageKey.cipherKey),
265
- importHmacKey(selectedMessageKey.macKey)
266
- ]);
267
239
  const payloadWithoutMac = message.versionContentMac.subarray(0, message.versionContentMac.length - SIGNAL_MAC_SIZE);
268
- const expectedMacInput = concatBytes([
240
+ const expectedMac = hmacSha256Sign(selectedMessageKey.macKey, [
269
241
  session.remote.pubKey,
270
242
  session.local.pubKey,
271
243
  payloadWithoutMac
272
244
  ]);
273
- const expectedMac = await hmacSign(macKey, expectedMacInput);
274
245
  const receivedMac = message.versionContentMac.subarray(message.versionContentMac.length - SIGNAL_MAC_SIZE);
275
- if (!uint8Equal(expectedMac.subarray(0, SIGNAL_MAC_SIZE), receivedMac)) {
246
+ if (!uint8TimingSafeEqual(expectedMac.subarray(0, SIGNAL_MAC_SIZE), receivedMac)) {
276
247
  throw new Error('invalid message mac');
277
248
  }
278
- const plaintext = await aesCbcDecrypt(cipherKey, selectedMessageKey.iv, message.ciphertext);
249
+ const plaintext = aesCbcDecrypt(selectedMessageKey.cipherKey, selectedMessageKey.iv, message.ciphertext);
279
250
  return [updatedSession, plaintext];
280
251
  }
@@ -1,6 +1,6 @@
1
1
  import { hkdfSplit, toRawPubKey, toSerializedPubKey, X25519 } from '../../crypto/index.js';
2
- import { SIGNAL_PREFIX } from '../constants.js';
3
- import { decodeSignalSessionSnapshot, encodeSignalSessionSnapshot } from '../encoding.js';
2
+ import { SIGNAL_PREFIX, WHISPER_RATCHET_INFO, WHISPER_TEXT_INFO } from '../constants.js';
3
+ import { decodeSignalSessionSnapshot, encodeSignalSessionSnapshot } from '../session/encoding.js';
4
4
  import { concatBytes, uint8Equal } from '../../util/bytes.js';
5
5
  export function snapshotToRecord(snapshot) {
6
6
  return {
@@ -8,11 +8,6 @@ export function snapshotToRecord(snapshot) {
8
8
  prevSessions: []
9
9
  };
10
10
  }
11
- export function detachSession(session) {
12
- const { prevSessions, ...snapshot } = session;
13
- void prevSessions;
14
- return snapshot;
15
- }
16
11
  export function findMatchingSession(session, sessionBaseKey) {
17
12
  if (!session) {
18
13
  return null;
@@ -27,9 +22,7 @@ export function findMatchingSession(session, sessionBaseKey) {
27
22
  continue;
28
23
  }
29
24
  const decoded = decodeSignalSessionSnapshot(rawPrev, `prevSessions[${index}]`);
30
- const prevSessions = [
31
- encodeSignalSessionSnapshot(detachSession(session))
32
- ];
25
+ const prevSessions = [encodeSignalSessionSnapshot(session)];
33
26
  for (let i = 0; i < session.prevSessions.length; i += 1) {
34
27
  if (i !== index) {
35
28
  prevSessions.push(session.prevSessions[i]);
@@ -74,7 +67,7 @@ export async function initiateSessionOutgoing(local, remoteBundle, localOneTimeB
74
67
  baseDh,
75
68
  ...(oneTimeDh ? [oneTimeDh] : [])
76
69
  ]);
77
- const [rootKey, chainKey] = await hkdfSplit(secret, null, 'WhisperText');
70
+ const [rootKey, chainKey] = hkdfSplit(secret, null, WHISPER_TEXT_INFO);
78
71
  const recvChain = {
79
72
  senderRatchetKey: remoteRatchetKey,
80
73
  chainKey: { index: 0, key: chainKey },
@@ -120,7 +113,7 @@ export async function initiateSessionIncoming(local, remote, sessionBaseKey, loc
120
113
  signedDh,
121
114
  ...(oneTimeDh ? [oneTimeDh] : [])
122
115
  ]);
123
- const [rootKey, chainKey] = await hkdfSplit(secret, null, 'WhisperText');
116
+ const [rootKey, chainKey] = hkdfSplit(secret, null, WHISPER_TEXT_INFO);
124
117
  return {
125
118
  local: { regId: local.regId, pubKey: local.staticKeyPair.pubKey },
126
119
  remote: { regId: remote.regId, pubKey: remotePub },
@@ -139,7 +132,7 @@ export async function initiateSessionIncoming(local, remote, sessionBaseKey, loc
139
132
  }
140
133
  export async function calculateRatchet(rootKey, localRatchet, remoteRatchetPubKey) {
141
134
  const sharedSecret = await ecdh(localRatchet.privKey, remoteRatchetPubKey);
142
- const [nextRootKey, chainKey] = await hkdfSplit(sharedSecret, rootKey, 'WhisperRatchet');
135
+ const [nextRootKey, chainKey] = hkdfSplit(sharedSecret, rootKey, WHISPER_RATCHET_INFO);
143
136
  return {
144
137
  rootKey: nextRootKey,
145
138
  chainKey
@@ -156,5 +149,5 @@ export function toSerializedKeyPair(pair) {
156
149
  };
157
150
  }
158
151
  export async function ecdh(privateKey, publicKey) {
159
- return X25519.scalarMult(privateKey, toRawPubKey(publicKey));
152
+ return await X25519.scalarMult(privateKey, toRawPubKey(publicKey));
160
153
  }
@@ -0,0 +1,173 @@
1
+ import { proto } from '../../proto.js';
2
+ import { assertByteLength } from '../../util/bytes.js';
3
+ import { asBytes, asNumber, asOptionalBytes, asOptionalNumber } from '../../util/coercion.js';
4
+ export function encodeSignalSessionSnapshot(session) {
5
+ return {
6
+ sessionVersion: 3,
7
+ localRegistrationId: session.local.regId,
8
+ localIdentityPublic: session.local.pubKey,
9
+ remoteRegistrationId: session.remote.regId,
10
+ remoteIdentityPublic: session.remote.pubKey,
11
+ rootKey: session.rootKey,
12
+ previousCounter: session.prevSendChainHighestIndex,
13
+ senderChain: encodeSignalSendChain(session.sendChain),
14
+ receiverChains: session.recvChains,
15
+ pendingPreKey: session.initialExchangeInfo
16
+ ? {
17
+ preKeyId: session.initialExchangeInfo.remoteOneTimeId ?? undefined,
18
+ signedPreKeyId: session.initialExchangeInfo.remoteSignedId,
19
+ baseKey: session.initialExchangeInfo.localOneTimePubKey
20
+ }
21
+ : undefined,
22
+ aliceBaseKey: session.aliceBaseKey ?? undefined
23
+ };
24
+ }
25
+ function encodeSignalSendChain(chain) {
26
+ return {
27
+ senderRatchetKey: chain.ratchetKey.pubKey,
28
+ senderRatchetKeyPrivate: chain.ratchetKey.privKey,
29
+ chainKey: {
30
+ index: chain.nextMsgIndex,
31
+ key: chain.chainKey
32
+ },
33
+ messageKeys: []
34
+ };
35
+ }
36
+ export function encodeSignalRecvChain(chain) {
37
+ return {
38
+ senderRatchetKey: chain.ratchetPubKey,
39
+ chainKey: {
40
+ index: chain.nextMsgIndex,
41
+ key: chain.chainKey
42
+ },
43
+ messageKeys: chain.unusedMsgKeys
44
+ };
45
+ }
46
+ export function decodeSignalMessageKey(messageKey, field) {
47
+ const cipherKey = asBytes(messageKey.cipherKey, `${field}.cipherKey`);
48
+ assertByteLength(cipherKey, 32, `invalid ${field}.cipherKey length ${cipherKey.byteLength}`);
49
+ const macKey = asBytes(messageKey.macKey, `${field}.macKey`);
50
+ assertByteLength(macKey, 32, `invalid ${field}.macKey length ${macKey.byteLength}`);
51
+ const iv = asBytes(messageKey.iv, `${field}.iv`);
52
+ assertByteLength(iv, 16, `invalid ${field}.iv length ${iv.byteLength}`);
53
+ return {
54
+ index: asNumber(messageKey.index, `${field}.index`),
55
+ cipherKey,
56
+ macKey,
57
+ iv
58
+ };
59
+ }
60
+ export function decodeSignalRecvChain(chain, field) {
61
+ const chainKey = chain.chainKey;
62
+ if (!chainKey) {
63
+ throw new Error(`missing ${field}.chainKey`);
64
+ }
65
+ const ratchetPubKey = asBytes(chain.senderRatchetKey, `${field}.senderRatchetKey`);
66
+ assertByteLength(ratchetPubKey, 33, `invalid ${field}.senderRatchetKey length ${ratchetPubKey.byteLength}`);
67
+ const chainKeyBytes = asBytes(chainKey.key, `${field}.chainKey.key`);
68
+ assertByteLength(chainKeyBytes, 32, `invalid ${field}.chainKey.key length ${chainKeyBytes.byteLength}`);
69
+ return {
70
+ ratchetPubKey,
71
+ nextMsgIndex: asNumber(chainKey.index, `${field}.chainKey.index`),
72
+ chainKey: chainKeyBytes,
73
+ unusedMsgKeys: chain.messageKeys ?? []
74
+ };
75
+ }
76
+ function decodeSignalSendChain(chain, field) {
77
+ const chainKey = chain.chainKey;
78
+ if (!chainKey) {
79
+ throw new Error(`missing ${field}.chainKey`);
80
+ }
81
+ const privateKey = asOptionalBytes(chain.senderRatchetKeyPrivate, `${field}.senderRatchetKeyPrivate`);
82
+ if (!privateKey) {
83
+ throw new Error(`missing ${field}.senderRatchetKeyPrivate`);
84
+ }
85
+ assertByteLength(privateKey, 32, `invalid ${field}.senderRatchetKeyPrivate length ${privateKey.byteLength}`);
86
+ const ratchetPubKey = asBytes(chain.senderRatchetKey, `${field}.senderRatchetKey`);
87
+ assertByteLength(ratchetPubKey, 33, `invalid ${field}.senderRatchetKey length ${ratchetPubKey.byteLength}`);
88
+ const chainKeyBytes = asBytes(chainKey.key, `${field}.chainKey.key`);
89
+ assertByteLength(chainKeyBytes, 32, `invalid ${field}.chainKey.key length ${chainKeyBytes.byteLength}`);
90
+ return {
91
+ ratchetKey: {
92
+ pubKey: ratchetPubKey,
93
+ privKey: privateKey
94
+ },
95
+ nextMsgIndex: asNumber(chainKey.index, `${field}.chainKey.index`),
96
+ chainKey: chainKeyBytes
97
+ };
98
+ }
99
+ export function decodeSignalSessionSnapshot(session, field) {
100
+ const senderChain = session.senderChain;
101
+ if (!senderChain) {
102
+ throw new Error(`missing ${field}.senderChain`);
103
+ }
104
+ const pendingPreKey = session.pendingPreKey;
105
+ const localPubKey = asBytes(session.localIdentityPublic, `${field}.localIdentityPublic`);
106
+ assertByteLength(localPubKey, 33, `invalid ${field}.localIdentityPublic length ${localPubKey.byteLength}`);
107
+ const remotePubKey = asBytes(session.remoteIdentityPublic, `${field}.remoteIdentityPublic`);
108
+ assertByteLength(remotePubKey, 33, `invalid ${field}.remoteIdentityPublic length ${remotePubKey.byteLength}`);
109
+ const rootKey = asBytes(session.rootKey, `${field}.rootKey`);
110
+ assertByteLength(rootKey, 32, `invalid ${field}.rootKey length ${rootKey.byteLength}`);
111
+ const localOneTimePubKey = pendingPreKey
112
+ ? asBytes(pendingPreKey.baseKey, `${field}.pendingPreKey.baseKey`)
113
+ : null;
114
+ if (localOneTimePubKey) {
115
+ assertByteLength(localOneTimePubKey, 33, `invalid ${field}.pendingPreKey.baseKey length ${localOneTimePubKey.byteLength}`);
116
+ }
117
+ const aliceBaseKey = asOptionalBytes(session.aliceBaseKey, `${field}.aliceBaseKey`) ?? null;
118
+ if (aliceBaseKey) {
119
+ assertByteLength(aliceBaseKey, 33, `invalid ${field}.aliceBaseKey length ${aliceBaseKey.byteLength}`);
120
+ }
121
+ return {
122
+ local: {
123
+ regId: asNumber(session.localRegistrationId, `${field}.localRegistrationId`),
124
+ pubKey: localPubKey
125
+ },
126
+ remote: {
127
+ regId: asNumber(session.remoteRegistrationId, `${field}.remoteRegistrationId`),
128
+ pubKey: remotePubKey
129
+ },
130
+ rootKey,
131
+ sendChain: decodeSignalSendChain(senderChain, `${field}.senderChain`),
132
+ recvChains: session.receiverChains ?? [],
133
+ initialExchangeInfo: pendingPreKey
134
+ ? {
135
+ remoteOneTimeId: asOptionalNumber(pendingPreKey.preKeyId, `${field}.pendingPreKey.preKeyId`) ??
136
+ null,
137
+ remoteSignedId: asNumber(pendingPreKey.signedPreKeyId, `${field}.pendingPreKey.signedPreKeyId`),
138
+ localOneTimePubKey: localOneTimePubKey
139
+ }
140
+ : null,
141
+ prevSendChainHighestIndex: asOptionalNumber(session.previousCounter, `${field}.previousCounter`) ?? 0,
142
+ aliceBaseKey
143
+ };
144
+ }
145
+ /**
146
+ * Serializes a {@link SignalSessionRecord} (current + previous sessions) into
147
+ * the Signal `RecordStructure` protobuf encoding used by the session stores.
148
+ */
149
+ export function encodeSignalSessionRecord(record) {
150
+ return proto.RecordStructure.encode({
151
+ currentSession: encodeSignalSessionSnapshot(record),
152
+ previousSessions: record.prevSessions
153
+ }).finish();
154
+ }
155
+ /**
156
+ * Decodes a Signal `RecordStructure` payload (as stored on disk) back into a
157
+ * {@link SignalSessionRecord}. Throws when the current session is missing.
158
+ */
159
+ export function decodeSignalSessionRecord(raw) {
160
+ const decoded = proto.RecordStructure.decode(asBytes(raw, 'signal_sessions.record'));
161
+ if (!decoded.currentSession) {
162
+ throw new Error('missing signal_sessions.record.currentSession');
163
+ }
164
+ const current = decodeSignalSessionSnapshot(decoded.currentSession, 'signal_sessions.currentSession');
165
+ return {
166
+ ...current,
167
+ prevSessions: decoded.previousSessions ?? []
168
+ };
169
+ }
170
+ /** Reads a stored remote identity blob into a Uint8Array (validates byte-shape). */
171
+ export function decodeSignalRemoteIdentity(raw) {
172
+ return asBytes(raw, 'signal_identity.identity_key');
173
+ }