zapo-js 0.1.2 → 0.2.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 (468) hide show
  1. package/README.md +12 -4
  2. package/dist/appstate/WaAppStateCrypto.js +1 -1
  3. package/dist/appstate/WaAppStateSyncClient.js +138 -93
  4. package/dist/appstate/{store/sqlite.js → encoding.js} +13 -8
  5. package/dist/appstate/index.js +8 -6
  6. package/dist/appstate/utils.js +0 -5
  7. package/dist/auth/WaAuthClient.js +36 -47
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +7 -7
  9. package/dist/auth/index.js +1 -6
  10. package/dist/auth/pairing/WaPairingCodeCrypto.js +6 -4
  11. package/dist/auth/pairing/WaPairingFlow.js +13 -3
  12. package/dist/client/WaClient.js +225 -101
  13. package/dist/client/WaClientFactory.js +294 -44
  14. package/dist/client/connection/WaConnectionManager.js +19 -10
  15. package/dist/client/coordinators/WaBusinessCoordinator.js +241 -0
  16. package/dist/client/coordinators/WaGroupCoordinator.js +11 -7
  17. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  18. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +292 -99
  19. package/dist/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  20. package/dist/client/coordinators/WaPrivacyCoordinator.js +134 -0
  21. package/dist/client/coordinators/WaProfileCoordinator.js +212 -0
  22. package/dist/client/coordinators/WaRetryCoordinator.js +179 -27
  23. package/dist/client/coordinators/WaStreamControlCoordinator.js +18 -11
  24. package/dist/client/coordinators/WaTrustedContactTokenCoordinator.js +166 -0
  25. package/dist/client/dirty.js +40 -20
  26. package/dist/client/events/devices.js +72 -0
  27. package/dist/client/events/group.js +3 -11
  28. package/dist/client/events/identity.js +22 -0
  29. package/dist/client/events/privacy-token.js +39 -0
  30. package/dist/client/history-sync.js +50 -9
  31. package/dist/client/incoming.js +37 -7
  32. package/dist/client/mailbox.js +24 -23
  33. package/dist/client/messages.js +107 -31
  34. package/dist/client/messaging/fanout.js +21 -11
  35. package/dist/client/messaging/participants.js +6 -4
  36. package/dist/client/persistence/WriteBehindPersistence.js +129 -0
  37. package/dist/client/tokens/cs-token.js +50 -0
  38. package/dist/client/tokens/tc-token.js +25 -0
  39. package/dist/crypto/core/index.js +2 -2
  40. package/dist/crypto/core/keys.js +4 -4
  41. package/dist/crypto/core/nonce.js +2 -0
  42. package/dist/crypto/core/primitives.js +0 -8
  43. package/dist/crypto/core/random.js +22 -0
  44. package/dist/crypto/curves/X25519.js +25 -6
  45. package/dist/crypto/index.js +3 -0
  46. package/dist/crypto/math/constants.js +13 -36
  47. package/dist/crypto/math/edwards.js +171 -44
  48. package/dist/crypto/math/fe.js +706 -0
  49. package/dist/crypto/math/mod.js +10 -3
  50. package/dist/esm/appstate/WaAppStateCrypto.js +1 -1
  51. package/dist/esm/appstate/WaAppStateSyncClient.js +138 -93
  52. package/dist/esm/appstate/{store/sqlite.js → encoding.js} +13 -8
  53. package/dist/esm/appstate/index.js +2 -2
  54. package/dist/esm/appstate/utils.js +2 -5
  55. package/dist/esm/auth/WaAuthClient.js +36 -47
  56. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +7 -7
  57. package/dist/esm/auth/index.js +0 -2
  58. package/dist/esm/auth/pairing/WaPairingCodeCrypto.js +6 -4
  59. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -4
  60. package/dist/esm/client/WaClient.js +225 -101
  61. package/dist/esm/client/WaClientFactory.js +295 -45
  62. package/dist/esm/client/connection/WaConnectionManager.js +19 -10
  63. package/dist/esm/client/coordinators/WaBusinessCoordinator.js +238 -0
  64. package/dist/esm/client/coordinators/WaGroupCoordinator.js +11 -7
  65. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +1 -0
  66. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +295 -102
  67. package/dist/esm/client/coordinators/WaPassiveTasksCoordinator.js +74 -31
  68. package/dist/esm/client/coordinators/WaPrivacyCoordinator.js +131 -0
  69. package/dist/esm/client/coordinators/WaProfileCoordinator.js +209 -0
  70. package/dist/esm/client/coordinators/WaRetryCoordinator.js +181 -29
  71. package/dist/esm/client/coordinators/WaStreamControlCoordinator.js +19 -12
  72. package/dist/esm/client/coordinators/WaTrustedContactTokenCoordinator.js +162 -0
  73. package/dist/esm/client/dirty.js +40 -20
  74. package/dist/esm/client/events/devices.js +68 -0
  75. package/dist/esm/client/events/group.js +3 -11
  76. package/dist/esm/client/events/identity.js +19 -0
  77. package/dist/esm/client/events/privacy-token.js +36 -0
  78. package/dist/esm/client/history-sync.js +50 -9
  79. package/dist/esm/client/incoming.js +38 -8
  80. package/dist/esm/client/mailbox.js +24 -23
  81. package/dist/esm/client/messages.js +108 -32
  82. package/dist/esm/client/messaging/fanout.js +22 -12
  83. package/dist/esm/client/messaging/participants.js +6 -4
  84. package/dist/esm/client/persistence/WriteBehindPersistence.js +125 -0
  85. package/dist/esm/client/tokens/cs-token.js +46 -0
  86. package/dist/esm/client/tokens/tc-token.js +18 -0
  87. package/dist/esm/crypto/core/index.js +2 -2
  88. package/dist/esm/crypto/core/keys.js +1 -1
  89. package/dist/esm/crypto/core/nonce.js +2 -0
  90. package/dist/esm/crypto/core/primitives.js +0 -7
  91. package/dist/esm/crypto/core/random.js +22 -1
  92. package/dist/esm/crypto/curves/X25519.js +25 -6
  93. package/dist/esm/crypto/index.js +1 -0
  94. package/dist/esm/crypto/math/constants.js +12 -35
  95. package/dist/esm/crypto/math/edwards.js +174 -47
  96. package/dist/esm/crypto/math/fe.js +691 -0
  97. package/dist/esm/crypto/math/mod.js +10 -1
  98. package/dist/esm/index.js +1 -1
  99. package/dist/esm/infra/perf/BackgroundQueue.js +478 -0
  100. package/dist/esm/infra/perf/BoundedTaskQueue.js +3 -1
  101. package/dist/esm/infra/perf/PromiseDedup.js +20 -0
  102. package/dist/esm/infra/perf/SharedExclusiveGate.js +109 -0
  103. package/dist/esm/infra/perf/StoreLock.js +77 -0
  104. package/dist/esm/media/WaMediaCrypto.js +95 -13
  105. package/dist/esm/media/WaMediaTransferClient.js +39 -47
  106. package/dist/esm/media/constants.js +2 -1
  107. package/dist/esm/message/WaMessageClient.js +26 -19
  108. package/dist/esm/message/content.js +195 -9
  109. package/dist/esm/message/icdc.js +76 -0
  110. package/dist/esm/message/incoming.js +24 -12
  111. package/dist/esm/message/phash.js +3 -1
  112. package/dist/esm/message/reporting-token.js +14 -27
  113. package/dist/esm/protocol/appstate.js +9 -40
  114. package/dist/esm/protocol/browser.js +10 -18
  115. package/dist/esm/protocol/constants.js +5 -3
  116. package/dist/esm/protocol/defaults.js +6 -0
  117. package/dist/esm/protocol/index.js +1 -2
  118. package/dist/esm/protocol/jid.js +105 -36
  119. package/dist/esm/protocol/message.js +61 -1
  120. package/dist/esm/protocol/nodes.js +2 -0
  121. package/dist/esm/protocol/notification.js +3 -1
  122. package/dist/esm/protocol/privacy-token.js +17 -0
  123. package/dist/esm/protocol/privacy.js +55 -0
  124. package/dist/esm/protocol/stream.js +26 -1
  125. package/dist/esm/retry/codec.js +216 -0
  126. package/dist/esm/retry/constants.js +1 -1
  127. package/dist/esm/retry/index.js +2 -2
  128. package/dist/esm/retry/parse.js +50 -30
  129. package/dist/esm/retry/replay.js +11 -7
  130. package/dist/esm/retry/tracker.js +50 -12
  131. package/dist/esm/signal/api/SignalDeviceSyncApi.js +49 -32
  132. package/dist/esm/signal/api/SignalDigestSyncApi.js +13 -9
  133. package/dist/esm/signal/api/SignalIdentitySyncApi.js +26 -11
  134. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +18 -7
  135. package/dist/esm/signal/api/SignalRotateKeyApi.js +4 -2
  136. package/dist/esm/signal/api/SignalSessionSyncApi.js +16 -7
  137. package/dist/esm/signal/api/result-map.js +10 -0
  138. package/dist/esm/signal/constants.js +0 -4
  139. package/dist/esm/signal/crypto/WaAdvSignature.js +12 -6
  140. package/dist/esm/signal/{store/sqlite.js → encoding.js} +78 -24
  141. package/dist/esm/signal/group/SenderKeyCodec.js +3 -2
  142. package/dist/esm/signal/group/SenderKeyManager.js +125 -106
  143. package/dist/esm/signal/index.js +1 -0
  144. package/dist/esm/signal/registration/keygen.js +6 -2
  145. package/dist/esm/signal/registration/utils.js +1 -0
  146. package/dist/esm/signal/session/SignalProtocol.js +150 -74
  147. package/dist/esm/signal/session/resolver.js +137 -102
  148. package/dist/esm/store/contracts/privacy-token.store.js +1 -0
  149. package/dist/esm/store/createStore.js +101 -187
  150. package/dist/esm/store/index.js +1 -10
  151. package/dist/esm/store/locks/appstate.lock.js +26 -0
  152. package/dist/esm/store/locks/auth.lock.js +15 -0
  153. package/dist/esm/store/locks/contact.lock.js +20 -0
  154. package/dist/esm/store/locks/device-list.lock.js +20 -0
  155. package/dist/esm/store/locks/message.lock.js +21 -0
  156. package/dist/esm/store/locks/participants.lock.js +20 -0
  157. package/dist/esm/store/locks/privacy-token.lock.js +18 -0
  158. package/dist/esm/store/locks/retry.lock.js +29 -0
  159. package/dist/esm/store/locks/sender-key.lock.js +52 -0
  160. package/dist/esm/store/locks/signal.lock.js +63 -0
  161. package/dist/esm/store/locks/thread.lock.js +21 -0
  162. package/dist/esm/store/noop.store.js +1 -1
  163. package/dist/esm/store/providers/memory/appstate.store.js +22 -24
  164. package/dist/esm/store/providers/memory/device-list.store.js +10 -5
  165. package/dist/esm/store/providers/memory/privacy-token.store.js +43 -0
  166. package/dist/esm/store/providers/memory/retry.store.js +77 -2
  167. package/dist/esm/store/providers/memory/sender-key.store.js +6 -1
  168. package/dist/esm/store/providers/memory/signal.store.js +36 -19
  169. package/dist/esm/transport/WaComms.js +3 -1
  170. package/dist/esm/transport/WaWebSocket.js +0 -6
  171. package/dist/esm/transport/binary/constants.js +0 -30
  172. package/dist/esm/transport/binary/decoder.js +4 -4
  173. package/dist/esm/transport/binary/encoder.js +8 -15
  174. package/dist/esm/transport/binary/index.js +0 -1
  175. package/dist/esm/transport/node/WaNodeOrchestrator.js +25 -19
  176. package/dist/esm/transport/node/builders/business.js +129 -0
  177. package/dist/esm/transport/node/builders/global.js +370 -0
  178. package/dist/esm/transport/node/builders/index.js +5 -2
  179. package/dist/esm/transport/node/builders/message.js +63 -239
  180. package/dist/esm/transport/node/builders/pairing.js +0 -24
  181. package/dist/esm/transport/node/builders/privacy-token.js +41 -0
  182. package/dist/esm/transport/node/builders/privacy.js +48 -0
  183. package/dist/esm/transport/node/builders/profile.js +70 -0
  184. package/dist/esm/transport/node/builders/retry.js +10 -22
  185. package/dist/esm/transport/node/builders/usync.js +6 -2
  186. package/dist/esm/transport/node/helpers.js +19 -1
  187. package/dist/esm/transport/node/usync.js +3 -33
  188. package/dist/esm/transport/node/xml.js +35 -14
  189. package/dist/esm/transport/noise/WaClientPayload.js +10 -10
  190. package/dist/esm/transport/noise/WaNoiseCert.js +3 -3
  191. package/dist/esm/transport/noise/WaNoiseSession.js +64 -23
  192. package/dist/esm/transport/noise/WaNoiseSocket.js +8 -4
  193. package/dist/esm/transport/stream/parse.js +8 -4
  194. package/dist/esm/util/bytes.js +22 -18
  195. package/dist/esm/util/index.js +5 -0
  196. package/dist/esm/util/primitives.js +3 -2
  197. package/dist/index.js +7 -1
  198. package/dist/infra/perf/BackgroundQueue.js +482 -0
  199. package/dist/infra/perf/BoundedTaskQueue.js +3 -1
  200. package/dist/infra/perf/PromiseDedup.js +24 -0
  201. package/dist/infra/perf/SharedExclusiveGate.js +113 -0
  202. package/dist/infra/perf/StoreLock.js +81 -0
  203. package/dist/media/WaMediaCrypto.js +94 -12
  204. package/dist/media/WaMediaTransferClient.js +39 -47
  205. package/dist/media/constants.js +2 -1
  206. package/dist/message/WaMessageClient.js +26 -19
  207. package/dist/message/content.js +198 -9
  208. package/dist/message/icdc.js +81 -0
  209. package/dist/message/incoming.js +24 -12
  210. package/dist/message/phash.js +3 -1
  211. package/dist/message/reporting-token.js +14 -28
  212. package/dist/protocol/appstate.js +10 -41
  213. package/dist/protocol/browser.js +10 -18
  214. package/dist/protocol/constants.js +21 -2
  215. package/dist/protocol/defaults.js +6 -0
  216. package/dist/protocol/index.js +8 -5
  217. package/dist/protocol/jid.js +111 -36
  218. package/dist/protocol/message.js +62 -2
  219. package/dist/protocol/nodes.js +2 -0
  220. package/dist/protocol/notification.js +3 -1
  221. package/dist/protocol/privacy-token.js +20 -0
  222. package/dist/protocol/privacy.js +58 -0
  223. package/dist/protocol/stream.js +27 -2
  224. package/dist/retry/codec.js +220 -0
  225. package/dist/retry/constants.js +1 -1
  226. package/dist/retry/index.js +5 -5
  227. package/dist/retry/parse.js +51 -30
  228. package/dist/retry/replay.js +10 -6
  229. package/dist/retry/tracker.js +50 -12
  230. package/dist/signal/api/SignalDeviceSyncApi.js +48 -31
  231. package/dist/signal/api/SignalDigestSyncApi.js +13 -9
  232. package/dist/signal/api/SignalIdentitySyncApi.js +25 -10
  233. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +17 -6
  234. package/dist/signal/api/SignalRotateKeyApi.js +4 -2
  235. package/dist/signal/api/SignalSessionSyncApi.js +16 -7
  236. package/dist/signal/api/result-map.js +13 -0
  237. package/dist/signal/constants.js +1 -5
  238. package/dist/signal/crypto/WaAdvSignature.js +11 -5
  239. package/dist/signal/{store/sqlite.js → encoding.js} +79 -25
  240. package/dist/signal/group/SenderKeyCodec.js +4 -3
  241. package/dist/signal/group/SenderKeyManager.js +125 -106
  242. package/dist/signal/index.js +13 -1
  243. package/dist/signal/registration/keygen.js +6 -2
  244. package/dist/signal/registration/utils.js +1 -0
  245. package/dist/signal/session/SignalProtocol.js +150 -74
  246. package/dist/signal/session/resolver.js +135 -100
  247. package/dist/store/contracts/privacy-token.store.js +2 -0
  248. package/dist/store/createStore.js +101 -187
  249. package/dist/store/index.js +15 -33
  250. package/dist/store/locks/appstate.lock.js +29 -0
  251. package/dist/store/locks/auth.lock.js +18 -0
  252. package/dist/store/locks/contact.lock.js +23 -0
  253. package/dist/store/locks/device-list.lock.js +23 -0
  254. package/dist/store/locks/message.lock.js +24 -0
  255. package/dist/store/locks/participants.lock.js +23 -0
  256. package/dist/store/locks/privacy-token.lock.js +21 -0
  257. package/dist/store/locks/retry.lock.js +32 -0
  258. package/dist/store/locks/sender-key.lock.js +55 -0
  259. package/dist/store/locks/signal.lock.js +66 -0
  260. package/dist/store/locks/thread.lock.js +24 -0
  261. package/dist/store/noop.store.js +1 -1
  262. package/dist/store/providers/memory/appstate.store.js +22 -24
  263. package/dist/store/providers/memory/device-list.store.js +10 -5
  264. package/dist/store/providers/memory/privacy-token.store.js +47 -0
  265. package/dist/store/providers/memory/retry.store.js +77 -2
  266. package/dist/store/providers/memory/sender-key.store.js +6 -1
  267. package/dist/store/providers/memory/signal.store.js +36 -19
  268. package/dist/transport/WaComms.js +3 -1
  269. package/dist/transport/WaWebSocket.js +0 -6
  270. package/dist/transport/binary/constants.js +1 -31
  271. package/dist/transport/binary/decoder.js +4 -4
  272. package/dist/transport/binary/encoder.js +8 -15
  273. package/dist/transport/binary/index.js +0 -4
  274. package/dist/transport/node/WaNodeOrchestrator.js +24 -18
  275. package/dist/transport/node/builders/business.js +137 -0
  276. package/dist/transport/node/builders/global.js +375 -0
  277. package/dist/transport/node/builders/index.js +18 -9
  278. package/dist/transport/node/builders/message.js +64 -245
  279. package/dist/transport/node/builders/pairing.js +0 -26
  280. package/dist/transport/node/builders/privacy-token.js +46 -0
  281. package/dist/transport/node/builders/privacy.js +55 -0
  282. package/dist/transport/node/builders/profile.js +78 -0
  283. package/dist/transport/node/builders/retry.js +9 -21
  284. package/dist/transport/node/builders/usync.js +6 -2
  285. package/dist/transport/node/helpers.js +20 -1
  286. package/dist/transport/node/usync.js +2 -32
  287. package/dist/transport/node/xml.js +35 -14
  288. package/dist/transport/noise/WaClientPayload.js +13 -13
  289. package/dist/transport/noise/WaNoiseCert.js +2 -2
  290. package/dist/transport/noise/WaNoiseSession.js +64 -23
  291. package/dist/transport/noise/WaNoiseSocket.js +8 -4
  292. package/dist/transport/stream/parse.js +7 -3
  293. package/dist/types/appstate/encoding.d.ts +7 -0
  294. package/dist/types/appstate/index.d.ts +3 -3
  295. package/dist/types/appstate/utils.d.ts +0 -2
  296. package/dist/types/auth/flow/WaAuthCredentialsFlow.d.ts +1 -1
  297. package/dist/types/auth/index.d.ts +0 -2
  298. package/dist/types/auth/types.d.ts +1 -0
  299. package/dist/types/client/WaClient.d.ts +27 -12
  300. package/dist/types/client/WaClientFactory.d.ts +12 -4
  301. package/dist/types/client/connection/WaConnectionManager.d.ts +2 -0
  302. package/dist/types/client/coordinators/WaBusinessCoordinator.d.ts +57 -0
  303. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +3 -1
  304. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +14 -0
  305. package/dist/types/client/coordinators/WaPassiveTasksCoordinator.d.ts +4 -0
  306. package/dist/types/client/coordinators/WaPrivacyCoordinator.d.ts +26 -0
  307. package/dist/types/client/coordinators/WaProfileCoordinator.d.ts +36 -0
  308. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +6 -0
  309. package/dist/types/client/coordinators/WaStreamControlCoordinator.d.ts +3 -2
  310. package/dist/types/client/coordinators/WaTrustedContactTokenCoordinator.d.ts +45 -0
  311. package/dist/types/client/events/devices.d.ts +20 -0
  312. package/dist/types/client/events/identity.d.ts +9 -0
  313. package/dist/types/client/events/privacy-token.d.ts +7 -0
  314. package/dist/types/client/history-sync.d.ts +9 -6
  315. package/dist/types/client/incoming.d.ts +3 -1
  316. package/dist/types/client/index.d.ts +1 -1
  317. package/dist/types/client/mailbox.d.ts +3 -5
  318. package/dist/types/client/messages.d.ts +1 -2
  319. package/dist/types/client/persistence/WriteBehindPersistence.d.ts +34 -0
  320. package/dist/types/client/tokens/cs-token.d.ts +10 -0
  321. package/dist/types/client/tokens/tc-token.d.ts +5 -0
  322. package/dist/types/client/types.d.ts +51 -3
  323. package/dist/types/crypto/core/index.d.ts +2 -2
  324. package/dist/types/crypto/core/nonce.d.ts +2 -0
  325. package/dist/types/crypto/core/primitives.d.ts +0 -1
  326. package/dist/types/crypto/core/random.d.ts +1 -0
  327. package/dist/types/crypto/index.d.ts +1 -0
  328. package/dist/types/crypto/math/constants.d.ts +4 -2
  329. package/dist/types/crypto/math/fe.d.ts +30 -0
  330. package/dist/types/crypto/math/mod.d.ts +0 -2
  331. package/dist/types/crypto/math/types.d.ts +11 -4
  332. package/dist/types/index.d.ts +5 -3
  333. package/dist/types/infra/perf/BackgroundQueue.d.ts +58 -0
  334. package/dist/types/infra/perf/PromiseDedup.d.ts +4 -0
  335. package/dist/types/infra/perf/SharedExclusiveGate.d.ts +17 -0
  336. package/dist/types/infra/perf/StoreLock.d.ts +10 -0
  337. package/dist/types/media/WaMediaCrypto.d.ts +3 -2
  338. package/dist/types/media/WaMediaTransferClient.d.ts +3 -12
  339. package/dist/types/media/constants.d.ts +1 -1
  340. package/dist/types/media/index.d.ts +1 -1
  341. package/dist/types/media/types.d.ts +10 -2
  342. package/dist/types/message/content.d.ts +8 -0
  343. package/dist/types/message/icdc.d.ts +13 -0
  344. package/dist/types/message/reporting-token.d.ts +0 -1
  345. package/dist/types/message/types.d.ts +45 -6
  346. package/dist/types/protocol/appstate.d.ts +0 -11
  347. package/dist/types/protocol/constants.d.ts +7 -3
  348. package/dist/types/protocol/defaults.d.ts +6 -0
  349. package/dist/types/protocol/index.d.ts +1 -2
  350. package/dist/types/protocol/jid.d.ts +19 -2
  351. package/dist/types/protocol/message.d.ts +60 -0
  352. package/dist/types/protocol/nodes.d.ts +2 -0
  353. package/dist/types/protocol/notification.d.ts +2 -0
  354. package/dist/types/protocol/privacy-token.d.ts +17 -0
  355. package/dist/types/protocol/privacy.d.ts +75 -0
  356. package/dist/types/protocol/stream.d.ts +30 -0
  357. package/dist/types/retry/codec.d.ts +3 -0
  358. package/dist/types/retry/index.d.ts +3 -3
  359. package/dist/types/retry/parse.d.ts +5 -2
  360. package/dist/types/retry/tracker.d.ts +1 -0
  361. package/dist/types/retry/types.d.ts +6 -1
  362. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +2 -1
  363. package/dist/types/signal/api/SignalDigestSyncApi.d.ts +6 -0
  364. package/dist/types/signal/api/SignalIdentitySyncApi.d.ts +2 -0
  365. package/dist/types/signal/api/SignalRotateKeyApi.d.ts +4 -5
  366. package/dist/types/signal/api/SignalSessionSyncApi.d.ts +8 -6
  367. package/dist/types/signal/api/result-map.d.ts +1 -0
  368. package/dist/types/signal/constants.d.ts +0 -3
  369. package/dist/types/signal/{store/sqlite.d.ts → encoding.d.ts} +3 -3
  370. package/dist/types/signal/group/SenderKeyManager.d.ts +10 -5
  371. package/dist/types/signal/index.d.ts +2 -0
  372. package/dist/types/signal/session/SignalProtocol.d.ts +10 -4
  373. package/dist/types/signal/session/resolver.d.ts +7 -2
  374. package/dist/types/store/contracts/appstate.store.d.ts +1 -1
  375. package/dist/types/store/contracts/privacy-token.store.d.ts +16 -0
  376. package/dist/types/store/contracts/retry.store.d.ts +7 -0
  377. package/dist/types/store/contracts/signal.store.d.ts +7 -0
  378. package/dist/types/store/createStore.d.ts +1 -1
  379. package/dist/types/store/index.d.ts +5 -13
  380. package/dist/types/store/locks/appstate.lock.d.ts +3 -0
  381. package/dist/types/store/locks/auth.lock.d.ts +3 -0
  382. package/dist/types/store/locks/contact.lock.d.ts +3 -0
  383. package/dist/types/store/locks/device-list.lock.d.ts +2 -0
  384. package/dist/types/store/locks/message.lock.d.ts +3 -0
  385. package/dist/types/store/locks/participants.lock.d.ts +2 -0
  386. package/dist/types/store/locks/privacy-token.lock.d.ts +2 -0
  387. package/dist/types/store/locks/retry.lock.d.ts +2 -0
  388. package/dist/types/store/locks/sender-key.lock.d.ts +3 -0
  389. package/dist/types/store/locks/signal.lock.d.ts +3 -0
  390. package/dist/types/store/locks/thread.lock.d.ts +3 -0
  391. package/dist/types/store/providers/memory/appstate.store.d.ts +1 -1
  392. package/dist/types/store/providers/memory/privacy-token.store.d.ts +13 -0
  393. package/dist/types/store/providers/memory/retry.store.d.ts +8 -0
  394. package/dist/types/store/providers/memory/signal.store.d.ts +2 -1
  395. package/dist/types/store/types.d.ts +49 -61
  396. package/dist/types/transport/WaWebSocket.d.ts +0 -1
  397. package/dist/types/transport/binary/constants.d.ts +0 -30
  398. package/dist/types/transport/binary/index.d.ts +0 -1
  399. package/dist/types/transport/node/WaNodeOrchestrator.d.ts +3 -4
  400. package/dist/types/transport/node/builders/business.d.ts +29 -0
  401. package/dist/types/transport/node/builders/global.d.ts +102 -0
  402. package/dist/types/transport/node/builders/index.d.ts +5 -2
  403. package/dist/types/transport/node/builders/message.d.ts +8 -7
  404. package/dist/types/transport/node/builders/pairing.d.ts +0 -2
  405. package/dist/types/transport/node/builders/privacy-token.d.ts +9 -0
  406. package/dist/types/transport/node/builders/privacy.d.ts +7 -0
  407. package/dist/types/transport/node/builders/profile.d.ts +8 -0
  408. package/dist/types/transport/node/builders/retry.d.ts +0 -1
  409. package/dist/types/transport/node/helpers.d.ts +5 -0
  410. package/dist/types/transport/noise/WaNoiseSession.d.ts +3 -2
  411. package/dist/types/transport/noise/WaNoiseSocket.d.ts +4 -2
  412. package/dist/types/util/bytes.d.ts +1 -1
  413. package/dist/types/util/index.d.ts +5 -0
  414. package/dist/types/util/primitives.d.ts +0 -1
  415. package/dist/util/bytes.js +22 -18
  416. package/dist/util/index.js +23 -0
  417. package/dist/util/primitives.js +2 -2
  418. package/package.json +29 -7
  419. package/proto/index.js +1 -1
  420. package/dist/crypto/core/constants.js +0 -4
  421. package/dist/esm/crypto/core/constants.js +0 -1
  422. package/dist/esm/retry/outbound.js +0 -82
  423. package/dist/esm/store/providers/sqlite/BaseSqliteStore.js +0 -37
  424. package/dist/esm/store/providers/sqlite/appstate.store.js +0 -250
  425. package/dist/esm/store/providers/sqlite/auth.store.js +0 -176
  426. package/dist/esm/store/providers/sqlite/connection.js +0 -245
  427. package/dist/esm/store/providers/sqlite/contact.store.js +0 -74
  428. package/dist/esm/store/providers/sqlite/device-list.store.js +0 -127
  429. package/dist/esm/store/providers/sqlite/message.store.js +0 -132
  430. package/dist/esm/store/providers/sqlite/migrations.js +0 -347
  431. package/dist/esm/store/providers/sqlite/participants.store.js +0 -77
  432. package/dist/esm/store/providers/sqlite/retry.store.js +0 -141
  433. package/dist/esm/store/providers/sqlite/sender-key.store.js +0 -198
  434. package/dist/esm/store/providers/sqlite/signal.store.js +0 -435
  435. package/dist/esm/store/providers/sqlite/table-names.js +0 -107
  436. package/dist/esm/store/providers/sqlite/thread.store.js +0 -85
  437. package/dist/retry/outbound.js +0 -87
  438. package/dist/store/providers/sqlite/BaseSqliteStore.js +0 -41
  439. package/dist/store/providers/sqlite/appstate.store.js +0 -254
  440. package/dist/store/providers/sqlite/auth.store.js +0 -180
  441. package/dist/store/providers/sqlite/connection.js +0 -281
  442. package/dist/store/providers/sqlite/contact.store.js +0 -78
  443. package/dist/store/providers/sqlite/device-list.store.js +0 -131
  444. package/dist/store/providers/sqlite/message.store.js +0 -136
  445. package/dist/store/providers/sqlite/migrations.js +0 -350
  446. package/dist/store/providers/sqlite/participants.store.js +0 -81
  447. package/dist/store/providers/sqlite/retry.store.js +0 -145
  448. package/dist/store/providers/sqlite/sender-key.store.js +0 -202
  449. package/dist/store/providers/sqlite/signal.store.js +0 -439
  450. package/dist/store/providers/sqlite/table-names.js +0 -113
  451. package/dist/store/providers/sqlite/thread.store.js +0 -89
  452. package/dist/types/appstate/store/sqlite.d.ts +0 -7
  453. package/dist/types/crypto/core/constants.d.ts +0 -1
  454. package/dist/types/retry/outbound.d.ts +0 -4
  455. package/dist/types/store/providers/sqlite/BaseSqliteStore.d.ts +0 -12
  456. package/dist/types/store/providers/sqlite/appstate.store.d.ts +0 -17
  457. package/dist/types/store/providers/sqlite/auth.store.d.ts +0 -10
  458. package/dist/types/store/providers/sqlite/connection.d.ts +0 -10
  459. package/dist/types/store/providers/sqlite/contact.store.d.ts +0 -12
  460. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -15
  461. package/dist/types/store/providers/sqlite/message.store.d.ts +0 -13
  462. package/dist/types/store/providers/sqlite/migrations.d.ts +0 -3
  463. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -12
  464. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -15
  465. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -24
  466. package/dist/types/store/providers/sqlite/signal.store.d.ts +0 -53
  467. package/dist/types/store/providers/sqlite/table-names.d.ts +0 -5
  468. package/dist/types/store/providers/sqlite/thread.store.d.ts +0 -13
