zapo-js 0.1.0 → 0.1.2

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 (366) hide show
  1. package/README.md +12 -7
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +27 -9
  354. package/proto/index.d.ts +1090 -1048
  355. package/proto/index.js +1 -1
  356. package/scripts/check-node-version.cjs +0 -1
  357. package/dist/crypto/core/encoding.js +0 -29
  358. package/dist/esm/crypto/core/encoding.js +0 -25
  359. package/dist/esm/util/base64.js +0 -18
  360. package/dist/esm/util/signal-address.js +0 -5
  361. package/dist/types/crypto/core/encoding.d.ts +0 -11
  362. package/dist/types/util/base64.d.ts +0 -4
  363. package/dist/types/util/signal-address.d.ts +0 -2
  364. package/dist/util/base64.js +0 -24
  365. package/dist/util/signal-address.js +0 -8
  366. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -4,21 +4,124 @@ exports.getNodeChildren = getNodeChildren;
4
4
  exports.findNodeChild = findNodeChild;
5
5
  exports.getFirstNodeChild = getFirstNodeChild;
6
6
  exports.getNodeChildrenByTag = getNodeChildrenByTag;
7
+ exports.getNodeChildrenByTagFromChildren = getNodeChildrenByTagFromChildren;
8
+ exports.getNodeChildrenTags = getNodeChildrenTags;
9
+ exports.getNodeChildrenNonEmptyAttrValuesByTag = getNodeChildrenNonEmptyAttrValuesByTag;
10
+ exports.getNodeChildrenNonEmptyUtf8ByTag = getNodeChildrenNonEmptyUtf8ByTag;
11
+ exports.findNodeChildrenByTags = findNodeChildrenByTags;
7
12
  exports.hasNodeChild = hasNodeChild;
8
13
  exports.decodeNodeContentUtf8OrBytes = decodeNodeContentUtf8OrBytes;
9
14
  exports.decodeNodeContentBase64OrBytes = decodeNodeContentBase64OrBytes;
15
+ exports.formatNodeIdPrefixFromSeed = formatNodeIdPrefixFromSeed;
10
16
  const bytes_1 = require("../../util/bytes");
17
+ const EMPTY_NODE_CHILDREN = Object.freeze([]);
18
+ const EMPTY_NODE_TAGS = Object.freeze([]);
19
+ const EMPTY_NODE_VALUES = Object.freeze([]);
11
20
  function getNodeChildren(node) {
12
- return Array.isArray(node.content) ? node.content : [];
21
+ return Array.isArray(node.content) ? node.content : EMPTY_NODE_CHILDREN;
13
22
  }
14
23
  function findNodeChild(node, tag) {
15
- return getNodeChildren(node).find((child) => child.tag === tag);
24
+ const content = node.content;
25
+ if (!Array.isArray(content))
26
+ return undefined;
27
+ for (let i = 0; i < content.length; i++) {
28
+ if (content[i].tag === tag)
29
+ return content[i];
30
+ }
16
31
  }
17
32
  function getFirstNodeChild(node) {
18
33
  return getNodeChildren(node)[0];
19
34
  }
