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