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
@@ -24,7 +24,13 @@ function parseDirtyBitNode(node, logger) {
24
24
  };
25
25
  }
26
26
  function resolveAccountSyncProtocols(protocols) {
27
- const selected = protocols.filter((protocol) => ACCOUNT_SYNC_PROTOCOL_SET.has(protocol));
27
+ const selected = [];
28
+ for (let index = 0; index < protocols.length; index += 1) {
29
+ const protocol = protocols[index];
30
+ if (ACCOUNT_SYNC_PROTOCOL_SET.has(protocol)) {
31
+ selected.push(protocol);
32
+ }
33
+ }
28
34
  if (selected.length > 0) {
29
35
  return selected;
30
36
  }
@@ -56,12 +62,24 @@ export async function handleDirtyBits(runtime, dirtyBits) {
56
62
  }
57
63
  unsupported.push(dirtyBit);
58
64
  }
65
+ const supportedTypes = new Array(supported.length);
66
+ for (let index = 0; index < supported.length; index += 1) {
67
+ supportedTypes[index] = supported[index].type;
68
+ }
69
+ const unsupportedTypes = new Array(unsupported.length);
70
+ for (let index = 0; index < unsupported.length; index += 1) {
71
+ unsupportedTypes[index] = unsupported[index].type;
72
+ }
59
73
  runtime.logger.info('handling dirty bits from info bulletin', {
60
- supported: supported.map((entry) => entry.type).join(','),
61
- unsupported: unsupported.map((entry) => entry.type).join(',')
74
+ supported: supportedTypes.join(','),
75
+ unsupported: unsupportedTypes.join(',')
62
76
  });
63
77
  const clearableDirtyBits = [...unsupported];