20
35
  function getNodeChildrenByTag(node, tag) {
21
- return getNodeChildren(node).filter((child) => child.tag === tag);
36
+ const content = node.content;
37
+ if (!Array.isArray(content))
38
+ return EMPTY_NODE_CHILDREN;
39
+ let tagged = null;
40
+ for (let i = 0; i < content.length; i++) {
41
+ if (content[i].tag !== tag)
42
+ continue;
43
+ if (!tagged)
44
+ tagged = [];
45
+ tagged.push(content[i]);
46
+ }
47
+ return tagged ?? EMPTY_NODE_CHILDREN;
48
+ }
49
+ function getNodeChildrenByTagFromChildren(node, tag) {
50
+ let tagged = null;
51
+ const content = node.content;
52
+ if (!Array.isArray(content))
53
+ return EMPTY_NODE_CHILDREN;
54
+ for (let i = 0; i < content.length; i += 1) {
55
+ const nested = content[i].content;
56
+ if (!Array.isArray(nested))
57
+ continue;
58
+ for (let j = 0; j < nested.length; j += 1) {
59
+ if (nested[j].tag !== tag)
60
+ continue;
61
+ if (!tagged)
62
+ tagged = [];
63
+ tagged.push(nested[j]);
64
+ }
65
+ }
66
+ return tagged ?? EMPTY_NODE_CHILDREN;
67
+ }
68
+ function getNodeChildrenTags(node) {
69
+ const content = node.content;
70
+ if (!Array.isArray(content) || content.length === 0)
71
+ return EMPTY_NODE_TAGS;
72
+ return content.map((c) => c.tag);
73
+ }
74
+ function getNodeChildrenNonEmptyAttrValuesByTag(node, tag, attr) {
75
+ let values = null;
76
+ const children = getNodeChildren(node);
77
+ for (let index = 0; index < children.length; index += 1) {
78
+ const child = children[index];
79
+ if (child.tag !== tag) {
80
+ continue;
81
+ }
82
+ const value = child.attrs[attr];
83
+ if (!value) {
84
+ continue;
85
+ }
86
+ if (!values) {
87
+ values = [];
88
+ }
89
+ values.push(value);
90
+ }
91
+ return values ?? EMPTY_NODE_VALUES;
92
+ }
93
+ function getNodeChildrenNonEmptyUtf8ByTag(node, tag, field) {
94
+ let values = null;
95
+ const children = getNodeChildren(node);
96
+ for (let index = 0; index < children.length; index += 1) {
97
+ const child = children[index];
98
+ if (child.tag !== tag) {
99
+ continue;
100
+ }
101
+ const raw = child.content;
102
+ if (raw === null || raw === undefined) {
103
+ continue;
104
+ }
105
+ if (raw instanceof Uint8Array && raw.length === 0) {
106
+ continue;
107
+ }
108
+ const value = bytes_1.TEXT_DECODER.decode(decodeNodeContentUtf8OrBytes(raw, field));
109
+ if (value.length === 0) {
110
+ continue;
111
+ }
112
+ if (!values) {
113
+ values = [];
114
+ }
115
+ values.push(value);
116
+ }
117
+ return values ?? EMPTY_NODE_VALUES;
118
+ }
119
+ function findNodeChildrenByTags(node, tags) {
120
+ const out = new Array(tags.length);
121
+ for (let index = 0; index < tags.length; index += 1) {
122
+ out[index] = findNodeChild(node, tags[index]);
123
+ }
124
+ return out;
22
125
  }
23
126
  function hasNodeChild(node, tag) {
24
127
  return findNodeChild(node, tag) !== undefined;
@@ -37,10 +140,15 @@ function decodeNodeContentBase64OrBytes(value, field) {
37
140
  throw new Error(`missing binary node content for ${field}`);
38
141
  }
39
142
  if (typeof value === 'string') {
40
- return (0, bytes_1.base64ToBytes)(value);
143
+ return (0, bytes_1.base64ToBytesChecked)(value, field);
41
144
  }
42
145
  if (value instanceof Uint8Array) {
43
146
  return value;
44
147
  }
45
148
  throw new Error(`missing binary node content for ${field}`);
46
149
  }