@@ -8,13 +8,20 @@ const WaConnectionManager_1 = require("./connection/WaConnectionManager");
8
8
  const WaKeyShareCoordinator_1 = require("./connection/WaKeyShareCoordinator");
9
9
  const WaReceiptQueue_1 = require("./connection/WaReceiptQueue");
10
10
  const WaAppStateMutationCoordinator_1 = require("./coordinators/WaAppStateMutationCoordinator");
11
+ const WaBusinessCoordinator_1 = require("./coordinators/WaBusinessCoordinator");
11
12
  const WaGroupCoordinator_1 = require("./coordinators/WaGroupCoordinator");
12
13
  const WaIncomingNodeCoordinator_1 = require("./coordinators/WaIncomingNodeCoordinator");
13
14
  const WaMessageDispatchCoordinator_1 = require("./coordinators/WaMessageDispatchCoordinator");
14
15
  const WaPassiveTasksCoordinator_1 = require("./coordinators/WaPassiveTasksCoordinator");
16
+ const WaPrivacyCoordinator_1 = require("./coordinators/WaPrivacyCoordinator");
17
+ const WaProfileCoordinator_1 = require("./coordinators/WaProfileCoordinator");
15
18
  const WaRetryCoordinator_1 = require("./coordinators/WaRetryCoordinator");
16
19
  const WaStreamControlCoordinator_1 = require("./coordinators/WaStreamControlCoordinator");
20
+ const WaTrustedContactTokenCoordinator_1 = require("./coordinators/WaTrustedContactTokenCoordinator");
17
21
  const dirty_1 = require("./dirty");
22
+ const devices_1 = require("./events/devices");
23
+ const identity_1 = require("./events/identity");
24
+ const privacy_token_1 = require("./events/privacy-token");
18
25
  const messages_1 = require("./messages");
19
26
  const fanout_1 = require("./messaging/fanout");
20
27
  const key_protocol_1 = require("./messaging/key-protocol");
@@ -23,6 +30,7 @@ const WaMediaTransferClient_1 = require("../media/WaMediaTransferClient");
23
30
  const incoming_1 = require("../message/incoming");
24
31
  const WaMessageClient_1 = require("../message/WaMessageClient");
25
32
  const constants_1 = require("../protocol/constants");
33
+ const jid_1 = require("../protocol/jid");
26
34
  const tracker_1 = require("../retry/tracker");
27
35
  const SignalDeviceSyncApi_1 = require("../signal/api/SignalDeviceSyncApi");
28
36
  const SignalDigestSyncApi_1 = require("../signal/api/SignalDigestSyncApi");