64
- const settledSupported = await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)));
78
+ const supportedPromises = new Array(supported.length);
79
+ for (let index = 0; index < supported.length; index += 1) {
80
+ supportedPromises[index] = handleDirtyBit(runtime, supported[index]);
81
+ }
82
+ const settledSupported = await Promise.allSettled(supportedPromises);
65
83
  for (let index = 0; index < settledSupported.length; index += 1) {
66
84
  const result = settledSupported[index];
67
85
  if (result.status === 'fulfilled') {
@@ -101,18 +119,23 @@ async function handleAccountSyncDirtyBit(runtime, protocols) {
101
119
  protocols: selectedProtocols.join(',')
102
120
  });
103
121
  const failures = [];
104
- await Promise.all(selectedProtocols.map(async (protocol) => {
105
- try {
106
- await runAccountSyncProtocol(runtime, protocol);
107
- }
108
- catch (error) {
109
- failures.push(protocol);
110
- runtime.logger.warn('account_sync protocol failed', {
111
- protocol,
112
- message: toError(error).message
113
- });
114
- }
115
- }));
122
+ const protocolPromises = new Array(selectedProtocols.length);
123
+ for (let index = 0; index < selectedProtocols.length; index += 1) {
124
+ const protocol = selectedProtocols[index];
125
+ protocolPromises[index] = (async () => {
126
+ try {
127
+ await runAccountSyncProtocol(runtime, protocol);
128
+ }
129
+ catch (error) {
130
+ failures.push(protocol);
131
+ runtime.logger.warn('account_sync protocol failed', {
132
+ protocol,
133
+ message: toError(error).message
134
+ });
135
+ }
136
+ })();
137
+ }
138
+ await Promise.all(protocolPromises);
116
139
  if (failures.length > 0) {
117
140
  throw new Error(`account_sync protocols failed: ${failures.join(',')}`);
118
141
  }
@@ -132,7 +155,7 @@ async function runAccountSyncProtocol(runtime, protocol) {
132
155
  await syncAccountBlocklistDirtyBit(runtime);
133
156
  return;
134
157
  case WA_DIRTY_PROTOCOLS.NOTICE:
135
- await syncAccountNoticeDirtyBit(runtime);
158
+ runtime.logger.info('account_sync notice protocol received (no GraphQL/MEX job configured)');
136
159
  return;
137
160
  default:
138
161
  runtime.logger.debug('unsupported account_sync protocol', {
@@ -207,9 +230,6 @@ async function syncAccountBlocklistDirtyBit(runtime) {
207
230
  logMessage: 'account_sync blocklist synchronized'
208
231
  });
209
232
  }
210
- async function syncAccountNoticeDirtyBit(runtime) {
211
- runtime.logger.info('account_sync notice protocol received (no GraphQL/MEX job configured)');
212
- }
213
233
  async function syncGroupsDirtyBit(runtime) {
214
234
  await runSyncQuery(runtime, {
215
235
  queryContext: 'dirty.groups',
@@ -242,7 +262,7 @@ async function clearDirtyBits(runtime, dirtyBits) {
242
262
  try {
243
263
  await runtime.queryWithContext('dirty.clear', buildClearDirtyBitsIq(dirtyBits), WA_DEFAULTS.IQ_TIMEOUT_MS, {
244
264
  count: dirtyBits.length
245
- });
265
+ }, { useSystemId: true });
246
266
  runtime.logger.info('dirty bits cleared', {
247
267
  count: dirtyBits.length
248
268
  });
@@ -0,0 +1,40 @@
1
+ import { findNodeChild, getNodeChildren } from '../../transport/node/helpers.js';
2
+ import { parseOptionalInt } from '../../util/primitives.js';
3
+ export function parseAbPropsIqResult(node) {
4
+ const propsNode = findNodeChild(node, 'props');
5
+ if (!propsNode) {
6
+ return {
7
+ abKey: null,
8
+ hash: null,
9
+ refresh: null,
10
+ refreshId: null,
11
+ isDeltaUpdate: false,
12
+ props: []
13
+ };
14
+ }
15
+ const attrs = propsNode.attrs;
16
+ const propChildren = getNodeChildren(propsNode);
17
+ const props = [];
18
+ for (let i = 0; i < propChildren.length; i += 1) {
19
+ const child = propChildren[i];
20
+ if (child.tag !== 'prop') {
21
+ continue;
22
+ }
23
+ const configCode = parseOptionalInt(child.attrs.config_code);
24
+ if (configCode === undefined) {
25
+ continue;
26
+ }
27
+ props.push({
28
+ configCode,
29
+ configValue: child.attrs.config_value ?? null
30
+ });
31
+ }
32
+ return {
33
+ abKey: attrs.ab_key ?? null,
34
+ hash: attrs.hash ?? null,
35
+ refresh: parseOptionalInt(attrs.refresh) ?? null,
36
+ refreshId: parseOptionalInt(attrs.refresh_id) ?? null,
37
+ isDeltaUpdate: attrs.delta_update === 'true',
38
+ props
39
+ };
40
+ }
@@ -0,0 +1,68 @@
1
+ import { parseSignalAddressFromJid } from '../../protocol/jid.js';
2
+ import { findNodeChild, getNodeChildrenByTag } from '../../transport/node/helpers.js';
3
+ export const DEVICE_NOTIFICATION_ACTIONS = Object.freeze({
4
+ ADD: 'add',
5
+ REMOVE: 'remove',
6
+ UPDATE: 'update'
7
+ });
8
+ export function parseDeviceNotification(node) {
9
+ const stanzaId = node.attrs.id;
10
+ const fromJid = node.attrs.from;
11
+ if (!stanzaId || !fromJid) {
12
+ return null;
13
+ }
14
+ let action;
15
+ let actionNode;
16
+ if (findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.REMOVE)) {
17
+ action = DEVICE_NOTIFICATION_ACTIONS.REMOVE;
18
+ actionNode = findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.REMOVE);
19
+ }
20
+ else if (findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.ADD)) {
21
+ action = DEVICE_NOTIFICATION_ACTIONS.ADD;
22
+ actionNode = findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.ADD);
23
+ }
24
+ else if (findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.UPDATE)) {
25
+ action = DEVICE_NOTIFICATION_ACTIONS.UPDATE;
26
+ actionNode = findNodeChild(node, DEVICE_NOTIFICATION_ACTIONS.UPDATE);
27
+ }
28
+ else {
29
+ return null;
30
+ }
31
+ const devices = [];
32
+ if (action !== DEVICE_NOTIFICATION_ACTIONS.UPDATE && actionNode) {
33
+ const deviceNodes = getNodeChildrenByTag(actionNode, 'device');
34
+ for (let index = 0; index < deviceNodes.length; index += 1) {
35
+ const deviceNode = deviceNodes[index];
36
+ const jidAttr = deviceNode.attrs.jid;
37
+ if (!jidAttr) {
38
+ continue;
39
+ }
40
+ let deviceId;
41
+ try {
42
+ deviceId = parseSignalAddressFromJid(jidAttr).device;
43
+ }
44
+ catch {
45
+ continue;
46
+ }
47
+ const keyIndexAttr = deviceNode.attrs['key-index'];
48
+ const parsedKeyIndex = keyIndexAttr === undefined ? null : Number.parseInt(keyIndexAttr, 10);
49
+ const keyIndex = parsedKeyIndex !== null &&
50
+ Number.isSafeInteger(parsedKeyIndex) &&
51
+ parsedKeyIndex >= 0
52
+ ? parsedKeyIndex
53
+ : null;
54
+ devices[devices.length] = {
55
+ deviceId,
56
+ keyIndex
57
+ };
58
+ }
59
+ }
60
+ return {
61
+ action,
62
+ stanzaId,
63
+ fromJid,
64
+ lid: node.attrs.lid,
65
+ hash: action === DEVICE_NOTIFICATION_ACTIONS.UPDATE ? actionNode?.attrs.hash : undefined,
66
+ devices
67
+ };
68
+ }
@@ -1,3 +1,4 @@
1
+ import { createUnhandledIncomingNodeEvent } from '../incoming.js';
1
2
  import { WA_GROUP_NOTIFICATION_TAGS, WA_NOTIFICATION_TYPES } from '../../protocol/constants.js';
