zapo-js 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -179
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +79 -62
  4. package/dist/appstate/index.js +8 -7
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +246 -88
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +117 -13
  11. package/dist/auth/credentials-flow.js +207 -0
  12. package/dist/auth/pairing/WaPairingFlow.js +53 -47
  13. package/dist/auth/pairing/pairing-code-crypto.js +91 -0
  14. package/dist/client/WaClient.js +369 -460
  15. package/dist/client/WaClientFactory.js +377 -93
  16. package/dist/client/connection/WaConnectionManager.js +31 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +140 -0
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -180
  22. package/dist/client/coordinators/WaEmailCoordinator.js +64 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +130 -20
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +724 -216
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  30. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +53 -22
  31. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  32. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  33. package/dist/client/coordinators/WaProfileCoordinator.js +223 -50
  34. package/dist/client/coordinators/WaRetryCoordinator.js +256 -123
  35. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  36. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  37. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +29 -10
  38. package/dist/client/events/abprops.js +43 -0
  39. package/dist/client/events/appstate-mutation.js +133 -0
  40. package/dist/client/events/business.js +375 -0
  41. package/dist/client/events/call.js +58 -0
  42. package/dist/client/events/chatstate.js +23 -0
  43. package/dist/client/events/devices.js +15 -16
  44. package/dist/client/{dirty.js → events/dirty.js} +34 -20
  45. package/dist/client/events/group.js +13 -24
  46. package/dist/client/events/identity.js +2 -1
  47. package/dist/client/events/incoming.js +502 -0
  48. package/dist/client/events/mex-notification.js +181 -0
  49. package/dist/client/events/picture.js +33 -0
  50. package/dist/client/events/presence.js +44 -0
  51. package/dist/client/events/privacy-token.js +1 -2
  52. package/dist/client/events/receipt.js +26 -0
  53. package/dist/client/events/registration.js +42 -0
  54. package/dist/client/media.js +400 -0
  55. package/dist/client/messaging/fanout.js +9 -10
  56. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  57. package/dist/client/messaging/ignore-key.js +132 -0
  58. package/dist/client/messaging/key-protocol.js +3 -17
  59. package/dist/client/messaging/link-preview.js +159 -0
  60. package/dist/client/messaging/messages.js +671 -0
  61. package/dist/client/newsletter/admin.js +165 -0
  62. package/dist/client/newsletter/content.js +253 -0
  63. package/dist/client/newsletter/discovery.js +115 -0
  64. package/dist/client/newsletter/messaging.js +197 -0
  65. package/dist/client/newsletter/mex.js +41 -0
  66. package/dist/client/newsletter/parse.js +217 -0
  67. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  68. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  69. package/dist/client/persistence/mailbox.js +104 -0
  70. package/dist/client/tokens/cs-token.js +11 -17
  71. package/dist/crypto/core/hkdf.js +12 -12
  72. package/dist/crypto/core/index.js +9 -8
  73. package/dist/crypto/core/keys.js +1 -8
  74. package/dist/crypto/core/nonce.js +12 -12
  75. package/dist/crypto/core/primitives.js +123 -93
  76. package/dist/crypto/core/random.js +9 -9
  77. package/dist/crypto/core/xeddsa.js +59 -0
  78. package/dist/crypto/curves/Ed25519.js +32 -21
  79. package/dist/crypto/curves/X25519.js +71 -17
  80. package/dist/crypto/curves/constants.js +3 -1
  81. package/dist/crypto/math/constants.js +1 -2
  82. package/dist/crypto/math/mod.js +0 -33
  83. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +72 -55
  84. package/dist/esm/appstate/index.js +5 -5
  85. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  86. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → parsers/response-parser.js} +20 -8
  87. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +235 -76
  88. package/dist/esm/appstate/utils.js +16 -0
  89. package/dist/esm/appstate-spec.js +79 -0
  90. package/dist/esm/auth/WaAuthClient.js +114 -10
  91. package/dist/esm/auth/credentials-flow.js +202 -0
  92. package/dist/esm/auth/pairing/WaPairingFlow.js +52 -46
  93. package/dist/esm/auth/pairing/pairing-code-crypto.js +85 -0
  94. package/dist/esm/client/WaClient.js +372 -463
  95. package/dist/esm/client/WaClientFactory.js +380 -96
  96. package/dist/esm/client/connection/WaConnectionManager.js +31 -11
  97. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +136 -0
  98. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  99. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  100. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  101. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +78 -177
  102. package/dist/esm/client/coordinators/WaEmailCoordinator.js +61 -0
  103. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  104. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +132 -22
  105. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  106. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  107. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +719 -211
  108. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  109. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  110. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +54 -23
  111. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  112. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  113. package/dist/esm/client/coordinators/WaProfileCoordinator.js +226 -53
  114. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -125
  115. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  116. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  117. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +31 -12
  118. package/dist/esm/client/events/abprops.js +40 -0
  119. package/dist/esm/client/events/appstate-mutation.js +130 -0
  120. package/dist/esm/client/events/business.js +370 -0
  121. package/dist/esm/client/events/call.js +55 -0
  122. package/dist/esm/client/events/chatstate.js +20 -0
  123. package/dist/esm/client/events/devices.js +15 -16
  124. package/dist/esm/client/{dirty.js → events/dirty.js} +34 -20
  125. package/dist/esm/client/events/group.js +14 -25
  126. package/dist/esm/client/events/identity.js +2 -1
  127. package/dist/esm/client/events/incoming.js +487 -0
  128. package/dist/esm/client/events/mex-notification.js +178 -0
  129. package/dist/esm/client/events/picture.js +30 -0
  130. package/dist/esm/client/events/presence.js +41 -0
  131. package/dist/esm/client/events/privacy-token.js +1 -2
  132. package/dist/esm/client/events/receipt.js +23 -0
  133. package/dist/esm/client/events/registration.js +39 -0
  134. package/dist/esm/client/media.js +384 -0
  135. package/dist/esm/client/messaging/fanout.js +10 -11
  136. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  137. package/dist/esm/client/messaging/ignore-key.js +126 -0
  138. package/dist/esm/client/messaging/key-protocol.js +3 -17
  139. package/dist/esm/client/messaging/link-preview.js +156 -0
  140. package/dist/esm/client/messaging/messages.js +667 -0
  141. package/dist/esm/client/newsletter/admin.js +162 -0
  142. package/dist/esm/client/newsletter/content.js +249 -0
  143. package/dist/esm/client/newsletter/discovery.js +112 -0
  144. package/dist/esm/client/newsletter/messaging.js +194 -0
  145. package/dist/esm/client/newsletter/mex.js +37 -0
  146. package/dist/esm/client/newsletter/parse.js +200 -0
  147. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  148. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  149. package/dist/esm/client/persistence/mailbox.js +101 -0
  150. package/dist/esm/client/tokens/cs-token.js +12 -18
  151. package/dist/esm/crypto/core/hkdf.js +14 -14
  152. package/dist/esm/crypto/core/index.js +3 -2
  153. package/dist/esm/crypto/core/keys.js +1 -7
  154. package/dist/esm/crypto/core/nonce.js +11 -11
  155. package/dist/esm/crypto/core/primitives.js +121 -88
  156. package/dist/esm/crypto/core/random.js +8 -7
  157. package/dist/esm/crypto/core/xeddsa.js +55 -0
  158. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  159. package/dist/esm/crypto/curves/X25519.js +74 -20
  160. package/dist/esm/crypto/curves/constants.js +2 -0
  161. package/dist/esm/crypto/math/constants.js +1 -2
  162. package/dist/esm/crypto/math/mod.js +0 -32
  163. package/dist/esm/index.js +7 -2
  164. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  165. package/dist/esm/infra/log/PinoLogger.js +64 -0
  166. package/dist/esm/infra/log/types.js +4 -2
  167. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  168. package/dist/esm/infra/perf/StoreLock.js +7 -4
  169. package/dist/esm/media/constants.js +35 -2
  170. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  171. package/dist/esm/media/index.js +4 -3
  172. package/dist/esm/media/processor.js +1 -0
  173. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  174. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +84 -196
  175. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  176. package/dist/esm/message/WaMessageClient.js +46 -15
  177. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  178. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  179. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  180. package/dist/esm/message/addons/link-preview/types.js +1 -0
  181. package/dist/esm/message/context-info.js +123 -0
  182. package/dist/esm/message/crypto/addon-crypto.js +244 -0
  183. package/dist/esm/message/{icdc.js → crypto/icdc.js} +11 -13
  184. package/dist/esm/message/crypto/phash.js +133 -0
  185. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  186. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  187. package/dist/esm/message/{content.js → encode/content.js} +183 -8
  188. package/dist/esm/message/encode/media-payload.js +42 -0
  189. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  190. package/dist/esm/message/index.js +2 -2
  191. package/dist/esm/message/kinds/bot.js +111 -0
  192. package/dist/esm/message/kinds/newsletter.js +244 -0
  193. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  194. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  195. package/dist/esm/message/primitives/incoming.js +511 -0
  196. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  197. package/dist/esm/mex.js +1 -0
  198. package/dist/esm/protocol/abprops.js +169 -0
  199. package/dist/esm/protocol/appstate.js +6 -30
  200. package/dist/esm/protocol/auth.js +3 -2
  201. package/dist/esm/protocol/bot.js +77 -0
  202. package/dist/esm/protocol/browser.js +22 -0
  203. package/dist/esm/protocol/business.js +19 -0
  204. package/dist/esm/protocol/call.js +48 -0
  205. package/dist/esm/protocol/constants.js +10 -2
  206. package/dist/esm/protocol/defaults.js +3 -0
  207. package/dist/esm/protocol/email.js +30 -0
  208. package/dist/esm/protocol/index.js +1 -1
  209. package/dist/esm/protocol/jid.js +142 -11
  210. package/dist/esm/protocol/media.js +25 -12
  211. package/dist/esm/protocol/message.js +4 -1
  212. package/dist/esm/protocol/newsletter.js +61 -0
  213. package/dist/esm/protocol/nodes.js +26 -2
  214. package/dist/esm/protocol/notification.js +24 -2
  215. package/dist/esm/protocol/presence.js +13 -0
  216. package/dist/esm/protocol/status.js +6 -0
  217. package/dist/esm/retry/codec.js +5 -0
  218. package/dist/esm/retry/parse.js +20 -38
  219. package/dist/esm/retry/reason.js +6 -1
  220. package/dist/esm/retry/replay.js +131 -37
  221. package/dist/esm/retry/tracker.js +4 -8
  222. package/dist/esm/signal/api/SignalDeviceSyncApi.js +71 -21
  223. package/dist/esm/signal/api/SignalDigestSyncApi.js +15 -8
  224. package/dist/esm/signal/api/SignalIdentitySyncApi.js +13 -4
  225. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  226. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  227. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  228. package/dist/esm/signal/api/codec.js +52 -1
  229. package/dist/esm/signal/api/prekeys.js +4 -0
  230. package/dist/esm/signal/attestation/WaAdvSignature.js +17 -0
  231. package/dist/esm/signal/{crypto → attestation}/constants.js +0 -4
  232. package/dist/esm/signal/constants.js +3 -0
  233. package/dist/esm/signal/encoding.js +6 -332
  234. package/dist/esm/signal/group/SenderKeyChain.js +20 -35
  235. package/dist/esm/signal/group/SenderKeyCodec.js +5 -6
  236. package/dist/esm/signal/group/SenderKeyManager.js +37 -17
  237. package/dist/esm/signal/group/encoding.js +96 -0
  238. package/dist/esm/signal/index.js +4 -1
  239. package/dist/esm/signal/registration/encoding.js +34 -0
  240. package/dist/esm/signal/registration/keygen.js +12 -3
  241. package/dist/esm/signal/registration/utils.js +8 -2
  242. package/dist/esm/signal/session/SignalProtocol.js +129 -26
  243. package/dist/esm/signal/session/SignalRatchet.js +46 -64
  244. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  245. package/dist/esm/signal/session/SignalSession.js +14 -19
  246. package/dist/esm/signal/session/encoding.js +173 -0
  247. package/dist/esm/signal/session/resolver.js +144 -35
  248. package/dist/esm/store/cache/identity.cache.js +75 -0
  249. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  250. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  251. package/dist/esm/store/cache/session.cache.js +92 -0
  252. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  253. package/dist/esm/store/contracts/identity.store.js +1 -0
  254. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  255. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  256. package/dist/esm/store/contracts/session.store.js +1 -0
  257. package/dist/esm/store/createStore.js +129 -39
  258. package/dist/esm/store/index.js +15 -10
  259. package/dist/esm/store/locks/contact.lock.js +1 -0
  260. package/dist/esm/store/locks/device-list.lock.js +1 -0
  261. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  262. package/dist/esm/store/locks/identity.lock.js +16 -0
  263. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  264. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  265. package/dist/esm/store/locks/session.lock.js +19 -0
  266. package/dist/esm/store/locks/signal.lock.js +0 -24
  267. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  268. package/dist/esm/store/memory/auth.store.js +24 -0
  269. package/dist/esm/store/memory/contact.store.js +79 -0
  270. package/dist/esm/store/memory/device-list.store.js +103 -0
  271. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -12
  272. package/dist/esm/store/memory/identity.store.js +31 -0
  273. package/dist/esm/store/memory/message-secret.store.js +90 -0
  274. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  275. package/dist/esm/store/memory/pre-key.store.js +97 -0
  276. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  277. package/dist/esm/store/{providers/memory → memory}/retry.store.js +49 -14
  278. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  279. package/dist/esm/store/memory/session.store.js +45 -0
  280. package/dist/esm/store/memory/signal.store.js +36 -0
  281. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  282. package/dist/esm/store/noop.store.js +26 -4
  283. package/dist/esm/transport/WaComms.js +18 -8
  284. package/dist/esm/transport/WaWebSocket.js +41 -9
  285. package/dist/esm/transport/binary/constants.js +10 -4
  286. package/dist/esm/transport/binary/decoder.js +21 -15
  287. package/dist/esm/transport/binary/encoder.js +96 -21
  288. package/dist/esm/transport/binary/tokens.js +12 -12
  289. package/dist/esm/transport/index.js +7 -0
  290. package/dist/esm/transport/keepalive/WaKeepAlive.js +35 -12
  291. package/dist/esm/transport/node/WaMobileTcpSocket.js +120 -0
  292. package/dist/esm/transport/node/WaNodeOrchestrator.js +26 -13
  293. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  294. package/dist/esm/transport/node/builders/abprops.js +20 -0
  295. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  296. package/dist/esm/transport/node/builders/bot.js +38 -0
  297. package/dist/esm/transport/node/builders/business.js +30 -30
  298. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  299. package/dist/esm/transport/node/builders/community.js +53 -0
  300. package/dist/esm/transport/node/builders/device.js +11 -0
  301. package/dist/esm/transport/node/builders/email.js +66 -0
  302. package/dist/esm/transport/node/builders/global.js +1 -1
  303. package/dist/esm/transport/node/builders/group.js +114 -4
  304. package/dist/esm/transport/node/builders/media.js +2 -2
  305. package/dist/esm/transport/node/builders/message.js +83 -49
  306. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  307. package/dist/esm/transport/node/builders/offline.js +14 -0
  308. package/dist/esm/transport/node/builders/passive.js +7 -0
  309. package/dist/esm/transport/node/builders/prekeys.js +40 -43
  310. package/dist/esm/transport/node/builders/presence.js +39 -0
  311. package/dist/esm/transport/node/builders/privacy-token.js +19 -23
  312. package/dist/esm/transport/node/builders/privacy.js +6 -6
  313. package/dist/esm/transport/node/builders/profile.js +28 -8
  314. package/dist/esm/transport/node/builders/retry.js +1 -1
  315. package/dist/esm/transport/node/builders/tos.js +58 -0
  316. package/dist/esm/transport/node/builders/usync.js +51 -2
  317. package/dist/esm/transport/node/helpers.js +27 -1
  318. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  319. package/dist/esm/transport/node/mex/client.js +105 -0
  320. package/dist/esm/transport/node/query.js +17 -0
  321. package/dist/esm/transport/node/usync.js +12 -0
  322. package/dist/esm/transport/noise/WaClientPayload.js +23 -18
  323. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  324. package/dist/esm/transport/noise/WaMobileClientPayload.js +58 -0
  325. package/dist/esm/transport/noise/WaNoiseCert.js +14 -27
  326. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  327. package/dist/esm/transport/noise/WaNoiseSession.js +48 -67
  328. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  329. package/dist/esm/transport/noise/constants.js +0 -1
  330. package/dist/esm/transport/proxy.js +5 -0
  331. package/dist/esm/transport/stream/parse.js +3 -7
  332. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  333. package/dist/esm/util/async.js +4 -0
  334. package/dist/esm/util/bytes.js +37 -2
  335. package/dist/esm/util/clock.js +15 -0
  336. package/dist/esm/util/coercion.js +45 -3
  337. package/dist/esm/util/collections.js +11 -0
  338. package/dist/esm/util/index.js +2 -2
  339. package/dist/esm/util/primitives.js +19 -0
  340. package/dist/esm/util/runtime.js +5 -0
  341. package/dist/esm/version-spec.js +1 -0
  342. package/dist/index.js +31 -1
  343. package/dist/infra/log/ConsoleLogger.js +30 -6
  344. package/dist/infra/log/PinoLogger.js +64 -0
  345. package/dist/infra/log/types.js +4 -2
  346. package/dist/infra/perf/BackgroundQueue.js +55 -13
  347. package/dist/infra/perf/StoreLock.js +7 -4
  348. package/dist/media/constants.js +36 -3
  349. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  350. package/dist/media/index.js +9 -4
  351. package/dist/media/processor.js +2 -0
  352. package/dist/media/sticker/sticker-pack.js +136 -0
  353. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +87 -229
  354. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  355. package/dist/message/WaMessageClient.js +46 -15
  356. package/dist/message/addons/link-preview/builder.js +39 -0
  357. package/dist/message/addons/link-preview/detect.js +58 -0
  358. package/dist/message/addons/link-preview/fetcher.js +394 -0
  359. package/dist/message/addons/link-preview/types.js +2 -0
  360. package/dist/message/context-info.js +129 -0
  361. package/dist/message/crypto/addon-crypto.js +254 -0
  362. package/dist/message/{icdc.js → crypto/icdc.js} +11 -13
  363. package/dist/message/crypto/phash.js +136 -0
  364. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +7 -7
  365. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +21 -4
  366. package/dist/message/{content.js → encode/content.js} +200 -7
  367. package/dist/message/encode/media-payload.js +45 -0
  368. package/dist/message/{padding.js → encode/padding.js} +9 -3
  369. package/dist/message/index.js +2 -2
  370. package/dist/message/kinds/bot.js +120 -0
  371. package/dist/message/kinds/newsletter.js +248 -0
  372. package/dist/message/kinds/sticker-pack.js +34 -0
  373. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  374. package/dist/message/{incoming.js → primitives/incoming.js} +225 -38
  375. package/dist/message/primitives/peer-data-operation.js +96 -0
  376. package/dist/mex.js +6 -0
  377. package/dist/proto.js +1 -1
  378. package/dist/protocol/abprops.js +173 -0
  379. package/dist/protocol/appstate.js +7 -31
  380. package/dist/protocol/auth.js +3 -2
  381. package/dist/protocol/bot.js +81 -0
  382. package/dist/protocol/browser.js +23 -0
  383. package/dist/protocol/business.js +22 -0
  384. package/dist/protocol/call.js +51 -0
  385. package/dist/protocol/constants.js +51 -3
  386. package/dist/protocol/defaults.js +3 -0
  387. package/dist/protocol/email.js +33 -0
  388. package/dist/protocol/index.js +12 -3
  389. package/dist/protocol/jid.js +148 -11
  390. package/dist/protocol/media.js +25 -12
  391. package/dist/protocol/message.js +4 -1
  392. package/dist/protocol/newsletter.js +64 -0
  393. package/dist/protocol/nodes.js +26 -2
  394. package/dist/protocol/notification.js +25 -3
  395. package/dist/protocol/presence.js +16 -0
  396. package/dist/protocol/status.js +9 -0
  397. package/dist/retry/codec.js +5 -0
  398. package/dist/retry/parse.js +16 -34
  399. package/dist/retry/reason.js +6 -1
  400. package/dist/retry/replay.js +129 -35
  401. package/dist/retry/tracker.js +3 -7
  402. package/dist/signal/api/SignalDeviceSyncApi.js +69 -19
  403. package/dist/signal/api/SignalDigestSyncApi.js +14 -7
  404. package/dist/signal/api/SignalIdentitySyncApi.js +13 -4
  405. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  406. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  407. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  408. package/dist/signal/api/codec.js +52 -0
  409. package/dist/signal/api/prekeys.js +4 -0
  410. package/dist/signal/attestation/WaAdvSignature.js +26 -0
  411. package/dist/signal/{crypto → attestation}/constants.js +1 -5
  412. package/dist/signal/constants.js +4 -1
  413. package/dist/signal/encoding.js +5 -341
  414. package/dist/signal/group/SenderKeyChain.js +19 -34
  415. package/dist/signal/group/SenderKeyCodec.js +4 -5
  416. package/dist/signal/group/SenderKeyManager.js +36 -16
  417. package/dist/signal/group/encoding.js +101 -0
  418. package/dist/signal/index.js +13 -10
  419. package/dist/signal/registration/encoding.js +39 -0
  420. package/dist/signal/registration/keygen.js +11 -2
  421. package/dist/signal/registration/utils.js +8 -2
  422. package/dist/signal/session/SignalProtocol.js +128 -25
  423. package/dist/signal/session/SignalRatchet.js +41 -60
  424. package/dist/signal/session/SignalSerializer.js +5 -6
  425. package/dist/signal/session/SignalSession.js +13 -19
  426. package/dist/signal/session/encoding.js +183 -0
  427. package/dist/signal/session/resolver.js +144 -35
  428. package/dist/store/cache/identity.cache.js +78 -0
  429. package/dist/store/cache/privacy-token.cache.js +60 -0
  430. package/dist/store/cache/sender-key.cache.js +104 -0
  431. package/dist/store/cache/session.cache.js +95 -0
  432. package/dist/store/contracts/group-metadata.store.js +2 -0
  433. package/dist/store/contracts/identity.store.js +2 -0
  434. package/dist/store/contracts/message-secret.store.js +2 -0
  435. package/dist/store/contracts/pre-key.store.js +2 -0
  436. package/dist/store/contracts/session.store.js +2 -0
  437. package/dist/store/createStore.js +128 -38
  438. package/dist/store/index.js +22 -12
  439. package/dist/store/locks/contact.lock.js +1 -0
  440. package/dist/store/locks/device-list.lock.js +1 -0
  441. package/dist/store/locks/group-metadata.lock.js +23 -0
  442. package/dist/store/locks/identity.lock.js +19 -0
  443. package/dist/store/locks/message-secret.lock.js +20 -0
  444. package/dist/store/locks/pre-key.lock.js +30 -0
  445. package/dist/store/locks/session.lock.js +22 -0
  446. package/dist/store/locks/signal.lock.js +0 -24
  447. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  448. package/dist/store/memory/auth.store.js +28 -0
  449. package/dist/store/memory/contact.store.js +83 -0
  450. package/dist/store/memory/device-list.store.js +107 -0
  451. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +26 -14
  452. package/dist/store/memory/identity.store.js +35 -0
  453. package/dist/store/memory/message-secret.store.js +94 -0
  454. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  455. package/dist/store/memory/pre-key.store.js +101 -0
  456. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  457. package/dist/store/{providers/memory → memory}/retry.store.js +49 -14
  458. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  459. package/dist/store/memory/session.store.js +49 -0
  460. package/dist/store/memory/signal.store.js +40 -0
  461. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  462. package/dist/store/noop.store.js +27 -5
  463. package/dist/transport/WaComms.js +18 -8
  464. package/dist/transport/WaWebSocket.js +41 -9
  465. package/dist/transport/binary/constants.js +11 -5
  466. package/dist/transport/binary/decoder.js +24 -18
  467. package/dist/transport/binary/encoder.js +109 -34
  468. package/dist/transport/binary/tokens.js +12 -12
  469. package/dist/transport/index.js +19 -1
  470. package/dist/transport/keepalive/WaKeepAlive.js +35 -12
  471. package/dist/transport/node/WaMobileTcpSocket.js +124 -0
  472. package/dist/transport/node/WaNodeOrchestrator.js +25 -12
  473. package/dist/transport/node/WaNodeTransport.js +13 -0
  474. package/dist/transport/node/builders/abprops.js +23 -0
  475. package/dist/transport/node/builders/account-sync.js +7 -16
  476. package/dist/transport/node/builders/bot.js +43 -0
  477. package/dist/transport/node/builders/business.js +31 -31
  478. package/dist/transport/node/builders/chatstate.js +31 -0
  479. package/dist/transport/node/builders/community.js +59 -0
  480. package/dist/transport/node/builders/device.js +14 -0
  481. package/dist/transport/node/builders/email.js +73 -0
  482. package/dist/transport/node/builders/global.js +1 -1
  483. package/dist/transport/node/builders/group.js +121 -3
  484. package/dist/transport/node/builders/media.js +1 -1
  485. package/dist/transport/node/builders/message.js +84 -49
  486. package/dist/transport/node/builders/newsletter.js +183 -0
  487. package/dist/transport/node/builders/offline.js +17 -0
  488. package/dist/transport/node/builders/passive.js +10 -0
  489. package/dist/transport/node/builders/prekeys.js +38 -41
  490. package/dist/transport/node/builders/presence.js +43 -0
  491. package/dist/transport/node/builders/privacy-token.js +18 -22
  492. package/dist/transport/node/builders/privacy.js +5 -5
  493. package/dist/transport/node/builders/profile.js +30 -7
  494. package/dist/transport/node/builders/retry.js +1 -1
  495. package/dist/transport/node/builders/tos.js +63 -0
  496. package/dist/transport/node/builders/usync.js +52 -1
  497. package/dist/transport/node/helpers.js +28 -1
  498. package/dist/transport/node/mex/argo-decoder.js +189 -0
  499. package/dist/transport/node/mex/client.js +109 -0
  500. package/dist/transport/node/query.js +17 -0
  501. package/dist/transport/node/usync.js +13 -0
  502. package/dist/transport/noise/WaClientPayload.js +22 -17
  503. package/dist/transport/noise/WaFrameCodec.js +1 -1
  504. package/dist/transport/noise/WaMobileClientPayload.js +61 -0
  505. package/dist/transport/noise/WaNoiseCert.js +13 -26
  506. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  507. package/dist/transport/noise/WaNoiseSession.js +47 -66
  508. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  509. package/dist/transport/noise/constants.js +1 -2
  510. package/dist/transport/proxy.js +5 -0
  511. package/dist/transport/stream/parse.js +3 -7
  512. package/dist/transport/wa-web-version-fetcher.js +94 -0
  513. package/dist/types/appstate/constants.d.ts +1 -1
  514. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +29 -9
  515. package/dist/types/appstate/index.d.ts +5 -5
  516. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  517. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → parsers/response-parser.d.ts} +13 -3
  518. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  519. package/dist/types/appstate/types.d.ts +1 -1
  520. package/dist/types/appstate/utils.d.ts +17 -1
  521. package/dist/types/appstate-spec.d.ts +24 -0
  522. package/dist/types/auth/WaAuthClient.d.ts +95 -3
  523. package/dist/types/auth/credentials-flow.d.ts +21 -0
  524. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  525. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +5 -1
  526. package/dist/types/auth/types.d.ts +88 -1
  527. package/dist/types/client/WaClient.d.ts +183 -65
  528. package/dist/types/client/WaClientFactory.d.ts +40 -9
  529. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  530. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  531. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  532. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  533. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  534. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  535. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +45 -44
  536. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +40 -0
  537. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  538. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +16 -4
  539. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  540. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  541. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +65 -29
  542. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  543. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  544. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +15 -3
  545. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  546. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +28 -1
  547. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +117 -2
  548. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +23 -15
  549. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  550. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +16 -2
  551. package/dist/types/client/events/abprops.d.ts +15 -0
  552. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  553. package/dist/types/client/events/business.d.ts +10 -0
  554. package/dist/types/client/events/call.d.ts +31 -0
  555. package/dist/types/client/events/chatstate.d.ts +9 -0
  556. package/dist/types/client/events/devices.d.ts +5 -4
  557. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +7 -4
  558. package/dist/types/client/events/group.d.ts +2 -1
  559. package/dist/types/client/events/identity.d.ts +2 -1
  560. package/dist/types/client/events/incoming.d.ts +65 -0
  561. package/dist/types/client/events/mex-notification.d.ts +6 -0
  562. package/dist/types/client/events/picture.d.ts +8 -0
  563. package/dist/types/client/events/presence.d.ts +28 -0
  564. package/dist/types/client/events/receipt.d.ts +14 -0
  565. package/dist/types/client/events/registration.d.ts +18 -0
  566. package/dist/types/client/index.d.ts +1 -1
  567. package/dist/types/client/media.d.ts +65 -0
  568. package/dist/types/client/messaging/fanout.d.ts +2 -2
  569. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  570. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  571. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  572. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  573. package/dist/types/client/messaging/messages.d.ts +28 -0
  574. package/dist/types/client/newsletter/admin.d.ts +71 -0
  575. package/dist/types/client/newsletter/content.d.ts +42 -0
  576. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  577. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  578. package/dist/types/client/newsletter/mex.d.ts +14 -0
  579. package/dist/types/client/newsletter/parse.d.ts +19 -0
  580. package/dist/types/client/newsletter/types.d.ts +190 -0
  581. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +13 -2
  582. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  583. package/dist/types/client/persistence/mailbox.d.ts +12 -0
  584. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  585. package/dist/types/client/types.d.ts +926 -55
  586. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  587. package/dist/types/crypto/core/index.d.ts +3 -2
  588. package/dist/types/crypto/core/keys.d.ts +0 -4
  589. package/dist/types/crypto/core/nonce.d.ts +4 -5
  590. package/dist/types/crypto/core/primitives.d.ts +31 -20
  591. package/dist/types/crypto/core/random.d.ts +7 -1
  592. package/dist/types/crypto/core/xeddsa.d.ts +11 -0
  593. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  594. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  595. package/dist/types/crypto/curves/constants.d.ts +4 -2
  596. package/dist/types/crypto/curves/types.d.ts +0 -5
  597. package/dist/types/crypto/index.d.ts +1 -0
  598. package/dist/types/crypto/math/constants.d.ts +0 -1
  599. package/dist/types/crypto/math/mod.d.ts +0 -1
  600. package/dist/types/index.d.ts +32 -5
  601. package/dist/types/infra/log/ConsoleLogger.d.ts +19 -2
  602. package/dist/types/infra/log/PinoLogger.d.ts +56 -2
  603. package/dist/types/infra/log/types.d.ts +6 -0
  604. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  605. package/dist/types/infra/perf/StoreLock.d.ts +1 -0
  606. package/dist/types/media/constants.d.ts +9 -2
  607. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  608. package/dist/types/media/index.d.ts +7 -4
  609. package/dist/types/media/processor.d.ts +50 -0
  610. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  611. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +33 -12
  612. package/dist/types/media/transfer/conn.d.ts +7 -0
  613. package/dist/types/media/types.d.ts +10 -5
  614. package/dist/types/message/WaMessageClient.d.ts +14 -0
  615. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  616. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  617. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  618. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  619. package/dist/types/message/context-info.d.ts +66 -0
  620. package/dist/types/message/crypto/addon-crypto.d.ts +78 -0
  621. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +6 -6
  622. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  623. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  624. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  625. package/dist/types/message/encode/content.d.ts +43 -0
  626. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  627. package/dist/types/message/encode/media-payload.d.ts +12 -0
  628. package/dist/types/message/index.d.ts +2 -2
  629. package/dist/types/message/kinds/bot.d.ts +31 -0
  630. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  631. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  632. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  633. package/dist/types/message/primitives/incoming.d.ts +21 -0
  634. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  635. package/dist/types/message/types.d.ts +218 -28
  636. package/dist/types/mex.d.ts +2 -0
  637. package/dist/types/proto.d.ts +2 -2
  638. package/dist/types/protocol/abprops.d.ts +151 -0
  639. package/dist/types/protocol/appstate.d.ts +4 -49
  640. package/dist/types/protocol/auth.d.ts +2 -2
  641. package/dist/types/protocol/bot.d.ts +45 -0
  642. package/dist/types/protocol/browser.d.ts +9 -0
  643. package/dist/types/protocol/business.d.ts +21 -0
  644. package/dist/types/protocol/call.d.ts +44 -0
  645. package/dist/types/protocol/constants.d.ts +20 -3
  646. package/dist/types/protocol/defaults.d.ts +3 -0
  647. package/dist/types/protocol/email.d.ts +32 -0
  648. package/dist/types/protocol/group.d.ts +1 -1
  649. package/dist/types/protocol/index.d.ts +2 -1
  650. package/dist/types/protocol/jid.d.ts +79 -0
  651. package/dist/types/protocol/media.d.ts +21 -13
  652. package/dist/types/protocol/message.d.ts +4 -0
  653. package/dist/types/protocol/newsletter.d.ts +65 -0
  654. package/dist/types/protocol/nodes.d.ts +24 -0
  655. package/dist/types/protocol/notification.d.ts +22 -0
  656. package/dist/types/protocol/presence.d.ts +16 -0
  657. package/dist/types/protocol/status.d.ts +7 -0
  658. package/dist/types/protocol/stream.d.ts +1 -0
  659. package/dist/types/retry/codec.d.ts +5 -0
  660. package/dist/types/retry/index.d.ts +1 -1
  661. package/dist/types/retry/parse.d.ts +9 -0
  662. package/dist/types/retry/reason.d.ts +6 -1
  663. package/dist/types/retry/replay.d.ts +19 -5
  664. package/dist/types/retry/tracker.d.ts +10 -3
  665. package/dist/types/retry/types.d.ts +3 -8
  666. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  667. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +13 -0
  668. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +12 -3
  669. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  670. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  671. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  672. package/dist/types/signal/api/codec.d.ts +20 -0
  673. package/dist/types/signal/api/constants.d.ts +1 -1
  674. package/dist/types/signal/api/prekeys.d.ts +4 -0
  675. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -4
  676. package/dist/types/signal/attestation/constants.d.ts +4 -0
  677. package/dist/types/signal/constants.d.ts +7 -4
  678. package/dist/types/signal/encoding.d.ts +6 -62
  679. package/dist/types/signal/group/SenderKeyChain.d.ts +2 -2
  680. package/dist/types/signal/group/SenderKeyManager.d.ts +24 -2
  681. package/dist/types/signal/group/encoding.d.ts +25 -0
  682. package/dist/types/signal/index.d.ts +4 -1
  683. package/dist/types/signal/registration/encoding.d.ts +30 -0
  684. package/dist/types/signal/registration/keygen.d.ts +10 -0
  685. package/dist/types/signal/registration/utils.d.ts +7 -1
  686. package/dist/types/signal/session/SignalProtocol.d.ts +66 -2
  687. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  688. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  689. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  690. package/dist/types/signal/session/encoding.d.ts +28 -0
  691. package/dist/types/signal/session/resolver.d.ts +18 -2
  692. package/dist/types/signal/types.d.ts +16 -4
  693. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  694. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  695. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  696. package/dist/types/store/cache/session.cache.d.ts +23 -0
  697. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  698. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  699. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  700. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  701. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  702. package/dist/types/store/contracts/message.store.d.ts +0 -2
  703. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  704. package/dist/types/store/contracts/session.store.d.ts +14 -0
  705. package/dist/types/store/contracts/signal.store.d.ts +1 -34
  706. package/dist/types/store/createStore.d.ts +54 -2
  707. package/dist/types/store/index.d.ts +22 -13
  708. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  709. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  710. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  711. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  712. package/dist/types/store/locks/session.lock.d.ts +3 -0
  713. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  714. package/dist/types/store/memory/auth.store.d.ts +18 -0
  715. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  716. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  717. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  718. package/dist/types/store/memory/identity.store.d.ts +18 -0
  719. package/dist/types/store/memory/message-secret.store.d.ts +31 -0
  720. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  721. package/dist/types/store/memory/pre-key.store.d.ts +23 -0
  722. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  723. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +23 -4
  724. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  725. package/dist/types/store/memory/session.store.d.ts +21 -0
  726. package/dist/types/store/memory/signal.store.d.ts +16 -0
  727. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  728. package/dist/types/store/noop.store.d.ts +6 -2
  729. package/dist/types/store/types.d.ts +271 -7
  730. package/dist/types/transport/WaComms.d.ts +5 -0
  731. package/dist/types/transport/WaWebSocket.d.ts +6 -0
  732. package/dist/types/transport/binary/constants.d.ts +8 -2
  733. package/dist/types/transport/binary/decoder.d.ts +5 -0
  734. package/dist/types/transport/binary/encoder.d.ts +5 -0
  735. package/dist/types/transport/binary/tokens.d.ts +6 -6
  736. package/dist/types/transport/index.d.ts +9 -0
  737. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +11 -1
  738. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +24 -0
  739. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +11 -2
  740. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  741. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  742. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  743. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  744. package/dist/types/transport/node/builders/business.d.ts +21 -4
  745. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  746. package/dist/types/transport/node/builders/community.d.ts +17 -0
  747. package/dist/types/transport/node/builders/device.d.ts +2 -0
  748. package/dist/types/transport/node/builders/email.d.ts +11 -0
  749. package/dist/types/transport/node/builders/group.d.ts +44 -2
  750. package/dist/types/transport/node/builders/message.d.ts +11 -6
  751. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  752. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  753. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  754. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  755. package/dist/types/transport/node/builders/presence.d.ts +13 -0
  756. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  757. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  758. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  759. package/dist/types/transport/node/helpers.d.ts +3 -1
  760. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  761. package/dist/types/transport/node/mex/client.d.ts +29 -0
  762. package/dist/types/transport/node/query.d.ts +19 -1
  763. package/dist/types/transport/node/usync.d.ts +3 -0
  764. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +34 -0
  765. package/dist/types/transport/noise/WaNoiseCert.d.ts +12 -1
  766. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  767. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -1
  768. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  769. package/dist/types/transport/noise/constants.d.ts +4 -5
  770. package/dist/types/transport/proxy.d.ts +5 -0
  771. package/dist/types/transport/types.d.ts +15 -0
  772. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  773. package/dist/types/util/async.d.ts +4 -0
  774. package/dist/types/util/bytes.d.ts +36 -1
  775. package/dist/types/util/clock.d.ts +6 -0
  776. package/dist/types/util/coercion.d.ts +25 -0
  777. package/dist/types/util/collections.d.ts +8 -0
  778. package/dist/types/util/index.d.ts +2 -2
  779. package/dist/types/util/primitives.d.ts +11 -0
  780. package/dist/types/util/runtime.d.ts +5 -0
  781. package/dist/types/version-spec.d.ts +1 -0
  782. package/dist/util/async.js +4 -0
  783. package/dist/util/bytes.js +37 -2
  784. package/dist/util/clock.js +18 -0
  785. package/dist/util/coercion.js +48 -3
  786. package/dist/util/collections.js +12 -0
  787. package/dist/util/index.js +7 -1
  788. package/dist/util/primitives.js +20 -0
  789. package/dist/util/runtime.js +5 -0
  790. package/dist/version-spec.js +5 -0
  791. package/package.json +37 -11
  792. package/spec/appstate/index.d.ts +188 -0
  793. package/spec/appstate/index.js +850 -0
  794. package/spec/mex/index.d.ts +4172 -0
  795. package/spec/mex/index.js +261 -0
  796. package/spec/proto/index.d.ts +16305 -0
  797. package/spec/proto/index.js +1 -0
  798. package/spec/version/index.d.ts +4 -0
  799. package/spec/version/index.js +9 -0
  800. package/spec/version/version.json +3 -0
  801. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  802. package/dist/auth/pairing/WaPairingCodeCrypto.js +0 -77
  803. package/dist/auth/pairing/constants.js +0 -5
  804. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  805. package/dist/client/events/chat.js +0 -227
  806. package/dist/client/incoming.js +0 -269
  807. package/dist/client/mailbox.js +0 -50
  808. package/dist/client/messages.js +0 -228
  809. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  810. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +0 -73
  811. package/dist/esm/auth/pairing/constants.js +0 -2
  812. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  813. package/dist/esm/client/events/chat.js +0 -224
  814. package/dist/esm/client/incoming.js +0 -260
  815. package/dist/esm/client/mailbox.js +0 -47
  816. package/dist/esm/client/messages.js +0 -224
  817. package/dist/esm/media/WaMediaCrypto.js +0 -304
  818. package/dist/esm/message/addon-crypto.js +0 -59
  819. package/dist/esm/message/incoming.js +0 -325
  820. package/dist/esm/message/phash.js +0 -27
  821. package/dist/esm/signal/crypto/WaAdvSignature.js +0 -64
  822. package/dist/esm/store/locks/participants.lock.js +0 -20
  823. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  824. package/dist/esm/store/providers/memory/device-list.store.js +0 -64
  825. package/dist/esm/store/providers/memory/signal.store.js +0 -199
  826. package/dist/esm/transport/node/builders/index.js +0 -11
  827. package/dist/media/WaMediaCrypto.js +0 -308
  828. package/dist/message/addon-crypto.js +0 -65
  829. package/dist/message/phash.js +0 -30
  830. package/dist/signal/crypto/WaAdvSignature.js +0 -76
  831. package/dist/store/locks/participants.lock.js +0 -23
  832. package/dist/store/providers/memory/contact.store.js +0 -32
  833. package/dist/store/providers/memory/device-list.store.js +0 -68
  834. package/dist/store/providers/memory/signal.store.js +0 -203
  835. package/dist/transport/node/builders/index.js +0 -51
  836. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -66
  837. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  838. package/dist/types/auth/pairing/constants.d.ts +0 -2
  839. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  840. package/dist/types/client/events/chat.d.ts +0 -3
  841. package/dist/types/client/history-sync.d.ts +0 -20
  842. package/dist/types/client/incoming.d.ts +0 -37
  843. package/dist/types/client/mailbox.d.ts +0 -10
  844. package/dist/types/client/messages.d.ts +0 -16
  845. package/dist/types/client/messaging/participants.d.ts +0 -13
  846. package/dist/types/media/WaMediaCrypto.d.ts +0 -13
  847. package/dist/types/media/conn.d.ts +0 -3
  848. package/dist/types/message/addon-crypto.d.ts +0 -25
  849. package/dist/types/message/content.d.ts +0 -12
  850. package/dist/types/message/incoming.d.ts +0 -18
  851. package/dist/types/signal/crypto/constants.d.ts +0 -5
  852. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  853. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  854. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  855. package/dist/types/store/providers/memory/signal.store.d.ts +0 -58
  856. package/dist/types/transport/node/builders/index.d.ts +0 -11
  857. package/proto/index.d.ts +0 -10903
  858. package/proto/index.js +0 -1
  859. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  860. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  861. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  862. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  863. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,92 +1,125 @@
