zapo-js 0.1.2 → 0.3.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 (630) hide show
  1. package/README.md +16 -4
  2. package/dist/appstate/WaAppStateCrypto.js +50 -42
  3. package/dist/appstate/WaAppStateSyncClient.js +215 -133
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +9 -7
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +55 -57
  8. package/dist/auth/credentials-flow.js +195 -0
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingFlow.js +39 -32
  11. package/dist/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +35 -17
  12. package/dist/client/WaClient.js +338 -174
  13. package/dist/client/WaClientFactory.js +399 -66
  14. package/dist/client/connection/WaConnectionManager.js +23 -11
  15. package/dist/client/coordinators/WaAbPropsCoordinator.js +141 -0
  16. package/dist/client/coordinators/WaBusinessCoordinator.js +232 -0
  17. package/dist/client/coordinators/WaEmailCoordinator.js +63 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +34 -8
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +341 -118
  21. package/dist/client/coordinators/WaOfflineResumeCoordinator.js +114 -0
  22. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  23. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  24. package/dist/client/coordinators/WaProfileCoordinator.js +214 -0
  25. package/dist/client/coordinators/WaRetryCoordinator.js +184 -30
  26. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  27. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +184 -0
  28. package/dist/client/dirty.js +41 -21
  29. package/dist/client/events/abprops.js +43 -0
  30. package/dist/client/events/devices.js +72 -0
  31. package/dist/client/events/group.js +3 -11
  32. package/dist/client/events/identity.js +22 -0
  33. package/dist/client/events/privacy-token.js +38 -0
  34. package/dist/client/events/registration.js +42 -0
  35. package/dist/client/history-sync.js +50 -9
  36. package/dist/client/incoming.js +74 -7
  37. package/dist/client/mailbox.js +40 -23
  38. package/dist/client/media.js +243 -0
  39. package/dist/client/messages.js +245 -92
  40. package/dist/client/messaging/fanout.js +21 -11
  41. package/dist/client/messaging/participants.js +6 -4
  42. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  43. package/dist/client/tokens/cs-token.js +50 -0
  44. package/dist/client/tokens/tc-token.js +25 -0
  45. package/dist/crypto/core/index.js +5 -2
  46. package/dist/crypto/core/keys.js +4 -4
  47. package/dist/crypto/core/nonce.js +2 -0
  48. package/dist/crypto/core/primitives.js +0 -8
  49. package/dist/crypto/core/random.js +24 -8
  50. package/dist/crypto/core/xeddsa.js +57 -0
  51. package/dist/crypto/curves/X25519.js +43 -6
  52. package/dist/crypto/curves/constants.js +2 -1
  53. package/dist/crypto/index.js +3 -0
  54. package/dist/crypto/math/constants.js +13 -36
  55. package/dist/crypto/math/edwards.js +171 -44
  56. package/dist/crypto/math/fe.js +706 -0
  57. package/dist/crypto/math/mod.js +10 -3
  58. package/dist/esm/appstate/WaAppStateCrypto.js +40 -32
  59. package/dist/esm/appstate/WaAppStateSyncClient.js +206 -124
  60. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  61. package/dist/esm/appstate/index.js +2 -2
  62. package/dist/esm/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +1 -1
  63. package/dist/esm/appstate/utils.js +2 -5
  64. package/dist/esm/auth/WaAuthClient.js +52 -54
  65. package/dist/esm/auth/credentials-flow.js +190 -0
  66. package/dist/esm/auth/index.js +0 -2
  67. package/dist/esm/auth/pairing/WaPairingFlow.js +39 -32
  68. package/dist/esm/auth/pairing/{WaPairingCodeCrypto.js → pairing-code-crypto.js} +26 -10
  69. package/dist/esm/client/WaClient.js +339 -175
  70. package/dist/esm/client/WaClientFactory.js +401 -68
  71. package/dist/esm/client/connection/WaConnectionManager.js +23 -11
  72. package/dist/esm/client/coordinators/WaAbPropsCoordinator.js +137 -0
  73. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +229 -0
  74. package/dist/esm/client/coordinators/WaEmailCoordinator.js +60 -0
  75. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  76. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +36 -10
  77. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +337 -114
  78. package/dist/esm/client/coordinators/WaOfflineResumeCoordinator.js +110 -0
  79. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +97 -36
  80. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  81. package/dist/esm/client/coordinators/WaProfileCoordinator.js +211 -0
  82. package/dist/esm/client/coordinators/WaRetryCoordinator.js +186 -32
  83. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  84. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +180 -0
  85. package/dist/esm/client/dirty.js +41 -21
  86. package/dist/esm/client/events/abprops.js +40 -0
  87. package/dist/esm/client/events/devices.js +68 -0
  88. package/dist/esm/client/events/group.js +3 -11
  89. package/dist/esm/client/events/identity.js +19 -0
  90. package/dist/esm/client/events/privacy-token.js +35 -0
  91. package/dist/esm/client/events/registration.js +39 -0
  92. package/dist/esm/client/history-sync.js +50 -9
  93. package/dist/esm/client/incoming.js +74 -8
  94. package/dist/esm/client/mailbox.js +40 -23
  95. package/dist/esm/client/media.js +234 -0
  96. package/dist/esm/client/messages.js +244 -91
  97. package/dist/esm/client/messaging/fanout.js +22 -12
  98. package/dist/esm/client/messaging/participants.js +6 -4
  99. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  100. package/dist/esm/client/tokens/cs-token.js +46 -0
  101. package/dist/esm/client/tokens/tc-token.js +18 -0
  102. package/dist/esm/crypto/core/index.js +3 -2
  103. package/dist/esm/crypto/core/keys.js +1 -1
  104. package/dist/esm/crypto/core/nonce.js +2 -0
  105. package/dist/esm/crypto/core/primitives.js +0 -7
  106. package/dist/esm/crypto/core/random.js +23 -7
  107. package/dist/esm/crypto/core/xeddsa.js +53 -0
  108. package/dist/esm/crypto/curves/X25519.js +45 -8
  109. package/dist/esm/crypto/curves/constants.js +1 -0
  110. package/dist/esm/crypto/index.js +1 -0
  111. package/dist/esm/crypto/math/constants.js +12 -35
  112. package/dist/esm/crypto/math/edwards.js +174 -47
  113. package/dist/esm/crypto/math/fe.js +691 -0
  114. package/dist/esm/crypto/math/mod.js +10 -1
  115. package/dist/esm/index.js +1 -1
  116. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  117. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  118. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  119. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  120. package/dist/esm/infra/perf/StoreLock.js +80 -0
  121. package/dist/esm/media/WaMediaCrypto.js +332 -55
  122. package/dist/esm/media/WaMediaTransferClient.js +69 -220
  123. package/dist/esm/media/constants.js +4 -1
  124. package/dist/esm/media/processor.js +1 -0
  125. package/dist/esm/message/WaMessageClient.js +26 -19
  126. package/dist/esm/message/addon-crypto.js +130 -3
  127. package/dist/esm/message/content.js +206 -14
  128. package/dist/esm/message/icdc.js +76 -0
  129. package/dist/esm/message/incoming.js +38 -24
  130. package/dist/esm/message/phash.js +35 -13
  131. package/dist/esm/message/reporting-token.js +17 -30
  132. package/dist/esm/message/use-case-secret.js +1 -1
  133. package/dist/esm/protocol/abprops.js +159 -0
  134. package/dist/esm/protocol/appstate.js +9 -40
  135. package/dist/esm/protocol/browser.js +24 -18
  136. package/dist/esm/protocol/constants.js +8 -4
  137. package/dist/esm/protocol/defaults.js +6 -0
  138. package/dist/esm/protocol/email.js +30 -0
  139. package/dist/esm/protocol/index.js +1 -2
  140. package/dist/esm/protocol/jid.js +142 -39
  141. package/dist/esm/protocol/message.js +61 -1
  142. package/dist/esm/protocol/nodes.js +8 -2
  143. package/dist/esm/protocol/notification.js +9 -1
  144. package/dist/esm/protocol/privacy-token.js +17 -0
  145. package/dist/esm/protocol/privacy.js +55 -0
  146. package/dist/esm/protocol/stream.js +26 -1
  147. package/dist/esm/retry/codec.js +216 -0
  148. package/dist/esm/retry/constants.js +1 -1
  149. package/dist/esm/retry/index.js +2 -2
  150. package/dist/esm/retry/parse.js +50 -30
  151. package/dist/esm/retry/reason.js +1 -1
  152. package/dist/esm/retry/replay.js +11 -7
  153. package/dist/esm/retry/tracker.js +50 -12
  154. package/dist/esm/signal/api/SignalDeviceSyncApi.js +52 -32
  155. package/dist/esm/signal/api/SignalDigestSyncApi.js +21 -15
  156. package/dist/esm/signal/api/SignalIdentitySyncApi.js +30 -15
  157. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +19 -8
  158. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  159. package/dist/esm/signal/api/SignalSessionSyncApi.js +17 -8
  160. package/dist/esm/signal/api/result-map.js +10 -0
  161. package/dist/esm/signal/constants.js +0 -4
  162. package/dist/esm/signal/crypto/WaAdvSignature.js +5 -45
  163. package/dist/esm/signal/crypto/constants.js +0 -4
  164. package/dist/esm/signal/{store/sqlite.js → encoding.js} +40 -29
  165. package/dist/esm/signal/group/SenderKeyChain.js +3 -3
  166. package/dist/esm/signal/group/SenderKeyCodec.js +8 -8
  167. package/dist/esm/signal/group/SenderKeyManager.js +131 -109
  168. package/dist/esm/signal/index.js +1 -0
  169. package/dist/esm/signal/registration/keygen.js +8 -5
  170. package/dist/esm/signal/registration/utils.js +3 -2
  171. package/dist/esm/signal/session/SignalProtocol.js +158 -81
  172. package/dist/esm/signal/session/SignalRatchet.js +21 -10
  173. package/dist/esm/signal/session/SignalSerializer.js +5 -6
  174. package/dist/esm/signal/session/SignalSession.js +11 -9
  175. package/dist/esm/signal/session/resolver.js +140 -105
  176. package/dist/esm/store/contracts/identity.store.js +1 -0
  177. package/dist/esm/store/contracts/message-secret.store.js +1 -0
  178. package/dist/esm/store/contracts/pre-key.store.js +1 -0
  179. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  180. package/dist/esm/store/contracts/session.store.js +1 -0
  181. package/dist/esm/store/createStore.js +143 -193
  182. package/dist/esm/store/index.js +5 -10
  183. package/dist/esm/store/locks/appstate.lock.js +26 -0
  184. package/dist/esm/store/locks/auth.lock.js +15 -0
  185. package/dist/esm/store/locks/contact.lock.js +20 -0
  186. package/dist/esm/store/locks/device-list.lock.js +20 -0
  187. package/dist/esm/store/locks/identity.lock.js +16 -0
  188. package/dist/esm/store/locks/message-secret.lock.js +17 -0
  189. package/dist/esm/store/locks/message.lock.js +21 -0
  190. package/dist/esm/store/locks/participants.lock.js +20 -0
  191. package/dist/esm/store/locks/pre-key.lock.js +27 -0
  192. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  193. package/dist/esm/store/locks/retry.lock.js +29 -0
  194. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  195. package/dist/esm/store/locks/session.lock.js +19 -0
  196. package/dist/esm/store/locks/signal.lock.js +39 -0
  197. package/dist/esm/store/locks/thread.lock.js +21 -0
  198. package/dist/esm/store/noop.store.js +21 -1
  199. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  200. package/dist/esm/store/providers/memory/device-list.store.js +13 -5
  201. package/dist/esm/store/providers/memory/identity.store.js +31 -0
  202. package/dist/esm/store/providers/memory/message-secret.store.js +81 -0
  203. package/dist/esm/store/providers/memory/participants.store.js +3 -0
  204. package/dist/esm/store/providers/memory/pre-key.store.js +97 -0
  205. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  206. package/dist/esm/store/providers/memory/retry.store.js +99 -10
  207. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  208. package/dist/esm/store/providers/memory/session.store.js +45 -0
  209. package/dist/esm/store/providers/memory/signal.store.js +1 -147
  210. package/dist/esm/transport/WaComms.js +7 -4
  211. package/dist/esm/transport/WaWebSocket.js +9 -7
  212. package/dist/esm/transport/binary/constants.js +0 -30
  213. package/dist/esm/transport/binary/decoder.js +4 -4
  214. package/dist/esm/transport/binary/encoder.js +8 -15
  215. package/dist/esm/transport/binary/index.js +0 -1
  216. package/dist/esm/transport/index.js +6 -0
  217. package/dist/esm/transport/keepalive/WaKeepAlive.js +17 -8
  218. package/dist/esm/transport/node/WaMobileTcpSocket.js +114 -0
  219. package/dist/esm/transport/node/WaNodeOrchestrator.js +37 -22
  220. package/dist/esm/transport/node/builders/abprops.js +20 -0
  221. package/dist/esm/transport/node/builders/business.js +129 -0
  222. package/dist/esm/transport/node/builders/device.js +11 -0
  223. package/dist/esm/transport/node/builders/email.js +65 -0
  224. package/dist/esm/transport/node/builders/global.js +370 -0
  225. package/dist/esm/transport/node/builders/message.js +63 -239
  226. package/dist/esm/transport/node/builders/offline.js +14 -0
  227. package/dist/esm/transport/node/builders/pairing.js +0 -24
  228. package/dist/esm/transport/node/builders/prekeys.js +37 -40
  229. package/dist/esm/transport/node/builders/presence.js +13 -0
  230. package/dist/esm/transport/node/builders/privacy-token.js +37 -0
  231. package/dist/esm/transport/node/builders/privacy.js +48 -0
  232. package/dist/esm/transport/node/builders/profile.js +70 -0
  233. package/dist/esm/transport/node/builders/retry.js +11 -23
  234. package/dist/esm/transport/node/builders/usync.js +6 -2
  235. package/dist/esm/transport/node/helpers.js +43 -1
  236. package/dist/esm/transport/node/mex/argo-decoder.js +152 -0
  237. package/dist/esm/transport/node/mex/client.js +83 -0
  238. package/dist/esm/transport/node/mex/persist-ids.js +10 -0
  239. package/dist/esm/transport/node/usync.js +3 -33
  240. package/dist/esm/transport/node/xml.js +35 -14
  241. package/dist/esm/transport/noise/WaClientPayload.js +24 -19
  242. package/dist/esm/transport/noise/WaFrameCodec.js +2 -2
  243. package/dist/esm/transport/noise/WaMobileClientPayload.js +53 -0
  244. package/dist/esm/transport/noise/WaNoiseCert.js +9 -27
  245. package/dist/esm/transport/noise/WaNoiseSession.js +76 -34
  246. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  247. package/dist/esm/transport/stream/parse.js +8 -4
  248. package/dist/esm/util/bytes.js +22 -18
  249. package/dist/esm/util/index.js +5 -0
  250. package/dist/esm/util/primitives.js +3 -2
  251. package/dist/index.js +7 -1
  252. package/dist/infra/perf/BackgroundQueue.js +482 -0
  253. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  254. package/dist/infra/perf/PromiseDedup.js +24 -0
  255. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  256. package/dist/infra/perf/StoreLock.js +84 -0
  257. package/dist/media/WaMediaCrypto.js +328 -51
  258. package/dist/media/WaMediaTransferClient.js +72 -253
  259. package/dist/media/constants.js +5 -2
  260. package/dist/media/processor.js +2 -0
  261. package/dist/message/WaMessageClient.js +26 -19
  262. package/dist/message/addon-crypto.js +131 -0
  263. package/dist/message/content.js +211 -14
  264. package/dist/message/icdc.js +81 -0
  265. package/dist/message/incoming.js +38 -24
  266. package/dist/message/phash.js +35 -13
  267. package/dist/message/reporting-token.js +16 -30
  268. package/dist/message/use-case-secret.js +1 -1
  269. package/dist/protocol/abprops.js +163 -0
  270. package/dist/protocol/appstate.js +10 -41
  271. package/dist/protocol/browser.js +25 -18
  272. package/dist/protocol/constants.js +33 -2
  273. package/dist/protocol/defaults.js +6 -0
  274. package/dist/protocol/email.js +33 -0
  275. package/dist/protocol/index.js +8 -5
  276. package/dist/protocol/jid.js +149 -39
  277. package/dist/protocol/message.js +62 -2
  278. package/dist/protocol/nodes.js +8 -2
  279. package/dist/protocol/notification.js +10 -2
  280. package/dist/protocol/privacy-token.js +20 -0
  281. package/dist/protocol/privacy.js +58 -0
  282. package/dist/protocol/stream.js +27 -2
  283. package/dist/retry/codec.js +220 -0
  284. package/dist/retry/constants.js +1 -1
  285. package/dist/retry/index.js +5 -5
  286. package/dist/retry/parse.js +51 -30
  287. package/dist/retry/reason.js +1 -1
  288. package/dist/retry/replay.js +10 -6
  289. package/dist/retry/tracker.js +50 -12
  290. package/dist/signal/api/SignalDeviceSyncApi.js +51 -31
  291. package/dist/signal/api/SignalDigestSyncApi.js +21 -15
  292. package/dist/signal/api/SignalIdentitySyncApi.js +29 -14
  293. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  294. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  295. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  296. package/dist/signal/api/result-map.js +13 -0
  297. package/dist/signal/constants.js +1 -5
  298. package/dist/signal/crypto/WaAdvSignature.js +2 -44
  299. package/dist/signal/crypto/constants.js +1 -5
  300. package/dist/signal/{store/sqlite.js → encoding.js} +41 -25
  301. package/dist/signal/group/SenderKeyChain.js +2 -2
  302. package/dist/signal/group/SenderKeyCodec.js +8 -8
  303. package/dist/signal/group/SenderKeyManager.js +130 -108
  304. package/dist/signal/index.js +13 -1
  305. package/dist/signal/registration/keygen.js +7 -4
  306. package/dist/signal/registration/utils.js +3 -2
  307. package/dist/signal/session/SignalProtocol.js +158 -81
  308. package/dist/signal/session/SignalRatchet.js +19 -8
  309. package/dist/signal/session/SignalSerializer.js +5 -6
  310. package/dist/signal/session/SignalSession.js +11 -9
  311. package/dist/signal/session/resolver.js +138 -103
  312. package/dist/store/contracts/identity.store.js +2 -0
  313. package/dist/store/contracts/message-secret.store.js +2 -0
  314. package/dist/store/contracts/pre-key.store.js +2 -0
  315. package/dist/store/contracts/privacy-token.store.js +2 -0
  316. package/dist/store/contracts/session.store.js +2 -0
  317. package/dist/store/createStore.js +142 -192
  318. package/dist/store/index.js +23 -33
  319. package/dist/store/locks/appstate.lock.js +29 -0
  320. package/dist/store/locks/auth.lock.js +18 -0
  321. package/dist/store/locks/contact.lock.js +23 -0
  322. package/dist/store/locks/device-list.lock.js +23 -0
  323. package/dist/store/locks/identity.lock.js +19 -0
  324. package/dist/store/locks/message-secret.lock.js +20 -0
  325. package/dist/store/locks/message.lock.js +24 -0
  326. package/dist/store/locks/participants.lock.js +23 -0
  327. package/dist/store/locks/pre-key.lock.js +30 -0
  328. package/dist/store/locks/privacy-token.lock.js +21 -0
  329. package/dist/store/locks/retry.lock.js +32 -0
  330. package/dist/store/locks/sender-key.lock.js +55 -0
  331. package/dist/store/locks/session.lock.js +22 -0
  332. package/dist/store/locks/signal.lock.js +42 -0
  333. package/dist/store/locks/thread.lock.js +24 -0
  334. package/dist/store/noop.store.js +22 -2
  335. package/dist/store/providers/memory/appstate.store.js +22 -24
  336. package/dist/store/providers/memory/device-list.store.js +13 -5
  337. package/dist/store/providers/memory/identity.store.js +35 -0
  338. package/dist/store/providers/memory/message-secret.store.js +85 -0
  339. package/dist/store/providers/memory/participants.store.js +3 -0
  340. package/dist/store/providers/memory/pre-key.store.js +101 -0
  341. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  342. package/dist/store/providers/memory/retry.store.js +98 -9
  343. package/dist/store/providers/memory/sender-key.store.js +6 -1
  344. package/dist/store/providers/memory/session.store.js +49 -0
  345. package/dist/store/providers/memory/signal.store.js +1 -147
  346. package/dist/transport/WaComms.js +7 -4
  347. package/dist/transport/WaWebSocket.js +9 -7
  348. package/dist/transport/binary/constants.js +1 -31
  349. package/dist/transport/binary/decoder.js +4 -4
  350. package/dist/transport/binary/encoder.js +8 -15
  351. package/dist/transport/binary/index.js +0 -4
  352. package/dist/transport/index.js +17 -1
  353. package/dist/transport/keepalive/WaKeepAlive.js +17 -8
  354. package/dist/transport/node/WaMobileTcpSocket.js +118 -0
  355. package/dist/transport/node/WaNodeOrchestrator.js +36 -21
  356. package/dist/transport/node/builders/abprops.js +23 -0
  357. package/dist/transport/node/builders/business.js +137 -0
  358. package/dist/transport/node/builders/device.js +14 -0
  359. package/dist/transport/node/builders/email.js +72 -0
  360. package/dist/transport/node/builders/global.js +375 -0
  361. package/dist/transport/node/builders/message.js +64 -245
  362. package/dist/transport/node/builders/offline.js +17 -0
  363. package/dist/transport/node/builders/pairing.js +0 -26
  364. package/dist/transport/node/builders/prekeys.js +36 -39
  365. package/dist/transport/node/builders/presence.js +16 -0
  366. package/dist/transport/node/builders/privacy-token.js +42 -0
  367. package/dist/transport/node/builders/privacy.js +55 -0
  368. package/dist/transport/node/builders/profile.js +78 -0
  369. package/dist/transport/node/builders/retry.js +10 -22
  370. package/dist/transport/node/builders/usync.js +6 -2
  371. package/dist/transport/node/helpers.js +46 -1
  372. package/dist/transport/node/mex/argo-decoder.js +189 -0
  373. package/dist/transport/node/mex/client.js +86 -0
  374. package/dist/transport/node/mex/persist-ids.js +13 -0
  375. package/dist/transport/node/usync.js +2 -32
  376. package/dist/transport/node/xml.js +35 -14
  377. package/dist/transport/noise/WaClientPayload.js +26 -21
  378. package/dist/transport/noise/WaFrameCodec.js +1 -1
  379. package/dist/transport/noise/WaMobileClientPayload.js +56 -0
  380. package/dist/transport/noise/WaNoiseCert.js +8 -26
  381. package/dist/transport/noise/WaNoiseSession.js +75 -33
  382. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  383. package/dist/transport/stream/parse.js +7 -3
  384. package/dist/types/appstate/WaAppStateCrypto.d.ts +11 -8
  385. package/dist/types/appstate/WaAppStateSyncClient.d.ts +6 -2
  386. package/dist/types/appstate/encoding.d.ts +7 -0
  387. package/dist/types/appstate/index.d.ts +3 -3
  388. package/dist/types/appstate/{WaAppStateSyncResponseParser.d.ts → response-parser.d.ts} +1 -1
  389. package/dist/types/appstate/types.d.ts +1 -1
  390. package/dist/types/appstate/utils.d.ts +0 -2
  391. package/dist/types/auth/WaAuthClient.d.ts +9 -3
  392. package/dist/types/auth/credentials-flow.d.ts +20 -0
  393. package/dist/types/auth/index.d.ts +0 -2
  394. package/dist/types/auth/pairing/WaPairingFlow.d.ts +3 -2
  395. package/dist/types/auth/pairing/{WaPairingCodeCrypto.d.ts → pairing-code-crypto.d.ts} +6 -1
  396. package/dist/types/auth/types.d.ts +41 -0
  397. package/dist/types/client/WaClient.d.ts +44 -18
  398. package/dist/types/client/WaClientFactory.d.ts +22 -8
  399. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  400. package/dist/types/client/coordinators/WaAbPropsCoordinator.d.ts +26 -0
  401. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  402. package/dist/types/client/coordinators/WaEmailCoordinator.d.ts +24 -0
  403. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +9 -2
  404. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +29 -2
  405. package/dist/types/client/coordinators/WaOfflineResumeCoordinator.d.ts +31 -0
  406. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +16 -1
  407. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  408. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +38 -0
  409. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +12 -0
  410. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  411. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +55 -0
  412. package/dist/types/client/dirty.d.ts +3 -1
  413. package/dist/types/client/events/abprops.d.ts +14 -0
  414. package/dist/types/client/events/devices.d.ts +20 -0
  415. package/dist/types/client/events/identity.d.ts +9 -0
  416. package/dist/types/client/events/privacy-token.d.ts +7 -0
  417. package/dist/types/client/events/registration.d.ts +17 -0
  418. package/dist/types/client/history-sync.d.ts +9 -6
  419. package/dist/types/client/incoming.d.ts +9 -2
  420. package/dist/types/client/index.d.ts +1 -1
  421. package/dist/types/client/mailbox.d.ts +5 -5
  422. package/dist/types/client/media.d.ts +31 -0
  423. package/dist/types/client/messages.d.ts +3 -2
  424. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  425. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  426. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  427. package/dist/types/client/types.d.ts +151 -4
  428. package/dist/types/crypto/core/index.d.ts +3 -2
  429. package/dist/types/crypto/core/nonce.d.ts +2 -0
  430. package/dist/types/crypto/core/primitives.d.ts +1 -2
  431. package/dist/types/crypto/core/random.d.ts +2 -1
  432. package/dist/types/crypto/core/xeddsa.d.ts +2 -0
  433. package/dist/types/crypto/curves/constants.d.ts +1 -0
  434. package/dist/types/crypto/index.d.ts +2 -0
  435. package/dist/types/crypto/math/constants.d.ts +4 -2
  436. package/dist/types/crypto/math/fe.d.ts +30 -0
  437. package/dist/types/crypto/math/mod.d.ts +0 -2
  438. package/dist/types/crypto/math/types.d.ts +11 -4
  439. package/dist/types/index.d.ts +6 -3
  440. package/dist/types/infra/log/ConsoleLogger.d.ts +1 -1
  441. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  442. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  443. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  444. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  445. package/dist/types/infra/perf/StoreLock.d.ts +11 -0
  446. package/dist/types/media/WaMediaCrypto.d.ts +16 -6
  447. package/dist/types/media/WaMediaTransferClient.d.ts +6 -23
  448. package/dist/types/media/constants.d.ts +3 -1
  449. package/dist/types/media/index.d.ts +2 -1
  450. package/dist/types/media/processor.d.ts +28 -0
  451. package/dist/types/media/types.d.ts +19 -5
  452. package/dist/types/message/addon-crypto.d.ts +34 -3
  453. package/dist/types/message/content.d.ts +11 -1
  454. package/dist/types/message/icdc.d.ts +13 -0
  455. package/dist/types/message/reporting-token.d.ts +0 -1
  456. package/dist/types/message/types.d.ts +42 -11
  457. package/dist/types/protocol/abprops.d.ts +142 -0
  458. package/dist/types/protocol/appstate.d.ts +0 -11
  459. package/dist/types/protocol/browser.d.ts +1 -0
  460. package/dist/types/protocol/constants.d.ts +12 -4
  461. package/dist/types/protocol/defaults.d.ts +6 -0
  462. package/dist/types/protocol/email.d.ts +32 -0
  463. package/dist/types/protocol/index.d.ts +1 -2
  464. package/dist/types/protocol/jid.d.ts +20 -2
  465. package/dist/types/protocol/message.d.ts +60 -0
  466. package/dist/types/protocol/nodes.d.ts +6 -0
  467. package/dist/types/protocol/notification.d.ts +8 -0
  468. package/dist/types/protocol/privacy-token.d.ts +17 -0
  469. package/dist/types/protocol/privacy.d.ts +75 -0
  470. package/dist/types/protocol/stream.d.ts +31 -0
  471. package/dist/types/retry/codec.d.ts +3 -0
  472. package/dist/types/retry/index.d.ts +3 -3
  473. package/dist/types/retry/parse.d.ts +5 -2
  474. package/dist/types/retry/reason.d.ts +1 -1
  475. package/dist/types/retry/tracker.d.ts +1 -0
  476. package/dist/types/retry/types.d.ts +6 -1
  477. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  478. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +9 -0
  479. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +5 -3
  480. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  481. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  482. package/dist/types/signal/api/result-map.d.ts +1 -0
  483. package/dist/types/signal/constants.d.ts +0 -3
  484. package/dist/types/signal/crypto/WaAdvSignature.d.ts +0 -2
  485. package/dist/types/signal/crypto/constants.d.ts +0 -1
  486. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +9 -3
  487. package/dist/types/signal/group/SenderKeyChain.d.ts +1 -1
  488. package/dist/types/signal/group/SenderKeyManager.d.ts +17 -7
  489. package/dist/types/signal/index.d.ts +2 -0
  490. package/dist/types/signal/registration/utils.d.ts +2 -1
  491. package/dist/types/signal/session/SignalProtocol.d.ts +21 -6
  492. package/dist/types/signal/session/SignalSerializer.d.ts +2 -1
  493. package/dist/types/signal/session/resolver.d.ts +11 -4
  494. package/dist/types/signal/types.d.ts +16 -4
  495. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  496. package/dist/types/store/contracts/identity.store.d.ts +11 -0
  497. package/dist/types/store/contracts/message-secret.store.d.ts +16 -0
  498. package/dist/types/store/contracts/pre-key.store.d.ts +13 -0
  499. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  500. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  501. package/dist/types/store/contracts/session.store.d.ts +14 -0
  502. package/dist/types/store/contracts/signal.store.d.ts +1 -27
  503. package/dist/types/store/createStore.d.ts +1 -1
  504. package/dist/types/store/index.d.ts +12 -12
  505. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  506. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  507. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  508. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  509. package/dist/types/store/locks/identity.lock.d.ts +3 -0
  510. package/dist/types/store/locks/message-secret.lock.d.ts +3 -0
  511. package/dist/types/store/locks/message.lock.d.ts +3 -0
  512. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  513. package/dist/types/store/locks/pre-key.lock.d.ts +3 -0
  514. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  515. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  516. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  517. package/dist/types/store/locks/session.lock.d.ts +3 -0
  518. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  519. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  520. package/dist/types/store/noop.store.d.ts +4 -0
  521. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  522. package/dist/types/store/providers/memory/identity.store.d.ts +18 -0
  523. package/dist/types/store/providers/memory/message-secret.store.d.ts +21 -0
  524. package/dist/types/store/providers/memory/pre-key.store.d.ts +23 -0
  525. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  526. package/dist/types/store/providers/memory/retry.store.d.ts +15 -1
  527. package/dist/types/store/providers/memory/session.store.d.ts +21 -0
  528. package/dist/types/store/providers/memory/signal.store.d.ts +2 -43
  529. package/dist/types/store/providers/memory/thread.store.d.ts +1 -1
  530. package/dist/types/store/types.d.ts +69 -61
  531. package/dist/types/transport/WaWebSocket.d.ts +1 -1
  532. package/dist/types/transport/binary/constants.d.ts +0 -30
  533. package/dist/types/transport/binary/index.d.ts +0 -1
  534. package/dist/types/transport/index.d.ts +8 -1
  535. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +4 -1
  536. package/dist/types/transport/node/WaMobileTcpSocket.d.ts +18 -0
  537. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +9 -6
  538. package/dist/types/transport/node/builders/abprops.d.ts +5 -0
  539. package/dist/types/transport/node/builders/business.d.ts +29 -0
  540. package/dist/types/transport/node/builders/device.d.ts +2 -0
  541. package/dist/types/transport/node/builders/email.d.ts +11 -0
  542. package/dist/types/transport/node/builders/global.d.ts +102 -0
  543. package/dist/types/transport/node/builders/message.d.ts +8 -7
  544. package/dist/types/transport/node/builders/offline.d.ts +2 -0
  545. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  546. package/dist/types/transport/node/builders/prekeys.d.ts +4 -3
  547. package/dist/types/transport/node/builders/presence.d.ts +6 -0
  548. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  549. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  550. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  551. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  552. package/dist/types/transport/node/helpers.d.ts +8 -0
  553. package/dist/types/transport/node/mex/argo-decoder.d.ts +11 -0
  554. package/dist/types/transport/node/mex/client.d.ts +18 -0
  555. package/dist/types/transport/node/mex/persist-ids.d.ts +14 -0
  556. package/dist/types/transport/noise/WaMobileClientPayload.d.ts +29 -0
  557. package/dist/types/transport/noise/WaNoiseCert.d.ts +7 -1
  558. package/dist/types/transport/noise/WaNoiseSession.d.ts +4 -2
  559. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  560. package/dist/types/transport/types.d.ts +8 -0
  561. package/dist/types/util/bytes.d.ts +1 -1
  562. package/dist/types/util/index.d.ts +5 -0
  563. package/dist/types/util/primitives.d.ts +0 -1
  564. package/dist/util/bytes.js +22 -18
  565. package/dist/util/index.js +23 -0
  566. package/dist/util/primitives.js +2 -2
  567. package/package.json +34 -10
  568. package/proto/index.js +1 -1
  569. package/dist/auth/flow/WaAuthCredentialsFlow.js +0 -130
  570. package/dist/auth/pairing/constants.js +0 -5
  571. package/dist/client/connection/WaKeyShareCoordinator.js +0 -63
  572. package/dist/crypto/core/constants.js +0 -4
  573. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +0 -125
  574. package/dist/esm/auth/pairing/constants.js +0 -2
  575. package/dist/esm/client/connection/WaKeyShareCoordinator.js +0 -59
  576. package/dist/esm/crypto/core/constants.js +0 -1
  577. package/dist/esm/retry/outbound.js +0 -82
  578. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  579. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  580. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  581. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  582. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  583. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  584. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  585. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  586. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  587. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  588. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  589. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  590. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  591. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  592. package/dist/esm/transport/node/builders/index.js +0 -8
  593. package/dist/retry/outbound.js +0 -87
  594. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  595. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  596. package/dist/store/providers/sqlite/auth.store.js +0 -180
  597. package/dist/store/providers/sqlite/connection.js +0 -281
  598. package/dist/store/providers/sqlite/contact.store.js +0 -78
  599. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  600. package/dist/store/providers/sqlite/message.store.js +0 -136
  601. package/dist/store/providers/sqlite/migrations.js +0 -350
  602. package/dist/store/providers/sqlite/participants.store.js +0 -81
  603. package/dist/store/providers/sqlite/retry.store.js +0 -145
  604. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  605. package/dist/store/providers/sqlite/signal.store.js +0 -439
  606. package/dist/store/providers/sqlite/table-names.js +0 -113
  607. package/dist/store/providers/sqlite/thread.store.js +0 -89
  608. package/dist/transport/node/builders/index.js +0 -42
  609. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  610. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +0 -14
  611. package/dist/types/auth/pairing/constants.d.ts +0 -2
  612. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +0 -14
  613. package/dist/types/crypto/core/constants.d.ts +0 -1
  614. package/dist/types/retry/outbound.d.ts +0 -4
  615. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  616. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  617. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  618. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  619. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  620. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  621. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  622. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  623. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  624. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  625. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  626. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  627. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  628. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
  629. package/dist/types/transport/node/builders/index.d.ts +0 -8
  630. /package/dist/appstate/{WaAppStateSyncResponseParser.js → response-parser.js} +0 -0