@@ -34,6 +42,8 @@ const SenderKeyManager_1 = require("../signal/group/SenderKeyManager");
34
42
  const resolver_1 = require("../signal/session/resolver");
35
43
  const SignalProtocol_1 = require("../signal/session/SignalProtocol");
36
44
  const WaKeepAlive_1 = require("../transport/keepalive/WaKeepAlive");
45
+ const global_1 = require("../transport/node/builders/global");
46
+ const helpers_1 = require("../transport/node/helpers");
37
47
  const usync_1 = require("../transport/node/usync");
38
48
  const WaNodeOrchestrator_1 = require("../transport/node/WaNodeOrchestrator");
39
49
  const WaNodeTransport_1 = require("../transport/node/WaNodeTransport");
@@ -94,31 +104,6 @@ function resolveWaClientBase(options, logger) {
94
104
  sessionStore
95
105
  };
96
106
  }
97
- function createIncomingMessageAckOptions(input) {
98
- const { logger, sendNode, emitEvent, handleIncomingMessageEvent, handleError, getCurrentMeJid, signalProtocol, senderKeyManager, retryCoordinator } = input;
99
- return {
100
- logger,
101
- sendNode,
102
- getMeJid: getCurrentMeJid,
103
- signalProtocol,
104
- senderKeyManager,
105
- onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
106
- emitIncomingMessage: (event) => {
107
- void handleIncomingMessageEvent(event).catch((err) => handleError((0, primitives_1.toError)(err)));
108
- },
109
- emitUnhandledStanza: (event) => emitEvent('stanza_unhandled', event)
110
- };
111
- }
112
- function createHandleClientDirtyBits(input) {
113
- const { logger, queryWithContext, syncAppState, getCurrentCredentials, generateUsyncSid } = input;
114
- return (dirtyBits) => (0, dirty_1.handleDirtyBits)({
115
- logger,
116
- queryWithContext,
117
- getCurrentCredentials,
118
- syncAppState,
119
- generateUsyncSid
120
- }, dirtyBits);
121
- }
122
107
  function createIncomingNodeRuntime(input) {
123
108
  const { logger, emitEvent, authClient, connectionManager, nodeOrchestrator, streamControl, mediaMessageBuildOptions, retryCoordinator, messageDispatch, sendNode, syncAppState, disconnect, clearStoredCredentials, getCurrentMeJid, handleClientDirtyBits, incomingMessageAckOptions } = input;
124
109
  return {
@@ -160,6 +145,9 @@ function createIncomingNodeRuntime(input) {
160
145
  },
161
146
  emitUnhandledIncomingNode: (event) => emitEvent('stanza_unhandled', event),
162
147
  syncAppState,
148
+ stopComms: () => {
149
+ void connectionManager.getComms()?.stopComms();
150
+ },
163
151
  disconnect,
164
152
  clearStoredCredentials,
165
153
  parseDirtyBits: (nodes) => (0, dirty_1.parseDirtyBits)(nodes, logger),
@@ -276,7 +264,8 @@ function buildWaClientDependencies(input) {
276
264
  deviceBrowser: options.deviceBrowser,
277
265
  deviceOsDisplayName: options.deviceOsDisplayName,
278
266
  devicePlatform: options.devicePlatform,
279
- requireFullSync: options.requireFullSync
267
+ requireFullSync: options.requireFullSync,
268
+ version: options.version
280
269
  }, {
281
270
  logger,
282
271
  authStore: sessionStore.auth,
@@ -303,6 +292,16 @@ function buildWaClientDependencies(input) {
303
292
  const groupCoordinator = (0, WaGroupCoordinator_1.createGroupCoordinator)({
304
293
  queryWithContext: runtime.queryWithContext
305
294
  });
295
+ const privacyCoordinator = (0, WaPrivacyCoordinator_1.createPrivacyCoordinator)({
296
+ queryWithContext: runtime.queryWithContext
297
+ });
298
+ const profileCoordinator = (0, WaProfileCoordinator_1.createProfileCoordinator)({
299
+ queryWithContext: runtime.queryWithContext,
300
+ generateSid: generateUsyncSid
301
+ });
302
+ const businessCoordinator = (0, WaBusinessCoordinator_1.createBusinessCoordinator)({
303
+ queryWithContext: runtime.queryWithContext
304
+ });
306
305
  const retryTracker = (0, tracker_1.createOutboundRetryTracker)({
307
306
  retryStore: sessionStore.retry,
308
307
  logger
@@ -322,9 +321,30 @@ function buildWaClientDependencies(input) {
322
321
  });
323
322
  const participantsCache = (0, participants_1.createGroupParticipantsCache)({
324
323
  participantsStore: sessionStore.participants,
325
- queryGroupParticipantJids: async (groupJid) => (await groupCoordinator.queryGroupMetadata(groupJid)).participants.map((participant) => participant.jid),
324
+ queryGroupParticipantJids: async (groupJid) => {
325
+ const metadata = await groupCoordinator.queryGroupMetadata(groupJid);
326
+ const participantJids = new Array(metadata.participants.length);
327
+ for (let index = 0; index < metadata.participants.length; index += 1) {
328
+ participantJids[index] = metadata.participants[index].jid;
329
+ }
330
+ return participantJids;
331
+ },
326
332
  logger
327
333
  });
334
+ const trustedContactToken = new WaTrustedContactTokenCoordinator_1.WaTrustedContactTokenCoordinator({
335
+ logger,
336
+ store: sessionStore.privacyToken,
337
+ runtime: {
338
+ queryWithContext: runtime.queryWithContext,
339
+ emitEvent: runtime.emitEvent,
340
+ getCurrentMeLid: () => getCurrentMeLid() ?? null
341
+ },
342
+ durationS: options.privacyToken?.tcTokenDurationS,
343
+ numBuckets: options.privacyToken?.tcTokenNumBuckets,
344
+ senderDurationS: options.privacyToken?.tcTokenSenderDurationS,
345
+ senderNumBuckets: options.privacyToken?.tcTokenSenderNumBuckets,
346
+ maxDurationS: options.privacyToken?.tcTokenMaxDurationS
347
+ });
328
348
  let messageDispatch;
329
349
  const appStateSyncKeyProtocol = (0, key_protocol_1.createAppStateSyncKeyProtocol)({
330
350
  publishSignalMessage: (signalInput, publishOptions) => messageDispatch.publishSignalMessage(signalInput, publishOptions),
@@ -344,9 +364,18 @@ function buildWaClientDependencies(input) {
344
364
  buildMessageContent: async (content) => (0, messages_1.buildMediaMessageContent)(mediaMessageBuildOptions, content),
345
365
  senderKeyManager,
346
366
  signalProtocol,
367
+ signalStore: sessionStore.signal,
368
+ deviceListStore: sessionStore.deviceList,
347
369
  getCurrentMeJid,
348
370
  getCurrentMeLid,
349
- getCurrentSignedIdentity
371
+ getCurrentSignedIdentity,
372
+ resolvePrivacyTokenNode: (recipientJid) => trustedContactToken.resolveTokenForMessage(recipientJid),
373
+ onDirectMessageSent: (recipientJid) => {
374
+ trustedContactToken.maybeIssueSenderToken(recipientJid).catch((err) => logger.warn('sender token issue failed', {
375
+ to: recipientJid,
376
+ message: (0, primitives_1.toError)(err).message
377
+ }));
378
+ }
350
379
  });
351
380
  const retryCoordinator = new WaRetryCoordinator_1.WaRetryCoordinator({
352
381
  logger,
@@ -391,14 +420,27 @@ function buildWaClientDependencies(input) {
391
420
  connectionManager.setMediaConnCache(mediaConnCacheFallback);
392
421
  }
393
422
  scheduleReconnectAfterPairing = () => connectionManager?.scheduleReconnectAfterPairing();
394
- const disconnectWithClientSideEffects = async () => {
423
+ const disconnectWithClientSideEffects = async (reason, isLogout, code) => {
395
424
  keyShareCoordinator.notifyDisconnected();
396
425
  await connectionManager?.disconnect();
397
- runtime.emitEvent('connection_close', {});
426
+ runtime.emitEvent('connection', {
427
+ status: 'close',
428
+ reason,
429
+ code,
430
+ isLogout,
431
+ isNewLogin: false
432
+ });
398
433
  };
399
- const connectWithClientSideEffects = async () => {
434
+ const connectWithClientSideEffects = async (reason) => {
435
+ runtime.resumeIncomingEvents();
400
436
  await connectionManager?.connect(runtime.handleIncomingFrame);
401
- runtime.emitEvent('connection_open', {});
437
+ runtime.emitEvent('connection', {
438
+ status: 'open',
439
+ reason,
440
+ code: null,
441
+ isLogout: false,
442
+ isNewLogin: connectionManager?.wasNewLogin() ?? false
443
+ });
402
444
  };
403
445
  const clearStoredCredentialsWithClientSideEffects = async () => {
404
446
  await connectionManager?.clearStoredCredentials();
@@ -415,24 +457,27 @@ function buildWaClientDependencies(input) {
415
457
  clearStoredCredentials: clearStoredCredentialsWithClientSideEffects,
416
458
  connect: connectWithClientSideEffects
417
459
  });
418
- const incomingMessageAckOptions = createIncomingMessageAckOptions({
460
+ const incomingMessageAckOptions = {
419
461
  logger,
420
462
  sendNode: runtime.sendNode,
421
- emitEvent: runtime.emitEvent,
422
- handleIncomingMessageEvent: runtime.handleIncomingMessageEvent,
423
- handleError: runtime.handleError,
424
- getCurrentMeJid,
463
+ getMeJid: getCurrentMeJid,
425
464
  signalProtocol,
426
465
  senderKeyManager,
427
- retryCoordinator
428
- });
429
- const handleClientDirtyBits = createHandleClientDirtyBits({
466
+ onDecryptFailure: (context, error) => retryCoordinator.onDecryptFailure(context, error),
467
+ emitIncomingMessage: (event) => {
468
+ void runtime
469
+ .handleIncomingMessageEvent(event)
470
+ .catch((err) => runtime.handleError((0, primitives_1.toError)(err)));
471
+ },
472
+ emitUnhandledStanza: (event) => runtime.emitEvent('stanza_unhandled', event)
473
+ };
474
+ const handleClientDirtyBits = (dirtyBits) => (0, dirty_1.handleDirtyBits)({
430
475
  logger,
431
476
  queryWithContext: runtime.queryWithContext,
432
- syncAppState: runtime.syncAppState,
433
477
  getCurrentCredentials,
478
+ syncAppState: runtime.syncAppState,
434
479
  generateUsyncSid
435
- });
480
+ }, dirtyBits);
436
481
  const incomingNode = new WaIncomingNodeCoordinator_1.WaIncomingNodeCoordinator({
437
482
  logger,
438
483
  runtime: createIncomingNodeRuntime({
@@ -454,6 +499,207 @@ function buildWaClientDependencies(input) {
454
499
  incomingMessageAckOptions
455
500
  })
456
501
  });
502
+ incomingNode.registerIncomingHandler({
503
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
504
+ subtype: constants_1.WA_NOTIFICATION_TYPES.ENCRYPT,
505
+ prepend: true,
506
+ handler: async (node) => {
507
+ const firstChild = (0, helpers_1.getFirstNodeChild)(node);
508
+ if (!firstChild) {
509
+ return false;
510
+ }
511
+ const childTag = firstChild.tag;
512
+ // <count value="N"/> — server prekeys running low
513
+ if (childTag === 'count') {
514
+ const ackNode = (0, global_1.buildAckNode)({
515
+ kind: 'notification',
516
+ node,
517
+ includeType: false
518
+ });
519
+ await runtime.sendNode(ackNode);
520
+ const tasks = passiveTasks;
521
+ if (!tasks) {
522
+ logger.warn('encrypt-count: passive tasks not available');
523
+ return true;
524
+ }
525
+ await tasks.handlePreKeyLowNotification().catch((error) => {
526
+ logger.warn('encrypt-count: prekey upload failed', {
527
+ message: (0, primitives_1.toError)(error).message
528
+ });
529
+ });
530
+ return true;
531
+ }
532
+ // <digest/> — digest key sync
533
+ if (childTag === 'digest') {
534
+ const ackNode = (0, global_1.buildAckNode)({
535
+ kind: 'notification',
536
+ node,
537
+ includeType: false
538
+ });
539
+ await runtime.sendNode(ackNode);
540
+ const tasks = passiveTasks;
541
+ if (!tasks) {
542
+ logger.warn('encrypt-digest: passive tasks not available');
543
+ return true;
544
+ }
545
+ await tasks.handleDigestNotification().catch((error) => {
546
+ logger.warn('encrypt-digest: digest sync failed', {
547
+ message: (0, primitives_1.toError)(error).message
548
+ });
549
+ });
550
+ return true;
551
+ }
552
+ // <identity/> — contact identity key changed
553
+ if (childTag === 'identity') {
554
+ const parsed = (0, identity_1.parseIdentityChangeNotification)(node);
555
+ if (!parsed) {
556
+ return false;
557
+ }
558
+ const ackNode = (0, global_1.buildAckNode)({
559
+ kind: 'notification',
560
+ node,
561
+ includeType: false
562
+ });
563
+ await runtime.sendNode(ackNode);
564
+ const address = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
565
+ // ignore companion devices (non-primary)
566
+ if (address.device !== 0) {
567
+ logger.debug('identity-change: ignoring companion device', {
568
+ jid: parsed.fromJid
569
+ });
570
+ return true;
571
+ }
572
+ // self-primary identity change → must disconnect
573
+ const meJid = getCurrentMeJid();
574
+ if (meJid) {
575
+ const meUser = (0, jid_1.toUserJid)(meJid);
576
+ const fromUser = (0, jid_1.toUserJid)(parsed.fromJid);
577
+ if (meUser === fromUser) {
578
+ logger.error('self primary identity changed, disconnecting');
579
+ void connectionManager?.getComms()?.stopComms();
580
+ await disconnectWithClientSideEffects(constants_1.WA_DISCONNECT_REASONS.PRIMARY_IDENTITY_KEY_CHANGE, true, null);
581
+ await clearStoredCredentialsWithClientSideEffects();
582
+ return true;
583
+ }
584
+ }
585
+ const oldIdentity = await sessionStore.signal.getRemoteIdentity(address);
586
+ if (oldIdentity) {
587
+ logger.info('identity-change: clearing session', {
588
+ jid: parsed.fromJid
589
+ });
590
+ await sessionStore.signal.deleteSession(address);
591
+ const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
592
+ await trustedContactToken.reissueOnIdentityChange(userJid).catch((error) => {
593
+ logger.warn('identity-change: reissue tc token failed', {
594
+ message: (0, primitives_1.toError)(error).message
595
+ });
596
+ });
597
+ }
598
+ runtime.emitEvent('notification', {
599
+ rawNode: node,
600
+ stanzaId: parsed.stanzaId,
601
+ chatJid: parsed.fromJid,
602
+ stanzaType: 'encrypt',
603
+ notificationType: 'encrypt',
604
+ classification: 'core',
605
+ details: {
606
+ kind: 'identity_change',
607
+ displayName: parsed.displayName,
608
+ lid: parsed.lid,
609
+ hadPreviousIdentity: !!oldIdentity
610
+ }
611
+ });
612
+ return true;
613
+ }
614
+ return false;
615
+ }
616
+ });
617
+ incomingNode.registerIncomingHandler({
618
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
619
+ subtype: constants_1.WA_NOTIFICATION_TYPES.DEVICES,
620
+ prepend: true,
621
+ handler: async (node) => {
622
+ const parsed = (0, devices_1.parseDeviceNotification)(node);
623
+ if (!parsed) {
624
+ return false;
625
+ }
626
+ const ackNode = (0, global_1.buildAckNode)({
627
+ kind: 'notification',
628
+ node,
629
+ includeType: false
630
+ });
631
+ await runtime.sendNode(ackNode);
632
+ const userJid = (0, jid_1.toUserJid)(parsed.fromJid);
633
+ if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.REMOVE) {
634
+ const baseAddress = (0, jid_1.parseSignalAddressFromJid)(parsed.fromJid);
635
+ for (const device of parsed.devices) {
636
+ const address = {
637
+ user: baseAddress.user,
638
+ server: baseAddress.server,
639
+ device: device.deviceId
640
+ };
641
+ await sessionStore.signal.deleteSession(address).catch((error) => {
642
+ logger.warn('devices-notification: delete session failed', {
643
+ message: (0, primitives_1.toError)(error).message
644
+ });
645
+ });
646
+ }
647
+ }
648
+ // invalidate device list cache so next fanout fetches fresh list
649
+ if (sessionStore.deviceList) {
650
+ await sessionStore.deviceList.deleteUserDevices(userJid).catch((error) => {
651
+ logger.warn('devices-notification: invalidate cache failed', {
652
+ message: (0, primitives_1.toError)(error).message
653
+ });
654
+ });
655
+ }
656
+ // for update notifications, re-sync immediately
657
+ if (parsed.action === devices_1.DEVICE_NOTIFICATION_ACTIONS.UPDATE) {
658
+ signalDeviceSync.syncDeviceList([userJid]).catch((error) => {
659
+ logger.warn('devices-notification: sync device list failed', {
660
+ message: (0, primitives_1.toError)(error).message
661
+ });
662
+ });
663
+ }
664
+ runtime.emitEvent('notification', {
665
+ rawNode: node,
666
+ stanzaId: parsed.stanzaId,
667
+ chatJid: parsed.fromJid,
668
+ stanzaType: 'devices',
669
+ notificationType: 'devices',
670
+ classification: 'core',
671
+ details: {
672
+ kind: 'device_list_change',
673
+ action: parsed.action,
674
+ devices: parsed.devices
675
+ }
676
+ });
677
+ return true;
678
+ }
679
+ });
680
+ incomingNode.registerIncomingHandler({
681
+ tag: constants_1.WA_NODE_TAGS.NOTIFICATION,
682
+ subtype: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE,
683
+ prepend: true,
684
+ handler: async (node) => {
685
+ const fromJid = node.attrs.from ?? node.attrs.sender_lid;
686
+ if (!fromJid) {
687
+ return false;
688
+ }
689
+ const tokens = (0, privacy_token_1.parsePrivacyTokenNotification)(node);
690
+ if (tokens.length === 0) {
691
+ return false;
692
+ }
693
+ await trustedContactToken.handleIncomingToken(fromJid, tokens);
694
+ const ackNode = (0, global_1.buildAckNode)({
695
+ kind: 'notification',
696
+ node,
697
+ typeOverride: constants_1.WA_PRIVACY_TOKEN_NOTIFICATION_TYPE
698
+ });
699
+ await runtime.sendNode(ackNode);
700
+ return true;
701
+ }
702
+ });
457
703
  passiveTasks = new WaPassiveTasksCoordinator_1.WaPassiveTasksCoordinator({
458
704
  logger,
459
705
  signalStore: sessionStore.signal,
@@ -486,13 +732,17 @@ function buildWaClientDependencies(input) {
486
732
  messageDispatch,
487
733
  retryCoordinator,
488
734
  appStateSync,
489
- appStateMutations,
735
+ chatCoordinator: appStateMutations,
490
736
  streamControl,
491
737
  incomingNode,
492
738
  passiveTasks,
493
739
  groupCoordinator,
740
+ privacyCoordinator,
741
+ profileCoordinator,
742
+ businessCoordinator,
494
743
  receiptQueue,
495
744
  keyShareCoordinator,
496
- connectionManager
745
+ connectionManager,
746
+ trustedContactToken
497
747
  };
498
748
  }
@@ -5,6 +5,7 @@ const WaComms_1 = require("../../transport/WaComms");
5
5
  const primitives_1 = require("../../util/primitives");
6
6
  class WaConnectionManager {
7
7
  constructor(options) {
8
+ this.lastConnectWasNewLogin = false;
8
9
  this.logger = options.logger;
9
10
  this.options = options.options;
10
11
  this.authClient = options.authClient;
@@ -33,11 +34,12 @@ class WaConnectionManager {
33
34
  const operation = this.runLifecycleOperation(async () => {
34
35
  await this.connectInternal(frameHandler, lifecycleGeneration);
35
36
  });
36
- this.connectPromise = operation.finally(() => {
37
- if (this.connectPromise === operation) {
37
+ const promise = operation.finally(() => {
38
+ if (this.connectPromise === promise) {
38
39
  this.connectPromise = null;
39
40
  }
40
41
  });
42
+ this.connectPromise = promise;
41
43
  return this.connectPromise;
42
44
  }
43
45
  scheduleReconnectAfterPairing() {
@@ -67,6 +69,9 @@ class WaConnectionManager {
67
69
  isConnected() {
68
70
  return !!(this.comms && this.comms.getCommsState().connected);
69
71
  }
72
+ wasNewLogin() {
73
+ return this.lastConnectWasNewLogin;
74
+ }
70
75
  getComms() {
71
76
  return this.comms;
72
77
  }
@@ -96,6 +101,7 @@ class WaConnectionManager {
96
101
  }
97
102
  this.logger.info('wa client connect start');
98
103
  let credentials = await this.authClient.loadOrCreateCredentials();
104
+ this.lastConnectWasNewLogin = !credentials.meJid;
99
105
  this.assertLifecycleCurrent(lifecycleGeneration, 'connect');
100
106
  try {
101
107
  await this.startCommsWithCredentials(credentials, frameHandler, lifecycleGeneration);
@@ -130,11 +136,12 @@ class WaConnectionManager {
130
136
  const operation = this.runLifecycleOperation(async () => {
131
137
  await this.reconnectAsRegisteredAfterPairingInternal();
132
138
  });
133
- this.pairingReconnectPromise = operation.finally(() => {
134
- if (this.pairingReconnectPromise === operation) {
139
+ const promise = operation.finally(() => {
140
+ if (this.pairingReconnectPromise === promise) {
135
141
  this.pairingReconnectPromise = null;
136
142
  }
137
143
  });
144
+ this.pairingReconnectPromise = promise;
138
145
  return this.pairingReconnectPromise;
139
146
  }
140
147
  async reconnectAsRegisteredAfterPairingInternal() {
@@ -179,12 +186,14 @@ class WaConnectionManager {
179
186
  this.pendingComms = null;
180
187
  this.clearCommsBinding(currentComms ?? undefined);
181
188
  await this.authClient.clearTransientState();
182
- if (pendingComms) {
183
- await this.stopCommsQuietly(pendingComms, 'failed to stop pending comms during disconnect');
184
- }
185
- if (currentComms) {
186
- await this.stopCommsQuietly(currentComms, 'failed to stop comms during disconnect');
187
- }
189
+ await Promise.all([
190
+ pendingComms && pendingComms !== currentComms
191
+ ? this.stopCommsQuietly(pendingComms, 'failed to stop pending comms during disconnect')
192
+ : Promise.resolve(),
193
+ currentComms
194
+ ? this.stopCommsQuietly(currentComms, 'failed to stop comms during disconnect')
195
+ : Promise.resolve()
196
+ ]);
188
197
  if (this.isLifecycleCurrent(lifecycleGeneration)) {
189
198
  this.logger.info('wa client disconnected');
190
199
  }