zapo-js 0.3.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -177
  3. package/dist/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  4. package/dist/appstate/index.js +7 -6
  5. package/dist/appstate/{encoding.js → parsers/encoding.js} +11 -4
  6. package/dist/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  7. package/dist/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -53
  8. package/dist/appstate/utils.js +16 -0
  9. package/dist/appstate-spec.js +89 -0
  10. package/dist/auth/WaAuthClient.js +100 -5
  11. package/dist/auth/credentials-flow.js +19 -7
  12. package/dist/auth/pairing/WaPairingFlow.js +33 -24
  13. package/dist/auth/pairing/pairing-code-crypto.js +16 -18
  14. package/dist/client/WaClient.js +342 -473
  15. package/dist/client/WaClientFactory.js +279 -78
  16. package/dist/client/connection/WaConnectionManager.js +28 -11
  17. package/dist/client/coordinators/WaAbPropsCoordinator.js +1 -2
  18. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +663 -143
  19. package/dist/client/coordinators/WaBotCoordinator.js +345 -0
  20. package/dist/client/coordinators/WaBroadcastListCoordinator.js +20 -0
  21. package/dist/client/coordinators/WaBusinessCoordinator.js +81 -171
  22. package/dist/client/coordinators/WaEmailCoordinator.js +1 -0
  23. package/dist/client/coordinators/WaGroupCoordinator.js +529 -52
  24. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +97 -12
  25. package/dist/client/coordinators/WaLowLevelCoordinator.js +41 -0
  26. package/dist/client/coordinators/WaMessageCoordinator.js +365 -0
  27. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +682 -204
  28. package/dist/client/coordinators/WaNewsletterCoordinator.js +18 -0
  29. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +17 -4
  30. package/dist/client/coordinators/WaPresenceCoordinator.js +21 -0
  31. package/dist/client/coordinators/WaPrivacyCoordinator.js +7 -5
  32. package/dist/client/coordinators/WaProfileCoordinator.js +220 -49
  33. package/dist/client/coordinators/WaRetryCoordinator.js +256 -125
  34. package/dist/client/coordinators/WaStatusCoordinator.js +49 -0
  35. package/dist/client/coordinators/WaStreamControlCoordinator.js +6 -6
  36. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  37. package/dist/client/events/appstate-mutation.js +133 -0
  38. package/dist/client/events/business.js +375 -0
  39. package/dist/client/events/call.js +58 -0
  40. package/dist/client/events/chatstate.js +23 -0
  41. package/dist/client/events/devices.js +15 -16
  42. package/dist/client/{dirty.js → events/dirty.js} +33 -19
  43. package/dist/client/events/group.js +13 -24
  44. package/dist/client/events/identity.js +2 -1
  45. package/dist/client/events/incoming.js +502 -0
  46. package/dist/client/events/mex-notification.js +181 -0
  47. package/dist/client/events/picture.js +33 -0
  48. package/dist/client/events/presence.js +44 -0
  49. package/dist/client/events/receipt.js +26 -0
  50. package/dist/client/media.js +161 -4
  51. package/dist/client/messaging/fanout.js +9 -10
  52. package/dist/client/messaging/{participants.js → group-metadata.js} +73 -35
  53. package/dist/client/messaging/ignore-key.js +132 -0
  54. package/dist/client/messaging/key-protocol.js +3 -17
  55. package/dist/client/messaging/link-preview.js +159 -0
  56. package/dist/client/messaging/messages.js +671 -0
  57. package/dist/client/newsletter/admin.js +165 -0
  58. package/dist/client/newsletter/content.js +253 -0
  59. package/dist/client/newsletter/discovery.js +115 -0
  60. package/dist/client/newsletter/messaging.js +197 -0
  61. package/dist/client/newsletter/mex.js +41 -0
  62. package/dist/client/newsletter/parse.js +217 -0
  63. package/dist/client/persistence/WriteBehindPersistence.js +31 -4
  64. package/dist/client/{history-sync.js → persistence/history-sync.js} +125 -18
  65. package/dist/client/persistence/mailbox.js +104 -0
  66. package/dist/client/tokens/cs-token.js +11 -17
  67. package/dist/crypto/core/hkdf.js +12 -12
  68. package/dist/crypto/core/index.js +6 -8
  69. package/dist/crypto/core/keys.js +1 -8
  70. package/dist/crypto/core/nonce.js +12 -12
  71. package/dist/crypto/core/primitives.js +123 -93
  72. package/dist/crypto/core/random.js +6 -0
  73. package/dist/crypto/core/xeddsa.js +11 -9
  74. package/dist/crypto/curves/Ed25519.js +32 -21
  75. package/dist/crypto/curves/X25519.js +70 -34
  76. package/dist/crypto/curves/constants.js +2 -1
  77. package/dist/crypto/math/constants.js +1 -2
  78. package/dist/crypto/math/mod.js +0 -33
  79. package/dist/esm/appstate/{WaAppStateCrypto.js → crypto/WaAppStateCrypto.js} +58 -49
  80. package/dist/esm/appstate/index.js +5 -5
  81. package/dist/esm/appstate/{encoding.js → parsers/encoding.js} +11 -4
  82. package/dist/esm/appstate/{response-parser.js → parsers/response-parser.js} +20 -8
  83. package/dist/esm/appstate/{WaAppStateSyncClient.js → sync/WaAppStateSyncClient.js} +174 -52
  84. package/dist/esm/appstate/utils.js +16 -0
  85. package/dist/esm/appstate-spec.js +79 -0
  86. package/dist/esm/auth/WaAuthClient.js +100 -5
  87. package/dist/esm/auth/credentials-flow.js +18 -6
  88. package/dist/esm/auth/pairing/WaPairingFlow.js +34 -25
  89. package/dist/esm/auth/pairing/pairing-code-crypto.js +12 -14
  90. package/dist/esm/client/WaClient.js +345 -476
  91. package/dist/esm/client/WaClientFactory.js +280 -79
  92. package/dist/esm/client/connection/WaConnectionManager.js +28 -11
  93. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +2 -3
  94. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +665 -145
  95. package/dist/esm/client/coordinators/WaBotCoordinator.js +342 -0
  96. package/dist/esm/client/coordinators/WaBroadcastListCoordinator.js +17 -0
  97. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +79 -169
  98. package/dist/esm/client/coordinators/WaEmailCoordinator.js +1 -0
  99. package/dist/esm/client/coordinators/WaGroupCoordinator.js +532 -55
  100. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +98 -13
  101. package/dist/esm/client/coordinators/WaLowLevelCoordinator.js +38 -0
  102. package/dist/esm/client/coordinators/WaMessageCoordinator.js +361 -0
  103. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +686 -208
  104. package/dist/esm/client/coordinators/WaNewsletterCoordinator.js +13 -0
  105. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +18 -5
  106. package/dist/esm/client/coordinators/WaPresenceCoordinator.js +18 -0
  107. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +7 -5
  108. package/dist/esm/client/coordinators/WaProfileCoordinator.js +223 -52
  109. package/dist/esm/client/coordinators/WaRetryCoordinator.js +258 -127
  110. package/dist/esm/client/coordinators/WaStatusCoordinator.js +46 -0
  111. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +6 -6
  112. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +7 -6
  113. package/dist/esm/client/events/appstate-mutation.js +130 -0
  114. package/dist/esm/client/events/business.js +370 -0
  115. package/dist/esm/client/events/call.js +55 -0
  116. package/dist/esm/client/events/chatstate.js +20 -0
  117. package/dist/esm/client/events/devices.js +15 -16
  118. package/dist/esm/client/{dirty.js → events/dirty.js} +33 -19
  119. package/dist/esm/client/events/group.js +14 -25
  120. package/dist/esm/client/events/identity.js +2 -1
  121. package/dist/esm/client/events/incoming.js +487 -0
  122. package/dist/esm/client/events/mex-notification.js +178 -0
  123. package/dist/esm/client/events/picture.js +30 -0
  124. package/dist/esm/client/events/presence.js +41 -0
  125. package/dist/esm/client/events/receipt.js +23 -0
  126. package/dist/esm/client/media.js +156 -6
  127. package/dist/esm/client/messaging/fanout.js +10 -11
  128. package/dist/esm/client/messaging/{participants.js → group-metadata.js} +72 -34
  129. package/dist/esm/client/messaging/ignore-key.js +126 -0
  130. package/dist/esm/client/messaging/key-protocol.js +3 -17
  131. package/dist/esm/client/messaging/link-preview.js +156 -0
  132. package/dist/esm/client/messaging/messages.js +667 -0
  133. package/dist/esm/client/newsletter/admin.js +162 -0
  134. package/dist/esm/client/newsletter/content.js +249 -0
  135. package/dist/esm/client/newsletter/discovery.js +112 -0
  136. package/dist/esm/client/newsletter/messaging.js +194 -0
  137. package/dist/esm/client/newsletter/mex.js +37 -0
  138. package/dist/esm/client/newsletter/parse.js +200 -0
  139. package/dist/esm/client/persistence/WriteBehindPersistence.js +31 -4
  140. package/dist/esm/client/{history-sync.js → persistence/history-sync.js} +124 -18
  141. package/dist/esm/client/persistence/mailbox.js +101 -0
  142. package/dist/esm/client/tokens/cs-token.js +12 -18
  143. package/dist/esm/crypto/core/hkdf.js +14 -14
  144. package/dist/esm/crypto/core/index.js +2 -2
  145. package/dist/esm/crypto/core/keys.js +1 -7
  146. package/dist/esm/crypto/core/nonce.js +11 -11
  147. package/dist/esm/crypto/core/primitives.js +121 -88
  148. package/dist/esm/crypto/core/random.js +6 -0
  149. package/dist/esm/crypto/core/xeddsa.js +11 -9
  150. package/dist/esm/crypto/curves/Ed25519.js +35 -24
  151. package/dist/esm/crypto/curves/X25519.js +72 -36
  152. package/dist/esm/crypto/curves/constants.js +1 -0
  153. package/dist/esm/crypto/math/constants.js +1 -2
  154. package/dist/esm/crypto/math/mod.js +0 -32
  155. package/dist/esm/index.js +7 -2
  156. package/dist/esm/infra/log/ConsoleLogger.js +30 -6
  157. package/dist/esm/infra/log/PinoLogger.js +64 -0
  158. package/dist/esm/infra/log/types.js +4 -2
  159. package/dist/esm/infra/perf/BackgroundQueue.js +55 -13
  160. package/dist/esm/media/constants.js +33 -2
  161. package/dist/esm/media/crypto/WaMediaCrypto.js +374 -0
  162. package/dist/esm/media/index.js +4 -3
  163. package/dist/esm/media/sticker/sticker-pack.js +133 -0
  164. package/dist/esm/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  165. package/dist/esm/media/{conn.js → transfer/conn.js} +10 -5
  166. package/dist/esm/message/WaMessageClient.js +46 -15
  167. package/dist/esm/message/addons/link-preview/builder.js +36 -0
  168. package/dist/esm/message/addons/link-preview/detect.js +55 -0
  169. package/dist/esm/message/addons/link-preview/fetcher.js +391 -0
  170. package/dist/esm/message/addons/link-preview/types.js +1 -0
  171. package/dist/esm/message/context-info.js +123 -0
  172. package/dist/esm/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  173. package/dist/esm/message/{icdc.js → crypto/icdc.js} +5 -7
  174. package/dist/esm/message/crypto/phash.js +133 -0
  175. package/dist/esm/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  176. package/dist/esm/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  177. package/dist/esm/message/{content.js → encode/content.js} +176 -7
  178. package/dist/esm/message/encode/media-payload.js +42 -0
  179. package/dist/esm/message/{padding.js → encode/padding.js} +9 -3
  180. package/dist/esm/message/index.js +2 -2
  181. package/dist/esm/message/kinds/bot.js +111 -0
  182. package/dist/esm/message/kinds/newsletter.js +244 -0
  183. package/dist/esm/message/kinds/sticker-pack.js +29 -0
  184. package/dist/esm/message/{ack.js → primitives/ack.js} +8 -1
  185. package/dist/esm/message/{incoming.js → primitives/incoming.js} +215 -31
  186. package/dist/esm/message/primitives/peer-data-operation.js +93 -0
  187. package/dist/esm/mex.js +1 -0
  188. package/dist/esm/protocol/abprops.js +10 -0
  189. package/dist/esm/protocol/appstate.js +6 -30
  190. package/dist/esm/protocol/auth.js +3 -2
  191. package/dist/esm/protocol/bot.js +77 -0
  192. package/dist/esm/protocol/browser.js +8 -0
  193. package/dist/esm/protocol/business.js +19 -0
  194. package/dist/esm/protocol/call.js +48 -0
  195. package/dist/esm/protocol/constants.js +8 -2
  196. package/dist/esm/protocol/defaults.js +3 -0
  197. package/dist/esm/protocol/index.js +1 -1
  198. package/dist/esm/protocol/jid.js +102 -5
  199. package/dist/esm/protocol/media.js +25 -12
  200. package/dist/esm/protocol/message.js +4 -1
  201. package/dist/esm/protocol/newsletter.js +61 -0
  202. package/dist/esm/protocol/nodes.js +22 -2
  203. package/dist/esm/protocol/notification.js +18 -2
  204. package/dist/esm/protocol/presence.js +13 -0
  205. package/dist/esm/protocol/status.js +6 -0
  206. package/dist/esm/retry/codec.js +5 -0
  207. package/dist/esm/retry/parse.js +20 -38
  208. package/dist/esm/retry/reason.js +5 -0
  209. package/dist/esm/retry/replay.js +131 -37
  210. package/dist/esm/retry/tracker.js +4 -8
  211. package/dist/esm/signal/api/SignalDeviceSyncApi.js +66 -19
  212. package/dist/esm/signal/api/SignalDigestSyncApi.js +7 -2
  213. package/dist/esm/signal/api/SignalIdentitySyncApi.js +9 -0
  214. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +24 -63
  215. package/dist/esm/signal/api/SignalRotateKeyApi.js +10 -0
  216. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -51
  217. package/dist/esm/signal/api/codec.js +52 -1
  218. package/dist/esm/signal/api/prekeys.js +4 -0
  219. package/dist/esm/signal/{crypto → attestation}/WaAdvSignature.js +5 -6
  220. package/dist/esm/signal/constants.js +3 -0
  221. package/dist/esm/signal/encoding.js +6 -289
  222. package/dist/esm/signal/group/SenderKeyChain.js +18 -33
  223. package/dist/esm/signal/group/SenderKeyManager.js +25 -8
  224. package/dist/esm/signal/group/encoding.js +96 -0
  225. package/dist/esm/signal/index.js +4 -1
  226. package/dist/esm/signal/registration/encoding.js +34 -0
  227. package/dist/esm/signal/registration/keygen.js +10 -0
  228. package/dist/esm/signal/registration/utils.js +6 -0
  229. package/dist/esm/signal/session/SignalProtocol.js +113 -11
  230. package/dist/esm/signal/session/SignalRatchet.js +29 -58
  231. package/dist/esm/signal/session/SignalSession.js +7 -14
  232. package/dist/esm/signal/session/encoding.js +173 -0
  233. package/dist/esm/signal/session/resolver.js +139 -30
  234. package/dist/esm/store/cache/identity.cache.js +75 -0
  235. package/dist/esm/store/cache/privacy-token.cache.js +57 -0
  236. package/dist/esm/store/cache/sender-key.cache.js +101 -0
  237. package/dist/esm/store/cache/session.cache.js +92 -0
  238. package/dist/esm/store/contracts/group-metadata.store.js +1 -0
  239. package/dist/esm/store/createStore.js +91 -37
  240. package/dist/esm/store/index.js +15 -14
  241. package/dist/esm/store/locks/contact.lock.js +1 -0
  242. package/dist/esm/store/locks/device-list.lock.js +1 -0
  243. package/dist/esm/store/locks/group-metadata.lock.js +20 -0
  244. package/dist/esm/store/{providers/memory → memory}/appstate.store.js +5 -5
  245. package/dist/esm/store/memory/auth.store.js +24 -0
  246. package/dist/esm/store/memory/contact.store.js +79 -0
  247. package/dist/esm/store/memory/device-list.store.js +103 -0
  248. package/dist/esm/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +22 -13
  249. package/dist/esm/store/{providers/memory → memory}/identity.store.js +3 -3
  250. package/dist/esm/store/{providers/memory → memory}/message-secret.store.js +17 -8
  251. package/dist/esm/store/{providers/memory → memory}/message.store.js +2 -2
  252. package/dist/esm/store/{providers/memory → memory}/pre-key.store.js +2 -2
  253. package/dist/esm/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  254. package/dist/esm/store/{providers/memory → memory}/retry.store.js +28 -7
  255. package/dist/esm/store/{providers/memory → memory}/sender-key.store.js +3 -3
  256. package/dist/esm/store/{providers/memory → memory}/session.store.js +3 -3
  257. package/dist/esm/store/{providers/memory → memory}/thread.store.js +2 -2
  258. package/dist/esm/store/noop.store.js +6 -4
  259. package/dist/esm/transport/WaComms.js +14 -5
  260. package/dist/esm/transport/WaWebSocket.js +32 -8
  261. package/dist/esm/transport/binary/constants.js +10 -4
  262. package/dist/esm/transport/binary/decoder.js +21 -15
  263. package/dist/esm/transport/binary/encoder.js +96 -21
  264. package/dist/esm/transport/binary/tokens.js +12 -12
  265. package/dist/esm/transport/index.js +1 -0
  266. package/dist/esm/transport/keepalive/WaKeepAlive.js +18 -4
  267. package/dist/esm/transport/node/WaMobileTcpSocket.js +6 -0
  268. package/dist/esm/transport/node/WaNodeOrchestrator.js +9 -5
  269. package/dist/esm/transport/node/WaNodeTransport.js +13 -0
  270. package/dist/esm/transport/node/builders/abprops.js +2 -2
  271. package/dist/esm/transport/node/builders/account-sync.js +7 -15
  272. package/dist/esm/transport/node/builders/bot.js +38 -0
  273. package/dist/esm/transport/node/builders/business.js +30 -30
  274. package/dist/esm/transport/node/builders/chatstate.js +28 -0
  275. package/dist/esm/transport/node/builders/community.js +53 -0
  276. package/dist/esm/transport/node/builders/device.js +2 -2
  277. package/dist/esm/transport/node/builders/email.js +6 -5
  278. package/dist/esm/transport/node/builders/global.js +1 -1
  279. package/dist/esm/transport/node/builders/group.js +114 -4
  280. package/dist/esm/transport/node/builders/media.js +2 -2
  281. package/dist/esm/transport/node/builders/message.js +83 -49
  282. package/dist/esm/transport/node/builders/newsletter.js +176 -0
  283. package/dist/esm/transport/node/builders/passive.js +7 -0
  284. package/dist/esm/transport/node/builders/prekeys.js +4 -4
  285. package/dist/esm/transport/node/builders/presence.js +27 -1
  286. package/dist/esm/transport/node/builders/privacy-token.js +2 -2
  287. package/dist/esm/transport/node/builders/privacy.js +6 -6
  288. package/dist/esm/transport/node/builders/profile.js +28 -8
  289. package/dist/esm/transport/node/builders/tos.js +58 -0
  290. package/dist/esm/transport/node/builders/usync.js +51 -2
  291. package/dist/esm/transport/node/helpers.js +3 -1
  292. package/dist/esm/transport/node/mex/argo-decoder.js +2 -2
  293. package/dist/esm/transport/node/mex/client.js +22 -0
  294. package/dist/esm/transport/node/query.js +17 -0
  295. package/dist/esm/transport/node/usync.js +12 -0
  296. package/dist/esm/transport/noise/WaClientPayload.js +8 -8
  297. package/dist/esm/transport/noise/WaMobileClientPayload.js +5 -0
  298. package/dist/esm/transport/noise/WaNoiseCert.js +5 -0
  299. package/dist/esm/transport/noise/WaNoiseHandshake.js +27 -25
  300. package/dist/esm/transport/noise/WaNoiseSession.js +39 -59
  301. package/dist/esm/transport/noise/WaNoiseSocket.js +19 -13
  302. package/dist/esm/transport/noise/constants.js +0 -1
  303. package/dist/esm/transport/proxy.js +5 -0
  304. package/dist/esm/transport/stream/parse.js +3 -7
  305. package/dist/esm/transport/wa-web-version-fetcher.js +91 -0
  306. package/dist/esm/util/async.js +4 -0
  307. package/dist/esm/util/bytes.js +37 -2
  308. package/dist/esm/util/clock.js +15 -0
  309. package/dist/esm/util/coercion.js +45 -3
  310. package/dist/esm/util/collections.js +11 -0
  311. package/dist/esm/util/index.js +2 -2
  312. package/dist/esm/util/primitives.js +19 -0
  313. package/dist/esm/util/runtime.js +5 -0
  314. package/dist/esm/version-spec.js +1 -0
  315. package/dist/index.js +31 -1
  316. package/dist/infra/log/ConsoleLogger.js +30 -6
  317. package/dist/infra/log/PinoLogger.js +64 -0
  318. package/dist/infra/log/types.js +4 -2
  319. package/dist/infra/perf/BackgroundQueue.js +55 -13
  320. package/dist/media/constants.js +34 -3
  321. package/dist/media/crypto/WaMediaCrypto.js +378 -0
  322. package/dist/media/index.js +9 -4
  323. package/dist/media/sticker/sticker-pack.js +136 -0
  324. package/dist/media/{WaMediaTransferClient.js → transfer/WaMediaTransferClient.js} +37 -6
  325. package/dist/media/{conn.js → transfer/conn.js} +10 -5
  326. package/dist/message/WaMessageClient.js +46 -15
  327. package/dist/message/addons/link-preview/builder.js +39 -0
  328. package/dist/message/addons/link-preview/detect.js +58 -0
  329. package/dist/message/addons/link-preview/fetcher.js +394 -0
  330. package/dist/message/addons/link-preview/types.js +2 -0
  331. package/dist/message/context-info.js +129 -0
  332. package/dist/message/{addon-crypto.js → crypto/addon-crypto.js} +68 -10
  333. package/dist/message/{icdc.js → crypto/icdc.js} +5 -7
  334. package/dist/message/crypto/phash.js +136 -0
  335. package/dist/message/{reporting-token.js → crypto/reporting-token.js} +6 -6
  336. package/dist/message/{use-case-secret.js → crypto/use-case-secret.js} +20 -3
  337. package/dist/message/{content.js → encode/content.js} +192 -7
  338. package/dist/message/encode/media-payload.js +45 -0
  339. package/dist/message/{padding.js → encode/padding.js} +9 -3
  340. package/dist/message/index.js +2 -2
  341. package/dist/message/kinds/bot.js +120 -0
  342. package/dist/message/kinds/newsletter.js +248 -0
  343. package/dist/message/kinds/sticker-pack.js +34 -0
  344. package/dist/message/{ack.js → primitives/ack.js} +8 -1
  345. package/dist/message/{incoming.js → primitives/incoming.js} +216 -31
  346. package/dist/message/primitives/peer-data-operation.js +96 -0
  347. package/dist/mex.js +6 -0
  348. package/dist/proto.js +1 -1
  349. package/dist/protocol/abprops.js +10 -0
  350. package/dist/protocol/appstate.js +7 -31
  351. package/dist/protocol/auth.js +3 -2
  352. package/dist/protocol/bot.js +81 -0
  353. package/dist/protocol/browser.js +8 -0
  354. package/dist/protocol/business.js +22 -0
  355. package/dist/protocol/call.js +51 -0
  356. package/dist/protocol/constants.js +39 -3
  357. package/dist/protocol/defaults.js +3 -0
  358. package/dist/protocol/index.js +12 -3
  359. package/dist/protocol/jid.js +107 -5
  360. package/dist/protocol/media.js +25 -12
  361. package/dist/protocol/message.js +4 -1
  362. package/dist/protocol/newsletter.js +64 -0
  363. package/dist/protocol/nodes.js +22 -2
  364. package/dist/protocol/notification.js +19 -3
  365. package/dist/protocol/presence.js +16 -0
  366. package/dist/protocol/status.js +9 -0
  367. package/dist/retry/codec.js +5 -0
  368. package/dist/retry/parse.js +16 -34
  369. package/dist/retry/reason.js +5 -0
  370. package/dist/retry/replay.js +129 -35
  371. package/dist/retry/tracker.js +3 -7
  372. package/dist/signal/api/SignalDeviceSyncApi.js +64 -17
  373. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  374. package/dist/signal/api/SignalIdentitySyncApi.js +9 -0
  375. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +21 -60
  376. package/dist/signal/api/SignalRotateKeyApi.js +10 -0
  377. package/dist/signal/api/SignalSessionSyncApi.js +20 -48
  378. package/dist/signal/api/codec.js +52 -0
  379. package/dist/signal/api/prekeys.js +4 -0
  380. package/dist/signal/{crypto → attestation}/WaAdvSignature.js +5 -7
  381. package/dist/signal/constants.js +4 -1
  382. package/dist/signal/encoding.js +5 -303
  383. package/dist/signal/group/SenderKeyChain.js +17 -32
  384. package/dist/signal/group/SenderKeyManager.js +24 -7
  385. package/dist/signal/group/encoding.js +101 -0
  386. package/dist/signal/index.js +13 -10
  387. package/dist/signal/registration/encoding.js +39 -0
  388. package/dist/signal/registration/keygen.js +10 -0
  389. package/dist/signal/registration/utils.js +6 -0
  390. package/dist/signal/session/SignalProtocol.js +112 -10
  391. package/dist/signal/session/SignalRatchet.js +24 -54
  392. package/dist/signal/session/SignalSession.js +6 -14
  393. package/dist/signal/session/encoding.js +183 -0
  394. package/dist/signal/session/resolver.js +139 -30
  395. package/dist/store/cache/identity.cache.js +78 -0
  396. package/dist/store/cache/privacy-token.cache.js +60 -0
  397. package/dist/store/cache/sender-key.cache.js +104 -0
  398. package/dist/store/cache/session.cache.js +95 -0
  399. package/dist/store/contracts/group-metadata.store.js +2 -0
  400. package/dist/store/createStore.js +90 -36
  401. package/dist/store/index.js +18 -16
  402. package/dist/store/locks/contact.lock.js +1 -0
  403. package/dist/store/locks/device-list.lock.js +1 -0
  404. package/dist/store/locks/group-metadata.lock.js +23 -0
  405. package/dist/store/{providers/memory → memory}/appstate.store.js +5 -5
  406. package/dist/store/memory/auth.store.js +28 -0
  407. package/dist/store/memory/contact.store.js +83 -0
  408. package/dist/store/memory/device-list.store.js +107 -0
  409. package/dist/store/{providers/memory/participants.store.js → memory/group-metadata.store.js} +24 -15
  410. package/dist/store/{providers/memory → memory}/identity.store.js +3 -3
  411. package/dist/store/{providers/memory → memory}/message-secret.store.js +17 -8
  412. package/dist/store/{providers/memory → memory}/message.store.js +2 -2
  413. package/dist/store/{providers/memory → memory}/pre-key.store.js +2 -2
  414. package/dist/store/{providers/memory → memory}/privacy-token.store.js +1 -1
  415. package/dist/store/{providers/memory → memory}/retry.store.js +28 -7
  416. package/dist/store/{providers/memory → memory}/sender-key.store.js +3 -3
  417. package/dist/store/{providers/memory → memory}/session.store.js +3 -3
  418. package/dist/store/{providers/memory → memory}/thread.store.js +2 -2
  419. package/dist/store/noop.store.js +7 -5
  420. package/dist/transport/WaComms.js +14 -5
  421. package/dist/transport/WaWebSocket.js +32 -8
  422. package/dist/transport/binary/constants.js +11 -5
  423. package/dist/transport/binary/decoder.js +24 -18
  424. package/dist/transport/binary/encoder.js +109 -34
  425. package/dist/transport/binary/tokens.js +12 -12
  426. package/dist/transport/index.js +3 -1
  427. package/dist/transport/keepalive/WaKeepAlive.js +18 -4
  428. package/dist/transport/node/WaMobileTcpSocket.js +6 -0
  429. package/dist/transport/node/WaNodeOrchestrator.js +9 -5
  430. package/dist/transport/node/WaNodeTransport.js +13 -0
  431. package/dist/transport/node/builders/abprops.js +1 -1
  432. package/dist/transport/node/builders/account-sync.js +7 -16
  433. package/dist/transport/node/builders/bot.js +43 -0
  434. package/dist/transport/node/builders/business.js +31 -31
  435. package/dist/transport/node/builders/chatstate.js +31 -0
  436. package/dist/transport/node/builders/community.js +59 -0
  437. package/dist/transport/node/builders/device.js +1 -1
  438. package/dist/transport/node/builders/email.js +6 -5
  439. package/dist/transport/node/builders/global.js +1 -1
  440. package/dist/transport/node/builders/group.js +121 -3
  441. package/dist/transport/node/builders/media.js +1 -1
  442. package/dist/transport/node/builders/message.js +84 -49
  443. package/dist/transport/node/builders/newsletter.js +183 -0
  444. package/dist/transport/node/builders/passive.js +10 -0
  445. package/dist/transport/node/builders/prekeys.js +3 -3
  446. package/dist/transport/node/builders/presence.js +28 -1
  447. package/dist/transport/node/builders/privacy-token.js +1 -1
  448. package/dist/transport/node/builders/privacy.js +5 -5
  449. package/dist/transport/node/builders/profile.js +30 -7
  450. package/dist/transport/node/builders/tos.js +63 -0
  451. package/dist/transport/node/builders/usync.js +52 -1
  452. package/dist/transport/node/helpers.js +2 -1
  453. package/dist/transport/node/mex/argo-decoder.js +2 -2
  454. package/dist/transport/node/mex/client.js +23 -0
  455. package/dist/transport/node/query.js +17 -0
  456. package/dist/transport/node/usync.js +13 -0
  457. package/dist/transport/noise/WaClientPayload.js +8 -8
  458. package/dist/transport/noise/WaMobileClientPayload.js +5 -0
  459. package/dist/transport/noise/WaNoiseCert.js +5 -0
  460. package/dist/transport/noise/WaNoiseHandshake.js +25 -23
  461. package/dist/transport/noise/WaNoiseSession.js +39 -59
  462. package/dist/transport/noise/WaNoiseSocket.js +18 -12
  463. package/dist/transport/noise/constants.js +1 -2
  464. package/dist/transport/proxy.js +5 -0
  465. package/dist/transport/stream/parse.js +3 -7
  466. package/dist/transport/wa-web-version-fetcher.js +94 -0
  467. package/dist/types/appstate/constants.d.ts +1 -1
  468. package/dist/types/appstate/{WaAppStateCrypto.d.ts → crypto/WaAppStateCrypto.d.ts} +26 -9
  469. package/dist/types/appstate/index.d.ts +5 -5
  470. package/dist/types/appstate/{encoding.d.ts → parsers/encoding.d.ts} +8 -1
  471. package/dist/types/appstate/{response-parser.d.ts → parsers/response-parser.d.ts} +13 -3
  472. package/dist/types/appstate/sync/WaAppStateSyncClient.d.ts +105 -0
  473. package/dist/types/appstate/utils.d.ts +17 -1
  474. package/dist/types/appstate-spec.d.ts +24 -0
  475. package/dist/types/auth/WaAuthClient.d.ts +89 -3
  476. package/dist/types/auth/credentials-flow.d.ts +4 -3
  477. package/dist/types/auth/pairing/pairing-code-crypto.d.ts +0 -1
  478. package/dist/types/auth/types.d.ts +48 -1
  479. package/dist/types/client/WaClient.d.ts +178 -71
  480. package/dist/types/client/WaClientFactory.d.ts +30 -5
  481. package/dist/types/client/connection/WaConnectionManager.d.ts +4 -2
  482. package/dist/types/client/connection/WaReceiptQueue.d.ts +1 -1
  483. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +215 -5
  484. package/dist/types/client/coordinators/WaBotCoordinator.d.ts +117 -0
  485. package/dist/types/client/coordinators/WaBroadcastListCoordinator.d.ts +39 -0
  486. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +44 -43
  487. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +16 -0
  488. package/dist/types/client/coordinators/WaGroupCoordinator.d.ts +311 -9
  489. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +11 -4
  490. package/dist/types/client/coordinators/WaLowLevelCoordinator.d.ts +47 -0
  491. package/dist/types/client/coordinators/WaMessageCoordinator.d.ts +232 -0
  492. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +54 -31
  493. package/dist/types/client/coordinators/WaNewsletterCoordinator.d.ts +13 -0
  494. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -3
  495. package/dist/types/client/coordinators/WaPresenceCoordinator.d.ts +27 -0
  496. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +27 -0
  497. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +113 -0
  498. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +19 -17
  499. package/dist/types/client/coordinators/WaStatusCoordinator.d.ts +42 -0
  500. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +5 -1
  501. package/dist/types/client/events/abprops.d.ts +2 -1
  502. package/dist/types/client/events/appstate-mutation.d.ts +3 -0
  503. package/dist/types/client/events/business.d.ts +10 -0
  504. package/dist/types/client/events/call.d.ts +31 -0
  505. package/dist/types/client/events/chatstate.d.ts +9 -0
  506. package/dist/types/client/events/devices.d.ts +5 -4
  507. package/dist/types/client/{dirty.d.ts → events/dirty.d.ts} +4 -3
  508. package/dist/types/client/events/group.d.ts +2 -1
  509. package/dist/types/client/events/identity.d.ts +2 -1
  510. package/dist/types/client/{incoming.d.ts → events/incoming.d.ts} +27 -4
  511. package/dist/types/client/events/mex-notification.d.ts +6 -0
  512. package/dist/types/client/events/picture.d.ts +8 -0
  513. package/dist/types/client/events/presence.d.ts +28 -0
  514. package/dist/types/client/events/receipt.d.ts +14 -0
  515. package/dist/types/client/events/registration.d.ts +4 -3
  516. package/dist/types/client/index.d.ts +1 -1
  517. package/dist/types/client/media.d.ts +35 -1
  518. package/dist/types/client/messaging/fanout.d.ts +2 -2
  519. package/dist/types/client/messaging/group-metadata.d.ts +19 -0
  520. package/dist/types/client/messaging/ignore-key.d.ts +11 -0
  521. package/dist/types/client/messaging/key-protocol.d.ts +9 -7
  522. package/dist/types/client/messaging/link-preview.d.ts +19 -0
  523. package/dist/types/client/messaging/messages.d.ts +28 -0
  524. package/dist/types/client/newsletter/admin.d.ts +71 -0
  525. package/dist/types/client/newsletter/content.d.ts +42 -0
  526. package/dist/types/client/newsletter/discovery.d.ts +33 -0
  527. package/dist/types/client/newsletter/messaging.d.ts +66 -0
  528. package/dist/types/client/newsletter/mex.d.ts +14 -0
  529. package/dist/types/client/newsletter/parse.d.ts +19 -0
  530. package/dist/types/client/newsletter/types.d.ts +190 -0
  531. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +12 -1
  532. package/dist/types/client/persistence/history-sync.d.ts +29 -0
  533. package/dist/types/client/{mailbox.d.ts → persistence/mailbox.d.ts} +4 -4
  534. package/dist/types/client/tokens/cs-token.d.ts +1 -3
  535. package/dist/types/client/types.d.ts +843 -71
  536. package/dist/types/crypto/core/hkdf.d.ts +10 -2
  537. package/dist/types/crypto/core/index.d.ts +2 -2
  538. package/dist/types/crypto/core/keys.d.ts +0 -4
  539. package/dist/types/crypto/core/nonce.d.ts +4 -5
  540. package/dist/types/crypto/core/primitives.d.ts +31 -20
  541. package/dist/types/crypto/core/random.d.ts +6 -0
  542. package/dist/types/crypto/core/xeddsa.d.ts +9 -0
  543. package/dist/types/crypto/curves/Ed25519.d.ts +7 -1
  544. package/dist/types/crypto/curves/X25519.d.ts +20 -1
  545. package/dist/types/crypto/curves/constants.d.ts +4 -3
  546. package/dist/types/crypto/curves/types.d.ts +0 -5
  547. package/dist/types/crypto/math/constants.d.ts +0 -1
  548. package/dist/types/crypto/math/mod.d.ts +0 -1
  549. package/dist/types/index.d.ts +32 -6
  550. package/dist/types/infra/log/ConsoleLogger.d.ts +18 -1
  551. package/dist/types/infra/log/PinoLogger.d.ts +55 -1
  552. package/dist/types/infra/log/types.d.ts +6 -0
  553. package/dist/types/infra/perf/BackgroundQueue.d.ts +19 -0
  554. package/dist/types/media/constants.d.ts +7 -2
  555. package/dist/types/media/crypto/WaMediaCrypto.d.ts +59 -0
  556. package/dist/types/media/index.d.ts +7 -5
  557. package/dist/types/media/processor.d.ts +27 -5
  558. package/dist/types/media/sticker/sticker-pack.d.ts +6 -0
  559. package/dist/types/media/{WaMediaTransferClient.d.ts → transfer/WaMediaTransferClient.d.ts} +30 -1
  560. package/dist/types/media/transfer/conn.d.ts +7 -0
  561. package/dist/types/media/types.d.ts +1 -2
  562. package/dist/types/message/WaMessageClient.d.ts +14 -0
  563. package/dist/types/message/addons/link-preview/builder.d.ts +13 -0
  564. package/dist/types/message/addons/link-preview/detect.d.ts +5 -0
  565. package/dist/types/message/addons/link-preview/fetcher.d.ts +13 -0
  566. package/dist/types/message/addons/link-preview/types.d.ts +51 -0
  567. package/dist/types/message/context-info.d.ts +66 -0
  568. package/dist/types/message/{addon-crypto.d.ts → crypto/addon-crypto.d.ts} +27 -5
  569. package/dist/types/message/{icdc.d.ts → crypto/icdc.d.ts} +4 -4
  570. package/dist/types/message/{phash.d.ts → crypto/phash.d.ts} +1 -1
  571. package/dist/types/message/{reporting-token.d.ts → crypto/reporting-token.d.ts} +2 -2
  572. package/dist/types/message/{use-case-secret.d.ts → crypto/use-case-secret.d.ts} +17 -1
  573. package/dist/types/message/encode/content.d.ts +43 -0
  574. package/dist/types/message/{device-sent.d.ts → encode/device-sent.d.ts} +1 -1
  575. package/dist/types/message/encode/media-payload.d.ts +12 -0
  576. package/dist/types/message/index.d.ts +2 -2
  577. package/dist/types/message/kinds/bot.d.ts +31 -0
  578. package/dist/types/message/kinds/newsletter.d.ts +12 -0
  579. package/dist/types/message/kinds/sticker-pack.d.ts +6 -0
  580. package/dist/types/message/{ack.d.ts → primitives/ack.d.ts} +1 -1
  581. package/dist/types/message/primitives/incoming.d.ts +21 -0
  582. package/dist/types/message/primitives/peer-data-operation.d.ts +23 -0
  583. package/dist/types/message/types.d.ts +208 -10
  584. package/dist/types/mex.d.ts +2 -0
  585. package/dist/types/proto.d.ts +2 -2
  586. package/dist/types/protocol/abprops.d.ts +9 -0
  587. package/dist/types/protocol/appstate.d.ts +4 -49
  588. package/dist/types/protocol/auth.d.ts +2 -2
  589. package/dist/types/protocol/bot.d.ts +45 -0
  590. package/dist/types/protocol/browser.d.ts +8 -0
  591. package/dist/types/protocol/business.d.ts +21 -0
  592. package/dist/types/protocol/call.d.ts +44 -0
  593. package/dist/types/protocol/constants.d.ts +16 -3
  594. package/dist/types/protocol/defaults.d.ts +3 -0
  595. package/dist/types/protocol/group.d.ts +1 -1
  596. package/dist/types/protocol/index.d.ts +2 -1
  597. package/dist/types/protocol/jid.d.ts +78 -0
  598. package/dist/types/protocol/media.d.ts +21 -13
  599. package/dist/types/protocol/message.d.ts +4 -0
  600. package/dist/types/protocol/newsletter.d.ts +65 -0
  601. package/dist/types/protocol/nodes.d.ts +20 -0
  602. package/dist/types/protocol/notification.d.ts +16 -0
  603. package/dist/types/protocol/presence.d.ts +16 -0
  604. package/dist/types/protocol/status.d.ts +7 -0
  605. package/dist/types/retry/codec.d.ts +5 -0
  606. package/dist/types/retry/index.d.ts +1 -1
  607. package/dist/types/retry/parse.d.ts +9 -0
  608. package/dist/types/retry/reason.d.ts +5 -0
  609. package/dist/types/retry/replay.d.ts +19 -5
  610. package/dist/types/retry/tracker.d.ts +10 -3
  611. package/dist/types/retry/types.d.ts +3 -8
  612. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +20 -0
  613. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +10 -0
  614. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +9 -0
  615. package/dist/types/signal/api/SignalMissingPreKeysSyncApi.d.ts +8 -0
  616. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +10 -0
  617. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +13 -0
  618. package/dist/types/signal/api/codec.d.ts +20 -0
  619. package/dist/types/signal/api/constants.d.ts +1 -1
  620. package/dist/types/signal/api/prekeys.d.ts +4 -0
  621. package/dist/types/signal/{crypto → attestation}/WaAdvSignature.d.ts +2 -2
  622. package/dist/types/signal/attestation/constants.d.ts +4 -0
  623. package/dist/types/signal/constants.d.ts +7 -4
  624. package/dist/types/signal/encoding.d.ts +6 -68
  625. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  626. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -0
  627. package/dist/types/signal/group/encoding.d.ts +25 -0
  628. package/dist/types/signal/index.d.ts +4 -1
  629. package/dist/types/signal/registration/encoding.d.ts +30 -0
  630. package/dist/types/signal/registration/keygen.d.ts +10 -0
  631. package/dist/types/signal/registration/utils.d.ts +5 -0
  632. package/dist/types/signal/session/SignalProtocol.d.ts +55 -0
  633. package/dist/types/signal/session/SignalRatchet.d.ts +2 -3
  634. package/dist/types/signal/session/SignalSession.d.ts +0 -1
  635. package/dist/types/signal/session/encoding.d.ts +28 -0
  636. package/dist/types/signal/session/resolver.d.ts +14 -0
  637. package/dist/types/store/cache/identity.cache.d.ts +15 -0
  638. package/dist/types/store/cache/privacy-token.cache.d.ts +15 -0
  639. package/dist/types/store/cache/sender-key.cache.d.ts +18 -0
  640. package/dist/types/store/cache/session.cache.d.ts +23 -0
  641. package/dist/types/store/contracts/contact.store.d.ts +14 -0
  642. package/dist/types/store/contracts/device-list.store.d.ts +13 -0
  643. package/dist/types/store/contracts/group-metadata.store.d.ts +14 -0
  644. package/dist/types/store/contracts/message.store.d.ts +0 -2
  645. package/dist/types/store/createStore.d.ts +54 -2
  646. package/dist/types/store/index.d.ts +17 -16
  647. package/dist/types/store/locks/group-metadata.lock.d.ts +2 -0
  648. package/dist/types/store/{providers/memory → memory}/appstate.store.d.ts +2 -2
  649. package/dist/types/store/memory/auth.store.d.ts +18 -0
  650. package/dist/types/store/{providers/memory → memory}/contact.store.d.ts +6 -1
  651. package/dist/types/store/{providers/memory → memory}/device-list.store.d.ts +15 -2
  652. package/dist/types/store/memory/group-metadata.store.d.ts +27 -0
  653. package/dist/types/store/{providers/memory → memory}/identity.store.d.ts +2 -2
  654. package/dist/types/store/{providers/memory → memory}/message-secret.store.d.ts +12 -2
  655. package/dist/types/store/{providers/memory → memory}/message.store.d.ts +1 -1
  656. package/dist/types/store/{providers/memory → memory}/pre-key.store.d.ts +2 -2
  657. package/dist/types/store/{providers/memory → memory}/privacy-token.store.d.ts +1 -1
  658. package/dist/types/store/{providers/memory → memory}/retry.store.d.ts +16 -3
  659. package/dist/types/store/{providers/memory → memory}/sender-key.store.d.ts +2 -2
  660. package/dist/types/store/{providers/memory → memory}/session.store.d.ts +2 -2
  661. package/dist/types/store/{providers/memory → memory}/signal.store.d.ts +2 -2
  662. package/dist/types/store/{providers/memory → memory}/thread.store.d.ts +1 -1
  663. package/dist/types/store/noop.store.d.ts +2 -2
  664. package/dist/types/store/types.d.ts +250 -6
  665. package/dist/types/transport/WaComms.d.ts +5 -0
  666. package/dist/types/transport/WaWebSocket.d.ts +5 -0
  667. package/dist/types/transport/binary/constants.d.ts +8 -2
  668. package/dist/types/transport/binary/decoder.d.ts +5 -0
  669. package/dist/types/transport/binary/encoder.d.ts +5 -0
  670. package/dist/types/transport/binary/tokens.d.ts +6 -6
  671. package/dist/types/transport/index.d.ts +3 -1
  672. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +7 -0
  673. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +6 -0
  674. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +5 -0
  675. package/dist/types/transport/node/WaNodeTransport.d.ts +13 -0
  676. package/dist/types/transport/node/builders/account-sync.d.ts +1 -2
  677. package/dist/types/transport/node/builders/bot.d.ts +4 -0
  678. package/dist/types/transport/node/builders/business.d.ts +21 -4
  679. package/dist/types/transport/node/builders/chatstate.d.ts +11 -0
  680. package/dist/types/transport/node/builders/community.d.ts +17 -0
  681. package/dist/types/transport/node/builders/group.d.ts +44 -2
  682. package/dist/types/transport/node/builders/message.d.ts +11 -6
  683. package/dist/types/transport/node/builders/newsletter.d.ts +73 -0
  684. package/dist/types/transport/node/builders/passive.d.ts +3 -0
  685. package/dist/types/transport/node/builders/presence.d.ts +8 -1
  686. package/dist/types/transport/node/builders/profile.d.ts +3 -0
  687. package/dist/types/transport/node/builders/tos.d.ts +12 -0
  688. package/dist/types/transport/node/builders/usync.d.ts +16 -0
  689. package/dist/types/transport/node/helpers.d.ts +1 -2
  690. package/dist/types/transport/node/mex/client.d.ts +12 -1
  691. package/dist/types/transport/node/query.d.ts +19 -1
  692. package/dist/types/transport/node/usync.d.ts +3 -0
  693. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +5 -0
  694. package/dist/types/transport/noise/WaNoiseCert.d.ts +5 -0
  695. package/dist/types/transport/noise/WaNoiseHandshake.d.ts +12 -6
  696. package/dist/types/transport/noise/WaNoiseSession.d.ts +0 -1
  697. package/dist/types/transport/noise/WaNoiseSocket.d.ts +12 -6
  698. package/dist/types/transport/noise/constants.d.ts +4 -5
  699. package/dist/types/transport/proxy.d.ts +5 -0
  700. package/dist/types/transport/types.d.ts +14 -7
  701. package/dist/types/transport/wa-web-version-fetcher.d.ts +44 -0
  702. package/dist/types/util/async.d.ts +4 -0
  703. package/dist/types/util/bytes.d.ts +36 -1
  704. package/dist/types/util/clock.d.ts +6 -0
  705. package/dist/types/util/coercion.d.ts +25 -0
  706. package/dist/types/util/collections.d.ts +8 -0
  707. package/dist/types/util/index.d.ts +2 -2
  708. package/dist/types/util/primitives.d.ts +11 -0
  709. package/dist/types/util/runtime.d.ts +5 -0
  710. package/dist/types/version-spec.d.ts +1 -0
  711. package/dist/util/async.js +4 -0
  712. package/dist/util/bytes.js +37 -2
  713. package/dist/util/clock.js +18 -0
  714. package/dist/util/coercion.js +48 -3
  715. package/dist/util/collections.js +12 -0
  716. package/dist/util/index.js +7 -1
  717. package/dist/util/primitives.js +20 -0
  718. package/dist/util/runtime.js +5 -0
  719. package/dist/version-spec.js +5 -0
  720. package/package.json +32 -8
  721. package/spec/appstate/index.d.ts +188 -0
  722. package/spec/appstate/index.js +850 -0
  723. package/spec/mex/index.d.ts +4172 -0
  724. package/spec/mex/index.js +261 -0
  725. package/spec/proto/index.d.ts +16305 -0
  726. package/spec/proto/index.js +1 -0
  727. package/spec/version/index.d.ts +4 -0
  728. package/spec/version/index.js +9 -0
  729. package/spec/version/version.json +3 -0
  730. package/dist/client/events/chat.js +0 -227
  731. package/dist/client/incoming.js +0 -306
  732. package/dist/client/mailbox.js +0 -66
  733. package/dist/client/messages.js +0 -305
  734. package/dist/esm/client/events/chat.js +0 -224
  735. package/dist/esm/client/incoming.js +0 -296
  736. package/dist/esm/client/mailbox.js +0 -63
  737. package/dist/esm/client/messages.js +0 -301
  738. package/dist/esm/media/WaMediaCrypto.js +0 -499
  739. package/dist/esm/message/phash.js +0 -47
  740. package/dist/esm/store/locks/participants.lock.js +0 -20
  741. package/dist/esm/store/providers/memory/contact.store.js +0 -28
  742. package/dist/esm/store/providers/memory/device-list.store.js +0 -67
  743. package/dist/esm/transport/node/mex/persist-ids.js +0 -10
  744. package/dist/media/WaMediaCrypto.js +0 -503
  745. package/dist/message/phash.js +0 -50
  746. package/dist/store/locks/participants.lock.js +0 -23
  747. package/dist/store/providers/memory/contact.store.js +0 -32
  748. package/dist/store/providers/memory/device-list.store.js +0 -71
  749. package/dist/transport/node/mex/persist-ids.js +0 -13
  750. package/dist/types/appstate/WaAppStateSyncClient.d.ts +0 -70
  751. package/dist/types/client/events/chat.d.ts +0 -3
  752. package/dist/types/client/history-sync.d.ts +0 -20
  753. package/dist/types/client/messages.d.ts +0 -18
  754. package/dist/types/client/messaging/participants.d.ts +0 -13
  755. package/dist/types/media/WaMediaCrypto.d.ts +0 -22
  756. package/dist/types/media/conn.d.ts +0 -3
  757. package/dist/types/message/content.d.ts +0 -14
  758. package/dist/types/message/incoming.d.ts +0 -18
  759. package/dist/types/signal/crypto/constants.d.ts +0 -4
  760. package/dist/types/store/contracts/participants.store.d.ts +0 -13
  761. package/dist/types/store/locks/participants.lock.d.ts +0 -2
  762. package/dist/types/store/providers/memory/participants.store.d.ts +0 -17
  763. package/dist/types/transport/node/mex/persist-ids.d.ts +0 -14
  764. package/proto/index.d.ts +0 -10903
  765. package/proto/index.js +0 -1
  766. /package/dist/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  767. /package/dist/esm/{store/contracts/participants.store.js → client/newsletter/types.js} +0 -0
  768. /package/dist/esm/message/{device-sent.js → encode/device-sent.js} +0 -0
  769. /package/dist/esm/signal/{crypto → attestation}/constants.js +0 -0
  770. /package/dist/esm/store/{providers/memory → memory}/signal.store.js +0 -0
  771. /package/dist/message/{device-sent.js → encode/device-sent.js} +0 -0
  772. /package/dist/signal/{crypto → attestation}/constants.js +0 -0
  773. /package/dist/store/{providers/memory → memory}/signal.store.js +0 -0
  774. /package/dist/types/message/{padding.d.ts → encode/padding.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
- import { resolvePositive } from '../../../util/coercion.js';
2
- import { resolveCleanupIntervalMs, setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { resolvePositive } from '../../util/coercion.js';
2
+ import { createPeriodicCleanup, setBoundedMapEntry } from '../../util/collections.js';
3
3
  const DEFAULTS = Object.freeze({
4
4
  ttlMs: 30 * 60 * 1000,
5
5
  maxSecrets: 10000
@@ -12,10 +12,19 @@ export class WaMessageSecretMemoryStore {
12
12
  this.secrets = new Map();
13
13
  this.ttlMs = ttlMs;
14
14
  this.maxSecrets = resolvePositive(options.maxSecrets, DEFAULTS.maxSecrets, 'WaMessageSecretMemoryStoreOptions.maxSecrets');
15
- this.cleanupTimer = setInterval(() => {
15
+ this.logger = options.logger;
16
+ this.capacityWarned = false;
17
+ this.cleanup = createPeriodicCleanup(ttlMs, () => {
16
18
  void this.cleanupExpired(Date.now());
17
- }, resolveCleanupIntervalMs(ttlMs));
18
- this.cleanupTimer.unref();
19
+ });
20
+ }
21
+ warnCapacity() {
22
+ if (this.capacityWarned || !this.logger)
23
+ return;
24
+ this.capacityWarned = true;
25
+ this.logger.warn('message secret store at capacity, evicting oldest', {
26
+ max: this.maxSecrets
27
+ });
19
28
  }
20
29
  async get(messageId, nowMs = Date.now()) {
21
30
  const cached = this.secrets.get(messageId);
@@ -49,7 +58,7 @@ export class WaMessageSecretMemoryStore {
49
58
  secret: entry.secret,
50
59
  senderJid: entry.senderJid,
51
60
  expiresAtMs: Date.now() + this.ttlMs
52
- }, this.maxSecrets);
61
+ }, this.maxSecrets, () => this.warnCapacity());
53
62
  }
54
63
  async setBatch(entries) {
55
64
  const nowMs = Date.now();
@@ -58,7 +67,7 @@ export class WaMessageSecretMemoryStore {
58
67
  secret: entries[i].entry.secret,
59
68
  senderJid: entries[i].entry.senderJid,
60
69
  expiresAtMs: nowMs + this.ttlMs
61
- }, this.maxSecrets);
70
+ }, this.maxSecrets, () => this.warnCapacity());
62
71
  }