150
+ function formatNodeIdPrefixFromSeed(seed) {
151
+ const left = ((seed[0] << 8) | seed[1]) >>> 0;
152
+ const right = ((seed[2] << 8) | seed[3]) >>> 0;
153
+ return `${left}.${right}-`;
154
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUsyncSidGenerator = createUsyncSidGenerator;
4
+ const _crypto_1 = require("../../crypto/index.js");
5
+ const helpers_1 = require("./helpers");
6
+ function createUsyncSidGenerator() {
7
+ const state = {
8
+ prefix: null,
9
+ prefixPromise: null,
10
+ counter: 1
11
+ };
12
+ return async () => {
13
+ const prefix = await getUsyncPrefix(state);
14
+ const sid = `${prefix}${state.counter}`;
15
+ state.counter += 1;
16
+ return sid;
17
+ };
18
+ }
19
+ async function getUsyncPrefix(state) {
20
+ if (state.prefix) {
21
+ return state.prefix;
22
+ }
23
+ if (!state.prefixPromise) {
24
+ state.prefixPromise = buildUsyncPrefix()
25
+ .then((prefix) => {
26
+ state.prefix = prefix;
27
+ return prefix;
28
+ })
29
+ .finally(() => {
30
+ state.prefixPromise = null;
31
+ });
32
+ }
33
+ return state.prefixPromise;
34
+ }
35
+ async function buildUsyncPrefix() {
36
+ const seed = await (0, _crypto_1.randomBytesAsync)(4);
37
+ return (0, helpers_1.formatNodeIdPrefixFromSeed)(seed);
38
+ }
@@ -18,6 +18,31 @@ class WaFrameCodec {
18
18
  this.maxFrameLength = maxFrameLength;
19
19
  this.introSent = false;
20
20
  this.buffered = bytes_1.EMPTY_BYTES;
21
+ this.bufferedLength = 0;
22
+ }
23
+ assertFrameLength(length) {
24
+ if (length <= this.maxFrameLength) {
25
+ return;
26
+ }
27
+ throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
28
+ }
29
+ appendBuffered(chunk) {
30
+ if (chunk.length === 0) {
31
+ return;
32
+ }
33
+ if (this.bufferedLength === 0) {
34
+ this.buffered = chunk;
35
+ }
36
+ else {
37
+ const nextLength = this.bufferedLength + chunk.length;
38
+ if (this.buffered.length < nextLength) {
39
+ const nextBuffered = new Uint8Array(Math.max(nextLength, this.bufferedLength * 2));
40
+ nextBuffered.set(this.buffered.subarray(0, this.bufferedLength));
41
+ this.buffered = nextBuffered;
42
+ }
43
+ this.buffered.set(chunk, this.bufferedLength);
44
+ }
45
+ this.bufferedLength += chunk.length;
21
46
  }
22
47
  encodeFrame(frame) {
23
48
  if (frame.length > this.maxFrameLength) {
@@ -48,67 +73,56 @@ class WaFrameCodec {
48
73
  }
49
74
  const frames = [];
50
75
  let chunkOffset = 0;
51
- if (this.buffered.length > 0) {
52
- if (this.buffered.length < 3) {
53
- const missingHeaderBytes = 3 - this.buffered.length;
76
+ if (this.bufferedLength > 0) {
77
+ if (this.bufferedLength < 3) {
78
+ const missingHeaderBytes = 3 - this.bufferedLength;
54
79
  if (chunk.length < missingHeaderBytes) {
55
- this.buffered = (0, bytes_1.concatBytes)([this.buffered, chunk]);
80
+ this.appendBuffered(chunk);
56
81
  return frames;
57
82
  }
58
- const header = new Uint8Array(3);
59
- header.set(this.buffered, 0);
60
- header.set(chunk.subarray(0, missingHeaderBytes), this.buffered.length);
61
- const length = frameLength(header);
62
- if (length > this.maxFrameLength) {
63
- throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
64
- }
83
+ this.appendBuffered(chunk.subarray(0, missingHeaderBytes));
84
+ const length = frameLength(this.buffered);
85
+ this.assertFrameLength(length);
65
86
  const remainingAfterHeader = chunk.length - missingHeaderBytes;
66
87
  if (remainingAfterHeader < length) {
67
- const nextBuffered = new Uint8Array(3 + remainingAfterHeader);
68
- nextBuffered.set(header, 0);
69
- nextBuffered.set(chunk.subarray(missingHeaderBytes), 3);
70
- this.buffered = nextBuffered;
88
+ this.appendBuffered(chunk.subarray(missingHeaderBytes));
71
89
  return frames;
72
90
  }
73
91
  frames.push(chunk.subarray(missingHeaderBytes, missingHeaderBytes + length));
74
92
  chunkOffset = missingHeaderBytes + length;
75
- this.buffered = bytes_1.EMPTY_BYTES;
76
93
  }
77
94
  else {
78
- const header = this.buffered.subarray(0, 3);
79
- const length = frameLength(header);
80
- if (length > this.maxFrameLength) {
81
- throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
82
- }
83
- const bufferedPayloadLength = this.buffered.length - 3;
95
+ const length = frameLength(this.buffered);
96
+ this.assertFrameLength(length);
97
+ const bufferedPayloadLength = this.bufferedLength - 3;
84
98
  const missingPayloadBytes = length - bufferedPayloadLength;
85
99
  if (missingPayloadBytes > chunk.length) {
86
- this.buffered = (0, bytes_1.concatBytes)([this.buffered, chunk]);
100
+ this.appendBuffered(chunk);
87
101
  return frames;
88
102
  }
89
- if (bufferedPayloadLength === 0) {
103
+ if (missingPayloadBytes === 0) {
104
+ frames.push(this.buffered.subarray(3, 3 + length));
105
+ }
106
+ else if (bufferedPayloadLength === 0) {
90
107
  frames.push(chunk.subarray(0, missingPayloadBytes));
91
108
  }
92
109
  else {
93
110
  const frame = new Uint8Array(length);
94
- frame.set(this.buffered.subarray(3), 0);
95
- if (missingPayloadBytes > 0) {
96
- frame.set(chunk.subarray(0, missingPayloadBytes), bufferedPayloadLength);
97
- }
111
+ frame.set(this.buffered.subarray(3, this.bufferedLength));
112
+ frame.set(chunk.subarray(0, missingPayloadBytes), bufferedPayloadLength);
98
113
  frames.push(frame);
99
114
  }
100
115
  chunkOffset = missingPayloadBytes;
101
- this.buffered = bytes_1.EMPTY_BYTES;
102
116
  }
117
+ this.buffered = bytes_1.EMPTY_BYTES;
118
+ this.bufferedLength = 0;
103
119
  }
104
120
  const remainingChunk = chunk.subarray(chunkOffset);
105
121
  let offset = 0;
106
122
  while (remainingChunk.length - offset >= 3) {
107
123
  const header = remainingChunk.subarray(offset, offset + 3);
108
124
  const length = frameLength(header);
109
- if (length > this.maxFrameLength) {
110
- throw new Error(`incoming frame is too large: ${length} bytes (max allowed: ${this.maxFrameLength})`);
111
- }
125
+ this.assertFrameLength(length);
112
126
  if (remainingChunk.length - offset - 3 < length) {
113
127
  break;
114
128
  }
@@ -119,6 +133,7 @@ class WaFrameCodec {
119
133
  }
120
134
  this.buffered =
121
135
  offset >= remainingChunk.length ? bytes_1.EMPTY_BYTES : remainingChunk.subarray(offset);
136
+ this.bufferedLength = this.buffered.length;
122
137
  return frames;
123
138
  }
124
139
  }
@@ -5,12 +5,11 @@ const _crypto_1 = require("../../crypto/index.js");
5
5
  const X25519_1 = require("../../crypto/curves/X25519");
6
6
  const _proto_1 = require("../../proto.js");
7
7
  const constants_1 = require("../noise/constants");
8
- const base64_1 = require("../../util/base64");
9
8
  const bytes_1 = require("../../util/bytes");
10
9
  const primitives_1 = require("../../util/primitives");
11
10
  async function verifySignalVariant(serializedPublicKey, message, signatureInput) {
12
11
  const publicKey = (0, _crypto_1.toSerializedPubKey)(serializedPublicKey);
13
- if (signatureInput.length !== 64) {
12
+ if (!(0, bytes_1.assertByteLength)(signatureInput, 64, 'invalid certificate signature size', false)) {
14
13
  return false;
15
14
  }
16
15
  const signature = new Uint8Array(signatureInput);
@@ -27,15 +26,13 @@ function parseNoiseCertificate(certificate) {
27
26
  if (!certificate) {
28
27
  throw new Error('missing noise certificate');
29
28
  }
30
- const detailsBytes = (0, base64_1.decodeProtoBytes)(certificate.details, 'certificate.details');
31
- const signatureBytes = (0, base64_1.decodeProtoBytes)(certificate.signature, 'certificate.signature');
32
- if (signatureBytes.length !== 64) {
33
- throw new Error('invalid certificate signature size');
34
- }
29
+ const detailsBytes = (0, bytes_1.decodeProtoBytes)(certificate.details, 'certificate.details');
30
+ const signatureBytes = (0, bytes_1.decodeProtoBytes)(certificate.signature, 'certificate.signature');
31
+ (0, bytes_1.assertByteLength)(signatureBytes, 64, 'invalid certificate signature size');
35
32
  const details = _proto_1.proto.CertChain.NoiseCertificate.Details.decode(detailsBytes);
36
33
  const serial = (0, primitives_1.toSafeNumber)(details.serial, 'certificate.serial');
37
34
  const issuerSerial = (0, primitives_1.toSafeNumber)(details.issuerSerial, 'certificate.issuerSerial');
38
- const key = (0, base64_1.decodeProtoBytes)(details.key, 'certificate.key');
35
+ const key = (0, bytes_1.decodeProtoBytes)(details.key, 'certificate.key');
39
36
  return {
40
37
  serial,
41
38
  issuerSerial,
@@ -51,12 +51,9 @@ function buildRoutingInfoPrefix(routingInfo) {
51
51
  }
52
52
  class WaNoiseSession {
53
53
  constructor(sendWire, logger = new ConsoleLogger_1.ConsoleLogger('info')) {
54
- this.sendWire = sendWire;
55
- this.logger = logger;
56
- this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
57
- this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
58
54
  this.frameCodec = null;
59
55
  this.handshakeInbox = [];
56
+ this.handshakeInboxHead = 0;
60
57
  this.handshakeWaiter = null;
61
58
  this.handshakeRejecter = null;
62
59
  this.pendingDecryptedFrames = [];
@@ -64,6 +61,10 @@ class WaNoiseSession {
64
61
  this.noiseSocket = null;
65
62
  this.serverStaticKey = null;
66
63
  this.handshakeFrameTimeoutMs = constants_1.WA_DEFAULTS.CONNECT_TIMEOUT_MS;
64
+ this.sendWire = sendWire;
65
+ this.logger = logger;
66
+ this.writeQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
67
+ this.readQueue = new BoundedTaskQueue_1.BoundedTaskQueue(4096, 1);
67
68
  }
68
69
  async start(config) {
69
70
  this.reset();
@@ -147,7 +148,7 @@ class WaNoiseSession {
147
148
  reset() {
148
149
  this.logger.trace('noise session reset');
149
150
  this.frameCodec = null;
150
- this.handshakeInbox = [];
151
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
151
152
  this.handshakeWaiter = null;
152
153
  this.handshakeRejecter = null;
153
154
  this.pendingDecryptedFrames = [];
@@ -278,8 +279,13 @@ class WaNoiseSession {
278
279
  if (this.closedError) {
279
280
  throw this.closedError;
280
281
  }
281
- const queued = this.handshakeInbox.shift();
282
+ const queued = this.handshakeInboxHead < this.handshakeInbox.length
283
+ ? this.handshakeInbox[this.handshakeInboxHead++]
284
+ : undefined;
282
285
  if (queued) {
286
+ if (this.handshakeInboxHead === this.handshakeInbox.length) {
287
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
288
+ }
283
289
  this.logger.trace('noise handshake frame consumed from queue');
284
290
  return queued;
285
291
  }
@@ -310,17 +316,18 @@ class WaNoiseSession {
310
316
  });
311
317
  }
312
318
  async decodeBufferedPostHandshakeFrames() {
313
- if (!this.noiseSocket || this.handshakeInbox.length === 0) {
319
+ if (!this.noiseSocket || this.handshakeInboxHead >= this.handshakeInbox.length) {
314
320
  return;
315
321
  }
316
322
  this.logger.debug('decoding buffered post-handshake frames', {
317
- count: this.handshakeInbox.length
323
+ count: this.handshakeInbox.length - this.handshakeInboxHead
318
324
  });
319
- const buffered = this.handshakeInbox.splice(0, this.handshakeInbox.length);
320
- for (const frame of buffered) {
325
+ for (let index = this.handshakeInboxHead; index < this.handshakeInbox.length; index += 1) {
326
+ const frame = this.handshakeInbox[index];
321
327
  const decrypted = await this.readQueue.enqueue(() => this.noiseSocket.decrypt(frame));
322
328
  this.pendingDecryptedFrames.push(decrypted);
323
329
  }
330
+ this.handshakeInbox.length = this.handshakeInboxHead = 0;
324
331
  }
325
332
  }
326
333
  exports.WaNoiseSession = WaNoiseSession;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isProxyDispatcher = isProxyDispatcher;
4
+ exports.isProxyAgent = isProxyAgent;
5
+ exports.isProxyTransport = isProxyTransport;
6
+ exports.toProxyDispatcher = toProxyDispatcher;
7
+ exports.toProxyAgent = toProxyAgent;
8
+ function isProxyDispatcher(value) {
9
+ return (typeof value === 'object' &&
10
+ value !== null &&
11
+ 'dispatch' in value &&
12
+ typeof value.dispatch === 'function');
13
+ }
14
+ function isProxyAgent(value) {
15
+ return (typeof value === 'object' &&
16
+ value !== null &&
17
+ 'addRequest' in value &&
18
+ typeof value.addRequest === 'function');
19
+ }
20
+ function isProxyTransport(value) {
21
+ return isProxyDispatcher(value) || isProxyAgent(value);
22
+ }
23
+ function toProxyDispatcher(proxy) {
24
+ if (!proxy || !isProxyDispatcher(proxy)) {
25
+ return undefined;
26
+ }
27
+ return proxy;
28
+ }
29
+ function toProxyAgent(proxy) {
30
+ if (!proxy || !isProxyAgent(proxy)) {
31
+ return undefined;
32
+ }
33
+ return proxy;
34
+ }
@@ -1,80 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseStreamControlNode = parseStreamControlNode;
4
- exports.parseOptionalInt = parseOptionalInt;
5
4
  exports.parseCompanionEncStatic = parseCompanionEncStatic;
6
5
  exports.parseSuccessPersistAttributes = parseSuccessPersistAttributes;
7
6
  const constants_1 = require("../../protocol/constants");
8
7
  const helpers_1 = require("../node/helpers");
9
- const base64_1 = require("../../util/base64");
10
- function parseStrictUnsignedInt(value) {
11
- if (!/^\d+$/.test(value)) {
12
- return undefined;
13
- }
14
- const parsed = Number(value);
15
- if (!Number.isSafeInteger(parsed)) {
16
- return undefined;
17
- }
18
- return parsed;
19
- }
8
+ const bytes_1 = require("../../util/bytes");
9
+ const primitives_1 = require("../../util/primitives");
20
10
  function parseStreamControlNode(node) {
21
11
  if (node.tag === constants_1.WA_STREAM_SIGNALING.XML_STREAM_END_TAG) {
22
- return {
23
- kind: 'xmlstreamend'
24
- };
12
+ return { kind: 'xmlstreamend' };
25
13
  }
26
14
  if (node.tag !== constants_1.WA_STREAM_SIGNALING.STREAM_ERROR_TAG) {
27
15
  return null;
28
16
  }
29
17
  const conflictNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.CONFLICT_TAG);
30
18
  if (conflictNode) {
31
- if (conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE) {
32
- return {
33
- kind: 'stream_error_replaced'
34
- };
35
- }
36
- return {
37
- kind: 'stream_error_device_removed'
38
- };
19
+ return conflictNode.attrs.type === constants_1.WA_STREAM_SIGNALING.REPLACED_TYPE
20
+ ? { kind: 'stream_error_replaced' }
21
+ : { kind: 'stream_error_device_removed' };
39
22
  }
40
- const codeRaw = node.attrs.code;
41
- if (codeRaw) {
42
- const code = parseStrictUnsignedInt(codeRaw);
43
- if (code !== undefined) {
44
- return {
45
- kind: 'stream_error_code',
46
- code
47
- };
48
- }
23
+ const code = node.attrs.code ? (0, primitives_1.parseStrictUnsignedInt)(node.attrs.code) : undefined;
24
+ if (code !== undefined) {
25
+ return { kind: 'stream_error_code', code };
49
26
  }
50
27
  const ackNode = (0, helpers_1.findNodeChild)(node, constants_1.WA_STREAM_SIGNALING.ACK_TAG);
51
28
  if (ackNode) {
52
- return {
53
- kind: 'stream_error_ack',
54
- id: ackNode.attrs.id
55
- };
29
+ return { kind: 'stream_error_ack', id: ackNode.attrs.id };
56
30
  }
57
31
  if ((0, helpers_1.hasNodeChild)(node, constants_1.WA_STREAM_SIGNALING.XML_NOT_WELL_FORMED_TAG)) {
58
- return {
59
- kind: 'stream_error_xml_not_well_formed'
60
- };
61
- }
62
- return {
63
- kind: 'stream_error_other'
64
- };
65
- }
66
- function parseOptionalInt(value) {
67
- if (!value) {
68
- return undefined;
32
+ return { kind: 'stream_error_xml_not_well_formed' };
69
33
  }
70
- return parseStrictUnsignedInt(value);
34
+ return { kind: 'stream_error_other' };
71
35
  }
72
36
  function parseCompanionEncStatic(value, onError) {
73
37
  if (!value) {
74
38
  return undefined;
75
39
  }
76
40
  try {
77
- return (0, base64_1.base64ToBytes)(value, 'success.companion_enc_static');
41
+ return (0, bytes_1.base64ToBytesChecked)(value, 'success.companion_enc_static');
78
42
  }
79
43
  catch (error) {
80
44
  if (error instanceof Error) {
@@ -88,10 +52,10 @@ function parseSuccessPersistAttributes(node, onCompanionParseError) {
88
52
  meLid: node.attrs.lid,
89
53
  meDisplayName: node.attrs.display_name,
90
54
  companionEncStatic: parseCompanionEncStatic(node.attrs.companion_enc_static, onCompanionParseError),
91
- lastSuccessTs: parseOptionalInt(node.attrs.t),
92
- propsVersion: parseOptionalInt(node.attrs.props),
93
- abPropsVersion: parseOptionalInt(node.attrs.abprops),
55
+ lastSuccessTs: (0, primitives_1.parseOptionalInt)(node.attrs.t),
56
+ propsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.props),
57
+ abPropsVersion: (0, primitives_1.parseOptionalInt)(node.attrs.abprops),
94
58
  connectionLocation: node.attrs.location,
95
- accountCreationTs: parseOptionalInt(node.attrs.creation)
59
+ accountCreationTs: (0, primitives_1.parseOptionalInt)(node.attrs.creation)
96
60
  };
97
61
  }
@@ -53,7 +53,6 @@ export declare class WaAppStateCrypto {
53
53
  private pointwiseWithOverflow;
54
54
  private generateAssociatedData;
55
55
  private generateValueMac;
56
- private normalizeDerivedKeysCacheMaxSize;
57
56
  private touchDerivedKeysCacheEntry;
58
57
  }
59
58
  export {};
@@ -7,6 +7,7 @@ interface WaAppStateSyncClientOptions {
7
7
  readonly logger: Logger;
8
8
  readonly query: (node: BinaryNode, timeoutMs: number) => Promise<BinaryNode>;
9
9
  readonly store: WaAppStateStore;
10
+ readonly getCurrentMeJid?: () => string | null | undefined;
10
11
  readonly hostDomain?: string;
11
12
  readonly defaultTimeoutMs?: number;
12
13
  readonly onMissingKeys?: (event: WaAppStateMissingKeysEvent) => Promise<void>;
@@ -20,6 +21,7 @@ export declare class WaAppStateSyncClient {
20
21
  private readonly logger;
21
22
  private readonly query;
22
23
  private readonly store;
24
+ private readonly getCurrentMeJid?;
23
25
  private readonly hostDomain;
24
26
  private readonly defaultTimeoutMs;
25
27
  private readonly onMissingKeys?;
@@ -33,13 +35,11 @@ export declare class WaAppStateSyncClient {
33
35
  sync(options?: WaAppStateSyncOptions): Promise<WaAppStateSyncResult>;
34
36
  private syncOnce;
35
37
  private syncCollectionsRound;
36
- private prepareSyncRoundRequest;
37
38
  private buildCollectionSyncRequest;
38
39
  private buildSyncIqNode;
39
40
  private fetchSyncPayloadByCollection;
40
41
  private processCollectionRound;
41
42
  private createCollectionOutcome;
42
- private collectDistinctMissingKeyIds;
43
43
  private notifyMissingKeys;
44
44
  private resolveReadyPatches;
45
45
  private validateSnapshot;
@@ -51,9 +51,12 @@ export declare class WaAppStateSyncClient {
51
51
  private decryptPatchMutations;
52
52
  private assertPatchMacsMatch;
53
53
  private buildOutgoingPatch;
54
+ private resolveDeviceIndex;
55
+ private buildPatchClientDebugData;
54
56
  private computeNextCollectionState;
55
57
  private normalizeProtoLong;
56
58
  private groupPendingMutations;
59
+ private preloadKeyData;
57
60
  private getKeyData;
58
61
  private getCollectionState;
59
62
  private setCollectionState;
@@ -11,4 +11,5 @@ export declare const APP_STATE_IV_LENGTH = 16;
11
11
  export declare const APP_STATE_LT_HASH_SIZE = 128;
12
12
  export declare const APP_STATE_POINT_SIZE = 2;
13
13
  export declare const APP_STATE_EMPTY_LT_HASH: Uint8Array<ArrayBuffer>;
14
+ export declare const APP_STATE_DEFAULT_COLLECTION_VERSION = 0;
14
15
  export declare const APP_STATE_DEFAULT_COLLECTIONS: readonly AppStateCollectionName[];
@@ -1,21 +1,7 @@
1
1
  import type { WaAppStateStoreData, WaAppStateSyncKey } from '../types';
2
- export interface AppStateSyncKeyRow extends Record<string, unknown> {
3
- readonly key_id: unknown;
4
- readonly key_data: unknown;
5
- readonly timestamp: unknown;
6
- readonly fingerprint: unknown;
7
- }
8
- export interface AppStateCollectionVersionRow extends Record<string, unknown> {
9
- readonly collection: unknown;
10
- readonly version: unknown;
11
- readonly hash: unknown;
12
- }
13
- export interface AppStateCollectionValueRow extends Record<string, unknown> {
14
- readonly collection: unknown;
15
- readonly index_mac_hex: unknown;
16
- readonly value_mac: unknown;
17
- }
2
+ type SqliteRow = Readonly<Record<string, unknown>>;
18
3
  export declare function encodeAppStateFingerprint(fingerprint: WaAppStateSyncKey['fingerprint']): Uint8Array | null;
19
4
  export declare function decodeAppStateFingerprint(raw: unknown): WaAppStateSyncKey['fingerprint'] | undefined;
20
- export declare function decodeAppStateSyncKeys(rows: readonly AppStateSyncKeyRow[]): readonly WaAppStateSyncKey[];
21
- export declare function decodeAppStateCollections(versionRows: readonly AppStateCollectionVersionRow[], valueRows: readonly AppStateCollectionValueRow[]): WaAppStateStoreData['collections'];
5
+ export declare function decodeAppStateSyncKeys(rows: readonly SqliteRow[]): readonly WaAppStateSyncKey[];
6
+ export declare function decodeAppStateCollections(versionRows: readonly SqliteRow[], valueRows: readonly SqliteRow[]): WaAppStateStoreData['collections'];
7
+ export {};
@@ -1,7 +1,6 @@
1
1
  import type { AppStateCollectionName, WaAppStateSyncKey } from './types';
2
2
  import type { WaMediaTransferClient } from '../media/WaMediaTransferClient';
3
3
  import type { Proto } from '..';
4
- export declare function keyIdToHex(keyId: Uint8Array): string;
5
4
  export declare function parseCollectionName(value: string | undefined): AppStateCollectionName | null;
6
5
  export declare function keyDeviceId(keyId: Uint8Array): number | null;
7
6
  export declare function keyEpoch(keyId: Uint8Array): number;