@@ -1,6 +1,7 @@
1
- import { WA_MESSAGE_TAGS, WA_NODE_TAGS } from '../../../protocol/constants.js';
1
+ import { WA_NODE_TAGS } from '../../../protocol/constants.js';
2
2
  import { RETRY_RECEIPT_VERSION } from '../../../retry/constants.js';
3
3
  import { SIGNAL_KEY_BUNDLE_TYPE_BYTES } from '../../../signal/api/constants.js';
4
+ import { buildReceiptNode } from '../../node/builders/global.js';
4
5
  import { intToBytes } from '../../../util/bytes.js';
5
6
  function buildRetryKeysNode(keys) {
6
7
  const content = [
@@ -68,30 +69,13 @@ function buildRetryKeysNode(keys) {
68
69
  };
69
70
  }
70
71
  export function buildRetryReceiptNode(input) {
71
- const attrs = {
72
- id: input.stanzaId,
73
- to: input.to,
74
- type: 'retry'
75
- };
76
- if (input.participant) {
77
- attrs.participant = input.participant;
78
- }
79
- if (input.recipient) {
80
- attrs.recipient = input.recipient;
81
- }
82
- if (input.from) {
83
- attrs.from = input.from;
84
- }
85
- if (input.categoryPeer) {
86
- attrs.category = 'peer';
87
- }
88
72
  const retryAttrs = {
89
73
  v: RETRY_RECEIPT_VERSION,
90
74
  count: String(input.retryCount),
91
75
  id: input.originalMsgId,
92
76
  t: input.t
93
77
  };
94
- if (input.error !== undefined) {
78
+ if (input.error !== undefined && input.error !== 0) {
95
79
  retryAttrs.error = String(input.error);
96
80
  }
97
81
  const content = [
@@ -108,9 +92,13 @@ export function buildRetryReceiptNode(input) {
108
92
  if (input.keys) {
109
93
  content.push(buildRetryKeysNode(input.keys));
110
94
  }
111
- return {
112
- tag: WA_MESSAGE_TAGS.RECEIPT,
113
- attrs,
95
+ return buildReceiptNode({
96
+ kind: 'retry_custom',
97
+ id: input.stanzaId,
98
+ to: input.to,
99
+ participant: input.participant,
100
+ recipient: input.recipient,
101
+ categoryPeer: input.categoryPeer,
114
102
  content
115
- };
103
+ });
116
104
  }
@@ -14,6 +14,10 @@ export function buildUsyncIq(input) {
14
14
  if (input.queryProtocolNodes.length === 0) {
15
15
  throw new Error('usync query must include at least one protocol node');
16
16
  }
17
+ const users = new Array(input.users.length);
18
+ for (let index = 0; index < input.users.length; index += 1) {
19
+ users[index] = buildUsyncUserNode(input.users[index]);
20
+ }
17
21
  return buildIqNode('get', input.hostDomain ?? WA_DEFAULTS.HOST_DOMAIN, WA_XMLNS.USYNC, [
18
22
  {
19
23
  tag: WA_NODE_TAGS.USYNC,
@@ -28,12 +32,12 @@ export function buildUsyncIq(input) {
28
32
  {
29
33
  tag: WA_NODE_TAGS.QUERY,
30
34
  attrs: {},
31
- content: [...input.queryProtocolNodes]
35
+ content: input.queryProtocolNodes
32
36
  },
33
37
  {
34
38
  tag: WA_NODE_TAGS.LIST,
35
39
  attrs: {},
36
- content: input.users.map((user) => buildUsyncUserNode(user))
40
+ content: users
37
41
  }
38
42
  ]
39
43
  }
@@ -1,7 +1,9 @@
1
+ import { randomFillAsync } from '../../crypto/index.js';
1
2
  import { base64ToBytesChecked, TEXT_DECODER, TEXT_ENCODER } from '../../util/bytes.js';
2
3
  const EMPTY_NODE_CHILDREN = Object.freeze([]);
3
4
  const EMPTY_NODE_TAGS = Object.freeze([]);
4
5
  const EMPTY_NODE_VALUES = Object.freeze([]);
6
+ const NODE_ID_PREFIX_SEED = new Uint8Array(4);
5
7
  export function getNodeChildren(node) {
6
8
  return Array.isArray(node.content) ? node.content : EMPTY_NODE_CHILDREN;
7
9
  }
@@ -54,7 +56,11 @@ export function getNodeChildrenTags(node) {
54
56
  const content = node.content;
55
57
  if (!Array.isArray(content) || content.length === 0)
56
58
  return EMPTY_NODE_TAGS;
57
- return content.map((c) => c.tag);
59
+ const tags = new Array(content.length);
60
+ for (let i = 0; i < content.length; i += 1) {
61
+ tags[i] = content[i].tag;
62
+ }
63
+ return tags;
58
64
  }
59
65
  export function getNodeChildrenNonEmptyAttrValuesByTag(node, tag, attr) {
60
66
  let values = null;
@@ -120,6 +126,14 @@ export function decodeNodeContentUtf8OrBytes(value, field) {
120
126
  }
121
127
  throw new Error(`node ${field} has no binary content`);
122
128
  }
129
+ export function getNodeTextContent(node) {
130
+ const content = node.content;
131
+ if (content instanceof Uint8Array)
132
+ return TEXT_DECODER.decode(content);
133
+ if (typeof content === 'string')
134
+ return content;
135
+ return undefined;
136
+ }
123
137
  export function decodeNodeContentBase64OrBytes(value, field) {
124
138
  if (value === null || value === undefined) {
125
139
  throw new Error(`missing binary node content for ${field}`);
@@ -137,3 +151,31 @@ export function formatNodeIdPrefixFromSeed(seed) {
137
151
  const right = ((seed[2] << 8) | seed[3]) >>> 0;
138
152
  return `${left}.${right}-`;
139
153
  }
154
+ export async function createNodeIdGenerator() {
155
+ await randomFillAsync(NODE_ID_PREFIX_SEED);
156
+ const prefix = formatNodeIdPrefixFromSeed(NODE_ID_PREFIX_SEED);
157
+ let counter = 0;
158
+ return {
159
+ prefix,
160
+ next() {
161
+ counter += 1;
162
+ return `${prefix}${counter}`;
163
+ }
164
+ };
165
+ }
166
+ export function createMobileNodeIdGenerator() {
167
+ let featureCounter = 0;
168
+ let systemCounter = 0;
169
+ return {
170
+ prefix: '0',
171
+ next() {
172
+ const id = `0${featureCounter.toString(16)}`;
173
+ featureCounter = (featureCounter + 1) & 0xffff;
174
+ return id;
175
+ },
176
+ nextSystem() {
177
+ systemCounter = (systemCounter + 1) & 0xffff;
178
+ return systemCounter.toString(16);
179
+ }
180
+ };
181
+ }
@@ -0,0 +1,152 @@
1
+ import { TEXT_DECODER } from '../../../util/bytes.js';
2
+ let cachedArgo;
3
+ async function loadArgo() {
4
+ if (cachedArgo !== undefined)
5
+ return cachedArgo;
6
+ try {
7
+ cachedArgo = (await import('argo-codec'));
8
+ }
9
+ catch {
10
+ cachedArgo = null;
11
+ }
12
+ return cachedArgo;
13
+ }
14
+ export async function isMexArgoDecoderAvailable() {
15
+ return (await loadArgo()) !== null;
16
+ }
17
+ const LABEL_NULL = -1;
18
+ const LABEL_ABSENT = -2;
19
+ const BACKREF_BASE = -4;
20
+ const DESC_NULL = -1;
21
+ const DESC_FALSE = 0;
22
+ const DESC_TRUE = 1;
23
+ const DESC_OBJECT = 2;
24
+ const DESC_LIST = 3;
25
+ const DESC_STRING = 4;
26
+ const DESC_BYTES = 5;
27
+ const DESC_INT = 6;
28
+ const DESC_FLOAT = 7;
29
+ const FLAG_INLINE_EVERYTHING = 1 << 0;
30
+ const FLAG_HAS_USER_FLAGS = 1 << 6;
31
+ export async function decodeMexArgoResponse(bytes) {
32
+ const argo = await loadArgo();
33
+ if (!argo)
34
+ throw new Error('argo-codec not installed');
35
+ const r = new argo.Reader(bytes);
36
+ const flags = r.bitset();
37
+ const inline = (flags & FLAG_INLINE_EVERYTHING) !== 0;
38
+ if (flags & FLAG_HAS_USER_FLAGS)
39
+ r.bitset();
40
+ const segments = [];
41
+ if (!inline) {
42
+ while (r.pos < r.end) {
43
+ const len = r.label();
44
+ segments.push(new argo.Reader(r.bytes(len)));
45
+ }
46
+ if (segments.length === 0)
47
+ throw new Error('mex argo: missing core segment');
48
+ }
49
+ else {
50
+ segments.push(r);
51
+ }
52
+ const core = segments[segments.length - 1];
53
+ const blocks = inline ? new Map() : indexBlocks(segments.slice(0, -1));
54
+ const ctx = { core, blocks, stringSeen: [] };
55
+ const data = readDesc(ctx);
56
+ const errors = [];
57
+ if (core.pos < core.end) {
58
+ const errCount = core.label();
59
+ for (let i = 0; i < errCount; i++)
60
+ errors.push(readError(ctx));
61
+ }
62
+ return { data, errors };
63
+ }
64
+ function indexBlocks(slices) {
65
+ const m = new Map();
66
+ const keys = ['String', 'Int', 'Float', 'Bytes'];
67
+ for (let i = 0; i < slices.length && i < keys.length; i++)
68
+ m.set(keys[i], slices[i]);
69
+ return m;
70
+ }
71
+ function getBlock(ctx, key) {
72
+ const b = ctx.blocks.get(key);
73
+ if (!b)
74
+ throw new Error(`mex argo: block '${key}' missing`);
75
+ return b;
76
+ }
77
+ function readStringFromBlock(ctx) {
78
+ const lab = ctx.core.label();
79
+ if (lab < BACKREF_BASE + 1) {
80
+ const idx = -lab + BACKREF_BASE;
81
+ return ctx.stringSeen[idx];
82
+ }
83
+ const block = getBlock(ctx, 'String');
84
+ const s = TEXT_DECODER.decode(block.bytes(lab));
85
+ ctx.stringSeen.push(s);
86
+ return s;
87
+ }
88
+ function readDesc(ctx) {
89
+ const m = ctx.core.label();
90
+ switch (m) {
91
+ case DESC_NULL:
92
+ return null;
93
+ case DESC_FALSE:
94
+ return false;
95
+ case DESC_TRUE:
96
+ return true;
97
+ case DESC_STRING:
98
+ return readStringFromBlock(ctx);
99
+ case DESC_INT:
100
+ return getBlock(ctx, 'Int').label();
101
+ case DESC_FLOAT:
102
+ throw new Error('mex argo: DESC_FLOAT not implemented');
103
+ case DESC_BYTES:
104
+ throw new Error('mex argo: DESC_BYTES not implemented');
105
+ case DESC_LIST: {
106
+ const n = ctx.core.label();
107
+ const out = [];
108
+ for (let i = 0; i < n; i++)
109
+ out.push(readDesc(ctx));
110
+ return out;
111
+ }
112
+ case DESC_OBJECT: {
113
+ const n = ctx.core.label();
114
+ const out = {};
115
+ for (let i = 0; i < n; i++) {
116
+ const key = readStringFromBlock(ctx);
117
+ out[key] = readDesc(ctx);
118
+ }
119
+ return out;
120
+ }
121
+ default:
122
+ throw new Error(`mex argo: unknown DESC marker ${m}`);
123
+ }
124
+ }
125
+ function readError(ctx) {
126
+ const message = readStringFromBlock(ctx);
127
+ skipOptional(ctx); // location — never observed in MEX errors so far
128
+ const path = readPath(ctx);
129
+ const extensions = readOptionalDesc(ctx);
130
+ return { message, path, extensions };
131
+ }
132
+ function skipOptional(ctx) {
133
+ const lab = ctx.core.label();
134
+ if (lab !== LABEL_ABSENT && lab !== LABEL_NULL) {
135
+ // Present but not yet structurally decoded; would need a typed inner read here.
136
+ // For locations specifically we have no observed sample; bail loudly if hit.
137
+ throw new Error(`mex argo: unexpected optional present (lab=${lab}); add support`);
138
+ }
139
+ }
140
+ function readPath(ctx) {
141
+ const lab = ctx.core.label();
142
+ if (lab === LABEL_ABSENT || lab === LABEL_NULL)
143
+ return null;
144
+ return lab;
145
+ }
146
+ function readOptionalDesc(ctx) {
147
+ const lab = ctx.core.label();
148
+ if (lab === LABEL_ABSENT || lab === LABEL_NULL)
149
+ return null;
150
+ const v = readDesc(ctx);
151
+ return typeof v === 'object' && v !== null ? v : null;
152
+ }
@@ -0,0 +1,83 @@
1
+ import { WA_DEFAULTS, WA_IQ_TYPES, WA_NODE_TAGS, WA_XMLNS } from '../../../protocol/constants.js';
2
+ import { decodeNodeContentUtf8OrBytes, findNodeChild } from '../../node/helpers.js';
3
+ import { decodeMexArgoResponse, isMexArgoDecoderAvailable } from '../../node/mex/argo-decoder.js';
4
+ import { assertIqResult } from '../../node/query.js';
5
+ import { TEXT_DECODER } from '../../../util/bytes.js';
6
+ import { toError } from '../../../util/primitives.js';
7
+ const MEX_DEFAULT_TIMEOUT_MS = 32000;
8
+ export async function dispatchMexQuery(socket, args) {
9
+ const body = JSON.stringify({
10
+ queryId: args.clientDocId,
11
+ variables: args.variables
12
+ });
13
+ const node = {
14
+ tag: WA_NODE_TAGS.IQ,
15
+ attrs: {
16
+ ...(args.iqId ? { id: args.iqId } : {}),
17
+ to: WA_DEFAULTS.HOST_DOMAIN,
18
+ type: WA_IQ_TYPES.GET,
19
+ xmlns: WA_XMLNS.MEX
20
+ },
21
+ content: [
22
+ {
23
+ tag: 'query',
24
+ attrs: { query_id: args.docId },
25
+ content: body
26
+ }
27
+ ]
28
+ };
29
+ const response = await socket.query(node, args.timeoutMs ?? MEX_DEFAULT_TIMEOUT_MS);
30
+ assertIqResult(response, `mex/${args.opName}`);
31
+ const data = await parseMexResultPayload(response, args.opName);
32
+ return { raw: response, data };
33
+ }
34
+ async function parseMexResultPayload(node, opName) {
35
+ const result = findNodeChild(node, 'result');
36
+ if (!result) {
37
+ throw new Error(`mex/${opName} response missing <result>`);
38
+ }
39
+ const format = result.attrs.format ?? 'json';
40
+ const rawBytes = decodeNodeContentUtf8OrBytes(result.content, `mex/${opName}/result`);
41
+ if (format === 'argo') {
42
+ if (!(await isMexArgoDecoderAvailable())) {
43
+ throw new Error(`mex/${opName} argo response received but 'argo-codec' not installed; ${rawBytes.length}B; ` +
44
+ `strings: ${extractVisibleStrings(rawBytes)}`);
45
+ }
46
+ let decoded;
47
+ try {
48
+ decoded = await decodeMexArgoResponse(rawBytes);
49
+ }
50
+ catch (error) {
51
+ throw new Error(`mex/${opName} argo decode failed: ${toError(error).message}; ` +
52
+ `${rawBytes.length}B; strings: ${extractVisibleStrings(rawBytes)}`);
53
+ }
54
+ if (decoded.errors.length > 0) {
55
+ const summary = decoded.errors
56
+ .map((e) => {
57
+ const code = e.extensions?.error_code ?? e.extensions?.code ?? '?';
58
+ const sev = e.extensions?.severity;
59
+ return `${code}${sev ? `/${String(sev)}` : ''}: ${e.message} @${e.path ?? ''}`;
60
+ })
61
+ .join('; ');
62
+ throw new Error(`mex/${opName} errors: ${summary}`);
63
+ }
64
+ return decoded.data;
65
+ }
66
+ return extractGraphQlData(JSON.parse(TEXT_DECODER.decode(rawBytes)), opName);
67
+ }
68
+ function extractVisibleStrings(bytes) {
69
+ return TEXT_DECODER.decode(bytes)
70
+ .replace(/[\x00-\x1f\x7f-\xff]+/g, ' ')
71
+ .replace(/\s+/g, ' ')
72
+ .trim();
73
+ }
74
+ function extractGraphQlData(payload, opName) {
75
+ const json = (payload ?? {});
76
+ if (json.errors && json.errors.length > 0) {
77
+ const summary = json.errors
78
+ .map((e) => `${e.extensions?.error_code ?? '?'}: ${e.message ?? '?'} @${(e.path ?? []).join('.')}`)
79
+ .join('; ');
80
+ throw new Error(`mex/${opName} errors: ${summary}`);
81
+ }
82
+ return json.data ?? null;
83
+ }
@@ -0,0 +1,10 @@
1
+ export const WA_MEX_PERSIST_IDS = Object.freeze({
2
+ WWWGetCertificates: Object.freeze({
3
+ docId: '25094190163544446',
4
+ clientDocId: '16428758503015954638431529919'
5
+ }),
6
+ WWWCreateUser: Object.freeze({
7
+ docId: '8548056818544135',
8
+ clientDocId: '25777518041400352865446016972'
9
+ })
10
+ });
@@ -1,35 +1,5 @@
1
- import { randomBytesAsync } from '../../crypto/index.js';
2
- import { formatNodeIdPrefixFromSeed } from './helpers.js';
1
+ import { createNodeIdGenerator } from './helpers.js';
3
2
  export function createUsyncSidGenerator() {
4
- const state = {
5
- prefix: null,
6
- prefixPromise: null,
7
- counter: 1
8
- };
9
- return async () => {
10
- const prefix = await getUsyncPrefix(state);
11
- const sid = `${prefix}${state.counter}`;
12
- state.counter += 1;
13
- return sid;
14
- };
15
- }
16
- async function getUsyncPrefix(state) {
17
- if (state.prefix) {
18
- return state.prefix;
19
- }
20
- if (!state.prefixPromise) {
21
- state.prefixPromise = buildUsyncPrefix()
22
- .then((prefix) => {
23
- state.prefix = prefix;
24
- return prefix;
25
- })
26
- .finally(() => {
27
- state.prefixPromise = null;
28
- });
29
- }
30
- return state.prefixPromise;
31
- }
32
- async function buildUsyncPrefix() {
33
- const seed = await randomBytesAsync(4);
34
- return formatNodeIdPrefixFromSeed(seed);
3
+ const generatorPromise = createNodeIdGenerator();
4
+ return async () => (await generatorPromise).next();
35
5
  }
@@ -1,23 +1,41 @@
1
1
  import { bytesToBase64 } from '../../util/bytes.js';
2
2
  const XML_INDENT = ' ';
3
3
  function escapeXml(value) {
4
- return value
5
- .replace(/&/g, '&amp;')
6
- .replace(/</g, '&lt;')
7
- .replace(/>/g, '&gt;')
8
- .replace(/"/g, '&quot;')
9
- .replace(/'/g, '&apos;');
10
- }
11
- function renderAttrs(attrs) {
12
- const entries = Object.entries(attrs);
13
- if (entries.length === 0) {
14
- return '';
4
+ let out = '';
5
+ let last = 0;
6
+ for (let i = 0; i < value.length; i++) {
7
+ let esc;
8
+ switch (value.charCodeAt(i)) {
9
+ case 38:
10
+ esc = '&amp;';
11
+ break;
12
+ case 60:
13
+ esc = '&lt;';
14
+ break;
15
+ case 62:
16
+ esc = '&gt;';
17
+ break;
18
+ case 34:
19
+ esc = '&quot;';
20
+ break;
21
+ case 39:
22
+ esc = '&apos;';
23
+ break;
24
+ }
25
+ if (esc) {
26
+ out += value.slice(last, i) + esc;
27
+ last = i + 1;
28
+ }
15
29
  }
16
- return entries.map(([key, value]) => ` ${key}='${escapeXml(value)}'`).join('');
30
+ return last === 0 ? value : out + value.slice(last);
17
31
  }
18
32
  function renderNode(node, depth) {
19
33
  const indent = XML_INDENT.repeat(depth);
20
- const attrs = renderAttrs(node.attrs);
34
+ const keys = Object.keys(node.attrs);
35
+ let attrs = '';
36
+ for (let i = 0; i < keys.length; i++) {
37
+ attrs += ` ${keys[i]}='${escapeXml(node.attrs[keys[i]])}'`;
38
+ }
21
39
  const content = node.content;
22
40
  if (content === undefined) {
23
41
  return `${indent}<${node.tag}${attrs}/>`;
@@ -31,7 +49,10 @@ function renderNode(node, depth) {
31
49
  if (content.length === 0) {
32
50
  return `${indent}<${node.tag}${attrs}/>`;
33
51
  }
34
- const children = content.map((child) => renderNode(child, depth + 1)).join('\n');
52
+ let children = renderNode(content[0], depth + 1);
53
+ for (let i = 1; i < content.length; i++) {
54
+ children += '\n' + renderNode(content[i], depth + 1);
55
+ }
35
56
  return `${indent}<${node.tag}${attrs}>\n${children}\n${indent}</${node.tag}>`;
36
57
  }
37
58
  export function formatBinaryNodeAsXml(node) {
@@ -1,9 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { md5Bytes } from '../../crypto/core/primitives.js';
3
3
  import { proto } from '../../proto.js';
4
- import { KEY_TYPE_CURVE25519 } from '../../signal/constants.js';
5
4
  import { DEFAULT_VERSION_BASE } from '../noise/constants.js';
6
- import { intToBytes, toBytesView } from '../../util/bytes.js';
5
+ import { intToBytes } from '../../util/bytes.js';
7
6
  function parseVersion(versionBase) {
8
7
  const [p = '2', s = '3000', t = '0'] = versionBase.split('.');
9
8
  const primary = Number.parseInt(p, 10);
@@ -16,13 +15,20 @@ function parseVersion(versionBase) {
16
15
  }
17
16
  return { primary, secondary, tertiary };
18
17
  }
18
+ let cachedLocale = null;
19
19
  function resolveLocale() {
20
+ // The first `Intl.DateTimeFormat()` call triggers V8's lazy ICU init
21
+ // (tens of ms). The process locale does not change at runtime, so
22
+ // memoize after the first resolve.
23
+ if (cachedLocale !== null)
24
+ return cachedLocale;
20
25
  const locale = Intl.DateTimeFormat().resolvedOptions().locale || 'en-US';
21
26
  const [language = 'en', country = 'US'] = locale.split('-');
22
- return {
27
+ cachedLocale = Object.freeze({
23
28
  lg: language.toLowerCase(),
24
29
  lc: country.toUpperCase()
25
- };
30
+ });
31
+ return cachedLocale;
26
32
  }
27
33
  function defaultWebSubPlatform() {
28
34
  return proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER;
@@ -60,8 +66,8 @@ function resolveDevicePropsPlatformType(deviceBrowser) {
60
66
  return proto.DeviceProps.PlatformType.UNKNOWN;
61
67
  }
62
68
  }
63
- function defaultUserAgent(versionBase, deviceOsDisplayName) {
64
- const { primary, secondary, tertiary } = parseVersion(versionBase);
69
+ function defaultUserAgent(versionBase, deviceOsDisplayName, version) {
70
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
65
71
  const locale = resolveLocale();
66
72
  return {
67
73
  platform: proto.ClientPayload.UserAgent.Platform.WEB,
@@ -82,8 +88,8 @@ function defaultUserAgent(versionBase, deviceOsDisplayName) {
82
88
  localeCountryIso31661Alpha2: locale.lc
83
89
  };
84
90
  }
85
- function defaultDeviceProps(versionBase, config) {
86
- const { primary, secondary, tertiary } = parseVersion(versionBase);
91
+ function defaultDeviceProps(versionBase, config, version) {
92
+ const { primary, secondary, tertiary } = version ?? parseVersion(versionBase);
87
93
  return proto.DeviceProps.encode({
88
94
  os: config.deviceOsDisplayName ?? process.platform,
89
95
  version: {
@@ -105,7 +111,7 @@ function defaultDeviceProps(versionBase, config) {
105
111
  }
106
112
  }).finish();
107
113
  }
108
- function buildCommonPayload(config) {
114
+ function buildCommonPayload(config, version) {
109
115
  const versionBase = config.versionBase ?? DEFAULT_VERSION_BASE;
110
116
  const pull = config.pull ?? true;
111
117
  return {
@@ -113,7 +119,7 @@ function buildCommonPayload(config) {
113
119
  pull,
114
120
  connectType: proto.ClientPayload.ConnectType.WIFI_UNKNOWN,
115
121
  connectReason: proto.ClientPayload.ConnectReason.USER_ACTIVATED,
116
- userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName),
122
+ userAgent: config.userAgent ?? defaultUserAgent(versionBase, config.deviceOsDisplayName, version),
117
123
  webInfo: config.webInfo ??
118
124
  {
119
125
  webSubPlatform: defaultWebSubPlatform()
@@ -142,18 +148,17 @@ export function buildRegistrationPayload(config) {
142
148
  throw new Error('registration payload requires a valid signedPreKeyId');
143
149
  }
144
150
  const versionBase = config.versionBase ?? DEFAULT_VERSION_BASE;
145
- const common = buildCommonPayload(config);
151
+ const version = parseVersion(versionBase);
152
+ const common = buildCommonPayload(config, version);
146
153
  const devicePairingData = {
147
- buildHash: config.buildHash ? toBytesView(config.buildHash) : md5Bytes(versionBase),
148
- deviceProps: config.deviceProps
149
- ? toBytesView(config.deviceProps)
150
- : defaultDeviceProps(versionBase, config),
154
+ buildHash: config.buildHash ?? md5Bytes(versionBase),
155
+ deviceProps: config.deviceProps ?? defaultDeviceProps(versionBase, config, version),
151
156
  eRegid: intToBytes(4, registrationId),
152
- eKeytype: intToBytes(1, KEY_TYPE_CURVE25519),
153
- eIdent: toBytesView(config.registrationInfo.identityKeyPair.pubKey),
157
+ eKeytype: intToBytes(1, 5),
158
+ eIdent: config.registrationInfo.identityKeyPair.pubKey,
154
159
  eSkeyId: intToBytes(3, signedPreKeyId),
155
- eSkeyVal: toBytesView(config.signedPreKey.keyPair.pubKey),
156
- eSkeySig: toBytesView(config.signedPreKey.signature)
160
+ eSkeyVal: config.signedPreKey.keyPair.pubKey,
161
+ eSkeySig: config.signedPreKey.signature
157
162
  };
158
163
  return proto.ClientPayload.encode({
159
164
  ...common,
@@ -1,4 +1,4 @@
1
- import { EMPTY_BYTES, toBytesView } from '../../util/bytes.js';
1
+ import { EMPTY_BYTES } from '../../util/bytes.js';
2
2
  const WA_MAX_FRAME_LENGTH = (1 << 24) - 1;
3
3
  function frameLength(header) {
4
4
  return (header[0] << 16) | (header[1] << 8) | header[2];
@@ -11,7 +11,7 @@ export class WaFrameCodec {
11
11
  if (maxFrameLength >= 1 << 24) {
12
12
  throw new Error('maxFrameLength must be lower than protocol limit (16777216)');
13
13
  }
14
- this.introFrame = introFrame && introFrame.length > 0 ? toBytesView(introFrame) : null;
14
+ this.introFrame = introFrame && introFrame.length > 0 ? introFrame : null;
15
15
  this.maxFrameLength = maxFrameLength;
16
16
  this.introSent = false;
17
17
  this.buffered = EMPTY_BYTES;
@@ -0,0 +1,53 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { proto } from '../../proto.js';
3
+ function parseAppVersion(version) {
4
+ const parts = version.split('.');
5
+ const at = (i) => {
6
+ const n = Number(parts[i]);
7
+ return Number.isFinite(n) ? n : undefined;
8
+ };
9
+ return {
10
+ primary: at(0) ?? 2,
11
+ secondary: at(1) ?? 0,
12
+ tertiary: at(2) ?? 0,
13
+ quaternary: at(3)
14
+ };
15
+ }
16
+ export function buildMobileLoginPayload(config) {
17
+ if (!Number.isSafeInteger(config.username) || config.username <= 0) {
18
+ throw new Error('mobile login payload requires a valid numeric username');
19
+ }
20
+ const info = config.deviceInfo;
21
+ const version = parseAppVersion(info.appVersion);
22
+ const userAgent = {
23
+ platform: proto.ClientPayload.UserAgent.Platform.ANDROID,
24
+ releaseChannel: proto.ClientPayload.UserAgent.ReleaseChannel.RELEASE,
25
+ appVersion: version,
26
+ mcc: info.mcc ?? '000',
27
+ mnc: info.mnc ?? '000',
28
+ osVersion: info.osVersion,
29
+ manufacturer: info.manufacturer,
30
+ device: info.device,
31
+ osBuildNumber: info.osBuildNumber,
32
+ phoneId: info.phoneId ?? randomUUID(),
33
+ localeLanguageIso6391: info.localeLanguageIso6391 ?? 'en',
34
+ localeCountryIso31661Alpha2: info.localeCountryIso31661Alpha2 ?? 'US',
35
+ deviceType: proto.ClientPayload.UserAgent.DeviceType.PHONE,
36
+ deviceBoard: info.deviceBoard,
37
+ deviceModelType: info.deviceModelType
38
+ };
39
+ return proto.ClientPayload.encode({
40
+ passive: config.passive === true,
41
+ pull: config.pull ?? true,
42
+ product: proto.ClientPayload.Product.WHATSAPP,
43
+ connectType: config.connectType ?? proto.ClientPayload.ConnectType.CELLULAR_UNKNOWN,
44
+ connectReason: config.connectReason ?? proto.ClientPayload.ConnectReason.USER_ACTIVATED,
45
+ userAgent,
46
+ username: config.username,
47
+ device: config.device ?? 0,
48
+ lidDbMigrated: config.lidDbMigrated === true,
49
+ pushName: config.pushName,
50
+ yearClass: config.yearClass,
51
+ memClass: config.memClass
52
+ }).finish();
53
+ }