zapo-js 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +8 -0
  2. package/dist/appstate/WaAppStateCrypto.js +18 -25
  3. package/dist/appstate/WaAppStateSyncClient.js +181 -114
  4. package/dist/appstate/WaAppStateSyncResponseParser.js +16 -5
  5. package/dist/appstate/constants.js +4 -3
  6. package/dist/appstate/utils.js +10 -30
  7. package/dist/auth/WaAuthClient.js +48 -55
  8. package/dist/auth/flow/WaAuthCredentialsFlow.js +21 -14
  9. package/dist/auth/index.js +1 -3
  10. package/dist/auth/pairing/WaPairingFlow.js +21 -23
  11. package/dist/auth/pairing/WaQrFlow.js +37 -24
  12. package/dist/client/WaClient.js +103 -276
  13. package/dist/client/WaClientFactory.js +227 -110
  14. package/dist/client/connection/WaConnectionManager.js +292 -0
  15. package/dist/client/connection/WaKeyShareCoordinator.js +63 -0
  16. package/dist/client/connection/WaReceiptQueue.js +51 -0
  17. package/dist/client/coordinators/WaAppStateMutationCoordinator.js +471 -0
  18. package/dist/client/coordinators/WaGroupCoordinator.js +27 -17
  19. package/dist/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  20. package/dist/client/coordinators/WaMessageDispatchCoordinator.js +231 -686
  21. package/dist/client/coordinators/WaRetryCoordinator.js +70 -37
  22. package/dist/client/dirty.js +35 -29
  23. package/dist/client/events/chat.js +4 -3
  24. package/dist/client/events/group.js +59 -36
  25. package/dist/client/history-sync.js +53 -63
  26. package/dist/client/incoming.js +23 -20
  27. package/dist/client/mailbox.js +8 -8
  28. package/dist/client/messages.js +4 -4
  29. package/dist/client/messaging/fanout.js +189 -0
  30. package/dist/client/messaging/key-protocol.js +130 -0
  31. package/dist/client/messaging/participants.js +191 -0
  32. package/dist/crypto/core/hkdf.js +3 -8
  33. package/dist/crypto/core/index.js +1 -4
  34. package/dist/crypto/core/keys.js +2 -3
  35. package/dist/crypto/core/primitives.js +12 -15
  36. package/dist/crypto/core/random.js +7 -26
  37. package/dist/crypto/curves/Ed25519.js +7 -8
  38. package/dist/crypto/curves/X25519.js +13 -16
  39. package/dist/crypto/index.js +0 -5
  40. package/dist/esm/appstate/WaAppStateCrypto.js +6 -13
  41. package/dist/esm/appstate/WaAppStateSyncClient.js +174 -107
  42. package/dist/esm/appstate/WaAppStateSyncResponseParser.js +17 -6
  43. package/dist/esm/appstate/constants.js +3 -2
  44. package/dist/esm/appstate/utils.js +8 -27
  45. package/dist/esm/auth/WaAuthClient.js +48 -55
  46. package/dist/esm/auth/flow/WaAuthCredentialsFlow.js +21 -14
  47. package/dist/esm/auth/index.js +0 -1
  48. package/dist/esm/auth/pairing/WaPairingFlow.js +14 -16
  49. package/dist/esm/auth/pairing/WaQrFlow.js +37 -24
  50. package/dist/esm/client/WaClient.js +103 -276
  51. package/dist/esm/client/WaClientFactory.js +227 -110
  52. package/dist/esm/client/connection/WaConnectionManager.js +288 -0
  53. package/dist/esm/client/connection/WaKeyShareCoordinator.js +59 -0
  54. package/dist/esm/client/connection/WaReceiptQueue.js +47 -0
  55. package/dist/esm/client/coordinators/WaAppStateMutationCoordinator.js +467 -0
  56. package/dist/esm/client/coordinators/WaGroupCoordinator.js +20 -10
  57. package/dist/esm/client/coordinators/WaIncomingNodeCoordinator.js +20 -27
  58. package/dist/esm/client/coordinators/WaMessageDispatchCoordinator.js +232 -687
  59. package/dist/esm/client/coordinators/WaRetryCoordinator.js +71 -38
  60. package/dist/esm/client/dirty.js +30 -24
  61. package/dist/esm/client/events/chat.js +4 -3
  62. package/dist/esm/client/events/group.js +50 -28
  63. package/dist/esm/client/history-sync.js +50 -60
  64. package/dist/esm/client/incoming.js +23 -20
  65. package/dist/esm/client/mailbox.js +8 -8
  66. package/dist/esm/client/messages.js +1 -1
  67. package/dist/esm/client/messaging/fanout.js +186 -0
  68. package/dist/esm/client/messaging/key-protocol.js +127 -0
  69. package/dist/esm/client/messaging/participants.js +188 -0
  70. package/dist/esm/crypto/core/hkdf.js +3 -8
  71. package/dist/esm/crypto/core/index.js +0 -1
  72. package/dist/esm/crypto/core/keys.js +2 -3
  73. package/dist/esm/crypto/core/primitives.js +12 -15
  74. package/dist/esm/crypto/core/random.js +6 -25
  75. package/dist/esm/crypto/curves/Ed25519.js +4 -5
  76. package/dist/esm/crypto/curves/X25519.js +10 -13
  77. package/dist/esm/crypto/index.js +0 -2
  78. package/dist/esm/infra/log/ConsoleLogger.js +18 -17
  79. package/dist/esm/infra/log/PinoLogger.js +15 -9
  80. package/dist/esm/infra/log/types.js +11 -1
  81. package/dist/esm/infra/perf/BoundedTaskQueue.js +13 -17
  82. package/dist/esm/media/WaMediaCrypto.js +2 -4
  83. package/dist/esm/media/WaMediaTransferClient.js +226 -58
  84. package/dist/esm/media/conn.js +10 -6
  85. package/dist/esm/media/constants.js +4 -1
  86. package/dist/esm/message/WaMessageClient.js +4 -13
  87. package/dist/esm/message/ack.js +6 -6
  88. package/dist/esm/message/addon-crypto.js +59 -0
  89. package/dist/esm/message/incoming.js +106 -111
  90. package/dist/esm/message/index.js +2 -0
  91. package/dist/esm/message/reporting-token.js +438 -0
  92. package/dist/esm/message/use-case-secret.js +49 -0
  93. package/dist/esm/protocol/appstate.js +58 -0
  94. package/dist/esm/protocol/constants.js +2 -1
  95. package/dist/esm/protocol/index.js +2 -10
  96. package/dist/esm/protocol/jid.js +63 -51
  97. package/dist/esm/protocol/media.js +3 -3
  98. package/dist/esm/protocol/nodes.js +2 -0
  99. package/dist/esm/protocol/usync.js +11 -0
  100. package/dist/esm/retry/index.js +1 -0
  101. package/dist/esm/retry/outbound.js +4 -5
  102. package/dist/esm/retry/parse.js +58 -76
  103. package/dist/esm/retry/replay.js +48 -49
  104. package/dist/esm/retry/tracker.js +56 -0
  105. package/dist/esm/signal/api/SignalDeviceSyncApi.js +249 -82
  106. package/dist/esm/signal/api/SignalDigestSyncApi.js +6 -1
  107. package/dist/esm/signal/api/SignalIdentitySyncApi.js +49 -34
  108. package/dist/esm/signal/api/SignalMissingPreKeysSyncApi.js +70 -62
  109. package/dist/esm/signal/api/SignalSessionSyncApi.js +23 -30
  110. package/dist/esm/signal/crypto/WaAdvSignature.js +3 -5
  111. package/dist/esm/signal/group/SenderKeyChain.js +28 -23
  112. package/dist/esm/signal/group/SenderKeyCodec.js +2 -4
  113. package/dist/esm/signal/group/SenderKeyManager.js +26 -16
  114. package/dist/esm/signal/index.js +1 -0
  115. package/dist/esm/signal/session/SignalProtocol.js +49 -14
  116. package/dist/esm/signal/session/SignalRatchet.js +24 -15
  117. package/dist/esm/signal/session/SignalSession.js +14 -9
  118. package/dist/esm/signal/session/resolver.js +186 -0
  119. package/dist/esm/signal/store/sqlite.js +16 -37
  120. package/dist/esm/store/createStore.js +16 -18
  121. package/dist/esm/store/noop.store.js +3 -6
  122. package/dist/esm/store/providers/memory/appstate.store.js +30 -6
  123. package/dist/esm/store/providers/memory/contact.store.js +5 -0
  124. package/dist/esm/store/providers/memory/device-list.store.js +3 -30
  125. package/dist/esm/store/providers/memory/message.store.js +11 -5
  126. package/dist/esm/store/providers/memory/participants.store.js +1 -8
  127. package/dist/esm/store/providers/memory/sender-key.store.js +5 -7
  128. package/dist/esm/store/providers/memory/signal.store.js +13 -1
  129. package/dist/esm/store/providers/memory/thread.store.js +5 -0
  130. package/dist/esm/store/providers/sqlite/appstate.store.js +82 -1
  131. package/dist/esm/store/providers/sqlite/connection.js +18 -13
  132. package/dist/esm/store/providers/sqlite/contact.store.js +31 -18
  133. package/dist/esm/store/providers/sqlite/device-list.store.js +7 -35
  134. package/dist/esm/store/providers/sqlite/message.store.js +45 -32
  135. package/dist/esm/store/providers/sqlite/migrations.js +1 -1
  136. package/dist/esm/store/providers/sqlite/participants.store.js +1 -9
  137. package/dist/esm/store/providers/sqlite/retry.store.js +8 -11
  138. package/dist/esm/store/providers/sqlite/sender-key.store.js +25 -30
  139. package/dist/esm/store/providers/sqlite/signal.store.js +104 -22
  140. package/dist/esm/store/providers/sqlite/table-names.js +107 -0
  141. package/dist/esm/store/providers/sqlite/thread.store.js +35 -22
  142. package/dist/esm/transport/WaComms.js +25 -23
  143. package/dist/esm/transport/WaWebSocket.js +115 -12
  144. package/dist/esm/transport/binary/decoder.js +4 -4
  145. package/dist/esm/transport/binary/encoder.js +12 -4
  146. package/dist/esm/transport/index.js +1 -0
  147. package/dist/esm/transport/keepalive/WaKeepAlive.js +2 -8
  148. package/dist/esm/transport/node/WaNodeOrchestrator.js +2 -4
  149. package/dist/esm/transport/node/WaNodeTransport.js +0 -3
  150. package/dist/esm/transport/node/builders/{accountSync.js → account-sync.js} +16 -36
  151. package/dist/esm/transport/node/builders/index.js +2 -1
  152. package/dist/esm/transport/node/builders/message.js +9 -0
  153. package/dist/esm/transport/node/builders/pairing.js +4 -5
  154. package/dist/esm/transport/node/builders/usync.js +41 -0
  155. package/dist/esm/transport/node/helpers.js +107 -5
  156. package/dist/esm/transport/node/usync.js +35 -0
  157. package/dist/esm/transport/noise/WaFrameCodec.js +48 -33
  158. package/dist/esm/transport/noise/WaNoiseCert.js +3 -6
  159. package/dist/esm/transport/noise/WaNoiseSession.js +17 -10
  160. package/dist/esm/transport/proxy.js +27 -0
  161. package/dist/esm/transport/stream/parse.js +13 -48
  162. package/dist/esm/util/bytes.js +50 -32
  163. package/dist/esm/util/coercion.js +6 -14
  164. package/dist/esm/util/primitives.js +39 -14
  165. package/dist/infra/log/ConsoleLogger.js +18 -17
  166. package/dist/infra/log/PinoLogger.js +15 -9
  167. package/dist/infra/log/types.js +12 -0
  168. package/dist/infra/perf/BoundedTaskQueue.js +13 -17
  169. package/dist/media/WaMediaCrypto.js +1 -3
  170. package/dist/media/WaMediaTransferClient.js +259 -58
  171. package/dist/media/conn.js +10 -6
  172. package/dist/media/constants.js +4 -1
  173. package/dist/message/WaMessageClient.js +5 -14
  174. package/dist/message/ack.js +6 -6
  175. package/dist/message/addon-crypto.js +65 -0
  176. package/dist/message/incoming.js +104 -109
  177. package/dist/message/index.js +2 -0
  178. package/dist/message/reporting-token.js +443 -0
  179. package/dist/message/use-case-secret.js +55 -0
  180. package/dist/protocol/appstate.js +59 -1
  181. package/dist/protocol/constants.js +7 -1
  182. package/dist/protocol/index.js +20 -42
  183. package/dist/protocol/jid.js +64 -51
  184. package/dist/protocol/media.js +3 -3
  185. package/dist/protocol/nodes.js +2 -0
  186. package/dist/protocol/usync.js +14 -0
  187. package/dist/retry/index.js +3 -1
  188. package/dist/retry/outbound.js +6 -7
  189. package/dist/retry/parse.js +57 -75
  190. package/dist/retry/replay.js +46 -47
  191. package/dist/retry/tracker.js +59 -0
  192. package/dist/signal/api/SignalDeviceSyncApi.js +247 -80
  193. package/dist/signal/api/SignalDigestSyncApi.js +6 -1
  194. package/dist/signal/api/SignalIdentitySyncApi.js +49 -34
  195. package/dist/signal/api/SignalMissingPreKeysSyncApi.js +67 -59
  196. package/dist/signal/api/SignalSessionSyncApi.js +23 -30
  197. package/dist/signal/crypto/WaAdvSignature.js +2 -4
  198. package/dist/signal/group/SenderKeyChain.js +27 -22
  199. package/dist/signal/group/SenderKeyCodec.js +1 -3
  200. package/dist/signal/group/SenderKeyManager.js +26 -16
  201. package/dist/signal/index.js +3 -1
  202. package/dist/signal/session/SignalProtocol.js +49 -14
  203. package/dist/signal/session/SignalRatchet.js +24 -15
  204. package/dist/signal/session/SignalSession.js +14 -9
  205. package/dist/signal/session/resolver.js +189 -0
  206. package/dist/signal/store/sqlite.js +16 -37
  207. package/dist/store/createStore.js +16 -18
  208. package/dist/store/noop.store.js +3 -6
  209. package/dist/store/providers/memory/appstate.store.js +28 -4
  210. package/dist/store/providers/memory/contact.store.js +5 -0
  211. package/dist/store/providers/memory/device-list.store.js +3 -30
  212. package/dist/store/providers/memory/message.store.js +11 -5
  213. package/dist/store/providers/memory/participants.store.js +1 -8
  214. package/dist/store/providers/memory/sender-key.store.js +8 -10
  215. package/dist/store/providers/memory/signal.store.js +21 -9
  216. package/dist/store/providers/memory/thread.store.js +5 -0
  217. package/dist/store/providers/sqlite/appstate.store.js +81 -0
  218. package/dist/store/providers/sqlite/connection.js +18 -13
  219. package/dist/store/providers/sqlite/contact.store.js +31 -18
  220. package/dist/store/providers/sqlite/device-list.store.js +7 -35
  221. package/dist/store/providers/sqlite/message.store.js +45 -32
  222. package/dist/store/providers/sqlite/migrations.js +1 -1
  223. package/dist/store/providers/sqlite/participants.store.js +1 -9
  224. package/dist/store/providers/sqlite/retry.store.js +8 -11
  225. package/dist/store/providers/sqlite/sender-key.store.js +24 -29
  226. package/dist/store/providers/sqlite/signal.store.js +105 -23
  227. package/dist/store/providers/sqlite/table-names.js +113 -0
  228. package/dist/store/providers/sqlite/thread.store.js +35 -22
  229. package/dist/transport/WaComms.js +27 -25
  230. package/dist/transport/WaWebSocket.js +148 -12
  231. package/dist/transport/binary/decoder.js +4 -4
  232. package/dist/transport/binary/encoder.js +12 -4
  233. package/dist/transport/index.js +7 -1
  234. package/dist/transport/keepalive/WaKeepAlive.js +1 -7
  235. package/dist/transport/node/WaNodeOrchestrator.js +2 -4
  236. package/dist/transport/node/WaNodeTransport.js +0 -3
  237. package/dist/transport/node/builders/{accountSync.js → account-sync.js} +15 -35
  238. package/dist/transport/node/builders/index.js +12 -9
  239. package/dist/transport/node/builders/message.js +9 -0
  240. package/dist/transport/node/builders/pairing.js +4 -5
  241. package/dist/transport/node/builders/usync.js +45 -0
  242. package/dist/transport/node/helpers.js +112 -4
  243. package/dist/transport/node/usync.js +38 -0
  244. package/dist/transport/noise/WaFrameCodec.js +47 -32
  245. package/dist/transport/noise/WaNoiseCert.js +5 -8
  246. package/dist/transport/noise/WaNoiseSession.js +17 -10
  247. package/dist/transport/proxy.js +34 -0
  248. package/dist/transport/stream/parse.js +17 -53
  249. package/dist/types/appstate/WaAppStateCrypto.d.ts +0 -1
  250. package/dist/types/appstate/WaAppStateSyncClient.d.ts +5 -2
  251. package/dist/types/appstate/constants.d.ts +1 -0
  252. package/dist/types/appstate/store/sqlite.d.ts +4 -18
  253. package/dist/types/appstate/utils.d.ts +0 -1
  254. package/dist/types/auth/WaAuthClient.d.ts +10 -12
  255. package/dist/types/auth/index.d.ts +0 -2
  256. package/dist/types/auth/pairing/WaQrFlow.d.ts +1 -1
  257. package/dist/types/auth/types.d.ts +6 -9
  258. package/dist/types/client/WaClient.d.ts +27 -25
  259. package/dist/types/client/WaClientFactory.d.ts +22 -23
  260. package/dist/types/client/connection/WaConnectionManager.d.ts +64 -0
  261. package/dist/types/client/connection/WaKeyShareCoordinator.d.ts +14 -0
  262. package/dist/types/client/connection/WaReceiptQueue.d.ts +13 -0
  263. package/dist/types/client/coordinators/WaAppStateMutationCoordinator.d.ts +46 -0
  264. package/dist/types/client/coordinators/WaIncomingNodeCoordinator.d.ts +0 -1
  265. package/dist/types/client/coordinators/WaMessageDispatchCoordinator.d.ts +18 -41
  266. package/dist/types/client/coordinators/WaRetryCoordinator.d.ts +2 -0
  267. package/dist/types/client/dirty.d.ts +1 -0
  268. package/dist/types/client/events/group.d.ts +2 -1
  269. package/dist/types/client/index.d.ts +1 -1
  270. package/dist/types/client/messaging/fanout.d.ts +14 -0
  271. package/dist/types/client/messaging/key-protocol.d.ts +18 -0
  272. package/dist/types/client/messaging/participants.d.ts +13 -0
  273. package/dist/types/client/types.d.ts +24 -1
  274. package/dist/types/crypto/core/hkdf.d.ts +0 -6
  275. package/dist/types/crypto/core/index.d.ts +0 -1
  276. package/dist/types/crypto/core/random.d.ts +1 -7
  277. package/dist/types/crypto/index.d.ts +0 -2
  278. package/dist/types/index.d.ts +1 -1
  279. package/dist/types/infra/log/ConsoleLogger.d.ts +2 -1
  280. package/dist/types/infra/log/PinoLogger.d.ts +1 -1
  281. package/dist/types/infra/log/types.d.ts +1 -0
  282. package/dist/types/infra/perf/BoundedTaskQueue.d.ts +1 -1
  283. package/dist/types/media/WaMediaTransferClient.d.ts +13 -3
  284. package/dist/types/media/types.d.ts +5 -0
  285. package/dist/types/message/addon-crypto.d.ts +25 -0
  286. package/dist/types/message/index.d.ts +2 -0
  287. package/dist/types/message/reporting-token.d.ts +19 -0
  288. package/dist/types/message/use-case-secret.d.ts +20 -0
  289. package/dist/types/protocol/appstate.d.ts +58 -0
  290. package/dist/types/protocol/constants.d.ts +2 -1
  291. package/dist/types/protocol/index.d.ts +2 -10
  292. package/dist/types/protocol/jid.d.ts +3 -3
  293. package/dist/types/protocol/nodes.d.ts +2 -0
  294. package/dist/types/protocol/usync.d.ts +11 -0
  295. package/dist/types/retry/index.d.ts +1 -0
  296. package/dist/types/retry/replay.d.ts +0 -4
  297. package/dist/types/retry/tracker.d.ts +19 -0
  298. package/dist/types/retry/types.d.ts +4 -3
  299. package/dist/types/signal/api/SignalDeviceSyncApi.d.ts +13 -1
  300. package/dist/types/signal/group/SenderKeyCodec.d.ts +4 -6
  301. package/dist/types/signal/index.d.ts +1 -0
  302. package/dist/types/signal/session/SignalProtocol.d.ts +9 -0
  303. package/dist/types/signal/session/resolver.d.ts +17 -0
  304. package/dist/types/store/contracts/appstate.store.d.ts +3 -0
  305. package/dist/types/store/contracts/contact.store.d.ts +1 -0
  306. package/dist/types/store/contracts/device-list.store.d.ts +0 -3
  307. package/dist/types/store/contracts/message.store.d.ts +1 -0
  308. package/dist/types/store/contracts/participants.store.d.ts +0 -1
  309. package/dist/types/store/contracts/sender-key.store.d.ts +0 -1
  310. package/dist/types/store/contracts/signal.store.d.ts +6 -0
  311. package/dist/types/store/contracts/thread.store.d.ts +1 -0
  312. package/dist/types/store/index.d.ts +1 -1
  313. package/dist/types/store/providers/memory/appstate.store.d.ts +2 -0
  314. package/dist/types/store/providers/memory/contact.store.d.ts +1 -0
  315. package/dist/types/store/providers/memory/device-list.store.d.ts +0 -3
  316. package/dist/types/store/providers/memory/message.store.d.ts +1 -0
  317. package/dist/types/store/providers/memory/participants.store.d.ts +0 -1
  318. package/dist/types/store/providers/memory/sender-key.store.d.ts +0 -1
  319. package/dist/types/store/providers/memory/signal.store.d.ts +6 -0
  320. package/dist/types/store/providers/memory/thread.store.d.ts +1 -0
  321. package/dist/types/store/providers/sqlite/appstate.store.d.ts +2 -0
  322. package/dist/types/store/providers/sqlite/contact.store.d.ts +2 -0
  323. package/dist/types/store/providers/sqlite/device-list.store.d.ts +0 -3
  324. package/dist/types/store/providers/sqlite/message.store.d.ts +2 -0
  325. package/dist/types/store/providers/sqlite/participants.store.d.ts +0 -1
  326. package/dist/types/store/providers/sqlite/retry.store.d.ts +0 -1
  327. package/dist/types/store/providers/sqlite/sender-key.store.d.ts +0 -1
  328. package/dist/types/store/providers/sqlite/signal.store.d.ts +7 -0
  329. package/dist/types/store/providers/sqlite/table-names.d.ts +5 -0
  330. package/dist/types/store/providers/sqlite/thread.store.d.ts +2 -0
  331. package/dist/types/store/types.d.ts +3 -0
  332. package/dist/types/transport/WaWebSocket.d.ts +3 -0
  333. package/dist/types/transport/index.d.ts +2 -1
  334. package/dist/types/transport/keepalive/WaKeepAlive.d.ts +0 -1
  335. package/dist/types/transport/node/WaNodeTransport.d.ts +0 -9
  336. package/dist/types/transport/node/builders/group.d.ts +4 -6
  337. package/dist/types/transport/node/builders/index.d.ts +2 -1
  338. package/dist/types/transport/node/builders/message.d.ts +14 -25
  339. package/dist/types/transport/node/builders/retry.d.ts +2 -4
  340. package/dist/types/transport/node/builders/usync.d.ts +21 -0
  341. package/dist/types/transport/node/helpers.d.ts +8 -0
  342. package/dist/types/transport/node/usync.d.ts +2 -0
  343. package/dist/types/transport/noise/WaFrameCodec.d.ts +3 -0
  344. package/dist/types/transport/noise/WaNoiseSession.d.ts +1 -0
  345. package/dist/types/transport/proxy.d.ts +6 -0
  346. package/dist/types/transport/stream/parse.d.ts +0 -1
  347. package/dist/types/transport/types.d.ts +18 -1
  348. package/dist/types/util/bytes.d.ts +5 -0
  349. package/dist/types/util/primitives.d.ts +3 -0
  350. package/dist/util/bytes.js +55 -33
  351. package/dist/util/coercion.js +6 -14
  352. package/dist/util/primitives.js +42 -14
  353. package/package.json +26 -5
  354. package/dist/crypto/core/encoding.js +0 -29
  355. package/dist/esm/crypto/core/encoding.js +0 -25
  356. package/dist/esm/util/base64.js +0 -18
  357. package/dist/esm/util/signal-address.js +0 -5
  358. package/dist/types/crypto/core/encoding.d.ts +0 -11
  359. package/dist/types/util/base64.d.ts +0 -4
  360. package/dist/types/util/signal-address.d.ts +0 -2
  361. package/dist/util/base64.js +0 -24
  362. package/dist/util/signal-address.js +0 -8
  363. /package/dist/types/transport/node/builders/{accountSync.d.ts → account-sync.d.ts} +0 -0