1
- /**
2
- * Low-level crypto primitives using WebCrypto API
3
- */
4
- import { createHash, webcrypto } from 'node:crypto';
5
- import { EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
6
- async function digestBytes(algorithm, value) {
7
- return toBytesView(await webcrypto.subtle.digest(algorithm, value));
8
- }
9
- // ============================================
10
- // Hash functions
11
- // ============================================
12
- export async function sha256(value) {
13
- return digestBytes('SHA-256', value);
14
- }
15
- export async function sha1(value) {
16
- return digestBytes('SHA-1', value);
17
- }
18
- export async function sha512(value) {
19
- return digestBytes('SHA-512', value);
20
- }
1
+ import { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ import { concatBytes, EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
4
+ const AES_GCM_TAG_LENGTH = 16;
5
+ const pbkdf2Async = promisify(pbkdf2);
6
+ function feed(target, input) {
7
+ if (Array.isArray(input)) {
8
+ for (let i = 0; i < input.length; i += 1) {
9
+ target.update(input[i]);
10
+ }
11
+ }
12
+ else {
13
+ target.update(input);
14
+ }
15
+ return target;
16
+ }
17
+ /** Computes the SHA-1 digest of `value`. Accepts a single chunk or array of chunks. */
18
+ export function sha1(value) {
19
+ return toBytesView(feed(createHash('sha1'), value).digest());
20
+ }
21
+ /** Computes the SHA-256 digest of `value`. */
22
+ export function sha256(value) {
23
+ return toBytesView(feed(createHash('sha256'), value).digest());
24
+ }
25
+ /** Computes the SHA-512 digest of `value`. */
26
+ export function sha512(value) {
27
+ return toBytesView(feed(createHash('sha512'), value).digest());
28
+ }
29
+ /** Computes the MD5 digest of `input`, accepting a string or raw chunks. */
21
30
  export function md5Bytes(input) {
22
- return toBytesView(createHash('md5').update(input).digest());
23
- }
24
- // ============================================
25
- // AES-GCM (for Noise protocol)
26
- // ============================================
27
- export async function importAesGcmKey(raw, usages) {
28
- return webcrypto.subtle.importKey('raw', raw, 'AES-GCM', false, usages);
29
- }
30
- export async function aesGcmEncrypt(key, nonce, plaintext, aad = EMPTY_BYTES) {
31
- return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, plaintext));
32
- }
33
- export async function aesGcmDecrypt(key, nonce, ciphertext, aad = EMPTY_BYTES) {
34
- return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, additionalData: aad }, key, ciphertext));
35
- }
36
- // ============================================
37
- // AES-CBC (for Signal protocol)
38
- // ============================================
39
- export async function importAesCbcKey(keyBytes) {
40
- return webcrypto.subtle.importKey('raw', keyBytes, { name: 'AES-CBC', length: 256 }, false, [
41
- 'encrypt',
42
- 'decrypt'
43
- ]);
31
+ const hash = createHash('md5');
32
+ if (typeof input === 'string') {
33
+ hash.update(input);
34
+ }
35
+ else {
36
+ feed(hash, input);
37
+ }
38
+ return toBytesView(hash.digest());
44
39
  }