63
72
  }
64
73
  async cleanupExpired(nowMs) {
@@ -75,7 +84,7 @@ export class WaMessageSecretMemoryStore {
75
84
  this.secrets.clear();
76
85
  }
77
86
  async destroy() {
78
- clearInterval(this.cleanupTimer);
87
+ this.cleanup.destroy();
79
88
  this.secrets.clear();
80
89
  }
81
90
  }
@@ -1,5 +1,5 @@
1
- import { resolvePositive } from '../../../util/coercion.js';
2
- import { normalizeQueryLimit, setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { resolvePositive } from '../../util/coercion.js';
2
+ import { normalizeQueryLimit, setBoundedMapEntry } from '../../util/collections.js';
3
3
  const DEFAULT_MESSAGE_MEMORY_STORE_LIMITS = Object.freeze({
4
4
  messages: 50000
5
5
  });
@@ -1,5 +1,5 @@
1
- import { resolvePositive } from '../../../util/coercion.js';
2
- import { setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { resolvePositive } from '../../util/coercion.js';
2
+ import { setBoundedMapEntry } from '../../util/collections.js';
3
3
  const DEFAULT_MAX_PRE_KEYS = 4096;
4
4
  export class WaPreKeyMemoryStore {
5
5
  constructor(options = {}) {
@@ -1,4 +1,4 @@
1
- import { setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { setBoundedMapEntry } from '../../util/collections.js';
2
2
  const DEFAULT_MAX_ENTRIES = 10000;
3
3
  export class WaPrivacyTokenMemoryStore {
4
4
  constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
@@ -1,5 +1,5 @@
1
- import { resolvePositive } from '../../../util/coercion.js';
2
- import { resolveCleanupIntervalMs, setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { resolvePositive } from '../../util/coercion.js';
2
+ import { createPeriodicCleanup, setBoundedMapEntry } from '../../util/collections.js';
3
3
  const DEFAULTS = Object.freeze({
4
4
  ttlMs: 60 * 1000,
5
5
  maxOutboundMessages: 10000,
@@ -16,10 +16,28 @@ export class WaRetryMemoryStore {
16
16
  this.ttlMs = ttlMs;
17
17
  this.maxOutboundMessages = resolvePositive(options.maxOutboundMessages, DEFAULTS.maxOutboundMessages, 'WaRetryMemoryStoreOptions.maxOutboundMessages');
18
18
  this.maxInboundCounters = resolvePositive(options.maxInboundCounters, DEFAULTS.maxInboundCounters, 'WaRetryMemoryStoreOptions.maxInboundCounters');
19
- this.cleanupTimer = setInterval(() => {
19
+ this.logger = options.logger;
20
+ this.outboundCapacityWarned = false;
21
+ this.inboundCapacityWarned = false;
22
+ this.cleanup = createPeriodicCleanup(this.ttlMs, () => {
20
23
  void this.cleanupExpired(Date.now());
21
- }, resolveCleanupIntervalMs(this.ttlMs));
22
- this.cleanupTimer.unref();
24
+ });
25
+ }
26
+ warnOutboundCapacity() {
27
+ if (this.outboundCapacityWarned || !this.logger)
28
+ return;
29
+ this.outboundCapacityWarned = true;
30
+ this.logger.warn('retry outbound store at capacity, evicting oldest', {
31
+ max: this.maxOutboundMessages
32
+ });
33
+ }
34
+ warnInboundCapacity() {
35
+ if (this.inboundCapacityWarned || !this.logger)
36
+ return;
37
+ this.inboundCapacityWarned = true;
38
+ this.logger.warn('retry inbound counters at capacity, evicting oldest', {
39
+ max: this.maxInboundCounters
40
+ });
23
41
  }
24
42
  getTtlMs() {
25
43
  return this.ttlMs;
@@ -75,6 +93,7 @@ export class WaRetryMemoryStore {
75
93
  };
76
94
  setBoundedMapEntry(this.outboundMessages, record.messageId, storedRecord, this.maxOutboundMessages, (messageId) => {
77
95
  this.eligibleSets.delete(messageId);
96
+ this.warnOutboundCapacity();
78
97
  });
79
98
  if (record.eligibleRequesterDeviceJids && record.eligibleRequesterDeviceJids.length > 0) {
80
99
  this.eligibleSets.set(record.messageId, new Set(record.eligibleRequesterDeviceJids));
@@ -103,6 +122,7 @@ export class WaRetryMemoryStore {
103
122
  expiresAtMs
104
123
  }, this.maxOutboundMessages, (evictedMessageId) => {
105
124
  this.eligibleSets.delete(evictedMessageId);
125
+ this.warnOutboundCapacity();
106
126
  });
107
127
  }
108
128
  async markOutboundRequesterDelivered(messageId, requesterDeviceJid, updatedAtMs, expiresAtMs) {
@@ -119,13 +139,14 @@ export class WaRetryMemoryStore {
119
139
  expiresAtMs
120
140
  }, this.maxOutboundMessages, (evictedMessageId) => {
121
141
  this.eligibleSets.delete(evictedMessageId);
142
+ this.warnOutboundCapacity();
122
143
  });
123
144
  }
124
145
  async incrementInboundCounter(messageId, requesterJid, _updatedAtMs, expiresAtMs) {
125
146
  const key = this.counterKey(messageId, requesterJid);
126
147
  const current = this.inboundCounters.get(key);
127
148
  const count = current ? current.count + 1 : 1;
128
- setBoundedMapEntry(this.inboundCounters, key, { count, expiresAtMs }, this.maxInboundCounters);
149
+ setBoundedMapEntry(this.inboundCounters, key, { count, expiresAtMs }, this.maxInboundCounters, () => this.warnInboundCapacity());
129
150
  return count;
130
151
  }
131
152
  async cleanupExpired(nowMs) {
@@ -151,7 +172,7 @@ export class WaRetryMemoryStore {
151
172
  this.inboundCounters.clear();
152
173
  }
153
174
  async destroy() {
154
- clearInterval(this.cleanupTimer);
175
+ this.cleanup.destroy();
155
176
  await this.clear();
156
177
  }
157
178
  counterKey(messageId, requesterJid) {
@@ -1,6 +1,6 @@
1
- import { signalAddressKey } from '../../../protocol/jid.js';
2
- import { resolvePositive } from '../../../util/coercion.js';
3
- import { setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { signalAddressKey } from '../../protocol/jid.js';
2
+ import { resolvePositive } from '../../util/coercion.js';
3
+ import { setBoundedMapEntry } from '../../util/collections.js';
4
4
  const DEFAULT_SENDER_KEY_STORE_LIMITS = Object.freeze({
5
5
  senderKeys: 8192,
6
6
  senderDistributions: 8192
@@ -1,6 +1,6 @@
1
- import { signalAddressKey } from '../../../protocol/jid.js';
2
- import { resolvePositive } from '../../../util/coercion.js';
3
- import { setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { signalAddressKey } from '../../protocol/jid.js';
2
+ import { resolvePositive } from '../../util/coercion.js';
3
+ import { setBoundedMapEntry } from '../../util/collections.js';
4
4
  const DEFAULT_MAX_SESSIONS = 8192;
5
5
  export class WaSessionMemoryStore {
6
6
  constructor(options = {}) {
@@ -1,5 +1,5 @@
1
- import { resolvePositive } from '../../../util/coercion.js';
2
- import { normalizeQueryLimit, setBoundedMapEntry } from '../../../util/collections.js';
1
+ import { resolvePositive } from '../../util/coercion.js';
2
+ import { normalizeQueryLimit, setBoundedMapEntry } from '../../util/collections.js';
3
3
  const DEFAULT_THREAD_MEMORY_STORE_LIMITS = Object.freeze({
4
4
  threads: 10000
5
5
  });
@@ -27,6 +27,7 @@ export const NOOP_CONTACT_STORE = Object.freeze({
27
27
  upsert: async (_record) => { },
28
28
  upsertBatch: async (_records) => { },
29
29
  getByJid: async (_jid) => null,
30
+ getByPhoneNumber: async (_pn) => null,
30
31
  deleteByJid: async (_jid) => 0,
31
32
  clear: async () => { }
32
33
  });
@@ -42,10 +43,10 @@ export const NOOP_RETRY_STORE = Object.freeze({
42
43
  clear: async () => { },
43
44
  destroy: async () => { }
44
45
  });
45
- export const NOOP_PARTICIPANTS_STORE = Object.freeze({
46
- upsertGroupParticipants: async (_snapshot) => { },
47
- getGroupParticipants: async (_groupJid, _nowMs) => null,
48
- deleteGroupParticipants: async (_groupJid) => 0,
46
+ export const NOOP_GROUP_METADATA_STORE = Object.freeze({
47
+ upsertGroupMetadata: async (_snapshot) => { },
48
+ getGroupMetadata: async (_groupJid, _nowMs) => null,
49
+ deleteGroupMetadata: async (_groupJid) => 0,
49
50
  cleanupExpired: async (_nowMs) => 0,
50
51
  clear: async () => { },
51
52
  destroy: async () => { }
@@ -53,6 +54,7 @@ export const NOOP_PARTICIPANTS_STORE = Object.freeze({
53
54
  export const NOOP_DEVICE_LIST_STORE = Object.freeze({
54
55
  upsertUserDevicesBatch: async (_snapshots) => { },
55
56
  getUserDevicesBatch: async (userJids, _nowMs) => new Array(userJids.length).fill(null),
57
+ findByAnyUserJid: async (_jid, _nowMs) => null,
56
58
  deleteUserDevices: async (_userJid) => 0,
57
59
  cleanupExpired: async (_nowMs) => 0,
58
60
  clear: async () => { },
@@ -9,6 +9,11 @@ const WA_FRAME_HANDLER_QUEUE_MAX_SIZE = 4096;
9
9
  const WA_FRAME_HANDLER_MAX_CONCURRENCY = 8;
10
10
  const WA_PENDING_FRAMES_MAX_COUNT = 2048;
11
11
  const WA_PENDING_FRAMES_MAX_BYTES = 16 * 1024 * 1024;
12
+ /**
13
+ * Owns the WebSocket + Noise handshake lifecycle: opens the socket, drives
14
+ * the noise pairing/login exchange, persists routing-info/server-static
15
+ * updates, and delivers post-handshake binary frames to the caller.
16
+ */
12
17
  export class WaComms {
13
18
  constructor(config, logger = new ConsoleLogger('info')) {
14
19
  if (!config.noise) {
@@ -46,6 +51,7 @@ export class WaComms {
46
51
  onClose: async (info) => {
47
52
  await this.onSocketClosed(info);
48
53
  },
54
+ // eslint-disable-next-line @typescript-eslint/require-await
49
55
  onError: async (error) => {
50
56
  this.logger.warn('socket runtime error', { message: error.message });
51
57
  },
@@ -110,7 +116,7 @@ export class WaComms {
110
116
  };
111
117
  }
112
118
  startComms(handleStanza, inflateFrame) {
113
- this.logger.info('comms start requested');
119
+ this.logger.debug('comms start requested');
114
120
  this.stanzaHandler = handleStanza;
115
121
  this.inflateFrame = inflateFrame ?? null;
116
122
  this.clearPendingFrames();
@@ -150,7 +156,7 @@ export class WaComms {
150
156
  this.frameProcessingQueue = this.frameProcessingQueue.then(() => this.flushPendingFrames(), () => this.flushPendingFrames());
151
157
  }
152
158
  async stopComms() {
153
- this.logger.info('comms stop requested');
159
+ this.logger.debug('comms stop requested');
154
160
  this.resetConnectionState({
155
161
  started: false,
156
162
  connected: false,
@@ -163,7 +169,7 @@ export class WaComms {
163
169
  await this.socket.close(1000, 'stop_comms');
164
170
  }
165
171
  async closeSocketAndResume() {
166
- this.logger.info('comms close socket and resume requested');
172
+ this.logger.debug('comms close socket and resume requested');
167
173
  this.resetConnectionState({
168
174
  started: true,
169
175
  connected: false,
@@ -248,6 +254,7 @@ export class WaComms {
248
254
  this.logger.warn('socket open failed', { message: toError(error).message });
249
255
  }
250
256
  }
257
+ // eslint-disable-next-line @typescript-eslint/require-await
251
258
  async onSocketClosed(info) {
252
259
  this.connected = false;
253
260
  this.noiseSession?.onSocketClosed(new Error(`socket closed (${info.code}:${info.reason})`));
@@ -269,7 +276,8 @@ export class WaComms {
269
276
  this.logger.info('socket closed, scheduling reconnect', {
270
277
  code: info.code,
271
278
  reason: info.reason,
272
- reconnectAfterMs: this.config.reconnectIntervalMs
279
+ reconnectAfterMs: this.config.reconnectIntervalMs,
280
+ reconnectAttempts: this.reconnectAttempts
273
281
  });
274
282
  }
275
283
  onSocketMessage(payload) {
@@ -344,9 +352,10 @@ export class WaComms {
344
352
  this.lastServerStaticKey = session.getServerStaticKey();
345
353
  this.connected = true;
346
354
  this.reconnectAttempts = 0;
347
- this.logger.info('comms connected and noise session established');
355
+ this.logger.debug('comms connected and noise session established');
348
356
  this.drainWaiters((waiter) => waiter.resolve());
349
357
  }
358
+ // eslint-disable-next-line @typescript-eslint/require-await
350
359
  async flushPendingFrames() {
351
360
  if (!this.handlingRequests || !this.stanzaHandler || this.pendingFrames.length === 0) {
352
361
  return;
@@ -67,6 +67,11 @@ function resolveSocketRuntime() {
67
67
  }
68
68
  return 'browser';
69
69
  }
70
+ /**
71
+ * Thin wrapper around a `RawWebSocket` (or Node `ws` constructor) used by
72
+ * {@link WaComms}. Iterates the configured URL list on failure and applies a
73
+ * connect/idle timeout.
74
+ */
70
75
  export class WaWebSocket {
71
76
  constructor(config, logger = new ConsoleLogger('info')) {
72
77
  this.config = Object.freeze({
@@ -172,6 +177,7 @@ export class WaWebSocket {
172
177
  }
173
178
  });
174
179
  }
180
+ // eslint-disable-next-line @typescript-eslint/require-await
175
181
  async send(data) {
176
182
  const socket = this.socket;
177
183
  if (!socket || socket.readyState !== WA_READY_STATES.OPEN) {
@@ -335,16 +341,30 @@ export class WaWebSocket {
335
341
  handlers.onOpen();
336
342
  };
337
343
  entry.socket.onerror = () => {
338
- this.logger.warn('socket open error', { url: entry.url });
344
+ if (entry.settled) {
345
+ this.logger.trace('settled pending socket error', { url: entry.url });
346
+ }
347
+ else {
348
+ this.logger.warn('socket open error', { url: entry.url });
349
+ }
339
350
  handlers.onFail(new Error(`websocket connect error for ${entry.url}`));
340
351
  };
341
352
  entry.socket.onclose = (event) => {
342
353
  const info = this.toCloseInfo(event);
343
- this.logger.warn('socket closed before open', {
344
- url: entry.url,
345
- code: info.code,
346
- reason: info.reason
347
- });
354
+ if (entry.settled) {
355
+ this.logger.trace('settled pending socket closed', {
356
+ url: entry.url,
357
+ code: info.code,
358
+ reason: info.reason
359
+ });
360
+ }
361
+ else {
362
+ this.logger.warn('socket closed before open', {
363
+ url: entry.url,
364
+ code: info.code,
365
+ reason: info.reason
366
+ });
367
+ }
348
368
  handlers.onFail(new Error(`websocket closed before open (${info.code}:${info.reason}) for ${entry.url}`));
349
369
  };
350
370
  }
@@ -404,8 +424,12 @@ export class WaWebSocket {
404
424
  try {
405
425
  socket.close(code, reason);
406
426
  }
407
- catch {
408
- // no-op
427
+ catch (error) {
428
+ this.logger.trace('socket close ignored', {
429
+ code,
430
+ reason,
431
+ message: toError(error).message
432
+ });
409
433
  }
410
434
  }
411
435
  async createRawSocket(url) {
@@ -14,7 +14,13 @@ export const BINARY_8 = 252;
14
14
  export const BINARY_20 = 253;
15
15
  export const BINARY_32 = 254;
16
16
  export const NIBBLE_8 = 255;
17
- export const NIBBLE_ALPHABET = [
17
+ export const JID_U_DOMAIN_TYPE_PN = 0x00;
18
+ export const JID_U_DOMAIN_TYPE_LID = 0x01;
19
+ export const JID_U_DOMAIN_TYPE_HOSTED = 0x80;
20
+ export const JID_U_DOMAIN_TYPE_HOSTED_LID = 0x81;
21
+ export const JID_U_DOMAIN_TYPE_HOSTED_MASK = 0x80;
22
+ export const JID_U_DOMAIN_TYPE_LID_MASK = 0x01;
23
+ export const NIBBLE_ALPHABET = Object.freeze([
18
24
  '0',
19
25
  '1',
20
26
  '2',
@@ -31,8 +37,8 @@ export const NIBBLE_ALPHABET = [
31
37
  '\uFFFD',
32
38
  '\uFFFD',
33
39
  '\uFFFD'
34
- ];
35
- export const HEX_ALPHABET = [
40
+ ]);
41
+ export const HEX_ALPHABET = Object.freeze([
36
42
  '0',
37
43
  '1',
38
44
  '2',
@@ -49,7 +55,7 @@ export const HEX_ALPHABET = [
49
55
  'D',
50
56
  'E',
51
57
  'F'
52
- ];
58
+ ]);
53
59
  export const SINGLE_BYTE_TOKEN_MAP = (() => {
54
60
  const map = new Map();
55
61
  for (let i = 0; i < SINGLE_BYTE_TOKENS.length; i += 1) {
@@ -1,18 +1,11 @@
1
1
  import { promisify } from 'node:util';
2
2
  import { inflateRaw, unzip } from 'node:zlib';
3
3
  import { WA_DEFAULTS } from '../../protocol/constants.js';
4
- import { BINARY_20, BINARY_32, BINARY_8, DICTIONARY_0, DICTIONARY_3, HEX_8, HEX_ALPHABET, JID_FB, JID_INTEROP, JID_PAIR, JID_U, LIST_16, LIST_8, LIST_EMPTY, NIBBLE_8, NIBBLE_ALPHABET, STREAM_END } from '../binary/constants.js';
4
+ import { BINARY_20, BINARY_32, BINARY_8, DICTIONARY_0, DICTIONARY_3, HEX_8, HEX_ALPHABET, JID_FB, JID_INTEROP, JID_PAIR, JID_U, JID_U_DOMAIN_TYPE_HOSTED_LID, JID_U_DOMAIN_TYPE_HOSTED_MASK, JID_U_DOMAIN_TYPE_LID, JID_U_DOMAIN_TYPE_LID_MASK, LIST_16, LIST_8, LIST_EMPTY, NIBBLE_8, NIBBLE_ALPHABET, STREAM_END } from '../binary/constants.js';
5
5
  import { DICTIONARIES, SINGLE_BYTE_TOKENS } from '../binary/tokens.js';
6
6
  import { TEXT_DECODER, TEXT_ENCODER, toBytesView } from '../../util/bytes.js';
7
7
  const unzipAsync = promisify(unzip);
8
8
  const inflateRawAsync = promisify(inflateRaw);
9
- const JID_U_DOMAIN_TYPE_LID = 0x01;
10
- const JID_U_DOMAIN_TYPE_HOSTED_LID = 0x81;
11
- const JID_U_DOMAIN_TYPE_HOSTED_MASK = 0x80;
12
- const JID_U_DOMAIN_TYPE_LID_MASK = 0x01;
13
- const JID_U_DOMAIN_LID = 'lid';
14
- const JID_U_DOMAIN_HOSTED = 'hosted';
15
- const JID_U_DOMAIN_HOSTED_LID = 'hosted.lid';
16
9
  class ByteReader {
17
10
  constructor(data) {
18
11
  this.data = data;
@@ -54,27 +47,35 @@ class ByteReader {
54
47
  }
55
48
  }
56
49
  }
50
+ // Reusable scratch buffer for nibble/hex unpack. Max output is
51
+ // `(0x7f) * 2 = 254` bytes (length byte holds the packed-byte count in
52
+ // its low 7 bits, each byte unpacks to ≤2 chars). Single-threaded JS +
53
+ // non-reentrant decoder makes module-level reuse safe – `TextDecoder`
54
+ // copies into the returned string before we touch the buffer again.
55
+ const PACKED_SCRATCH = new Uint8Array(256);
57
56
  function parsePacked(reader, alphabet) {
58
57
  const lengthByte = reader.readUint8();
59
58
  const odd = (lengthByte & 0x80) !== 0;
60
59
  const byteCount = lengthByte & 0x7f;
61
60
  const outLength = byteCount * 2 - (odd ? 1 : 0);
62
- const buf = new Uint8Array(outLength);
61
+ if (outLength < 0) {
62
+ throw new Error(`invalid packed length byte 0x${lengthByte.toString(16)}`);
63
+ }
63
64
  let outIndex = 0;
64
65
  for (let i = 0; i < byteCount; i += 1) {
65
66
  const packed = reader.readUint8();
66
67
  const high = (packed >>> 4) & 0x0f;
67
68
  const low = packed & 0x0f;
68
69
  if (outIndex < outLength) {
69
- buf[outIndex] = alphabet[high].charCodeAt(0);
70
+ PACKED_SCRATCH[outIndex] = alphabet[high].charCodeAt(0);
70
71
  outIndex += 1;
71
72
  }
72
73
  if (outIndex < outLength) {
73
- buf[outIndex] = alphabet[low].charCodeAt(0);
74
+ PACKED_SCRATCH[outIndex] = alphabet[low].charCodeAt(0);
74
75
  outIndex += 1;
75
76
  }
76
77
  }
77
- return TEXT_DECODER.decode(buf);
78
+ return TEXT_DECODER.decode(PACKED_SCRATCH.subarray(0, outLength));
78
79
  }
79
80
  function readBinary(reader, token) {
80
81
  if (token === BINARY_8) {
@@ -128,14 +129,14 @@ function decodeJidU(reader) {
128
129
  const user = decodeTokenString(reader.readUint8(), reader);
129
130
  let domain = WA_DEFAULTS.HOST_DOMAIN;
130
131
  if (domainType === JID_U_DOMAIN_TYPE_LID) {
131
- domain = JID_U_DOMAIN_LID;
132
+ domain = WA_DEFAULTS.LID_SERVER;
132
133
  }
133
134
  else if (domainType === JID_U_DOMAIN_TYPE_HOSTED_LID) {
134
- domain = JID_U_DOMAIN_HOSTED_LID;
135
+ domain = WA_DEFAULTS.HOSTED_LID_SERVER;
135
136
  }
136
137
  else if ((domainType & JID_U_DOMAIN_TYPE_HOSTED_MASK) !== 0 &&
137
138
  (domainType & JID_U_DOMAIN_TYPE_LID_MASK) === 0) {
138
- domain = JID_U_DOMAIN_HOSTED;
139
+ domain = WA_DEFAULTS.HOSTED_SERVER;
139
140
  }
140
141
  if (device > 0) {
141
142
  return `${user}:${device}@${domain}`;
@@ -243,6 +244,7 @@ function decodeNodeInternal(reader) {
243
244
  : { tag: tagValue, attrs, content };
244
245
  return node;
245
246
  }
247
+ /** Decodes raw WhatsApp binary node bytes into a {@link BinaryNode}. */
246
248
  export function decodeBinaryNode(data) {
247
249
  const reader = new ByteReader(data);
248
250
  return decodeNodeInternal(reader);
@@ -261,6 +263,10 @@ async function inflateCompressedStanza(data) {
261
263
  }
262
264
  }
263
265
  }
266
+ /**
267
+ * Decodes a framed stanza: reads the 1-byte flag, inflates the body when the
268
+ * `0x02` compression bit is set, then parses the result as a {@link BinaryNode}.
269
+ */
264
270
  export async function decodeBinaryNodeStanza(stanza) {
265
271
  const reader = new ByteReader(stanza);
266
272
  const flag = reader.readUint8();
@@ -1,4 +1,5 @@
1
- import { BINARY_20, BINARY_32, BINARY_8, DICTIONARY_0, DICTIONARY_TOKEN_MAPS, HEX_8, LIST_16, LIST_8, NIBBLE_8, SINGLE_BYTE_TOKEN_MAP } from '../binary/constants.js';
1
+ import { WA_DEFAULTS } from '../../protocol/constants.js';
2
+ import { BINARY_20, BINARY_32, BINARY_8, DICTIONARY_0, DICTIONARY_TOKEN_MAPS, HEX_8, JID_PAIR, JID_U, JID_U_DOMAIN_TYPE_HOSTED, JID_U_DOMAIN_TYPE_HOSTED_LID, JID_U_DOMAIN_TYPE_LID, JID_U_DOMAIN_TYPE_PN, LIST_16, LIST_8, LIST_EMPTY, NIBBLE_8, SINGLE_BYTE_TOKEN_MAP } from '../binary/constants.js';
2
3
  import { TEXT_ENCODER } from '../../util/bytes.js';
3
4
  class ByteWriter {
4
5
  constructor(initialCapacity = 256) {
@@ -46,27 +47,34 @@ class ByteWriter {
46
47
  this.buffer = next;
47
48
  }
48
49
  }
49
- function isNibbleString(value) {
50
- for (let i = 0; i < value.length; i += 1) {
50
+ const PACKED_NONE = 0;
51
+ const PACKED_NIBBLE = 1;
52
+ const PACKED_HEX = 2;
53
+ function classifyPackedString(value) {
54
+ const n = value.length;
55
+ if (n === 0 || n >= 128)
56
+ return PACKED_NONE;
57
+ let nibbleOk = true;
58
+ let hexOk = true;
59
+ for (let i = 0; i < n; i += 1) {
51
60
  const code = value.charCodeAt(i);
52
- const isDigit = code >= 48 && code <= 57;
53
- const isSpecial = code === 45 || code === 46;
54
- if (!isDigit && !isSpecial) {
55
- return false;
61
+ if (code >= 48 && code <= 57)
62
+ continue;
63
+ if (code === 45 || code === 46) {
64
+ hexOk = false;
65
+ if (!nibbleOk)
66
+ return PACKED_NONE;
67
+ continue;
56
68
  }
57
- }
58
- return value.length > 0;
59
- }
60
- function isHexString(value) {
61
- for (let i = 0; i < value.length; i += 1) {
62
- const code = value.charCodeAt(i);
63
- const isDigit = code >= 48 && code <= 57;
64
- const isHex = code >= 65 && code <= 70;
65
- if (!isDigit && !isHex) {
66
- return false;
69
+ if (code >= 65 && code <= 70) {
70
+ nibbleOk = false;
71
+ if (!hexOk)
72
+ return PACKED_NONE;
73
+ continue;
67
74
  }
75
+ return PACKED_NONE;
68
76
  }
69
- return value.length > 0;
77
+ return nibbleOk ? PACKED_NIBBLE : PACKED_HEX;
70
78
  }
71
79
  function toNibble(value, index, packedType) {
72
80
  const code = value.charCodeAt(index);
@@ -139,11 +147,12 @@ function writeString(value, writer) {
139
147
  return;
140
148
  }
141
149
  }
142
- if (value.length < 128 && isNibbleString(value)) {
150
+ const packed = classifyPackedString(value);
151
+ if (packed === PACKED_NIBBLE) {
143
152
  writePackedString(value, NIBBLE_8, writer);
144
153
  return;
145
154
  }
146
- if (value.length < 128 && isHexString(value)) {
155
+ if (packed === PACKED_HEX) {
147
156
  writePackedString(value, HEX_8, writer);
148
157
  return;
149
158
  }
@@ -151,6 +160,64 @@ function writeString(value, writer) {
151
160
  writeBinaryLength(encoded.length, writer);
152
161
  writer.writeBytes(encoded);
153
162
  }
163
+ function tryWriteJid(value, writer) {
164
+ const atIndex = value.indexOf('@');
165
+ if (atIndex <= 0 || atIndex === value.length - 1) {
166
+ return false;
167
+ }
168
+ if (value.indexOf('@', atIndex + 1) !== -1) {
169
+ return false;
170
+ }
171
+ let userEnd = atIndex;
172
+ let device = 0;
173
+ const colonIndex = value.indexOf(':');
174
+ if (colonIndex !== -1 && colonIndex < atIndex) {
175
+ if (colonIndex === atIndex - 1) {
176
+ return false;
177
+ }
178
+ for (let i = colonIndex + 1; i < atIndex; i += 1) {
179
+ const digit = value.charCodeAt(i) - 48;
180
+ if (digit < 0 || digit > 9) {
181
+ return false;
182
+ }
183
+ device = device * 10 + digit;
184
+ if (device > 255) {
185
+ return false;
186
+ }
187
+ }
188
+ userEnd = colonIndex;
189
+ }
190
+ const server = value.slice(atIndex + 1);
191
+ let domainType = -1;
192
+ if (server === WA_DEFAULTS.LID_SERVER) {
193
+ domainType = JID_U_DOMAIN_TYPE_LID;
194
+ }
195
+ else if (server === WA_DEFAULTS.HOSTED_LID_SERVER) {
196
+ domainType = JID_U_DOMAIN_TYPE_HOSTED_LID;
197
+ }
198
+ else if (server === WA_DEFAULTS.HOST_DOMAIN) {
199
+ domainType = JID_U_DOMAIN_TYPE_PN;
200
+ }
201
+ else if (server === WA_DEFAULTS.HOSTED_SERVER) {
202
+ domainType = JID_U_DOMAIN_TYPE_HOSTED;
203
+ }
204
+ if (domainType !== -1 && device !== 0 && userEnd > 0) {
205
+ writer.writeUint8(JID_U);
206
+ writer.writeUint8(domainType);
207
+ writer.writeUint8(device);
208
+ writeString(value.slice(0, userEnd), writer);
209
+ return true;
210
+ }
211
+ writer.writeUint8(JID_PAIR);
212
+ if (userEnd === 0) {
213
+ writer.writeUint8(LIST_EMPTY);
214
+ }
215
+ else {
216
+ writeString(value.slice(0, userEnd), writer);
217
+ }
218
+ writeString(server, writer);
219
+ return true;
220
+ }
154
221
  function writeListSize(size, writer) {
155
222
  if (!Number.isSafeInteger(size) || size < 0) {
156
223
  throw new Error(`invalid list size ${size}`);
@@ -176,7 +243,10 @@ function writeNodeInternal(node, writer) {
176
243
  for (let i = 0; i < keys.length; i += 1) {
177
244
  const key = keys[i];
178
245
  writeString(key, writer);
179
- writeString(node.attrs[key], writer);
246
+ const value = node.attrs[key];
247
+ if (!tryWriteJid(value, writer)) {
248
+ writeString(value, writer);
249
+ }
180
250
  }
181
251
  if (!hasContent) {
182
252
  return;
@@ -198,11 +268,16 @@ function writeNodeInternal(node, writer) {
198
268
  writeNodeInternal(child, writer);
199
269
  }
200
270
  }
271
+ /** Encodes a {@link BinaryNode} into its raw WhatsApp binary representation. */
201
272
  export function encodeBinaryNode(node) {
202
273
  const writer = new ByteWriter();
203
274
  writeNodeInternal(node, writer);
204
275
  return writer.toUint8Array();
205
276
  }
277
+ /**
278
+ * Encodes a {@link BinaryNode} as a transport stanza – prefixes the bytes
279
+ * with the 1-byte flag (`0x00`) the WebSocket framing expects.
280
+ */
206
281
  export function encodeBinaryNodeStanza(node) {
207
282
  const writer = new ByteWriter();
208
283
  writer.writeUint8(0x00);