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,10 +1,14 @@
1
1
  import { PromiseDedup } from '../../infra/perf/PromiseDedup.js';
2
2
  import { WA_DEFAULTS, WA_NODE_TAGS, WA_USYNC_CONTEXTS } from '../../protocol/constants.js';
3
3
  import { buildDeviceJid, isHostedDeviceId, splitJid, toUserJid } from '../../protocol/jid.js';
4
- import { buildUsyncIq } from '../../transport/node/builders/usync.js';
4
+ import { buildUsyncIq, iterateUsyncUsers, parseUsyncResultEnvelope } from '../../transport/node/builders/usync.js';
5
5
  import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
6
6
  import { assertIqResult } from '../../transport/node/query.js';
7
- import { createUsyncSidGenerator } from '../../transport/node/usync.js';
7
+ import { createUsyncSidGenerator, logUsyncProtocolErrors } from '../../transport/node/usync.js';
8
+ /**
9
+ * Resolves the device list and LID mapping for a set of users via the `usync`
10
+ * protocol. Concurrent calls for the same JIDs are deduplicated.
11
+ */
8
12
  export class SignalDeviceSyncApi {
9
13
  constructor(options) {
10
14
  this.syncDedup = new PromiseDedup();
@@ -16,6 +20,10 @@ export class SignalDeviceSyncApi {
16
20
  this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
17
21
  this.generateSid = options.generateSid ?? createUsyncSidGenerator();
18
22
  }
23
+ /**
24
+ * Refreshes the device list for every JID in `userJids`. Returns the
25
+ * resolved per-user device JIDs (matches the on-store snapshot).
26
+ */
19
27
  syncDeviceList(userJids, timeoutMs = this.defaultTimeoutMs) {
20
28
  const normalizedUsers = this.normalizeUsers(userJids);
21
29
  if (normalizedUsers.length === 0) {
@@ -84,6 +92,10 @@ export class SignalDeviceSyncApi {
84
92
  });
85
93
  return merged;
86
94
  }
95
+ /**
96
+ * Looks up LIDs for a list of phone JIDs via a `lid` usync query. Returns
97
+ * one entry per input JID with `exists` indicating server-side presence.
98
+ */
87
99
  async queryLidsByPhoneJids(phoneJids, timeoutMs = this.defaultTimeoutMs) {
88
100
  const normalizedPhoneJids = this.normalizeUsers(phoneJids);
89
101
  if (normalizedPhoneJids.length === 0) {
@@ -125,8 +137,51 @@ export class SignalDeviceSyncApi {
125
137
  users: result.length,
126
138
  found
127
139
  });
140
+ await this.propagateAltUserJids(result);
128
141
  return result;
129
142
  }
143
+ /**
144
+ * Enriches existing device-list snapshots with the resolved LID equivalents
145
+ * so {@link WaDeviceListStore.findByAnyUserJid} can later match a retry
146
+ * receipt arriving in LID form against an eligible list stored in PN form
147
+ * (and vice versa). Skips users with no cached snapshot — the alt gets
148
+ * recorded on the next {@link syncDeviceList} sweep.
149
+ */
150
+ async propagateAltUserJids(results) {
151
+ if (!this.deviceListStore || results.length === 0)
152
+ return;
153
+ const nowMs = Date.now();
154
+ const lidByPhoneJid = new Map();
155
+ const phoneJids = [];
156
+ for (const entry of results) {
157
+ if (entry.lidJid && entry.phoneJid) {
158
+ lidByPhoneJid.set(entry.phoneJid, entry.lidJid);
159
+ phoneJids.push(entry.phoneJid);
160
+ }
161
+ }
162
+ if (phoneJids.length === 0)
163
+ return;
164
+ const existing = await this.deviceListStore.getUserDevicesBatch(phoneJids, nowMs);
165
+ const updates = [];
166
+ for (let index = 0; index < phoneJids.length; index += 1) {
167
+ const snapshot = existing[index];
168
+ if (!snapshot)
169
+ continue;
170
+ const phoneJid = phoneJids[index];
171
+ const lidJid = lidByPhoneJid.get(phoneJid);
172
+ if (!lidJid || snapshot.altUserJid === lidJid)
173
+ continue;
174
+ updates.push({
175
+ userJid: snapshot.userJid,
176
+ altUserJid: lidJid,
177
+ deviceJids: snapshot.deviceJids,
178
+ updatedAtMs: nowMs
179
+ });
180
+ }
181
+ if (updates.length > 0) {
182
+ await this.deviceListStore.upsertUserDevicesBatch(updates);
183
+ }
184
+ }
130
185
  async collectUsersToQuery(normalizedUsers, nowMs, cachedByUser, store) {
131
186
  const records = await store.getUserDevicesBatch(normalizedUsers, nowMs);
132
187
  const usersToQuery = new Array(normalizedUsers.length);
@@ -200,16 +255,12 @@ export class SignalDeviceSyncApi {
200
255
  }
201
256
  parseDeviceSyncResponse(node, requestedUsers) {
202
257
  assertIqResult(node, 'signal device sync');
203
- const usyncNode = findNodeChild(node, WA_NODE_TAGS.USYNC);
204
- if (!usyncNode) {
205
- throw new Error('signal device sync response missing usync node');
206
- }
207
- const listNode = findNodeChild(usyncNode, WA_NODE_TAGS.LIST);
208
- if (!listNode) {
209
- throw new Error('signal device sync response missing list node');
258
+ logUsyncProtocolErrors(parseUsyncResultEnvelope(node), this.logger, 'signal.deviceSync');
259
+ const userNodes = iterateUsyncUsers(node);
260
+ if (!userNodes) {
261
+ throw new Error('signal device sync response missing usync envelope');
210
262
  }
211
263
  const requestedSet = new Set(requestedUsers);
212
- const userNodes = getNodeChildrenByTag(listNode, WA_NODE_TAGS.USER);
213
264
  const parsed = new Array(userNodes.length);
214
265
  let parsedCount = 0;
215
266
  for (let index = 0; index < userNodes.length; index += 1) {
@@ -233,16 +284,12 @@ export class SignalDeviceSyncApi {
233
284
  }
234
285
  parseLidSyncResponse(node, requestedUsers) {
235
286
  assertIqResult(node, 'signal lid sync');
236
- const usyncNode = findNodeChild(node, WA_NODE_TAGS.USYNC);
237
- if (!usyncNode) {
238
- throw new Error('signal lid sync response missing usync node');
239
- }
240
- const listNode = findNodeChild(usyncNode, WA_NODE_TAGS.LIST);
241
- if (!listNode) {
242
- throw new Error('signal lid sync response missing list node');
287
+ logUsyncProtocolErrors(parseUsyncResultEnvelope(node), this.logger, 'signal.lidSync');
288
+ const userNodes = iterateUsyncUsers(node);
289
+ if (!userNodes) {
290
+ throw new Error('signal lid sync response missing usync envelope');
243
291
  }
244
292
  const requestedSet = new Set(requestedUsers);
245
- const userNodes = getNodeChildrenByTag(listNode, WA_NODE_TAGS.USER);
246
293
  const parsed = new Array(userNodes.length);
247
294
  let parsedCount = 0;
248
295
  for (let index = 0; index < userNodes.length; index += 1) {
@@ -332,7 +379,7 @@ export class SignalDeviceSyncApi {
332
379
  ? rawUserJid.slice(rawAtIndex + 1)
333
380
  : parsedNormalizedUser.server;
334
381
  const dedup = new Set();
335
- for (const deviceNode of getNodeChildrenByTag(deviceListNode, 'device')) {
382
+ for (const deviceNode of getNodeChildrenByTag(deviceListNode, WA_NODE_TAGS.DEVICE)) {
336
383
  const parsedId = deviceNode.attrs.id
337
384
  ? Number.parseInt(deviceNode.attrs.id, 10)
338
385
  : Number.NaN;
@@ -5,7 +5,12 @@ import { decodeExactLength, parseUint } from '../api/codec.js';
5
5
  import { SIGNAL_KEY_BUNDLE_TYPE_BYTES, SIGNAL_KEY_BUNDLE_TYPE_LENGTH, SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_REGISTRATION_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
6
6
  import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildren } from '../../transport/node/helpers.js';
7
7
  import { parseIqError } from '../../transport/node/query.js';
8
- import { concatBytes, uint8Equal } from '../../util/bytes.js';
8
+ import { uint8Equal } from '../../util/bytes.js';
9
+ /**
10
+ * Validates the local Signal key bundle (identity, signed prekey, one-time
11
+ * prekey ids) against the server-side digest. Used to detect drift after a
12
+ * crash or partial sync and decide whether to re-upload.
13
+ */
9
14
  export class SignalDigestSyncApi {
10
15
  constructor(options) {
11
16
  this.logger = options.logger;
@@ -120,7 +125,7 @@ export class SignalDigestSyncApi {
120
125
  }
121
126
  bytesToHash.push(toRawPubKey(preKey.keyPair.pubKey));
122
127
  }
123
- const localHash = (await sha1(concatBytes(bytesToHash))).subarray(0, digest.hash.byteLength);
128
+ const localHash = sha1(bytesToHash).subarray(0, digest.hash.byteLength);
124
129
  if (!uint8Equal(localHash, digest.hash)) {
125
130
  return {
126
131
  valid: false,
@@ -6,6 +6,11 @@ import { decodeExactLength, parseUint } from '../api/codec.js';
6
6
  import { SIGNAL_KEY_BUNDLE_TYPE_LENGTH, SIGNAL_KEY_DATA_LENGTH } from '../api/constants.js';
7
7
  import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
8
8
  import { assertIqResult } from '../../transport/node/query.js';
9
+ /**
10
+ * Fetches identity keys for a list of JIDs from the server and persists them
11
+ * into the identity store. Concurrent calls for the same JID set are
12
+ * deduplicated.
13
+ */
9
14
  export class SignalIdentitySyncApi {
10
15
  constructor(options) {
11
16
  this.syncDedup = new PromiseDedup();
@@ -16,6 +21,10 @@ export class SignalIdentitySyncApi {
16
21
  options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
17
22
  this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
18
23
  }
24
+ /**
25
+ * Fetches and persists identity keys for `targetJids`. Returns one entry
26
+ * per JID the server resolved; missing/erroring users are skipped.
27
+ */
19
28
  syncIdentityKeys(targetJids, timeoutMs = this.defaultTimeoutMs) {
20
29
  const dedupKey = `${timeoutMs}:${targetJids.join(',')}`;
21
30
  return this.syncDedup.run(dedupKey, () => this.syncIdentityKeysInternal(targetJids, timeoutMs));
@@ -1,14 +1,18 @@
1
1
  import { WA_DEFAULTS, WA_NODE_TAGS } from '../../protocol/constants.js';
2
2
  import { splitJid, toUserJid } from '../../protocol/jid.js';
3
- import { decodeExactLength, parseUint } from '../api/codec.js';
4
- import { SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_REGISTRATION_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
3
+ import { decodeExactLength, parseSignalKeyBundleFromNode, parseUint } from '../api/codec.js';
4
+ import { SIGNAL_REGISTRATION_ID_LENGTH } from '../api/constants.js';
5
5
  import { buildMissingPreKeysFetchIq } from '../api/prekeys.js';
6
6
  import { registerParsedResultByRawAndCanonicalKey } from '../api/result-map.js';
7
- import { decodeNodeContentBase64OrBytes, findNodeChild, findNodeChildrenByTags, getNodeChildrenByTag } from '../../transport/node/helpers.js';
7
+ import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
8
8
  import { assertIqResult } from '../../transport/node/query.js';
9
9
  function isMissingPreKeysUserResultPreferred(result) {
10
10
  return 'devices' in result;
11
11
  }
12
+ /**
13
+ * Fetches missing prekey bundles for specific (user, device, registration id)
14
+ * triples – used during message encryption when a Signal session is missing.
15
+ */
12
16
  export class SignalMissingPreKeysSyncApi {
13
17
  constructor(options) {
14
18
  this.logger = options.logger;
@@ -16,6 +20,10 @@ export class SignalMissingPreKeysSyncApi {
16
20
  this.defaultTimeoutMs =
17
21
  options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
18
22
  }
23
+ /**
24
+ * Fetches prekey bundles for the requested `targets` in a single IQ.
25
+ * Returns either a per-device bundle list or an error envelope per user.
26
+ */
19
27
  async fetchMissingPreKeys(targets, timeoutMs = this.defaultTimeoutMs) {
20
28
  if (targets.length === 0) {
21
29
  return [];
@@ -91,69 +99,22 @@ export class SignalMissingPreKeysSyncApi {
91
99
  if (!Number.isSafeInteger(deviceId) || deviceId < 0) {
92
100
  throw new Error(`missing prekeys device[${index}].id is invalid`);
93
101
  }
94
- const [registrationNode, identityNode, signedKeyNode, oneTimeNode, deviceIdentityNode] = findNodeChildrenByTags(deviceNode, [
95
- WA_NODE_TAGS.REGISTRATION,
96
- WA_NODE_TAGS.IDENTITY,
97
- WA_NODE_TAGS.SKEY,
98
- WA_NODE_TAGS.KEY,
99
- WA_NODE_TAGS.DEVICE_IDENTITY
100
- ]);
101
- if (!registrationNode || !identityNode || !signedKeyNode) {
102
+ const registrationNode = findNodeChild(deviceNode, WA_NODE_TAGS.REGISTRATION);
103
+ if (!registrationNode) {
102
104
  throw new Error(`missing prekeys device payload is incomplete for ${userJid}`);
103
105
  }
104
- const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = findNodeChildrenByTags(signedKeyNode, [
105
- WA_NODE_TAGS.ID,
106
- WA_NODE_TAGS.VALUE,
107
- WA_NODE_TAGS.SIGNATURE
108
- ]);
109
- if (!signedKeyIdNode || !signedKeyValueNode || !signedKeySignatureNode) {
110
- throw new Error(`missing prekeys signed pre-key is incomplete for ${userJid}`);
111
- }
112
- let oneTimeIdNode;
113
- let oneTimeValueNode;
114
- if (oneTimeNode) {
115
- const oneTimeNodes = findNodeChildrenByTags(oneTimeNode, [
116
- WA_NODE_TAGS.ID,
117
- WA_NODE_TAGS.VALUE
118
- ]);
119
- oneTimeIdNode = oneTimeNodes[0];
120
- oneTimeValueNode = oneTimeNodes[1];
121
- }
122
- if (oneTimeNode && (!oneTimeIdNode || !oneTimeValueNode)) {
123
- throw new Error(`missing prekeys one-time key is incomplete for ${userJid}`);
124
- }
125
- const baseBundle = {
126
- regId: parseUint(decodeExactLength(registrationNode.content, 'missing prekeys device registration', SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration'),
127
- identity: decodeExactLength(identityNode.content, 'missing prekeys device identity', SIGNAL_KEY_DATA_LENGTH),
128
- signedKey: {
129
- id: parseUint(decodeExactLength(signedKeyIdNode.content, 'missing prekeys device skey.id', SIGNAL_KEY_ID_LENGTH), 'missing prekeys device skey.id'),
130
- publicKey: decodeExactLength(signedKeyValueNode.content, 'missing prekeys device skey.value', SIGNAL_KEY_DATA_LENGTH),
131
- signature: decodeExactLength(signedKeySignatureNode.content, 'missing prekeys device skey.signature', SIGNAL_SIGNATURE_LENGTH)
132
- }
106
+ const regId = parseUint(decodeExactLength(registrationNode.content, 'missing prekeys device registration', SIGNAL_REGISTRATION_ID_LENGTH), 'missing prekeys device registration');
107
+ const parsed = parseSignalKeyBundleFromNode(deviceNode, 'missing prekeys device');
108
+ const bundle = {
109
+ regId,
110
+ identity: parsed.identity,
111
+ signedKey: parsed.signedKey,
112
+ ...(parsed.oneTimeKey ? { oneTimeKey: parsed.oneTimeKey } : {})
133
113
  };
134
- const bundle = oneTimeIdNode && oneTimeValueNode
135
- ? {
136
- ...baseBundle,
137
- oneTimeKey: {
138
- id: parseUint(decodeExactLength(oneTimeIdNode.content, 'missing prekeys device key.id', SIGNAL_KEY_ID_LENGTH), 'missing prekeys device key.id'),
139
- publicKey: decodeExactLength(oneTimeValueNode.content, 'missing prekeys device key.value', SIGNAL_KEY_DATA_LENGTH)
140
- }
141
- }
142
- : baseBundle;
143
- let deviceIdentity;
144
- if (deviceIdentityNode) {
145
- deviceIdentity = decodeNodeContentBase64OrBytes(deviceIdentityNode.content, 'missing prekeys device device-identity');
146
- }
147
- bundles[index] = deviceIdentity
148
- ? {
149
- deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
150
- bundle,
151
- deviceIdentity
152
- }
153
- : {
154
- deviceJid: deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`,
155
- bundle
156
- };
114
+ const deviceJid = deviceId === 0 ? userJid : `${user}:${deviceId}@${server}`;
115
+ bundles[index] = parsed.deviceIdentity
116
+ ? { deviceJid, bundle, deviceIdentity: parsed.deviceIdentity }
117
+ : { deviceJid, bundle };
157
118
  }
158
119
  return bundles;
159
120
  }
@@ -2,6 +2,11 @@ import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS } from '../../protocol/constants
2
2
  import { buildSignedPreKeyRotateIq } from '../api/prekeys.js';
3
3
  import { generateSignedPreKey } from '../registration/keygen.js';
4
4
  import { parseIqError } from '../../transport/node/query.js';
5
+ /**
6
+ * Generates a fresh signed prekey and uploads it to the server. Handles the
7
+ * `406`/`409`/`5xx` error codes by signaling whether a digest re-validation
8
+ * is required.
9
+ */
5
10
  export class SignalRotateKeyApi {
6
11
  constructor(options) {
7
12
  this.logger = options.logger;
@@ -9,6 +14,11 @@ export class SignalRotateKeyApi {
9
14
  this.signalStore = options.signalStore;
10
15
  this.defaultTimeoutMs = options.defaultTimeoutMs ?? WA_DEFAULTS.IQ_TIMEOUT_MS;
11
16
  }
17
+ /**
18
+ * Rotates the signed prekey by generating a new one (next key id) and
19
+ * uploading it. Returns `shouldDigestKey: true` when the caller should
20
+ * re-run a digest validation after the rotation.
21
+ */
12
22
  async rotateSignedPreKey(timeoutMs = this.defaultTimeoutMs) {
13
23
  const [registrationInfo, currentSignedPreKey] = await Promise.all([
14
24
  this.signalStore.getRegistrationInfo(),
@@ -1,13 +1,18 @@
1
1
  import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../../protocol/constants.js';
2
2
  import { canonicalizeSignalJid } from '../../protocol/jid.js';
3
- import { decodeExactLength, parseUint } from '../api/codec.js';
4
- import { SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_REGISTRATION_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
3
+ import { decodeExactLength, parseSignalKeyBundleFromNode, parseUint } from '../api/codec.js';
4
+ import { SIGNAL_REGISTRATION_ID_LENGTH } from '../api/constants.js';
5
5
  import { registerParsedResultByRawAndCanonicalKey } from '../api/result-map.js';
6
- import { decodeNodeContentBase64OrBytes, findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
6
+ import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
7
7
  import { assertIqResult } from '../../transport/node/query.js';
8
8
  function isKeyBundleResultPreferred(result) {
9
9
  return 'bundle' in result;
10
10
  }
11
+ /**
12
+ * Fetches per-device prekey bundles required to start a Signal session.
13
+ * Use {@link fetchKeyBundle} for single-JID calls or {@link fetchKeyBundles}
14
+ * for batched encryption.
15
+ */
11
16
  export class SignalSessionSyncApi {
12
17
  constructor(options) {
13
18
  this.logger = options.logger;
@@ -16,6 +21,10 @@ export class SignalSessionSyncApi {
16
21
  options.defaultTimeoutMs ?? WA_DEFAULTS.SIGNAL_FETCH_KEY_BUNDLES_TIMEOUT_MS;
17
22
  this.hostDomain = options.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN;
18
23
  }
24
+ /**
25
+ * Convenience wrapper for {@link fetchKeyBundles} that fetches a single
26
+ * bundle and throws on server error envelopes.
27
+ */
19
28
  async fetchKeyBundle(target, timeoutMs = this.defaultTimeoutMs) {
20
29
  const results = await this.fetchKeyBundles([target], timeoutMs);
21
30
  const first = results[0];
@@ -33,6 +42,10 @@ export class SignalSessionSyncApi {
33
42
  });
34
43
  return parsed;
35
44
  }
45
+ /**
46
+ * Batched key-bundle fetch. Returns one entry per JID – either a bundle
47
+ * (success) or an error envelope. Duplicate JIDs are coalesced.
48
+ */
36
49
  async fetchKeyBundles(targets, timeoutMs = this.defaultTimeoutMs) {
37
50
  if (targets.length === 0) {
38
51
  return [];
@@ -133,57 +146,16 @@ export class SignalSessionSyncApi {
133
146
  if (!registrationNode) {
134
147
  throw new Error('key bundle user missing registration node');
135
148
  }
136
- const identityNode = findNodeChild(node, WA_NODE_TAGS.IDENTITY);
137
- if (!identityNode) {
138
- throw new Error('key bundle user missing identity node');
139
- }
140
- const signedPreKeyNode = findNodeChild(node, WA_NODE_TAGS.SKEY);
141
- if (!signedPreKeyNode) {
142
- throw new Error('key bundle user missing signed pre-key node');
143
- }
144
- const registrationBytes = decodeExactLength(registrationNode.content, 'key bundle registration', SIGNAL_REGISTRATION_ID_LENGTH);
145
- const registrationId = parseUint(registrationBytes, 'key bundle registration');
146
- const identity = decodeExactLength(identityNode.content, 'key bundle identity', SIGNAL_KEY_DATA_LENGTH);
147
- const signedIdNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.ID);
148
- const signedValueNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.VALUE);
149
- const signedSignatureNode = findNodeChild(signedPreKeyNode, WA_NODE_TAGS.SIGNATURE);
150
- if (!signedIdNode || !signedValueNode || !signedSignatureNode) {
151
- throw new Error('key bundle signed pre-key is incomplete');
152
- }
153
- const signedIdBytes = decodeExactLength(signedIdNode.content, 'key bundle skey.id', SIGNAL_KEY_ID_LENGTH);
154
- const signedValue = decodeExactLength(signedValueNode.content, 'key bundle skey.value', SIGNAL_KEY_DATA_LENGTH);
155
- const signedSignature = decodeExactLength(signedSignatureNode.content, 'key bundle skey.signature', SIGNAL_SIGNATURE_LENGTH);
156
- const preKeyNode = findNodeChild(node, WA_NODE_TAGS.KEY);
157
- let oneTimeKey;
158
- if (preKeyNode) {
159
- const preKeyIdNode = findNodeChild(preKeyNode, WA_NODE_TAGS.ID);
160
- const preKeyValueNode = findNodeChild(preKeyNode, WA_NODE_TAGS.VALUE);
161
- if (!preKeyIdNode || !preKeyValueNode) {
162
- throw new Error('key bundle one-time pre-key is incomplete');
163
- }
164
- const preKeyIdBytes = decodeExactLength(preKeyIdNode.content, 'key bundle key.id', SIGNAL_KEY_ID_LENGTH);
165
- const preKeyValue = decodeExactLength(preKeyValueNode.content, 'key bundle key.value', SIGNAL_KEY_DATA_LENGTH);
166
- oneTimeKey = {
167
- id: parseUint(preKeyIdBytes, 'key bundle key.id'),
168
- publicKey: preKeyValue
169
- };
170
- }
171
- const deviceIdentityNode = findNodeChild(node, WA_NODE_TAGS.DEVICE_IDENTITY);
172
- const deviceIdentity = deviceIdentityNode
173
- ? decodeNodeContentBase64OrBytes(deviceIdentityNode.content, 'key bundle device-identity')
174
- : undefined;
149
+ const regId = parseUint(decodeExactLength(registrationNode.content, 'key bundle registration', SIGNAL_REGISTRATION_ID_LENGTH), 'key bundle registration');
150
+ const parsed = parseSignalKeyBundleFromNode(node, 'key bundle');
175
151
  return {
176
152
  bundle: {
177
- regId: registrationId,
178
- identity,
179
- signedKey: {
180
- id: parseUint(signedIdBytes, 'key bundle skey.id'),
181
- publicKey: signedValue,
182
- signature: signedSignature
183
- },
184
- ...(oneTimeKey ? { oneTimeKey } : {})
153
+ regId,
154
+ identity: parsed.identity,
155
+ signedKey: parsed.signedKey,
156
+ ...(parsed.oneTimeKey ? { oneTimeKey: parsed.oneTimeKey } : {})
185
157
  },
186
- ...(deviceIdentity ? { deviceIdentity } : {})
158
+ ...(parsed.deviceIdentity ? { deviceIdentity: parsed.deviceIdentity } : {})
187
159
  };
188
160
  }
189
161
  }
@@ -1,4 +1,6 @@
1
- import { decodeNodeContentBase64OrBytes } from '../../transport/node/helpers.js';
1
+ import { WA_NODE_TAGS } from '../../protocol/constants.js';
2
+ import { SIGNAL_KEY_DATA_LENGTH, SIGNAL_KEY_ID_LENGTH, SIGNAL_SIGNATURE_LENGTH } from '../api/constants.js';
3
+ import { decodeNodeContentBase64OrBytes, findNodeChildrenByTags } from '../../transport/node/helpers.js';
2
4
  export function decodeExactLength(value, field, expectedLength) {
3
5
  const bytes = decodeNodeContentBase64OrBytes(value, field);
4
6
  if (bytes.byteLength !== expectedLength) {
@@ -21,3 +23,52 @@ export function parseUint(bytes, field) {
21
23
  }
22
24
  throw new Error(`${field} has invalid byte length`);
23
25
  }
26
+ /**
27
+ * Parses the shared `<identity><skey id|value|signature><key id|value><device-identity>`
28
+ * shape used by session pre-key bundles, missing pre-key device bundles, and retry
29
+ * receipt key bundles. Caller is responsible for parsing the `<registration>` node
30
+ * separately when it lives at the same level (it's omitted from retry bundles).
31
+ */
32
+ export function parseSignalKeyBundleFromNode(node, fieldPrefix) {
33
+ const [identityNode, signedKeyNode, oneTimeKeyNode, deviceIdentityNode] = findNodeChildrenByTags(node, [
34
+ WA_NODE_TAGS.IDENTITY,
35
+ WA_NODE_TAGS.SKEY,
36
+ WA_NODE_TAGS.KEY,
37
+ WA_NODE_TAGS.DEVICE_IDENTITY
38
+ ]);
39
+ if (!identityNode) {
40
+ throw new Error(`${fieldPrefix} missing identity node`);
41
+ }
42
+ if (!signedKeyNode) {
43
+ throw new Error(`${fieldPrefix} missing signed pre-key node`);
44
+ }
45
+ const identity = decodeExactLength(identityNode.content, `${fieldPrefix}.identity`, SIGNAL_KEY_DATA_LENGTH);
46
+ const [signedKeyIdNode, signedKeyValueNode, signedKeySignatureNode] = findNodeChildrenByTags(signedKeyNode, [WA_NODE_TAGS.ID, WA_NODE_TAGS.VALUE, WA_NODE_TAGS.SIGNATURE]);
47
+ if (!signedKeyIdNode || !signedKeyValueNode || !signedKeySignatureNode) {
48
+ throw new Error(`${fieldPrefix} signed pre-key is incomplete`);
49
+ }
50
+ const signedKey = {
51
+ id: parseUint(decodeExactLength(signedKeyIdNode.content, `${fieldPrefix}.skey.id`, SIGNAL_KEY_ID_LENGTH), `${fieldPrefix}.skey.id`),
52
+ publicKey: decodeExactLength(signedKeyValueNode.content, `${fieldPrefix}.skey.value`, SIGNAL_KEY_DATA_LENGTH),
53
+ signature: decodeExactLength(signedKeySignatureNode.content, `${fieldPrefix}.skey.signature`, SIGNAL_SIGNATURE_LENGTH)
54
+ };
55
+ let oneTimeKey;
56
+ if (oneTimeKeyNode) {
57
+ const [oneTimeKeyIdNode, oneTimeKeyValueNode] = findNodeChildrenByTags(oneTimeKeyNode, [
58
+ WA_NODE_TAGS.ID,
59
+ WA_NODE_TAGS.VALUE
60
+ ]);
61
+ if (!oneTimeKeyIdNode || !oneTimeKeyValueNode) {
62
+ throw new Error(`${fieldPrefix} one-time pre-key is incomplete`);
63
+ }
64
+ oneTimeKey = {
65
+ id: parseUint(decodeExactLength(oneTimeKeyIdNode.content, `${fieldPrefix}.key.id`, SIGNAL_KEY_ID_LENGTH), `${fieldPrefix}.key.id`),
66
+ publicKey: decodeExactLength(oneTimeKeyValueNode.content, `${fieldPrefix}.key.value`, SIGNAL_KEY_DATA_LENGTH)
67
+ };
68
+ }
69
+ let deviceIdentity;
70
+ if (deviceIdentityNode) {
71
+ deviceIdentity = decodeNodeContentBase64OrBytes(deviceIdentityNode.content, `${fieldPrefix}.device-identity`);
72
+ }
73
+ return { identity, signedKey, oneTimeKey, deviceIdentity };
74
+ }
@@ -1,5 +1,9 @@
1
1
  import { parseIqError } from '../../transport/node/query.js';
2
2
  export { buildMissingPreKeysFetchIq, buildPreKeyUploadIq, buildSignedPreKeyRotateIq } from '../../transport/node/builders/prekeys.js';
3
+ /**
4
+ * Extracts the numeric error code and text from a failed `prekey` upload IQ
5
+ * response. Use after a non-success status to decide whether to retry.
6
+ */
3
7
  export function parsePreKeyUploadFailure(node) {
4
8
  const error = parseIqError(node);
5
9
  return {
@@ -1,7 +1,7 @@
1
- import { hmacSign, importHmacKey, toRawPubKey, xeddsaSign, xeddsaVerify } from '../../crypto/index.js';
2
- import { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, ADV_PREFIX_HOSTED_DEVICE_SIGNATURE } from '../crypto/constants.js';
1
+ import { hmacSha256Sign, toRawPubKey, xeddsaSign, xeddsaVerify } from '../../crypto/index.js';
2
+ import { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, ADV_PREFIX_HOSTED_DEVICE_SIGNATURE } from '../attestation/constants.js';
3
3
  import { concatBytes } from '../../util/bytes.js';
4
- export { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE, ADV_PREFIX_HOSTED_DEVICE_SIGNATURE } from '../crypto/constants.js';
4
+ export { ADV_PREFIX_ACCOUNT_SIGNATURE, ADV_PREFIX_DEVICE_SIGNATURE, ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE } from '../attestation/constants.js';
5
5
  export async function verifyDeviceIdentityAccountSignature(details, accountSignature, identityPublicKey, accountSignatureKey, isHosted = false) {
6
6
  const prefix = isHosted ? ADV_PREFIX_HOSTED_ACCOUNT_SIGNATURE : ADV_PREFIX_ACCOUNT_SIGNATURE;
7
7
  const message = concatBytes([prefix, details, identityPublicKey]);
@@ -12,7 +12,6 @@ export async function generateDeviceSignature(details, identityKeyPair, accountS
12
12
  const message = concatBytes([prefix, details, identityKeyPair.pubKey, accountSignatureKey]);
13
13
  return xeddsaSign(identityKeyPair.privKey, message);
14
14
  }
15
- export async function computeAdvIdentityHmac(secretKey, details) {
16
- const key = await importHmacKey(secretKey);
17
- return hmacSign(key, details);
15
+ export function computeAdvIdentityHmac(secretKey, details) {
16
+ return hmacSha256Sign(secretKey, details);
18
17
  }
@@ -9,4 +9,7 @@ export const SENDER_KEY_FUTURE_MESSAGES_MAX = 20000;
9
9
  export const MESSAGE_KEY_LABEL = new Uint8Array([1]);
10
10
  export const CHAIN_KEY_LABEL = new Uint8Array([2]);
11
11
  export const WHISPER_GROUP_INFO = TEXT_ENCODER.encode('WhisperGroup');
12
+ export const WHISPER_MESSAGE_KEYS_INFO = TEXT_ENCODER.encode('WhisperMessageKeys');
13
+ export const WHISPER_TEXT_INFO = TEXT_ENCODER.encode('WhisperText');
14
+ export const WHISPER_RATCHET_INFO = TEXT_ENCODER.encode('WhisperRatchet');
12
15
  export const SIGNAL_PREFIX = new Uint8Array(32).fill(0xff);