45
- export async function aesCbcEncrypt(key, iv, plaintext) {
46
- return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CBC', iv }, key, plaintext));
47
- }
48
- export async function aesCbcDecrypt(key, iv, ciphertext) {
49
- return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CBC', iv }, key, ciphertext));
50
- }
51
- // ============================================
52
- // HMAC-SHA256 (for Signal protocol)
53
- // ============================================
54
- export async function importHmacKey(keyBytes) {
55
- return webcrypto.subtle.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-256' }, false, [
56
- 'sign'
57
- ]);
58
- }
59
- export async function importHmacSha512Key(keyBytes) {
60
- return webcrypto.subtle.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-512' }, false, [
61
- 'sign'
62
- ]);
63
- }
64
- export async function hmacSign(key, data) {
65
- return toBytesView(await webcrypto.subtle.sign('HMAC', key, data));
66
- }
67
- // ============================================
68
- // PBKDF2 → AES-CTR (for pairing code crypto)
69
- // ============================================
70
- export async function pbkdf2DeriveAesCtrKey(password, salt, iterations) {
71
- const imported = await webcrypto.subtle.importKey('raw', password, { name: 'PBKDF2' }, false, [
72
- 'deriveKey'
73
- ]);
74
- return webcrypto.subtle.deriveKey({
75
- name: 'PBKDF2',
76
- hash: 'SHA-256',
77
- salt,
78
- iterations
79
- }, imported, {
80
- name: 'AES-CTR',
81
- length: 256
82
- }, false, ['encrypt', 'decrypt']);
83
- }
84
- // ============================================
85
- // AES-CTR (for pairing code crypto)
86
- // ============================================
87
- export async function aesCtrEncrypt(key, counter, plaintext) {
88
- return toBytesView(await webcrypto.subtle.encrypt({ name: 'AES-CTR', counter, length: 64 }, key, plaintext));
40
+ /**
41
+ * AES-256-GCM encrypt. The 16-byte auth tag is appended to the ciphertext.
42
+ * Pass `aad` when binding the ciphertext to associated data.
43
+ */
44
+ export function aesGcmEncrypt(key, nonce, plaintext, aad = EMPTY_BYTES) {
45
+ const cipher = createCipheriv('aes-256-gcm', key, nonce);
46
+ if (aad.length > 0) {
47
+ cipher.setAAD(aad);
48
+ }
49
+ const head = cipher.update(plaintext);
50
+ const tail = cipher.final();
51
+ const tag = cipher.getAuthTag();
52
+ return concatBytes([head, tail, tag]);
89
53
  }
90
- export async function aesCtrDecrypt(key, counter, ciphertext) {
91
- return toBytesView(await webcrypto.subtle.decrypt({ name: 'AES-CTR', counter, length: 64 }, key, ciphertext));
54
+ /**
55
+ * AES-256-GCM decrypt. Expects the 16-byte auth tag appended to the
56
+ * ciphertext (matching {@link aesGcmEncrypt}'s layout). Throws on auth failure.
57
+ */
58
+ export function aesGcmDecrypt(key, nonce, ciphertext, aad = EMPTY_BYTES) {
59
+ const tagOffset = ciphertext.length - AES_GCM_TAG_LENGTH;
60
+ const tag = ciphertext.subarray(tagOffset);
61
+ const ct = ciphertext.subarray(0, tagOffset);
62
+ const decipher = createDecipheriv('aes-256-gcm', key, nonce);
63
+ if (aad.length > 0) {
64
+ decipher.setAAD(aad);
65
+ }
66
+ decipher.setAuthTag(tag);
67
+ const head = decipher.update(ct);
68
+ const tail = decipher.final();
69
+ if (tail.length === 0) {
70
+ return toBytesView(head);
71
+ }
72
+ return concatBytes([head, tail]);
73
+ }
74
+ /** AES-256-CBC encrypt with PKCS#7 padding (default Node behavior). */
75
+ export function aesCbcEncrypt(key, iv, plaintext) {
76
+ const cipher = createCipheriv('aes-256-cbc', key, iv);
77
+ const head = cipher.update(plaintext);
78
+ const tail = cipher.final();
79
+ if (tail.length === 0) {
80
+ return toBytesView(head);
81
+ }
82
+ return concatBytes([head, tail]);
83
+ }
84
+ /** AES-256-CBC decrypt with PKCS#7 padding. */
85
+ export function aesCbcDecrypt(key, iv, ciphertext) {
86
+ const decipher = createDecipheriv('aes-256-cbc', key, iv);
87
+ const head = decipher.update(ciphertext);
88
+ const tail = decipher.final();
89
+ if (tail.length === 0) {
90
+ return toBytesView(head);
91
+ }
92
+ return concatBytes([head, tail]);
93
+ }
94
+ /** AES-256-CTR encrypt with the given 16-byte counter. */
95
+ export function aesCtrEncrypt(key, counter, plaintext) {
96
+ const cipher = createCipheriv('aes-256-ctr', key, counter);
97
+ const head = cipher.update(plaintext);
98
+ const tail = cipher.final();
99
+ if (tail.length === 0) {
100
+ return toBytesView(head);
101
+ }
102
+ return concatBytes([head, tail]);
103
+ }
104
+ /** AES-256-CTR decrypt with the given 16-byte counter. */
105
+ export function aesCtrDecrypt(key, counter, ciphertext) {
106
+ const decipher = createDecipheriv('aes-256-ctr', key, counter);
107
+ const head = decipher.update(ciphertext);
108
+ const tail = decipher.final();
109
+ if (tail.length === 0) {
110
+ return toBytesView(head);
111
+ }
112
+ return concatBytes([head, tail]);
113
+ }
114
+ /** Computes the HMAC-SHA-256 MAC of `data` keyed by `key`. */
115
+ export function hmacSha256Sign(key, data) {
116
+ return toBytesView(feed(createHmac('sha256', key), data).digest());
117
+ }
118
+ /** Computes the HMAC-SHA-512 MAC of `data` keyed by `key`. */
119
+ export function hmacSha512Sign(key, data) {
120
+ return toBytesView(feed(createHmac('sha512', key), data).digest());
121
+ }
122
+ /** PBKDF2 over HMAC-SHA-256 – derives `length` bytes from `password` + `salt`. */
123
+ export async function pbkdf2Sha256(password, salt, iterations, length) {
124
+ return toBytesView(await pbkdf2Async(password, salt, iterations, length, 'sha256'));
92
125
  }
@@ -1,11 +1,9 @@
1
1
  import { randomBytes, randomFill, randomInt } from 'node:crypto';
2
2
  import { promisify } from 'node:util';
3
- import { toBytesView } from '../../util/bytes.js';
4
- const randomBytesAsyncImpl = promisify(randomBytes);
5
- const randomIntAsyncImpl = promisify(randomInt);
6
- export async function randomBytesAsync(size) {
7
- return toBytesView(await randomBytesAsyncImpl(size));
8
- }
3
+ /**
4
+ * Cryptographically fills `target` (optionally a sub-range) with random bytes.
5
+ * Resolves to the same `target` reference for chaining.
6
+ */
9
7
  export async function randomFillAsync(target, offset, size) {
10
8
  await new Promise((resolve, reject) => {
11
9
  const onDone = (error) => {
@@ -27,4 +25,7 @@ export async function randomFillAsync(target, offset, size) {
27
25
  });
28
26
  return target;
29
27
  }
30
- export const randomIntAsync = randomIntAsyncImpl;
28
+ /** Returns a cryptographically secure integer in `[min, max)`. */
29
+ export const randomIntAsync = promisify(randomInt);
30
+ /** Returns `size` cryptographically secure random bytes. */
31
+ export const randomBytesAsync = promisify(randomBytes);
@@ -0,0 +1,55 @@
1
+ import { sha512 } from '../core/primitives.js';
2
+ import { randomBytesAsync } from '../core/random.js';
3
+ import { Ed25519 } from '../curves/Ed25519.js';
4
+ import { clampCurvePrivateKeyInPlace, montgomeryToEdwardsPublic } from '../curves/X25519.js';
5
+ import { encodeExtendedPoint, scalarMultBase } from '../math/edwards.js';
6
+ import { bigIntToBytesLE, bytesToBigIntLE } from '../math/le.js';
7
+ import { modGroup } from '../math/mod.js';
8
+ import { assertByteLength, concatBytes } from '../../util/bytes.js';
9
+ const PREFIX_SIGNATURE_RANDOM = new Uint8Array([
10
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
11
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
12
+ ]);
13
+ /**
14
+ * Verifies an XEdDSA signature over `message` against an X25519 (Montgomery)
15
+ * public key, converting to the Edwards form internally. Returns `false`
16
+ * on shape mismatch instead of throwing.
17
+ */
18
+ export async function xeddsaVerify(curvePublicKey, message, signature) {
19
+ if (signature.length !== 64) {
20
+ return false;
21
+ }
22
+ if ((signature[63] & 0x60) !== 0) {
23
+ return false;
24
+ }
25
+ const lastByteIndex = 63;
26
+ const originalLastByte = signature[lastByteIndex];
27
+ const signBit = originalLastByte & 0x80;
28
+ signature[lastByteIndex] = originalLastByte & 0x7f;
29
+ const edPublic = montgomeryToEdwardsPublic(curvePublicKey, signBit);
30
+ try {
31
+ return await Ed25519.verify(message, signature, edPublic);
32
+ }
33
+ finally {
34
+ signature[lastByteIndex] = originalLastByte;
35
+ }
36
+ }
37
+ /**
38
+ * Signs `message` with an X25519 (Montgomery) private key using the XEdDSA
39
+ * construction. Returns a 64-byte signature.
40
+ */
41
+ export async function xeddsaSign(privateKey, message) {
42
+ assertByteLength(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
43
+ const clampedPrivateKey = clampCurvePrivateKeyInPlace(privateKey);
44
+ const privateScalar = bytesToBigIntLE(clampedPrivateKey);
45
+ const encodedPublic = encodeExtendedPoint(scalarMultBase(privateScalar));
46
+ const pubKeySignBit = encodedPublic[31] & 0x80;
47
+ const randomSuffix = await randomBytesAsync(64);
48
+ const r = modGroup(bytesToBigIntLE(sha512([PREFIX_SIGNATURE_RANDOM, clampedPrivateKey, message, randomSuffix])));
49
+ const encodedR = encodeExtendedPoint(scalarMultBase(r));
50
+ const h = modGroup(bytesToBigIntLE(sha512([encodedR, encodedPublic, message])));
51
+ const s = modGroup(r + h * privateScalar);
52
+ const encodedS = bigIntToBytesLE(s, 32);
53
+ encodedS[31] = (encodedS[31] & 0x7f) | pubKeySignBit;
54
+ return concatBytes([encodedR, encodedS]);
55
+ }
@@ -1,37 +1,48 @@
1
- import { webcrypto } from 'node:crypto';
2
- import { ED25519_PKCS8_PREFIX } from '../curves/constants.js';
1
+ import { createPrivateKey, createPublicKey, generateKeyPair, sign as nodeSign, verify as nodeVerify } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ import { ED25519_PKCS8_PREFIX, ED25519_SPKI_PREFIX } from '../curves/constants.js';
3
4
  import { pkcs8FromRawPrivate } from '../curves/types.js';
4
- import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
5
+ import { assertByteLength, concatBytes, decodeBase64Url, toBytesView } from '../../util/bytes.js';
6
+ const generateKeyPairAsync = promisify(generateKeyPair);
7
+ const signAsync = promisify(nodeSign);
8
+ const verifyAsync = promisify(nodeVerify);
9
+ function ed25519PrivateKeyObject(privKey) {
10
+ return createPrivateKey({
11
+ key: pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey),
12
+ format: 'der',
13
+ type: 'pkcs8'
14
+ });
15
+ }
16
+ function ed25519PublicKeyObject(pubKey) {
17
+ return createPublicKey({
18
+ key: concatBytes([ED25519_SPKI_PREFIX, pubKey]),
19
+ format: 'der',
20
+ type: 'spki'
21
+ });
22
+ }
23
+ /**
24
+ * Ed25519 sign/verify backed by Node's native primitives. All operations are
25
+ * async to keep crypto off the event loop.
26
+ */
5
27
  export class Ed25519 {
28
+ /** Generates a fresh Ed25519 key pair. */
6
29
  static async generateKeyPair() {
7
- const keys = (await webcrypto.subtle.generateKey({ name: 'Ed25519' }, true, [
8
- 'sign',
9
- 'verify'
10
- ]));
11
- const privateJwk = await webcrypto.subtle.exportKey('jwk', keys.privateKey);
12
- return {
13
- pubKey: decodeBase64Url(privateJwk.x, 'ed25519 public key'),
14
- privKey: decodeBase64Url(privateJwk.d, 'ed25519 private key')
15
- };
16
- }
17
- static async keyPairFromPrivateKey(privKey) {
18
- assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
19
- const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, true, ['sign']);
20
- const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
30
+ const { privateKey } = await generateKeyPairAsync('ed25519');
31
+ const jwk = privateKey.export({ format: 'jwk' });
21
32
  return {
22
- pubKey: decodeBase64Url(privateJwk.x, 'ed25519 public key'),
23
- privKey: decodeBase64Url(privateJwk.d, 'ed25519 private key')
33
+ pubKey: decodeBase64Url(jwk.x, 'ed25519 public key'),
34
+ privKey: decodeBase64Url(jwk.d, 'ed25519 private key')
24
35
  };
25
36
  }
37
+ /** Signs `message` with a 32-byte Ed25519 private key. Returns a 64-byte signature. */
26
38
  static async sign(message, privKey) {
27
39
  assertByteLength(privKey, 32, 'ed25519 private key must be 32 bytes');
28
- const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(ED25519_PKCS8_PREFIX, privKey), { name: 'Ed25519' }, false, ['sign']);
29
- const signature = await webcrypto.subtle.sign('Ed25519', privateKey, message);
30
- return toBytesView(signature);
40
+ const sig = await signAsync(null, message, ed25519PrivateKeyObject(privKey));
41
+ return toBytesView(sig);
31
42
  }
43
+ /** Verifies an Ed25519 `signature` over `message` against a 32-byte public key. */
32
44
  static async verify(message, signature, pubKey) {
33
45
  assertByteLength(pubKey, 32, 'ed25519 public key must be 32 bytes');
34
- const publicKey = await webcrypto.subtle.importKey('raw', pubKey, { name: 'Ed25519' }, false, ['verify']);
35
- return webcrypto.subtle.verify('Ed25519', publicKey, signature, message);
46
+ return verifyAsync(null, message, ed25519PublicKeyObject(pubKey), signature);
36
47
  }
37
48
  }
@@ -1,9 +1,30 @@
1
- import { webcrypto } from 'node:crypto';
2
- import { X25519_PKCS8_PREFIX } from '../curves/constants.js';
1
+ import { createPrivateKey, createPublicKey, diffieHellman, generateKeyPair, generateKeyPairSync } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ const generateKeyPairAsync = promisify(generateKeyPair);
4
+ import { X25519_PKCS8_PREFIX, X25519_SPKI_PREFIX } from '../curves/constants.js';
3
5
  import { pkcs8FromRawPrivate } from '../curves/types.js';
4
6
  import { FE_ONE } from '../math/constants.js';
5
7
  import { fe, feAdd, feFromBytes, feInv, feMul, fePack, feSub } from '../math/fe.js';
6
- import { assertByteLength, decodeBase64Url, toBytesView } from '../../util/bytes.js';
8
+ import { assertByteLength, concatBytes, decodeBase64Url, toBytesView } from '../../util/bytes.js';
9
+ const diffieHellmanWithCallback = diffieHellman;
10
+ let diffieHellmanAsync = null;
11
+ let diffieHellmanAsyncProbed = false;
12
+ function resolveDiffieHellmanAsync() {
13
+ if (diffieHellmanAsyncProbed)
14
+ return diffieHellmanAsync;
15
+ diffieHellmanAsyncProbed = true;
16
+ try {
17
+ const probe = generateKeyPairSync('x25519');
18
+ const result = diffieHellman({ privateKey: probe.privateKey, publicKey: probe.publicKey }, () => { });
19
+ if (result === undefined) {
20
+ diffieHellmanAsync = promisify(diffieHellmanWithCallback);
21
+ }
22
+ }
23
+ catch {
24
+ // callback form not supported by this runtime; stay on sync path
25
+ }
26
+ return diffieHellmanAsync;
27
+ }
7
28
  // Pre-allocated temps for montgomeryToEdwardsPublic (safe: single-threaded)
8
29
  const _mx = fe();
9
30
  const _m1 = fe();
@@ -19,6 +40,10 @@ function isFieldPMinus1(b) {
19
40
  return false;
20
41
  return true;
21
42
  }
43
+ /**
44
+ * Applies the standard curve25519 scalar clamping in place and returns the
45
+ * same buffer for chaining. Throws on non-32-byte inputs.
46
+ */
22
47
  export function clampCurvePrivateKeyInPlace(privateKey) {
23
48
  assertByteLength(privateKey, 32, `invalid curve25519 private key length ${privateKey.length}`);
24
49
  privateKey[0] &= 248;
@@ -26,6 +51,11 @@ export function clampCurvePrivateKeyInPlace(privateKey) {
26
51
  privateKey[31] |= 64;
27
52
  return privateKey;
28
53
  }
54
+ /**
55
+ * Converts a 32-byte Montgomery (curve25519) public key to its Edwards form
56
+ * for XEdDSA verification, applying the supplied `signBit` (`0x80` mask).
57
+ * Throws on the field-`p-1` low-order point.
58
+ */
29
59
  export function montgomeryToEdwardsPublic(curvePublicKey, signBit) {
30
60
  assertByteLength(curvePublicKey, 32, `invalid curve25519 public key length ${curvePublicKey.length}`);
31
61
  if (isFieldPMinus1(curvePublicKey)) {
@@ -41,34 +71,58 @@ export function montgomeryToEdwardsPublic(curvePublicKey, signBit) {
41
71
  encoded[31] = (encoded[31] & 0x7f) | (signBit & 0x80);
42
72
  return encoded;
43
73
  }
74
+ function x25519PrivateKeyObject(privKey) {
75
+ return createPrivateKey({
76
+ key: pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey),
77
+ format: 'der',
78
+ type: 'pkcs8'
79
+ });
80
+ }
81
+ function x25519PublicKeyObject(pubKey) {
82
+ return createPublicKey({
83
+ key: concatBytes([X25519_SPKI_PREFIX, pubKey]),
84
+ format: 'der',
85
+ type: 'spki'
86
+ });
87
+ }
88
+ /**
89
+ * X25519 key-pair generation and Diffie-Hellman scalar multiplication
90
+ * backed by Node's native primitives.
91
+ */
44
92
  export class X25519 {
93
+ /** Generates a fresh X25519 key pair. */
45
94
  static async generateKeyPair() {
46
- const keys = (await webcrypto.subtle.generateKey({ name: 'X25519' }, true, [
47
- 'deriveBits'
48
- ]));
49
- const privateJwk = await webcrypto.subtle.exportKey('jwk', keys.privateKey);
95
+ const { privateKey } = await generateKeyPairAsync('x25519');
96
+ const jwk = privateKey.export({ format: 'jwk' });
50
97
  return {
51
- pubKey: decodeBase64Url(privateJwk.x, 'x25519 public key'),
52
- privKey: decodeBase64Url(privateJwk.d, 'x25519 private key')
98
+ pubKey: decodeBase64Url(jwk.x, 'x25519 public key'),
99
+ privKey: decodeBase64Url(jwk.d, 'x25519 private key')
53
100
  };
54
101
  }
55
- static async keyPairFromPrivateKey(privKey) {
102
+ /** Derives the matching public key from a 32-byte X25519 private key. */
103
+ static keyPairFromPrivateKey(privKey) {
56
104
  assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
57
- const privateKey = await webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, true, ['deriveBits']);
58
- const privateJwk = await webcrypto.subtle.exportKey('jwk', privateKey);
105
+ const jwk = x25519PrivateKeyObject(privKey).export({ format: 'jwk' });
59
106
  return {
60
- pubKey: decodeBase64Url(privateJwk.x, 'x25519 public key'),
61
- privKey: decodeBase64Url(privateJwk.d, 'x25519 private key')
107
+ pubKey: decodeBase64Url(jwk.x, 'x25519 public key'),
108
+ privKey
62
109
  };
63
110
  }
111
+ /**
112
+ * Computes the X25519 shared secret between `privKey` and `pubKey`.
113
+ * Uses Node's async DH path when supported, otherwise falls back to sync.
114
+ */
64
115
  static async scalarMult(privKey, pubKey) {
65
116
  assertByteLength(privKey, 32, 'x25519 private key must be 32 bytes');
66
117
  assertByteLength(pubKey, 32, 'x25519 public key must be 32 bytes');
67
- const [privateKey, publicKey] = await Promise.all([
68
- webcrypto.subtle.importKey('pkcs8', pkcs8FromRawPrivate(X25519_PKCS8_PREFIX, privKey), { name: 'X25519' }, false, ['deriveBits']),
69
- webcrypto.subtle.importKey('raw', pubKey, { name: 'X25519' }, false, [])
70
- ]);
71
- const sharedBits = await webcrypto.subtle.deriveBits({ name: 'X25519', public: publicKey }, privateKey, 256);
72
- return toBytesView(sharedBits);
118
+ const opts = {
119
+ privateKey: x25519PrivateKeyObject(privKey),
120
+ publicKey: x25519PublicKeyObject(pubKey)
121
+ };
122
+ const dhAsync = resolveDiffieHellmanAsync();
123
+ if (dhAsync) {
124
+ return toBytesView(await dhAsync(opts));
125
+ }
126
+ return toBytesView(diffieHellman(opts));
73
127
  }
74
128
  }
@@ -1,3 +1,5 @@
1
1
  import { hexToBytes } from '../../util/bytes.js';
2
2
  export const X25519_PKCS8_PREFIX = hexToBytes('302e020100300506032b656e04220420');
3
+ export const X25519_SPKI_PREFIX = hexToBytes('302a300506032b656e032100');
3
4
  export const ED25519_PKCS8_PREFIX = hexToBytes('302e020100300506032b657004220420');
5
+ export const ED25519_SPKI_PREFIX = hexToBytes('302a300506032b6570032100');
@@ -1,8 +1,7 @@
1
- import { fe, feFromBigInt } from '../math/fe.js';
1
+ import { feFromBigInt } from '../math/fe.js';
2
2
  export const FIELD_P = (1n << 255n) - 19n;
3
3
  export const GROUP_L = (1n << 252n) + 27742317777372353535851937790883648493n;
4
4
  export const FE_TWO_D = feFromBigInt(16295367250680780974490674513165176452449235426866156013048779062215315747161n);
5
- export const FE_ZERO = fe();
6
5
  export const FE_ONE = feFromBigInt(1n);
7
6
  export const BASE_POINT = Object.freeze({
8
7
  x: feFromBigInt(15112221349535400772501151409588531511454012693041857206046113283949847762202n),
@@ -1,5 +1,4 @@
1
1
  import { FIELD_P, GROUP_L } from '../math/constants.js';
2
- import { fe, feFromBigInt, feInv, feToBigInt } from '../math/fe.js';
3
2
  export function mod(value, modulus = FIELD_P) {
4
3
  const remainder = value % modulus;
5
4
  return remainder >= 0n ? remainder : remainder + modulus;
@@ -7,34 +6,3 @@ export function mod(value, modulus = FIELD_P) {
7
6
  export function modGroup(value) {
8
7
  return mod(value, GROUP_L);
9
8
  }
10
- export function modInv(value, modulus = FIELD_P) {
11
- if (value === 0n) {
12
- throw new Error('field inversion by zero');
13
- }
14
- if (modulus === FIELD_P) {
15
- return fieldInv(value);
16
- }
17
- return modPow(value, modulus - 2n, modulus);
18
- }
19
- function fieldInv(x) {
20
- const a = feFromBigInt(mod(x));
21
- const out = fe();
22
- feInv(out, a);
23
- return feToBigInt(out);
24
- }
25
- function modPow(base, exponent, modulus) {
26
- if (modulus <= 0n) {
27
- throw new Error('modulus must be positive');
28
- }
29
- let result = 1n;
30
- let current = ((base % modulus) + modulus) % modulus;
31
- let e = exponent;
32
- while (e > 0n) {
33
- if ((e & 1n) === 1n) {
34
- result = (result * current) % modulus;
35
- }
36
- current = (current * current) % modulus;
37
- e >>= 1n;
38
- }
39
- return result;
40
- }
package/dist/esm/index.js CHANGED
@@ -1,6 +1,11 @@
1
1
  export { WaClient } from './client/index.js';
2
+ export { parseUsyncResultEnvelope } from './transport/node/builders/usync.js';
3
+ export { getContentType, resolveMessageTarget } from './message/encode/content.js';
4
+ export { fetchLatestWaWebVersion } from './transport/wa-web-version-fetcher.js';
2
5
  export { ConsoleLogger } from './infra/log/ConsoleLogger.js';
3
6
  export { PinoLogger, createPinoLogger } from './infra/log/PinoLogger.js';
4
- export { createStore } from './store/index.js';
5
- export { getLoginIdentity, getWaCompanionPlatformId, getWaMediaHkdfInfo, isGroupJid, normalizeDeviceJid, normalizeRecipientJid, parsePhoneJid, parseSignalAddressFromJid, splitJid, toUserJid, WA_ACCOUNT_SYNC_PROTOCOLS, WA_APP_STATE_COLLECTIONS, WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_ERROR_CODES, WA_APP_STATE_KDF_INFO, WA_APP_STATE_KEY_TYPES, WA_APP_STATE_SYNC_DATA_TYPE, WA_BROWSERS, WA_COMPANION_PLATFORM_IDS, WA_DEFAULTS, WA_DIRTY_PROTOCOLS, WA_DIRTY_TYPES, WA_DISCONNECT_REASONS, WA_IQ_TYPES, WA_LOGOUT_REASONS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_MEDIA_HKDF_INFO, WA_NODE_TAGS, WA_PAIRING_KDF_INFO, WA_PREVIEW_MEDIA_HKDF_INFO, WA_READY_STATES, WA_RETRYABLE_ACK_CODES, WA_SIGNALING, WA_STREAM_SIGNALING, WA_SUPPORTED_DIRTY_TYPES, WA_PRIVACY_CATEGORIES, WA_PRIVACY_CATEGORY_TO_SETTING, WA_PRIVACY_DISALLOWED_LIST_CATEGORIES, WA_PRIVACY_SETTING_TO_CATEGORY, WA_PRIVACY_TAGS, WA_PRIVACY_VALUES, WA_XMLNS } from './protocol/index.js';
7
+ export { createNoopLogger } from './infra/log/types.js';
8
+ export { createStore, WaAuthMemoryStore } from './store/index.js';
9
+ export { delay } from './util/async.js';
10
+ export { buildDeviceJid, canonicalizeSignalJid, canonicalizeSignalServer, getLoginIdentity, getWaCompanionPlatformId, getWaMediaHkdfInfo, isBotJid, isBroadcastJid, isGroupJid, isGroupOrBroadcastJid, isHostedDeviceId, isHostedDeviceJid, isHostedServer, isLidJid, isNewsletterJid, isStatusBroadcastJid, isUserJid, normalizeDeviceJid, normalizeRecipientJid, parseJidFull, parsePhoneJid, parseSignalAddressFromJid, signalAddressKey, splitJid, toUserJid, WA_ACCOUNT_SYNC_PROTOCOLS, WA_APP_STATE_COLLECTIONS, WA_APP_STATE_COLLECTION_STATES, WA_APP_STATE_ERROR_CODES, WA_APP_STATE_KDF_INFO, WA_APP_STATE_KEY_TYPES, WA_APP_STATE_SYNC_DATA_TYPE, WA_BROWSERS, WA_BUSINESS_HOURS_DAYS, WA_BUSINESS_HOURS_MODES, WA_COMPANION_PLATFORM_IDS, WA_DEFAULTS, WA_DIRTY_PROTOCOLS, WA_DIRTY_TYPES, WA_DISCONNECT_REASONS, WA_IQ_TYPES, WA_LOGOUT_REASONS, WA_MESSAGE_TAGS, WA_MESSAGE_TYPES, WA_MEDIA_HKDF_INFO, WA_NODE_TAGS, WA_PAIRING_KDF_INFO, WA_PREVIEW_MEDIA_HKDF_INFO, WA_READY_STATES, WA_RETRYABLE_ACK_CODES, WA_SIGNALING, WA_STREAM_SIGNALING, WA_SUPPORTED_DIRTY_TYPES, WA_PRIVACY_CATEGORIES, WA_PRIVACY_CATEGORY_TO_SETTING, WA_PRIVACY_DISALLOWED_LIST_CATEGORIES, WA_PRIVACY_SETTING_TO_CATEGORY, WA_PRIVACY_TAGS, WA_PRIVACY_VALUES, WA_XMLNS } from './protocol/index.js';
6
11
  export { proto } from './proto.js';
@@ -6,36 +6,60 @@ const LOG_LEVEL_PRIORITY = {
6
6
  error: 50
7
7
  };
8
8
  const CONSOLE_WRITERS = {
9
- trace: console.debug,
10
- debug: console.debug,
11
- info: console.info,
12
- warn: console.warn,
13
- error: console.error
9
+ trace: (...args) => console.debug(...args),
10
+ debug: (...args) => console.debug(...args),
11
+ info: (...args) => console.info(...args),
12
+ warn: (...args) => console.warn(...args),
13
+ error: (...args) => console.error(...args)
14
14
  };
15
+ /**
16
+ * Default zero-dependency {@link Logger} that writes structured records to
17
+ * the standard `console` sinks. Messages below the configured `level` are
18
+ * dropped without formatting cost.
19
+ */
15
20
  export class ConsoleLogger {
16
- constructor(level = 'info') {
21
+ /** @param level Minimum level to emit. Defaults to `'info'`. */
22
+ constructor(level = 'info', bindings = null) {
17
23
  this.level = level;
18
24
  this.minLevelPriority = LOG_LEVEL_PRIORITY[level];
25
+ this.bindings = bindings;
19
26
  }
27
+ /** Emits a `trace` record. */
20
28
  trace(message, context) {
21
29
  this.write('trace', message, context);
22
30
  }
31
+ /** Emits a `debug` record. */
23
32
  debug(message, context) {
24
33
  this.write('debug', message, context);
25
34
  }
35
+ /** Emits an `info` record. */
26
36
  info(message, context) {
27
37
  this.write('info', message, context);
28
38
  }
39
+ /** Emits a `warn` record. */
29
40
  warn(message, context) {
30
41
  this.write('warn', message, context);
31
42
  }
43
+ /** Emits an `error` record. */
32
44
  error(message, context) {
33
45
  this.write('error', message, context);
34
46
  }
47
+ /**
48
+ * Returns a derived logger with `bindings` merged into the parent's
49
+ * bindings. Per-call context still wins on key conflicts.
50
+ */
51
+ child(bindings) {
52
+ const merged = this.bindings ? { ...this.bindings, ...bindings } : { ...bindings };
53
+ return new ConsoleLogger(this.level, merged);
54
+ }
35
55
  write(level, message, context) {
36
56
  if (LOG_LEVEL_PRIORITY[level] < this.minLevelPriority) {
37
57
  return;
38
58
  }
59
+ if (this.bindings) {
60
+ CONSOLE_WRITERS[level](message, { ...this.bindings, ...context });
61
+ return;
62
+ }
39
63
  CONSOLE_WRITERS[level](message, context);
40
64
  }
41
65
  }