2
3
  import { WA_NODE_TAGS } from '../../protocol/nodes.js';
3
4
  import { findNodeChild, getNodeChildren, getNodeChildrenByTag } from '../../transport/node/helpers.js';
@@ -99,15 +100,6 @@ function createBaseGroupEvent(notificationNode, actionNode) {
99
100
  timestampSeconds: parseOptionalInt(notificationNode.attrs.t)
100
101
  };
101
102
  }
102
- function createUnhandledStanzaEvent(notificationNode, reason) {
103
- return {
104
- rawNode: notificationNode,
105
- stanzaId: notificationNode.attrs.id,
106
- chatJid: notificationNode.attrs.from,
107
- stanzaType: notificationNode.attrs.type,
108
- reason
109
- };
110
- }
111
103
  function parseCreateGroupAction(notificationNode, actionNode) {
112
104
  const groupNode = findNodeChild(actionNode, WA_NODE_TAGS.GROUP);
113
105
  if (!groupNode) {
@@ -413,13 +405,13 @@ export function parseGroupNotificationEvents(notificationNode) {
413
405
  try {
414
406
  const parsedEvent = parseGroupActionNode(notificationNode, actionNode);
415
407
  if (!parsedEvent) {
416
- unhandled.push(createUnhandledStanzaEvent(notificationNode, `notification.${WA_NOTIFICATION_TYPES.GROUP}.${actionNode.tag}.not_supported`));
408
+ unhandled.push(createUnhandledIncomingNodeEvent(notificationNode, `notification.${WA_NOTIFICATION_TYPES.GROUP}.${actionNode.tag}.not_supported`));
417
409
  continue;
418
410
  }
419
411
  events.push(parsedEvent);
420
412
  }
421
413
  catch {
422
- unhandled.push(createUnhandledStanzaEvent(notificationNode, `notification.${WA_NOTIFICATION_TYPES.GROUP}.${actionNode.tag}.parse_failed`));
414
+ unhandled.push(createUnhandledIncomingNodeEvent(notificationNode, `notification.${WA_NOTIFICATION_TYPES.GROUP}.${actionNode.tag}.parse_failed`));
423
415
  }
424
416
  }
425
417
  return {
@@ -0,0 +1,19 @@
1
+ import { getFirstNodeChild } from '../../transport/node/helpers.js';
2
+ export function parseIdentityChangeNotification(node) {
3
+ const child = getFirstNodeChild(node);
4
+ if (!child || child.tag !== 'identity') {
5
+ return null;
6
+ }
7
+ const fromJid = node.attrs.from;
8
+ const stanzaId = node.attrs.id;
9
+ if (!fromJid || !stanzaId) {
10
+ return null;
11
+ }
12
+ return {
13
+ fromJid,
14
+ stanzaId,
15
+ displayName: node.attrs.display_name,
16
+ lid: node.attrs.lid,
17
+ offline: node.attrs.offline
18
+ };
19
+ }
@@ -0,0 +1,35 @@
1
+ import { WA_PRIVACY_TOKEN_TAGS } from '../../protocol/privacy-token.js';
2
+ import { findNodeChild, getNodeChildren } from '../../transport/node/helpers.js';
3
+ import { asNumber } from '../../util/coercion.js';
4
+ export function parsePrivacyTokenNotification(node) {
5
+ const tokensNode = findNodeChild(node, WA_PRIVACY_TOKEN_TAGS.TOKENS);
6
+ if (!tokensNode) {
7
+ return [];
8
+ }
9
+ const children = getNodeChildren(tokensNode);
10
+ const result = [];
11
+ for (let i = 0; i < children.length; i += 1) {
12
+ const child = children[i];
13
+ if (child.tag !== WA_PRIVACY_TOKEN_TAGS.TOKEN) {
14
+ continue;
15
+ }
16
+ const type = child.attrs.type;
17
+ if (!type) {
18
+ continue;
19
+ }
20
+ const rawTimestamp = child.attrs.t;
21
+ if (!rawTimestamp) {
22
+ continue;
23
+ }
24
+ const content = child.content;
25
+ if (!(content instanceof Uint8Array)) {
26
+ continue;
27
+ }
28
+ result[result.length] = {
29
+ type,
30
+ tokenBytes: content,
31
+ timestampS: asNumber(Number(rawTimestamp), 'privacy_token.t')
32
+ };
33
+ }
34
+ return result;
35
+ }
@@ -0,0 +1,39 @@
1
+ import { WA_REGISTRATION_NOTIFICATION_TAGS } from '../../protocol/notification.js';
2
+ import { getFirstNodeChild } from '../../transport/node/helpers.js';
3
+ import { parseOptionalInt } from '../../util/primitives.js';
4
+ export function parseRegistrationNotification(node) {
5
+ const firstChild = getFirstNodeChild(node);
6
+ if (!firstChild) {
7
+ return null;
8
+ }
9
+ if (firstChild.tag === WA_REGISTRATION_NOTIFICATION_TAGS.WA_OLD_REGISTRATION) {
10
+ const code = firstChild.attrs.code;
11
+ const expirySeconds = parseOptionalInt(firstChild.attrs.expiry_t);
12
+ const fromDeviceId = firstChild.attrs.device_id;
13
+ if (!code || expirySeconds === undefined || !fromDeviceId) {
14
+ return null;
15
+ }
16
+ return {
17
+ kind: 'registration_code',
18
+ code,
19
+ expiryTimestampMs: expirySeconds * 1000,
20
+ fromDeviceId
21
+ };
22
+ }
23
+ if (firstChild.tag === WA_REGISTRATION_NOTIFICATION_TAGS.DEVICE_LOGOUT) {
24
+ const serverToken = firstChild.attrs.id;
25
+ const tSeconds = parseOptionalInt(firstChild.attrs.t);
26
+ if (!serverToken || tSeconds === undefined) {
27
+ return null;
28
+ }
29
+ return {
30
+ kind: 'account_takeover_notice',
31
+ serverToken,
32
+ attemptTimestampMs: tSeconds * 1000,
33
+ newDeviceName: firstChild.attrs.device,
34
+ newDevicePlatform: firstChild.attrs.new_device_platform,
35
+ newDeviceAppVersion: firstChild.attrs.new_device_app_version
36
+ };
37
+ }
38
+ return null;
39
+ }
@@ -10,6 +10,7 @@ const HANDLED_SYNC_TYPES = new Set([
10
10
  proto.Message.HistorySyncType.FULL,
11
11
  proto.Message.HistorySyncType.PUSH_NAME
12
12
  ]);
13
+ const HISTORY_SYNC_MAX_PENDING_WRITES = 1024;
13
14
  export async function processHistorySyncNotification(deps, notification) {
14
15
  const syncType = notification.syncType;
15
16
  if (syncType === null || syncType === undefined || !HANDLED_SYNC_TYPES.has(syncType)) {
@@ -27,19 +28,20 @@ export async function processHistorySyncNotification(deps, notification) {
27
28
  pushnames: historySync.pushnames.length
28
29
  });
29
30
  const nowMs = Date.now();
30
- const contacts = [];
31
+ const pendingWrites = [];
31
32
  for (const pn of historySync.pushnames) {
32
33
  if (!pn.id) {
33
34
  continue;
34
35
  }
35
- contacts.push({
36
+ pendingWrites[pendingWrites.length] = deps.writeBehind.persistContactAsync({
36
37
  jid: pn.id,
37
38
  pushName: pn.pushname ?? undefined,
38
39
  lastUpdatedMs: nowMs
39
40
  });
41
+ if (pendingWrites.length >= HISTORY_SYNC_MAX_PENDING_WRITES) {
42
+ await flushPendingWrites(pendingWrites);
43
+ }
40
44
  }
41
- const threads = [];
42
- const messages = [];
43
45
  let messagesCount = 0;
44
46
  for (const conversation of historySync.conversations) {
45
47
  const threadJid = conversation.id;
@@ -47,7 +49,7 @@ export async function processHistorySyncNotification(deps, notification) {
47
49
  deps.logger.debug('skipping history sync conversation without thread jid');
48
50
  continue;
49
51
  }
50
- threads.push({
52
+ pendingWrites[pendingWrites.length] = deps.writeBehind.persistThreadAsync({
51
53
  jid: threadJid,
52
54
  name: conversation.name ?? undefined,
53
55
  unreadCount: conversation.unreadCount ?? undefined,
@@ -57,13 +59,16 @@ export async function processHistorySyncNotification(deps, notification) {
57
59
  markedAsUnread: conversation.markedAsUnread ?? undefined,
58
60
  ephemeralExpiration: conversation.ephemeralExpiration ?? undefined
59
61
  });
62
+ if (pendingWrites.length >= HISTORY_SYNC_MAX_PENDING_WRITES) {
63
+ await flushPendingWrites(pendingWrites);
64
+ }
60
65
  for (const histMsg of conversation.messages ?? []) {
61
66
  const webMsg = histMsg.message;
62
67
  if (!webMsg?.key?.id) {
63
68
  continue;
64
69
  }
65
70
  const timestampMs = longToNumber(webMsg.messageTimestamp) * 1000;
66
- messages.push({
71
+ pendingWrites[pendingWrites.length] = deps.writeBehind.persistMessageAsync({
67
72
  id: webMsg.key.id,
68
73
  threadJid,
69
74
  senderJid: webMsg.key.participant ?? undefined,
@@ -73,12 +78,35 @@ export async function processHistorySyncNotification(deps, notification) {
73
78
  ? proto.Message.encode(webMsg.message).finish()
74
79
  : undefined
75
80
  });
81
+ if (pendingWrites.length >= HISTORY_SYNC_MAX_PENDING_WRITES) {
82
+ await flushPendingWrites(pendingWrites);
83
+ }
76
84
  messagesCount += 1;
77
85
  }
78
86
  }
79
- await deps.contactStore.upsertBatch(contacts);
80
- await deps.threadStore.upsertBatch(threads);
81
- await deps.messageStore.upsertBatch(messages);
87
+ if (deps.onPrivacyTokens) {
88
+ const tokenConversations = [];
89
+ for (const conversation of historySync.conversations) {
90
+ if (!conversation.id)
91
+ continue;
92
+ if (conversation.tcToken ||
93
+ conversation.tcTokenTimestamp ||
94
+ conversation.tcTokenSenderTimestamp) {
95
+ tokenConversations[tokenConversations.length] = {
96
+ jid: conversation.id,
97
+ tcToken: conversation.tcToken,
98
+ tcTokenTimestamp: longToNumber(conversation.tcTokenTimestamp) || undefined,
99
+ tcTokenSenderTimestamp: longToNumber(conversation.tcTokenSenderTimestamp) || undefined
100
+ };
101
+ }
102
+ }
103
+ if (tokenConversations.length > 0) {
104
+ pendingWrites[pendingWrites.length] = deps.onPrivacyTokens(tokenConversations);
105
+ }
106
+ }
107
+ if (deps.onNctSalt && historySync.nctSalt) {
108
+ pendingWrites[pendingWrites.length] = deps.onNctSalt(historySync.nctSalt);
109
+ }
82
110
  const event = {
83
111
  syncType,
84
112
  messagesCount,
@@ -87,8 +115,21 @@ export async function processHistorySyncNotification(deps, notification) {
87
115
  chunkOrder: historySync.chunkOrder ?? undefined,
88
116
  progress: historySync.progress ?? undefined
89
117
  };
118
+ await flushPendingWrites(pendingWrites);
90
119
  deps.emitEvent('history_sync_chunk', event);
91
120
  }
121
+ async function flushPendingWrites(pendingWrites) {
122
+ if (pendingWrites.length === 0) {
123
+ return;
124
+ }
125
+ const pendingCount = pendingWrites.length;
126
+ const batch = new Array(pendingCount);
127
+ for (let index = 0; index < pendingCount; index += 1) {
128
+ batch[index] = pendingWrites[index];
129
+ }
130
+ pendingWrites.length = 0;
131
+ await Promise.all(batch);
132
+ }
92
133
  async function downloadHistorySyncBlob(deps, notification) {
93
134
  if (notification.initialHistBootstrapInlinePayload) {
94
135
  return decodeProtoBytes(notification.initialHistBootstrapInlinePayload, 'initialHistBootstrapInlinePayload');
@@ -1,9 +1,17 @@
1
1
  import { parseGroupNotificationEvents } from './events/group.js';
2
- import { WA_NODE_TAGS, WA_NOTIFICATION_TYPES } from '../protocol/constants.js';
3
- import { buildInboundReceiptAckNode, buildInboundRetryReceiptAckNode } from '../transport/node/builders/message.js';
4
- import { buildNotificationAckNode } from '../transport/node/builders/pairing.js';
2
+ import { parseRegistrationNotification } from './events/registration.js';
3
+ import { WA_DISCONNECT_REASONS, WA_NODE_TAGS, WA_NOTIFICATION_TYPES } from '../protocol/constants.js';
4
+ import { buildAckNode } from '../transport/node/builders/global.js';
5
5
  import { getFirstNodeChild, getNodeChildrenNonEmptyAttrValuesByTag } from '../transport/node/helpers.js';
6
6
  import { parseOptionalInt, toError } from '../util/primitives.js';
7
+ const FAILURE_REASON_TO_DISCONNECT = {
8
+ 401: WA_DISCONNECT_REASONS.FAILURE_NOT_AUTHORIZED,
9
+ 403: WA_DISCONNECT_REASONS.FAILURE_LOCKED,
10
+ 406: WA_DISCONNECT_REASONS.FAILURE_BANNED,
11
+ 405: WA_DISCONNECT_REASONS.FAILURE_CLIENT_TOO_OLD,
12
+ 409: WA_DISCONNECT_REASONS.FAILURE_BAD_USER_AGENT,
13
+ 503: WA_DISCONNECT_REASONS.FAILURE_SERVICE_UNAVAILABLE
14
+ };
7
15
  const LOGOUT_FAILURE_REASONS = new Set([401, 403, 406]);
8
16
  const DISCONNECT_FAILURE_REASONS = new Set([405, 409, 503]);
9
17
  const CORE_NOTIFICATION_TYPES = new Set([
@@ -30,6 +38,8 @@ const OUT_OF_SCOPE_NOTIFICATION_TYPES = new Set([
30
38
  'waffle',
31
39
  'hosted'
32
40
  ]);
41
+ const NOTIFICATION_TYPES_WITH_PARTICIPANT_ACK = new Set(['mediaretry', 'psa']);
42
+ const NOTIFICATION_TYPES_WITHOUT_TYPE_ACK = new Set(['encrypt', 'devices']);
33
43
  export function createIncomingBaseEvent(node) {
34
44
  return {
35
45
  rawNode: node,
@@ -63,7 +73,9 @@ function classifyNotificationType(notificationType) {
63
73
  }
64
74
  async function applyFailureAction(options, reason, clearStoredCredentials) {
65
75
  try {
66
- await options.disconnect();
76
+ options.stopComms();
77
+ const disconnectReason = FAILURE_REASON_TO_DISCONNECT[reason] ?? WA_DISCONNECT_REASONS.STREAM_ERROR_OTHER;
78
+ await options.disconnect(disconnectReason, clearStoredCredentials, reason);
67
79
  if (clearStoredCredentials) {
68
80
  await options.clearStoredCredentials();
69
81
  }
@@ -108,11 +120,19 @@ export function createIncomingReceiptHandler(options) {
108
120
  await options.handleIncomingRetryReceipt(node);
109
121
  }
110
122
  else {
111
- await sendSafeAck(options.logger, options.sendNode, buildInboundRetryReceiptAckNode(node));
123
+ await sendSafeAck(options.logger, options.sendNode, buildAckNode({
124
+ kind: 'receipt',
125
+ node,
126
+ retryType: true
127
+ }));
112
128
  }
113
129
  return true;
114
130
  }
115
- await sendSafeAck(options.logger, options.sendNode, buildInboundReceiptAckNode(node));
131
+ await sendSafeAck(options.logger, options.sendNode, buildAckNode({
132
+ kind: 'receipt',
133
+ node,
134
+ includeParticipant: receiptType !== 'server-error'
135
+ }));
116
136
  return true;
117
137
  };
118
138
  }
@@ -138,6 +158,8 @@ export function createIncomingFailureHandler(options) {
138
158
  export function createIncomingNotificationHandler(options) {
139
159
  return async (node) => {
140
160
  const notificationType = node.attrs.type ?? '';
161
+ const includeParticipantInAck = NOTIFICATION_TYPES_WITH_PARTICIPANT_ACK.has(notificationType);
162
+ const includeTypeInAck = !NOTIFICATION_TYPES_WITHOUT_TYPE_ACK.has(notificationType);
141
163
  const classification = classifyNotificationType(notificationType);
142
164
  const firstChildTag = getFirstNodeChild(node)?.tag;
143
165
  const baseEvent = createIncomingBaseEvent(node);
@@ -172,7 +194,12 @@ export function createIncomingNotificationHandler(options) {
172
194
  reason: `notification.${notificationType || 'unknown'}.not_supported`
173
195
  });
174
196
  }
175
- await sendSafeAck(options.logger, options.sendNode, buildNotificationAckNode(node));
197
+ await sendSafeAck(options.logger, options.sendNode, buildAckNode({
198
+ kind: 'notification',
199
+ node,
200
+ includeParticipant: includeParticipantInAck,
201
+ includeType: includeTypeInAck
202
+ }));
176
203
  if (notificationType === 'server_sync' && serverSyncCollections.length > 0) {
177
204
  const collectionsCsv = serverSyncCollections.join(',');
178
205
  if (!options.syncAppState) {
@@ -191,6 +218,41 @@ export function createIncomingNotificationHandler(options) {
191
218
  return true;
192
219
  };
193
220
  }
221
+ export function createIncomingRegistrationNotificationHandler(options) {
222
+ return async (node) => {
223
+ if (node.attrs.type !== WA_NOTIFICATION_TYPES.REGISTRATION) {
224
+ return false;
225
+ }
226
+ const parsed = parseRegistrationNotification(node);
227
+ if (!parsed) {
228
+ return false;
229
+ }
230
+ const baseEvent = createIncomingBaseEvent(node);
231
+ if (parsed.kind === 'registration_code') {
232
+ options.emitRegistrationCode({
233
+ ...baseEvent,
234
+ code: parsed.code,
235
+ expiryTimestampMs: parsed.expiryTimestampMs,
236
+ fromDeviceId: parsed.fromDeviceId
237
+ });
238
+ }
239
+ else {
240
+ options.emitAccountTakeoverNotice({
241
+ ...baseEvent,
242
+ serverToken: parsed.serverToken,
243
+ attemptTimestampMs: parsed.attemptTimestampMs,
244
+ newDeviceName: parsed.newDeviceName,
245
+ newDevicePlatform: parsed.newDevicePlatform,
246
+ newDeviceAppVersion: parsed.newDeviceAppVersion
247
+ });
248
+ }
249
+ await sendSafeAck(options.logger, options.sendNode, buildAckNode({
250
+ kind: 'notification',
251
+ node
252
+ }));
253
+ return true;
254
+ };
255
+ }
194
256
  export function createIncomingGroupNotificationHandler(options) {
195
257
  return async (node) => {
196
258
  if (node.attrs.type !== WA_NOTIFICATION_TYPES.GROUP) {
@@ -210,7 +272,11 @@ export function createIncomingGroupNotificationHandler(options) {
210
272
  reason: `notification.${WA_NOTIFICATION_TYPES.GROUP}.empty`
211
273
  });
212
274
  }
213
- await sendSafeAck(options.logger, options.sendNode, buildNotificationAckNode(node));
275
+ await sendSafeAck(options.logger, options.sendNode, buildAckNode({
276
+ kind: 'notification',
277
+ node,
278
+ includeParticipant: true
279
+ }));
214
280
  return true;
215
281
  };
216
282
  }