@@ -13,12 +13,16 @@ const keygen_1 = require("../../signal/registration/keygen");
13
13
  const message_1 = require("../../transport/node/builders/message");
14
14
  const retry_1 = require("../../transport/node/builders/retry");
15
15
  const primitives_1 = require("../../util/primitives");
16
+ const RETRY_CLEANUP_INTERVAL_MS = 30000;
16
17
  function getRetryReasonName(code) {
17
18
  if (code === undefined) {
18
19
  return undefined;
19
20
  }
20
- const entry = Object.entries(constants_2.RETRY_REASON).find(([, value]) => value === code);
21
- return entry ? entry[0] : 'unknown';
21
+ for (const reasonName in constants_2.RETRY_REASON) {
22
+ if (constants_2.RETRY_REASON[reasonName] === code)
23
+ return reasonName;
24
+ }
25
+ return 'unknown';
22
26
  }
23
27
  function getRemoteRetryReasonLogFields(reason) {
24
28
  return {
@@ -29,6 +33,7 @@ function getRemoteRetryReasonLogFields(reason) {
29
33
  }
30
34
  class WaRetryCoordinator {
31
35
  constructor(options) {
36
+ this.nextRetryCleanupAtMs = 0;
32
37
  this.logger = options.logger;
33
38
  this.retryStore = options.retryStore;
34
39
  this.retryTtlMs = this.retryStore.getTtlMs?.() ?? constants_2.RETRY_OUTBOUND_TTL_MS;
@@ -75,7 +80,7 @@ class WaRetryCoordinator {
75
80
  return;
76
81
  }
77
82
  try {
78
- await this.retryStore.cleanupExpired(Date.now());
83
+ await this.maybeCleanupRetryStore(Date.now());
79
84
  const request = (0, parse_1.parseRetryReceiptRequest)(receiptNode);
80
85
  if (!request) {
81
86
  return;
@@ -100,10 +105,7 @@ class WaRetryCoordinator {
100
105
  }
101
106
  async prepareDecryptFailureRetry(context, error) {
102
107
  const nowMs = Date.now();
103
- const [, registrationInfo] = await Promise.all([
104
- this.retryStore.cleanupExpired(nowMs),
105
- this.signalStore.getRegistrationInfo()
106
- ]);
108
+ const registrationInfo = await this.signalStore.getRegistrationInfo();
107
109
  if (!registrationInfo) {
108
110
  this.logger.warn('retry receipt skipped: missing local registration info', {
109
111
  id: context.stanzaId,
@@ -198,6 +200,21 @@ class WaRetryCoordinator {
198
200
  });
199
201
  return null;
200
202
  }
203
+ let requesterAddress;
204
+ let requesterNormalizedDeviceJid;
205
+ try {
206
+ requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
207
+ requesterNormalizedDeviceJid = (0, jid_1.normalizeDeviceJid)(requesterJid);
208
+ }
209
+ catch (error) {
210
+ this.logger.info('retry request rejected: invalid requester jid', {
211
+ id: request.stanzaId,
212
+ originalMsgId: request.originalMsgId,
213
+ requester: requesterJid,
214
+ message: (0, primitives_1.toError)(error).message
215
+ });
216
+ return null;
217
+ }
201
218
  if (request.retryCount >= constants_2.MAX_RETRY_ATTEMPTS) {
202
219
  this.logger.info('retry request rejected: retry count exceeded', {
203
220
  id: request.stanzaId,
@@ -217,7 +234,7 @@ class WaRetryCoordinator {
217
234
  });
218
235
  return null;
219
236
  }
220
- const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid);
237
+ const sessionReady = await this.updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
221
238
  if (!sessionReady) {
222
239
  this.logger.info('retry request rejected: missing compatible session', {
223
240
  id: request.stanzaId,
@@ -228,7 +245,7 @@ class WaRetryCoordinator {
228
245
  });
229
246
  return null;
230
247
  }
231
- const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid);
248
+ const authorization = await this.authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid);
232
249
  if (!authorization.authorized) {
233
250
  this.logger.info('retry request rejected', {
234
251
  id: request.stanzaId,
@@ -242,6 +259,8 @@ class WaRetryCoordinator {
242
259
  }
243
260
  return {
244
261
  requesterJid,
262
+ requesterAddress,
263
+ requesterNormalizedDeviceJid,
245
264
  outbound
246
265
  };
247
266
  }
@@ -274,7 +293,7 @@ class WaRetryCoordinator {
274
293
  }
275
294
  async runRetryTaskSerialized(messageId, task) {
276
295
  const previous = this.retryProcessingByMessageId.get(messageId) ?? Promise.resolve();
277
- const current = previous.catch(() => undefined).then(async () => task());
296
+ const current = previous.then(task, task);
278
297
  const tracker = current.then(() => undefined, () => undefined);
279
298
  this.retryProcessingByMessageId.set(messageId, tracker);
280
299
  try {
@@ -314,18 +333,17 @@ class WaRetryCoordinator {
314
333
  : undefined
315
334
  };
316
335
  }
317
- async updateLocalSessionFromRetryRequest(request, requesterJid) {
318
- await this.markRetryRequesterSenderKeyAsStale(request, requesterJid);
319
- const address = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
320
- const currentSession = await this.signalStore.getSession(address);
336
+ async updateLocalSessionFromRetryRequest(request, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
337
+ await this.markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress);
338
+ const currentSession = await this.signalStore.getSession(requesterAddress);
321
339
  if (currentSession && request.regId > 0 && currentSession.remote.regId !== request.regId) {
322
- await this.signalStore.deleteSession(address);
340
+ await this.signalStore.deleteSession(requesterAddress);
323
341
  }
324
342
  if (request.keyBundle) {
325
- if (!request.keyBundle.key) {
343
+ if (!request.keyBundle.key || !request.keyBundle.skey.signature) {
326
344
  return false;
327
345
  }
328
- await this.signalProtocol.establishOutgoingSession(address, {
346
+ await this.signalProtocol.establishOutgoingSession(requesterAddress, {
329
347
  regId: request.regId,
330
348
  identity: request.keyBundle.identity,
331
349
  signedKey: {
@@ -340,23 +358,22 @@ class WaRetryCoordinator {
340
358
  });
341
359
  return true;
342
360
  }
343
- const hasSession = await this.signalProtocol.hasSession(address);
361
+ const hasSession = await this.signalProtocol.hasSession(requesterAddress);
344
362
  if (hasSession) {
345
363
  return true;
346
364
  }
347
- const fetched = await this.fetchMissingPreKeysSession(requesterJid, request.regId);
365
+ const fetched = await this.fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, request.regId);
348
366
  if (!fetched) {
349
367
  return false;
350
368
  }
351
- await this.signalProtocol.establishOutgoingSession(address, fetched);
369
+ await this.signalProtocol.establishOutgoingSession(requesterAddress, fetched);
352
370
  return true;
353
371
  }
354
- async markRetryRequesterSenderKeyAsStale(request, requesterJid) {
372
+ async markRetryRequesterSenderKeyAsStale(request, requesterJid, requesterAddress) {
355
373
  if (!(0, jid_1.isGroupOrBroadcastJid)(request.from)) {
356
374
  return;
357
375
  }
358
376
  try {
359
- const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
360
377
  const deleted = await this.senderKeyStore.markForgetSenderKey(request.from, [
361
378
  requesterAddress
362
379
  ]);
@@ -374,12 +391,11 @@ class WaRetryCoordinator {
374
391
  });
375
392
  }
376
393
  }
377
- async fetchMissingPreKeysSession(requesterJid, requesterRegistrationId) {
394
+ async fetchMissingPreKeysSession(requesterJid, requesterAddress, requesterNormalizedDeviceJid, requesterRegistrationId) {
378
395
  try {
379
- const requesterAddress = (0, jid_1.parseSignalAddressFromJid)(requesterJid);
380
396
  const results = await this.signalMissingPreKeysSync.fetchMissingPreKeys([
381
397
  {
382
- userJid: (0, jid_1.toUserJid)(requesterJid),
398
+ userJid: `${requesterAddress.user}@${requesterAddress.server}`,
383
399
  devices: [
384
400
  {
385
401
  deviceId: requesterAddress.device,
@@ -396,8 +412,7 @@ class WaRetryCoordinator {
396
412
  });
397
413
  return null;
398
414
  }
399
- const requesterDeviceJid = (0, jid_1.normalizeDeviceJid)(requesterJid);
400
- const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterDeviceJid);
415
+ const matched = first.devices.find((device) => (0, jid_1.normalizeDeviceJid)(device.deviceJid) === requesterNormalizedDeviceJid);
401
416
  if (!matched) {
402
417
  this.logger.warn('missing prekeys fetch did not return requested device', {
403
418
  requester: requesterJid,
@@ -415,7 +430,7 @@ class WaRetryCoordinator {
415
430
  return null;
416
431
  }
417
432
  }
418
- async authorizeRetryRequest(request, outbound, requesterJid) {
433
+ async authorizeRetryRequest(request, outbound, requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
419
434
  if (outbound.state === 'ineligible') {
420
435
  return { authorized: false, reason: `state_${outbound.state}` };
421
436
  }
@@ -423,25 +438,29 @@ class WaRetryCoordinator {
423
438
  if (!isGroupOutbound && (outbound.state === 'read' || outbound.state === 'played')) {
424
439
  return { authorized: false, reason: `state_${outbound.state}` };
425
440
  }
426
- const requesterAuthorized = await this.isRequesterAuthorizedDevice(requesterJid);
441
+ const requesterAuthorized = await this.isRequesterAuthorizedDevice(requesterJid, requesterAddress, requesterNormalizedDeviceJid);
427
442
  if (!requesterAuthorized) {
428
443
  return { authorized: false, reason: 'requester_device_not_authorized' };
429
444
  }
430
445
  return { authorized: true };
431
446
  }
432
- async isRequesterAuthorizedDevice(requesterJid) {
447
+ async isRequesterAuthorizedDevice(requesterJid, requesterAddress, requesterNormalizedDeviceJid) {
433
448
  try {
434
- const requesterUser = (0, jid_1.toUserJid)(requesterJid);
449
+ const requesterUser = `${requesterAddress.user}@${requesterAddress.server}`;
450
+ if (requesterNormalizedDeviceJid === (0, jid_1.normalizeDeviceJid)(requesterUser)) {
451
+ return true;
452
+ }
435
453
  const synced = await this.signalDeviceSync.syncDeviceList([requesterUser]);
436
454
  const target = synced.find((entry) => entry.jid === requesterUser);
437
- const authorized = new Set();
438
- authorized.add((0, jid_1.normalizeDeviceJid)(requesterUser));
439
- if (target) {
440
- for (let index = 0; index < target.deviceJids.length; index += 1) {
441
- authorized.add((0, jid_1.normalizeDeviceJid)(target.deviceJids[index]));
455
+ if (!target) {
456
+ return false;
457
+ }
458
+ for (let index = 0; index < target.deviceJids.length; index += 1) {
459
+ if ((0, jid_1.normalizeDeviceJid)(target.deviceJids[index]) === requesterNormalizedDeviceJid) {
460
+ return true;
442
461
  }
443
462
  }
444
- return authorized.has((0, jid_1.normalizeDeviceJid)(requesterJid));
463
+ return false;
445
464
  }
446
465
  catch (error) {
447
466
  this.logger.warn('retry authorization failed while syncing requester device list', {
@@ -490,5 +509,19 @@ class WaRetryCoordinator {
490
509
  });
491
510
  }
492
511
  }
512
+ async maybeCleanupRetryStore(nowMs) {
513
+ if (nowMs < this.nextRetryCleanupAtMs) {
514
+ return;
515
+ }
516
+ this.nextRetryCleanupAtMs = nowMs + RETRY_CLEANUP_INTERVAL_MS;
517
+ try {
518
+ await this.retryStore.cleanupExpired(nowMs);
519
+ }
520
+ catch (error) {
521
+ this.logger.warn('retry store cleanup failed', {
522
+ message: (0, primitives_1.toError)(error).message
523
+ });
524
+ }
525
+ }
493
526
  }
494
527
  exports.WaRetryCoordinator = WaRetryCoordinator;
@@ -2,13 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseDirtyBits = parseDirtyBits;
4
4
  exports.handleDirtyBits = handleDirtyBits;
5
- const _crypto_1 = require("../crypto/index.js");
6
5
  const constants_1 = require("../protocol/constants");
7
6
  const jid_1 = require("../protocol/jid");
8
- const accountSync_1 = require("../transport/node/builders/accountSync");
7
+ const account_sync_1 = require("../transport/node/builders/account-sync");
9
8
  const helpers_1 = require("../transport/node/helpers");
10
9
  const query_1 = require("../transport/node/query");
11
- const bytes_1 = require("../util/bytes");
12
10
  const primitives_1 = require("../util/primitives");
13
11
  const SUPPORTED_DIRTY_TYPES = new Set(constants_1.WA_SUPPORTED_DIRTY_TYPES);
14
12
  const ACCOUNT_SYNC_PROTOCOL_SET = new Set(constants_1.WA_ACCOUNT_SYNC_PROTOCOLS);
@@ -22,19 +20,13 @@ function parseDirtyBitNode(node, logger) {
22
20
  });
23
21
  return null;
24
22
  }
25
- const protocols = (0, helpers_1.getNodeChildren)(node).map((child) => child.tag);
23
+ const protocols = (0, helpers_1.getNodeChildrenTags)(node);
26
24
  return {
27
25
  type,
28
26
  timestamp,
29
27
  protocols
30
28
  };
31
29
  }
32
- function splitDirtyBitsBySupport(dirtyBits) {
33
- return {
34
- supported: dirtyBits.filter((dirtyBit) => SUPPORTED_DIRTY_TYPES.has(dirtyBit.type)),
35
- unsupported: dirtyBits.filter((dirtyBit) => !SUPPORTED_DIRTY_TYPES.has(dirtyBit.type))
36
- };
37
- }
38
30
  function resolveAccountSyncProtocols(protocols) {
39
31
  const selected = protocols.filter((protocol) => ACCOUNT_SYNC_PROTOCOL_SET.has(protocol));
40
32
  if (selected.length > 0) {
@@ -43,9 +35,15 @@ function resolveAccountSyncProtocols(protocols) {
43
35
  return constants_1.WA_ACCOUNT_SYNC_PROTOCOLS;
44
36
  }
45
37
  function parseDirtyBits(nodes, logger) {
46
- return nodes
47
- .map((node) => parseDirtyBitNode(node, logger))
48
- .filter((dirtyBit) => dirtyBit !== null);
38
+ const parsed = [];
39
+ for (const node of nodes) {
40
+ const dirtyBit = parseDirtyBitNode(node, logger);
41
+ if (!dirtyBit) {
42
+ continue;
43
+ }
44
+ parsed.push(dirtyBit);
45
+ }
46
+ return parsed;
49
47
  }
50
48
  async function handleDirtyBits(runtime, dirtyBits) {
51
49
  const meJid = runtime.getCurrentCredentials()?.meJid ?? null;
@@ -53,22 +51,33 @@ async function handleDirtyBits(runtime, dirtyBits) {
53
51
  runtime.logger.trace('dirty bits skipped: session is not registered');
54
52
  return;
55
53
  }
56
- const { supported, unsupported } = splitDirtyBitsBySupport(dirtyBits);
54
+ const supported = [];
55
+ const unsupported = [];
56
+ for (const dirtyBit of dirtyBits) {
57
+ if (SUPPORTED_DIRTY_TYPES.has(dirtyBit.type)) {
58
+ supported.push(dirtyBit);
59
+ continue;
60
+ }
61
+ unsupported.push(dirtyBit);
62
+ }
57
63
  runtime.logger.info('handling dirty bits from info bulletin', {
58
64
  supported: supported.map((entry) => entry.type).join(','),
59
65
  unsupported: unsupported.map((entry) => entry.type).join(',')
60
66
  });
61
- const handledSupported = (await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)))).flatMap((result, index) => {
67
+ const clearableDirtyBits = [...unsupported];
68
+ const settledSupported = await Promise.allSettled(supported.map(async (dirtyBit) => handleDirtyBit(runtime, dirtyBit)));
69
+ for (let index = 0; index < settledSupported.length; index += 1) {
70
+ const result = settledSupported[index];
62
71
  if (result.status === 'fulfilled') {
63
- return [supported[index]];
72
+ clearableDirtyBits.push(supported[index]);
73
+ continue;
64
74
  }
65
75
  runtime.logger.warn('failed handling dirty bit', {
66
76
  type: supported[index].type,
67
77
  message: (0, primitives_1.toError)(result.reason).message
68
78
  });
69
- return [];
70
- });
71
- await clearDirtyBits(runtime, unsupported.concat(handledSupported));
79
+ }
80
+ await clearDirtyBits(runtime, clearableDirtyBits);
72
81
  }
73
82
  async function handleDirtyBit(runtime, dirtyBit) {
74
83
  switch (dirtyBit.type) {
@@ -153,7 +162,7 @@ async function syncAccountDevicesDirtyBit(runtime) {
153
162
  }
154
163
  await runSyncQuery(runtime, {
155
164
  queryContext: 'account_sync.devices',
156
- node: (0, accountSync_1.buildAccountDevicesSyncIq)(userJids, await generateUsyncSid()),
165
+ node: (0, account_sync_1.buildAccountDevicesSyncIq)(userJids, await runtime.generateUsyncSid()),
157
166
  logMessage: 'account_sync devices synchronized',
158
167
  contextData: { meJid, targets: userJids.join(',') }
159
168
  });
@@ -165,7 +174,7 @@ async function syncAccountPictureDirtyBit(runtime) {
165
174
  return;
166
175
  }
167
176
  const targetJid = (0, jid_1.toUserJid)(meJid);
168
- const response = await runtime.queryWithContext('account_sync.picture', (0, accountSync_1.buildAccountPictureSyncIq)(targetJid), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, { meJid, target: targetJid });
177
+ const response = await runtime.queryWithContext('account_sync.picture', (0, account_sync_1.buildAccountPictureSyncIq)(targetJid), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, { meJid, target: targetJid });
169
178
  if (response.tag !== 'iq') {
170
179
  throw new Error(`account_sync.picture returned non-iq node (${response.tag})`);
171
180
  }
@@ -191,14 +200,14 @@ async function syncAccountPictureDirtyBit(runtime) {
191
200
  async function syncAccountPrivacyDirtyBit(runtime) {
192
201
  await runSyncQuery(runtime, {
193
202
  queryContext: 'account_sync.privacy',
194
- node: (0, accountSync_1.buildAccountPrivacySyncIq)(),
203
+ node: (0, account_sync_1.buildAccountPrivacySyncIq)(),
195
204
  logMessage: 'account_sync privacy synchronized'
196
205
  });
197
206
  }
198
207
  async function syncAccountBlocklistDirtyBit(runtime) {
199
208
  await runSyncQuery(runtime, {
200
209
  queryContext: 'account_sync.blocklist',
201
- node: (0, accountSync_1.buildAccountBlocklistSyncIq)(),
210
+ node: (0, account_sync_1.buildAccountBlocklistSyncIq)(),
202
211
  logMessage: 'account_sync blocklist synchronized'
203
212
  });
204
213
  }
@@ -209,16 +218,13 @@ async function syncGroupsDirtyBit(runtime) {
209
218
  await runSyncQuery(runtime, {
210
219
  queryContext: 'dirty.groups',
211
220
  assertContext: 'groups',
212
- node: (0, accountSync_1.buildGroupsDirtySyncIq)(),
221
+ node: (0, account_sync_1.buildGroupsDirtySyncIq)(),
213
222
  logMessage: 'groups dirty sync completed'
214
223
  });
215
224
  }
216
225
  async function syncNewsletterMetadataDirtyBit(runtime) {
217
226
  runtime.logger.info('newsletter_metadata dirty bit received (GraphQL/MEX sync intentionally disabled)');
218
- await runtime.queryWithContext('dirty.newsletter_metadata', (0, accountSync_1.buildNewsletterMetadataSyncIq)(), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS);
219
- }
220
- async function generateUsyncSid() {
221
- return (0, bytes_1.bytesToHex)(await (0, _crypto_1.randomBytesAsync)(8));
227
+ await runtime.queryWithContext('dirty.newsletter_metadata', (0, account_sync_1.buildNewsletterMetadataSyncIq)(), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS);
222
228
  }
223
229
  function resolveAccountSyncDeviceTargets(credentials) {
224
230
  if (!credentials?.meJid) {
@@ -238,7 +244,7 @@ async function runSyncQuery(runtime, args) {
238
244
  }
239
245
  async function clearDirtyBits(runtime, dirtyBits) {
240
246
  try {
241
- await runtime.queryWithContext('dirty.clear', (0, accountSync_1.buildClearDirtyBitsIq)(dirtyBits), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, {
247
+ await runtime.queryWithContext('dirty.clear', (0, account_sync_1.buildClearDirtyBitsIq)(dirtyBits), constants_1.WA_DEFAULTS.IQ_TIMEOUT_MS, {
242
248
  count: dirtyBits.length
243
249
  });
244
250
  runtime.logger.info('dirty bits cleared', {
@@ -78,8 +78,7 @@ function parseChatEventFromAppStateMutation(mutation) {
78
78
  ...pickOptionalPrimitive('deviceAgentId', value.chatAssignment.deviceAgentID, 'string')
79
79
  };
80
80
  }
81
- const fallbackAction = normalizeIndexAction(parsedIndex?.action) ??
82
- normalizeValueActionKey(syncActionValueKey);
81
+ const fallbackAction = normalizeIndexAction(parsedIndex?.action) ?? normalizeValueActionKey(syncActionValueKey);
83
82
  if (!fallbackAction) {
84
83
  return null;
85
84
  }
@@ -204,10 +203,12 @@ function extractChatJid(parts) {
204
203
  return undefined;
205
204
  }
206
205
  function findPresentSyncActionValueKey(value) {
207
- for (const [key, keyValue] of Object.entries(value)) {
206
+ const valueRecord = value;
207
+ for (const key in valueRecord) {
208
208
  if (key === 'timestamp') {
209
209
  continue;
210
210
  }
211
+ const keyValue = valueRecord[key];
211
212
  if (keyValue === null || keyValue === undefined) {
212
213
  continue;
213
214
  }
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseParticipants = parseParticipants;
3
4
  exports.parseGroupNotificationEvents = parseGroupNotificationEvents;
4
5
  const constants_1 = require("../../protocol/constants");
5
6
  const nodes_1 = require("../../protocol/nodes");
6
7
  const helpers_1 = require("../../transport/node/helpers");
7
- const parse_1 = require("../../transport/stream/parse");
8
8
  const bytes_1 = require("../../util/bytes");
9
+ const primitives_1 = require("../../util/primitives");
9
10
  function readNodeTextContent(node) {
10
11
  if (!node) {
11
12
  return undefined;
@@ -19,30 +20,42 @@ function readNodeTextContent(node) {
19
20
  return undefined;
20
21
  }
21
22
  function parseParticipants(node) {
22
- return (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.PARTICIPANT).map((participantNode) => ({
23
- jid: participantNode.attrs.jid,
24
- role: participantNode.attrs.type,
25
- lidJid: participantNode.attrs.lid,
26
- phoneJid: participantNode.attrs.phone_number,
27
- displayName: participantNode.attrs.display_name,
28
- username: participantNode.attrs.username,
29
- expirationSeconds: (0, parse_1.parseOptionalInt)(participantNode.attrs.expiration)
30
- }));
23
+ const participants = [];
24
+ for (const participantNode of (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.PARTICIPANT)) {
25
+ participants.push({
26
+ jid: participantNode.attrs.jid,
27
+ role: participantNode.attrs.type,
28
+ lidJid: participantNode.attrs.lid,
29
+ phoneJid: participantNode.attrs.phone_number,
30
+ displayName: participantNode.attrs.display_name,
31
+ username: participantNode.attrs.username,
32
+ expirationSeconds: (0, primitives_1.parseOptionalInt)(participantNode.attrs.expiration)
33
+ });
34
+ }
35
+ return participants;
31
36
  }
32
37
  function parseLinkedGroups(node) {
33
- return (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.GROUP).map((groupNode) => ({
34
- jid: groupNode.attrs.jid,
35
- subject: groupNode.attrs.subject,
36
- subjectTimestampSeconds: (0, parse_1.parseOptionalInt)(groupNode.attrs.s_t),
37
- hiddenSubgroup: (0, helpers_1.findNodeChild)(groupNode, 'hidden_group') !== undefined
38
- }));
38
+ const groups = [];
39
+ for (const groupNode of (0, helpers_1.getNodeChildrenByTag)(node, nodes_1.WA_NODE_TAGS.GROUP)) {
40
+ groups.push({
41
+ jid: groupNode.attrs.jid,
42
+ subject: groupNode.attrs.subject,
43
+ subjectTimestampSeconds: (0, primitives_1.parseOptionalInt)(groupNode.attrs.s_t),
44
+ hiddenSubgroup: (0, helpers_1.findNodeChild)(groupNode, 'hidden_group') !== undefined
45
+ });
46
+ }
47
+ return groups;
39
48
  }
40
49
  function parseMembershipRequests(node) {
41
- return (0, helpers_1.getNodeChildrenByTag)(node, 'requested_user').map((requestNode) => ({
42
- jid: requestNode.attrs.jid,
43
- username: requestNode.attrs.username,
44
- phoneJid: requestNode.attrs.phone_number
45
- }));
50
+ const requests = [];
51
+ for (const requestNode of (0, helpers_1.getNodeChildrenByTag)(node, 'requested_user')) {
52
+ requests.push({
53
+ jid: requestNode.attrs.jid,
54
+ username: requestNode.attrs.username,
55
+ phoneJid: requestNode.attrs.phone_number
56
+ });
57
+ }
58
+ return requests;
46
59
  }
47
60
  function parseSubgroupSuggestion(node) {
48
61
  const subjectNode = (0, helpers_1.findNodeChild)(node, nodes_1.WA_NODE_TAGS.SUBJECT);
@@ -57,20 +70,26 @@ function parseSubgroupSuggestion(node) {
57
70
  ownerJid: node.attrs.creator,
58
71
  subject: readNodeTextContent(subjectNode),
59
72
  description: readNodeTextContent(descriptionBodyNode),
60
- timestampSeconds: (0, parse_1.parseOptionalInt)(node.attrs.creation),
73
+ timestampSeconds: (0, primitives_1.parseOptionalInt)(node.attrs.creation),
61
74
  isExistingGroup: readNodeTextContent(isExistingGroupNode) === undefined
62
75
  ? undefined
63
76
  : readNodeTextContent(isExistingGroupNode) === 'true',
64
77
  participantCount: participantCountNode
65
- ? (0, parse_1.parseOptionalInt)(readNodeTextContent(participantCountNode))
78
+ ? (0, primitives_1.parseOptionalInt)(readNodeTextContent(participantCountNode))
66
79
  : undefined,
67
80
  reason: node.attrs.reason
68
81
  };
69
82
  }
70
83
  function parseSubgroupSuggestions(node) {
71
- return (0, helpers_1.getNodeChildrenByTag)(node, 'sub_group_suggestion')
72
- .map(parseSubgroupSuggestion)
73
- .filter((suggestion) => suggestion !== null);
84
+ const suggestions = [];
85
+ for (const suggestionNode of (0, helpers_1.getNodeChildrenByTag)(node, 'sub_group_suggestion')) {
86
+ const suggestion = parseSubgroupSuggestion(suggestionNode);
87
+ if (!suggestion) {
88
+ continue;
89
+ }
90
+ suggestions.push(suggestion);
91
+ }
92
+ return suggestions;
74
93
  }
75
94
  function createBaseGroupEvent(notificationNode, actionNode) {
76
95
  return {
@@ -81,7 +100,7 @@ function createBaseGroupEvent(notificationNode, actionNode) {
81
100
  stanzaType: notificationNode.attrs.type,
82
101
  groupJid: notificationNode.attrs.from,
83
102
  authorJid: notificationNode.attrs.participant,
84
- timestampSeconds: (0, parse_1.parseOptionalInt)(notificationNode.attrs.t)
103
+ timestampSeconds: (0, primitives_1.parseOptionalInt)(notificationNode.attrs.t)
85
104
  };
86
105
  }
87
106
  function createUnhandledStanzaEvent(notificationNode, reason) {
@@ -121,7 +140,7 @@ function parseCreateGroupAction(notificationNode, actionNode) {
121
140
  creatorPhoneJid: groupNode.attrs.creator_pn,
122
141
  creatorUsername: groupNode.attrs.creator_username,
123
142
  creatorCountryCode: groupNode.attrs.creator_country_code,
124
- creationSeconds: (0, parse_1.parseOptionalInt)(groupNode.attrs.creation),
143
+ creationSeconds: (0, primitives_1.parseOptionalInt)(groupNode.attrs.creation),
125
144
  announceEnabled: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.ANNOUNCEMENT) !== undefined,
126
145
  restrictEnabled: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.LOCKED) !== undefined,
127
146
  noFrequentlyForwardedEnabled: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.NO_FREQUENTLY_FORWARDED) !==
@@ -135,12 +154,11 @@ function parseCreateGroupAction(notificationNode, actionNode) {
135
154
  hasCapi: (0, helpers_1.findNodeChild)(groupNode, 'capi') !== undefined,
136
155
  limitSharingEnabled: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.LIMIT_SHARING_ENABLED) !==
137
156
  undefined,
138
- size: (0, parse_1.parseOptionalInt)(groupNode.attrs.size),
139
- ephemeralDuration: (0, parse_1.parseOptionalInt)((0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.EPHEMERAL)?.attrs.expiration),
157
+ size: (0, primitives_1.parseOptionalInt)(groupNode.attrs.size),
158
+ ephemeralDuration: (0, primitives_1.parseOptionalInt)((0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.EPHEMERAL)?.attrs.expiration),
140
159
  disappearingTrigger: (0, helpers_1.findNodeChild)(groupNode, nodes_1.WA_NODE_TAGS.EPHEMERAL)?.attrs.trigger,
141
160
  membershipApprovalEnabled: groupJoinNode?.attrs.state === 'on',
142
- allowNonAdminSubGroupCreation: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.ALLOW_NON_ADMIN_SUB_GROUP_CREATION) !==
143
- undefined,
161
+ allowNonAdminSubGroupCreation: (0, helpers_1.findNodeChild)(groupNode, constants_1.WA_GROUP_NOTIFICATION_TAGS.ALLOW_NON_ADMIN_SUB_GROUP_CREATION) !== undefined,
144
162
  linkedParentGroupJid: (0, helpers_1.findNodeChild)(groupNode, 'linked_parent')?.attrs.jid ??
145
163
  (0, helpers_1.findNodeChild)(groupNode, 'parent')?.attrs.jid
146
164
  }
@@ -212,7 +230,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
212
230
  details: {
213
231
  subjectOwnerPhoneJid: actionNode.attrs.s_o_pn,
214
232
  subjectOwnerUsername: actionNode.attrs.s_o_username,
215
- subjectTimestampSeconds: (0, parse_1.parseOptionalInt)(actionNode.attrs.s_t)
233
+ subjectTimestampSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.s_t)
216
234
  }
217
235
  };
218
236
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.DESCRIPTION: {
@@ -227,7 +245,12 @@ function parseGroupActionNode(notificationNode, actionNode) {
227
245
  };
228
246
  }
229
247
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.LOCKED:
230
- return { ...baseEvent, action: 'restrict', enabled: true, mode: actionNode.attrs.threshold };
248
+ return {
249
+ ...baseEvent,
250
+ action: 'restrict',
251
+ enabled: true,
252
+ mode: actionNode.attrs.threshold
253
+ };
231
254
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.UNLOCKED:
232
255
  return { ...baseEvent, action: 'restrict', enabled: false };
233
256
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.ANNOUNCEMENT:
@@ -244,7 +267,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
244
267
  return {
245
268
  ...baseEvent,
246
269
  action: 'ephemeral',
247
- expirationSeconds: (0, parse_1.parseOptionalInt)(actionNode.attrs.expiration),
270
+ expirationSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.expiration),
248
271
  mode: actionNode.attrs.trigger
249
272
  };
250
273
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.NOT_EPHEMERAL:
@@ -263,7 +286,7 @@ function parseGroupActionNode(notificationNode, actionNode) {
263
286
  return {
264
287
  ...baseEvent,
265
288
  action: 'growth_locked',
266
- expirationSeconds: (0, parse_1.parseOptionalInt)(actionNode.attrs.expiration),
289
+ expirationSeconds: (0, primitives_1.parseOptionalInt)(actionNode.attrs.expiration),
267
290
  mode: actionNode.attrs.type
268
291
  };
269
292
  case constants_1.WA_GROUP_NOTIFICATION_TAGS.GROWTH_UNLOCKED: