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
@@ -48,7 +48,6 @@ function buildRoutingInfoPrefix(routingInfo) {
48
48
  export class WaNoiseSession {
49
49
  constructor(sendWire, logger = new ConsoleLogger('info')) {
50
50
  this.writeChain = Promise.resolve();
51
- this.readChain = Promise.resolve();
52
51
  this.frameCodec = null;
53
52
  this.handshakeInbox = [];
54
53
  this.handshakeInboxHead = 0;
@@ -81,16 +80,16 @@ export class WaNoiseSession {
81
80
  const verifyCertificates = config.verifyCertificateChain !== false;
82
81
  this.trustedRootCa = config.trustedRootCa;
83
82
  if (config.serverStaticKey && config.serverStaticKey.length === 32) {
84
- this.logger.info('noise session attempting resume handshake (IK)');
83
+ this.logger.debug('noise session attempting resume handshake (IK)');
85
84
  this.noiseSocket = await this.resumeHandshake(config.serverStaticKey, config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
86
85
  await this.decodeBufferedPostHandshakeFrames();
87
- this.logger.info('noise session established via resume/full fallback path');
86
+ this.logger.info('noise session established', { mode: 'resume_or_fallback' });
88
87
  return;
89
88
  }
90
- this.logger.info('noise session starting full handshake (XX)');
89
+ this.logger.debug('noise session starting full handshake (XX)');
91
90
  this.noiseSocket = await this.fullHandshake(config.clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates);
92
91
  await this.decodeBufferedPostHandshakeFrames();
93
- this.logger.info('noise session established via full handshake');
92
+ this.logger.info('noise session established', { mode: 'full' });
94
93
  }
95
94
  encryptFrame(frame) {
96
95
  const socket = this.noiseSocket;
@@ -98,19 +97,11 @@ export class WaNoiseSession {
98
97
  if (!socket || !codec) {
99
98
  return Promise.reject(new Error('noise session is not established'));
100
99
  }
101
- let encryptPromise;
102
- try {
103
- encryptPromise = socket.encrypt(socket.reserveWriteNonce(), frame);
104
- }
105
- catch (error) {
106
- return Promise.reject(error);
107
- }
108
- const result = this.writeChain
109
- .then(() => encryptPromise)
110
- .then((encrypted) => codec.encodeFrame(encrypted));
100
+ const result = this.writeChain.then(() => codec.encodeFrame(socket.encrypt(frame)));
111
101
  this.writeChain = result.then(() => { }, () => { });
112
102
  return result;
113
103
  }
104
+ // eslint-disable-next-line @typescript-eslint/require-await
114
105
  async pushWireChunk(chunk) {
115
106
  const codec = this.frameCodec;
116
107
  if (!codec) {
@@ -139,11 +130,7 @@ export class WaNoiseSession {
139
130
  return out;
140
131
  }
141
132
  if (frames.length > 0) {
142
- const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
143
- this.readChain = this.readChain
144
- .then(() => decryptBatch)
145
- .then(() => { }, () => { });
146
- const decrypted = await decryptBatch;
133
+ const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
147
134
  for (let i = 0; i < decrypted.length; i++) {
148
135
  out.push(decrypted[i]);
149
136
  }
@@ -161,15 +148,12 @@ export class WaNoiseSession {
161
148
  rejecter(closeError);
162
149
  }
163
150
  }
164
- async decryptFramesBatch(socket, frames) {
165
- if (frames.length === 1) {
166
- return [await socket.decrypt(socket.reserveReadNonce(), frames[0])];
167
- }
168
- const pending = new Array(frames.length);
151
+ decryptFramesBatch(socket, frames) {
152
+ const out = new Array(frames.length);
169
153
  for (let i = 0; i < frames.length; i++) {
170
- pending[i] = socket.decrypt(socket.reserveReadNonce(), frames[i]);
154
+ out[i] = socket.decrypt(frames[i]);
171
155
  }
172
- return Promise.all(pending);
156
+ return out;
173
157
  }
174
158
  reset() {
175
159
  this.logger.trace('noise session reset');
@@ -183,7 +167,6 @@ export class WaNoiseSession {
183
167
  this.serverStaticKey = null;
184
168
  this.trustedRootCa = undefined;
185
169
  this.writeChain = Promise.resolve();
186
- this.readChain = Promise.resolve();
187
170
  }
188
171
  getServerStaticKey() {
189
172
  return this.serverStaticKey;
@@ -191,8 +174,8 @@ export class WaNoiseSession {
191
174
  async fullHandshake(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, verifyCertificates) {
192
175
  this.logger.trace('noise full handshake: send client hello');
193
176
  const handshake = new WaNoiseHandshake();
194
- await handshake.start(NOISE_XX_NAME, protocolHeader);
195
- await handshake.authenticate(ephemeralKeyPair.pubKey);
177
+ handshake.start(NOISE_XX_NAME, protocolHeader);
178
+ handshake.authenticate(ephemeralKeyPair.pubKey);
196
179
  const clientHello = proto.HandshakeMessage.encode({
197
180
  clientHello: {
198
181
  ephemeral: ephemeralKeyPair.pubKey
@@ -206,23 +189,23 @@ export class WaNoiseSession {
206
189
  if (resumeResult.socket) {
207
190
  return resumeResult.socket;
208
191
  }
209
- this.logger.info('noise resume handshake fallback to XX');
192
+ this.logger.debug('noise resume handshake fallback to XX');
210
193
  return this.resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, resumeResult.serverHelloFrame, verifyCertificates);
211
194
  }
212
195
  async tryResumeHandshakeWithIk(serverStaticKey, clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader) {
213
196
  this.logger.trace('noise resume handshake: send IK client hello');
214
197
  const handshake = new WaNoiseHandshake();
215
- await handshake.start(NOISE_IK_NAME, protocolHeader);
216
- await handshake.authenticate(serverStaticKey);
217
- await handshake.authenticate(ephemeralKeyPair.pubKey);
198
+ handshake.start(NOISE_IK_NAME, protocolHeader);
199
+ handshake.authenticate(serverStaticKey);
200
+ handshake.authenticate(ephemeralKeyPair.pubKey);
218
201
  const [agreement1, agreement2] = await Promise.all([
219
202
  X25519.scalarMult(ephemeralKeyPair.privKey, serverStaticKey),
220
203
  X25519.scalarMult(clientStaticKeyPair.privKey, serverStaticKey)
221
204
  ]);
222
- await handshake.mixIntoKey(agreement1);
223
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
224
- await handshake.mixIntoKey(agreement2);
225
- const encryptedPayload = await handshake.encrypt(payload);
205
+ handshake.mixIntoKey(agreement1);
206
+ const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
207
+ handshake.mixIntoKey(agreement2);
208
+ const encryptedPayload = handshake.encrypt(payload);
226
209
  const clientHello = proto.HandshakeMessage.encode({
227
210
  clientHello: {
228
211
  ephemeral: ephemeralKeyPair.pubKey,
@@ -246,22 +229,22 @@ export class WaNoiseSession {
246
229
  throw new Error('noise resume handshake missing certificate payload');
247
230
  }
248
231
  const serverEphemeral = serverHello.ephemeral;
249
- await handshake.authenticate(serverEphemeral);
232
+ handshake.authenticate(serverEphemeral);
250
233
  const [dh1, dh2] = await Promise.all([
251
234
  X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral),
252
235
  X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral)
253
236
  ]);
254
- await handshake.mixIntoKey(dh1);
255
- await handshake.mixIntoKey(dh2);
256
- await handshake.decrypt(serverHello.payload);
237
+ handshake.mixIntoKey(dh1);
238
+ handshake.mixIntoKey(dh2);
239
+ handshake.decrypt(serverHello.payload);
257
240
  this.serverStaticKey = serverStaticKey;
258
- this.logger.info('noise resume handshake successful without fallback');
259
- return { socket: await handshake.finish(), serverHelloFrame: null };
241
+ this.logger.debug('noise resume handshake successful without fallback');
242
+ return { socket: handshake.finish(), serverHelloFrame: null };
260
243
  }
261
244
  async resumeHandshakeWithFallback(clientStaticKeyPair, ephemeralKeyPair, payload, protocolHeader, serverHelloFrame, verifyCertificates) {
262
245
  const fallback = new WaNoiseHandshake();
263
- await fallback.start(NOISE_XX_FALLBACK_NAME, protocolHeader);
264
- await fallback.authenticate(ephemeralKeyPair.pubKey);
246
+ fallback.start(NOISE_XX_FALLBACK_NAME, protocolHeader);
247
+ fallback.authenticate(ephemeralKeyPair.pubKey);
265
248
  return this.continueFullHandshake(fallback, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates);
266
249
  }
267
250
  async continueFullHandshake(handshake, serverHelloFrame, clientStaticKeyPair, ephemeralKeyPair, payload, verifyCertificates) {
@@ -272,19 +255,19 @@ export class WaNoiseSession {
272
255
  throw new Error('noise full handshake missing server hello fields');
273
256
  }
274
257
  const serverEphemeral = serverHello.ephemeral;
275
- await handshake.authenticate(serverEphemeral);
276
- await handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
277
- const serverStatic = await handshake.decrypt(serverHello.static);
278
- await handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
279
- const certificate = await handshake.decrypt(serverHello.payload);
258
+ handshake.authenticate(serverEphemeral);
259
+ handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverEphemeral));
260
+ const serverStatic = handshake.decrypt(serverHello.static);
261
+ handshake.mixIntoKey(await X25519.scalarMult(ephemeralKeyPair.privKey, serverStatic));
262
+ const certificate = handshake.decrypt(serverHello.payload);
280
263
  if (verifyCertificates) {
281
264
  await verifyNoiseCertificateChain(certificate, serverStatic, this.trustedRootCa);
282
265
  this.logger.trace('noise certificate chain verified');
283
266
  }
284
267
  this.serverStaticKey = serverStatic;
285
- const encryptedClientStatic = await handshake.encrypt(clientStaticKeyPair.pubKey);
286
- await handshake.mixIntoKey(await X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
287
- const encryptedPayload = await handshake.encrypt(payload);
268
+ const encryptedClientStatic = handshake.encrypt(clientStaticKeyPair.pubKey);
269
+ handshake.mixIntoKey(await X25519.scalarMult(clientStaticKeyPair.privKey, serverEphemeral));
270
+ const encryptedPayload = handshake.encrypt(payload);
288
271
  const clientFinish = proto.HandshakeMessage.encode({
289
272
  clientFinish: {
290
273
  static: encryptedClientStatic,
@@ -347,6 +330,7 @@ export class WaNoiseSession {
347
330
  throw toError(error);
348
331
  });
349
332
  }
333
+ // eslint-disable-next-line @typescript-eslint/require-await
350
334
  async decodeBufferedPostHandshakeFrames() {
351
335
  if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
352
336
  return;
@@ -357,11 +341,7 @@ export class WaNoiseSession {
357
341
  const start = this.handshakeInboxHead;
358
342
  const frames = this.handshakeInbox.slice(start);
359
343
  if (frames.length > 0) {
360
- const decryptBatch = this.decryptFramesBatch(this.noiseSocket, frames);
361
- this.readChain = this.readChain
362
- .then(() => decryptBatch)
363
- .then(() => { }, () => { });
364
- const decrypted = await decryptBatch;
344
+ const decrypted = this.decryptFramesBatch(this.noiseSocket, frames);
365
345
  for (let i = 0; i < decrypted.length; i++) {
366
346
  this.pendingDecryptedFrames.push(decrypted[i]);
367
347
  }
@@ -1,21 +1,27 @@
1
- import { aesGcmDecrypt, aesGcmEncrypt, buildNonce } from '../../crypto/index.js';
1
+ import { createSecretKey } from 'node:crypto';
2
+ import { aesGcmDecrypt, aesGcmEncrypt, writeNonceCounter } from '../../crypto/index.js';
3
+ /**
4
+ * Post-handshake symmetric channel: applies AES-GCM with per-direction
5
+ * 12-byte nonces (counter in the trailing 4 bytes) using a per-instance
6
+ * scratch buffer to avoid allocations on the hot path.
7
+ */
2
8
  export class WaNoiseSocket {
3
9
  constructor(encryptKey, decryptKey) {
4
- this.encryptKey = encryptKey;
5
- this.decryptKey = decryptKey;
10
+ this.writeNonceScratch = new Uint8Array(12);
11
+ this.readNonceScratch = new Uint8Array(12);
12
+ this.encryptKey = createSecretKey(encryptKey);
13
+ this.decryptKey = createSecretKey(decryptKey);
6
14
  this.writeCounter = 0;
7
15
  this.readCounter = 0;
8
16
  }
9
- reserveWriteNonce() {
10
- return buildNonce(this.writeCounter++);
17
+ /** Encrypts an outgoing `frame` with the next write nonce; advances the write counter. */
18
+ encrypt(frame, additionalData) {
19
+ writeNonceCounter(this.writeNonceScratch, this.writeCounter++);
20
+ return aesGcmEncrypt(this.encryptKey, this.writeNonceScratch, frame, additionalData);
11
21
  }
12
- encrypt(nonce, frame, additionalData) {
13
- return aesGcmEncrypt(this.encryptKey, nonce, frame, additionalData);
14
- }
15
- reserveReadNonce() {
16
- return buildNonce(this.readCounter++);
17
- }
18
- decrypt(nonce, frame, additionalData) {
19
- return aesGcmDecrypt(this.decryptKey, nonce, frame, additionalData);
22
+ /** Decrypts an incoming `frame` with the next read nonce; advances the read counter. */
23
+ decrypt(frame, additionalData) {
24
+ writeNonceCounter(this.readNonceScratch, this.readCounter++);
25
+ return aesGcmDecrypt(this.decryptKey, this.readNonceScratch, frame, additionalData);
20
26
  }
21
27
  }
@@ -1,5 +1,4 @@
1
1
  import { TEXT_ENCODER } from '../../util/bytes.js';
2
- export const DEFAULT_VERSION_BASE = '2.3000.1034748654';
3
2
  export const WA_PROTO_HEADER = new Uint8Array([87, 65, 6, 3]);
4
3
  export const NOISE_XX_NAME = TEXT_ENCODER.encode('Noise_XX_25519_AESGCM_SHA256\0\0\0\0');
5
4
  export const NOISE_IK_NAME = TEXT_ENCODER.encode('Noise_IK_25519_AESGCM_SHA256\0\0\0\0');
@@ -1,24 +1,29 @@
1
+ /** Type guard for an undici-style proxy dispatcher (has `dispatch` method). */
1
2
  export function isProxyDispatcher(value) {
2
3
  return (typeof value === 'object' &&
3
4
  value !== null &&
4
5
  'dispatch' in value &&
5
6
  typeof value.dispatch === 'function');
6
7
  }
8
+ /** Type guard for a Node http.Agent-style proxy (has `addRequest` method). */
7
9
  export function isProxyAgent(value) {
8
10
  return (typeof value === 'object' &&
9
11
  value !== null &&
10
12
  'addRequest' in value &&
11
13
  typeof value.addRequest === 'function');
12
14
  }
15
+ /** Type guard accepting either {@link isProxyDispatcher} or {@link isProxyAgent} shapes. */
13
16
  export function isProxyTransport(value) {
14
17
  return isProxyDispatcher(value) || isProxyAgent(value);
15
18
  }
19
+ /** Narrows `proxy` to {@link WaProxyDispatcher} or returns `undefined`. */
16
20
  export function toProxyDispatcher(proxy) {
17
21
  if (!proxy || !isProxyDispatcher(proxy)) {
18
22
  return undefined;
19
23
  }
20
24
  return proxy;
21
25
  }
26
+ /** Narrows `proxy` to {@link WaProxyAgent} or returns `undefined`. */
22
27
  export function toProxyAgent(proxy) {
23
28
  if (!proxy || !isProxyAgent(proxy)) {
24
29
  return undefined;
@@ -2,7 +2,6 @@ import { WA_STREAM_SIGNALING } from '../../protocol/constants.js';
2
2
  import { findNodeChild, hasNodeChild } from '../node/helpers.js';
3
3
  import { base64ToBytesChecked } from '../../util/bytes.js';
4
4
  import { parseOptionalInt } from '../../util/primitives.js';
5
- const DIGITS_ONLY_RE = /^\d+$/;
6
5
  export function parseStreamControlNode(node) {
7
6
  if (node.tag === WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
8
7
  return { kind: 'xmlstreamend' };
@@ -16,12 +15,9 @@ export function parseStreamControlNode(node) {
16
15
  ? { kind: 'stream_error_replaced' }
17
16
  : { kind: 'stream_error_device_removed' };
18
17
  }
19
- const codeStr = node.attrs.code;
20
- if (codeStr && DIGITS_ONLY_RE.test(codeStr)) {
21
- const code = Number(codeStr);
22
- if (Number.isSafeInteger(code)) {
23
- return { kind: 'stream_error_code', code };
24
- }
18
+ const code = parseOptionalInt(node.attrs.code);
19
+ if (code !== undefined) {
20
+ return { kind: 'stream_error_code', code };
25
21
  }
26
22
  const ackNode = findNodeChild(node, WA_STREAM_SIGNALING.ACK_TAG);
27
23
  if (ackNode) {
@@ -0,0 +1,91 @@
1
+ import { toProxyDispatcher } from './proxy.js';
2
+ import { toError } from '../util/primitives.js';
3
+ const DEFAULT_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
4
+ const DEFAULT_TIMEOUT_MS = 10000;
5
+ const SW_JS_URL = 'https://web.whatsapp.com/sw.js';
6
+ const CLIENT_REVISION_PATTERN = /\\?"client_revision\\?":\s*(\d+)/;
7
+ /**
8
+ * Fetches the current WhatsApp Web `client_revision` from the public
9
+ * `sw.js` served by the WhatsApp Web frontend and assembles a
10
+ * `2.3000.x` version string suitable for `WaClientOptions.version`.
11
+ *
12
+ * Use this when the library's hardcoded default starts being rejected by
13
+ * the server with HTTP 405 / `failure_client_too_old`, and you need to
14
+ * refresh the version without waiting for a library bump.
15
+ *
16
+ * Network failures and parse errors throw; wrap in a `try`/`catch` and
17
+ * fall back to the hardcoded default.
18
+ *
19
+ * @example
20
+ * const latest = await fetchLatestWaWebVersion()
21
+ * const client = new WaClient({ store, sessionId, version: latest.version })
22
+ */
23
+ export async function fetchLatestWaWebVersion(options = {}) {
24
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
25
+ const dispatcher = toProxyDispatcher(options.proxy);
26
+ const fetchImpl = options.fetch ?? fetch;
27
+ const controller = new AbortController();
28
+ const timer = setTimeout(() => controller.abort(new Error(`fetch latest wa-web version timed out after ${timeoutMs}ms`)), timeoutMs);
29
+ timer.unref?.();
30
+ let onExternalAbort = null;
31
+ const externalSignal = options.signal;
32
+ if (externalSignal) {
33
+ if (externalSignal.aborted) {
34
+ controller.abort(externalSignal.reason);
35
+ }
36
+ else {
37
+ onExternalAbort = () => controller.abort(externalSignal.reason);
38
+ externalSignal.addEventListener('abort', onExternalAbort, { once: true });
39
+ }
40
+ }
41
+ try {
42
+ const headers = {
43
+ 'sec-fetch-site': 'none',
44
+ 'user-agent': options.userAgent ?? DEFAULT_USER_AGENT
45
+ };
46
+ if (options.headers) {
47
+ for (const key in options.headers) {
48
+ headers[key.toLowerCase()] = options.headers[key];
49
+ }
50
+ }
51
+ const init = {
52
+ method: 'GET',
53
+ headers,
54
+ signal: controller.signal
55
+ };
56
+ if (dispatcher) {
57
+ // dispatcher is a non-standard undici-only extension to RequestInit
58
+ ;
59
+ init.dispatcher = dispatcher;
60
+ }
61
+ let response;
62
+ try {
63
+ response = await fetchImpl(SW_JS_URL, init);
64
+ }
65
+ catch (error) {
66
+ throw new Error(`failed to fetch sw.js: ${toError(error).message}`);
67
+ }
68
+ if (!response.ok) {
69
+ throw new Error(`failed to fetch sw.js: http ${response.status}`);
70
+ }
71
+ const body = await response.text();
72
+ const match = CLIENT_REVISION_PATTERN.exec(body);
73
+ if (!match?.[1]) {
74
+ throw new Error('client_revision not found in sw.js response');
75
+ }
76
+ const revision = Number.parseInt(match[1], 10);
77
+ if (!Number.isSafeInteger(revision) || revision <= 0) {
78
+ throw new Error(`invalid client_revision in sw.js: ${match[1]}`);
79
+ }
80
+ return {
81
+ version: `2.3000.${revision}`,
82
+ parts: [2, 3000, revision]
83
+ };
84
+ }
85
+ finally {
86
+ clearTimeout(timer);
87
+ if (externalSignal && onExternalAbort) {
88
+ externalSignal.removeEventListener('abort', onExternalAbort);
89
+ }
90
+ }
91
+ }
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Returns a Promise that resolves after `ms` milliseconds. Thin wrapper over
3
+ * `setTimeout` for use in `await` chains.
4
+ */
1
5
  export function delay(ms) {
2
6
  return new Promise((resolve) => {
3
7
  setTimeout(resolve, ms);
@@ -62,9 +62,14 @@ export function hexToBytes(value) {
62
62
  }
63
63
  return out;
64
64
  }
65
+ /** Encodes a Uint8Array to a standard padded base64 string. */
65
66
  export function bytesToBase64(value) {
66
67
  return encodeBase64(value, BASE64_CHARS, true);
67
68
  }
69
+ /**
70
+ * Decodes a standard padded base64 string to a Uint8Array. Throws on invalid
71
+ * characters or a length that is not a multiple of 4.
72
+ */
68
73
  export function base64ToBytes(value) {
69
74
  const len = value.length;
70
75
  if (len === 0)
@@ -104,12 +109,17 @@ export function base64ToBytes(value) {
104
109
  }
105
110
  return out;
106
111
  }
107
- export function base64ToBytesChecked(value, field, requireNonEmpty = true) {
108
- if (requireNonEmpty && value.length === 0) {
112
+ export function base64ToBytesChecked(value, field) {
113
+ if (value.length === 0) {
109
114
  throw new Error(`invalid base64 payload for ${field}`);
110
115
  }
111
116
  return base64ToBytes(value);
112
117
  }
118
+ /**
119
+ * Decodes a base64url-encoded value to a Uint8Array, restoring padding and
120
+ * the `+`/`/` alphabet first. Throws with a `missing ${field}` message when
121
+ * `value` is empty/undefined.
122
+ */
113
123
  export function decodeBase64Url(value, field) {
114
124
  if (!value) {
115
125
  throw new Error(`missing ${field}`);
@@ -189,6 +199,7 @@ function encodeBase64(value, alphabet, pad) {
189
199
  }
190
200
  return out.join('');
191
201
  }
202
+ /** Concatenates an array of Uint8Arrays into a single new Uint8Array. */
192
203
  export function concatBytes(parts) {
193
204
  let total = 0;
194
205
  for (let i = 0; i < parts.length; i += 1) {
@@ -202,6 +213,13 @@ export function concatBytes(parts) {
202
213
  }
203
214
  return out;
204
215
  }
216
+ /**
217
+ * Returns a zero-copy `Uint8Array` view over the input. Subclasses of
218
+ * `Uint8Array` (Node `Buffer`) are wrapped in a plain view; `ArrayBuffer`/
219
+ * `ArrayBufferView` get a view over their backing buffer. Use at system
220
+ * boundaries (WebCrypto / Node crypto / WebSocket results) – not on values
221
+ * that are already plain `Uint8Array`.
222
+ */
205
223
  export function toBytesView(value) {
206
224
  if (value instanceof Uint8Array) {
207
225
  return value.constructor === Uint8Array
@@ -213,6 +231,10 @@ export function toBytesView(value) {
213
231
  }
214
232
  return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
215
233
  }
234
+ /**
235
+ * Normalizes an arbitrary stream chunk (string / Uint8Array / ArrayBuffer /
236
+ * ArrayBufferView) to a Uint8Array. Throws on unsupported types.
237
+ */
216
238
  export function toChunkBytes(chunk) {
217
239
  if (typeof chunk === 'string') {
218
240
  return TEXT_ENCODER.encode(chunk);
@@ -222,12 +244,20 @@ export function toChunkBytes(chunk) {
222
244
  }
223
245
  throw new Error(`unsupported stream chunk type: ${typeof chunk}`);
224
246
  }
247
+ /**
248
+ * Constant-time, JIT-resistant equality over `Uint8Array`s. Required for
249
+ * MAC/HMAC/signature comparisons (use {@link uint8Equal} for non-secret data).
250
+ */
225
251
  export function uint8TimingSafeEqual(left, right) {
226
252
  if (left.byteLength !== right.byteLength) {
227
253
  return false;
228
254
  }
229
255
  return timingSafeEqual(left, right);
230
256
  }
257
+ /**
258
+ * XOR-accumulated equality over `Uint8Array`s. Suitable for non-secret data
259
+ * (e.g. identity key match). Use {@link uint8TimingSafeEqual} for MAC checks.
260
+ */
231
261
  export function uint8Equal(a, b) {
232
262
  if (a.length !== b.length) {
233
263
  return false;
@@ -270,6 +300,11 @@ export function intToBytes(byteLength, value) {
270
300
  }
271
301
  return out;
272
302
  }
303
+ /**
304
+ * Drains a Node `Readable` stream into a single Uint8Array. When
305
+ * `options.maxBytes` is set, the stream is destroyed and the promise rejects
306
+ * once the limit is exceeded.
307
+ */
273
308
  export async function readAllBytes(stream, options = {}) {
274
309
  const maxBytes = options.maxBytes;
275
310
  if (maxBytes !== undefined && (!Number.isSafeInteger(maxBytes) || maxBytes < 0)) {
@@ -0,0 +1,15 @@
1
+ export function createServerClock(getClockSkewMs) {
2
+ return {
3
+ nowMs() {
4
+ const skewMs = getClockSkewMs();
5
+ const nowMs = Date.now();
6
+ return Number.isFinite(skewMs) ? nowMs + skewMs : nowMs;
7
+ },
8
+ nowSeconds() {
9
+ const skewMs = getClockSkewMs();
10
+ const nowMs = Date.now();
11
+ const correctedMs = Number.isFinite(skewMs) ? nowMs + skewMs : nowMs;
12
+ return Math.floor(correctedMs / 1000);
13
+ }
14
+ };
15
+ }
@@ -1,44 +1,61 @@
1
1
  import { toBytesView } from './bytes.js';
2
2
  import { toSafeNumber } from './primitives.js';
3
+ /**
4
+ * Coerces `value` to a safe-integer/finite number, accepting `number` and
5
+ * `bigint` inputs. Throws with a `${field}`-suffixed message on any other type.
6
+ */
3
7
  export function asNumber(value, field) {
4
- if (typeof value === 'bigint') {
5
- return toSafeNumber(Number(value), field);
6
- }
7
8
  if (typeof value === 'number') {
8
9
  return toSafeNumber(value, field);
9
10
  }
11
+ if (typeof value === 'bigint') {
12
+ return toSafeNumber(Number(value), field);
13
+ }
10
14
  throw new Error(`invalid number value for ${field}`);
11
15
  }
16
+ /** Optional variant of {@link asNumber}; returns `undefined` when input is nullish. */
12
17
  export function asOptionalNumber(value, field = 'optional number') {
13
18
  if (value === null || value === undefined)
14
19
  return undefined;
15
20
  return asNumber(value, field);
16
21
  }
22
+ /** Asserts that `value` is a string. Throws with a `${field}`-suffixed message otherwise. */
17
23
  export function asString(value, field) {
18
24
  if (typeof value === 'string') {
19
25
  return value;
20
26
  }
21
27
  throw new Error(`invalid string value for ${field}`);
22
28
  }
29
+ /** Optional variant of {@link asString}; returns `undefined` when input is nullish. */
23
30
  export function asOptionalString(value, field = 'optional string') {
24
31
  if (value === null || value === undefined)
25
32
  return undefined;
26
33
  return asString(value, field);
27
34
  }
35
+ /**
36
+ * Coerces `value` to a Uint8Array view, accepting `Uint8Array`, `ArrayBuffer`,
37
+ * and any `ArrayBufferView`. Throws with a `${field}`-suffixed message otherwise.
38
+ */
28
39
  export function asBytes(value, field) {
29
40
  if (value instanceof Uint8Array || value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
30
41
  return toBytesView(value);
31
42
  }
32
43
  throw new Error(`invalid bytes value for ${field}`);
33
44
  }
45
+ /** Optional variant of {@link asBytes}; returns `undefined` when input is nullish. */
34
46
  export function asOptionalBytes(value, field = 'optional bytes') {
35
47
  if (value === null || value === undefined)
36
48
  return undefined;
37
49
  return asBytes(value, field);
38
50
  }
51
+ /** Returns `undefined` when `value` is nullish, otherwise `Boolean(value)`. */
39
52
  export function toBoolOrUndef(value) {
40
53
  return value === null || value === undefined ? undefined : Boolean(value);
41
54
  }
55
+ /**
56
+ * Returns `value` when it is a positive safe-integer, `fallback` when it is
57
+ * undefined, and throws otherwise.
58
+ */
42
59
  export function resolvePositive(value, fallback, name) {
43
60
  if (value === undefined)
44
61
  return fallback;
@@ -46,3 +63,28 @@ export function resolvePositive(value, fallback, name) {
46
63
  return value;
47
64
  throw new Error(`${name} must be a positive safe integer`);
48
65
  }
66
+ /**
67
+ * Lenient variants for parsing external JSON payloads (GraphQL responses,
68
+ * Mex notifications) where fields may be missing, empty, or arrive as the
69
+ * wrong primitive. Return null instead of throwing.
70
+ */
71
+ export function tryAsString(value) {
72
+ return typeof value === 'string' && value.length > 0 ? value : null;
73
+ }
74
+ export function tryAsNumber(value) {
75
+ if (typeof value === 'number' && Number.isFinite(value))
76
+ return value;
77
+ if (typeof value === 'string') {
78
+ const normalized = value.trim();
79
+ if (normalized.length === 0)
80
+ return null;
81
+ const parsed = Number(normalized);
82
+ return Number.isFinite(parsed) ? parsed : null;
83
+ }
84
+ return null;
85
+ }
86
+ export function tryAsRecord(value) {
87
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
88
+ ? value
89
+ : null;
90
+ }
@@ -4,6 +4,17 @@ export function resolveCleanupIntervalMs(ttlMs, maxIntervalMs = 60000) {
4
4
  }
5
5
  return Math.min(maxIntervalMs, Math.floor(ttlMs / 2));
6
6
  }
7
+ export function createPeriodicCleanup(ttlMs, run) {
8
+ const timer = setInterval(run, resolveCleanupIntervalMs(ttlMs));
9
+ timer.unref?.();
10
+ return {
11
+ destroy: () => clearInterval(timer)
12
+ };
13
+ }
14
+ /**
15
+ * Returns a validated positive-safe-integer query limit, falling back to
16
+ * `defaultLimit` when `limit` is undefined. Throws on invalid input.
17
+ */
7
18
  export function normalizeQueryLimit(limit, defaultLimit) {
8
19
  if (limit === undefined) {
9
20
  return defaultLimit;
@@ -1,5 +1,5 @@
1
- export { bytesToHex, hexToBytes, toBytesView, uint8Equal } from './bytes.js';
1
+ export { base64ToBytes, bytesToBase64, bytesToBase64UrlSafe, bytesToHex, decodeBase64Url, hexToBytes, TEXT_DECODER, toBytesView, uint8Equal } from './bytes.js';
2
2
  export { asBytes, asNumber, asOptionalBytes, asOptionalNumber, asOptionalString, asString, resolvePositive, toBoolOrUndef } from './coercion.js';
3
3
  export { normalizeQueryLimit } from './collections.js';
4
- export { toSafeNumber } from './primitives.js';
4
+ export { toError, toSafeNumber } from './primitives.js';
5
5
  export { isBunRuntime } from './runtime.js';